# 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).