From ccd8e66dcdf8022c978d22b0a668f272e7a839b6 Mon Sep 17 00:00:00 2001 From: tristan Date: Fri, 17 Apr 2026 09:53:09 +0200 Subject: [PATCH] =?UTF-8?q?feat=20:=20ajout=20des=20commentaires=20=C3=A0?= =?UTF-8?q?=20la=20semaine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 6 + .../driver-hours/DriverHoursWeekView.vue | 10 +- frontend/components/hours/HoursWeekView.vue | 10 +- .../components/hours/WeekCommentDrawer.vue | 67 +++++++++ frontend/composables/useDriverHoursPage.ts | 15 +- frontend/composables/useHoursPage.ts | 15 +- frontend/data/documentation-content.ts | 10 ++ frontend/pages/driver-hours.vue | 19 ++- frontend/pages/hours.vue | 19 ++- frontend/services/dto/work-hour.ts | 2 + frontend/services/employee-week-comments.ts | 24 ++++ migrations/Version20260417100000.php | 29 ++++ src/Dto/WorkHours/WeeklySummaryRow.php | 2 + src/Entity/EmployeeWeekComment.php | 136 ++++++++++++++++++ .../EmployeeWeekCommentRepository.php | 58 ++++++++ .../EmployeeWeekCommentWriteProcessor.php | 80 +++++++++++ src/State/WorkHourWeeklySummaryProvider.php | 20 ++- .../EmployeeWeekCommentWriteProcessorTest.php | 76 ++++++++++ .../WorkHourWeeklySummaryProviderTest.php | 11 ++ 19 files changed, 595 insertions(+), 14 deletions(-) create mode 100644 frontend/components/hours/WeekCommentDrawer.vue create mode 100644 frontend/services/employee-week-comments.ts create mode 100644 migrations/Version20260417100000.php create mode 100644 src/Entity/EmployeeWeekComment.php create mode 100644 src/Repository/EmployeeWeekCommentRepository.php create mode 100644 src/State/EmployeeWeekCommentWriteProcessor.php create mode 100644 tests/State/EmployeeWeekCommentWriteProcessorTest.php 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 @@ +