Skip to content

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_deptCode 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 colonne Matricule).
  • Ex. Salaires (14) + Ventilation (39), clé Matricule / Matricule52 colonnes ; clé Matricule / Bulletin Matricule53 colonnes.
  • Colonnes homonymes hors clés (ex. Client) : Client (gauche) + Client__droite (droite).

Critères d'acceptance

CritèreStatut
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

ZoneFichier
Moteur frontfront/src/pages/admin/workflows/workflow-croiser.engine.js
Libellés branchesfront/src/pages/admin/workflows/workflow-croiser-branch-display.js
UIfront/src/components/workflows/WorkflowCroiserPanel.vue
Moteur backback/src/api/workflows/execution/workflow-croiser.engine.ts
SQL stagingback/src/api/workflows/staging/workflow-croiser-staging.service.ts

Tests

CoucheFichier
Front unitworkflow-croiser.engine.spec.js
Front unitworkflow-croiser-branch-display.spec.js
Back unitworkflow-croiser.engine.spec.ts
Back unitworkflow-croiser-staging.service.spec.ts

Vérification manuelle

  1. Deux sources avec en-têtes différents → bloc Croiser → paire gauche/droite → prévisualisation OK.
  2. Sauvegarder, relancer workflow : jointure SQL correcte.
  3. Ouvrir un ancien workflow avec joinKeys: ["Code du département"] : paire préremplie gauche/droite identique.