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.
Report mensuel :
- « Total parcouru sur l'année » devient « Total annuel (à fin de mois) »
et affiche le cumul jusqu'au mois de restitution inclus
(Total_Annuel_Partiel, via ITotauxService)
- la tranche de barème (coefficient, base, TOTAL IK du mois) est
déterminée sur ce même cumul, cohérent avec le Panneau_Totaux du site
et stable même si le PDF est édité plus tard
Report annuel :
- ligne « Formule réelle » centrée (comme la régularisation)
- ligne « Régularisation (réel − payé) » agrandie (14 pt, gras) pour la
mettre en avant comme action finale
Test d'intégration PDF mis à jour (injection d'ITotauxService). Specs
requirements/design-requirements/design synchronisées (Exigence 7).
En-tête (mensuel + annuel) :
- Titre « RAPPORT DE TRAJETS » en majuscules
- Logo agrandi (120 pt) à gauche, bloc titre centré sur l'espace restant,
bloc d'infos placé dessous, trait séparateur sur toute la largeur
Pied de page (mensuel + annuel) :
- Mention légale (déclaration sur l'honneur, calcul indicatif, non
opposable aux administrations) en 5 pt justifiée, au-dessus de la
pagination
Rapport mensuel :
- Adresse d'arrivée à la ligne sous le départ, précédée de « → »
- Colonne dédiée « A/R » (marqueur « X ») avant les Kms ; largeurs
ajustées (A/R minimale, Kms jusqu'à « 9 999 », adresses maximisées)
Rapport annuel :
- Espace après « Véhicule » ; barème applicable et total km sur deux
colonnes
- Titre du tableau barème complété « — Kms parcourus × Coef + Base »
- Espace avant la régularisation, régularisation centrée
Steering : nouvelle règle workflow (valider l'approche avant de coder,
l'utilisateur lance le dev).
Specs requirements.md / design-requirements.md / design.md synchronisées
(Exigence 7 : critères + maquettes PDF + glossaire Mention_Legale).
- 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
- Backend : ajout de design-requirements a la liste blanche des documents
exposes (libelle Exigences techniques) ; embarque via le Dockerfile (*.md)
- Frontend : entree Exigences techniques dans le menu deroulant Specs ;
le menu lateral de la page Specs se remplit dynamiquement
- design.md : note renvoyant vers requirements.md et design-requirements.md
Réorganisation complète de la navigation suite au retour d'usage, plus
changement de mot de passe et affichage/masquage des mots de passe saisis.
Backend :
- Nouvel endpoint POST /api/auth/change-password (ChangePasswordDto,
MotDePasseActuelInvalideException, validateur, AuthService.ChangePasswordAsync).
Exige l'ancien mot de passe, distinct de la réinitialisation par e-mail.
- Endpoint placé dans SessionController (protégé par l'autorisation globale) et
NON dans AuthController : AuthController porte [AllowAnonymous] au niveau
classe, ce qui rend inopérant un [Authorize] posé sur une seule action (bug de
sécurité détecté par test manuel — l'endpoint était accessible sans jeton —
puis corrigé par ce déplacement).
Frontend :
- Page « Compte utilisateur » (ProfilComponent renommé) : section Maintenance
extraite vers MaintenanceComponent (route /maintenance) ; nouvelle section de
changement de mot de passe (ancien + nouveau + confirmation).
- ParametrageComponent (route /parametrage) : menu latéral Compte / Véhicules /
Barème + contenu en routes enfants, réutilisant les composants existants.
Compte et Véhicules en authGuard seul ; Barème garde profilConfigureGuard.
- Barre de navigation : Véhicules et Barème retirés (rejoignent Paramétrage) ;
logo passé en format horizontal (icône + texte).
- Avatar utilisateur (initiales) à droite de la barre : sous-menu au survol
(identité, Paramétrage, Maintenance, Se déconnecter). Menu « Specs » converti
en dropdown survolable (Exigences / Conception / Tâches).
- Dropdowns : panneau collé au bouton (plus d'espace mort) pour que le survol
reste continu jusqu'au panneau — un espace créait une fermeture prématurée.
- Barre masquée sur les pages publiques (login/register/forgot/reset-password)
même avec un jeton résiduel expiré/invalide (détection via Router events, pas
seulement la présence du jeton).
- PasswordInputComponent (shared) : bouton œil afficher/masquer, ControlValueAccessor,
style aligné sur les champs texte classiques. Appliqué aux 8 champs mot de
passe de l'application (login, register, reset-password, compte utilisateur).
Specs : requirements.md (exigences 20, 21 + glossaire) et design.md (endpoints,
DTO, composants) mis à jour. 54 tests backend au vert.
Remplace la copie des 3 fichiers listés avec continuation de ligne par un motif
.kiro/specs/schotziad-km-tracker/*.md. Forme plus robuste avec le classic builder
ET BuildKit (docker compose v2), qui n'embarque que les Markdown (pas .config.kiro
ni tasks.meta.json). Comportement de l'image inchangé : les 3 documents restent
copiés dans /app/specs.
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).
- Backend : TrajetCarteDto expose désormais le commentaire du trajet ; la
projection de GET /api/trajets/journee/{date} le renseigne.
- Frontend : l'interface TrajetCarte porte le commentaire. L'infobulle affiche
le commentaire en première ligne (s'il existe, séparé par un léger trait) et
ajoute « (A/R) » après la distance pour un aller/retour.
- Style .carte-infobulle__commentaire (italique, discret) dans les styles
globaux.
Builds backend, frontend dev et prod OK.
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.
Évite d'embarquer les artefacts .NET (~220 Mo) et les bases SQLite locales dans le
contexte de build de l'image backend. Build de l'image API validé sans le projet de tests.
- 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).
- 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.