Appearance
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 + NlorsquerowsIn > 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 ALLpar ligne de synthèse) viaWorkflowLigneSyntheseStagingService. - 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 :
labelColumnreçoitrowLabel(ex. « CA », « Nb ») ;- chaque entrée
metrics[]remplit sa colonne cible avec le résultat defn; - 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ôle | Chemin |
|---|---|
| Moteur front | front/src/pages/admin/workflows/workflow-ligne-synthese.engine.js |
| Panneau UI | front/src/components/workflows/WorkflowLigneSynthesePanel.vue |
| Moteur back | back/src/api/workflows/execution/workflow-ligne-synthese.engine.ts |
| Staging SQL | back/src/api/workflows/staging/workflow-ligne-synthese-staging.service.ts |
| Options type traitement | front/src/pages/admin/workflows/workflow-treatment-type-options.js |
API
PUT /workflows/:uuid/canvas:nodes[].configpour les nœudstraitement(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, E2Eadmin-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, E2Eworkflows-controller.e2e-spec.ts(persistance canvas).
