From 339d650b4198bd468b5c62b8b0407bd3e8ae71a2 Mon Sep 17 00:00:00 2001 From: tristan Date: Sun, 15 Mar 2026 19:04:52 +0100 Subject: [PATCH] feat : ajout de la gestion des heures chauffeurs --- .claude/settings.local.json | 3 +- CLAUDE.md | 2 + doc/functional-rules.md | 23 + .../driver-hours/DriverHoursDayView.vue | 225 ++++ .../driver-hours/DriverHoursWeekView.vue | 100 ++ frontend/components/employees/ContractTab.vue | 13 + frontend/composables/useDriverHoursPage.ts | 960 ++++++++++++++++++ frontend/composables/useEmployeeContract.ts | 7 +- frontend/composables/useHoursPage.ts | 4 + frontend/layouts/default.vue | 10 + frontend/pages/driver-hours.vue | 182 ++++ frontend/pages/employees/index.vue | 19 +- frontend/services/dto/employee.ts | 2 + frontend/services/dto/work-hour.ts | 30 + frontend/services/employees.ts | 8 +- migrations/Version20260315100000.php | 26 + migrations/Version20260315100100.php | 34 + src/ApiResource/WorkHourBulkUpsert.php | 7 +- src/Dto/Employees/ContractHistoryItem.php | 2 + src/Dto/WorkHours/DayContextRow.php | 2 + src/Dto/WorkHours/WeeklyDaySummary.php | 3 + src/Dto/WorkHours/WeeklySummaryRow.php | 4 + src/Entity/Employee.php | 22 + src/Entity/EmployeeContractPeriod.php | 15 + src/Entity/WorkHour.php | 80 ++ .../EmployeeContractChangeRequest.php | 1 + .../EmployeeContractChangeRequestFactory.php | 1 + .../EmployeeContractPeriodBuilder.php | 2 + .../EmployeeContractPeriodManager.php | 11 +- ...EmployeeContractPeriodManagerInterface.php | 4 +- .../Contracts/EmployeeContractResolver.php | 54 + src/State/EmployeeWriteProcessor.php | 6 +- src/State/WorkHourBulkUpsertProcessor.php | 106 +- src/State/WorkHourDayContextProvider.php | 4 +- src/State/WorkHourWeeklySummaryProvider.php | 85 +- 35 files changed, 2015 insertions(+), 42 deletions(-) create mode 100644 frontend/components/driver-hours/DriverHoursDayView.vue create mode 100644 frontend/components/driver-hours/DriverHoursWeekView.vue create mode 100644 frontend/composables/useDriverHoursPage.ts create mode 100644 frontend/pages/driver-hours.vue create mode 100644 migrations/Version20260315100000.php create mode 100644 migrations/Version20260315100100.php diff --git a/.claude/settings.local.json b/.claude/settings.local.json index a3c8666..8eaa2eb 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -21,7 +21,8 @@ "Bash(ls /home/m-tristan/workspace/SIRH/docker* /home/m-tristan/workspace/SIRH/Makefile 2>/dev/null; cat /home/m-tristan/workspace/SIRH/Makefile 2>/dev/null | grep -E \"\\(phpunit|test|php\\)\" | head -20)", "Bash(which python3:*)", "Bash(sudo apt-get:*)", - "Bash(npx xlsx-cli:*)" + "Bash(npx xlsx-cli:*)", + "Bash(cat /home/m-tristan/.claude/projects/-home-m-tristan-workspace-SIRH/4b53d9d7-d8ae-451f-a5cc-5d4fd55f2eef/tool-results/toolu_019hng9Cu2m9wiNACuC2Wm3F.json | python3 -c \"import json,sys; data=json.load\\(sys.stdin\\); print\\(data[0]['text']\\)\" 2>/dev/null | head -2000)" ] } } diff --git a/CLAUDE.md b/CLAUDE.md index 7ae0446..10254f0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -32,6 +32,7 @@ - Employee contract history: `employee_contract_periods`, resolved by `EmployeeContractResolver` - 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` ## Validation Rules - `isValid` (RH): locks line for everyone (admin can only untoggle validation) @@ -43,6 +44,7 @@ - Contracts <= 35h: +25% from 35h to 43h, +50% beyond - Contracts >= 39h: +25% from 39h to 43h, +50% beyond - INTERIM: no overtime bonuses, no recovery time +- Driver contracts: no overtime calculation ## Frontend Patterns diff --git a/doc/functional-rules.md b/doc/functional-rules.md index 97a4ee1..4ae479d 100644 --- a/doc/functional-rules.md +++ b/doc/functional-rules.md @@ -117,6 +117,29 @@ Documents complementaires: - pas de bonus 50% - pas de total récup +## 6bis) Heures Conducteurs + +- Écran dédié `/driver-hours` pour les employés dont le contrat est marqué `isDriver = true` +- Les conducteurs sont exclus de l'écran `/hours` classique +- Colonnes spécifiques (vue jour): + - Heure de jour (durée HH:MM via TimeSelect) + - Heure de nuit (durée HH:MM via TimeSelect) + - Total (somme jour + nuit, calculé) + - Petit déjeuner (checkbox) + - Déjeuner (checkbox) + - Nuitée (checkbox) +- Stockage backend: + - `dayHoursMinutes` et `nightHoursMinutes` (entiers, minutes) sur `WorkHour` + - `hasBreakfast`, `hasLunch`, `hasOvernight` (booleans) sur `WorkHour` + - les champs time classiques (morning/afternoon/evening) sont mis à null pour les chauffeurs +- Validation: même logique que les heures classiques (`isValid`, `isSiteValid`, bulk) +- Vue semaine: + - jour/nuit par jour + indicateurs repas/nuitée + - totaux hebdo: jour, nuit, total, compteurs petit déj/déjeuner/nuitée + - pas de calcul d'heures supplémentaires pour les conducteurs +- Le flag `isDriver` est sur `EmployeeContractPeriod` (un employé peut changer de statut chauffeur selon la période) +- Exposé en API via un getter virtuel sur `Employee` (`employee:read`) qui résout depuis la période active + ## 7) Fériés - Les jours fériés sont identifiés et affichés diff --git a/frontend/components/driver-hours/DriverHoursDayView.vue b/frontend/components/driver-hours/DriverHoursDayView.vue new file mode 100644 index 0000000..90162b2 --- /dev/null +++ b/frontend/components/driver-hours/DriverHoursDayView.vue @@ -0,0 +1,225 @@ + + + diff --git a/frontend/components/driver-hours/DriverHoursWeekView.vue b/frontend/components/driver-hours/DriverHoursWeekView.vue new file mode 100644 index 0000000..52fd3c4 --- /dev/null +++ b/frontend/components/driver-hours/DriverHoursWeekView.vue @@ -0,0 +1,100 @@ + + + diff --git a/frontend/components/employees/ContractTab.vue b/frontend/components/employees/ContractTab.vue index b92977f..5651292 100644 --- a/frontend/components/employees/ContractTab.vue +++ b/frontend/components/employees/ContractTab.vue @@ -240,6 +240,18 @@ +
+ +
+
+
+ +