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
RA Updated by Redmine Admin about 2 months ago
- Status changed from Submitted to Spec
RA Updated by Redmine Admin about 1 month ago
- Status changed from Spec to In development
- spec_ref updated (diff)
RA Updated by Redmine Admin about 1 month ago
RA Updated by Redmine Admin about 1 month ago
RA Updated by Redmine Admin about 1 month ago
- File QA-proof-1110.txt QA-proof-1110.txt added
RA Updated by Redmine Admin about 1 month ago
- Status changed from In development to QA
- branch set to feat/1110-contract-pdf-polish
- pr_url set to https://github.com/Scobby-organisation/scobby/pull/58
Développement terminé (TDD) → **PR #58** vers `dev` : https://github.com/Scobby-organisation/scobby/pull/58
**QA — PASS** ✅ (preuve visuelle avant/après de la sortie réelle du builder, même contrat de test)
Preuves jointes :
- `QA-proof-1110-avant-apres.png` — comparatif côte à côte AVANT (master) / APRÈS (#1110).
- `1110-apres-contrat-rendu.png` — rendu après seul.
- `QA-proof-1110.txt` — preuve technique + résultats de tests.
Vérifié :
- Champs société vides (« Adresse du siège social : », « N° SIRET : », « Code APE : » du PRODUCTEUR) **masqués** (AVANT : visibles/inachevé).
- Blocs de signature en **encarts bordés** (#f9fafb / #d1d5db), libellés capitales d'accent.
- Titre centré souligné d'accent, titres d'article à filet, **corps justifié**, tableau à en-tête tramé.
- Champ renseigné conservé, titres jamais retirés (liste curée → zéro faux positif).
Gate : builder 19 passed (9 nouveaux) ; suite unit **131 passed** ; typecheck vert ; non-régression `generateContractPdf`. Promotion vers preprod/master en cours.
RA Updated by Redmine Admin about 1 month ago
- Status changed from QA to Preprod
- deploy_status set to deployed
- preprod_url set to https://preprod-scobby.omdev.tech
- deployed_at set to 06/23/2026
Promotion `dev` → `preprod` : **PR #59 mergée**, CI Jenkins verte → build + push Harbor + déploiement preprod (https://preprod-scobby.omdev.tech). Promotion vers master en cours.
RA Updated by Redmine Admin about 1 month ago
- Status changed from Preprod to Ready to ship
**Promotion complète dev → preprod → master** (CI verte à chaque étape) :
- `dev` : PR #58 (squash) ✅
- `preprod` : PR #59 (merge) ✅ — déploiement preprod
- `master` : PR #60 (merge) ✅ — commit `80b18782`
⏳ **Déploiement PROD en attente du gate manuel Jenkins** (approbation humaine) avant rollout sur scobby.fr. Je ne franchis pas ce gate.
➡️ Une fois le prod confirmé live, passer #1110 en **Shipped** — ce qui permettra enfin de clôturer l'épopée parente **#82** (dernier sous-ticket).
RA Updated by Redmine Admin about 1 month ago
- Status changed from Ready to ship to Shipped
Déploiement PROD confirmé live sur scobby.fr (gate manuel Jenkins approuvé le 2026-06-23). Polish visuel du PDF de contrat désormais en production. Passage en **Shipped**.