Refonte mise en page des exports PDF (en-tête, pied de page, tables)

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).
This commit is contained in:
2026-10-10 10:33:23 +02:00
parent 6bdd67fd00
commit e9f34e59e8
5 changed files with 238 additions and 95 deletions
+61 -29
View File
@@ -1549,42 +1549,50 @@ QuestPDF est une bibliothèque .NET open-source (licence MIT pour usage communau
```
┌────────────────────────────────────────────────────────────────────────────┐
│ [Logo] Rapport de trajets │
│ Feuille d'indemnité kilométrique JANVIER 2025 │
│ Utilisateur : Cécile DOUCET — Matricule : AB12CD34 │
│ Domicile : 29 route des Cascades, 23400 Saint-Pardoux-Morterolles │
│ Véhicule : GOLF (ES-036-YF) — 6 CV (Coef. : 0,447 / Base : 0) │
│ Total parcouru sur le mois : 931 Kms TOTAL IK du mois : 416,16 € │
│ Total parcouru sur l'année : 931 Kms Réglé : 500,00 € │
├────────────┬──────────────────────────┬──────────────────────────┬─────────┤
│ Date │ Motifs (commentaire) │ Adresse départ → arrivée │ Kms │
├────────────┼──────────────────────────┼──────────────────────────┼─────────┤
│ 03/01/2025 │ Rdv chez Marie │ ... → Aureil │ 94 │
│ ... │ ... │ ... │ ... │
└────────────┴──────────────────────────┴──────────────────────────┴─────────┘
│ ┌───────┐ RAPPORT DE TRAJETS (bloc titre centré │
│ │ │ Feuille d'indemnité kilométrique à droite du logo) │
│ │ Logo │ JANVIER 2025 │
│ │ 120pt │ Utilisateur : Cécile DOUCET — Matricule : AB12CD34 │
│ │ │ Domicile : 29 route des Cascades, 23400 Saint-Pardoux-Morter. │
│ └───────┘ Véhicule : GOLF (ES-036-YF) — 6 CV (Coef. : 0,447 / Base : 0) │
│ Total parcouru sur le mois : 931 Kms TOTAL IK du mois : 416 € │
│ Total parcouru sur l'année : 931 Kms Réglé : 500,00 € │
├──────────────────────────────────────────────────────────────────────────── (trait pleine largeur)
├────────────┬────────────────┬───────────────────────────────┬─────┬────────┤
│ Date │ Motifs │ Départ → Arrivée │ A/R │ Kms │
├────────────┼────────────────┼───────────────────────────────┼─────┼────────┤
│ 03/01/2025 │ Rdv chez Marie │ 29 route des Cascades... │ X │ 94 │
│ │ │ → Aureil │ │ │
│ ... │ ... │ ... │ │ ... │
├────────────┴────────────────┴───────────────────────────────┼─────┼────────┤
│ Total du mois : │ │ 931 │
└──────────────────────────────────────────────────────────────┴─────┴────────┘
(pied de page : Mention_Legale 5 pt justifiée, puis « Page X / Y »)
```
> Le titre du document intègre désormais le mois et l'année (« Feuille d'indemnité kilométrique JANVIER 2025 ») ; il n'y a plus de ligne « Période » distincte dans l'en-tête. Le libellé « Adresse de départ » devient « Domicile » et est positionné juste après la ligne Utilisateur/Matricule (au lieu d'être après la ligne Véhicule). Le « TOTAL IK du mois » = kilomètres du mois × coefficient de la tranche annuelle applicable. Le « Réglé » = Montant_Regle saisi pour le mois. Le motif affiché est le commentaire du Trajet. Les kilomètres (mois, année, table des trajets) sont formatés selon Precision_Distance.
> Le titre « RAPPORT DE TRAJETS » est désormais en majuscules. L'en-tête est disposé sur une rangée : logo carré agrandi (120 pt) aligné en haut à gauche ; à droite du logo, un bloc titre (titre + sous-titre « Feuille d'indemnité kilométrique {MOIS} {ANNEE} ») centré sur l'espace restant ; sous le bloc titre, le bloc d'infos (Utilisateur/Matricule, Domicile, Véhicule, totaux). Un trait séparateur horizontal est tracé sur toute la largeur de la page sous l'en-tête. Le libellé « Adresse de départ » devient « Domicile », positionné juste après la ligne Utilisateur/Matricule. Dans la table des Trajets, l'adresse d'arrivée passe à la ligne sous l'adresse de départ, précédée de « → » ; une colonne dédiée **« A/R »** (juste avant « Kms ») affiche un marqueur « X » pour un Aller_Retour (le suffixe « (A/R) » dans la cellule itinéraire est supprimé). Le « TOTAL IK du mois » = kilomètres du mois × coefficient de la tranche annuelle applicable. Le « Réglé » = Montant_Regle saisi pour le mois. Le motif affiché est le commentaire du Trajet. Les kilomètres (mois, année, table des trajets) sont formatés selon Precision_Distance.
#### PDF Annuel (`AAAA_Trajets_MATRICULE_PLAQUE.pdf`)
```
┌──────────────────────────────────────────────────────────────────────────────┐
│ [Logo] Rapport de trajets │
│ Synthèse 2025 d'indemnité kilométrique │
│ Utilisateur : Cécile DOUCET — Matricule : AB12CD34 │
│ Domicile : 29 route des Cascades, 23400 Saint-Pardoux-Morterolles │
│ Véhicule : GOLF (ES-036-YF) — 6 CV │
│ Barème applicable : 5001–20000 │
│ Total kilométrique de l'année : 12 241 km │
├──────────────────────────────────────────────────────────────────────────────┤
│ Barème applicable pour l'année (6 CV) : │
│ ┌───────┐ RAPPORT DE TRAJETS (bloc titre centré │
│ │ │ Synthèse 2025 d'indemnité km à droite du logo) │
│ │ Logo │ │
│ │ 120pt │ Utilisateur : Cécile DOUCET — Matricule : AB12CD34 │
│ │ │ Domicile : 29 route des Cascades, 23400 Saint-Pardoux-Morter. │
│ └───────┘ Véhicule : GOLF (ES-036-YF) — 6 CV │
│ (espace après Véhicule)│
│ Barème applicable : 5001–20000 Total kilométrique de │
│ l'année : 12 241 km │
├──────────────────────────────────────────────────────────────────────────── (trait pleine largeur)
│ Barème applicable pour l'année (6 CV) — Kms parcourus × Coef + Base │
│ Tranche (km) │ Coefficient │ Base (€) │
│ 0 à 5000 │ 0,665 │ 0 │
│ 5001 à 20000 │ 0,374 │ 1457 │
│ 20000 et plus │ 0,447 │ 0 │
├────────────┬───────────────┬───────────────────┬────────────────────────────┤
│ Mois │ Kms parcourus │ Frais payé (réglé)│ Frais réel │
│ Mois │ Kms parcourus │ Frais payé │ Frais réel │
├────────────┼───────────────┼───────────────────┼────────────────────────────┤
│ Janvier │ 931 │ 500,00 € │ 459,01 € │
│ ... │ ... │ ... │ ... │
@@ -1593,24 +1601,48 @@ QuestPDF est une bibliothèque .NET open-source (licence MIT pour usage communau
│ TOTAL │ 12 241 │ 6 000,00 € │ 6 035,13 € │
├────────────┴───────────────┴───────────────────┴────────────────────────────┤
│ Formule réelle : 12241 km × 0,374 + 1457 = 6 035,13 € (tranche 5001–20000, 6 CV) │
│ Régularisation (réel − payé) : 35,13 € │
│ │
│ Régularisation (réel − payé) : 35,13 € (ligne centrée) │
└──────────────────────────────────────────────────────────────────────────────┘
(pied de page : Mention_Legale 5 pt justifiée, puis « Page X / Y »)
```
> La ligne « Année : AAAA », auparavant présente dans l'en-tête, est retirée : elle est redondante avec le titre « Synthèse {Année} d'indemnité kilométrique ». Le « Frais réel » mensuel = kilomètres du mois × coefficient de la tranche annuelle. Le « Frais payé » = Montant_Regle saisi. La minoration 80% n'apparaît pas dans la synthèse : elle sert uniquement d'indication de versement en cours d'année. Les kilomètres (total annuel, table des mois, formule réelle) sont formatés selon Precision_Distance.
> Le titre « RAPPORT DE TRAJETS » est en majuscules et son bloc titre (titre + sous-titre « Synthèse {Année} d'indemnité kilométrique ») est centré à droite du logo 120 pt ; le bloc d'infos est placé dessous. La ligne « Année : AAAA » reste retirée (redondante avec le titre). Un espace est ajouté après la ligne « Véhicule », puis « Barème applicable » et « Total kilométrique de l'année » sont présentés sur **deux colonnes côte à côte** (même agencement que le bloc totaux du rapport mensuel). Le titre du tableau barème rappelle le mode de calcul en toutes lettres : « Barème applicable pour l'année (N CV) — Kms parcourus × Coef + Base » (les valeurs coef/base effectivement appliquées apparaissent, elles, dans la « Formule réelle » en fin de document). En fin de document, un espace sépare la ligne « Formule réelle » (alignée à gauche) de la ligne « Régularisation (réel − payé) », désormais **centrée** sur la largeur de la page. Le « Frais réel » mensuel = kilomètres du mois × coefficient de la tranche annuelle. Le « Frais payé » = Montant_Regle saisi. La minoration 80% n'apparaît pas dans la synthèse : elle sert uniquement d'indication de versement en cours d'année. Les kilomètres (total annuel, table des mois, formule réelle) sont formatés selon Precision_Distance.
> **Rapports distincts par véhicule** : si la période demandée (mois ou année) contient des Trajets associés à plusieurs Véhicules, le backend génère un fichier PDF distinct par Véhicule. Chaque PDF ne contient que les Trajets et montants du Véhicule concerné.
### En-tête obligatoire (Exigence 7.6)
Tous les PDF incluent en en-tête :
1. Le **logo carré** de l'Application, en haut à gauche (voir « Logo dans l'en-tête » ci-dessous)
2. Titre fixe : **"Rapport de trajets"**, suivi du titre spécifique intégrant la période (`Feuille d'indemnité kilométrique {Mois} {AAAA}` pour le mensuel, `Synthèse {AAAA} d'indemnité kilométrique` pour l'annuel)
1. Le **logo carré** de l'Application, aligné en haut à gauche (voir « Logo dans l'en-tête » ci-dessous)
2. Titre fixe : **"RAPPORT DE TRAJETS"** (en majuscules), suivi du titre spécifique intégrant la période (`Feuille d'indemnité kilométrique {Mois} {AAAA}` pour le mensuel, `Synthèse {AAAA} d'indemnité kilométrique` pour l'annuel) — titre et sous-titre formant un bloc titre **centré** sur l'espace restant à droite du logo
3. Total kilométrique de la période, formaté selon Precision_Distance
### Logo dans l'en-tête (Exigences 7.13)
Le logo carré (`logo-carre.png`, cf. section Charte graphique) est **embarqué comme ressource** dans l'assembly du backend (`Assets/logo-carre.png`, copié depuis les assets du frontend au moment du build) plutôt que lu depuis le système de fichiers, pour rester indépendant du répertoire de travail au runtime. `PdfService` charge ces octets une seule fois via `Assembly.GetManifestResourceStream`, en cache statique, et les insère via `Image().FitWidth()` dans une colonne fixe (45 pt) à gauche de la colonne de texte de l'en-tête, pour les deux rapports (mensuel et annuel). Si la ressource est introuvable (tableau vide), le logo est simplement omis sans faire échouer la génération du PDF.
Le logo carré (`logo-carre.png`, cf. section Charte graphique) est **embarqué comme ressource** dans l'assembly du backend (`Assets/logo-carre.png`, copié depuis les assets du frontend au moment du build) plutôt que lu depuis le système de fichiers, pour rester indépendant du répertoire de travail au runtime. `PdfService` charge ces octets une seule fois via `Assembly.GetManifestResourceStream`, en cache statique, et les insère via `Image().FitWidth()` dans une colonne fixe de **120 pt** (au lieu de 45 pt), alignée en haut (`AlignTop`) à gauche de l'en-tête, pour les deux rapports (mensuel et annuel). Si la ressource est introuvable (tableau vide), le logo est simplement omis sans faire échouer la génération du PDF.
L'en-tête est désormais disposé **en rangée** (`Row`) : le logo à gauche, puis à sa droite une colonne contenant d'abord le **bloc titre centré** (titre « RAPPORT DE TRAJETS » 16 pt gras + sous-titre spécifique 11 pt, chacun en `AlignCenter`), puis, séparé par un espace (`PaddingTop`), le **bloc d'infos** (Utilisateur/Matricule, Domicile, Véhicule, totaux). Un **trait séparateur horizontal** (`LineHorizontal`) est tracé sur toute la largeur de la page sous l'en-tête. Cette disposition remplace l'ancienne superposition `Layers` où le titre était centré sur toute la largeur de la page avec un logo de 45 pt.
### Pied de page (Exigences 7.14)
Le pied de page, commun aux deux rapports, est composé par `ComposerPiedDePage` et comporte deux éléments empilés :
1. La **Mention_Legale** indicative : « Les kilomètres restitués dans le présent document sont déclarés par l'utilisateur sur l'honneur et sous sa seule responsabilité. Le calcul de l'indemnité kilométrique est fourni à titre purement indicatif, sur la base du barème kilométrique officiel en vigueur. SchotzIAD ne saurait être tenue responsable d'une quelconque erreur ou omission dans les données saisies ni du montant résultant du calcul. Le présent document ne constitue pas un justificatif opposable aux administrations. » — rendue en **police 5 pt**, couleur **grise**, **justifiée** (`Justify`), de façon à tenir sur deux à trois lignes.
2. La **pagination** « Page X / Y » (`CurrentPageNumber` / `TotalPages`), centrée en 8 pt, placée **sous** la Mention_Legale.
### Table des Trajets du rapport mensuel (Exigences 7.10, 7.15, 7.16)
La table des Trajets du rapport mensuel (`ComposerTableTrajets`) comporte cinq colonnes : Date (70 pt), Motifs (relative 2), **Départ → Arrivée** (relative 4, maximisée pour que départ et arrivée tiennent majoritairement sur deux lignes), **A/R** (constante 22 pt, largeur minimale) et **Kms** (constante 44 pt, dimensionnée pour afficher jusqu'à « 9 999 » avec séparateur de milliers).
- **Itinéraire** : l'adresse de départ est rendue en première ligne, puis l'adresse d'arrivée **passe à la ligne** en dessous, précédée du symbole « → » (`txt.Line(départ)` suivi de `txt.Span("→ " + arrivée)`).
- **Colonne A/R** : affiche le marqueur « **X** » lorsque le Trajet est un Aller_Retour, et reste vide sinon. Le marqueur « X » est préféré à une coche Unicode (« ✓ ») car la police par défaut Lato ne la rend pas. L'information Aller_Retour n'est plus signalée par le suffixe « (A/R) » dans la cellule itinéraire ; la distance affichée reste la Distance_Effective (déjà doublée) portée par le `TrajetDto`.
- La ligne de total du mois s'étend sur les quatre premières colonnes (`ColumnSpan(4)`) et affiche le total dans la colonne Kms.
### En-tête et fin du rapport annuel (Exigences 7.11, 7.14)
- **Bloc d'infos de l'en-tête** (`ComposerInfosAnnuel`) : un espace (`PaddingTop`) est ajouté après la ligne « Véhicule », puis « Barème applicable » et « Total kilométrique de l'année » sont présentés sur **deux colonnes côte à côte** (`Row` de deux `RelativeItem`), même agencement que le bloc totaux du rapport mensuel.
- **Titre du tableau barème** (`ComposerTableBaremeAnnuel`) : complété pour rappeler le mode de calcul en toutes lettres — « Barème applicable pour l'année (N CV) — Kms parcourus × Coef + Base ». Les valeurs coef/base effectivement appliquées apparaissent, elles, dans la « Formule réelle » en fin de document.
- **Fin du document** (`ComposerTotauxAnnuels`) : la ligne « Formule réelle : … » reste alignée à gauche ; un espace (`PaddingTop`) la sépare de la ligne « Régularisation (réel − payé) : … € », désormais **centrée** (`AlignCenter`) sur la largeur de la page.
### Precision_Distance dans les PDF (Exigence 7.12)