Files
SIRH/doc/leave-tab.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.6 KiB
Raw Blame History

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