diff --git a/frontend/components/ui/AppTopNav.vue b/frontend/components/ui/AppTopNav.vue index 96d371f..b8fdef2 100644 --- a/frontend/components/ui/AppTopNav.vue +++ b/frontend/components/ui/AppTopNav.vue @@ -13,6 +13,14 @@

Lesstime

+ 💡 **Astuce** : utilise l'avatar en haut à droite pour accéder à ton profil et y générer un **token MCP** (cf. section *Token MCP & API*) pour piloter Lesstime depuis Claude / Cursor. diff --git a/frontend/content/help/02-projects-workflows.md b/frontend/content/help/02-projects-workflows.md new file mode 100644 index 0000000..9001713 --- /dev/null +++ b/frontend/content/help/02-projects-workflows.md @@ -0,0 +1,58 @@ +# Projets & Workflows + +## Qu'est-ce qu'un projet ? + +Un projet regroupe un ensemble de **tâches**, **time entries** et éventuellement **tickets client**. Il est défini par : + +- Un **code court** (2-10 lettres majuscules, ex: `SIRH`, `CRM`) qui préfixe les numéros de tâches +- Un **client** optionnel (ou interne si null) +- Une **couleur** d'identification +- Un **workflow** (obligatoire) qui définit ses colonnes kanban + +## Qu'est-ce qu'un workflow ? + +Un **workflow** est un *jeu de statuts kanban* réutilisable. Au lieu d'avoir une liste globale de statuts comme dans la plupart des outils, chaque projet a son propre kanban adapté à sa façon de travailler. + +### Exemple + +| Workflow | Statuts | +|---|---| +| **Standard** (par défaut) | À faire → En cours → Bloqué → En attente de validation → Terminé | +| **DevKanban** | Backlog → Spec → In Dev → Review PR → QA → Done | +| **Support** | Nouveau → Diagnostic → Résolu | + +Tu peux créer autant de workflows que tu veux depuis **Admin → Workflows**. + +## Les 5 catégories canoniques + +Chaque statut, peu importe son workflow, appartient à **une catégorie canonique** parmi : + +| Catégorie | Description | +|---|---| +| `todo` | À faire — pas encore commencé | +| `in_progress` | En cours — quelqu'un bosse dessus | +| `blocked` | Bloqué — attente d'une dépendance | +| `review` | En validation — relecture, PR, QA | +| `done` | Terminé — close | + +> 🎯 **Pourquoi des catégories ?** Pour que la vue *Mes tâches* puisse regrouper des tâches venant de projets avec des workflows différents (ex: une tâche "In Dev" de DevKanban et "En cours" de Standard apparaissent dans la même colonne `in_progress`). + +## Changer le workflow d'un projet + +1. Ouvrir le projet → **Modifier le projet** (drawer) +2. Section **Workflow** → cliquer sur **Changer de workflow** +3. Sélectionner le workflow cible +4. **Mapper chaque statut source vers un statut cible** (le mapping est pré-rempli automatiquement par catégorie) +5. **Confirmer** — toutes les tâches migrent dans une seule transaction + +### Règles du mapping + +- ✅ Chaque statut actuellement utilisé par une tâche **doit** être mappé (sinon erreur 422) +- ✅ Un statut peut être mappé vers `null` → la tâche passe en backlog (sans statut) +- ❌ Tu ne peux pas mapper vers un statut qui n'appartient pas au workflow cible + +## Supprimer un workflow + +Tu peux supprimer un workflow uniquement s'il n'est **lié à aucun projet** (HTTP 409 sinon). Réassigne d'abord les projets vers un autre workflow. + +> ⚠️ Le workflow **Standard** ne peut pas être supprimé tant qu'il reste le défaut (un seul workflow peut avoir `isDefault=true` à la fois, garanti par un listener Doctrine). diff --git a/frontend/content/help/03-my-tasks.md b/frontend/content/help/03-my-tasks.md new file mode 100644 index 0000000..9b61a9c --- /dev/null +++ b/frontend/content/help/03-my-tasks.md @@ -0,0 +1,60 @@ +# Mes tâches & Dashboard + +## Vue *Mes tâches* + +Accessible via la sidebar, c'est ta vue **transverse** : toutes les tâches dont tu es l'**assigné** ou un **collaborateur**, peu importe le projet. + +### Deux modes d'affichage + +#### 1. Kanban (par défaut) + +Regroupé par les **5 catégories canoniques** : + +``` +À faire → En cours → Bloqué → En validation → Terminé +``` + +Chaque card affiche : +- Le **code projet + numéro** (ex: `SIRH-12`) coloré selon le projet +- Un **badge statut** (utile quand des tâches de projets différents cohabitent) +- Priorité, tags, deadline, icônes (sync calendrier, récurrence, collaborateurs) +- L'**avatar de l'assigné** + bouton timer (▶ / ⏹) + +> 💡 Le **drag-to-status** est intentionnellement désactivé dans *Mes tâches* — pour changer un statut, ouvre la tâche (la valeur dépend du workflow du projet, pas de la catégorie). + +#### 2. Liste + +Vue tableau triable, avec **bulk actions** : +- Cocher plusieurs tâches → barre d'actions en haut +- Changer statut (désactivé si tâches de **projets différents**), assigné, priorité, effort, groupe +- Supprimer en lot + +### Filtres disponibles + +| Filtre | Notes | +|---|---| +| **Projet** | Restreint à un projet précis | +| **Groupe** | Disponible uniquement si un projet est sélectionné | +| **Tag** | Tags globaux | +| **Priorité / Effort** | | +| **Assigné** | Par défaut : toi-même | + +### Tri (vue liste uniquement) + +- Par **deadline** (les plus proches en premier) +- Par **scheduled start** (planification calendrier) + +## Vue *Backlog* + +Sous le kanban, les tâches **sans statut** apparaissent dans la section *Backlog*. Pratique pour les idées non encore qualifiées. + +## Dashboard + +Le **dashboard** (page d'accueil après login) affiche : + +- 📊 **KPIs personnels** : tâches en cours / à faire / en retard +- 📈 **Charts** : répartition par statut, par priorité, time tracking cette semaine +- 🔔 **Notifications** : assignations, commentaires (cf. cloche en topbar) +- ⏱ **Timer actif** s'il y en a un + +> 💡 Tu peux changer le filtre user du dashboard via le sélecteur en haut pour voir les KPIs d'un collègue (utile pour les leads). diff --git a/frontend/content/help/04-time-tracking.md b/frontend/content/help/04-time-tracking.md new file mode 100644 index 0000000..21f04c6 --- /dev/null +++ b/frontend/content/help/04-time-tracking.md @@ -0,0 +1,59 @@ +# Time tracking + +## Le timer + +Le timer **flottant** est accessible depuis la sidebar ou directement depuis une tâche. + +### Démarrer un timer + +Trois façons : + +1. **Depuis une TaskCard** : clique sur l'icône ▶ à droite de la card +2. **Depuis le détail d'une tâche** : bouton *Démarrer le timer* +3. **Manuellement** : depuis */time-tracking*, créer une time entry sans tâche + +### Arrêter + +- Clique sur ⏹ sur la card de la tâche en cours +- Ou depuis la sidebar (icône timer pulsante en orange `#F18619`) + +> 💡 Un seul timer actif à la fois. Démarrer un nouveau timer arrête automatiquement le précédent. + +## Time entries + +Chaque entrée a : + +| Champ | Description | +|---|---| +| **Titre** | Description courte (ex: "Réunion daily") | +| **Projet** | Obligatoire | +| **Tâche** | Optionnel — lie l'entrée à une tâche précise | +| **Tags** | Pour catégoriser (ex: "Backend", "Réunion") | +| **Début / Fin** | Datetimes — la durée est calculée | +| **User** | Qui a fait le travail | + +### Vue *Time tracking* + +Disponible en deux modes : + +- **Vue semaine** : ligne par ligne, par jour +- **Vue mois** : agrégation mensuelle, totaux par projet et par tag + +### Filtres + +- **Projet** (server-side) +- **Tag** (server-side) +- **User** (admin uniquement) +- **Période** (date début / date fin) + +## Édition + +- Clique sur une time entry → drawer d'édition +- Tu peux modifier projet, tâche, tags, dates a posteriori +- La suppression est libre — pense à exporter avant si nécessaire + +## Tags + +Les tags sont **globaux** (partagés entre tous les projets, comme les statuts l'étaient avant les workflows). Définis depuis **Admin → Tags**. + +> 📊 **Cas d'usage typique** : créer un tag par typologie d'activité (Dev, Réunion, Support, Veille) pour pouvoir agréger ton temps en fin de mois. diff --git a/frontend/content/help/05-tasks-detail.md b/frontend/content/help/05-tasks-detail.md new file mode 100644 index 0000000..9010804 --- /dev/null +++ b/frontend/content/help/05-tasks-detail.md @@ -0,0 +1,62 @@ +# Détail d'une tâche + +## Champs principaux + +| Champ | Notes | +|---|---| +| **Numéro** | Auto-incrémenté **par projet** (ex: `SIRH-1`, `SIRH-2`, `CRM-1`…) | +| **Titre** | Obligatoire | +| **Description** | Markdown supporté (preview disponible) | +| **Statut** | Doit appartenir au workflow du projet (sinon erreur 422) | +| **Priorité** | Basse / Moyenne / Haute — couleurs personnalisables | +| **Effort** | S / M / L / XL / XXL — pour estimer la charge | +| **Assigné** | Un seul user responsable | +| **Collaborateurs** | Multiples — visibles via icône `mdi:account-group` | +| **Groupe** | Optionnel — regroupe des tâches au sein d'un projet | +| **Tags** | Globaux, plusieurs par tâche | +| **Deadline** | Date — un badge coloré apparaît sur la card | +| **Scheduled start / end** | Planification calendrier (sync optionnelle) | + +## Récurrence + +Une tâche peut être **récurrente** (icône 🔁 sur la card) : + +- **Type** : quotidien, hebdomadaire, mensuel +- **Intervalle** : tous les N jours/semaines/mois +- **Jours de la semaine** (pour le mode hebdomadaire) : `monday`, `tuesday`, etc. + +Chaque occurrence est gérée séparément ; cocher une tâche récurrente comme *Terminée* peut générer l'occurrence suivante selon le pattern. + +## Sync calendrier + +Si Zimbra est configuré (cf. Intégrations), tu peux activer **Sync calendrier** sur une tâche planifiée pour qu'elle apparaisse dans ton calendrier Zimbra (CalDav). + +Icônes correspondantes : +- 🟢 `mdi:calendar-check` → sync OK +- 🔴 `mdi:alert-circle` → erreur de sync (passe sur l'icône pour le détail) + +## Documents + +Chaque tâche peut avoir des **documents attachés** (PDF, images, etc.) : + +- Drag & drop dans la tâche pour uploader +- Validation du **MIME type côté serveur** (pas seulement l'extension) +- Téléchargement via lien dédié + +## Liaison Gitea (si configuré) + +Si le projet a un repo Gitea lié, tu peux : + +- **Créer une branche** depuis la tâche : `feature/` `fix/` `refactor/` `hotfix/` `chore/` (5 types disponibles) +- Convention de nommage : `/--` (ex: `feature/SIRH-12-add-login`) +- **Voir les PRs** liées (état CI inclus) + +## Liaison ticket client + +Si la tâche découle d'un ticket client, l'icône 👤 (`heroicons:user-circle`) bleue apparaît avec le numéro du ticket (ex: `CT-001`). + +## Commentaires & notifications + +- Ajouter un commentaire notifie les watchers (assigné, collaborateurs) +- Les @mentions notifient l'utilisateur cité +- La cloche en topbar (`NotificationBell`) liste toutes les notifications non lues diff --git a/frontend/content/help/06-client-portal.md b/frontend/content/help/06-client-portal.md new file mode 100644 index 0000000..4bc0dce --- /dev/null +++ b/frontend/content/help/06-client-portal.md @@ -0,0 +1,43 @@ +# Portal client + +> 🎫 Section dédiée aux utilisateurs avec le rôle **ROLE_CLIENT**. + +## Accès + +Les utilisateurs *client* sont **automatiquement redirigés vers `/portal`** après login. Ils ne voient pas les vues internes (projets, time tracking, admin). + +## Ce que voit un client + +- 📋 La liste de ses **projets autorisés** (définis par l'admin dans le user) +- 🎫 Sur chaque projet, la liste de ses **tickets** (ses créations uniquement) +- ➕ Le bouton **Nouveau ticket** sur chaque projet + +## Soumettre un ticket + +Depuis `/portal/projects//new-ticket` : + +| Champ | Description | +|---|---| +| **Type** | `bug` / `improvement` / `other` | +| **Titre** | Court et descriptif | +| **Description** | Détails — markdown supporté | +| **URL** | Optionnel — page où le problème se manifeste | + +Le ticket est automatiquement numéroté **par projet** (ex: `CT-001`). + +## Statuts d'un ticket + +| Statut | Visible côté client | Signification | +|---|---|---| +| `new` | Oui | Reçu, pas encore traité | +| `in_progress` | Oui | Une tâche interne y est liée | +| `done` | Oui | Résolu et clôturé | +| `rejected` | Oui | Non retenu (avec commentaire explicatif) | + +Le `statusComment` est visible par le client quand fourni. + +## Côté équipe interne + +- Les tickets apparaissent dans **Admin → Tickets client** +- On peut **transformer un ticket en tâche** (la tâche garde une référence au ticket — icône 👤 bleue sur la card) +- Le client voit l'avancement passer en `in_progress` automatiquement quand une tâche est liée diff --git a/frontend/content/help/07-admin.md b/frontend/content/help/07-admin.md new file mode 100644 index 0000000..1f00d0b --- /dev/null +++ b/frontend/content/help/07-admin.md @@ -0,0 +1,66 @@ +# Administration + +> 🛡️ Section visible uniquement par les utilisateurs **ROLE_ADMIN**. + +L'admin (`/admin`) est divisé en plusieurs onglets, chacun gérant une ressource globale ou une intégration. + +## Onglet *Clients* + +- Liste des clients (entreprise / organisation) +- Champs : nom, email, téléphone, adresse +- Lier un client à des projets + +## Onglet *Workflows* + +⭐ **Nouveau** — remplace l'ancien onglet *Statuts*. + +- Lister les workflows existants +- **Créer un workflow** : nom, isDefault (un seul à la fois), liste de statuts éditables inline +- Chaque statut : libellé, couleur, position, **catégorie** (5 valeurs canoniques), isFinal +- **Éditer** un workflow modifie les statuts (sync intelligent : create / update / delete par diff) + +> ⚠️ Supprimer un workflow lié à un projet renvoie une erreur **409**. Réassigne d'abord les projets. + +## Onglet *Efforts* + +- Tailles d'effort (S, M, L, XL, XXL) +- Globales (partagées entre tous les projets) + +## Onglet *Priorités* + +- Niveaux de priorité (Basse, Moyenne, Haute) + couleur +- Une priorité "Haute" affiche un drapeau rouge `mdi:flag-variant` sur la card + +## Onglet *Tags* + +- Tags globaux (tâches **et** time entries) +- Couleur personnalisable +- Pas de hiérarchie (flat list) + +## Onglet *Utilisateurs* + +- Créer / éditer / désactiver +- Rôles : `ROLE_ADMIN`, `ROLE_USER`, `ROLE_CLIENT` +- **ROLE_CLIENT** : associer un *client* et une liste de *projets autorisés* +- Reset password depuis l'admin + +> 🔐 Un user *admin+client* (les deux rôles) **n'est pas bloqué** par le middleware portal — le check est sur `ROLE_CLIENT && !ROLE_ADMIN`. + +## Onglet *Gitea* + +- URL serveur + token API +- Lier un projet à un repo : `giteaOwner` + `giteaRepo` +- Active les fonctionnalités branches / PRs sur les tâches + +## Onglet *BookStack* + +- URL + token API +- Lier un projet à un **shelf** BookStack (`bookstackShelfId`) +- Les tâches peuvent être liées à des pages BookStack (cf. `TaskBookStackLink`) + +## Onglet *Zimbra* + +- URL serveur + credentials (chiffrés via libsodium) +- Configure le calendrier CalDav par défaut +- Test de connexion intégré +- Active la **sync calendrier** sur les tâches planifiées diff --git a/frontend/content/help/08-integrations.md b/frontend/content/help/08-integrations.md new file mode 100644 index 0000000..fa008f9 --- /dev/null +++ b/frontend/content/help/08-integrations.md @@ -0,0 +1,66 @@ +# Intégrations + +Lesstime s'intègre avec **3 outils externes** pour fluidifier le workflow dev. + +## 🌳 Gitea + +Lesstime parle à un serveur Gitea pour automatiser les conventions de branches et suivre les PRs. + +### Configuration + +1. **Admin → Gitea** : URL serveur + token API +2. Sur un projet : définir `giteaOwner` (org/user) et `giteaRepo` (nom du repo) + +### Utilisation + +Sur une tâche, le panneau Gitea propose : + +- **Créer une branche** : choisir un type (`feature` / `fix` / `refactor` / `hotfix` / `chore`) +- La branche est nommée automatiquement : `/--` +- **Lister les PRs liées** : par convention, toute PR qui contient `-` dans son nom ou sa description est reliée +- **État CI** : ✅ ou ❌ affiché si le repo a des Actions/Workflows configurées + +> 💡 La convention `-` permet à Gitea et Lesstime de se synchroniser **sans webhook** — juste par parsing des noms. + +## 📚 BookStack + +Lien tâche → documentation. + +### Configuration + +1. **Admin → BookStack** : URL + token (token ID + token secret, chiffrés via libsodium) +2. Sur un projet : définir `bookstackShelfId` + `bookstackShelfName` + +### Utilisation + +- Depuis une tâche : bouton **Lier à une page BookStack** +- Sélectionner la page dans le shelf du projet +- Le lien est bidirectionnel (BookStack peut afficher les tâches liées) + +## 📅 Zimbra (CalDav) + +Sync calendrier pour les tâches planifiées. + +### Configuration + +1. **Admin → Zimbra** : + - URL serveur (ex: `https://mail.ovh.com`) + - Username (ex: `lesstime@ovh.fr`) + - Password (chiffré côté serveur) + - Calendar path (ex: `/dav/lesstime@ovh.fr/Calendar/`) + - **Test de connexion** intégré +2. Active la config (toggle `enabled`) + +### Utilisation + +Sur une tâche avec **scheduled start + end** : + +1. Cocher **Sync calendrier** +2. Au save, Lesstime crée/met à jour l'événement CalDav +3. L'icône `mdi:calendar-check` (verte) apparaît sur la card si succès +4. L'icône `mdi:alert-circle` (rouge) apparaît si erreur — passe dessus pour voir le détail + +### Limites + +- **Pas de retour Zimbra → Lesstime** : si tu modifies l'événement dans Zimbra, Lesstime ne le voit pas +- **Récurrences** : les patterns RRULE basiques sont supportés (daily, weekly avec jours, monthly) diff --git a/frontend/content/help/09-mcp-api.md b/frontend/content/help/09-mcp-api.md new file mode 100644 index 0000000..703c4ac --- /dev/null +++ b/frontend/content/help/09-mcp-api.md @@ -0,0 +1,97 @@ +# Token MCP & API + +Lesstime expose un serveur **MCP** (Model Context Protocol) qui permet à un assistant IA (Claude, Cursor, etc.) de piloter ton instance Lesstime — créer des tâches, lire des projets, démarrer un timer, etc. + +## Générer ton token + +1. Va sur **Profil** (avatar → Profil) +2. Section **Token MCP** → **Générer un token** +3. **Copie le token immédiatement** — il ne sera plus affiché ensuite + +> 🔐 **Sécurité** : Le token donne accès à toutes les actions de ton compte. Ne le partage jamais. Tu peux le régénérer à tout moment (l'ancien sera révoqué). + +## Configurer Claude Code + +Dans `.mcp.json` (à la racine de ton projet) : + +```json +{ + "mcpServers": { + "lesstime": { + "type": "http", + "url": "https://ton-instance-lesstime/_mcp", + "headers": { + "Authorization": "Bearer TON_TOKEN_ICI" + } + } + } +} +``` + +Pour une instance locale : + +```json +{ + "mcpServers": { + "lesstime-local": { + "command": "docker", + "args": ["exec", "-i", "php-lesstime-fpm", "php", "bin/console", "mcp:server"] + } + } +} +``` + +## Tools disponibles (27 au total) + +### Projets + +- `list-projects`, `get-project`, `create-project`, `update-project` + +### Tâches + +- `list-tasks` (avec filtres : projet, assigné, statut, archived…) +- `get-task`, `create-task`, `update-task`, `delete-task` + +### Métadonnées + +- `list-statuses` (param **`projectId`** optionnel — sans : tous les statuts ; avec : statuts du workflow du projet) +- `list-priorities`, `list-efforts`, `list-tags` + +### Workflows ⭐ Nouveau + +- `list-workflows` — liste tous les workflows avec leurs statuts groupés +- `switch-project-workflow` (ROLE_ADMIN) — change le workflow d'un projet avec mapping + +### Time tracking + +- `list-time-entries`, `create-time-entry`, `update-time-entry`, `delete-time-entry` + +### Récurrence + +- `create-task-recurrence`, `update-task-recurrence`, `delete-task-recurrence` + +### Groupes / Users / Clients + +- `list-groups`, `create-group`, `update-group` +- `list-users`, `list-clients` + +## Règles importantes + +> ⚠️ **Statut hors workflow rejeté** : si tu appelles `create-task` ou `update-task` avec un `status` qui n'appartient pas au workflow du projet, l'appel est rejeté avec **422 Validation error**. Utilise `list-statuses(projectId)` pour découvrir les statuts valides du projet. + +## Exemples de prompts + +``` +"Crée une tâche dans Lesstime sur le projet SIRH avec le titre +'Ajouter l'export PDF' et la priorité Haute, assignée à alice" +``` + +``` +"Liste mes tâches en cours dans le projet CRM" +``` + +``` +"Démarre un timer sur la tâche SIRH-12 avec le tag Backend" +``` + +L'agent appelle les bons tools tout seul si la description est claire. diff --git a/frontend/pages/help.vue b/frontend/pages/help.vue new file mode 100644 index 0000000..24c12c0 --- /dev/null +++ b/frontend/pages/help.vue @@ -0,0 +1,168 @@ + + +