Skip to content

BDD-134 — Traitement Ligne de synthèse (Option A)

Objectif

Permettre à l’administrateur d’ajouter une ou plusieurs lignes de synthèse en fin de jeu de données, chacune avec un libellé explicite et un agrégat (ex. CA = SUM(montant), Nb = COUNT(produit)), sans tableur externe.

Périmètre livré (Option A)

  • Sous-type Traitement : ligne_synthese (libellé UI : Ligne de synthèse).
  • Même schéma de colonnes que l’amont ; +N lignes en fin de tableau (rowsOut = rowsIn + N lorsque rowsIn > 0, N = nombre de lignes configurées).
  • Chaque entrée rows[] = 1 libellé + 1 opération (SUM, COUNT, COUNT DISTINCT, AVG, MIN, MAX) sur une ou plusieurs colonnes (metrics[]).
  • Prévisualisation éditeur alignée sur le run (moteur partagé front/back).
  • Exécution run : staging SQL (UNION ALL par ligne de synthèse) via WorkflowLigneSyntheseStagingService.
  • Validation avant Lancer ; erreurs sanitizées (colonne inconnue, SUM non numérique).
  • Rétrocompatibilité : l’ancien format rowLabel + aggregates[] est migré automatiquement en plusieurs lignes.

Comportement — une ligne de synthèse = un libellé + une opération + N colonnes

Chaque élément de rows[] produit une ligne en fin de tableau :

  • labelColumn reçoit rowLabel (ex. « CA », « Nb ») ;
  • chaque entrée metrics[] remplit sa colonne cible avec le résultat de fn ;
  • les autres colonnes restent vides ('').

Exemple : une ligne « Nb » en COUNT peut compter produit et code_sexe sur la même ligne de synthèse. Une seconde ligne « Total » en SUM peut additionner montant. COUNT DISTINCT compte les valeurs distinctes non vides (ex. nombre de matricules uniques).

Comportement — amont vide

Si rowsIn === 0, la sortie staging est vide (0 ligne) : pas de ligne de synthèse orpheline.

Format de configuration JSONB

json
{
  "type": "ligne_synthese",
  "rows": [
    {
      "rowLabel": "Nb",
      "labelColumn": "type_ligne",
      "fn": "COUNT",
      "metrics": [
        { "sourceColumn": "produit", "targetColumn": "produit" },
        { "sourceColumn": "code_sexe", "targetColumn": "code_sexe" }
      ]
    },
    {
      "rowLabel": "CA",
      "labelColumn": "type_ligne",
      "fn": "SUM",
      "metrics": [
        { "sourceColumn": "montant", "targetColumn": "montant" }
      ]
    }
  ]
}

L’ancien format aggregate (1 colonne par ligne) et aggregates[] (top-level) sont migrés automatiquement.

Fichiers principaux

RôleChemin
Moteur frontfront/src/pages/admin/workflows/workflow-ligne-synthese.engine.js
Panneau UIfront/src/components/workflows/WorkflowLigneSynthesePanel.vue
Moteur backback/src/api/workflows/execution/workflow-ligne-synthese.engine.ts
Staging SQLback/src/api/workflows/staging/workflow-ligne-synthese-staging.service.ts
Options type traitementfront/src/pages/admin/workflows/workflow-treatment-type-options.js

API

  • PUT /workflows/:uuid/canvas : nodes[].config pour les nœuds traitement (type: "ligne_synthese").

Tests

  • Front : workflow-ligne-synthese.engine.spec.js, workflow-traitement-preview.pipeline.spec.js, workflow-traitement.sync.spec.js, workflow-run-validation.spec.js, E2E admin-workflows.spec.js (aperçu SUM).
  • Back : workflow-ligne-synthese.engine.spec.ts, workflow-ligne-synthese-staging.service.spec.ts, workflow-run-staging-execution.service.spec.ts, E2E workflows-controller.e2e-spec.ts (persistance canvas).