From 1fe7f2cddeef82c0c0846fe339bc13248193ec86 Mon Sep 17 00:00:00 2001 From: tristan Date: Fri, 17 Apr 2026 11:47:14 +0200 Subject: [PATCH] =?UTF-8?q?feat=20:=20agence=20d'int=C3=A9rim=20sur=20les?= =?UTF-8?q?=20contrats=20INTERIM=20+=20renommage=20Types=20d'absence=20en?= =?UTF-8?q?=20Types=20de=20statut=20+=20colonne=20Absence=20en=20Statut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nouvelle entité InterimAgency (table interim_agencies, API lecture seule) - Sélecteur agence conditionnel dans les formulaires création employé et ajout contrat - Affichage "Intérim (NomAgence)" sur la liste employés et l'historique contrat - Date de fin obligatoire côté frontend pour CDD et INTERIM (aligné backend) - Renommage "Types d'absence" → "Types de statut" (sidebar, page, titre) - Renommage en-tête "Absence" → "Statut" sur les vues jour heures et conducteurs Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 1 + doc/functional-rules.md | 1 + .../driver-hours/DriverHoursDayView.vue | 2 +- frontend/components/employees/ContractTab.vue | 21 +++++++- frontend/components/hours/HoursDayView.vue | 2 +- frontend/composables/useEmployeeContract.ts | 23 +++++++-- frontend/composables/useEmployeeDetailPage.ts | 2 +- frontend/data/documentation-content.ts | 6 +-- frontend/layouts/default.vue | 2 +- frontend/pages/absence-types.vue | 4 +- frontend/pages/employees/[id].vue | 2 + frontend/pages/employees/index.vue | 41 +++++++++++++-- frontend/services/dto/employee.ts | 4 ++ frontend/services/employees.ts | 8 ++- frontend/services/interim-agencies.ts | 16 ++++++ frontend/utils/contract.ts | 2 +- migrations/Version20260417120000.php | 32 ++++++++++++ src/Dto/Employees/ContractHistoryItem.php | 4 ++ src/Entity/Employee.php | 29 +++++++++++ src/Entity/EmployeeContractPeriod.php | 16 ++++++ src/Entity/InterimAgency.php | 51 +++++++++++++++++++ .../EmployeeContractChangeRequest.php | 1 + .../EmployeeContractChangeRequestFactory.php | 1 + .../EmployeeContractPeriodBuilder.php | 3 ++ .../EmployeeContractPeriodManager.php | 26 ++++++++-- ...EmployeeContractPeriodManagerInterface.php | 2 + src/State/EmployeeWriteProcessor.php | 2 + 27 files changed, 281 insertions(+), 23 deletions(-) create mode 100644 frontend/services/interim-agencies.ts create mode 100644 migrations/Version20260417120000.php create mode 100644 src/Entity/InterimAgency.php diff --git a/CLAUDE.md b/CLAUDE.md index abe8e70..a9aa367 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -30,6 +30,7 @@ - Contracts: `trackingMode` (TIME=hours, PRESENCE=half-days), `weeklyHours` - Contract types: FORFAIT, THIRTY_FIVE_HOURS, THIRTY_NINE_HOURS, INTERIM, CUSTOM - Contract nature (per period): CDI, CDD, INTERIM +- **Agence d'intérim** (`InterimAgency` entity, table `interim_agencies`): optionnelle sur `EmployeeContractPeriod` quand nature = INTERIM. Pas de CRUD UI — gérée en BDD. API lecture seule `GET /interim_agencies`. Affichée "Intérim (NomAgence)" sur la liste employés et l'historique contrat. - Employee contract history: `employee_contract_periods`, resolved by `EmployeeContractResolver` - **Planning jours travaillés** (`EmployeeContractPeriod.workDaysHours` : JSON `{iso_day: minutes}`) : obligatoire pour tout contrat TIME **hors 35h/39h/INTERIM** (ex. 4h, 25h, 28h). Somme = `weeklyHours × 60`. Utilisé par `HolidayVirtualHoursResolver` (crédit férié) et `WorkedHoursCreditPolicy` (crédit absence) pour ne créditer que les jours effectivement travaillés. Validation : `EmployeeContractPeriodValidator::assertWorkDaysHours`. - Absences: stored per day (auto-split), AM/PM/full day, clear corresponding hour slots diff --git a/doc/functional-rules.md b/doc/functional-rules.md index 7d8bbc8..e732e9f 100644 --- a/doc/functional-rules.md +++ b/doc/functional-rules.md @@ -130,6 +130,7 @@ Documents complementaires: - pas de bonus 25% - pas de bonus 50% - pas de total récup + - agence d'intérim optionnelle (table `interim_agencies`): affichée sur la fiche employé et le détail contrat sous la forme "Intérim (NomAgence)" ## 6bis) Heures Conducteurs diff --git a/frontend/components/driver-hours/DriverHoursDayView.vue b/frontend/components/driver-hours/DriverHoursDayView.vue index ffcf5c2..4aebc0a 100644 --- a/frontend/components/driver-hours/DriverHoursDayView.vue +++ b/frontend/components/driver-hours/DriverHoursDayView.vue @@ -6,7 +6,7 @@ :style="{ gridTemplateColumns: dayGridCols }" > Nom - Absence + Statut Heure de jour Heure de nuit Heure atelier diff --git a/frontend/components/employees/ContractTab.vue b/frontend/components/employees/ContractTab.vue index 230bf7c..dfe2fbd 100644 --- a/frontend/components/employees/ContractTab.vue +++ b/frontend/components/employees/ContractTab.vue @@ -16,7 +16,7 @@ :key="`${item.startDate}-${item.endDate ?? 'open'}-${item.contractId ?? item.contractName}`" class="grid grid-cols-4 border-b border-primary-500 px-6 py-3 text-md font-bold text-primary-500 last:border-b-0 hover:bg-tertiary-500" > -

{{ contractNatureLabel(item.contractNature) }}

+

{{ item.interimAgencyName ? `${contractNatureLabel(item.contractNature)} (${item.interimAgencyName})` : contractNatureLabel(item.contractNature) }}

{{ contractHistoryLabel(item) }}

{{ formatDate(item.startDate) }}

{{ formatDate(item.endDate) }}

@@ -221,6 +221,22 @@ +
+ + +
+