e33322e7937709383c9d3106ca66ad00fb3f76ab
Liste les 7 chantiers issus des reviews (Lucile Schnödt, Tristan Schnödtin) suite à l'arrivée des workflows : drag & drop mes tâches, filtrage du sélecteur de statut par workflow, cartes responsive, couleurs classiques du workflow de base, suppression du bouton lier un mail, création de ticket depuis un mail (user + statut), et composant modale réutilisable avec footer sticky. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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