Application complète de saisie et de suivi des trajets kilométriques avec calcul de distance routière (OpenRouteService), barème kilométrique, résumés et régularisation annuelle. Backend (ASP.NET Core .NET 8, EF Core, SQLite) : - Trajets (CRUD, réordonnancement, insertion), calcul de distance ORS avec fallback Haversine, géométrie d'itinéraire stockée par trajet, recalcul en masse. - Profil, véhicules (avec dénomination), carnet d'adresses nommées, cache d'adresses. - Barème kilométrique : tranches multiples par puissance fiscale, borne max exclusive avec 'illimité' (KmMax nullable), coefficient à 3 décimales, recopie du dernier barème connu. - Résumés mensuel/annuel, montants réglés, régularisation, export PDF. Frontend (Angular 22, zoneless + signals) : - Consultation par jour, navigation temporelle synchronisée, carte Leaflet, formulaire de trajet (adresses nommées, domicile, autocomplétion BAN). - Détection de changement zoneless (indépendante de zone.js). Hébergement : Docker Compose (nginx + backend), scripts run-dev.sh / run-docker.sh.
62 lines
2.0 KiB
C#
62 lines
2.0 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using TrajetKmTracker.Api.Data;
|
|
using TrajetKmTracker.Api.Models.Entities;
|
|
|
|
namespace TrajetKmTracker.Api.Repositories;
|
|
|
|
/// <inheritdoc />
|
|
public class VehiculeRepository : IVehiculeRepository
|
|
{
|
|
private readonly AppDbContext _context;
|
|
|
|
public VehiculeRepository(AppDbContext context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public async Task<List<Vehicule>> GetHistoriqueAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
return await _context.Vehicules
|
|
.OrderByDescending(v => v.DateEffet)
|
|
.ThenByDescending(v => v.Id)
|
|
.ToListAsync(cancellationToken);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public async Task<Vehicule?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
|
|
{
|
|
return await _context.Vehicules
|
|
.FirstOrDefaultAsync(v => v.Id == id, cancellationToken);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public async Task<Vehicule?> GetVehiculeCourantAsync(DateOnly date, CancellationToken cancellationToken = default)
|
|
{
|
|
// Design SQL : SELECT * FROM Vehicules WHERE DateEffet <= date ORDER BY DateEffet DESC, Id DESC LIMIT 1
|
|
return await _context.Vehicules
|
|
.Where(v => v.DateEffet <= date)
|
|
.OrderByDescending(v => v.DateEffet)
|
|
.ThenByDescending(v => v.Id)
|
|
.FirstOrDefaultAsync(cancellationToken);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public Task AddAsync(Vehicule vehicule, CancellationToken cancellationToken = default)
|
|
{
|
|
_context.Vehicules.Add(vehicule);
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public async Task<List<Trajet>> GetTrajetsAReaffecterAsync(
|
|
DateOnly dateEffet,
|
|
int puissanceFiscale,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
return await _context.Trajets
|
|
.Where(t => t.Date >= dateEffet && t.PuissanceFiscale != puissanceFiscale)
|
|
.ToListAsync(cancellationToken);
|
|
}
|
|
}
|