From 71dd028d8db080a6a25d11236de86aae25a8fafc Mon Sep 17 00:00:00 2001 From: tristan Date: Tue, 26 May 2026 15:48:18 +0200 Subject: [PATCH] =?UTF-8?q?docs=20:=20spec=20en-cours=20d'acquisition=20ne?= =?UTF-8?q?t/brut=20sur=20l'onglet=20Cong=C3=A9s=20(SIRH-32)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- ...26-en-cours-acquisition-net-brut-design.md | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-26-en-cours-acquisition-net-brut-design.md diff --git a/docs/superpowers/specs/2026-05-26-en-cours-acquisition-net-brut-design.md b/docs/superpowers/specs/2026-05-26-en-cours-acquisition-net-brut-design.md new file mode 100644 index 0000000..b5a8413 --- /dev/null +++ b/docs/superpowers/specs/2026-05-26-en-cours-acquisition-net-brut-design.md @@ -0,0 +1,94 @@ +# Afficher l'en-cours d'acquisition « net / brut » sur l'onglet Congés + +**Date** : 2026-05-26 +**Ticket** : SIRH-32 (retour RH) +**Statut** : design validé + +## Contexte + +Sur l'onglet **Congés** de la fiche employé, la case **« En cours d'acquisition »** +affiche un seul nombre. Ce nombre est l'en-cours **net** : quand un salarié pose +des congés **en anticipé** (au-delà de son report acquis), ces jours sont imputés +sur la génération de l'exercice et **réduisent** l'en-cours affiché. + +La RH a besoin de voir aussi le **total brut généré** sur l'exercice à ce jour, +afin de connaître ce qui a réellement été acquis indépendamment de ce qui a déjà +été consommé en anticipé. + +Nouveau format demandé : `{net} / {brut}` — ex. `14,50 / 17,50`. + +## Définitions (non-forfait, `CDI_CDD_NON_FORFAIT`) + +Dans `EmployeeLeaveSummaryProvider::computeYearSummary` : + +- `generatedDays` / `generatedSaturdays` = acquisition **brute** de l'exercice à + ce jour (prorata mensuel, capée à aujourd'hui pour l'exercice courant). +- `remainingToImpute` (+ samedis) = congés pris au-delà du report acquis, imputés + sur la génération. +- `accruingDays` (champ existant, **numérateur**) = + `(generatedDays − remainingToImpute) + (generatedSaturdays − remainingSaturdaysToImpute)` + → en-cours **net**. +- **Nouveau** : `accruingDaysTotal` (**dénominateur**) = `generatedDays + generatedSaturdays` + → brut généré à ce jour, avant imputation des congés anticipés. + +Invariant : `accruingDays ≤ accruingDaysTotal`. La différence = jours pris en +anticipé imputés sur la génération. + +Côté **forfait** (`FORFAIT_218`) : pas d'acquisition « en cours » +(`accruingDays = 0`) → `accruingDaysTotal = 0`. + +## Changements + +### 1. Backend + +- `EmployeeLeaveSummaryProvider::computeYearSummary` : ajouter + `accruingDaysTotal` au tableau retourné. + - Branche non-forfait : `generatedDays + generatedSaturdays`. + - Branche forfait : `0.0`. +- `App\ApiResource\EmployeeLeaveSummary` : nouvelle propriété publique + `float $accruingDaysTotal = 0.0`. +- Le provider recopie `yearSummary['accruingDaysTotal']` dans + `$summary->accruingDaysTotal` (à côté de `accruingDays`). Sur retour anticipé + (`yearSummary === null`), la valeur reste `0.0` (comme `accruingDays`). + +### 2. Frontend + +- `frontend/services/dto/employee-leave-summary.ts` : ajouter + `accruingDaysTotal: number`. +- `frontend/components/employees/LeaveTab.vue`, case « En cours d'acquisition » : + - **Non-forfait** : afficher `{{ formatCount(accruingDays) }} / {{ formatCount(accruingDaysTotal) }}`. + - **Forfait** : inchangé (afficher `accruingDays` seul, soit `0`). + - Réutiliser `isForfaitRule` (déjà présent) pour la condition. + +### 3. Documentation + +- `doc/leave-tab.md` : décrire le format `net / brut` de l'en-cours d'acquisition. +- `frontend/data/documentation-content.ts` : note expliquant que l'en-cours + affiche `net / total brut acquis` et que les congés anticipés réduisent le net. + +## Comportements conservés + +- Quand aucun congé anticipé n'est pris : numérateur = dénominateur + (ex. `17,50 / 17,50`). C'est voulu — la RH veut le total visible en permanence. +- Les autres compteurs du header (Année acquis, Pris, Reste à prendre, Samedis, + N-1…) sont inchangés. +- Aucun changement de calcul : `accruingDaysTotal` est une **exposition** d'une + valeur déjà calculée (`generatedDays + generatedSaturdays`), pas une nouvelle + règle métier. + +## Hors périmètre + +- Onglet RTT (pas d'en-cours d'acquisition). +- Écran Récap congés (pas de colonne en-cours d'acquisition). +- Header de la fiche employé (présence / jours à travailler) — inchangé. +- Affichage de la fraction pour le forfait (pas d'en-cours → non pertinent). + +## Tests + +- Backend : ajouter un test sur `computeYearSummary` (via le harnais de tests + existant du provider, par réflexion) vérifiant que `accruingDaysTotal` = + `generatedDays + generatedSaturdays` et `≥ accruingDays` dans un cas avec congés + anticipés. À défaut de chemin testable simple (collaborateurs `final`), couvrir + l'arithmétique exposée et vérifier manuellement l'affichage. +- Pas de harnais de test frontend ; vérification manuelle de l'affichage + `net / brut` (non-forfait) et `0` (forfait).