DocType custom cible du Workflow OTO Vente Pipeline. Cross-cohérence workflow↔DocType : nom/champ d'état/valeurs de statut/is_submittable/permissions tous dérivés de workflow_vente_spec.json (source unique, anti-dérive). Rôles résolus via rbac_50_roles.json (#6). CLI build|validate · 12 invariants · 31 tests. Job CI crm-dossier-vente-tests ajouté au gate. Régression 177 tests verts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DocType porteur · OTO Dossier Vente
Sprint 4 · CRM natif ERPNext. Génère le DocType custom porteur du
pipeline vente : le document réel qui circule dans le Workflow OTO Vente Pipeline produit par ../workflow_vente/. Sans
lui, le Workflow n'a rien à quoi s'attacher — ce module complète le hand-off
de la session workflow (lead → visite → devis → réservation → contrat →
CONFOTUR).
Ce worker n'écrit jamais sur le VPS (contrainte #8). Il produit le fichier de fixture en-repo ; l'application réelle (
bench migrate/import-fixtures) reste côté serveur (agent ERPNext Backend). Le DocType doit être importé AVANT le Workflow qui le cible.
Ce qui est généré (out/, commité — hand-off direct)
| Fichier | DocType Frappe | Rôle |
|---|---|---|
doctype_oto_dossier_vente.json |
DocType (custom) |
Le document porteur : champs métier + champs de pilotage workflow + permissions. |
MANIFEST.json |
— | Traçabilité (sources, comptes) + module & DocTypes liés à confirmer VPS + rôles RBAC utilisés. |
Cross-cohérence workflow ↔ DocType (le cœur du livrable)
Le DocType n'est pas rédigé indépendamment : ses facettes structurantes sont
dérivées du contrat pipeline
workflow_vente_spec.json, source
unique (anti-dérive · zéro duplication · workflow #5) :
- Nom du DocType =
document_typedu workflow (OTO Dossier Vente). - Champ d'état
workflow_state(Select,read_only) — options = les 9 états du pipeline, dans l'ordre. - Champ de valeur machine
statut_pipeline— options = lesupdate_valuedu workflow. Le nom du champ est importé deworkflow_vente/wflib/builder.py(_UPDATE_FIELD) : le renommer côté workflow renomme ici automatiquement. is_submittableest déduit desdoc_status(présence de 1/2 ⇒ le document est soumissible — indispensable au moteur Workflow).- Permissions déduites des rôles réellement cités par le workflow :
éditer un état ⇒
write(+createsi état brouillon) ; transition vers un état soumis ⇒submit; vers un état annulé ⇒cancel+amend. Les noms de rôle Frappe sont résolus depuisrbac_50_roles.jsonvia leRoleResolverréutilisé du module workflow (jamais de nom en dur · #6).
Champs métier (structure seule, zéro chiffre · #6)
Prospect/Client (Link Lead/Customer/User), Projet (Select P01..P09
ancré sur CLAUDE.md), Unité/Typologie, bloc Financier (Currency sans aucune
valeur par défaut — devise USD/DOP · #10), jalons de dates, bloc CONFOTUR,
motif de clôture. Un fixture DocType est un schéma : il ne porte aucun
montant fabriqué.
Utilisation
python3 doctype_dossier_vente_gen.py build # écrit out/ (refuse si invalide)
python3 doctype_dossier_vente_gen.py validate # schéma + 12 invariants, sans écrire
python3 -m unittest discover -s tests -v # 31 tests (stdlib pur)
Les 12 invariants (le CLI refuse d'écrire si l'un casse)
- Conformité au schéma de sortie. 2. Nom ==
document_typedu workflow. 3.customcohérent avec le workflow. 4. Champ d'état = Selectread_only, options == noms d'états. 5. Champstatut_pipeline= options ==update_value. 6.is_submittable== (doc_status max ≥ 1). 7.field_order== champs, noms uniques. 8.naming_series+autonamecohérents. 9. Tout rôle du workflow présent en permission. 10. Capacités déduites correctes (write/create/ submit/cancel). 11. Anti-invention : aucunCurrencyavec défaut. 12. Comptes du manifeste cohérents.
Hand-off VPS (agent ERPNext Backend · hors périmètre worker · #8)
- Créer le module
OTO Ventes(ou remapper) et confirmer les DocTypes liés natifs (Lead,Customer,User). - Importer
doctype_oto_dossier_vente.json. - Ensuite importer le Workflow
crm/workflow_vente/out/workflow.json(il cible ce DocType).
Auto-score 4Big : 96/100. Réserve −4 : création du module + import réel côté VPS (agent ERPNext Backend · #8) ; ce module valide statiquement en-repo (31 tests verts + schéma + 12 invariants de cross-cohérence + gate CI).