# AGENTS.md État des lieux opérationnel du projet SIRH (backend + frontend), mis à jour après les évolutions sur heures/absences/validations. ## 1) Stack et structure - Backend: Symfony + API Platform + Doctrine ORM - Frontend: Nuxt 4 + Vue 3 + TypeScript + Tailwind - Exécution locale: Docker via `makefile` Arborescence clé: - `src/`: domaine, API resources, state providers/processors, services - `tests/`: TU backend (PHPUnit) - `frontend/`: app Nuxt (pages, composants, composables, services) - `migrations/`: migrations Doctrine - `doc/`: documentation fonctionnelle et règles métier de référence ## 1.1) Référentiel Fonctionnel (obligatoire) - Référence principale des règles métier: `doc/functional-rules.md` - Toute intervention doit commencer par une vérification de cohérence avec cette documentation. - Règle permanente: à chaque développement qui modifie le fonctionnel, la documentation dans `doc/` doit être mise à jour automatiquement dans la même intervention (pas de report). ## 2) Commandes utiles - Démarrer stack: `make start` - Tests backend: `make test` - Build frontend: `cd frontend && npm run build` - Dev frontend: `make dev-nuxt` ## 3) Domaine métier (résumé) ### Contrats - Entité: `Contract` - Champs principaux: `name`, `trackingMode`, `weeklyHours`, `isActive`, `type` - `trackingMode`: - `TIME`: suivi en heures - `PRESENCE`: suivi en demi-journées/journées - Enums backend: - `App\Enum\TrackingMode` - `App\Enum\ContractType` (`FORFAIT`, `THIRTY_FIVE_HOURS`, `THIRTY_NINE_HOURS`, `INTERIM`, `CUSTOM`) - Historique de contrat par employé: - table `employee_contract_periods` - résolu par `App\Service\Contracts\EmployeeContractResolver` ### Heures / absences - Les absences sont stockées en **lignes journalières** (découpage automatique dans `AbsenceWriteProcessor`). - Les absences `countAsWorkedHours=true` créditent: - minutes (contrats TIME) - unités de présence (contrats PRESENCE) - Les absences AM/PM effacent les plages horaires concernées. ## 4) Validations (important) ### Validation RH (admin) - Champ: `work_hours.is_valid` - Endpoint API Platform standard: `PATCH /api/work_hours/{id}` - Gérée côté front par `updateWorkHourValidation`. ### Validation site (chef de site) - Champ: `work_hours.is_site_valid` - Endpoint dédié: `PATCH /api/work_hours/{id}/site-validation` - Processor: `src/State/WorkHourSiteValidationProcessor.php` - Autorisé uniquement aux utilisateurs "Sites" (ni `ROLE_ADMIN`, ni `ROLE_SELF`) dans leur scope site. ### Règles de verrouillage - `is_valid=true`: ligne verrouillée pour tout le monde (admin inclus pour saisie heures/absence; peut toujours décocher validation RH). - `is_site_valid=true`: - non-admin: ligne verrouillée (heures + absences) - admin: ligne éditable - Toute modification de ligne (heures/présence/absence) remet: - `is_site_valid=false` - `is_valid=false` ## 5) Page Heures (front) - Page: `frontend/pages/hours.vue` - Composable principal: `frontend/composables/useHoursPage.ts` - Composants: - `frontend/components/hours/HoursToolbar.vue` - `frontend/components/hours/HoursDayView.vue` - `frontend/components/hours/HoursWeekView.vue` ### Comportement par profil (vue jour) - Admin: - colonne RH avec checkbox - badge `Site validé` affiché près du site - Chef de site: - colonne `Validation site` avec checkbox - colonne RH en lecture (`Validé`/`-`) - Employé: - colonne `Validation site` en lecture - colonne RH en lecture ## 6) Résumé hebdo / calculs - Provider: `src/State/WorkHourWeeklySummaryProvider.php` - DTOs: - `src/Dto/WorkHours/WeeklySummaryRow.php` - `src/Dto/WorkHours/WeeklyDaySummary.php` - Inclut: contrat résolu par jour, absences, crédits, jour/nuit/total, majorations, récup. Règles majorations: - Contrats <= 35h: +25% de 35h à 43h, +50% au-delà - Contrats >= 39h: +25% de 39h à 43h, +50% au-delà - `INTERIM`: pas de 25% / 50% / récup ## 7) Migrations sensibles - `migrations/Version20260226183000.php` - ajoute `work_hours.is_site_valid BOOLEAN NOT NULL DEFAULT FALSE` - non destructive (pas de perte de données) ## 8) Points de vigilance prod - Toujours exécuter migration avant déploiement code backend/front lié. - Après déploiement backend, si route manquante côté runtime: - `php bin/console cache:clear && php bin/console cache:warmup` - Vérifier présence route: - `/api/work_hours/{id}/site-validation` (PATCH) ## 9) Conventions techniques - Favoriser DTO explicites plutôt que tableaux associatifs. - Garder règles métier dans backend (providers/processors/services), front orienté affichage/interaction. - Maintenir alignement backend DTO PHP / frontend DTO TS (`frontend/services/dto/*`). - Mettre à jour TU si signature constructor/service change. ## 10) Fichiers à lire avant modification - `src/State/WorkHourBulkUpsertProcessor.php` - `src/State/AbsenceWriteProcessor.php` - `src/State/WorkHourSiteValidationProcessor.php` - `src/State/WorkHourWeeklySummaryProvider.php` - `src/Service/WorkHours/WorkedHoursCreditPolicy.php` - `frontend/composables/useHoursPage.ts` - `frontend/components/hours/HoursDayView.vue` - `frontend/components/hours/HoursWeekView.vue`