fix(leave) : do not cap from at phase.startDate for non-forfait phases
The CP exercise (Juin N-1 → Mai N) is annual and continuous across contract-signature changes within the same leave rule (e.g. 35h → 39h, isDriver flip, weeklyHours bump). Capping `from` at the phase start truncated the accrual to just the months under the latest phase, producing wrong "en cours d'acquisition" values and dropping presence days from earlier months on the leave-tab calendar. For Damien GUILLOT (35h until 2025-10-31, then 39h), this gave 15 days acquired (6 months Nov→Apr) instead of the expected 27.5 days (11 months Jun→Apr at 2.5/month). After this fix, the H39 view shows the full annual accrual as expected. FORFAIT phases keep the from cap: the 218-day target is calendar-year scoped and only counts the FORFAIT portion of the year. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -49,9 +49,27 @@ Affiché quand le picker est sur une phase passée. Indique que le mode lecture
|
||||
|
||||
## Transition d'exercice
|
||||
|
||||
Quand un exercice chevauche deux phases (ex. switch 39h→FORFAIT au 01/05/2026 fait que l'exercice Juin 2025 → Mai 2026 est à cheval) :
|
||||
- Vu depuis la phase 39h, l'exercice est borné à `phase.endDate` (30/04/2026).
|
||||
- Vu depuis la phase FORFAIT, la période civile 2026 est bornée à `phase.startDate` (01/05/2026).
|
||||
Quand un exercice chevauche deux phases, les bornes sont capées différemment selon le type de phase consultée :
|
||||
|
||||
### Phase FORFAIT (passée ou courante)
|
||||
|
||||
Le cumul 218 jours est **par année civile**. Toute consultation FORFAIT cape :
|
||||
- `from` à `max(phase.startDate, 1er janvier de l'année)`
|
||||
- `to` à `min(phase.endDate, 31 décembre de l'année)`
|
||||
|
||||
Ex. switch 39h → FORFAIT au 01/05/2026, vue FORFAIT année 2026 → période = [01/05/2026, 31/12/2026].
|
||||
|
||||
### 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` :
|
||||
- `from` reste à 1er juin de l'année (le contrat-entry-date est géré par `resolveEffectivePeriodStart` pour les nouveaux embauchés)
|
||||
- `to` est borné à `phase.endDate` uniquement quand on consulte une **phase passée**
|
||||
|
||||
Ex. employé 35h jusqu'au 31/10/2025 puis 39h depuis le 01/11/2025 :
|
||||
- Vue 39h (courante) sur exercice 2026 → période = [01/06/2025, 31/05/2026]. Acquis CP = exercice complet (~27.5 jours à fin avril).
|
||||
- Vue 35h (passée) sur exercice 2026 → période = [01/06/2025, 31/10/2025]. Acquis CP = 5 mois de l'exercice.
|
||||
|
||||
**Important** : c'est intentionnel que la vue courante 39h inclue les mois Juin-Octobre travaillés en 35h dans son cumul. Le stock CP est annuel, pas par phase ; un changement d'heures ne reset pas le compteur.
|
||||
|
||||
## API
|
||||
|
||||
|
||||
Reference in New Issue
Block a user