Plan de commissions cross-cohérent workflow ↔ DocType ↔ RBAC + calcul traçable commission = base × taux (façon banclib/finance.py). Anti-invention #6 : aucun taux documenté → taux_pct null partout, invariant refusant tout taux sans source. Commission uniquement sur états soumis (doc_status=1), sur champ Currency réel, pour rôle portail ventes résolu depuis rbac_50_roles.json. - crm/commissions/ : bareme_spec + commlib{deps,finance,builder} + CLI (10 invariants) + schéma draft-07 + fixture test + out/ (hand-off) + 25 tests - .gitea/workflows/ci.yml : job crm-commissions-tests + ajout au gate - daily report session13 + activity log Vérifs : 25/25 tests · gate CI local vert · régression 202 tests verts. Hors périmètre worker (VPS #8) : confirmation taux Direction + câblage calcul. Auto-score 4Big : 96/100. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.6 KiB
Daily Report · 2026-07-30 · Claude Code DTP Worker (session 13)
Session : 20260730_062706
Tâche exécutée
Sprint 4 · ERPNext Backend — Générateur du barème de commissions vendeurs
(roadmap ligne 51 : « commissions vendeurs auto »). C'est la « prochaine tâche
suggérée » de la session 12. Le module produit un plan de commissions
cross-cohérent avec les trois contrats CRM déjà livrés (pipeline vente + DocType
porteur + RBAC) et un calculateur traçable commission = base × taux.
Contexte / analyse
- Relu
CLAUDE.md,ROADMAP_8_WEEKS_OR_LESS.md, les daily reports sessions 11-12 et l'idiome des générateurs (wflib/dvlib/banclib:deps.pyréutilisé +builder.py+ schéma draft-07 + CLIbuild|validate+ tests + job CI + gate). - Constat anti-invention (#6) : aucun taux de commission n'est documenté
(
CANONICAL= 3 % / 8.5 % / 52 %, aucune commission). Fixer un taux serait une invention → le barème livré portetaux_pct: nullpartout, avec un invariant qui refuse tout taux fourni sanssource.
Réalisé — module 05_deliverables_mvp/crm/commissions/
bareme_spec.json— contrat structurel : 5 évènements (réservation, contrat ×3 rôles, CONFOTUR approuvé) référençant chacun unupdate_valuedu workflow, unbase_fieldCurrency du Dossier Vente, unrole_idRBAC ventes. Tous lestaux_pctànull(a_confirmer: true).commlib/deps.py— réutilise (#5)is_filled/CANONICAL/validate(importsys.path, zéro duplication, zéro pip).commlib/finance.py— calcul traçablecommission = base × tauxfaçonbanclib/finance.py: formule publiée,Nonesi opérande manque (jamais 0-inventé), parseur de taux (2.5ou« 2.5 % »).commlib/builder.py— assemblage déterministe ; réutilise leRoleResolverdu moduleworkflow_vente(résolutionrole_id → erpnext_role_name).bareme.schema.json— contrat de sortie draft-07.commissions_gen.py— CLIbuild/validate. Refuse d'écrire si un des 10 invariants de cross-cohérence casse.fixtures/dossier_exemple.json— fixture de test uniquement (chiffres fictifs +sourceexplicite « non contractuel ») pour exercer le calcul.out/(commité, hand-off direct) :commission_plan.json,MANIFEST.json.tests/test_commissions.py— 25 testsunittest(stdlib pur).- CI : job
crm-commissions-testsajouté au gate (.gitea/workflows/ci.yml).
Cross-cohérence barème ↔ workflow ↔ DocType ↔ RBAC (le cœur du livrable)
Les 10 invariants dérivent le barème des contrats voisins (anti-dérive) :
update_value∈ workflow et état soumis (doc_status = 1) : jamais de commission sur un brouillon (lead/visite/devis/abandonné).base_field= champ Currency réel du DocType Dossier Vente.role_idrésolu depuisrbac_50_roles.jsonet portailventes.devise_field= champdevise(Select USD/DOP · #10).- Anti-invention (#6) : aucun
taux_pctsanssource(le barème livré étant toutnull,taux_a_confirmer = 5/5).
Vérifications effectuées (en-repo, sans toucher au VPS)
- 25/25 tests verts (validateur maison + oracle
jsonschema) ; génération : 5 évènements · 4 rôles · 5 taux à confirmer ;out/commité == régénération bit-à-bit. - Gate CI local vert (exit 0) :
guard_constraints.sh,validate_json.sh,check_docs.sh(score présent, 0 lien cassé), YAMLci.ymlvalide. - Régression : 23 Publiciste + 10 RBAC + 16 Faisabilité + 11 fixtures + 12 userperm + 11 roleprofile + 16 apply_plan + 22 bancable + 25 workflow + 31 dossier + 25 commissions = 202 tests verts au total.
Non fait (hors périmètre worker · VPS · #8)
- Confirmation des
taux_pctréels +sourcepar la Direction. - Câblage du calcul de commission sur les transitions du Workflow (champ/table enfant ou DocType commission dédié) → agent ERPNext Backend.
Prochaine tâche suggérée
- Sprint 4 ERPNext Backend : plan e-CF DGII (Compupar) — structure de la facturation électronique fiscale (hand-off, zéro chiffre).
- Sprint 4 Frontend Console : squelette des 5 portails rôle
(Ventes/Construction/Achat/Compta/Direction) façon clone
/waf-home.
Auto-score 4Big du barème commissions : 96/100. Réserve −4 : confirmation des taux réels + câblage du calcul en production = côté VPS (agent ERPNext Backend · #8). Validé statiquement en-repo (25 tests verts + schéma conforme + 10 invariants de cross-cohérence + gate CI · 202 tests de régression au total).