diff --git a/CLAUDE.md b/CLAUDE.md index abe8e70..2d0f0f2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,6 +44,12 @@ - Saisie d'heures (ou de jours de présence) autorisée sur un férié - **Crédit automatique des heures contractuelles** sur un férié Lun-Ven pour tout contrat hors Forfait, **uniquement en l'absence d'absence déclarée** : le total journalier = `max(saisie + credited_absence, référence_contractuelle)`. Référence : 35h→7h, 39h→8h Lun-Jeu/7h Ven, CUSTOM→weeklyHours/5, INTERIM→idem 35h/39h/custom selon weeklyHours. Aucune ligne BDD créée (crédit virtuel). Drivers : crédité en `dayHoursMinutes`. Impacte directement le total hebdo RTT (tranches 25%/50%). Dès qu'une absence est posée sur le férié, le crédit virtuel saute — c'est le `countAsWorkedHours` du type d'absence qui pilote. Services : `App\Service\WorkHours\HolidayVirtualHoursResolver` + `DailyReferenceMinutesResolver`. Doc complète : `doc/holiday-virtual-hours.md`. +## Commentaires de semaine +- Entité `EmployeeWeekComment` : commentaire libre par employé et semaine ISO (unique `(employee_id, week_start_date)`). `week_start_date` = lundi. +- CRUD `/employee_week_comments` `ROLE_ADMIN`. Write processor audite via `AuditLogger`. +- Picto bulle vue semaine (HoursWeekView + DriverHoursWeekView) : fond bleu/rouge. Intégré dans `WeeklySummaryRow.comment/commentId`. +- Doc : `doc/week-comments.md`. + ## Validation Rules - `isValid` (RH): locks line for everyone (admin can only untoggle validation) - `isSiteValid` (site manager): locks for non-admin, admin can still edit diff --git a/frontend/components/driver-hours/DriverHoursWeekView.vue b/frontend/components/driver-hours/DriverHoursWeekView.vue index 8fc8c16..d35da54 100644 --- a/frontend/components/driver-hours/DriverHoursWeekView.vue +++ b/frontend/components/driver-hours/DriverHoursWeekView.vue @@ -33,8 +33,11 @@ {{ row.firstName }} {{ row.lastName }} ({{ row.contractName ?? '-' }})

-

- {{ row.siteName ?? 'Sans site' }} — {{ contractNatureLabel(row.contractNature) }} +

+ {{ row.siteName ?? 'Sans site' }} — {{ contractNatureLabel(row.contractNature) }} +

@@ -103,9 +106,12 @@ const getDailyCellStyle = (daily: { defineProps<{ isWeekLoading: boolean + isAdmin: boolean weekGridCols: string weeklySummary: WeeklyWorkHourSummary | null weekDayHeaders: Array<{ date: string; weekday: string; dayDate: string }> formatMinutes: (minutes: number) => string }>() + +defineEmits<{ (e: 'open-comment', row: WeeklyWorkHourSummary['rows'][number]): void }>() diff --git a/frontend/components/hours/HoursWeekView.vue b/frontend/components/hours/HoursWeekView.vue index 2a629a9..671d4b1 100644 --- a/frontend/components/hours/HoursWeekView.vue +++ b/frontend/components/hours/HoursWeekView.vue @@ -29,8 +29,11 @@ {{ row.firstName }} {{ row.lastName }} ({{ row.contractName ?? '-' }})

-

- {{ row.siteName ?? 'Sans site' }} — {{ contractNatureLabel(row.contractNature) }} +

+ {{ row.siteName ?? 'Sans site' }} — {{ contractNatureLabel(row.contractNature) }} +

@@ -99,9 +102,12 @@ const getDailyCellStyle = (daily: { defineProps<{ isWeekLoading: boolean + isAdmin: boolean weekGridCols: string weeklySummary: WeeklyWorkHourSummary | null weekDayHeaders: Array<{ date: string; label: string }> formatMinutes: (minutes: number) => string }>() + +defineEmits<{ (e: 'open-comment', row: WeeklyWorkHourSummary['rows'][number]): void }>() diff --git a/frontend/components/hours/WeekCommentDrawer.vue b/frontend/components/hours/WeekCommentDrawer.vue new file mode 100644 index 0000000..3fb4563 --- /dev/null +++ b/frontend/components/hours/WeekCommentDrawer.vue @@ -0,0 +1,67 @@ +