feat : retirer l'exercice suivant du sélecteur RTT (Congés uniquement)

Consulter un exercice RTT à venir n'a pas de sens (heures non saisies,
rien à payer). La borne haute du sélecteur RTT redevient l'exercice
courant sur une phase ouverte ; l'onglet Congés conserve l'exercice
suivant. Docs et verrouillage RTT réalignés (passé uniquement).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-26 11:20:54 +02:00
parent 2418836cd1
commit 7c4dde9fd9
4 changed files with 10 additions and 10 deletions
+2 -2
View File
@@ -80,9 +80,9 @@
## Onglet RTT (fiche employé) ## Onglet RTT (fiche employé)
- Tableau hebdomadaire (`frontend/components/employees/RttTab.vue`) — exercice fixe Juin(N-1)→Mai(N). Onglet **masqué pour les FORFAIT** (`showRttTab`). - 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 : borne haute = exercice suivant (courant + 1) sur phase ouverte, double plancher `max(floor_contrat, floor_rttStartDate)`. Format unique : `Juin 2025 → Mai 2026`. - **Sélecteur d'année** sous le tableau dans la zone scrollable. Double plancher `max(floor_contrat, floor_rttStartDate)`. Borne haute = exercice courant : **contrairement à l'onglet Congés, le RTT ne propose PAS l'exercice suivant** (consulter un exercice RTT à venir — heures non saisies, rien à payer — n'a pas de sens ; cf. `availableRttYears`). 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. - 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 autre que l'exercice courant (passé ou futur), le bouton **+ Payer les RTT** est désactivé (pas de paiement rétroactif ; rien à payer sur un exercice futur). - Sur un exercice passé, le bouton **+ Payer les RTT** est désactivé (pas de paiement rétroactif).
- Doc : `doc/rtt-tab.md`. - Doc : `doc/rtt-tab.md`.
## Vue contrat (sélecteur de phase) ## Vue contrat (sélecteur de phase)
+3 -3
View File
@@ -21,7 +21,7 @@ Toujours **Juin (Y-1) → Mai (Y)**. Le champ `EmployeeRttSummary.year` correspo
Position : sous la table, à l'intérieur de la zone scrollable, à gauche. Position : sous la table, à l'intérieur de la zone scrollable, à gauche.
Plage proposée : Plage proposée :
- du plus récent au plus ancien. La borne haute est l'exercice **suivant** (exercice courant + 1) sur une phase ouverte (cohérent avec l'onglet Congés) ; pour une phase clôturée, elle reste l'exercice de fin de phase ; - du plus récent (= exercice courant) au plus ancien. Contrairement à l'onglet Congés, le RTT **ne propose pas** l'exercice suivant (consulter un exercice RTT à venir n'a pas de sens) ; pour une phase clôturée, la borne haute reste l'exercice de fin de phase ;
- **double plancher** : `max(floor_historique_contrat, floor_data_start_date)` - **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_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) - **floor_data_start_date** : exercice contenant `RTT_START_DATE` (env, ex. `2026-02-23` → exercice 2026)
@@ -32,9 +32,9 @@ Comportement :
- changer d'exercice recharge `getEmployeeRttSummary?year=YYYY` (le backend valide 20002100) ; - changer d'exercice recharge `getEmployeeRttSummary?year=YYYY` (le backend valide 20002100) ;
- la table redéploie les semaines de l'exercice sélectionné, navigation par mois conservée. - la table redéploie les semaines de l'exercice sélectionné, navigation par mois conservée.
## Verrouillage des éditions hors exercice courant ## Verrouillage des éditions sur exercices passés
Quand `selectedYear !== currentYear` (consultation d'un exercice **différent de l'exercice courant**, passé ou futur), 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é ; sur un exercice futur, il n'y a rien à payer. 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. La consultation reste possible, l'édition non.
+4 -3
View File
@@ -35,11 +35,12 @@ export const useEmployeeRtt = (
// Plage = exercices intersectant la phase. // Plage = exercices intersectant la phase.
const phaseStartYear = computeRttYearForDate(new Date(`${phase.startDate}T00:00:00`)) const phaseStartYear = computeRttYearForDate(new Date(`${phase.startDate}T00:00:00`))
// Borne haute : fin de phase si clôturée ; sinon l'exercice SUIVANT (courant + 1), // Borne haute : fin de phase si clôturée ; sinon l'exercice courant.
// pour rester cohérent avec le sélecteur de l'onglet Congés. // Contrairement à l'onglet Congés, on NE propose PAS l'exercice suivant en RTT :
// consulter un exercice RTT à venir (heures non saisies, rien à payer) n'a pas de sens.
const maxYear = phase.endDate const maxYear = phase.endDate
? computeRttYearForDate(new Date(`${phase.endDate}T00:00:00`)) ? computeRttYearForDate(new Date(`${phase.endDate}T00:00:00`))
: currentRttYear.value + 1 : currentRttYear.value
// Hard floor : rttStartDate (env RTT_START_DATE) — pas d'historique avant. // Hard floor : rttStartDate (env RTT_START_DATE) — pas d'historique avant.
let dataFloor: number | null = null let dataFloor: number | null = null
+1 -2
View File
@@ -537,8 +537,7 @@ export const documentationSections: DocSection[] = [
title: 'Consulter un exercice passé', title: 'Consulter un exercice passé',
requiredLevel: 'admin', requiredLevel: 'admin',
blocks: [ blocks: [
{ type: 'paragraph', content: 'Un sélecteur d\'exercice est disponible en bas du tableau RTT (zone scrollable, à gauche). Il permet de consulter l\'exercice suivant ainsi que les exercices passés (Juin → Mai). La plage proposée part de l\'exercice suivant et remonte jusqu\'au plus récent entre (a) le premier exercice où l\'employé avait un contrat ouvert et (b) l\'exercice de mise en service du logiciel.' }, { type: 'paragraph', content: 'Un sélecteur d\'exercice est disponible en bas du tableau RTT (zone scrollable, à gauche). Il permet de consulter les exercices passés (Juin → Mai). La plage proposée part de l\'exercice courant et remonte jusqu\'au plus récent entre (a) le premier exercice où l\'employé avait un contrat ouvert et (b) l\'exercice de mise en service du logiciel. Contrairement à l\'onglet Congés, l\'onglet RTT ne propose pas l\'exercice suivant.' },
{ type: 'note', content: 'Sur l\'exercice suivant, le report N-1 affiché est provisoire tant que l\'exercice courant n\'est pas clôturé.' },
{ type: 'note', content: 'Sur un exercice passé, le bouton « + Payer les RTT » est désactivé. Aucun paiement rétroactif n\'est autorisé pour préserver la cohérence du report N-1.' }, { type: 'note', content: 'Sur un exercice passé, le bouton « + Payer les RTT » est désactivé. Aucun paiement rétroactif n\'est autorisé pour préserver la cohérence du report N-1.' },
], ],
}, },