143278a368
Auto Tag Develop / tag (push) Successful in 10s
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>
39 lines
2.3 KiB
Markdown
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`.
|