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 @@ +
+ +
+
+
+ +