Retour RH: vue jour par date, RTT mi-semaine, récap salaire & exports, panier de nuit #21

Merged
tristan merged 13 commits from fix/retour-rh into develop 2026-06-02 06:26:40 +00:00

13 Commits

Author SHA1 Message Date
tristan 8ae8b2098c [#SIRH] Panier de nuit: ne s'applique pas aux conducteurs
La règle panier de nuit (nuit > jour OU nuit >= 4h) ne concerne que les
non-conducteurs ; les conducteurs ont leurs propres primes (PDJ/repas/nuitée).
Eddy (conducteur) avait un PN à tort (jour atelier + un peu de nuit).

- WorkHourWeeklySummaryProvider: garde !isDateDriver sur le calcul du PN.
- SalaryRecapPrintProvider: retrait de l'incrément PN du bloc conducteur.
- Docs (functional-rules, in-app, CLAUDE.md) rectifiées (le PN était décrit
  à tort dans la section conducteurs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 08:17:02 +02:00
tristan 94cf8eb7a9 [#SIRH] Récap salaire: exclure les salariés sans contrat sur le mois
Le récap listait tous les employés sans filtrer le contrat: un salarié au
contrat terminé (ex. Marine, fin 26/02) apparaissait sur le récap de juin.
Ajout du filtre hasContractInRange (même règle que l'impression absences) sur
la période [from, to] du mois imprimé.

4 tests ajoutés. Vérifié sur données prod (Marine + 6 autres contrats terminés
exclus du mois de juin, 39 salariés contractés conservés).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 08:10:54 +02:00
tristan 7886666812 [#SIRH] Exports heures annuelles: afficher tous les jours contractés + week-ends plus foncés
- YearlyHoursExportBuilder: ne plus sauter les jours de semaine vides/non saisis.
  Tous les jours sous contrat sont affichés (jusqu'à aujourd'hui); seuls les
  jours hors contrat restent omis. Corrige les lignes manquantes signalées par la RH.
- Templates print/print-all: gris des samedis/dimanches foncé (#f3f3f3 -> #c0c0c0).
- Docs (functional-rules, in-app, CLAUDE.md).

NB: l'export tous-salariés sur l'année peut dépasser memory_limit=256M (Dompdf) —
limitation pré-existante (déjà le cas avant ce changement), non corrigée ici.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 23:47:31 +02:00
tristan c1ff46933a [#SIRH] Récap salaire: scinder la colonne Heures payés en 25% / 50%
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>
2026-06-01 23:34:59 +02:00
tristan 1486b770b1 [#SIRH] Récap salaire: congés N-1 forfait non affichés et comptés en présence
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>
2026-06-01 23:20:07 +02:00
tristan 89e637ce9e [#SIRH] RTT: proratiser le plafond 25%/50% pour les embauches en milieu de semaine
Le seuil de départ du +25% était proratisé aux jours contractés, mais le
plafond 25%/50% restait codé en dur à 43h: pour une embauche en milieu de
semaine, toutes les heures supp tombaient en 25%, jamais en 50%.

Le plafond vaut désormais seuil_départ_proraté + largeur de bande +25%
(4h pour un 39h, 8h pour un 35h). Semaine pleine: plafond = 43h (inchangé).
Témoin Dylan (CDD 39h embauché jeudi, 22h): 4h à 25% + 3h à 50%.

Écran Heures (WorkHourWeeklySummaryProvider) laissé tel quel (décision métier).
Suppression de deux helpers morts (computeOvertime25/50BonusMinutes) du service.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 22:29:08 +02:00
tristan 892d3b3c68 docs: synchroniser le docblock @var rows de WorkHourDayContext
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 21:55:55 +02:00
tristan d248df69ea docs: vue jour contrat à la date affichée (doc + in-app + CLAUDE.md) 2026-06-01 21:51:07 +02:00
tristan 1143baa169 [#SIRH] Vue jour: typer contractType (ContractType) sur la ligne du jour 2026-06-01 21:49:26 +02:00
tristan 441bac9d51 [#SIRH] Vue jour: saisie/présence et libellé résolus à la date affichée
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 21:45:23 +02:00
tristan f8e65496d7 [#SIRH] Vue jour: exposer le contrat du jour sur DayContextRow 2026-06-01 21:42:04 +02:00
tristan 71ae624c29 docs: plan vue jour contrat à la date affichée
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 21:39:51 +02:00
tristan 387cff2293 docs: spec vue jour résolution contrat à la date affichée
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 21:37:26 +02:00