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:
@@ -16,11 +16,16 @@ public class ResumeService : IResumeService
|
||||
|
||||
private readonly AppDbContext _context;
|
||||
private readonly IPrecisionDistanceService _precisionDistanceService;
|
||||
private readonly IAdresseCacheService _adresseCacheService;
|
||||
|
||||
public ResumeService(AppDbContext context, IPrecisionDistanceService precisionDistanceService)
|
||||
public ResumeService(
|
||||
AppDbContext context,
|
||||
IPrecisionDistanceService precisionDistanceService,
|
||||
IAdresseCacheService adresseCacheService)
|
||||
{
|
||||
_context = context;
|
||||
_precisionDistanceService = precisionDistanceService;
|
||||
_adresseCacheService = adresseCacheService;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -33,7 +38,10 @@ public class ResumeService : IResumeService
|
||||
var precision = await _precisionDistanceService.ObtenirAsync(cancellationToken);
|
||||
var trajets = await ChargerTrajetsDuMoisAsync(annee, mois, vehiculeId, cancellationToken);
|
||||
|
||||
return ConstruireResumeMensuel(annee, mois, trajets, precision);
|
||||
// Coordonnées incluses : ce résumé alimente l'écran de consultation/saisie des Trajets,
|
||||
// dont l'insertion (« Insérer avant/après ») réutilise les coordonnées déjà géocodées
|
||||
// pour éviter un re-géocodage BAN.
|
||||
return await ConstruireResumeMensuelAvecCoordonneesAsync(annee, mois, trajets, precision, cancellationToken);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -115,6 +123,33 @@ public class ResumeService : IResumeService
|
||||
return new ResumeMensuelDto(annee, mois, trajetsDto, totalKm);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Variante de <see cref="ConstruireResumeMensuel"/> enrichissant chaque <see cref="TrajetDto"/>
|
||||
/// des coordonnées de ses adresses, résolues via le Cache_Adresses (même mécanisme que
|
||||
/// <c>TrajetsController.GetJournee</c>). Réservée au résumé MENSUEL (écran de consultation/
|
||||
/// saisie des Trajets, dont l'insertion réutilise ces coordonnées) : le résumé ANNUEL continue
|
||||
/// d'utiliser <see cref="ConstruireResumeMensuel"/> sans lookup, les totaux annuels n'ayant pas
|
||||
/// besoin du détail des coordonnées de chaque trajet (évite 2×N lookups cache inutiles).
|
||||
/// </summary>
|
||||
private async Task<ResumeMensuelDto> ConstruireResumeMensuelAvecCoordonneesAsync(
|
||||
int annee, int mois, IReadOnlyList<Trajet> trajets, int precision, CancellationToken cancellationToken)
|
||||
{
|
||||
var distancesArrondies = trajets.Select(t => (t, distance: DistanceEffectiveArrondie(t, precision))).ToList();
|
||||
|
||||
var trajetsDto = new List<TrajetDto>(distancesArrondies.Count);
|
||||
foreach (var (t, distance) in distancesArrondies)
|
||||
{
|
||||
var depart = await _adresseCacheService.ObtenirParAdresseAsync(t.AdresseDepart, cancellationToken);
|
||||
var arrivee = await _adresseCacheService.ObtenirParAdresseAsync(t.AdresseArrivee, cancellationToken);
|
||||
|
||||
trajetsDto.Add(ToDto(t, distance, depart?.Latitude, depart?.Longitude, arrivee?.Latitude, arrivee?.Longitude));
|
||||
}
|
||||
|
||||
var totalKm = distancesArrondies.Sum(x => x.distance ?? 0m);
|
||||
|
||||
return new ResumeMensuelDto(annee, mois, trajetsDto, totalKm);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calcule la Distance_Effective_Arrondie d'un trajet : arrondi (Precision_Distance) appliqué
|
||||
/// à la distance SIMPLE brute AVANT doublement aller/retour (Exigence 4.1, 4.2, 4.3). null si la
|
||||
@@ -149,7 +184,13 @@ public class ResumeService : IResumeService
|
||||
}
|
||||
}
|
||||
|
||||
private static TrajetDto ToDto(Trajet t, decimal? distanceEffectiveArrondie) =>
|
||||
private static TrajetDto ToDto(
|
||||
Trajet t,
|
||||
decimal? distanceEffectiveArrondie,
|
||||
double? departLatitude = null,
|
||||
double? departLongitude = null,
|
||||
double? arriveeLatitude = null,
|
||||
double? arriveeLongitude = null) =>
|
||||
new(
|
||||
t.Id,
|
||||
t.Date,
|
||||
@@ -162,5 +203,9 @@ public class ResumeService : IResumeService
|
||||
t.Position,
|
||||
t.VehiculeId,
|
||||
t.PuissanceFiscale,
|
||||
t.AllerRetour);
|
||||
t.AllerRetour,
|
||||
departLatitude,
|
||||
departLongitude,
|
||||
arriveeLatitude,
|
||||
arriveeLongitude);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user