Files
Claude Code DTP Worker 71c1223cc3 [DTP-Worker] Sprint 4 · Générateur barème commissions vendeurs (ERPNext Backend · roadmap L51)
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>
2026-07-30 06:35:03 +00:00

79 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.py` réutilisé +
`builder.py` + schéma draft-07 + CLI `build|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é porte `taux_pct: null` partout, avec un invariant
qui **refuse** tout taux fourni sans `source`.
## 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 un `update_value` du
workflow, un `base_field` Currency du Dossier Vente, un `role_id` RBAC ventes.
Tous les `taux_pct` à `null` (`a_confirmer: true`).
- `commlib/deps.py` — réutilise (`#5`) `is_filled` / `CANONICAL` / `validate`
(import `sys.path`, zéro duplication, zéro pip).
- `commlib/finance.py` — calcul **traçable** `commission = base × taux` façon
`banclib/finance.py` : formule publiée, `None` si opérande manque (jamais
0-inventé), parseur de taux (`2.5` ou `« 2.5 % »`).
- `commlib/builder.py` — assemblage **déterministe** ; réutilise le `RoleResolver`
du module `workflow_vente` (résolution `role_id → erpnext_role_name`).
- `bareme.schema.json` — contrat de sortie draft-07.
- `commissions_gen.py` — CLI `build`/`validate`. **Refuse d'écrire** si un des
**10 invariants** de cross-cohérence casse.
- `fixtures/dossier_exemple.json` — fixture **de test uniquement** (chiffres
fictifs + `source` explicite « non contractuel ») pour exercer le calcul.
- `out/` (commité, hand-off direct) : `commission_plan.json`, `MANIFEST.json`.
- `tests/test_commissions.py`**25 tests `unittest` (stdlib pur)**.
- **CI** : job `crm-commissions-tests` ajouté 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_id` résolu depuis `rbac_50_roles.json` **et** portail `ventes`.
- `devise_field` = champ `devise` (Select USD/DOP · #10).
- **Anti-invention (#6)** : aucun `taux_pct` sans `source` (le barème livré étant
tout `null`, `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é), YAML `ci.yml` valide.
- **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_pct` réels + `source` par 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).