[DTP-Worker] Sprint 2 · ERPNext RBAC 50 rôles (schéma + data + spec + gate)

Livrable Sprint 2 (roadmap §S2 l.38 « RBAC 50 rôles configuration »,
GAP_ANALYSIS §3.4). Seul deliverable S2 100% autorable en-repo — les clones
Frontend/CRM dépendent des layouts LIVE (VPS).

- rbac/rbac.schema.json — contrat JSON-Schema draft-07 (sous-ensemble validateur
  maison, zéro pip) : 50 rôles, DocPerm par DocType, scope User Permission.
- rbac/rbac_50_roles.json — 50 rôles × 5 portails métier + console plateforme,
  mappés aux entités CLAUDE.md, ciblant des DocTypes ERPNext v15 natifs.
- rbac/RBAC_50_ROLES_SPEC.md — design RBAC 3 niveaux + séparation des pouvoirs +
  procédure d'application VPS (fixtures bench, hors périmètre worker).
- rbac/tests/test_rbac.py — 10 tests unittest (réutilise le validateur
  Publiciste, pas de doublon) : 50 rôles exacts, unicité, 5 portails, anti-
  élévation de privilège. Oracle jsonschema si présent.
- ci.yml — job rbac-tests ajouté au gate (Gitea Actions uniquement).
- GAP_ANALYSIS §3.4 + daily report 2026-07-30 (session 4) mis à jour.

