docs : spec en-cours d'acquisition net/brut sur l'onglet Congés (SIRH-32)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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).
|
||||||
Reference in New Issue
Block a user