Files
oto-enterprise-os-dtp/.gitea/workflows/ci.yml
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

318 lines
14 KiB
YAML
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.
# ============================================================================
# CI · OTO Enterprise OS DTP · Gitea Actions
# ----------------------------------------------------------------------------
# Gate qualité DevOps (roadmap Sprint 1 · GAP_ANALYSIS §7).
# Plateforme : Gitea Actions UNIQUEMENT (CLAUDE.md #2 · JAMAIS GitHub).
# Runner : act_runner enregistré sur le VPS avec le label « ubuntu-latest ».
# Voir ci/README.md pour l'enregistrement du runner.
# Aucune dépendance réseau/marketplace externe hors actions/checkout.
# ============================================================================
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
jobs:
constraints-guard:
name: Contraintes NON-NÉGOCIABLES (CLAUDE.md)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Guard des contraintes
run: bash ci/guard_constraints.sh
validate-json:
name: Validation JSON (schémas Faisabilité)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Valider les JSON
run: bash ci/validate_json.sh
check-docs:
name: Qualité documentaire (liens + 4Big)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Contrôle docs
run: bash ci/check_docs.sh
# --------------------------------------------------------------------------
# Publiciste (Sprint 2) : parser faisabilité → projets_master.json + generator.
# Tests unitaires stdlib pur (unittest) → aucune installation pip requise sur
# le runner. L'oracle jsonschema est utilisé s'il est présent, sinon ignoré.
# --------------------------------------------------------------------------
publiciste-tests:
name: Publiciste · parser + schéma + generator (unittest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/publiciste
steps:
- uses: actions/checkout@v4
- name: Tests unitaires Publiciste
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# RBAC 50 rôles (Sprint 2 · ERPNext Backend) : contrat rbac_50_roles.json vs
# rbac.schema.json. Réutilise le validateur maison Publiciste (pas de pip).
# --------------------------------------------------------------------------
rbac-tests:
name: RBAC · 50 rôles + schéma (unittest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac
steps:
- uses: actions/checkout@v4
- name: Tests contrat RBAC
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur Faisabilité 4 volets (Sprint 2 · Faisabilité) : brief.json →
# data_room/PXX/ (template v1.0). Le round-trip via le parser Publiciste est
# testé ici (générateur → parser → schéma). stdlib pur, aucune install pip.
# --------------------------------------------------------------------------
faisabilite-gen-tests:
name: Faisabilité · générateur 4 volets + round-trip (unittest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/faisabilite/generator
steps:
- uses: actions/checkout@v4
- name: Tests générateur Faisabilité
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de fixtures ERPNext (Sprint 2 · ERPNext Backend) : le contrat
# rbac_50_roles.json → fixtures Frappe `Role` + `Custom DocPerm`. Valide le
# bundle contre fixtures.schema.json + invariants (50 rôles, séparation des
# pouvoirs, round-trip fidèle au contrat). stdlib pur, aucune install pip.
# --------------------------------------------------------------------------
rbac-fixtures-tests:
name: RBAC · fixtures ERPNext (Role + Custom DocPerm)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac/fixtures_gen
steps:
- uses: actions/checkout@v4
- name: Tests générateur de fixtures RBAC
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de plan User Permission (Sprint 2 · ERPNext Backend) : le contrat
# rbac_50_roles.json → plan row-level (scope_donnees → mécanisme Frappe natif +
# template User Permission allow=Company pour la portée `entite`). Valide le
# plan contre userperm.schema.json + invariants (couverture bijective des 50
# rôles, template SSI `entite`, anti-invention utilisateur). stdlib pur.
# --------------------------------------------------------------------------
rbac-userperm-tests:
name: RBAC · plan User Permission (row-level)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac/userperm_gen
steps:
- uses: actions/checkout@v4
- name: Tests générateur de plan User Permission
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de Role Profile (Sprint 2 · ERPNext Backend) : le contrat
# rbac_50_roles.json → un `Role Profile` ERPNext v15 natif par portail (bundle
# de rôles assignable en un geste). Valide le bundle contre
# roleprofile.schema.json + invariants (couverture bijective des 50 rôles, un
# profil par portail, cohérence portail, anti-invention). stdlib pur.
# --------------------------------------------------------------------------
rbac-roleprofile-tests:
name: RBAC · Role Profile (bundles par portail)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac/roleprofile_gen
steps:
- uses: actions/checkout@v4
- name: Tests générateur de Role Profile
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Agrégateur RBAC (Sprint 2 · ERPNext Backend) : recoud les 3 volets RBAC
# (fixtures Role+DocPerm, plan User Permission, Role Profile) en un run-book
# d'application VPS ordonné (SPEC §7) + un manifeste agrégé. Valide contre
# apply_plan.schema.json + invariants (ordre + graphe de dépendances SPEC §7,
# cohérence inter-volets, couverture bijective des 50 rôles). stdlib pur.
# --------------------------------------------------------------------------
rbac-applyplan-tests:
name: RBAC · run-book d'application unifié (agrégat 3 volets)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac/apply_plan
steps:
- uses: actions/checkout@v4
- name: Tests agrégateur RBAC
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de dossier bancable trilingue (Sprint 3 · Faisabilité) : le même
# brief.json → data_room/PXX/50_financier_bancable/{fr,en,es}.md + manifest.json
# (répertoire jusqu'ici vide qu'exige le Portail Bancables 4Big). Figures
# sourcées verbatim + agrégats calculés de façon traçable (formule recoupée).
# Valide le manifeste contre bancable.schema.json + invariants (3 langues,
# bannière CONFIDENTIEL, anti-invention, recalcul des figures). stdlib pur.
# --------------------------------------------------------------------------
bancable-tests:
name: Faisabilité · dossier bancable trilingue FR/EN/ES
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/faisabilite/bancable
steps:
- uses: actions/checkout@v4
- name: Tests générateur bancable trilingue
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de workflow vente ERPNext (Sprint 4 · CRM natif) : le contrat
# pipeline workflow_vente_spec.json (lead → visite → devis → réservation →
# contrat → CONFOTUR) → fixtures Frappe Workflow + Workflow State + Workflow
# Action Master. Rôles résolus depuis rbac_50_roles.json (zéro duplication).
# Valide le schéma de sortie + 9 invariants de graphe (monotonie doc_status,
# atteignabilité, séparation des pouvoirs). stdlib pur, zéro pip.
# --------------------------------------------------------------------------
crm-workflow-vente-tests:
name: CRM · workflow vente ERPNext (lead → CONFOTUR)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/crm/workflow_vente
steps:
- uses: actions/checkout@v4
- name: Tests générateur workflow vente
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur du DocType porteur (Sprint 4 · CRM natif) : doctype_spec.json +
# workflow_vente_spec.json → fixture Frappe `DocType` custom `OTO Dossier
# Vente`, cible du Workflow `OTO Vente Pipeline`. Cross-cohérence workflow ↔
# DocType : champ d'état + valeurs de statut + is_submittable + permissions
# DÉDUITS du pipeline ; rôles résolus depuis rbac_50_roles.json (zéro
# duplication). Valide le schéma de sortie + 12 invariants. stdlib pur, zéro pip.
# --------------------------------------------------------------------------
crm-dossier-vente-tests:
name: CRM · DocType porteur OTO Dossier Vente
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/crm/dossier_vente
steps:
- uses: actions/checkout@v4
- name: Tests générateur DocType Dossier Vente
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Barème commissions vendeurs (Sprint 4 · ERPNext Backend « commissions
# vendeurs auto »). Cross-cohérence barème ↔ workflow ↔ DocType ↔ RBAC : chaque
# évènement paie sur un état SOUMIS, sur un champ Currency réel du Dossier
# Vente, pour un rôle ventes résolu. Anti-invention (#6) : aucun taux fixé
# (taux_pct null tant qu'à confirmer) ; calcul commission = base × taux
# traçable. Valide le schéma de sortie + 10 invariants. stdlib pur, zéro pip.
# --------------------------------------------------------------------------
crm-commissions-tests:
name: CRM · barème commissions vendeurs
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/crm/commissions
steps:
- uses: actions/checkout@v4
- name: Tests générateur barème commissions
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Intégration e-CF DGII (Sprint 4 · ERPNext Backend « e-CF DGII intégration
# (Compupar) »). Génère un plan de configuration de facturation électronique
# dominicaine cross-cohérent : chaque émission se déclenche sur un état SOUMIS
# du workflow, sur un champ Currency réel du Dossier Vente, par le rôle Compta
# Fiscaliste eCF résolu. Anti-invention (#6) : RNC / ITBIS / TipoCambio /
# endpoints Compupar restent null (a_confirmer) — jamais fabriqués ; composeur
# d'e-NCF traçable (E+tipo(2)+seq(10)). Schéma de sortie + 12 invariants +
# FormaPago Cardnet (#10). stdlib pur, zéro pip.
# --------------------------------------------------------------------------
fiscal-ecf-tests:
name: Fiscal · e-CF DGII (Compupar)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/fiscal/ecf_dgii
steps:
- uses: actions/checkout@v4
- name: Tests générateur e-CF DGII
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de Workspaces ERPNext (Sprint 4 · Frontend Console « 5 portails
# rôle »). Un `Workspace` natif v15 par portail métier (Ventes/Construction/
# Achat/Compta/Direction) — le portail de landing par rôle du desk (#1 ERPNext
# natif). Cross-cohérence Workspace ↔ RBAC : chaque lien/raccourci vise un
# DocType présent dans les permissions_cibles du portail (anti-invention #6),
# couverture exhaustive, rôles restreints dérivés du contrat, tokens de marque
# repris de CLAUDE.md #4. Schéma de sortie + 12 invariants. stdlib pur, zéro pip.
# --------------------------------------------------------------------------
frontend-portails-tests:
name: Frontend · Workspaces 5 portails rôle
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/frontend/portails
steps:
- uses: actions/checkout@v4
- name: Tests générateur de Workspaces
run: python3 -m unittest discover -s tests -v
gate:
name: Gate qualité (agrégat)
runs-on: ubuntu-latest
needs: [constraints-guard, validate-json, check-docs, publiciste-tests, rbac-tests, faisabilite-gen-tests, rbac-fixtures-tests, rbac-userperm-tests, rbac-roleprofile-tests, rbac-applyplan-tests, bancable-tests, crm-workflow-vente-tests, crm-dossier-vente-tests, crm-commissions-tests, fiscal-ecf-tests, frontend-portails-tests]
steps:
- name: Résultat
run: echo "✅ Gate qualité 4Big franchi — tous les checks verts."
# --------------------------------------------------------------------------
# E2E baseline (QA · Sprint 1). MANUEL uniquement (workflow_dispatch) : exige
# un serveur live + navigateurs → hors du gate push/PR (checks statiques).
# Cible via DTP_BASE_URL (variable/secret repo). Voir tests/README.md.
# --------------------------------------------------------------------------
e2e-baseline:
name: E2E baseline Playwright (manuel)
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch'
defaults:
run:
working-directory: tests
env:
CI: "true"
DTP_BASE_URL: ${{ vars.DTP_BASE_URL }}
steps:
- uses: actions/checkout@v4
- name: Installer dépendances + navigateurs
run: |
npm install
npm run install:browsers
- name: Lancer la baseline E2E
run: npm test
- name: Publier le rapport
if: always()
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: tests/playwright-report/