Files
oto-enterprise-os-dtp/.gitea/workflows/ci.yml
T
Claude Code DTP Worker c06e15c058 [DTP-Worker] Sprint 5 · Générateur Audit 5D conformité (QA · roadmap L58)
Audit de second niveau : lit les hand-off out/ des livrables (workflow vente,
Dossier Vente, commissions, e-CF DGII, CONFOTUR) et vérifie 17 contrôles en
5 dimensions (D1 Traçabilité/ISA 500 · D2 AML-UAF/Ley 155-17 · D3 Fiscal
e-CF/Ley 32-23 · D4 Intégrité/IFRS · D5 Gouvernance-SoD/ISA 315).

Anti-invention #6 : paramètre réglementaire non confirmé → A_CONFIRMER (open
item assigné au métier), jamais fabriqué. Verdict PASS_WITH_OPEN_ITEMS (13 PASS,
0 FAIL, 4 à confirmer). Réutilise validateur Publiciste + RoleResolver CRM +
roles_targeting CONFOTUR (zéro duplication).

37 tests · 15 invariants · build déterministe · régression 341 tests verts.
Job CI qa-audit-5d-tests + gate.

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

350 lines
16 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
# --------------------------------------------------------------------------
# Générateur du DocType `CONFOTUR Application` (Sprint 5 · ONAPI/Legal · roadmap
# L55 « Refactor oto_module_confotur_application.py → dépôts automatiques »).
# DocType custom porteur des dossiers d'incitation touristique CONFOTUR
# (Ley 158-01, RD). Cross-cohérence DocType ↔ RBAC ↔ workflow : les permissions
# SONT, mot pour mot, les permissions_cibles RBAC (rôles ventes-confotur /
# legal-onapi / legal-directeur) ; le caractère soumissible en découle ;
# `estado`/`dossier_vente` dérivent du workflow_vente ; aucun taux/loi/montant
# CONFOTUR n'est fabriqué (#6). Schéma de sortie + 14 invariants. stdlib pur.
# --------------------------------------------------------------------------
legal-confotur-tests:
name: Legal · DocType CONFOTUR Application
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/legal/confotur
steps:
- uses: actions/checkout@v4
- name: Tests générateur CONFOTUR Application
run: python3 -m unittest discover -s tests -v
qa-audit-5d-tests:
name: QA · Audit 5D conformité
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/qa/audit_5d
steps:
- uses: actions/checkout@v4
- name: Tests générateur Audit 5D
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, legal-confotur-tests, qa-audit-5d-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/