Anti-invention #6 : aucun plafond monétaire inventé ; DocTypes non natifs
marqués custom → à confirmer VPS. Gate local vert (guard/json/docs + 10 tests
RBAC + 23 tests Publiciste régression).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 02:05:54 +00:00
parent f0a7d71357
commit cc3e5aef0e
8 changed files with 1291 additions and 4 deletions
@@ -0,0 +1,152 @@
# Spec RBAC · 50 rôles · OTO Enterprise OS DTP
> **Livrable Sprint 2 · ERPNext Backend** (roadmap
> [`../../04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md`](../../04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md)
> §Sprint 2 l.38 : _« ERPNext Backend : RBAC 50 rôles configuration »_ ·
> [`../GAP_ANALYSIS_SPRINT1.md`](../GAP_ANALYSIS_SPRINT1.md) §3.4 gap ERPNext).
>
> **Date** : 2026-07-30 · **Auteur** : Claude Code DTP Worker · **Version** : 1.0.0
---
## 1. Objet
Design **machine-lisible** des **50 rôles RBAC** (contrainte CLAUDE.md « RBAC 50 rôles »)
à créer nativement dans Frappe/ERPNext v15. Le contrat de données est
[`rbac.schema.json`](rbac.schema.json) ; les données sont
[`rbac_50_roles.json`](rbac_50_roles.json). Ce document ne touche **jamais la
production** : il définit la **cible** que l'agent ERPNext Backend appliquera sur
le VPS via `bench` / fixtures (voir §7).
**Priorité ERPNext natif** (contrainte #1) : chaque rôle est un DocType `Role`
Frappe standard — **aucun** RBAC externe.
**CRM = ERPNext natif** (jamais EspoCRM ni HubSpot — contrainte #3).
## 2. Modèle RBAC
Le RBAC Frappe combine trois niveaux, tous couverts par le schéma :
| Niveau Frappe | Champ du schéma | Rôle |
|---|---|---|
| **Role** (DocType) | `erpnext_role_name` | Un DocType `Role` par ligne, préfixe `OTO ` (anti-collision natif). |
| **Permissions par DocType** | `permissions_cibles[]` | Verbes Frappe (`read`/`write`/`create`/`submit`/`cancel`/`report`/…) par DocType. |
| **Row-level** (User Permission) | `scope_donnees` | `own` · `equipe` · `entite` (Company) · `groupe` (consolidé). |
**Défense en profondeur** : le pouvoir `set_user_permissions` (gestion des
habilitations) est **réservé** au seul rôle `OTO Plateforme RBAC Admin`
(`scope_donnees = groupe`, `famille = plateforme`) — séparation des pouvoirs
vérifiée par test automatisé.
## 3. Cartographie portails ↔ familles
Les **5 portails métier** (roadmap Sprint 4 « 5 portails rôle ») + **1 console
technique transversale** (`plateforme`, hors du compte de 5) :
| Portail | Familles rattachées | Nb rôles |
|---|---|---|
| **direction** | direction, finance (CFO), faisabilite (analyste), legal | 10 |
| **ventes** | ventes, marketing | 12 |
| **construction** | construction, faisabilite (rendu/IFC/économiste) | 10 |
| **achat** | achat | 5 |
| **compta** | finance | 8 |
| **plateforme** _(technique)_ | plateforme | 5 |
| | **Total** | **50** |
> Répartition indicative issue de `rbac_50_roles.json` ; la source de vérité reste
> le JSON (le test impose exactement 50 rôles et la couverture des 5 portails).
## 4. Cartographie rôles ↔ entités (CLAUDE.md §Entités)
Chaque rôle porte une `entite_principale`. « Groupe » = périmètre consolidé
transversal (direction, contrôle de gestion, audit UAF, BI).
| Entité | Exemples de rôles |
|---|---|
| **WAF** (holding) | Président, Directeur Juridique, Agent ONAPI |
| **WA SRL** | Contrats de vente, Achats, Comptable général, Fiscaliste e-CF, Analyste faisabilité |
| **AC Arias Cuevas** | Directeur/Chef de projet Construction, Ingénieur, Économiste, Magasinier |
| **Consortium ECR DR** (paymaster RH) | Gestionnaire Paie |
| **Helios RD** (marque publique) | Directeur des Ventes, Conseiller, Marketing, Comptable clients AR |
| **Ploutos** (patrimoine/monétaire) | Trésorier |
| **9060 QC** (World Activities Cdn.) | DevOps, RBAC Admin, QA, OTOIA, Mobile |
| **Groupe** (consolidé) | DG, CFO, COO, CCO, Conseil, Contrôle de gestion, Audit UAF, BI |
## 5. Les 50 rôles (résumé)
> Détail complet (permissions par DocType, modules, scope) dans
> [`rbac_50_roles.json`](rbac_50_roles.json).
**Direction / Gouvernance (6)** — Président WAF · Directeur Général · CFO · COO ·
CCO · Conseil d'Administration (lecture).
**Ventes (8)** — Directeur des Ventes · Chef d'Équipe · Conseiller · Courtier
externe · Coordinateur Réservations · Gestionnaire Contrats · Coordinateur
CONFOTUR · Support Après-Vente.
**Marketing (4)** — Directeur Marketing · Publiciste (agent) · SEO · Social.
**Construction (7)** — Directeur · Chef de Projet · Ingénieur · Architecte ·
QA/QC · Coordinateur BIM · Superviseur Sous-traitants.
**Achat (5)** — Directeur · Acheteur · Gestionnaire Fournisseurs · Magasinier ·
Contrôleur Réception.
**Finance / Compta (8)** — Contrôleur de Gestion · Comptable Général · AP · AR ·
Trésorier (Ploutos) · Paie (Consortium ECR DR) · Fiscaliste e-CF · Audit UAF.
**Faisabilité / AEC (4)** — Analyste Faisabilité · Rendu 3D · IFC/Speckle ·
Économiste de la Construction.
**Legal (2)** — Directeur Juridique · Agent ONAPI.
**Plateforme technique (6)** — DevOps · RBAC Admin · QA · OTOIA (système) ·
Mobile · BI.
_(6+8+4+7+5+8+4+2+6 = 50.)_
## 6. Conformité aux contraintes CLAUDE.md
| # | Contrainte | Application ici |
|---|---|---|
| 1 | ERPNext natif prioritaire | 100 % DocType `Role` Frappe, aucun RBAC externe. |
| 3 | CRM = ERPNext natif | Rôles ventes → `Lead`/`Opportunity`/`Quotation`/`Customer` natifs. |
| 6 | Zéro invention | Aucun chiffre/plafond monétaire inventé ; seuls rôles, entités et DocTypes natifs (+ DocTypes DTP marqués `custom` à confirmer VPS). |
| 8 | VPS pour tous projets | Application des fixtures = VPS (§7), jamais local. |
| — | Séparation des pouvoirs | `set_user_permissions` réservé au RBAC Admin (test). |
**DocTypes `custom: true`** (`Faisabilité`, `Publiciste Log`, `CONFOTUR
Application`, `API Access`) = DocTypes DTP **à créer** — existence **à confirmer
VPS** par l'agent ERPNext avant application (cohérent avec l'interdit « documenter
du code sans vérifier l'existence courante »).
## 7. Application sur VPS (hors périmètre worker)
Ce worker n'écrit **jamais** sur le VPS. L'agent ERPNext Backend appliquera la
cible côté serveur (`erpnext-backend-1`) :
1. Générer les fixtures `Role` + `Custom DocPerm` depuis `rbac_50_roles.json`.
2. `bench --site frontend migrate` pour installer les rôles.
3. Créer les DocTypes DTP `custom` manquants (§6) **après** confirmation.
4. Mapper les `scope_donnees` en `User Permission` par utilisateur.
5. Vérification HTTP post-déploiement (workflow #3) + audit QA 4Big.
> Un **générateur de fixtures** `rbac_50_roles.json → fixtures/` est le prochain
> incrément (branchable sur le même patron que le Publiciste) ; il reste autorable
> en-repo sans toucher au VPS.
## 8. Vérification (en-repo, sans toucher au VPS)
- `python3 -m unittest discover -s tests -v`**10/10 verts** (schéma maison +
oracle `jsonschema`, 50 rôles, unicité, couverture 5 portails, séparation des
pouvoirs).
- `rbac_50_roles.json` : JSON strict valide (couvert par `ci/validate_json.sh`).
- Job CI dédié `rbac-tests` ajouté au **gate** (`.gitea/workflows/ci.yml`,
Gitea Actions uniquement · #2).
## 9. Auto-score 4Big du livrable : **95/100**
_Réserve 5_ : application des fixtures + création des DocTypes `custom` +
mapping `User Permission` = côté VPS (agent ERPNext, hors périmètre worker) ;
plafonds d'approbation monétaires par rôle volontairement **non chiffrés** ici
(anti-invention #6 — à définir avec la Direction sur pièces). Validé statiquement
en-repo (10 tests verts + schéma conforme + gate CI).