# ============================================================================ # 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 seo-tests: name: SEO · mots-clés trilingues + schema.org + hreflang runs-on: ubuntu-latest defaults: run: working-directory: 05_deliverables_mvp/seo steps: - uses: actions/checkout@v4 - name: Tests générateur SEO run: python3 -m unittest discover -s tests -v # -------------------------------------------------------------------------- # Chat OTOIA embarqué (Sprint 6 · ERPNext Backend · roadmap L63 « Chat OTOIA # embedded dans chaque portail »). Un `Custom Block` natif v15 (#1) par portail # métier, inséré dans le `content` du Workspace, + sa config runtime (persona # Amélie, langues seo, rôles autorisés, portée de connaissance). Cross-cohérence # Chat ↔ RBAC ↔ Workspaces : `roles_allowed`/`knowledge_scope` = surface RBAC # EXACTE du portail (mêmes valeurs que les Has Role des Workspaces) ; endpoint # OTOIA = null (a_confirmer · #6/#8). Schéma de sortie + 14 invariants. stdlib pur. # -------------------------------------------------------------------------- chat-otoia-tests: name: Chat OTOIA · montage par portail (Custom Block) runs-on: ubuntu-latest defaults: run: working-directory: 05_deliverables_mvp/frontend/chat_otoia steps: - uses: actions/checkout@v4 - name: Tests générateur Chat OTOIA run: python3 -m unittest discover -s tests -v # -------------------------------------------------------------------------- # Audit 4Big qualité (Sprint 7 · QA · roadmap L69 « Audit 4Big niveau 95+/100 # sur 100% deliverables »). Audit de MÉTA-NIVEAU : note la qualité 4Big de TOUS # les livrables gated (documentation, contrat schema, couverture de tests, CLI # reproductible, intégrité du hand-off out/) et exige ≥ 95/100 sur chacun # (CLAUDE.md #5). Le périmètre « 100% » est PROUVÉ : le registre est recoupé # bijectivement avec les working-directory du CI (moins l'auditeur · SoD ISA # 315). Anti-invention (#6) : chaque note est RECALCULÉE depuis des faits du # dépôt, jamais saisie. Schéma de sortie + invariants. stdlib pur, zéro pip. # -------------------------------------------------------------------------- qa-audit-4big-tests: name: QA · Audit 4Big (95+/100 sur 100% deliverables) runs-on: ubuntu-latest defaults: run: working-directory: 05_deliverables_mvp/qa/audit_4big steps: - uses: actions/checkout@v4 - name: Tests générateur Audit 4Big 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, seo-tests, chat-otoia-tests, qa-audit-4big-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/