[#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>
This commit is contained in:
@@ -40,6 +40,7 @@
|
|||||||
- Absences: stored per day (auto-split), AM/PM/full day, clear corresponding hour slots
|
- Absences: stored per day (auto-split), AM/PM/full day, clear corresponding hour slots
|
||||||
- Absences with `countAsWorkedHours=true`: credit minutes (TIME) or nothing (PRESENCE)
|
- 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`
|
- 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
|
## Fériés
|
||||||
- Source : API gouv via `PublicHolidayService` (cache 30j)
|
- Source : API gouv via `PublicHolidayService` (cache 30j)
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ Documents complementaires:
|
|||||||
- Validation: même logique que les heures classiques (`isValid`, `isSiteValid`, bulk)
|
- Validation: même logique que les heures classiques (`isValid`, `isSiteValid`, bulk)
|
||||||
- Vue semaine:
|
- Vue semaine:
|
||||||
- jour/nuit/atelier par jour + indicateurs repas/dîner/nuitée
|
- 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
|
- 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)
|
- 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)
|
- Le flag `isDriver` est sur `EmployeeContractPeriod` (un employé peut changer de statut chauffeur selon la période)
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ export const documentationSections: DocSection[] = [
|
|||||||
requiredLevel: 'admin',
|
requiredLevel: 'admin',
|
||||||
blocks: [
|
blocks: [
|
||||||
{ type: 'paragraph', content: 'La vue semaine conducteurs affiche des colonnes spécifiques.' },
|
{ 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)' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -405,9 +405,8 @@ class SalaryRecapPrintProvider implements ProviderInterface
|
|||||||
$dayMin = $wh->getDayHoursMinutes() ?? 0;
|
$dayMin = $wh->getDayHoursMinutes() ?? 0;
|
||||||
$nightMin = $wh->getNightHoursMinutes() ?? 0;
|
$nightMin = $wh->getNightHoursMinutes() ?? 0;
|
||||||
$workshopMin = $wh->getWorkshopHoursMinutes() ?? 0;
|
$workshopMin = $wh->getWorkshopHoursMinutes() ?? 0;
|
||||||
if (($nightMin > $dayMin && $nightMin > 0) || $nightMin >= 240) {
|
// Le panier de nuit ne s'applique pas aux conducteurs (primes repas/nuitée
|
||||||
++$nightBasketCount;
|
// dédiées). Aucun panier de nuit crédité ici.
|
||||||
}
|
|
||||||
|
|
||||||
if ($wh->getHasBreakfast()) {
|
if ($wh->getHasBreakfast()) {
|
||||||
++$driverBreakfast;
|
++$driverBreakfast;
|
||||||
|
|||||||
@@ -286,7 +286,10 @@ final readonly class WorkHourWeeklySummaryProvider implements ProviderInterface
|
|||||||
$present = min(1.0, $morning + $afternoon + $creditedPresence);
|
$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) {
|
if ($hasNightBasket) {
|
||||||
++$weeklyNightBasketCount;
|
++$weeklyNightBasketCount;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user