From 399fd7335effab4160fe3b45dbd9c7747bb3539b Mon Sep 17 00:00:00 2001
From: tristan
Date: Tue, 14 Apr 2026 11:25:44 +0200
Subject: [PATCH] =?UTF-8?q?fix=20:=20exclusion=20de=20certain=20jour=20f?=
=?UTF-8?q?=C3=A9ri=C3=A9=20et=20affichage=20diff=C3=A9rent=20des=20jours?=
=?UTF-8?q?=20f=C3=A9ri=C3=A9=20dans=20la=20page=20d'heure?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.env | 3 ++
CLAUDE.md | 7 ++++
config/services.yaml | 1 +
deploy/docker/.env.example | 1 +
doc/functional-rules.md | 8 +++-
.../driver-hours/DriverHoursDayView.vue | 33 +++++++++++-----
frontend/components/hours/HoursDayView.vue | 16 ++++++--
frontend/composables/useDriverHoursPage.ts | 2 +-
frontend/composables/useHoursPage.ts | 2 +-
frontend/data/documentation-content.ts | 1 +
frontend/pages/driver-hours.vue | 2 +
frontend/pages/hours.vue | 2 +
src/Service/PublicHolidayService.php | 38 +++++++++++++++++--
13 files changed, 96 insertions(+), 20 deletions(-)
diff --git a/.env b/.env
index e6ac054..54c5f51 100644
--- a/.env
+++ b/.env
@@ -38,6 +38,9 @@ DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&ch
###> app ###
RTT_START_DATE=2026-02-23
+# Comma-separated list of public holiday labels to exclude from the government API response
+# (typically the "journée de solidarité" worked in many companies)
+EXCLUDED_PUBLIC_HOLIDAYS="Lundi de Pentecôte"
###< app ###
###> nelmio/cors-bundle ###
diff --git a/CLAUDE.md b/CLAUDE.md
index 90a8cef..53ac590 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -35,6 +35,13 @@
- 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`
+## Fériés
+- Source : API gouv via `PublicHolidayService` (cache 30j)
+- Exclusions : env `EXCLUDED_PUBLIC_HOLIDAYS` (CSV de libellés), défaut `"Lundi de Pentecôte"`. Le filtre s'applique après le cache, côté service, donc frontend et calculs backend voient la même liste.
+- Écrans Heures / Heures Conducteurs (vue jour) : le nom du férié est affiché en badge `#b3e5fc` avec icône `mdi:calendar-star` dans la colonne Absence (distinct du pill absence). Bouton "Modifier" absence masqué sur férié (comme pour les formations).
+- Création/édition d'absence bloquée sur un férié
+- Saisie d'heures (ou de jours de présence) autorisée sur un férié — nécessaire pour éviter un déficit hebdomadaire (la référence hebdo n'est pas réduite par les fériés)
+
## 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/config/services.yaml b/config/services.yaml
index 511f83d..92dac45 100644
--- a/config/services.yaml
+++ b/config/services.yaml
@@ -25,6 +25,7 @@ services:
App\Service\PublicHolidayService:
arguments:
$holidayUrl: '%env(HOLIDAY_URL)%'
+ $excludedLabels: '%env(default::EXCLUDED_PUBLIC_HOLIDAYS)%'
App\Service\Rtt\RttRecoveryComputationService:
arguments:
diff --git a/deploy/docker/.env.example b/deploy/docker/.env.example
index bc2bdec..d66befc 100644
--- a/deploy/docker/.env.example
+++ b/deploy/docker/.env.example
@@ -23,3 +23,4 @@ DEFAULT_URI=https://sirh.malio-dev.fr
APP_SHARE_DIR=var/share
RTT_START_DATE=2026-02-23
HOLIDAY_URL="https://calendrier.api.gouv.fr/jours-feries/"
+EXCLUDED_PUBLIC_HOLIDAYS="Lundi de Pentecôte"
diff --git a/doc/functional-rules.md b/doc/functional-rules.md
index 0f3d26b..e9bdf66 100644
--- a/doc/functional-rules.md
+++ b/doc/functional-rules.md
@@ -161,10 +161,14 @@ Documents complementaires:
## 7) Fériés
- Les jours fériés sont identifiés et affichés
+- Source: API `calendrier.api.gouv.fr/jours-feries/` via `PublicHolidayService` (cache 30j)
+- Exclusions configurables: variable d'env `EXCLUDED_PUBLIC_HOLIDAYS` (liste de libellés séparés par virgules). Par défaut `"Lundi de Pentecôte"` — journée de solidarité généralement travaillée. Le filtre s'applique à tous les consommateurs (frontend + calculs backend) en amont du retour du service.
- Onglet congés: jours fériés affichés sur le calendrier avec fond `rgb(179, 229, 252)` et nom au survol
+- Écran Heures et Heures Conducteurs (vue jour): le nom du férié est affiché dans la colonne Absence sous forme de pill (fond `#b3e5fc`, icône `mdi:calendar-star`), distinct du pill absence
- Règle courante:
- - absences bloquées sur jour férié
- - saisie d'heures autorisée
+ - absences bloquées sur jour férié (création/édition) — bouton "Modifier" masqué comme pour les formations
+ - saisie d'heures ou de jours de présence autorisée — les heures saisies comptent normalement dans le total hebdo et le calcul RTT
+ - la référence hebdomadaire n'est pas réduite par un férié: un salarié qui ne saisit rien sur un férié est en déficit de la journée correspondante
## 8) Impression absences (PDF)
diff --git a/frontend/components/driver-hours/DriverHoursDayView.vue b/frontend/components/driver-hours/DriverHoursDayView.vue
index 3c4783e..89989e3 100644
--- a/frontend/components/driver-hours/DriverHoursDayView.vue
+++ b/frontend/components/driver-hours/DriverHoursDayView.vue
@@ -56,19 +56,31 @@