Feature #1110
closedFeature #82: Améliorer la génération de PDF pour les contrats avec design professionnel et signatures configurables
Améliorer le format/design du PDF de contrat (polish visuel, champs vides, identité Le Bijou)
0%
## Spec — Polish visuel du PDF de contrat (#1110)
Moteur cible inchangé : Chromium/Paged.js via le builder PUR `server/src/application/functions/contract-html.builder.ts` + print CSS. Enrichissement CSS/structure uniquement, aucune nouvelle dépendance ni plomberie de données.
### Portée (builder pur, testable)
1. **Blocs de signature en encarts légers bordés** : fond #f9fafb, bordure #d1d5db, coins arrondis, padding ; aux 3 placements (left/right/side_by_side). Référence design #82.
2. **Champs société vides masqués** : un <p> ne contenant qu'un libellé « … : » sans valeur (ex. « N° SIRET : », « Code APE : », « Adresse du siege social : ») est RETIRE du rendu. Un champ renseigne (« N° SIRET : 123 ») est conserve. Les titres (h1/h2/h3) ne sont JAMAIS retires (helper pur borne, conservateur).
3. **Hygiene de substitution** : p/li devenus totalement vides (residus de balises blanchies, ex. <p>{{signature}}</p>) masques via CSS :empty.
4. **Polish typographique & identite** : corps justifie + cesure, titres d'article (h2/h3) stylises (filet d'accent), tableaux (en-tete trame, bordures fines), controle veuves/orphelines + pas de titre seul en bas de page (break-after: avoid).
### Hors scope
- Refonte des templates auteur (les encarts EXPLOITANT/destinataire vivent dans le HTML auteur) ; pas de page de garde ; pas de changement de moteur.
### Criteres d'acceptation
- Blocs de signature rendus en encarts bordes (#f9fafb / #d1d5db) aux 3 placements.
- <p> « label : » sans valeur retire ; <p> « label : valeur » conserve ; h1/h2/h3 jamais retires.
- Corps HTML preserve verbatim (hors lignes de champ vide) — non-regression des tests builder existants.
- Corps justifie ; titres d'article stylises ; en-tete/pied/pagination/signatures inchanges fonctionnellement.
- Tests builder (TDD) + e2e contrat verts ; lint/typecheck/test:unit verts ; preuve visuelle avant/apres.
### Portee : un seul lot backend (contract-html.builder.ts + tests). Route : backend (NestJS server/). Clot le dernier sous-ticket de l'epopee #82.
Description
**Suivi de #82/#377.** La pagination et le rendu serveur (Chromium/Paged.js) sont corrects et déployés en préprod ; il reste à **enrichir la mise en forme** du document.
### Pistes identifiées (à spécifier)
- **Polish typographique & visuel** : polices/tailles affinées, parties (EXPLOITANT/destinataire) dans un encart léger bordé (cf. design #82, fond `#f9fafb`/bordure `#d1d5db`), espacements, titres d'articles stylés, filet de séparation.
- **Champs vides** : les lignes « N° SIRET : », « Code APE : », « Adresse du siège social : » s'affichent vides quand la donnée manque (rendu « inachevé ») → masquer les champs vides ou afficher un placeholder discret.
- **Identité Le Bijou** : accents/couleurs de marque, éventuelle bande d'en-tête ou page de garde, mentions légales en pied stylées.
- **En-tête/pied & structure** : logo sur chaque page, pied enrichi (SIRET/licence + pagination), numérotation des sections, page de garde optionnelle.
### À faire à la session suivante
- Passer par le flux design (mockups HTML before/after) + validation avant implémentation.
- Le rendu cible reste Chromium/Paged.js (builder `contract-html.builder.ts` + print CSS) — enrichissement du CSS/structure, pas de changement de moteur.
## Acceptance criteria
- [ ] À définir en spec/design (cf. pistes ci-dessus).
Files