feat: réutilisation des coordonnées déjà géocodées (domicile, insertion de trajets)
Expose les coordonnées déjà géocodées dans ProfilDto (DomicileLatitude/Longitude) et TrajetDto (DepartLatitude/Longitude, ArriveeLatitude/Longitude) afin que le Frontend les réutilise sans déclencher un nouveau géocodage BAN : - Bouton « Utiliser mon domicile » (trajet-form) : utilise désormais les coordonnées du Profil au lieu de forcer un re-géocodage. - Actions « insérer avant/après » (trajet-list) : transmettent les coordonnées déjà connues du point de fin repris au formulaire d'insertion. Le résumé mensuel (ResumeService) résout les coordonnées via le Cache_Adresses pour chaque trajet (nouvelle méthode ConstruireResumeMensuelAvecCoordonneesAsync) ; le résumé annuel reste inchangé pour éviter des lookups de cache inutiles sur une vue qui n'affiche pas le détail des trajets. Met à jour design.md et design-requirements.md (Requirements 10 et 11) pour refléter le nouveau contrat d'API.
This commit is contained in:
@@ -151,6 +151,7 @@ Le document est organisé **en miroir** des exigences de `requirements.md` : cha
|
||||
1. IF le matricule reçu dépasse 8 caractères, THEN THE Backend SHALL rejeter le matricule avec une erreur HTTP 400.
|
||||
2. WHEN l'utilisateur sauvegarde une Adresse_Domicile, THE Backend SHALL géocoder l'adresse via l'API BAN pour obtenir ses coordonnées et les stocker dans le Profil ainsi que dans le Cache_Adresses ; si le géocodage BAN échoue, THE Backend SHALL persister l'Adresse_Domicile textuelle sans coordonnées.
|
||||
3. WHEN l'utilisateur modifie l'Adresse_Domicile dans le Profil et sauvegarde, THE Backend SHALL re-géocoder la nouvelle adresse via l'API BAN pour mettre à jour les coordonnées dans le Profil et dans le Cache_Adresses.
|
||||
4. WHEN le Backend expose le Profil via `GET /api/profil` ou `PUT /api/profil`, THE Backend SHALL inclure dans le `ProfilDto` les coordonnées déjà géocodées de l'Adresse_Domicile (`DomicileLatitude`, `DomicileLongitude`, null si non résolues), afin que le bouton « Utiliser mon domicile » du Frontend les réutilise sans déclencher un nouveau géocodage BAN.
|
||||
|
||||
---
|
||||
|
||||
@@ -162,6 +163,7 @@ Le document est organisé **en miroir** des exigences de `requirements.md` : cha
|
||||
|
||||
1. WHEN l'utilisateur sélectionne une Adresse_Nommee dans le formulaire d'insertion pour un champ adresse, THE Frontend SHALL associer les coordonnées géographiques (latitude, longitude) de l'Adresse_Nommee pour transmission au Backend.
|
||||
2. WHERE l'insertion utilise l'autocomplétion pour une nouvelle adresse, THE Frontend SHALL s'appuyer sur l'API BAN pour proposer les suggestions et récupérer les coordonnées, selon les mêmes modalités techniques que le formulaire de saisie (voir Requirement 1).
|
||||
3. WHEN le Backend expose un Trajet via `TrajetDto`, THE Backend SHALL inclure les coordonnées déjà géocodées de ses adresses de départ et d'arrivée (`DepartLatitude`, `DepartLongitude`, `ArriveeLatitude`, `ArriveeLongitude`, null si non résolues), afin que les actions « insérer avant » et « insérer après » du Frontend reprenant le point de fin d'un Trajet existant transmettent ces coordonnées au formulaire d'insertion sans déclencher de nouveau géocodage BAN.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -239,8 +239,8 @@ src/
|
||||
- Reactive Form avec les champs : `date` (string JJ/MM/AAAA), `adresseDepart` (1–255 car.), `adresseArrivee` (1–255 car.), `commentaire` (optionnel, 0–500 car.), `allerRetour` (case à cocher — distance comptée doublée)
|
||||
- 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 ; 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)
|
||||
- **Mode insertion** : accepte en entrée `{ adresseDepart?: string, adresseArrivee?: string, departLatitude?, departLongitude?, arriveeLatitude?, arriveeLongitude? }` pour pré-remplir les champs depuis le Trajet_Précédent / Trajet_Suivant ; les champs restent modifiables. Lorsque les coordonnées du point repris sont fournies (déjà géocodées), elles sont mémorisées comme pour une sélection BAN, ce qui évite un re-géocodage côté Backend
|
||||
- Boutons "Utiliser mon domicile" à côté de chaque champ adresse ; les coordonnées du domicile (exposées par `ProfilDto.DomicileLatitude/Longitude` si déjà géocodées) sont transmises avec l'adresse, évitant un re-géocodage BAN ; 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
|
||||
@@ -263,8 +263,8 @@ src/
|
||||
- Affiche TOUS les trajets du mois, regroupés par journée : chaque groupe/jour a un **en-tête repliable** (jour de la semaine avant la date, ex. « Lundi 15/09/2026 », puis nombre de trajets) ; par défaut tout est replié sauf le dernier jour du mois ayant des trajets.
|
||||
- **Bouton dédié « + » à droite de l'en-tête** (`Output ajouterSurJournee: string`) : ouvre le formulaire de création avec la date de CETTE journée, sans dépendre de la journée affichée sur la Carte (pilotée par le survol) — évite qu'un déplacement de souris à travers plusieurs journées ouvertes ne fasse dériver la date visée en se dirigeant vers le bouton principal d'ajout. Le conteneur fixe `date` sur cette valeur avant d'ouvrir la création (`ouvrirCreationSur`).
|
||||
- Ligne par trajet (triée par `Position` croissante au sein du jour) : les **boutons d'action** sont placés **en début de ligne** (après la poignée de glisser-déposer, avant la colonne A/R) et **alignés à droite au sein de leur colonne** pour conserver l'alignement vertical du bouton « insérer après » ; puis colonne dédiée **A/R** pour les allers/retours, commentaire (si présent), adresses (taille réduite), distance effective
|
||||
- Actions par trajet (regroupées en début de ligne) : modifier (→ `TrajetFormComponent` pré-rempli en < 500 ms), supprimer (→ dialog de confirmation), **insérer avant/après** — l'insérer après ouvre `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`
|
||||
- Actions par trajet (regroupées en début de ligne) : modifier (→ `TrajetFormComponent` pré-rempli en < 500 ms), supprimer (→ dialog de confirmation), **insérer avant/après** — l'insérer après ouvre `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. Les coordonnées du point de fin repris (exposées par `TrajetDto.DepartLatitude/Longitude` ou `ArriveeLatitude/Longitude` selon le sens) sont transmises dans le pré-remplissage pour éviter un re-géocodage BAN de cette adresse déjà connue
|
||||
- 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 (et leurs coordonnées déjà géocodées, selon le même principe), 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) ; `ouvrirToutesLesJournees()` déplie tous les groupes ; `aDesJourneesFermees()` conditionne l'affichage du bouton « Ouvrir toutes les journées »
|
||||
- `@Input jourAffiche` : la journée affichée sur la Carte ; le groupe correspondant est mis en surbrillance (`estJourAffiche`)
|
||||
- **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`
|
||||
@@ -1019,7 +1019,15 @@ public record TrajetDto(
|
||||
decimal Position, // rang dans la journée
|
||||
int VehiculeId,
|
||||
int PuissanceFiscale,
|
||||
bool AllerRetour // information aller/retour conservée par trajet
|
||||
bool AllerRetour, // information aller/retour conservée par trajet
|
||||
// Coordonnées déjà géocodées (Cache_Adresses pour le résumé mensuel ; résultat du calcul de
|
||||
// distance pour la création/modification), exposées pour que le Frontend les réutilise SANS
|
||||
// re-géocoder (ex. « Insérer avant/après » qui reprend l'adresse d'un trajet existant). null
|
||||
// si l'adresse concernée n'a pas de coordonnées connues.
|
||||
double? DepartLatitude = null,
|
||||
double? DepartLongitude = null,
|
||||
double? ArriveeLatitude = null,
|
||||
double? ArriveeLongitude = null
|
||||
);
|
||||
|
||||
// Réordonnancement manuel des trajets d'une journée
|
||||
@@ -1097,7 +1105,11 @@ public record ProfilDto(
|
||||
string? Prenom,
|
||||
string? Matricule,
|
||||
string? AdresseDomicile,
|
||||
bool DomicileGeocode
|
||||
bool DomicileGeocode,
|
||||
// Coordonnées du domicile déjà géocodées (null si non résolues), exposées pour que le
|
||||
// Frontend les réutilise lors du bouton « Utiliser mon domicile » SANS re-géocoder.
|
||||
double? DomicileLatitude,
|
||||
double? DomicileLongitude
|
||||
);
|
||||
|
||||
public record SaveProfilDto(
|
||||
|
||||
Reference in New Issue
Block a user