# 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 au plus ancien. La borne haute est l'exercice **suivant** (exercice courant + 1) lorsque la phase de contrat est ouverte, afin de consulter en avance les congés posés sur l'exercice à venir ; pour une phase clôturée, la borne haute reste l'exercice de fin de phase ;
- **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'exercice courant et à l'exercice suivant.

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.

## Compteurs du bandeau

- **Acquis** : jours de report N-1 + jours acquis sur l'exercice courant.
- **Pris** : jours de congés posés et validés sur l'exercice.
- **Reste** : acquis − pris.
- **En cours d'acquisition** (non-forfait) : affiché au format `net / brut`.
  - `net` (`accruingDays`) : généré de l'exercice restant, déduit des congés posés en anticipé (au-delà du report acquis).
  - `brut` (`accruingDaysTotal` = `generatedDays + generatedSaturdays`) : total généré sur l'exercice à ce jour, avant cette déduction.
  - La RH voit ainsi le total réellement acquis même si une partie a déjà été consommée en anticipé. Forfait : pas d'en-cours (affiche `0`, sans fraction).
- **N-1** (non-forfait) ou **Samedis** (FORFAIT) : solde de l'exercice précédent / jours de repos samedis.

## Verrouillage des éditions hors exercice courant

Quand `selectedYear !== currentYear` (consultation d'une année **différente de l'exercice courant**, passée ou future) :
- 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 les stocks de report ou les jours fractionnés d'un exercice clos décalerait silencieusement les soldes des années postérieures ; les éditer sur un exercice futur (pas encore démarré) n'aurait pas de sens. La consultation reste possible, l'édition non.

## Sélecteur de phase de contrat

Quand l'employé a plusieurs phases de contrat (`Employee.contractPhases.length > 1`), le picker `Vue contrat` en haut de la fiche permet de consulter une phase passée. L'onglet Congés bascule alors sur les règles de la phase choisie :
- Période Juin→Mai pour les phases non-forfait, Jan→Déc pour FORFAIT.
- Sélecteur d'année interne borné aux exercices intersectant la phase.
- Bornes d'exercice cappées sur `phase.endDate` côté backend (l'exercice de transition affiche les soldes acquis jusqu'à la date de fin de phase, pas au-delà).
- Boutons crayon `Jours fractionnés` / `Année N-1 payés` désactivés (lecture seule sur phase passée).

Cf. `doc/contract-phase-view.md` pour les détails complets.

## 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).
