Rapprochement bancaire sur relevé SFTP
Ce workflow récupère le relevé bancaire quotidien déposé sur un serveur SFTP, enrichit chaque transaction, archive le fichier traité puis prévient l'équipe trésorerie.
Chargement du diagramme…
Le besoin
L'équipe trésorerie rapproche chaque jour les transactions du relevé bancaire. Le relevé quotidien est déposé sur un serveur SFTP : il faut le lire, enrichir chaque ligne (solde courant, montants anormaux), archiver le fichier traité puis notifier la trésorerie.
Ce que fait le flux
- Nouveau relevé bancaire — le déclencheur Fichier (source
FTP_SFTP) surveille le répertoire de dépôt et déclenche le flux à l'arrivée du fichier ; son nom arrive dansdata.filename. - Lire le relevé SFTP — le nœud FTP — Lire charge le contenu du fichier dans
context.file(si le fichier est un JSON valide, il est parsé automatiquement en objet). - Enrichir les transactions — le nœud Code découpe le CSV ligne par ligne, calcule le solde courant et signale les montants supérieurs à 5 000 € ; le résultat est publié dans
context.variables(liste, solde, nombre de montants anormaux). - Archiver le relevé — le nœud FTP — Déplacer déplace le fichier du répertoire
releves(point A) versarchive(point B), pour conserver une trace sans retraiter le même fichier. - Notifier la trésorerie — un e-mail résume le nombre de transactions, le solde calculé et les montants signalés.
Ce dont vous avez besoin
- Un déclencheur Fichier (source
FTP_SFTP) qui surveille le répertoire de dépôt. - Les nœuds FTP (Lire, Déplacer), le nœud Code et le nœud Envoi e-mail.
Construction
Copiez la définition du workflow et collez-la dans l'éditeur (le nœud Déclencheur est recréé automatiquement, il n'est pas dans le snippet) :
[
{
"id": "read-110",
"name": "Lire le relevé SFTP",
"config": {
"type": "READ_FILE_FROM_FTP",
"filePath": "/banque/releves/{{ data.filename }}",
"parseAs": {
"type": "RAW"
},
"fileKey": "file",
"stopWorkflowOnFailure": true
},
"parents": [
"trigger"
],
"position": {
"x": 0,
"y": 200
},
"next": "code-110"
},
{
"id": "code-110",
"name": "Enrichir les transactions",
"config": {
"type": "CODE",
"code": "const raw = typeof context.file === 'string' ? context.file : JSON.stringify(context.file);\nconst transactions = [];\nlet balance = 0;\nlet flagged = 0;\n\nraw.split('\\n').forEach((line, index) => {\n if (index === 0 || !line.trim()) return;\n const [date, label, amount] = line.split(';');\n const value = Number(amount);\n if (Number.isNaN(value)) return;\n balance += value;\n const transaction = { date, label, amount: value, balance };\n if (Math.abs(value) > 5000) {\n transaction.flagged = true;\n flagged += 1;\n }\n transactions.push(transaction);\n});\n\ncontext.variables.transactions = transactions;\ncontext.variables.balance = balance;\ncontext.variables.flaggedCount = flagged;\n\nreturn { transactions, balance, flaggedCount: flagged };"
},
"parents": [
"read-110"
],
"position": {
"x": 0,
"y": 400
},
"next": "move-110"
},
{
"id": "move-110",
"name": "Archiver le relevé",
"config": {
"type": "MOVE_FILE_FROM_FTP",
"sourcePath": "/banque/releves/{{ data.filename }}",
"destinationPath": "/banque/archive/{{ data.filename }}",
"stopWorkflowOnFailure": true
},
"parents": [
"code-110"
],
"position": {
"x": 0,
"y": 600
},
"next": "email-110"
},
{
"id": "email-110",
"name": "Notifier la trésorerie",
"config": {
"type": "SEND_EMAIL",
"to": [
"tresorerie@banque-partenaires.fr"
],
"subject": "Relevé bancaire traité : {{ data.filename }}",
"content": "{{ context.variables.transactions.length }} transactions, solde de {{ context.variables.balance }} €, dont {{ context.variables.flaggedCount }} montant(s) supérieur(s) à 5 000 €.",
"sendAsHtml": true
},
"parents": [
"move-110"
],
"position": {
"x": 0,
"y": 800
}
}
]
Vérifier que ça marche
- Format du CSV : le nœud Code saute l'en-tête puis découpe chaque ligne avec
split(';')surdate;libellé;montant. - Données attendues :
filePath(lecture) etsourcePath(déplacement) utilisent{{ data.filename }}; le contenu est chargé danscontext.file, la clé de sortie par défaut du nœud FTP — Lire. - Enchaînement : l'e-mail n'est envoyé qu'une fois le déplacement réussi ; avec
stopWorkflowOnFailure: true, un échec d'archivage arrête le flux sans notifier. - Déployez le flux (Déployer un flux), puis déclenchez le scénario réel : chaque exécution génère une trace consultable (Visualiser les traces).
Variantes
- Adaptez le séparateur ou la structure du CSV si le relevé bancaire diffère du format
date;libellé;montant. - Si le nom du fichier n'est pas disponible, listez le répertoire avec un nœud FTP — Lister puis sélectionnez le fichier le plus récent.
- La clé de sortie du nœud FTP — Lire (
context.file) est personnalisable dans la configuration du nœud.
Pour aller plus loin
Voir aussi : Exemples et intégrations