Files
SIRH/docs/superpowers/specs/2026-05-26-en-cours-acquisition-net-brut-design.md
T
tristan cf2e12c8ba
Auto Tag Develop / tag (push) Successful in 9s
[#SIRH-32] Ajouter l'exercice 2026/2027 dans les congés/RTT (#20)
| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|                  |                 |

## Description de la PR

## Modification du .env

## Check list

- [x] Pas de régression
- [x] TU/TI/TF rédigée
- [x] TU/TI/TF OK
- [ ] CHANGELOG modifié

Reviewed-on: #20
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
2026-05-26 14:09:02 +00:00

95 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).