Écran unique « Synthèse Kms » fusionnant résumés et montants réglés

- Nouvelle page Synthèse Kms (/synthese-kms) : sélecteur temporel en
  mode année seule + véhicule + Afficher, barème appliqué, tableau 12
  mois (km, remb. réel du mois, indication 80%, montant réglé
  saisissable, export PDF mensuel), ligne TOTAL (km annuel, montant
  réel, total réglé, export PDF annuel), bouton Enregistrer global
  (seuls les montants modifiés), auto-affichage à l'arrivée. Aucun
  nouvel endpoint (composition d'endpoints existants).
- Suppression des écrans « Résumé mensuel », « Résumé annuel » et
  « Montants réglés » (routes et liens de menu retirés).
- SelecteurTemporelComponent : mode « année seule » (Input/Output
  dédiés) et repli automatique au clic sur le niveau le plus bas.
- Pleine largeur des écrans Trajets, Carnet d'adresses et Synthèse Kms
  (Specs conserve sa largeur de lecture).
- Liste des trajets : boutons d'action déplacés en début de ligne
  (après la poignée, avant A/R), alignés à droite.
- Specs (requirements/design-requirements/design) synchronisées :
  glossaire Synthèse_Kms, Exigences 3/4/13/14 adaptées, critères 12.25-27.
This commit is contained in:
2026-10-10 15:46:34 +02:00
parent e9f34e59e8
commit 3d9557f852
22 changed files with 706 additions and 1177 deletions
@@ -26,6 +26,7 @@ Le document est organisé **en miroir** des exigences de `requirements.md` : cha
- **Cache_Adresses** : La table de base de données stockant les couples (adresse textuelle normalisée BAN, coordonnées géographiques) des adresses déjà saisies, soumise à une politique de rétention LRU.
- **Mermaid** : Syntaxe de définition de diagrammes (ex. `graph TB`) rendue graphiquement lors de l'affichage des Documents_Specification.
- **ParametresApplication** : L'entité backend singleton (une seule ligne, `Id = 1`, sur le modèle de `Profil`/`Compte`) portant la colonne `PrecisionDistanceKm`, contrainte par un CHECK SQL `IN (0, 1, 2)`. Détaillée intégralement dans la spec `precision-distances-km`, `design.md`.
- **Synthèse_Kms** : Côté technique, l'écran unique (`SyntheseKmsComponent`, route `/synthese-kms`) qui ne requiert **aucun nouvel endpoint backend** : il compose des endpoints existants — régularisation annuelle (`GET /api/regularisation/{annee}`), montant prévisionnel mensuel (`GET /api/montant-previsionnel/{annee}/{mois}`), upsert du montant réglé (`PUT /api/montants-regles`) et exports PDF mensuel (`GET /api/exports/mensuel/{annee}/{mois}`) et annuel (`GET /api/exports/annuel/{annee}`). Il remplace les écrans supprimés `ResumeMensuelComponent`, `ResumeAnnuelComponent` et `MontantsReglesComponent`.
---
@@ -63,7 +64,7 @@ Le document est organisé **en miroir** des exigences de `requirements.md` : cha
---
### Requirement 3: Consultation du résumé mensuel — aspects techniques
### Requirement 3: Consultation du total kilométrique mensuel — aspects techniques
> Exigence fonctionnelle : voir `requirements.md`, Requirement 3.
@@ -171,6 +172,10 @@ Le document est organisé **en miroir** des exigences de `requirements.md` : cha
1. WHEN l'utilisateur change de mois via le Sélecteur_Temporel, survole un Trajet d'une autre journée, ou change de Véhicule, THE Frontend SHALL mettre à jour la liste, le Panneau_Totaux et la Carte concernés dans un délai de 1000 ms sans rechargement complet de la page.
2. WHEN l'utilisateur change de Véhicule sélectionné, THE Frontend SHALL mettre à jour la liste mensuelle des Trajets, le Panneau_Totaux et la Carte dans un délai de 1000 ms sans rechargement complet de la page.
3. THE SelecteurTemporelComponent SHALL exposer un paramètre d'entrée commutant entre le mode « année + mois » (émission d'un événement `moisSelectionne { annee, mois }`) et le mode « année seule » (émission d'un événement portant l'année choisie, sans rendu de la grille des mois), le mode « année seule » étant utilisé par le SyntheseKmsComponent et le mode « année + mois » par le ConsultationJourComponent.
4. WHEN l'utilisateur sélectionne le niveau le plus bas du SelecteurTemporelComponent (le mois en mode « année + mois », l'année en mode « année seule »), THE SelecteurTemporelComponent SHALL basculer son état interne en position repliée.
5. THE Frontend SHALL rendre les écrans ConsultationJourComponent (« Trajets »), CarnetAdressesComponent (« Carnet d'adresses ») et SyntheseKmsComponent (« Synthèse Kms ») sur toute la largeur disponible (sans largeur maximale centrée), tandis que le SpecsComponent (« Specs ») SHALL conserver une largeur de lecture limitée.
6. WHEN le TrajetListComponent rend une ligne de Trajet, THE Frontend SHALL positionner les boutons d'action du Trajet (modifier, supprimer, insérer avant/après) en début de ligne, après la poignée de glisser-déposer et avant la colonne « A/R », alignés à droite au sein de leur colonne afin de conserver l'alignement vertical du bouton « insérer après ».
---
@@ -181,6 +186,7 @@ Le document est organisé **en miroir** des exigences de `requirements.md` : cha
#### Acceptance Criteria
1. WHEN le Backend calcule le Montant_Previsionnel_Mensuel ou le Montant_Previsionnel_Annuel, THE Backend SHALL utiliser des distances déjà arrondies selon Precision_Distance (et non les distances brutes), conformément à la spec `precision-distances-km`, Requirements 6 et 7.
2. WHEN le SyntheseKmsComponent affiche le barème appliqué et la colonne « indication 80% » du tableau mensuel, THE Frontend SHALL alimenter ces éléments à partir des endpoints existants (`GET /api/regularisation/{annee}` pour la tranche/coefficient/base et le Frais_Reel_Mensuel, `GET /api/montant-previsionnel/{annee}/{mois}` pour le Montant_Previsionnel_Mensuel), sans introduire de nouvel endpoint.
---
@@ -191,6 +197,9 @@ Le document est organisé **en miroir** des exigences de `requirements.md` : cha
#### Acceptance Criteria
1. IF l'utilisateur saisit un Montant_Regle négatif, THEN THE Backend SHALL rejeter la saisie avec une erreur HTTP 400.
2. THE SyntheseKmsComponent SHALL composer la synthèse à partir d'endpoints existants, sans aucun nouvel endpoint backend : régularisation annuelle (`GET /api/regularisation/{annee}?vehiculeId={id}`) pour le barème appliqué, les kilomètres mensuels, les Frais_Reel_Mensuel, le total annuel, le Montant_Reel et le total réglé ; montant prévisionnel mensuel (`GET /api/montant-previsionnel/{annee}/{mois}?vehiculeId={id}`) pour la colonne « indication 80% » ; upsert du montant réglé (`PUT /api/montants-regles`) à l'enregistrement ; exports PDF mensuel (`GET /api/exports/mensuel/{annee}/{mois}?vehiculeId={id}`) et annuel (`GET /api/exports/annuel/{annee}?vehiculeId={id}`).
3. WHEN l'utilisateur active le bouton « Enregistrer » global de la Synthèse_Kms, THE Frontend SHALL émettre un appel `PUT /api/montants-regles` uniquement pour les mois dont le Montant_Regle a été modifié depuis le dernier chargement, et n'émettre aucun appel pour les mois inchangés.
4. WHEN le SyntheseKmsComponent est initialisé, THE Frontend SHALL déclencher le chargement de la synthèse pour la pré-sélection (Véhicule_Courant et année courante) sans attendre d'action sur le bouton « Afficher ».
---