# Proposer toujours l'exercice suivant dans les sélecteurs Congés et RTT

**Date** : 2026-05-26
**Ticket** : SIRH-32
**Statut** : design validé

## Contexte

Les onglets **Congés** et **RTT** de la fiche employé proposent un sélecteur
d'exercice (`availableLeaveYears` / `availableRttYears`) dont la borne haute est
plafonnée à l'**exercice courant**. La RH a commencé à poser des congés sur
l'**exercice suivant**, mais ne peut pas le consulter dans la fiche employé :
l'exercice suivant n'apparaît pas dans le menu déroulant.

On veut que le sélecteur propose **toujours** l'exercice suivant pour une phase
de contrat ouverte, afin que ce besoin ne ressurgisse jamais.

## Faisabilité — déjà supportée côté backend

Aucun changement backend n'est nécessaire :

- `EmployeeLeaveSummaryProvider::clampYearToPhase` et son équivalent RTT ne
  plafonnent **pas** vers le haut quand la phase est ouverte (`phase.endDate`
  nul → `lastYear = null`). Une requête `?year=<exercice+1>&phaseId=<phase ouverte>`
  est donc déjà calculée correctement.
- La validation `year` (2000–2100) couvre largement l'exercice suivant.

Le seul blocage est le **frontend**, qui calcule `maxYear = exercice courant`.

## Le changement

Frontend uniquement. Dans `frontend/composables/useEmployeeLeave.ts`
(`availableLeaveYears`) et `frontend/composables/useEmployeeRtt.ts`
(`availableRttYears`), la borne haute devient :

- **Phase ouverte** (pas de `phase.endDate`) :
  `maxYear = exercice courant + 1`.
- **Phase clôturée** (`phase.endDate` présent) : **inchangé** →
  `maxYear = exercice de fin de phase` (on ne propose pas au-delà d'une phase
  terminée).

Le `+1` porte sur le **numéro d'exercice**, donc il est correct pour le forfait
(année civile) comme pour le non-forfait (Juin N-1 → Mai N), via
`computeLeaveYearForDate` / `computeRttYearForDate`.

### Pseudo-code de la borne

```
maxYear = phase.endDate
  ? computeYearForDate(phase.endDate)   // phase clôturée : cap à la fin de phase
  : currentYear + 1                     // phase ouverte : on propose l'exercice suivant
```

La borne basse (`minYear = max(phaseStartYear, dataFloor)`) est **inchangée**.

## Comportements conservés

- **Sélection par défaut** : inchangée. L'onglet s'ouvre toujours sur l'exercice
  **courant** ; l'exercice suivant est seulement disponible dans le menu (pas de
  saut automatique sur le futur). `initSelected*Year` continue d'initialiser sur
  `current*Year`, qui reste dans la plage `[minYear ; maxYear]`.
- **Verrouillage des éditions** : `isHistoricalYear` (`selectedYear !== currentYear`)
  reste tel quel. Sur l'exercice suivant, les boutons **Jours fractionnés**,
  **Année N-1 payés** (onglet Congés) et **+ Payer les RTT** (onglet RTT) sont
  **désactivés** — souhaitable : pas d'édition de stocks ni de paiement sur un
  exercice pas encore démarré.
- **Aucune mention « passé » trompeuse** : le bandeau « Vous consultez
  l'historique » est piloté par la phase (`isViewingPastPhase`), pas par l'année
  sélectionnée ; sélectionner un exercice futur ne l'affiche pas.

## Affichage des congés posés sur l'exercice suivant (réponse Q1)

Le header congés (grille de compteurs de l'onglet + libellé présence du header
de fiche) reflète **le récap de l'exercice sélectionné**. Chaque récap est
calculé sur sa fenêtre `[from, to]` ; les absences/jours pris ne sont comptés que
dans cette fenêtre.

- **Sur l'exercice courant** (vue par défaut) : les congés posés sur l'exercice
  suivant **n'apparaissent pas** dans les compteurs — comportement correct.
- **Sur l'exercice suivant** (sélectionné) : ils s'affichent (calendrier +
  compteur « Pris »).

### Caveat fonctionnel

Sur l'exercice suivant, les compteurs **report / Année N-1 / reste** sont
**provisoires** jusqu'à la clôture de l'exercice courant (ils en dépendent). En
revanche, le **« Pris » et le calendrier** des congés posés sont exacts. À
communiquer à la RH.

## Périmètre

- Onglet **Congés** et onglet **RTT** (les deux sélecteurs partagent la même
  mécanique).
- Forfait (année civile) et non-forfait (Juin→Mai).

## Hors périmètre

- Aucune modification de la mécanique de saisie d'absences (la RH pose déjà des
  congés sur l'exercice suivant via les écrans Calendrier / Heures, indépendamment
  de ce sélecteur).
- Pas de proposition de plusieurs exercices futurs (un seul : N+1).
- Pas d'activation des éditions de stocks/paiement sur l'exercice futur.

## Documentation à mettre à jour (règle obligatoire CLAUDE.md)

- `doc/leave-tab.md` — plage du sélecteur.
- `doc/rtt-tab.md` — plage du sélecteur.
- `CLAUDE.md` — sections « Onglet Congés » et « Onglet RTT » (description de la
  plage `max(...)` → borne haute `exercice courant + 1` sur phase ouverte).
- `frontend/data/documentation-content.ts` — documentation in-app.

## Tests

Pas de harnais de test frontend dans le projet (backend PHPUnit uniquement). La
modification est de la logique de calcul de plage dans deux `computed` :
vérification manuelle (dev Nuxt) que l'exercice suivant apparaît dans les deux
sélecteurs pour une phase ouverte, et n'apparaît pas pour une phase clôturée. Les
tests backend existants doivent rester verts (aucun changement backend).
