# Rapport — v3.13.5 (facture PDF : mise en page intelligente + dernières retouches)

**Lot du socle, un commit : se livre aux DEUX installations, à l'identique.
Aucune migration, aucune dépendance.**

## A — Retouches fixes (les deux densités)

- **« FACTURE N° 16-2026 » sur une seule ligne** : le numéro rejoint le mot FACTURE
  (`.facture-num`, gras, 18 px, insécable — un « 05-2026 bis » tient) ; la méta dessous ne
  porte plus que Date (+ Échéance).
- **Désignation ≥ 58 %** (62 % quand les numéros de lignes sont masqués ; 65/69 % sans colonne
  Unité), prise sur N° (5→4 %), Qté (7→5 %) et Unité (8→7 %) ; PU HT / Total HT à 13 % chacun
  (≈ 2,5 cm : « 1 234 567,89 » passe large, rien ne se tronque).
- **Marges haut/gauche/droite : 1,0 cm** ; marge basse inchangée (1,8 cm — le pied 2 lignes de
  v3.13.3, toujours ancré dans la marge, répété au bas de chaque page).
- **Cadre du cachet : 49 %** de la largeur (Règlement 51 %, contenu intact) ; images cachet et
  signature agrandies en proportion (max-height 56 px en confort, 42 px en compact).

## B — Densité adaptative (le cœur du lot)

`App\Support\DensitePdf::resoudre($view, $data)` — le choix se fait par **mesure du rendu
dompdf réel** (comptage de pages du canvas), jamais par heuristique au nombre de lignes :

1. rendu **confort** (aéré — l'esprit d'avant v3.13.3 : paddings de lignes 7 px, blocs 16 px,
   signature 80 px) → s'il tient sur **1 page**, on le garde : une facture courte ne paraît
   pas vide ;
2. sinon rendu **compact** (la densité v3.13.3) → s'il tient sur 1 page, on le garde ;
3. sinon retour au **confort multi-pages** : mieux vaut deux pages aérées qu'une compression
   illisible. Le rendu confort de l'étape 1 est **réutilisé tel quel** (dompdf mémorise son
   rendu) : jamais plus de deux rendus par génération.

Le gabarit porte les deux préréglages (chaque espacement a ses deux valeurs) et marque la
densité retenue sur le `<body>` (`densite-confort` / `densite-compact`). Un rendu direct de la
vue sans densité (tests de contenu, aperçus) tombe sur **compact** — le rendu en vigueur avant
ce lot (non-régression).

**Branché partout où le PDF de facture se génère** : le téléchargement / l'aperçu
(`InvoiceDocumentController::show`) et la pièce jointe des e-mails du Courrier
(`FabriqueDeMessage::pieceGeneree`) — le PDF envoyé est identique au PDF téléchargé.

**Devis : non concerné, à dessein.** `pdf.quote` est un gabarit distinct resté sur la mise en
page d'avant v3.13.2 (marges larges, pied non ancré, aucun préréglage de densité) : lui
appliquer la densité adaptative exigerait d'abord de refaire sur lui tout le travail
v3.13.2 → v3.13.5 (pied dans la marge, deux densités, retouches). Ce n'est pas « un coût
faible » — à traiter dans un lot dédié si l'exploitant le souhaite.

## Recette (tout au vert, sur rendu dompdf réel)

- Facture **3 lignes** → **confort**, 1 page (densité prouvée par la valeur retournée du
  résolveur ; marqueur `densite-…` testé sur le HTML rendu). — `InvoicePdfLayoutTest`, `InvoicePdfViewTest`
- Facture **profil 16-2026** (10 lignes, 2 sections, RAS TVA + IS, RIB, signature) →
  **compact**, 1 page. — `InvoicePdfLayoutTest`
- Facture **40 lignes** → **confort**, ≥ 2 pages, pagination propre (en-tête de tableau
  répété, pied 2 lignes au bas de chaque page, totaux/signature en fin de page bien remplie —
  vérifié aussi visuellement sur les PDF générés). — `InvoicePdfLayoutTest`
- Retouches §A visibles (numéro sur la ligne FACTURE, largeurs 58/62 %, cachet 49 %). —
  `InvoicePdfViewTest`
- Non-régression : les 24 fixtures rendent sans marquage nouveau, contenu identique — seule
  la densité varie. Suite complète verte + `pint` + `npm run build`.

## Fichiers touchés

- `app/Support/DensitePdf.php` (nouveau) — résolveur confort/compact par mesure
- `resources/views/pdf/invoice.blade.php` — deux préréglages, en-tête une ligne, largeurs,
  marges 1,0 cm, cachet 49 %, marqueur de densité
- `app/Http/Controllers/InvoiceDocumentController.php` — génération via le résolveur
- `app/Services/Courrier/FabriqueDeMessage.php` — pièce jointe e-mail via le résolveur
- `tests/Feature/Invoices/{InvoicePdfLayoutTest,InvoicePdfViewTest}.php`
