lumnik. / scénarios Tous les scénarios · English

Un relevé CFONB où le signe se cache dans le dernier chiffre

Objectif Lire le relevé bancaire CFONB 120 comme une table: chaque mouvement signé, rattaché à son relevé, avec son payeur et sa facture.

Les banques envoient encore leurs relevés au format CFONB 120.

La trésorerie veut chaque mouvement signé, avec ses compléments.

RELEVE_00098765432_20261017.txt
0112345    00001EUR2 00098765432  151026  151026                                          0000000012500{                
0412345    00001EUR2 0009876543205161026  161026PRLV SEPA ENERGIE DU SUD         0000101  0000000000845}ECH-2026-10     
0512345    00001EUR2 0009876543205161026     LIBECHEANCE OCTOBRE CONTRAT 4471                                           
0412345    00001EUR2 0009876543205161026  161026VIR SEPA RECU                    0000102  0000000012000{F-2026-118      
0512345    00001EUR2 0009876543205161026     NPYMARTIN SARL                                                             
0512345    00001EUR2 0009876543205161026     RCNFACTURE F-2026-118                                                      
0412345    00001EUR2 0009876543205161026  161026CARTE 1510 STATION LYON          0000103  0000000000362}                
0712345    00001EUR2 00098765432  161026  161026                                          0000000023293{                
0112345    00001EUR2 00098765432  161026  161026                                          0000000023293{                
0412345    00001EUR2 0009876543205171026  171026FRAIS TENUE DE COMPTE            0000104  0000000000100}                
0712345    00001EUR2 00098765432  171026  171026                                          0000000023193{                
manifests/20-statement-line.yaml
kind: Entityname: statement_line_blabel: Ligne de relevédescription: "One record of a CFONB 120 bank statement: its code, its statement, the movement it belongs to, its amount."match: [line]scopes: [treasury-b]columns:  line: { label: "Enregistrement" }  record: { label: "Code" }  statement_date: { label: "Relevé du" }  account: { label: "Compte" }  movement: { label: "Mouvement" }  op_date: { label: "Date d'opération" }  label: { label: "Libellé" }  qualifier: { label: "Qualifiant" }  info: { label: "Complément" }  amount: { label: "Montant" }sources:  - table: t_scenario_cfonb_b    map: { line: line, record: record, statement_date: statement_date, account: account, movement: movement, op_date: op_date,           label: label, qualifier: qualifier, info: info, amount: amount }
$ lm entity get statement_line_b --filter movement=0000102
LINE                                                                                                                      RECORD  STATEMENT_DATE  ACCOUNT      MOVEMENT  OP_DATE     LABEL          QUALIFIER  INFO                AMOUNT  _CONFLICTS
0412345    00001EUR2 0009876543205161026  161026VIR SEPA RECU                    0000102  0000000012000{F-2026-118        04      2026-10-15      00098765432  0000102   2026-10-16  VIR SEPA RECU                                 1200    {}
0512345    00001EUR2 0009876543205161026     NPYMARTIN SARL                                                               05      2026-10-15      00098765432  0000102                              NPY        MARTIN SARL                 {}
0512345    00001EUR2 0009876543205161026     RCNFACTURE F-2026-118                                                        05      2026-10-15      00098765432  0000102                              RCN        FACTURE F-2026-118          {}

Limites

  • Le signe est décodé par un script Kotlin de l'opérateur: aucun hook livré ne lit un montant à signe incorporé.
  • Les compléments d'un mouvement sont une lecture filtrée (--filter movement=…); rien ne les replie sur une ligne.
  • Fichier synthétique, banque, compte et payeurs fictifs.

Trésorerie · relevé bancaire

Ce virement, qui l'a payé?

Le relevé CFONB le dit, en 120 caractères.

Sans séparateur, le signe caché dans le dernier chiffre.

Fichier synthétique, banque et payeurs fictifs

Le problème

Le relevé n'est pas une table.

  • 0000000000845}: −84,50.
  • Le payeur est sur la ligne d'après.
  • Rien ne relie la ligne au virement.

Rien n'est modifié

Le fichier de la banque reste tel quel.

  • lumnik découpe chaque enregistrement.
  • Il signe chaque montant.
  • Il rattache payeur et facture au virement.

Ce qu'il a fallu écrire

- fill-down:
    columns: [movement]
    reset-when: { column: record,
                  in: ["01", "07"] }

Le complément rejoint son mouvement.

Le scénario complet tient en 3 fichiers, 69 lignes, dont un script de 14 lignes.

Les réponses

Chaque mouvement signé, les soldes justes.

  • 1 250,00 − 84,50 + 1 200,00 − 36,20 = 2 329,30.
  • 0000102: MARTIN SARL, facture F-2026-118.

La limite

Le signe demande un script.

  • Aucune règle livrée ne lit un signe incorporé.
  • Les compléments restent des lignes, lues par filtre.

Essayer

Le scénario se rejoue de bout en bout.

Un connecteur, un script, une entité: chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →