From c018b58990592b9207a5b06154c2aed21471e6ca Mon Sep 17 00:00:00 2001 From: tristan Date: Wed, 20 May 2026 17:52:01 +0200 Subject: [PATCH] docs(leave) : document prorated forfait work-target in header Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 1 + doc/contract-phase-view.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index f034713..27e4367 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -92,6 +92,7 @@ - Sélectionner une phase passée : - Onglet **Congés** : période et règles de la phase (Juin→Mai non-forfait, Jan→Déc FORFAIT). Exercice de transition capé sur `phase.endDate`. **Cap `from` au `phase.startDate` uniquement pour FORFAIT** (sémantique année civile). Pour le non-forfait, l'exercice CP reste annuel et continu à travers les changements d'heures (35h→39h, etc.) — seul `resolveEffectivePeriodStart` clampe sur la date d'entrée en contrat des nouveaux embauchés. - **Entrée FORFAIT en cours d'année** (année d'entrée only) : l'exercice d'entrée crédite `repos_proratisés + CP_reportés` au lieu de `max(0, businessDays−218)`=0. Repos année = `jours_ouvrés_année − 218 − 25`, proratisés par jours ouvrés. CP reportés = solde de la phase non-forfait précédente (jours ouvrés nets + samedis bruts ; un samedi posé ne réduit PAS le report ; fractionnés exclus). Nouvel embauché = repos seuls. Années pleines suivantes + forfait démarrant le 01/01 = calcul 218 inchangé (→34). Services : `EmployeeLeaveSummaryProvider::{resolveLeavePolicy (branche FORFAIT), isForfaitEntryYear, computeProratedForfaitRepoDays, resolveCarriedCpFromPriorPhase}`. Témoin Grégory : ≈13. + - **Header fiche employé (jours à travailler / présence / restant)** : `EmployeeLeaveSummary.forfaitWorkTargetDays` = `jours_ouvrés_période − acquiredDays` (218 année pleine = 252−34 ; entrée = 168−13 ≈ **155**). Le header (`useEmployeeDetailPage.employeeContractWorkLabel` + `forfaitRemainingDaysLabel`) affiche `Forfait - {target} jours ({presenceDaysToToday} présence · {target−présence} restants)`. Avant : `218` codé en dur → faux pour une entrée en cours d'année. Témoin Grégory : `155 jours (11 présence · 144 restants)`. - Onglet **RTT** : visible ssi `phase.contractType !== FORFAIT`. Tableau hebdo affiché sur l'exercice complet (Juin→Mai) ; `periodFrom` non capé sur `phase.startDate` (les semaines avant embauche ou hors phase apparaissent à 0). `periodTo`/`limitDate` capés sur `phase.endDate` pour les phases clôturées. `+ Payer les RTT` actif uniquement sur l'exercice contenant `phase.endDate`. - Bandeau jaune affiché en mode phase passée. Édition d'absences et des stocks de report (jours fractionnés, Année N-1 payés) désactivée. - Sélection non persistée — chaque ouverture de fiche démarre sur la phase courante. diff --git a/doc/contract-phase-view.md b/doc/contract-phase-view.md index d5c49c0..f6b37eb 100644 --- a/doc/contract-phase-view.md +++ b/doc/contract-phase-view.md @@ -74,6 +74,8 @@ L'**année d'entrée** (période partielle, ex. 01/05 → 31/12) ne calcule pas Exemple Grégory BARRIBAULT (forfait 01/05/2026 après 39h, exercice 2026) : `6 repos + ~7 CP = ≈ 13 jours`. +**Header de la fiche** : `EmployeeLeaveSummary.forfaitWorkTargetDays` = `jours_ouvrés_période − congés_acquis` donne les **jours à travailler** de l'exercice (218 sur une année pleine, prorata sinon ; Grégory 2026 = `168 − 13 ≈ 155`). Le header affiche `Forfait - {jours à travailler} jours ({présence} présence · {restant} restants)` avec `restant = jours_à_travailler − presenceDaysToToday`. Auparavant le `218` était codé en dur côté frontend, donc faux pour une entrée en cours d'année (Grégory : `155 jours (11 présence · 144 restants)`). + ### Phase non-forfait (35h / 39h / CUSTOM / INTERIM) L'exercice CP est **annuel** (Juin N-1 → Mai N) et continu à travers les changements d'heures contractuelles dans le même régime non-forfait. La cap **n'applique pas** sur `from` :