Appearance
BDD-131 — Croiser avec paires de colonnes gauche / droite
User story
En tant qu'utilisateur, je veux choisir, pour chaque clé de jointure, une colonne de la source A et une colonne de la source B (même si les noms diffèrent), afin de croiser des fichiers dont les en-têtes ne sont pas identiques.
Ce que signifie la demande métier
Avant : le bloc Croiser ne proposait que les colonnes au même nom sur les deux branches (intersection). Ex. les deux fichiers doivent avoir une colonne id pour joindre sur id.
Maintenant : pour chaque paire de jointure, l'utilisateur choisit explicitement :
- une colonne de la branche gauche (source A / premier prédécesseur),
- une colonne de la branche droite (source B / second prédécesseur),
même si les libellés diffèrent (ex. code_dept ↔ Code du département). Plusieurs paires restent possibles (jointure composite AND).
Colonnes en sortie
- Toutes les colonnes de la branche gauche (choisie par l’utilisateur).
- Toutes les colonnes de la branche droite, avec le suffixe
__droite, sauf une clé de jointure droite qui a exactement le même nom qu’une clé gauche (ex.Matricule/Matricule→ une seule colonneMatricule). - Ex. Salaires (14) + Ventilation (39), clé
Matricule/Matricule→ 52 colonnes ; cléMatricule/Bulletin Matricule→ 53 colonnes. - Colonnes homonymes hors clés (ex.
Client) :Client(gauche) +Client__droite(droite).
Critères d'acceptance
| Critère | Statut |
|---|---|
| UI : deux listes par ligne (gauche / droite), toutes les colonnes de chaque branche | ✅ |
| UI : cartes « Branche gauche/droite » avec nom du fichier dépôt + bloc d’entrée | ✅ |
| UI : choix de la branche gauche (table principale) + bouton « Inverser gauche / droite » | ✅ |
| Ajouter / supprimer plusieurs paires | ✅ |
| Prévisualisation éditeur avec paires asymétriques | ✅ |
Lancer : SQL ON l.col_gauche = r.col_droite par paire ; inner / left inchangés | ✅ |
Workflows existants joinKeys (noms identiques) toujours valides | ✅ |
| Erreurs : colonne absente, branche non connectée, paire incomplète | ✅ |
Tests front workflow-croiser.engine + back staging / engine | ✅ |
| Doc VitePress section Croiser | ✅ |
Sortie : colonnes gauche + droite (__droite), règle 52 / 53 colonnes | ✅ |
Modèle de configuration
Nouveau format (persisté dans workflow_nodes.configuration) :
json
{
"type": "croiser",
"joinKeyPairs": [
{ "left": "code_dept", "right": "Code du département" }
],
"joinType": "inner",
"leftBranchRootNodeId": "uuid-bloc-amont-gauche"
}leftBranchRootNodeId : uuid du prédécesseur direct choisi comme table gauche (l en SQL). Si absent ou invalide, repli sur le tri stable des ids (rétrocompat).
Rétrocompatibilité : lecture de l'ancien format joinKeys: ["id"] ou joinKey: "id" → converti en { left: "id", right: "id" } à l'ouverture du tiroir / à l'exécution. Aucune migration SQL.
Fichiers principaux
| Zone | Fichier |
|---|---|
| Moteur front | front/src/pages/admin/workflows/workflow-croiser.engine.js |
| Libellés branches | front/src/pages/admin/workflows/workflow-croiser-branch-display.js |
| UI | front/src/components/workflows/WorkflowCroiserPanel.vue |
| Moteur back | back/src/api/workflows/execution/workflow-croiser.engine.ts |
| SQL staging | back/src/api/workflows/staging/workflow-croiser-staging.service.ts |
Tests
| Couche | Fichier |
|---|---|
| Front unit | workflow-croiser.engine.spec.js |
| Front unit | workflow-croiser-branch-display.spec.js |
| Back unit | workflow-croiser.engine.spec.ts |
| Back unit | workflow-croiser-staging.service.spec.ts |
Vérification manuelle
- Deux sources avec en-têtes différents → bloc Croiser → paire gauche/droite → prévisualisation OK.
- Sauvegarder, relancer workflow : jointure SQL correcte.
- Ouvrir un ancien workflow avec
joinKeys: ["Code du département"]: paire préremplie gauche/droite identique.
