Precision configurable des distances (arrondi superieur 0/1/2 decimales)

- Nouveau parametre global Precision_Distance (sous-menu Application de la
  Page_Parametrage, entre Compte et Vehicules), persiste via une entite
  singleton ParametresApplication, expose par GET/PUT /api/parametres-application
- Arrondi superieur (ceiling) applique a l'affichage et aux agregats : trajet
  simple, aller/retour (arrondi puis doublement), totaux jour/mois/annee,
  carte, export PDF et bareme kilometrique - jamais a la distance brute stockee
- Refonte du Montant_Previsionnel : le montant mensuel (80%) porte desormais
  sur le seul mois affiche (tranche determinee par le cumul annuel) ; nouvelle
  ligne Montant_Previsionnel_Annuel (100%, sans minoration, sur le cumul)
- Backend : PrecisionDistanceService (ArrondirDistance), integration dans
  ResumeService/TotauxService/RemboursementService/MontantRegleService,
  migration EF Core ; 7 tests de propriete (FsCheck) + tests existants, 62/62 verts
- Frontend : ParametresApplicationService (signal partage), composant de
  parametrage, fonction miroir arrondirDistance, adaptation de la liste des
  trajets, du panneau des totaux, de la carte et des montants regles
- Specs : nouvelle spec precision-distances-km (requirements/design/tasks) ;
  mise a jour de requirements.md, design.md et design-requirements.md de
  schotziad-km-tracker (Requirement 22, renvois croises, Montant_Previsionnel)
- Suppression du fichier chromium .deb suivi par erreur dans le depot
This commit is contained in:
2026-09-25 12:02:52 +02:00
parent 702f5b6e9c
commit 7e80427e09
48 changed files with 3478 additions and 91 deletions
+3 -2
View File
@@ -34,9 +34,10 @@ export interface MontantPrevisionnel {
annee: number;
mois: number;
vehiculeId: number;
totalMoisKm: number;
totalAnnuelPartielKm: number;
montantBaremePlein: number; // barème plein sur le total partiel
montantPrevisionnel: number; // = 80% (indicatif uniquement)
montantPrevisionnelMensuel: number;
montantPrevisionnelAnnuel: number;
}
/** Ligne mensuelle de la synthèse annuelle — miroir de LigneSyntheseMoisDto. */
+1
View File
@@ -9,3 +9,4 @@ export * from './bareme.model';
export * from './adresse.model';
export * from './auth.model';
export * from './spec.model';
export * from './parametres-application.model';
@@ -0,0 +1,6 @@
// Modèle ParametresApplication — miroir de ParametresApplicationDtos.cs.
/** Paramètres globaux de l'application — miroir de ParametresApplicationDto. */
export interface ParametresApplication {
precisionDistanceKm: number;
}
+1
View File
@@ -9,3 +9,4 @@ export * from './profil.service';
export * from './bareme.service';
export * from './remboursement.service';
export * from './spec.service';
export * from './parametres-application.service';
@@ -0,0 +1,39 @@
import { HttpClient } from '@angular/common/http';
import { Injectable, inject, signal } from '@angular/core';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { environment } from '../../../environments/environment';
import { ParametresApplication } from '../models';
/**
* Service HTTP des paramètres globaux de l'application.
*
* Porte le signal partagé `precisionDistance`, chargé une fois puis mis à jour après
* modification — mécanisme central de propagation de la précision d'arrondi des distances
* à toute l'application (liste des trajets, totaux, carte, PDF, barème).
*/
@Injectable({ providedIn: 'root' })
export class ParametresApplicationService {
private readonly http = inject(HttpClient);
private readonly baseUrl = environment.apiUrl;
/** Précision courante (0, 1 ou 2), partagée par toute l'application. Défaut 2 avant premier chargement. */
readonly precisionDistance = signal<0 | 1 | 2>(2);
/** Charge la précision courante depuis le backend et met à jour le signal partagé (GET /api/parametres-application). */
charger(): Observable<ParametresApplication> {
return this.http.get<ParametresApplication>(`${this.baseUrl}/parametres-application`).pipe(
tap((p) => this.precisionDistance.set(p.precisionDistanceKm as 0 | 1 | 2))
);
}
/** Modifie la précision et met à jour le signal partagé en cas de succès (PUT /api/parametres-application). */
definirPrecisionDistance(valeur: 0 | 1 | 2): Observable<ParametresApplication> {
return this.http
.put<ParametresApplication>(`${this.baseUrl}/parametres-application`, {
precisionDistanceKm: valeur
})
.pipe(tap((p) => this.precisionDistance.set(p.precisionDistanceKm as 0 | 1 | 2)));
}
}