🎓 FormationMarchés & internationalAvancé⏱ 60 min

Réconcilier des paiements multi-pays. 7 chapitres et un QCM final.

Boucler la caisse quand l'entreprise encaisse dans dix pays. Lire un camt.053, un BAI2, un CNAB 240 et un CFONB120 sans se tromper de champ, rapprocher un rapport d'acquéreur du virement reçu, arbitrer entre date de comptabilisation et date de valeur, réconcilier un encaissement mobile money, comptabiliser le change selon IAS 21, puis automatiser sans perdre la piste d'audit.

Chapitre 1. Un pivot unique, deux relevés : camt.053 et BAI2.

Une entreprise présente dans dix pays ne reçoit pas dix relevés comparables. Elle reçoit du XML ISO 20022 de sa banque allemande, du BAI2 de sa banque américaine, du CNAB 240 de sa banque brésilienne, du CFONB120 de sa banque française. Quatre grammaires pour dire qu'un compte a été crédité. La tentation est d'écrire un moteur de rapprochement par pays, un choix qui, à cinq ans, coûte plus cher que tous les autres. La méthode qui tient sépare deux couches, d'un côté des parseurs propres à chaque format, qui produisent tous le même objet, une écriture pivot, de l'autre un moteur qui ne connaît que ce pivot. Ajouter un pays revient alors à écrire un parseur, pas à reprendre les règles métier. Voici les champs que ce pivot doit porter.

  • Identifiant de compte normalisé, IBAN quand il existe, sinon couple (code banque, numéro de compte) plus le pays
  • Devise du compte, en ISO 4217, jamais déduite du pays
  • Montant en unité mineure, entier signé : le signe vient d'une règle de format, pas du parseur générique
  • Sens explicite (crédit ou débit), redondant avec le signe et vérifié contre lui
  • Date de comptabilisation et date de valeur, deux champs distincts, jamais fusionnés
  • Code de nature d'origine, conservé tel quel, plus une famille pivot interne (virement reçu, prélèvement, frais, rejet…)
  • Référence de la banque, l'identifiant que la banque saura retrouver en cas de litige
  • Référence du donneur d'ordre (EndToEndId, référence client, Nosso Número selon le format)
  • Libellé brut intégral, non tronqué, non normalisé
  • Empreinte du fichier source et numéro de ligne, pour remonter à la preuve en une requête
FormatOrigine et zone d'usageUnité physiqueÉcriture du montantDates portées
camt.053ISO 20022, norme mondiale diffusée par les banques de toutes zonesArborescence XML auto-descriptiveDécimal, devise dans l'attribut Ccy, sens dans CdtDbtIndBookgDt (comptabilisation) et ValDt (valeur)
BAI2Bank Administration Institute, banques nord-américaines, également servi en AustralieLignes de champs séparés par des virgules, terminées par /Entier sans séparateur décimal, nature portée par le type codeDate « as-of » du groupe, disponibilité par le champ Funds Type
CNAB 240FEBRABAN, standard d'échange banque-entreprise au BrésilEnregistrements de 240 positions, groupés en lots par serviceEntier à positions fixes, décimales implicitesDate d'occurrence et date de crédit, portées par le segment
CFONB120CFONB, format de relevé de la place françaiseEnregistrements de 120 caractères, sans séparateur14 caractères dont le dernier code à la fois un chiffre et le signeDate de comptabilisation et date de valeur, en JJMMAA
Les quatre familles de relevés qui alimentent ce pivot
🔑
Le signe, puis l'équilibre
Chaque format code le sens autrement, camt.053 séparant le montant et l'indicateur CdtDbtInd, BAI2 le déduisant du type code, CFONB120 l'enfermant dans le dernier caractère du montant. Un parseur qui recopie un entier sans appliquer la règle du format produit un solde faux. Le garde-fou est le même partout, le solde initial plus la somme algébrique des mouvements égalant le solde final. Un fichier qui ne s'équilibre pas ne rentre pas dans le moteur. Exigez de chaque banque un fichier de recette portant un débit, un crédit, un rejet et un solde négatif.

