d7af8ee1380faf4d384dfc641af792eccefaa478
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
Suite à l'arrivée des workflows, correction des régressions UI et améliorations UX mail/modales (reviews Lucile Schnödt, Tristan Schnödtin). **Specs & décisions :** `docs/superpowers/specs/2026-05-20-workflow-ui-fixes-design.md` **Plan d'implémentation :** `docs/superpowers/plans/2026-05-21-workflow-ui-fixes.md` Cette PR contient désormais **les specs ET l'implémentation complète**. ## Chantiers livrés | # | Chantier | Détail | |---|----------|--------| | 2 | Sélecteur de statut filtré par workflow | `statusOptions` dérivé de `project.workflow.statuses`, statut courant conservé s'il est hors workflow | | 1 | Drag & drop « Mes tâches » | handlers `@dragover/@drop` ; résolution par workflow/catégorie (0→refus, 1→PATCH, ≥2→popover `StatusPickerPopover`) | | 4 | Couleurs | (a) migration Doctrine remettant les hex classiques sur le workflow Standard ; (b) entêtes kanban teintées via `STATUS_CATEGORY_COLOR` + contraste auto ; (c) couleur par défaut par catégorie dans `WorkflowDrawer` | | 5 | Suppression du bouton « Lier un mail » | + retrait de `MailPickerModal` et i18n associée | | 6 | Création de tâche depuis un mail | back : `assigneeId` + `statusId` (défaut = 1er statut du workflow), priorité retirée (TDD) ; front : `MailCreateTaskModal` sur `AppModal` + sélecteurs user/statut | | 7 | Modale réutilisable | nouveau `components/ui/AppModal.vue` (footer sticky) ; footer de `TaskModal` sorti du form scrollable | | 3 | Cartes responsive | badges en `flex-wrap` pleine taille (plus aucun débordement) | | 8 | (dette) Sélecteur de catégorie en `MalioSelect` | la lib supporte les valeurs `string` ; note CLAUDE.md corrigée | ## Vérifications - Build frontend OK ; PHPUnit **34 tests verts** (nouveau test fonctionnel TDD sur `create-task`). - Vérif navigateur (Chrome MCP) sur **données prod importées en local** : #2, #3, #4, #5, #6, #7 confirmés. - Revue de code finale : **APPROVED_WITH_NITS**. ## À noter - ⚠️ **#1 (D&D)** : le drag & drop HTML5 natif n'est pas auto-testable → **test manuel requis**. - 🗄️ **#4 (migration)** : `migrations/Version20260521094948.php` s'appliquera en **prod au prochain `make migration-migrate`**. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Matthieu <mtholot19@gmail.com> Reviewed-on: #6
Lesstime
Application de gestion de projet avec suivi du temps et portail client.
Stack
| Couche | Technologies |
|---|---|
| Backend | PHP 8.4, Symfony 8, API Platform 4, Doctrine ORM |
| Frontend | Nuxt 4 (SPA), Vue 3, Pinia, Tailwind CSS |
| Base de données | PostgreSQL 16 |
| Auth | JWT HTTP-only cookie (lexik/jwt-authentication-bundle) |
| Infrastructure | Docker (PHP-FPM, Nginx, PostgreSQL) |
Fonctionnalités
- Gestion de projets et tâches (kanban, groupes, priorités, tags, efforts)
- Suivi du temps (timer, calendrier, vue liste)
- Portail client avec tickets (bug, amélioration, autre)
- Gestion de documents (upload, prévisualisation, téléchargement)
- Profil utilisateur avec avatar (crop circulaire)
- Notifications temps réel
- Intégration Gitea (issues, repos)
- Intégration Mail IMAP (boîte partagée OVH, voir
docs/mail-integration.md) - Serveur MCP pour assistants IA
- Multi-langue (i18n)
Prérequis
- Docker & Docker Compose
- Git
Installation
# 1. Cloner le repo
git clone <url> && cd lesstime
# 2. Démarrer les containers
make start
# 3. Installation complète (composer, migrations, fixtures, build Nuxt)
make install
L'application est accessible sur http://localhost:8082.
Comptes de test (fixtures)
| Utilisateur | Mot de passe | Rôle | Détails |
|---|---|---|---|
admin |
admin |
ROLE_ADMIN | Administrateur |
alice |
alice |
ROLE_USER | Utilisateur interne |
bob |
bob |
ROLE_USER | Utilisateur interne |
charlie |
charlie |
ROLE_USER | Utilisateur interne |
client-liot |
client |
ROLE_CLIENT | Client LIOT (projet SIRH) |
client-acme |
client |
ROLE_CLIENT | Client ACME (projet CRM) |
Commandes
Docker
make start # Démarrer les containers
make stop # Arrêter les containers
make restart # Redémarrer les containers
make shell # Shell dans le container PHP
make shell-root # Shell root dans le container PHP
Développement
make dev-nuxt # Dev server Nuxt (hot reload, port 3002)
make cache-clear # Vider le cache Symfony
make logs-dev # Tail logs Symfony
make mail-sync # Synchroniser la boîte mail IMAP (voir docs/mail-cron-setup.md)
Base de données
make migration-migrate # Lancer les migrations
make fixtures # Charger les fixtures
make db-reset # Reset BDD + migrations + fixtures (⚠️ supprime les données)
Tests & Qualité
make test # PHPUnit
make php-cs-fixer-allow-risky # Fix code style PHP (Symfony + PSR-12)
Installation complète
make install # Composer + migrations + fixtures + build Nuxt
make reset # Tout supprimer et réinstaller (⚠️ supprime la BDD)
Architecture
src/
├── Entity/ # Entités Doctrine
├── ApiResource/ # Ressources API Platform (découplées)
├── State/ # Providers et Processors API Platform
├── Controller/ # Controllers custom Symfony
├── Service/ # Services métier
├── EventListener/ # Listeners Doctrine
├── Exception/ # Exceptions custom
├── Security/ # Authenticators custom
├── Repository/ # Repositories Doctrine
├── Command/ # Commandes console
├── DataFixtures/ # Fixtures
└── Mcp/Tool/ # MCP tools par domaine
├── Project/
├── Task/
├── TaskMeta/
├── TimeEntry/
└── Reference/
frontend/
├── pages/ # Pages Nuxt (routing auto)
│ ├── portal/ # Pages portail client
│ └── projects/ # Pages projets
├── layouts/ # Layouts (default, portal)
├── components/ # Composants Vue
│ ├── ui/ # Composants génériques
│ ├── task/ # Tâches
│ ├── user/ # Utilisateur (avatar, etc.)
│ ├── project/ # Projets
│ ├── client/ # Clients
│ ├── client-ticket/ # Tickets client
│ ├── admin/ # Administration
│ ├── notification/ # Notifications
│ └── time-tracking/ # Suivi du temps
├── composables/ # Composables (useApi, useNotifications, etc.)
├── stores/ # Stores Pinia (auth, ui, timer)
├── services/ # Services API
│ └── dto/ # Types TypeScript
├── plugins/ # Plugins Nuxt
├── utils/ # Utilitaires
├── i18n/locales/ # Traductions
└── middleware/ # Middleware auth
config/ # Config Symfony
migrations/ # Migrations Doctrine
docker/ # Dockerfiles et config Nginx
Docker
| Container | Port | Description |
|---|---|---|
php-lesstime-fpm |
3002 (dev Nuxt) | PHP-FPM + Node 24 |
nginx-lesstime |
8082 | Nginx reverse proxy |
| PostgreSQL | 5435 | Base de données |
Configuration : infra/dev/.env.docker (override local : infra/dev/.env.docker.local)
API
Toutes les routes API sont préfixées /api (API Platform).
- Documentation auto-générée : http://localhost:8082/api
- Auth :
POST /login_checkavec{ username, password }→ cookie JWTBEARER
Serveur MCP
Lesstime expose un serveur MCP (Model Context Protocol) permettant aux assistants IA d'interagir avec les données.
Tools disponibles (22)
| Domaine | Tools |
|---|---|
| Reference | list-users, list-clients |
| Project | list-projects, get-project, create-project, update-project |
| Task | list-tasks, get-task, create-task, update-task, delete-task |
| TaskMeta | list-statuses, list-priorities, list-efforts, list-tags, list-groups, create-group, update-group |
| TimeEntry | list-time-entries, create-time-entry, update-time-entry, delete-time-entry |
Configuration locale (STDIO)
{
"mcpServers": {
"lesstime": {
"command": "docker",
"args": ["exec", "-i", "php-lesstime-fpm", "php", "bin/console", "mcp:server"]
}
}
}
Configuration réseau (HTTP)
{
"mcpServers": {
"lesstime": {
"type": "url",
"url": "http://<ip-serveur>:8082/_mcp",
"headers": {
"Authorization": "Bearer <api-token>"
}
}
}
}
Gestion des tokens API
docker exec -u www-data php-lesstime-fpm php bin/console app:generate-api-token <username>
Déploiement
- Déployer le code sur le serveur
composer install --no-dev --optimize-autoloaderphp bin/console doctrine:migrations:migrate --no-interactionphp bin/console cache:clear --env=prodcd frontend && npm install && npm run build:distdocker restart nginx-lesstime- Ouvrir le port 8082 sur le firewall (LAN uniquement)
Licence
Propriétaire — Tous droits réservés.
Description