@mostajs/feuille-recette
v0.1.1
Published
Le FEUILLET de recette : un document que l'on LIT et que l'on COCHE — sur papier ou à l'écran, et c'est le même fichier. Compose le feuillet, le rend en PDF, et y pose les champs ok/ko/er avec leur géométrie.
Maintainers
Readme
@mostajs/feuille-recette
Auteur : Dr Hamid MADANI [email protected] · AGPL-3.0-or-later
Le feuillet de recette : un document que l'on lit et que l'on coche. Sur papier ou à l'écran — et c'est le même fichier.
Pourquoi
Un client n'est pas une machine. On ne lui donne pas une API, on lui donne une feuille : ce qu'il
doit faire à gauche, ce qui doit se produire au milieu, et trois cases à droite — ok, ko, er.
Le PDF sorti d'un générateur est pourtant muet sur lui-même : rien n'y dit que le rectangle
situé page 2 à telle coordonnée est la case de l'action T-APP-9. Ce module lui rend la parole —
il pose les champs de formulaire par-dessus les symboles déjà imprimés, sans bordure ni fond,
et rend la géométrie retenue. Imprimé, le feuillet est exactement ce qu'il était ; ouvert, il
se coche ; photographié, il se dépouille.
Les trois issues
| | quand la cocher |
|---|---|
| ok | ce qui était annoncé s'est produit |
| ko | le logiciel marche, mais autrement que le feuillet l'annonce — c'est le document qui a vieilli |
| er | panne : erreur, écran blanc, page qui ne répond pas — c'est le code |
| aucune | l'action n'a pas pu être jouée : la ligne vide se lit « non joué » |
ko et er ne vont pas au même destinataire, et seul le second est urgent.
Usage
import { composer, corpsDe, pageHtml, versPdf, poserChamps } from '@mostajs/feuille-recette';
const { markdown, cases } = composer({
titre: 'ValiTrax — recette · Feuillet chef',
campagne: 'REC-2026-0005', releaseRef: 'v1.4.0', role: 'chef', destinataire: 'M. Bensalem',
lien: 'https://valitrax.mostajs.dev/f/ABCD-1234', code: 'ABCD-1234',
contact: 'Dr Hamid MADANI — [email protected]',
cases: [{ ref: 'T-APP-9', libelle: 'ouvrir la page', attendu: 'la liste apparaît' }],
});
const { html } = corpsDe(markdown, { sautDePage: false });
const plat = await versPdf(pageHtml({ corps: html, titre: 'Feuillet chef' }));
const { pdf, geometrie, champsTexte } = await poserChamps(plat, cases, 'chef-bensalem');casesDe(markdown) fait le chemin inverse, pour un plan écrit à la main.
Ce qu'il faut sur la machine
- un service de rendu HTML → PDF (
DOCME_URL, par défauthttps://docme.amia.fr) ; pdftotext(poppler-utils) — la géométrie se mesure, elle ne se devine pas.
Ces deux exigences sont la raison pour laquelle les feuillets se fabriquent sur un poste, en lot, plutôt que dans une instance de production.
Le symbole dit le sens
○ une option d'un choix exclusif — une action a une issue et une seule → groupe radio.
☐ une case indépendante — plusieurs peuvent être cochées → case à cocher.
C'est là-dessus que poserChamps décide, plutôt que de compter : un comptage se trompe dès qu'un
feuillet porte une ligne de choix hors tableau.
