Files
SIRH/doc/hours-day-export.md
T
tristan 143278a368
Auto Tag Develop / tag (push) Successful in 10s
feat(heures) : export PDF jour accessible aux chefs de site (périmètre par site)
L'export des heures de la vue Jour était réservé aux admins. Il est désormais
ouvert aux chefs de site, restreint à leurs sites :
- sécurité endpoint ROLE_ADMIN -> ROLE_USER
- périmètre résolu côté backend via EmployeeRepository::findScoped() (un siteIds
  hors périmètre est ignoré, aucune fuite inter-sites)
- bouton Exporter visible pour admin + chef de site (masqué pour ROLE_SELF)
- doc, doc in-app et CLAUDE.md mis à jour

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 08:31:30 +02:00

39 lines
2.3 KiB
Markdown

# Export PDF des heures — vue Jour
Bouton **Exporter** à droite du titre « Heures », visible pour les **administrateurs**
(`ROLE_ADMIN`) **et les chefs de site** (`ROLE_USER`), **uniquement en vue Jour** (masqué
en vue Semaine, masqué pour les profils employé `ROLE_SELF`).
## Périmètre
- **Administrateur** : peut exporter tous les sites.
- **Chef de site** : ne voit dans le drawer que **ses sites** et ne peut exporter que
ceux-ci. Le périmètre est appliqué côté backend (`EmployeeRepository::findScoped`) — un
`siteIds` forcé hors de son périmètre est ignoré, aucune donnée d'un autre site ne fuit.
## Comportement
- Ouvre un drawer : un champ **date** (préremplit la date affichée) et des **cases à
cocher des sites** (limitées au périmètre de l'utilisateur).
- Génère un **PDF A4 portrait** d'une seule journée, **regroupé par site**.
## Données
- Mêmes employés que la vue Jour : **non-conducteurs**, **sous contrat** à la date
choisie, des sites cochés et **dans le périmètre de l'utilisateur**. Les employés sous
contrat sans saisie apparaissent (lignes vides).
- Colonnes : Nom · Statut · Début matin · Fin matin · Début après-midi · Fin après-midi ·
Début soir · Fin soir · Jour · Nuit · **Total** (en gras). **Pas de colonne « Valider ».**
- Colonne **Statut** : affiche le **code** du type d'absence (ex. `AT`), pas le libellé,
sur la couleur de fond du type. Un jour férié sans absence affiche le **nom du férié**
sur fond bleu clair (`#b3e5fc`).
- Jour / Nuit / Total : identiques à l'écran (crédit d'absence `countAsWorkedHours` et
crédit virtuel férié inclus).
- **Légende** sous le tableau : pour chaque code d'absence présent (hors férié), un carré
de couleur contenant le code et le libellé du type à droite. Triée par code, dédupliquée.
## Technique
- Endpoint : `GET /work-hours/day-export?workDate=YYYY-MM-DD&siteIds=1,2,3` (`ROLE_USER`).
- Provider : `App\State\WorkHourDayExportProvider` — résout le périmètre via
`EmployeeRepository::findScoped($user)` (admin → tous, chef de site → ses sites).
- Calcul des cellules : `YearlyHoursExportBuilder::buildDayRowsForEmployees` (source
unique de vérité, partagée avec les exports annuels).
- Gabarit : `templates/work-hour-day-export/print.html.twig`.