4.4 KiB
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.
- floor_historique_contrat : dérivé de
- la valeur est exposée par l'API
GET /employees/{id}/leave-summaryvia le champdataStartDate(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.endDatecô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ésdé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, computedcurrentLeaveYear,availableLeaveYears - API :
setSelectedLeaveYear(year),loadLeaveData(),resetLoaded() resetLoaded()(appelé au changement d'employé) remetselectedLeaveYear = nullpour que la valeur par défaut soit recalculée à partir du nouveau contrat.
- État :
- Composant :
frontend/components/employees/LeaveTab.vue- Props :
selectedYear,availableYears,currentYear - Event :
update-selected-year
- Props :
- Page :
frontend/pages/employees/[id].vue(câble le composable au composant) - Backend :
EmployeeLeaveSummaryProviderreçoitRTT_START_DATEviaservices.yaml(argument$dataStartDate) et l'expose dans la réponseEmployeeLeaveSummary.dataStartDate. Le filtrage?year=YYYYétait déjà accepté (validation 2000–2100).