Files
SIRH/docs/superpowers/specs/2026-05-26-exercice-suivant-conges-rtt-design.md
T
tristan cf2e12c8ba
Auto Tag Develop / tag (push) Successful in 9s
[#SIRH-32] Ajouter l'exercice 2026/2027 dans les congés/RTT (#20)
| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|                  |                 |

## Description de la PR

## Modification du .env

## Check list

- [x] Pas de régression
- [x] TU/TI/TF rédigée
- [x] TU/TI/TF OK
- [ ] CHANGELOG modifié

Reviewed-on: #20
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
2026-05-26 14:09:02 +00:00

5.2 KiB
Raw Blame History

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 (20002100) 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).