using SchotzIadKmTracker.Api.Models.DTOs; namespace SchotzIadKmTracker.Api.Services; /// /// Logique métier de gestion des Trajets. Cette interface couvre pour l'instant la /// création (tâche 8.2) ; la modification, la suppression et le réordonnancement /// (tâche 8.5) l'étendront ultérieurement. /// public interface ITrajetService { /// /// Crée un Trajet à partir de : /// /// parse la date au format JJ/MM/AAAA (la validation de forme est faite par le validateur MVC) ; /// associe le véhicule : VehiculeId fourni sinon le véhicule courant à la date /// du trajet, en copiant sa PuissanceFiscale (dénormalisation, Exigence 10.14) ; /// calcule la distance via (BAN puis ORS, fallback Haversine) ; /// met en cache les adresses résolues via ; /// attribue la position en fin de journée (max(Position)+1.0) ; /// persiste le Trajet en transaction. Lorsque la distance n'a pas pu être calculée, /// le Trajet est tout de même persisté avec une Distance nulle et un avertissement (Exigence 2.4). /// /// /// Données de création transmises par le contrôleur (déjà validées côté MVC). /// Jeton d'annulation. /// Le (trajet créé + éventuel avertissement). /// /// Si aucun véhicule n'est applicable à la date du trajet et qu'aucun VehiculeId n'est fourni. /// Task CreateAsync(CreateTrajetDto dto, CancellationToken cancellationToken = default); /// /// Modifie un Trajet existant à partir de : /// /// lève (404) si le Trajet est introuvable /// (Exigence 5.6) ; /// recalcule la Distance uniquement si au moins une adresse a changé (comparaison sur /// le texte d'adresse normalisé) ou si le Trajet avait une Distance nulle et que les nouvelles /// adresses deviennent résolubles (Exigences 5.2, 5.9, 5.10) ; sinon les autres champs (commentaire, /// véhicule, date) sont mis à jour sans recalcul de distance (Exigence 5.3) ; /// en cas d'échec du recalcul (coordonnées connues mais calcul impossible), annule la /// modification (rollback) et lève en préservant /// les données existantes du Trajet (Exigence 5.8) ; /// met en cache les adresses résolues (Exigences 6.7, 6.8) ; /// persiste la modification en transaction. /// /// /// Identifiant du Trajet à modifier. /// Données de modification (déjà validées côté MVC). /// Jeton d'annulation. /// Le (trajet mis à jour + éventuel avertissement). /// Si le Trajet n'existe pas. /// Si le recalcul de la distance échoue. /// /// Si le VehiculeId fourni est introuvable, ou qu'aucun véhicule n'est applicable à la date. /// Task UpdateAsync(int id, UpdateTrajetDto dto, CancellationToken cancellationToken = default); /// /// Supprime un Trajet existant de manière transactionnelle (Exigence 5.5). /// Lève (404) si le Trajet est introuvable (Exigence 5.6). /// /// Identifiant du Trajet à supprimer. /// Jeton d'annulation. /// Si le Trajet n'existe pas. Task DeleteAsync(int id, CancellationToken cancellationToken = default); /// /// Applique un réordonnancement manuel des trajets d'une journée : met à jour uniquement la /// Position des trajets fournis via , /// sans altérer leurs autres champs (Exigence 11.9). Les identifiants inconnus sont ignorés. /// /// Nouvelles positions des trajets à réordonner. /// Jeton d'annulation. Task ReordonnerAsync(ReordonnerTrajetsDto dto, CancellationToken cancellationToken = default); /// /// Recalcule la Distance (et la géométrie d'itinéraire mise en cache) de TOUS les trajets /// via (BAN + ORS, fallback Haversine), indépendamment de /// tout changement d'adresse. Utile pour « réparer » des distances calculées en mode dégradé /// (ex. clé ORS invalide → distances à vol d'oiseau) une fois ORS de nouveau opérationnel. /// Chaque trajet est traité de façon indépendante : un échec sur l'un n'interrompt pas les autres. /// /// Le nombre de trajets dont la distance a effectivement été recalculée. Task RecalculerToutesLesDistancesAsync(CancellationToken cancellationToken = default); }