Le camt.053 est le relevé de fin de journée d'ISO 20022. Sa force tient à trois éléments que les formats à positions ne savent pas porter : une devise attachée à chaque montant, deux dates séparées, une classification normalisée de l'opération. Sa faiblesse tient à sa souplesse, deux banques produisant des camt.053 valides et pourtant différents, parce que chacune choisit ce qu'elle structure vraiment et ce qu'elle laisse en texte libre.

camt.053, une entrée de relevé réduite aux champs qui servent au rapprochement
<Ntry>
  <Amt Ccy="EUR">12500.00</Amt>
  <CdtDbtInd>CRDT</CdtDbtInd>
  <BookgDt><Dt>2026-07-10</Dt></BookgDt>
  <ValDt><Dt>2026-07-13</Dt></ValDt>
  <AcctSvcrRef>0004512</AcctSvcrRef>
  <BkTxCd>
    <Domn>
      <Cd>PMNT</Cd>
      <Fmly><Cd>RCDT</Cd><SubFmlyCd>ESCT</SubFmlyCd></Fmly>
    </Domn>
  </BkTxCd>
  <NtryDtls>
    <TxDtls>
      <Refs><EndToEndId>ADYEN-SETTLEMENT-2026-BATCH42</EndToEndId></Refs>
    </TxDtls>
  </NtryDtls>
</Ntry>
  • Avec `Amt` et son attribut `Ccy`, la devise appartient au montant, pas au compte. Un compte multi-devises porte des entrées de devises différentes.
  • `CdtDbtInd` vaut CRDT ou DBIT. Le montant, lui, reste toujours positif : le convertir en entier signé est le travail du parseur.
  • `BookgDt` et `ValDt` portent, dans l'exemple, une comptabilisation le vendredi 10 et une valeur le lundi 13. Trois jours de trésorerie séparent les deux.
  • `BkTxCd` porte trois niveaux tirés des listes de codes externes ISO 20022 : domaine PMNT, famille RCDT (virement reçu), sous-famille ESCT. C'est le champ qui permet d'aiguiller une écriture sans lire le libellé.
  • `AcctSvcrRef` et `EndToEndId` donnent la référence que la banque retrouvera, et celle que le donneur d'ordre a posée. La seconde est la vraie clé de rapprochement automatique.
Dans BAI2 (Bank Administration Institute, deuxième version en 1987), un fichier contient des groupes, un groupe des comptes, un compte des mouvements
# Les lignes commencant par # sont des annotations, absentes du fichier reel.
# 01 en-tete de fichier : emetteur, destinataire, date, heure, id, version 2
01,BANKUS33,ACMECORP,260710,0800,001,,,2/
# 02 en-tete de groupe : date « as-of » de la restitution et devise du groupe
02,ACMECORP,BANKUS33,1,260710,,USD,/
# 03 compte + soldes : type code 010 = solde d'ouverture, en CENTIMES
03,0012345678,USD,010,15234025,,/
# 16 mouvement : type code 142 = credit ACH recu ; funds type Z = disponibilite inconnue
16,142,1250000,Z,0004512,PAYOUT-BATCH-42,ADYEN SETTLEMENT/
# 49 fin de compte : total de controle = somme des montants des 03 et 16, puis nb de lignes
49,16484025,3/
# 98 fin de groupe : total, nombre de comptes, nombre de lignes du groupe
98,16484025,1,5/
# 99 fin de fichier : total, nombre de groupes, nombre de lignes du fichier
99,16484025,1,7/
ChampValeurCe qu'elle dit
Type code (solde)010Solde d'ouverture du compte
Type code (solde)015Solde de clôture du compte
Type code (solde)045Solde de clôture disponible, différent du précédent si des fonds sont encore indisponibles
Type code (résumé)100 / 400Total des crédits / total des débits de la journée
Funds Type0 / 1 / 2Fonds disponibles immédiatement, à un jour, à deux jours ou plus
Funds TypeS / DDisponibilité répartie : les champs suivants détaillent les tranches
Funds TypeV / ZDate de valeur explicite / disponibilité non communiquée
Les codes BAI2 qu'un rapprochement lit en premier (montants toujours écrits en unité mineure, sans séparateur décimal)
🎯 Question éclair
Dans un BAI2, un enregistrement 16 porte le montant 1250000 sur un groupe déclaré en USD. Que vaut ce mouvement ?