diff --git a/CLAUDE.md b/CLAUDE.md index d274cfc..53154c3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -76,6 +76,13 @@ - Sur un exercice passé (`selectedYear !== currentYear`), les boutons crayon **Jours fractionnés** et **Année N-1 payés** sont **désactivés** : pas d'édition rétroactive des stocks de report. - Doc : `doc/leave-tab.md`. +## Onglet RTT (fiche employé) +- Tableau hebdomadaire (`frontend/components/employees/RttTab.vue`) — exercice fixe Juin(N-1)→Mai(N). Onglet **masqué pour les FORFAIT** (`showRttTab`). +- **Sélecteur d'année** sous le tableau dans la zone scrollable. Même mécanique que l'onglet Congés (double plancher) : `max(floor_contrat, floor_rttStartDate)`. Format unique : `Juin 2025 → Mai 2026`. +- Changement d'année → recharge via `useEmployeeRtt.setSelectedRttYear(year)` (`getEmployeeRttSummary?year=YYYY`). `EmployeeRttSummary.rttStartDate` est déjà exposé (champ existant) — il sert à la fois au floor du sélecteur et au masquage des lignes Report avant la mise en service. +- Sur un exercice passé, le bouton **+ Payer les RTT** est désactivé (pas de paiement rétroactif). +- Doc : `doc/rtt-tab.md`. + ## Récap. congés (écran) - Accès via sidebar `Récap. congés`, conditionné au flag `User.hasLeaveRecapAccess` (défaut `false`) — activé au create/edit user. Le flag s'applique à tous les profils, y compris admin. - Scope : `ROLE_ADMIN` → tous les employés, `ROLE_USER` (chef de site) → employés de ses sites, `ROLE_SELF` → sa ligne diff --git a/doc/rtt-tab.md b/doc/rtt-tab.md new file mode 100644 index 0000000..f3d694c --- /dev/null +++ b/doc/rtt-tab.md @@ -0,0 +1,52 @@ +# Onglet "RTT" — fiche employé + +## Vue d'ensemble + +L'onglet **RTT** de la fiche employé (`frontend/components/employees/RttTab.vue`) affiche un tableau hebdomadaire détaillé des heures supplémentaires accumulées et payées sur un exercice : +- bandeau de navigation par mois (chevrons gauche/droite) ; +- table semaine par semaine : Heure / Base 25% / 25% / Total 25% / Base 50% / 50% / Total 50% / Total / Cumul ; +- ligne Report (carry N-1 ou cumul mois précédents) ; +- ligne Total mois, ligne Payé, ligne Reste ; +- bouton « + Payer les RTT » dans le bandeau ; +- sélecteur d'exercice en pied de tableau. + +L'onglet est **masqué pour les contrats FORFAIT** (filtre `showRttTab` dans `useEmployeeDetailPage`). Les FORFAIT n'accumulent pas de RTT. + +## Période affichée + +Toujours **Juin (Y-1) → Mai (Y)**. Le champ `EmployeeRttSummary.year` correspond à `Y` (année de fin d'exercice) ; ex. `year=2026` = `01/06/2025 → 31/05/2026`. + +## Sélecteur d'année + +Position : sous la table, à l'intérieur de la zone scrollable, à gauche. + +Plage proposée : +- du plus récent (= exercice courant) au plus ancien ; +- **double plancher** : `max(floor_historique_contrat, floor_data_start_date)` + - **floor_historique_contrat** : dérivé de `employee.contractHistory[].startDate` — premier exercice où l'employé avait un contrat ouvert + - **floor_data_start_date** : exercice contenant `RTT_START_DATE` (env, ex. `2026-02-23` → exercice 2026) +- la valeur est exposée par l'API `GET /employees/{id}/rtt-summary` via le champ `rttStartDate` (déjà existant — mais peuplé uniquement quand la date tombe dans l'exercice retourné, donc le composable utilise la première réponse pour borner la plage). +- format unique : `Juin 2025 → Mai 2026`, `Juin 2024 → Mai 2025`… + +Comportement : +- changer d'exercice recharge `getEmployeeRttSummary?year=YYYY` (le backend valide 2000–2100) ; +- la table redéploie les semaines de l'exercice sélectionné, navigation par mois conservée. + +## Verrouillage des édition sur exercices passés + +Quand `selectedYear !== currentYear` (consultation d'un exercice antérieur), le bouton **+ Payer les RTT** est désactivé. Justification : un paiement rétroactif sur un exercice clos décalerait les soldes courants et le report N-1 calculé. + +La consultation reste possible, l'édition non. + +## Implémentation + +- Composable : `frontend/composables/useEmployeeRtt.ts` + - État : `selectedRttYear`, computed `currentRttYear`, `availableRttYears` + - API : `setSelectedRttYear(year)`, `loadRttData()`, `resetLoaded()` + - `resetLoaded()` (appelé au changement d'employé) remet `selectedRttYear = null`. +- Composant : `frontend/components/employees/RttTab.vue` + - Props : `selectedYear`, `availableYears`, `currentYear` + - Event : `update-selected-year` + - Renommage `currentYear` (computed local de l'année du mois affiché) → `displayedMonthYear` pour éviter la collision avec la nouvelle prop. +- Page : `frontend/pages/employees/[id].vue` +- Backend : aucun changement — `EmployeeRttSummaryProvider` accepte déjà `?year=YYYY` (validation 2000–2100) et expose `rttStartDate`. diff --git a/frontend/components/employees/RttTab.vue b/frontend/components/employees/RttTab.vue index f0f5c13..04fe9ee 100644 --- a/frontend/components/employees/RttTab.vue +++ b/frontend/components/employees/RttTab.vue @@ -11,7 +11,7 @@ - {{ currentMonthLabel }} {{ currentYear }} + {{ currentMonthLabel }} {{ displayedMonthYear }}