En-tête fusionné "Heures payés" (colspan=2) avec deux sous-colonnes 25% et
50% sous-jacentes. paid25Hours=base25Minutes, paid50Hours=base50Minutes
(bases seules, total inchangé vs l'ancienne colonne unique). buildRttPaymentMap
renvoie ['m25','m50'] par employé. Tableau passé à 20 colonnes (colspan ajustés).
PDF généré et validé sur données prod (A4 paysage, largeurs ~228mm).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
L'export récap salaire comptait tous les congés 'C' d'un forfait et ne
créditait aucune présence sur les jours de congé. Or un congé imputé sur le
stock N-1 ne doit pas s'afficher et doit compter comme jour de présence
(règle déjà appliquée dans la fiche employé via EmployeeLeaveSummaryProvider).
- Nouvelle méthode publique resolvePreviousYearTakenDays() (mutualise le budget
N-1 avec la fiche: phase courante + recalcul jours payés).
- SalaryRecapPrintProvider charge les congés depuis le 1er janvier et consomme
le budget N-1 chronologiquement (splitForfaitCongesByN1): jours couverts N-1
retirés de l'affichage congés et ajoutés à la présence; au-delà = congés N.
- Non-forfait / budget N-1 = 0: comportement inchangé.
Vérifié end-to-end sur données prod (SARAZI mai: +1 présence, 4 congés affichés;
LIOT/ODUNCU budget 0 après paiement N-1 -> congés affichés).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>