Files
SIRH/doc/leave-tab.md

4.4 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 (= 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.

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