feat(overtime-contingent) : heures supp structurelles (>35h) ajoutées au contingent
Auto Tag Develop / tag (push) Successful in 6s

Les heures contractuelles au-delà de 35h (ex. 39h → 17,33h décimales = 17h20/mois)
sont payées chaque mois sans transiter par les paiements RTT (référence 39h). Elles
manquaient au contingent. Ajout via StructuralOvertimeContingentCalculator :
(weeklyHours-35)×260 min/mois, généralisé aux contrats non-forfait/non-intérim >35h,
proratisé aux jours sous contrat. Branché sur l'encart fiche et l'export PDF.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-12 08:57:26 +02:00
parent 7dc73f37ac
commit 0a9b26d31e
8 changed files with 291 additions and 10 deletions
+12 -3
View File
@@ -111,9 +111,18 @@
## Contingent heures supplémentaires payées
- Suivi par **année civile** (JanvDéc) des heures supp payées vs plafond légal (350 h
chauffeur / 220 h autres), non-forfait uniquement.
- **Heures payées** = `base25 + base50` (hors bonus). **Mapping** : paiements RTT stockés par
exercice → `annéeCivile = mois ≥ 6 ? exercice 1 : exercice` ; année civile Y = exercice Y
(mois 15) + exercice Y+1 (mois 612). Cœur partagé pur `OvertimePaidContingentCalculator`.
- **Heures payées** = `base25 + base50` (hors bonus) **+ heures structurelles**. **Mapping** :
paiements RTT stockés par exercice → `annéeCivile = mois ≥ 6 ? exercice 1 : exercice` ;
année civile Y = exercice Y (mois 15) + exercice Y+1 (mois 612). Cœur partagé pur
`OvertimePaidContingentCalculator`.
- **Heures structurelles** : les heures contractuelles au-delà de 35h (durée légale) sont des
heures supp payées chaque mois, hors paiements RTT (la référence d'un 39h est 39h). Ajoutées
au contingent : `(weeklyHours 35) × 52/12` h/mois = `(weeklyHours 35) × 260` min (39h →
1040 min = 17,33 h/mois). Généralisé à tout contrat non-forfait/non-intérim `weeklyHours > 35`
(custom 40h → 21,67 h/mois) ; **proratisé** aux jours sous contrat dans le mois (itère
`employee.contractPeriods`). Cœur partagé `StructuralOvertimeContingentCalculator`
(`monthlyStructuralMinutes`/`totalStructuralMinutes`), branché sur l'encart fiche
(`EmployeeOvertimeContingentProvider`) **et** l'export (`OvertimeContingentExportBuilder`).
- **Plafond** résolu sur `isDriver` du **contrat courant**.
- **Fiche employé** : encart header `Total H.payés {année} : X h / plafond h` (année civile
courante, rouge si dépassement), via `GET /employees/{id}/overtime-contingent`. Encart