Files
MadJax 09c24d5f59 UX consultation, trajets aller/retour et rafraîchissement des totaux
- Totaux : rafraîchissement immédiat du panneau (jour/mois/année + montant
  prévisionnel) après création/modification/suppression/réordonnancement d'un
  trajet, sans changer de jour (ViewChild + méthode publique rafraichir()).
- Trajets Aller/Retour : case à cocher au formulaire ; la distance comptée est
  doublée (distance simple stockée + booléen AllerRetour, distance effective
  utilisée dans tous les agrégats : totaux, résumés, barème, régularisation, PDF).
  Migration TrajetAllerRetour. Badge « A/R » dans une colonne dédiée en début de
  ligne pour garder date/adresses alignées.
- Mise en page de la page Trajets : vue à hauteur fixe où seule la liste défile ;
  colonne gauche figée (sélecteur de date + navigation, totaux, carte) et bande
  fixe (véhicule + bouton d'ajout) au-dessus de la liste. Layout applicatif global
  en pleine hauteur (app.component).
- run-dev.sh : chargement de la clé JWT depuis .env (ou secret de dev aléatoire) et
  Auth__FrontendBaseUrl sur le frontend dev ; rappel du lien de reset journalisé.

Build backend (solution) et frontend (production) OK.
2026-09-15 12:33:10 +02:00

78 lines
3.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.ComponentModel.DataAnnotations;
namespace SchotzIadKmTracker.Api.Models.Entities;
/// <summary>Trajet kilométrique saisi par l'utilisateur.</summary>
public class Trajet
{
public int Id { get; set; }
[Required]
public DateOnly Date { get; set; }
[Required, MaxLength(255)]
public string AdresseDepart { get; set; } = string.Empty;
[Required, MaxLength(255)]
public string AdresseArrivee { get; set; } = string.Empty;
/// <summary>
/// Distance en kilomètres, arrondie à 2 décimales, strictement positive lorsqu'elle est
/// connue. <c>null</c> lorsque la distance n'a pas pu être calculée (aucune coordonnée
/// résoluble via le Cache_Adresses / la BAN) : le Trajet est alors persisté avec une
/// Distance nulle et un avertissement (Exigence 2.4). La modification ultérieure peut
/// recalculer la Distance si de nouvelles coordonnées deviennent disponibles (Exigence 5.10).
/// </summary>
public decimal? Distance { get; set; }
/// <summary>
/// Indique un trajet aller/retour. Lorsqu'il vaut <c>true</c>, la distance COMPTÉE est le
/// double de la distance simple (aller) stockée dans <see cref="Distance"/> ; la ligne de
/// trajet reste unique. Valeur par défaut <c>false</c> : les trajets existants conservent
/// leur comportement (distance simple).
/// </summary>
public bool AllerRetour { get; set; }
/// <summary>
/// Distance comptée (effective), doublée lorsque <see cref="AllerRetour"/> vaut <c>true</c>.
/// Propriété calculée NON MAPPÉE : elle n'est pas persistée mais dérivée de
/// <see cref="Distance"/> et <see cref="AllerRetour"/>. <c>null</c> lorsque la distance simple
/// est inconnue (non calculable), afin de préserver le comportement existant dans les sommes.
/// </summary>
[System.ComponentModel.DataAnnotations.Schema.NotMapped]
public decimal? DistanceEffective => Distance.HasValue ? Distance.Value * (AllerRetour ? 2m : 1m) : (decimal?)null;
/// <summary>Commentaire optionnel (0–500 caractères).</summary>
[MaxLength(500)]
public string? Commentaire { get; set; }
/// <summary>
/// Géométrie GeoJSON (LineString) de l'itinéraire routier départ→arrivée, telle que
/// renvoyée par OpenRouteService, pour le tracé exact sur la carte. <c>null</c> lorsque
/// l'itinéraire routier n'a pas pu être obtenu (fallback vol d'oiseau) : la carte trace
/// alors une ligne droite. La géométrie dépend de la PAIRE départ→arrivée, c'est pourquoi
/// elle est portée par le Trajet et non par le Cache_Adresses (indexé par adresse seule).
/// </summary>
public string? GeometrieJson { get; set; }
/// <summary>
/// Rang du trajet dans la liste de la journée. Valeur décimale (ex. 1.0, 1.5, 2.0)
/// permettant l'insertion sans réordonnancement systématique.
/// Trié par ordre croissant pour l'affichage.
/// </summary>
[Required]
public decimal Position { get; set; }
/// <summary>Référence au véhicule associé au trajet (véhicule courant à la date de création par défaut).</summary>
[Required]
public int VehiculeId { get; set; }
public Vehicule? Vehicule { get; set; }
/// <summary>Puissance fiscale (CV) du véhicule au moment de l'association ; stockée pour l'historique.</summary>
[Required]
public int PuissanceFiscale { get; set; }
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
}