fix : ancrer la clôture dynamique des congés sur le solde bootstrap

computeDynamicClosingForYear (qui produit le report d'ouverture de
l'exercice suivant) ignorait la table employee_leave_balances et
recalculait depuis l'embauche, sans absences historiques. Pour un
exercice consulté en avance, il cumulait donc une année pleine
d'acquisition par exercice antérieur à la mise en service.

Cas Aurore (CDI depuis 2022, bootstrap 2026 = report 32 / pris 24) :
report d'ouverture 2027 affiché à 88,39 j au lieu de 31. La vue courante
était juste car le provider, lui, lit déjà le bootstrap.

La clôture dynamique applique désormais la même règle que
EmployeeLeaveSummaryProvider::computeYearSummary : si une ligne bootstrap
existe pour l'exercice, on part de opening_days/opening_saturdays et on
ajoute l'offset taken_days/taken_saturdays, au lieu du report dynamique
accumulé. Vérifié sur données réelles : 88,39 -> 31,00 j.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-26 11:06:18 +02:00
parent 7a86669878
commit 2418836cd1
3 changed files with 31 additions and 7 deletions
+1
View File
@@ -68,6 +68,7 @@ Etat implementation:
- la table est creee
- le calcul de synthese conges lit en priorite `opening_days/opening_saturdays` de cette table quand une ligne existe pour `(employee, rule_code, year)`
- si aucune ligne n'existe, le calcul reste base sur le report dynamique N-1
- **le report dynamique (`LeaveBalanceComputationService::computeDynamicClosingForYear`, qui alimente le solde d'ouverture de l'exercice suivant) ancre lui aussi sur cette table** : pour chaque exercice de sa boucle, si une ligne bootstrap existe il part de `opening_days/opening_saturdays` (et ajoute l'offset `taken_days/taken_saturdays`) au lieu de recalculer depuis l'embauche. Sans cet ancrage, la clôture d'un exercice consulté en avance (ex. exercice suivant) cumulerait une année pleine d'acquisition par exercice antérieur à la mise en service — aucune absence historique n'étant saisie (cas Aurore : 88 jours au lieu de 31).
- la commande `app:leave:rollover` calcule aussi le report dynamique N-1 si la ligne N-1 n'est pas encore persistée (pas de reset a 0 par defaut)
### Definition des colonnes