Files
oto-enterprise-os-dtp/05_activity_log/2026-07-30.md
T
Claude Code DTP Worker c0d2e21ef3 [DTP-Worker] Sprint 4 · Générateur Workspaces ERPNext 5 portails rôle (Frontend Console · roadmap L49)
Livre le dernier volet ouvert de Sprint 4 : Frontend Console « 5 portails
(Ventes/Construction/Achat/Compta/Direction) ». Contrainte #1 (ERPNext natif) :
le portail de landing par rôle EST le DocType Workspace v15 → 5 Workspaces natifs.

Anti-invention (#6) : rôles et DocTypes dérivés du contrat rbac_50_roles.json ;
chaque lien/raccourci vise un DocType présent dans les permissions_cibles du
portail (droit prouvé) ; couverture exhaustive ; flag custom issu du contrat ;
tokens de marque repris verbatim de CLAUDE.md #4. CLI + 12 invariants + 19 tests
(4 négatifs). Régression 260 tests verts. Hand-off VPS #8 documenté.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 07:38:44 +00:00

195 lines
9.7 KiB
Markdown
Raw 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.
# Activity Log · 2026-07-30 · Claude Code DTP
## Session `20260730_072711` (session 15)
**Tâche** : Sprint 4 · Frontend Console — Générateur de **Workspaces ERPNext
(5 portails rôle)** (roadmap ligne 49 « 5 portails (Ventes/Construction/Achat/
Compta/Direction) » ; dernier volet ouvert de Sprint 4, les volets CRM et ERPNext
Backend ayant été livrés sessions 11-14).
**Décision d'architecture (#1 ERPNext natif)** : dans ERPNext v15, le portail de
landing par rôle **EST le DocType `Workspace`** → on livre 5 Workspaces natifs,
pas de framework de dashboard externe.
**Fichiers créés**`05_deliverables_mvp/frontend/portails/` :
- `portails_spec.json` (mise en page seule : cartes/raccourcis/thème · aucun
DocType ni rôle hors contrat)
- `wslib/{__init__,frappe,builder}.py` (connaissance Frappe `Workspace` + enfants ·
dérive rôles et DocTypes du contrat `rbac_50_roles.json`)
- `workspaces_gen.py` (CLI `build`/`validate` · 12 invariants de cross-cohérence)
- `workspace.schema.json` (contrat de sortie draft-07)
- `out/{workspace,MANIFEST}.json` (hand-off) · `tests/test_workspaces.py`
(19 tests dont 4 négatifs) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `frontend-portails-tests` + ajout au `gate`.
**Anti-invention (cœur · #6)** : la source de vérité est le contrat RBAC, jamais
la spec. Tout lien/raccourci vise un DocType présent dans les `permissions_cibles`
du portail (droit prouvé) ; couverture exhaustive sans doublon ; flag `custom`
issu du contrat ; aucun chiffre stocké (compteurs live du desk) ; tokens de marque
(`#0a0a12`/`#f0b429`/Fraunces/Cormorant) repris verbatim de CLAUDE.md #4 avec source.
**Résultat** : 5 Workspaces (Ventes/Construction/Achat/Compta/Direction), 44 rôles
restreints ; console technique `plateforme` exclue (roadmap = 5 portails métier).
**Vérifs** : 19/19 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **260 tests verts** au total ; build déterministe.
**Hors périmètre worker (VPS · #8)** : fixer `Workspace.module` à l'import + créer
les DocTypes custom (`CONFOTUR Application`, `Faisabilité`, `Publiciste Log`) +
appliquer le thème desk → agents ERPNext Backend / Frontend Console.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session15.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session15.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_065711` (session 14)
**Tâche** : Sprint 4 · ERPNext Backend — Générateur de **configuration e-CF DGII
(Compupar)** (roadmap ligne 51 « e-CF DGII intégration (Compupar) » ; les
commissions ayant été livrées session 13, l'e-CF restait ouvert · GAP §Backend).
**Fichiers créés**`05_deliverables_mvp/fiscal/ecf_dgii/` :
- `ecf_spec.json` (catalogue 10 types e-CF DGII · table FormaPago · format e-NCF ·
moneda USD/DOP · RNC/ITBIS/TipoCambio `null` · provider Compupar · 2 évènements
d'émission · `field_map` Dossier Vente → e-CF)
- `ecflib/{__init__,deps,ncf,builder}.py` (réutilise `is_filled`/`CANONICAL`/
`validate` + `RoleResolver` du module `workflow_vente` · composeur e-NCF
traçable `E+tipo(2)+seq(10)` façon `finance.py`)
- `ecf_dgii_gen.py` (CLI `build`/`validate` · 12 invariants de cross-cohérence)
- `ecf.schema.json` (contrat de sortie draft-07)
- `fixtures/dossier_exemple.json` (test only · opérandes fictifs sourcés)
- `out/{ecf_plan,MANIFEST}.json` (hand-off) · `tests/test_ecf_dgii.py`
(39 tests) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `fiscal-ecf-tests` + ajout au `gate`.
**Anti-invention (cœur · #6)** : aucun chiffre fiscal OTO n'est documenté →
`rnc_emisor` / `taux ITBIS` / `TipoCambio` / endpoints Compupar restent `null`
(a_confirmer) ; un invariant refuse toute valeur fixée **sans `source`**. Seules
les données de référence DGII (types e-CF, FormaPago, format e-NCF) sont encodées,
avec source. Le composeur e-NCF reste `None` tant qu'un opérande manque.
**Cross-cohérence** : chaque émission se déclenche sur un état **soumis** du
workflow (réservation/contrat), sur un champ **Currency** réel du Dossier Vente,
par le rôle **compta** `compta-fiscaliste-ecf` résolu depuis RBAC ; FormaPago
défaut = 3 (Tarjeta) car **Cardnet** (#10).
**Vérifs** : 39/39 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **241 tests verts** au total.
**Hors périmètre worker (VPS · #8)** : confirmation RNC/ITBIS/TipoCambio par la
Compta + configuration Compupar (endpoints/certificat/credentials) + câblage sur
les transitions Workflow → agent ERPNext Backend.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session14.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session14.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_062706` (session 13)
**Tâche** : Sprint 4 · ERPNext Backend — Générateur du **barème de commissions
vendeurs** (roadmap ligne 51 « commissions vendeurs auto »).
**Fichiers créés**`05_deliverables_mvp/crm/commissions/` :
- `bareme_spec.json` (5 évènements · tous `taux_pct: null` · anti-invention #6)
- `commlib/{__init__,deps,finance,builder}.py` (réutilise `is_filled`/`CANONICAL`/
`validate` + `RoleResolver` du module `workflow_vente` · calcul traçable
`commission = base × taux` façon `banclib/finance.py`)
- `commissions_gen.py` (CLI `build`/`validate` · 10 invariants de cross-cohérence)
- `bareme.schema.json` (contrat de sortie draft-07)
- `fixtures/dossier_exemple.json` (test only · chiffres fictifs sourcés)
- `out/{commission_plan,MANIFEST}.json` (hand-off) · `tests/test_commissions.py`
(25 tests) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `crm-commissions-tests` + ajout au `gate`.
**Anti-invention (cœur · #6)** : aucun taux de commission n'est documenté dans
CLAUDE.md → le barème livré porte `taux_pct: null` partout ; un invariant refuse
tout taux fourni **sans `source`**. Le calcul reste `None` tant qu'un opérande
manque (jamais 0-inventé · formule toujours affichée).
**Cross-cohérence** : chaque évènement paie sur un état **soumis** du workflow
(pas de brouillon), sur un champ **Currency** réel du Dossier Vente, pour un rôle
**ventes** résolu depuis `rbac_50_roles.json`.
**Vérifs** : 25/25 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **202 tests verts** au total.
**Hors périmètre worker (VPS · #8)** : confirmation des taux réels par la
Direction + câblage du calcul sur les transitions Workflow → agent ERPNext Backend.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session13.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session13.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_055704` (session 12)
**Tâche** : Sprint 4 · CRM — Générateur du **DocType porteur `OTO Dossier Vente`**
(complète le hand-off du workflow vente : le document réel que le Workflow pilote).
**Fichiers créés**`05_deliverables_mvp/crm/dossier_vente/` :
- `doctype_spec.json` (structure métier · zéro chiffre · Projet P01..P09 · USD/DOP)
- `dvlib/{__init__,frappe,builder}.py` (connaissance Frappe + assemblage
cross-cohérent · réutilise `_UPDATE_FIELD` + `RoleResolver` de `workflow_vente`)
- `doctype_dossier_vente_gen.py` (CLI `build`/`validate` · 12 invariants)
- `doctype.schema.json` (contrat de sortie draft-07)
- `out/{doctype_oto_dossier_vente,MANIFEST}.json` (hand-off)
- `tests/test_dossier_vente.py` (31 tests) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `crm-dossier-vente-tests` + ajout au `gate`.
**Cross-cohérence (cœur du livrable)** : 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 depuis `rbac_50_roles.json` (#6).
**Vérifs** : 31/31 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **177 tests verts** au total.
**Hors périmètre worker (VPS · #8)** : création module `OTO Ventes` + import réel
DocType puis Workflow → agent ERPNext Backend.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session12.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session12.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_052701` (session 11)
**Tâche** : Sprint 4 · CRM — Générateur de workflow vente ERPNext
(`lead → visite → devis → réservation → contrat → CONFOTUR`).
**Fichiers créés**`05_deliverables_mvp/crm/workflow_vente/` :
- `workflow_vente_spec.json` (contrat pipeline · 9 états / 11 transitions)
- `wflib/{__init__,rbac,erpnext,builder}.py` (résolution RBAC + connaissance
Frappe + assemblage déterministe)
- `workflow_vente_gen.py` (CLI `build`/`validate` · 9 invariants de graphe)
- `workflow.schema.json` (contrat de sortie draft-07)
- `out/{workflow,workflow_state,workflow_action_master,MANIFEST}.json` (hand-off)
- `tests/test_workflow_vente.py` (25 tests) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `crm-workflow-vente-tests` + ajout au `gate`.
**Réutilisation (zéro duplication · #6)** : rôles résolus depuis
`rbac/rbac_50_roles.json` (jamais de nom Frappe en dur) + validateur maison
Publiciste.
**Vérifs** : 25/25 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **146 tests verts** au total.
**Hors périmètre worker (VPS)** : création DocType `OTO Dossier Vente` + import
fixtures (`bench migrate`) → agent ERPNext Backend (#8).
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session11.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session11.md).
**Auto-score 4Big** : 96/100.