THOLOT DECHENE Matthieu d7af8ee138
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
Correctifs UI workflow — specs + implémentation (8 chantiers) (#6)
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
2026-05-21 08:48:31 +00:00
2026-03-08 19:47:19 +01:00
2026-05-20 08:22:48 +00:00
2026-03-08 19:47:19 +01:00
2026-03-08 19:47:19 +01:00
2026-03-08 19:47:19 +01:00
2026-03-08 19:47:19 +01:00
2026-03-08 19:47:19 +01:00
2026-03-08 19:47:19 +01:00

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_check avec { username, password } → cookie JWT BEARER

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

  1. Déployer le code sur le serveur
  2. composer install --no-dev --optimize-autoloader
  3. php bin/console doctrine:migrations:migrate --no-interaction
  4. php bin/console cache:clear --env=prod
  5. cd frontend && npm install && npm run build:dist
  6. docker restart nginx-lesstime
  7. Ouvrir le port 8082 sur le firewall (LAN uniquement)

Licence

Propriétaire — Tous droits réservés.

Description
No description provided
Readme 2.8 MiB
v0.3.18 Latest
2026-04-02 10:14:43 +00:00
Languages
PHP 50%
Vue 41%
TypeScript 7.5%
Dockerfile 0.5%
CSS 0.4%
Other 0.6%