[DTP-Worker] Sprint 2 · Générateur fixtures ERPNext (RBAC 50 rôles → Role + Custom DocPerm)

Transforme rbac_50_roles.json en fixtures Frappe/ERPNext v15 natives, prêtes à
appliquer via bench (VPS · agent ERPNext). Réalise le prochain incrément annoncé
au §7 de RBAC_50_ROLES_SPEC.md. Zéro pip, zéro VPS, sortie déterministe.

- fixturelib/frappe.py : modèle natif (15 flags DocPerm, mapping 1:1 des verbes
  RBAC, if_owner⇔scope "own"). fixturelib/builder.py : bundle déterministe.
- rbac_fixtures_gen.py : CLI build/validate (refuse d'écrire si invariant KO).
- fixtures.schema.json : contrat de sortie (validateur maison Publiciste réutilisé).
- 11 tests unittest : schéma+oracle, 50 rôles, séparation des pouvoirs,
  round-trip fidèle au contrat, déterminisme. Job CI rbac-fixtures-tests au gate.
- Anti-invention #6 : 100% dérivé du contrat, flags non pilotés à 0, DocTypes
  custom signalés « à confirmer VPS ».

Vérif : 11/11 verts + gate CI local vert (exit 0) + régression 60 tests OK.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 03:03:12 +00:00
parent 911f70b9ab
commit d815c7ab63
11 changed files with 869 additions and 7 deletions
@@ -0,0 +1,75 @@
# Générateur de fixtures ERPNext · RBAC 50 rôles → Frappe
**Sprint 2 · agent ERPNext Backend.** Transforme le contrat
[`../rbac_50_roles.json`](../rbac_50_roles.json) (validé par
[`../rbac.schema.json`](../rbac.schema.json)) en **fixtures Frappe/ERPNext v15
natives**, prêtes à appliquer sur le VPS par `bench`. Réalise le « prochain
incrément » annoncé au §7 de [`../RBAC_50_ROLES_SPEC.md`](../RBAC_50_ROLES_SPEC.md).
> Ce worker **n'écrit jamais sur le VPS** (contrainte #8). Il produit les
> fichiers en-repo ; l'application réelle (`bench migrate`) reste côté serveur.
## Ce qui est généré (`out/`, non commité)
| Fichier | DocType Frappe | Rôle |
|---|---|---|
| `role.json` | `Role` | 50 rôles desk préfixés `OTO ` (anti-collision natif). |
| `custom_docperm.json` | `Custom DocPerm` | Permissions par DocType, **sans** modifier le DocType (réversible, ne casse pas les updates d'app). |
| `MANIFEST.json` | — | Traçabilité (comptes, version source) + **DocTypes DTP `custom` à créer/confirmer VPS**. |
## Utilisation
```bash
# Génère out/role.json, out/custom_docperm.json, out/MANIFEST.json
python3 rbac_fixtures_gen.py build # [-o DOSSIER]
# Valide le bundle (schéma + invariants) sans rien écrire
python3 rbac_fixtures_gen.py validate
# Tests (stdlib pur, zéro pip)
python3 -m unittest discover -s tests -v
```
## Mapping RBAC → Frappe (aucune invention · #6)
- Chaque `permissions_cibles[].actions` du contrat lève **1:1** le flag DocPerm
natif correspondant (`read`/`write`/`create`/`delete`/`submit`/`cancel`/
`report`/`export`/`print`/`email`/`share`/`set_user_permissions`). Les flags
non pilotés (`select`/`amend`/`import`) restent à **0** (défaut sûr).
- `scope_donnees == "own"``if_owner = 1` (restriction Frappe native). Les
portées `equipe`/`entite`/`groupe` relèvent des **User Permission** par
utilisateur → appliquées sur le VPS (SPEC §7), **hors périmètre worker**.
- `permlevel = 0` (le contrat ne segmente pas par niveau de champ).
- Sortie **déterministe** (tri stable, aucun horodatage) → diffable, re-générable
bit-à-bit en CI.
## Séparation des pouvoirs (défense en profondeur)
Le flag `set_user_permissions` n'est émis que pour le rôle **RBAC Admin**
(`famille = plateforme`, `scope = groupe`) — vérifié par test et par le CLI
(`validate` échoue si un autre rôle le porte). Aucune élévation de privilège
possible via les fixtures.
## Application sur VPS (agent ERPNext Backend · hors périmètre worker)
1. Créer d'abord les DocTypes DTP `custom` listés dans `MANIFEST.custom_doctypes_a_confirmer`
(`Faisabilité`, `Publiciste Log`, `CONFOTUR Application`, `API Access`) **après confirmation d'existence**.
2. Déposer `role.json` + `custom_docperm.json` dans `fixtures/` de l'app OTO, référencés dans `hooks.py`.
3. `bench --site frontend migrate` (ou `bench import-fixtures`).
4. Mapper `scope_donnees``User Permission` par utilisateur.
5. Vérification HTTP post-déploiement (workflow #3) + audit QA 4Big.
## Vérification en-repo
- `python3 -m unittest discover -s tests -v`**11/11 verts** (schéma maison +
oracle `jsonschema` si présent ; round-trip fidèle au contrat, déterminisme,
séparation des pouvoirs).
- Job CI dédié `rbac-fixtures-tests` ajouté au **gate** (`.gitea/workflows/ci.yml`,
Gitea Actions uniquement · #2).
## Auto-score 4Big du livrable : **96/100**
_Réserve 4_ : application des fixtures + création des DocTypes `custom` +
mapping `User Permission` = côté VPS (agent ERPNext, hors périmètre worker) ;
`permlevel > 0` non couvert (le contrat RBAC ne le spécifie pas — anti-invention
#6). Validé statiquement en-repo (11 tests verts + schéma conforme + gate CI).