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:
@@ -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