Permet de consulter les exercices passés (calendrier + compteurs) sur l'onglet Congés. La plage proposée est bornée par max(début historique contrat, RTT_START_DATE) pour ne pas remonter avant la mise en service du logiciel. Édition des stocks N-1 et fractionnés verrouillée sur exercices clos. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
61 lines
3.7 KiB
Markdown
61 lines
3.7 KiB
Markdown
# Onglet "Congés" — fiche employé
|
||
|
||
## Vue d'ensemble
|
||
|
||
L'onglet **Congés** de la fiche employé (`frontend/components/employees/LeaveTab.vue`) affiche :
|
||
- un bandeau de compteurs (acquis, pris, reste, en cours d'acquisition, N-1 ou samedis selon le contrat) ;
|
||
- un calendrier annuel coloré des congés posés (12 mois en grille 4×3) ;
|
||
- pour chaque mois, le nombre de jours de présence (`presenceDaysByMonth`) ;
|
||
- un sélecteur d'année en pied de calendrier.
|
||
|
||
## Période affichée
|
||
|
||
La période dépend du **type de contrat actuel** de l'employé :
|
||
|
||
| Type de contrat | Période affichée |
|
||
|-------------------|--------------------------------|
|
||
| FORFAIT | Janvier → Décembre (année civile) |
|
||
| Autres | Juin (Y-1) → Mai (Y) (exercice CP) |
|
||
|
||
Cette règle suit `EmployeeLeaveSummaryProvider::resolveYear()` côté backend : la sélection FORFAIT vs non-FORFAIT se fait toujours sur le contrat **courant**, pas sur celui qui était en vigueur à l'année consultée.
|
||
|
||
## Sélecteur d'année
|
||
|
||
Position : **en bas du calendrier**, à gauche, à l'intérieur de la zone scrollable. Il scrolle donc avec les mois et apparaît sous la grille.
|
||
|
||
Plage proposée :
|
||
- du plus récent (= année courante) au plus ancien ;
|
||
- **double plancher** : l'année minimum est `max(floor_historique_contrat, floor_data_start_date)`
|
||
- **floor_historique_contrat** : dérivé de `employee.contractHistory[].startDate` — premier exercice où l'employé avait un contrat ouvert
|
||
- **floor_data_start_date** : dérivé de l'env `RTT_START_DATE` (date de mise en service du logiciel, ex. `2026-02-23` → exercice 2026 / année forfait 2026). Aucune donnée historique n'existe avant cette date, donc on ne propose pas d'années antérieures même si le contrat de l'employé est plus ancien.
|
||
- la valeur est exposée par l'API `GET /employees/{id}/leave-summary` via le champ `dataStartDate` (peuplé depuis l'env serveur).
|
||
- en cas d'historique manquant **et** d'env absente, la plage se réduit à l'année courante.
|
||
|
||
Format des libellés :
|
||
- FORFAIT : `2026`, `2025`, `2024`…
|
||
- Autres : `Juin 2025 → Mai 2026`, `Juin 2024 → Mai 2025`…
|
||
|
||
Comportement :
|
||
- changer d'année recharge l'intégralité de l'onglet (`getEmployeeLeaveSummary?year=YYYY` + `listAbsences` + `listPublicHolidays`) ;
|
||
- les compteurs du bandeau reflètent l'année sélectionnée.
|
||
|
||
## Verrouillage des éditions sur années passées
|
||
|
||
Quand `selectedYear !== currentYear` (consultation d'une année antérieure) :
|
||
- le bouton crayon **Jours fractionnés** (non-FORFAIT) est désactivé ;
|
||
- le bouton crayon **Année N-1 payés** (FORFAIT) est désactivé.
|
||
|
||
Justification : modifier rétroactivement les stocks de report ou les jours fractionnés d'un exercice clos décalerait silencieusement les soldes de toutes les années postérieures. La consultation reste possible, l'édition non.
|
||
|
||
## Implémentation
|
||
|
||
- Composable : `frontend/composables/useEmployeeLeave.ts`
|
||
- État : `selectedLeaveYear`, computed `currentLeaveYear`, `availableLeaveYears`
|
||
- API : `setSelectedLeaveYear(year)`, `loadLeaveData()`, `resetLoaded()`
|
||
- `resetLoaded()` (appelé au changement d'employé) remet `selectedLeaveYear = null` pour que la valeur par défaut soit recalculée à partir du nouveau contrat.
|
||
- Composant : `frontend/components/employees/LeaveTab.vue`
|
||
- Props : `selectedYear`, `availableYears`, `currentYear`
|
||
- Event : `update-selected-year`
|
||
- Page : `frontend/pages/employees/[id].vue` (câble le composable au composant)
|
||
- Backend : `EmployeeLeaveSummaryProvider` reçoit `RTT_START_DATE` via `services.yaml` (argument `$dataStartDate`) et l'expose dans la réponse `EmployeeLeaveSummary.dataStartDate`. Le filtrage `?year=YYYY` était déjà accepté (validation 2000–2100).
|