Les HttpClient vers l'API BAN et ORS réutilisaient des connexions TLS
éventées par le pool .NET, provoquant des blocages jusqu'au timeout
front de 10s (SocketException Operation canceled). Configuration d'un
SocketsHttpHandler dédié avec PooledConnectionLifetime (2 min),
PooledConnectionIdleTimeout (30s) et ConnectTimeout (5s).
Resserre aussi le catch de ORSClient : une annulation provenant de
l'appelant (CancellationToken du contrôleur) est désormais propagée
telle quelle, au lieu d'être maquillée en timeout ORS.
- Export PDF: nouveau nommage AAAAMM/AAAA_Trajets_MATRICULE_PLAQUE.pdf,
logo carré embarqué en en-tête, km formatés selon Precision_Distance,
restructuration en-têtes (Domicile déplacé, période/année fusionnées
au titre)
- Correction bug: le nom de fichier suggéré au téléchargement ne
remontait pas au frontend (CORS WithExposedHeaders manquant +
composants résumé ne lisaient pas Content-Disposition)
- Résumé mensuel: colonne Commentaire, sélecteur temporel unifié
(auto-chargement), km selon précision
- Résumé annuel: bouton Export PDF repositionné, km selon précision
- Panneau totaux: renommage "Remboursement indicatif" + infobulles
d'aide (icône) au lieu du texte permanent
- Ajout de PdfServiceIntegrationTests (3 tests), 65/65 tests backend OK
- Mise à jour requirements.md et design.md en conséquence
- 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
Nouvelle fonctionnalité : consulter les documents de spécification (exigences,
conception technique, plan de tâches) en lecture seule dans le frontend.
Backend :
- SpecsController (GET /api/specs, GET /api/specs/{cle}) protégé par l'auth
globale ; SpecDocumentService avec whitelist (pas de path traversal) et
lecture depuis le dossier specs/ embarqué, repli sur .kiro/specs en dev.
- DTOs SpecDocumentDto / SpecContenuDto ; service enregistré dans Program.cs.
Docker :
- Contexte de build backend = racine du dépôt (dockerfile: backend/Dockerfile)
pour embarquer .kiro/specs/*.md dans l'image (app autonome).
- .dockerignore racine ajouté (exclut frontend/node_modules, bin/obj, etc.).
Frontend :
- SpecService + SpecsComponent (lazy-loadé) : page dédiée avec menu latéral par
document ; rendu Markdown via marked (GFM) assaini par DOMPurify.
- Diagrammes Mermaid (ex. graph TB) rendus en SVG via mermaid.js importé
dynamiquement ; déclenchement après résolution du @ViewChild (setTimeout).
- Barre de navigation : simple lien « Specs » (le choix du document se fait dans
le menu latéral de la page, pas dans la barre).
- Routes /specs et /specs/:cle protégées par authGuard.
Specs : exigence 19 (consultation des documents) ajoutée à requirements.md ;
design.md complété (DTOs, endpoints, composant, rendu Mermaid, note Docker).
Corrige un contournement : après réinitialisation de la base (même JWT_SECRET_KEY),
un jeton restait cryptographiquement valide et donnait accès alors que le compte
n'existait plus, permettant d'atteindre l'onboarding sans s'inscrire.
- Backend : JwtBearer.OnTokenValidated vérifie désormais l'existence du compte
référencé par le claim sub (lu sous 'sub' ou NameIdentifier selon le remapping)
et rejette le jeton (401) si le compte est introuvable.
- Backend : nouvel endpoint protégé GET /api/auth/moi (SessionController) renvoyant
200 si la session est réellement valide, 401 sinon.
- Frontend : authGuard valide la session côté serveur (GET /auth/moi) au lieu de se
fier au seul jeton local ; sur échec, redirection vers /login (jeton purgé par
l'intercepteur sur 401). AuthService.validerSession() ajouté.
Tests backend : 54/54 au vert.
- Retire app.UseHttpsRedirection() : le conteneur écoute en HTTP, la terminaison
TLS est assurée par le reverse-proxy (Caddy) placé devant. Évite les redirections
parasites derrière le proxy.
- Ajoute Caddyfile.example (Caddy devant le compose existant : TLS auto + reverse_proxy
vers le frontend nginx qui sert l'app et proxifie /api).
- .env.example : précise AUTH_FRONTEND_BASE_URL = URL publique HTTPS en production
(liens de réinitialisation de mot de passe).