All checks were successful
Auto Tag Develop / tag (push) Successful in 5s
| Numéro du ticket | Titre du ticket | |------------------|-----------------| | #322 | Page horaire | ## Description de la PR [#322] Page horaire ## Modification du .env ## Check list - [ ] Pas de régression - [ ] TU/TI/TF rédigée - [ ] TU/TI/TF OK - [ ] CHANGELOG modifié Reviewed-on: #4 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
4.0 KiB
4.0 KiB
AGENTS.md
État des lieux opérationnel du projet SIRH (backend + frontend), à utiliser comme base sur les prochaines interventions.
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, servicestests/: TU backend (PHPUnit)frontend/: app Nuxt (pages, composants, composables, services)migrations/: migrations Doctrine
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 trackingMode:TIME: suivi par heuresPRESENCE: suivi présence demi-journées/journées
- Enums backend:
App\Enum\TrackingModeApp\Enum\ContractType(FORFAIT,35H,39H,INTERIM,CUSTOM)
Contract::getType()est exposé en API (contract:read,employee:read)
Heures / absences
- Les absences sont découpées en enregistrements journaliers (pas de période unique stockée).
- Une ligne d’heures validée est verrouillée côté métier.
- Règles de crédit absence (
countAsWorkedHours=true) gérées dansWorkedHoursCreditPolicy:- contrats présence: crédit en unités de présence
- contrats temps: crédit en minutes selon règles contrat (35h, 39h, 4h, fallback)
4) Écrans principaux
Page Heures (frontend/pages/hours.vue)
- Vue Jour + Vue Semaine (semaine réservée admin)
- Toolbar dédiée:
frontend/components/hours/HoursToolbar.vue - Vue jour:
frontend/components/hours/HoursDayView.vue - Vue semaine:
frontend/components/hours/HoursWeekView.vue - Logique page:
frontend/composables/useHoursPage.ts
Points UX déjà en place
- Toolbar semaine: raccourcis semaine précédente / actuelle / suivante
- Légende absences affichée dans la toolbar (admin + vue semaine)
- Cellules semaine avec absence: couleur du type d’absence (plus rouge fixe)
- Pour user non-admin: restrictions d’édition selon validations/absences
5) API / calculs hebdo
- Provider:
src/State/WorkHourWeeklySummaryProvider.php - DTOs:
src/Dto/WorkHours/WeeklySummaryRow.phpsrc/Dto/WorkHours/WeeklyDaySummary.php
- Le résumé hebdo renvoie notamment:
trackingModecontractNamecontractType- détails journaliers (jour/nuit/total, présence, absence label/couleur)
Heures supp
- Règles métier:
- contrats <= 35h: tranche 25% de 35h à 43h, puis 50% au-delà
- contrats >= 39h: tranche 25% de 39h à 43h, puis 50% au-delà
- contrats
INTERIM: pas de bonus 25/50 ni récup
6) Conventions techniques
- Favoriser DTO explicites plutôt que tableaux associatifs bruts.
- Utiliser les interfaces repository dans providers/processors testés.
- Centraliser les règles métier dans services/providers backend plutôt que dupliquer côté front.
- Front: éviter les calculs métier lourds; consommer les champs API déjà calculés.
7) Tests et qualité
- Les TU backend passent actuellement via
make test. - Le build frontend passe via
npm run build. - À chaque évolution métier:
- mettre à jour les tests provider/processor/service impactés
- maintenir la cohérence des DTO TypeScript (
frontend/services/dto/*)
8) Fichiers sensibles (à lire avant modif)
src/State/WorkHourWeeklySummaryProvider.phpsrc/Service/WorkHours/WorkedHoursCreditPolicy.phpsrc/State/AbsenceWriteProcessor.phpsrc/State/WorkHourBulkUpsertProcessor.phpfrontend/composables/useHoursPage.tsfrontend/components/hours/HoursWeekView.vue
9) Décisions de conception actuelles
- Les absences sont stockées par jour (facilite verrouillage/édition fine).
- Les règles de calcul (crédits, majorations, récup) sont portées côté backend.
- Le front reste centré sur l’affichage/interaction et réutilise les données enrichies de l’API.