Saisie/insertion : date de journée, repositionnement, point A/R, retour domicile

Améliorations de saisie issues du retour d'usage :

- Insertion : la date pré-remplie est celle de la JOURNÉE du trajet source (via
  prefill.date), et non la date de la carte, pour éviter les erreurs de saisie.
- Insertion « après » / « avant le suivant » : l'adresse de départ pré-remplie
  est le point de FIN du trajet source — son arrivée, ou son DÉPART si c'est un
  aller/retour (le véhicule est revenu à son point d'origine).
- Après création/modification sur une autre journée : repositionnement auto sur
  le mois du trajet, cadrage de la carte sur sa date, et dépliage du groupe de
  cette journée (TrajetListComponent.ouvrirJour, différé après recalcul du
  repliage) pour rendre le trajet ajouté visible.
- Bouton « Utiliser mon domicile » sur l'arrivée : pré-remplit le commentaire
  avec « Retour domicile » si le commentaire est vide (jamais de remplacement).

Specs : requirements.md (exigences 10.19, 11.1/11.2/11.12, 12.23) et design.md
(TrajetForm, TrajetList, ConsultationJour) mis à jour.
This commit is contained in:
2026-09-20 20:16:30 +02:00
parent e84c2356f1
commit 173b123f03
6 changed files with 112 additions and 18 deletions
+6 -3
View File
@@ -225,7 +225,8 @@ src/
- Validations synchrones : présence, longueur, format date via `DateJjMmAAAAValidator`, longueur commentaire
- Mode création / édition : pré-remplissage en édition, recalcul distance uniquement si adresse modifiée, modification commentaire sans recalcul
- **Mode insertion** : accepte en entrée `{ adresseDepart?: string, adresseArrivee?: string }` pour pré-remplir les champs depuis le Trajet_Précédent / Trajet_Suivant ; les champs restent modifiables
- Boutons "Utiliser mon domicile" à côté de chaque champ adresse
- Boutons "Utiliser mon domicile" à côté de chaque champ adresse ; pour l'arrivée, si le Commentaire est vide, il est pré-rempli avec « Retour domicile » (jamais de remplacement d'un commentaire déjà saisi)
- Date par défaut : en mode insertion, la date de la journée du trajet source (`prefill.date`) prime sur la date de la Carte (`dateParDefaut`)
- Timeout de 10 secondes via `TimeoutInterceptor`
- **Autocomplétion BAN** : appel à `https://api-adresse.data.gouv.fr/search/?q={saisie}&limit=5` dès 3 caractères saisis ; chaque suggestion affiche le libellé + code postal + commune ; à la sélection d'une suggestion, les coordonnées `(lat, lon)` sont stockées dans l'état local du composant et transmises avec le formulaire
- Si l'utilisateur tape une adresse sans passer par BAN (pas de sélection), les coordonnées sont absentes et un avertissement discret s'affiche
@@ -243,8 +244,9 @@ src/
**`TrajetListComponent`**
- Affiche TOUS les trajets du mois, regroupés par journée : chaque groupe/jour a un **en-tête repliable** (date, nombre de trajets) ; par défaut tout est replié sauf le dernier jour du mois ayant des trajets.
- Ligne par trajet (triée par `Position` croissante au sein du jour) : colonne dédiée **A/R** en début de ligne pour les allers/retours, commentaire (si présent), adresses (taille réduite), distance effective
- Actions par trajet : modifier (→ `TrajetFormComponent` pré-rempli en < 500 ms), supprimer (→ dialog de confirmation), **insérer après** (→ `TrajetFormComponent` en mode insertion avec `adresseDepart` = adresse d'arrivée du trajet courant, `positionApres` = Position du trajet courant)
- Si le trajet n'est pas le dernier de la journée : action **insérer avant le suivant** disponible, pré-remplissant les deux adresses et calculant la position d'insertion `(P_courant + P_suivant) / 2`
- Actions par trajet : modifier (→ `TrajetFormComponent` pré-rempli en < 500 ms), supprimer (→ dialog de confirmation), **insérer après** (→ `TrajetFormComponent` en mode insertion avec `adresseDepart` = point de fin du trajet courant — son arrivée, ou son **départ** si le trajet est un aller/retour —, la **date de la journée** du trajet, `positionApres` = Position du trajet courant)
- Si le trajet n'est pas le dernier de la journée : action **insérer avant le suivant** disponible, pré-remplissant l'adresse de départ avec le point de fin du trajet courant (départ si aller/retour) et l'adresse d'arrivée avec le départ du trajet suivant, en calculant la position d'insertion `(P_courant + P_suivant) / 2`
- Méthode publique `ouvrirJour(dateIso)` : déplie une journée donnée (appelée par le conteneur après ajout/insertion pour rendre le trajet visible)
- **Glisser-déposer** (drag & drop) limité à chaque journée : un `cdkDropList` par jour, listes **non connectées** entre elles (pas de déplacement inter-journées) → recalcul des positions du jour puis `PATCH /api/trajets/reordonner`
- Rafraîchissement du résumé mensuel en < 1 000 ms après modification/suppression/insertion
@@ -284,6 +286,7 @@ src/
- Navigation par jour **bornée aux jours ayant des trajets** dans le mois (exception : le jour courant dans le mois courant reste navigable même sans trajet) ; elle ne recharge que la carte et les totaux du jour
- Sélecteur de Véhicule (par défaut : véhicule courant) ; filtre la liste, le Panneau_Totaux et la Carte sur le véhicule sélectionné
- Coordonne le rafraîchissement (< 1 000 ms) ; un mois vide affiche des totaux à 0 et un unique message « Aucun trajet pour ce mois », sans alerte d'erreur
- Après création/modification d'un trajet (`onFormEnregistre(trajet)`), si la date du trajet est dans un autre mois, se repositionne sur ce mois, cale la Carte sur la journée du trajet, puis déplie ce jour dans la liste (`TrajetListComponent.ouvrirJour`, différé au tick suivant pour passer après le recalcul de repliage du setter)
**`PanneauTotauxComponent`**
- Affiche trois totaux : total du jour ciblé par la navigation, total du mois sélectionné, Total_Annuel_Partiel (cumul de l'année jusqu'au mois sélectionné inclus)
@@ -258,6 +258,7 @@ L'application est composée d'un frontend Angular/TypeScript et d'un backend C#.
16. WHEN l'utilisateur accepte la Réaffectation, THE Backend SHALL mettre à jour la Puissance_Fiscale (et l'association au Véhicule) de tous les Trajets concernés (date >= Date_Effet) avec celle du nouveau Véhicule.
17. WHEN l'utilisateur refuse la Réaffectation, THE Backend SHALL laisser inchangés les Trajets déjà saisis et associer uniquement les prochains Trajets au nouveau Véhicule.
18. THE Backend SHALL exposer la liste de l'historique des Véhicules avec leur plaque, leur Puissance_Fiscale et leur Date_Effet.
19. WHEN l'utilisateur clique sur le bouton "Utiliser mon domicile" pour le champ adresse d'ARRIVÉE, IF le champ Commentaire est vide, THEN THE Frontend SHALL pré-remplir le Commentaire avec « Retour domicile » ; un Commentaire déjà saisi n'est jamais remplacé.
---
@@ -267,8 +268,8 @@ L'application est composée d'un frontend Angular/TypeScript et d'un backend C#.
#### Acceptance Criteria
1. WHEN l'utilisateur demande l'insertion d'un Trajet entre deux Trajets existants d'une même journée (Trajet_Précédent et Trajet_Suivant), THE Frontend SHALL afficher le formulaire de saisie avec le champ adresse de départ pré-rempli avec l'adresse d'arrivée du Trajet_Précédent et le champ adresse d'arrivée pré-rempli avec l'adresse de départ du Trajet_Suivant.
2. WHEN l'utilisateur choisit d'insérer un Trajet après un Trajet_Précédent sans Trajet_Suivant connu, THE Frontend SHALL afficher le formulaire de saisie avec le champ adresse de départ pré-rempli avec l'adresse d'arrivée du Trajet_Précédent et le champ adresse d'arrivée vide.
1. WHEN l'utilisateur demande l'insertion d'un Trajet entre deux Trajets existants d'une même journée (Trajet_Précédent et Trajet_Suivant), THE Frontend SHALL afficher le formulaire de saisie avec le champ adresse de départ pré-rempli avec le point de fin du Trajet_Précédent — son adresse d'arrivée, ou son adresse de DÉPART si le Trajet_Précédent est un Aller_Retour (retour au point d'origine) — et le champ adresse d'arrivée pré-rempli avec l'adresse de départ du Trajet_Suivant.
2. WHEN l'utilisateur choisit d'insérer un Trajet après un Trajet_Précédent sans Trajet_Suivant connu, THE Frontend SHALL afficher le formulaire de saisie avec le champ adresse de départ pré-rempli avec le point de fin du Trajet_Précédent — son adresse d'arrivée, ou son adresse de DÉPART si le Trajet_Précédent est un Aller_Retour — et le champ adresse d'arrivée vide.
3. WHEN l'utilisateur choisit d'insérer un Trajet avant un Trajet_Suivant sans Trajet_Précédent connu, THE Frontend SHALL afficher le formulaire de saisie avec le champ adresse d'arrivée pré-rempli avec l'adresse de départ du Trajet_Suivant et le champ adresse de départ vide.
4. THE Frontend SHALL permettre à l'utilisateur de modifier les adresses de départ et d'arrivée pré-remplies avant de soumettre le formulaire d'insertion.
5. WHEN l'utilisateur soumet le formulaire d'insertion avec tous les champs obligatoires valides, THE Backend SHALL créer le nouveau Trajet avec les mêmes règles de validation et de calcul de distance que la création standard (Exigence 1 et 2).
@@ -278,6 +279,7 @@ L'application est composée d'un frontend Angular/TypeScript et d'un backend C#.
9. WHEN l'utilisateur réordonne manuellement les Trajets d'une journée (glisser-déposer), THE Backend SHALL mettre à jour les valeurs de Position des Trajets concernés de manière à refléter le nouvel ordre sans modifier les autres données du Trajet.
10. THE Frontend SHALL proposer, dans le formulaire d'insertion, pour le champ adresse de départ et pour le champ adresse d'arrivée (y compris lorsqu'ils sont pré-remplis à partir du Trajet_Précédent ou du Trajet_Suivant), un choix entre sélectionner une Adresse_Nommee pré-enregistrée du Carnet_Adresses (par sa Dénomination) et saisir une nouvelle adresse manuellement avec l'autocomplétion BAN.
11. WHEN l'utilisateur sélectionne une Adresse_Nommee (par sa Dénomination) dans le formulaire d'insertion pour le champ adresse de départ ou adresse d'arrivée, THE Frontend SHALL remplacer le contenu pré-rempli de ce champ par le texte d'adresse de l'Adresse_Nommee et associer ses coordonnées géographiques (latitude, longitude) pour transmission au Backend.
12. WHEN l'utilisateur ouvre le formulaire d'insertion à partir d'un Trajet existant, THE Frontend SHALL pré-remplir la date avec la journée de ce Trajet (et non la date affichée sur la Carte), afin d'éviter les erreurs de saisie de date.
---
@@ -309,6 +311,7 @@ L'application est composée d'un frontend Angular/TypeScript et d'un backend C#.
20. WHEN l'utilisateur sélectionne un Véhicule dans le sélecteur de Véhicule, THE Frontend SHALL filtrer la liste mensuelle des Trajets, le Panneau_Totaux et la Carte pour n'afficher que les Trajets associés à ce Véhicule.
21. THE Panneau_Totaux SHALL calculer le total du jour, le total du mois et le Total_Annuel_Partiel uniquement à partir des Trajets associés au Véhicule sélectionné.
22. 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.
23. WHEN un Trajet est créé ou modifié avec une date appartenant à un mois différent du mois affiché, THE Frontend SHALL se repositionner automatiquement sur le mois de ce Trajet, cibler sa journée sur la Carte, et déplier le groupe de cette journée dans la liste afin que le Trajet ajouté soit visible.
---