# 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) - Serveur MCP pour assistants IA - Multi-langue (i18n) ## Prérequis - Docker & Docker Compose - Git ## Installation ```bash # 1. Cloner le repo git clone && 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 ```bash 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 ```bash make dev-nuxt # Dev server Nuxt (hot reload, port 3002) make cache-clear # Vider le cache Symfony make logs-dev # Tail logs Symfony ``` ### Base de données ```bash make migration-migrate # Lancer les migrations make fixtures # Charger les fixtures make db-reset # Reset BDD + migrations + fixtures (⚠️ supprime les données) ``` ### Tests & Qualité ```bash make test # PHPUnit make php-cs-fixer-allow-risky # Fix code style PHP (Symfony + PSR-12) ``` ### Installation complète ```bash 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 : `docker/.env.docker` (override local : `docker/.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) ```json { "mcpServers": { "lesstime": { "command": "docker", "args": ["exec", "-i", "php-lesstime-fpm", "php", "bin/console", "mcp:server"] } } } ``` ### Configuration réseau (HTTP) ```json { "mcpServers": { "lesstime": { "type": "url", "url": "http://:8082/_mcp", "headers": { "Authorization": "Bearer " } } } } ``` ### Gestion des tokens API ```bash docker exec -u www-data php-lesstime-fpm php bin/console app:generate-api-token ``` ## 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.