From 8ae8b2098c1c6f339592ee824037a2426cea2f36 Mon Sep 17 00:00:00 2001 From: tristan Date: Tue, 2 Jun 2026 08:17:02 +0200 Subject: [PATCH] [#SIRH] Panier de nuit: ne s'applique pas aux conducteurs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- CLAUDE.md | 1 + doc/functional-rules.md | 2 +- frontend/data/documentation-content.ts | 2 +- src/State/SalaryRecapPrintProvider.php | 5 ++--- src/State/WorkHourWeeklySummaryProvider.php | 5 ++++- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 787675d..9f711e3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -40,6 +40,7 @@ - Absences: stored per day (auto-split), AM/PM/full day, clear corresponding hour slots - Absences with `countAsWorkedHours=true`: credit minutes (TIME) or nothing (PRESENCE) - Driver periods (`isDriver=true` on `EmployeeContractPeriod`): separate screen `/driver-hours`, uses `dayHoursMinutes`/`nightHoursMinutes` + meal/overnight flags on `WorkHour` +- **Panier de nuit (PN) — conducteurs exclus** : le panier de nuit (règle nuit > jour OU nuit ≥ 4h) **ne s'applique qu'aux non-conducteurs**. Un jour conducteur ne crédite jamais de PN, ni sur la vue semaine (`WorkHourWeeklySummaryProvider`, garde `!$isDateDriver`) ni sur le récap salaire (`SalaryRecapPrintProvider`, bloc `if ($isDriver)` sans incrément). Les conducteurs ont leurs propres primes (PDJ/repas/nuitée). ## Fériés - Source : API gouv via `PublicHolidayService` (cache 30j) diff --git a/doc/functional-rules.md b/doc/functional-rules.md index a156869..149582d 100644 --- a/doc/functional-rules.md +++ b/doc/functional-rules.md @@ -168,7 +168,7 @@ Documents complementaires: - Validation: même logique que les heures classiques (`isValid`, `isSiteValid`, bulk) - Vue semaine: - jour/nuit/atelier par jour + indicateurs repas/dîner/nuitée - - panier de nuit (PN): affiché par jour si (nightMinutes > dayMinutes) OU (nightMinutes >= 240, soit au moins 4h de travail entre 21h et 6h), et total hebdo dans la colonne Jour/Nuit sem. + - panier de nuit (PN): **ne s'applique pas aux conducteurs** (ils disposent de leurs propres primes repas/nuitée). Aucun PN n'est crédité sur un jour conducteur, ni sur la vue semaine conducteurs ni sur le récap salaire. La règle PN (nuit > jour OU nuit ≥ 4h) ne concerne que les non-conducteurs. - totaux hebdo: jour, nuit, atelier, total, compteurs petit déj/déjeuner/dîner/nuitée - les conducteurs utilisent `dayHoursMinutes + nightHoursMinutes + workshopHoursMinutes` pour le calcul RTT (au lieu des créneaux morning/afternoon/evening) - Le flag `isDriver` est sur `EmployeeContractPeriod` (un employé peut changer de statut chauffeur selon la période) diff --git a/frontend/data/documentation-content.ts b/frontend/data/documentation-content.ts index 60dbb49..abcd00d 100644 --- a/frontend/data/documentation-content.ts +++ b/frontend/data/documentation-content.ts @@ -374,7 +374,7 @@ export const documentationSections: DocSection[] = [ requiredLevel: 'admin', blocks: [ { type: 'paragraph', content: 'La vue semaine conducteurs affiche des colonnes spécifiques.' }, - { type: 'list', content: 'Totaux jour / nuit / atelier par jour et par semaine\nPanier de nuit (PN) : affiché quand heures nuit > heures jour OU nuit ≥ 4h\nCompteurs hebdomadaires : petit déjeuner, déjeuner, dîner, nuitée\nRTT calculé sur jour + nuit + atelier (au lieu des créneaux classiques)' }, + { type: 'list', content: 'Totaux jour / nuit / atelier par jour et par semaine\nPanier de nuit (PN) : ne s\'applique pas aux conducteurs (ils ont leurs propres primes repas/nuitée)\nCompteurs hebdomadaires : petit déjeuner, déjeuner, dîner, nuitée\nRTT calculé sur jour + nuit + atelier (au lieu des créneaux classiques)' }, ], }, ], diff --git a/src/State/SalaryRecapPrintProvider.php b/src/State/SalaryRecapPrintProvider.php index 2251563..ecd47c0 100644 --- a/src/State/SalaryRecapPrintProvider.php +++ b/src/State/SalaryRecapPrintProvider.php @@ -405,9 +405,8 @@ class SalaryRecapPrintProvider implements ProviderInterface $dayMin = $wh->getDayHoursMinutes() ?? 0; $nightMin = $wh->getNightHoursMinutes() ?? 0; $workshopMin = $wh->getWorkshopHoursMinutes() ?? 0; - if (($nightMin > $dayMin && $nightMin > 0) || $nightMin >= 240) { - ++$nightBasketCount; - } + // Le panier de nuit ne s'applique pas aux conducteurs (primes repas/nuitée + // dédiées). Aucun panier de nuit crédité ici. if ($wh->getHasBreakfast()) { ++$driverBreakfast; diff --git a/src/State/WorkHourWeeklySummaryProvider.php b/src/State/WorkHourWeeklySummaryProvider.php index 00ae3f1..5885c05 100644 --- a/src/State/WorkHourWeeklySummaryProvider.php +++ b/src/State/WorkHourWeeklySummaryProvider.php @@ -286,7 +286,10 @@ final readonly class WorkHourWeeklySummaryProvider implements ProviderInterface $present = min(1.0, $morning + $afternoon + $creditedPresence); } - $hasNightBasket = ($nightMinutes > $dayMinutes && $nightMinutes > 0) || $nightMinutes >= 240; + // Le panier de nuit ne s'applique pas aux conducteurs (ils ont leurs propres + // primes repas/nuitée). Réservé aux non-conducteurs. + $hasNightBasket = !$isDateDriver + && (($nightMinutes > $dayMinutes && $nightMinutes > 0) || $nightMinutes >= 240); if ($hasNightBasket) { ++$weeklyNightBasketCount; }