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:
@@ -0,0 +1,114 @@
|
||||
using Microsoft.Data.Sqlite;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using SchotzIadKmTracker.Api.Data;
|
||||
using SchotzIadKmTracker.Api.Models.Entities;
|
||||
using SchotzIadKmTracker.Api.Services;
|
||||
|
||||
namespace SchotzIadKmTracker.Tests.PrecisionDistance;
|
||||
|
||||
/// <summary>
|
||||
/// Banc d'essai pour tester les services liés à la précision des distances
|
||||
/// (feature precision-distances-km) en isolation.
|
||||
///
|
||||
/// Utilise un <see cref="AppDbContext"/> adossé à une base SQLite EN MÉMOIRE
|
||||
/// ("Data Source=:memory:") dont la connexion est maintenue ouverte pour la
|
||||
/// durée du harnais (la base disparaît à la fermeture de la connexion), sur le
|
||||
/// même modèle que <see cref="Tests.Auth.AuthTestHarness"/>.
|
||||
///
|
||||
/// Expose les services réels (<see cref="PrecisionDistanceService"/>, <see cref="BaremeService"/>,
|
||||
/// <see cref="ResumeService"/>, <see cref="TotauxService"/>, <see cref="MontantRegleService"/>,
|
||||
/// <see cref="RemboursementService"/>) branchés sur le même contexte, ainsi que des méthodes
|
||||
/// utilitaires pour insérer rapidement Véhicules/Trajets/Tranches de barème de test.
|
||||
/// </summary>
|
||||
public sealed class PrecisionDistanceTestHarness : IDisposable
|
||||
{
|
||||
private readonly SqliteConnection _connection;
|
||||
|
||||
public AppDbContext Context { get; }
|
||||
public IPrecisionDistanceService PrecisionDistanceService { get; }
|
||||
public IBaremeService BaremeService { get; }
|
||||
public IResumeService ResumeService { get; }
|
||||
public IMontantRegleService MontantRegleService { get; }
|
||||
|
||||
public PrecisionDistanceTestHarness()
|
||||
{
|
||||
_connection = new SqliteConnection("Data Source=:memory:");
|
||||
_connection.Open(); // maintenue ouverte : garde la base en vie
|
||||
|
||||
var options = new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseSqlite(_connection)
|
||||
.Options;
|
||||
|
||||
Context = new AppDbContext(options);
|
||||
Context.Database.EnsureCreated();
|
||||
|
||||
PrecisionDistanceService = new SchotzIadKmTracker.Api.Services.PrecisionDistanceService(Context);
|
||||
BaremeService = new SchotzIadKmTracker.Api.Services.BaremeService(Context);
|
||||
ResumeService = new SchotzIadKmTracker.Api.Services.ResumeService(Context, PrecisionDistanceService);
|
||||
MontantRegleService = new SchotzIadKmTracker.Api.Services.MontantRegleService(
|
||||
Context, BaremeService, PrecisionDistanceService);
|
||||
}
|
||||
|
||||
/// <summary>Insère un véhicule de test et retourne son identifiant.</summary>
|
||||
public int AjouterVehicule(int puissanceFiscale = 5, string plaque = "AA-000-AA", DateOnly? dateEffet = null)
|
||||
{
|
||||
var vehicule = new Vehicule
|
||||
{
|
||||
Denomination = "Véhicule de test",
|
||||
Plaque = plaque,
|
||||
PuissanceFiscale = puissanceFiscale,
|
||||
DateEffet = dateEffet ?? new DateOnly(2020, 1, 1),
|
||||
};
|
||||
|
||||
Context.Vehicules.Add(vehicule);
|
||||
Context.SaveChanges();
|
||||
return vehicule.Id;
|
||||
}
|
||||
|
||||
/// <summary>Insère un trajet de test et retourne son identifiant.</summary>
|
||||
public int AjouterTrajet(
|
||||
int vehiculeId,
|
||||
DateOnly date,
|
||||
decimal? distance,
|
||||
bool allerRetour = false,
|
||||
int puissanceFiscale = 5,
|
||||
decimal position = 1m)
|
||||
{
|
||||
var trajet = new Trajet
|
||||
{
|
||||
Date = date,
|
||||
AdresseDepart = "Départ test",
|
||||
AdresseArrivee = "Arrivée test",
|
||||
Distance = distance,
|
||||
AllerRetour = allerRetour,
|
||||
Position = position,
|
||||
VehiculeId = vehiculeId,
|
||||
PuissanceFiscale = puissanceFiscale,
|
||||
};
|
||||
|
||||
Context.Trajets.Add(trajet);
|
||||
Context.SaveChanges();
|
||||
return trajet.Id;
|
||||
}
|
||||
|
||||
/// <summary>Insère une tranche de barème unique (illimitée) couvrant tous les kilométrages.</summary>
|
||||
public void AjouterTrancheBaremeUnique(int annee, int puissanceFiscale, decimal coefficient, decimal baseFixe = 0m)
|
||||
{
|
||||
Context.TranchesBareme.Add(new TrancheBareme
|
||||
{
|
||||
Annee = annee,
|
||||
PuissanceFiscale = puissanceFiscale,
|
||||
KmMin = 0m,
|
||||
KmMax = null,
|
||||
Coefficient = coefficient,
|
||||
Base = baseFixe,
|
||||
});
|
||||
Context.SaveChanges();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Context.Dispose();
|
||||
_connection.Dispose();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user