Skip to main content

Document d'Architecture Technique (DAT)

Produit Cash Pooling - MVP


Version: 1.0
Date: Fevrier 2026
Classification: Document technique interne
Statut: Initial


Table des matieres

  1. Introduction et contexte
  2. Vue d'architecture globale
  3. Responsabilites par composant
  4. Modele de donnees canonique
  5. Fonctionnement batch et regles metier
  6. Points non couverts volontairement
  7. Annexes

1. Introduction et contexte

1.1 Objet du document

Ce Document d'Architecture Technique (DAT) decrit l'architecture du produit Cash Pooling, un systeme de centralisation de tresorerie destine aux groupes d'entreprises clientes d'etablissements bancaires. Le produit permet d'optimiser les besoins et excedents de tresorerie par un equilibrage automatise des soldes entre comptes secondaires et un compte centralisateur.

1.2 Perimetre MVP

Le MVP (Minimum Viable Product) couvre exclusivement le Cash Pooling Direct avec les trois modes de nivellement suivants:

  • ZBA (Zero Balance Account): Ramene les comptes sources a un solde nul
  • TBA (Target Balance Account): Maintient un seuil cible sur les comptes sources
  • FBA (Fork Balance Account): Maintient le solde dans un intervalle defini (seuil min/max)

1.3 Principes directeurs

Le produit repose sur les principes architecturaux suivants:

Agnosticisme CBS: Le produit est concu pour fonctionner avec plusieurs Core Banking Systems sans modification de son noyau metier. L'adaptation a chaque CBS se fait exclusivement via les adaptateurs d'entree et de sortie.

Architecture batch-driven: L'ensemble des traitements s'execute en mode batch. Il n'existe pas d'orchestrateur applicatif; la planification est assuree par des outils techniques externes (scheduler, cron, Control-M).

Modele de donnees canonique: Toutes les donnees transitent par un modele normalise, independant des formats specifiques de chaque CBS.

Separation des responsabilites: Chaque composant possede un perimetre fonctionnel clairement delimite, sans chevauchement.


2. Vue d'architecture globale

2.1 Diagramme logique des composants

+------------------+     +---------------------------+     +------------------+
| | | | | |
| INPUT BATCH | | CASH POOLING CORE | | OUTPUT BATCH |
| (Adapter IN) | | (Noyau) | | (Adapter OUT) |
| | | | | |
+------------------+ +---------------------------+ +------------------+
| | |
v v v
+------------------+ +---------------------------+ +------------------+
| - Lecture CBS | | - Gestion des contrats | | - Transformation |
| - Parsing MT940 | | - Moteur ZBA/TBA/FBA | | - Generation |
| - Normalisation | | - Regles d'eligibilite | | ecritures |
| - Validation | | - Calcul mouvements | | - Injection CBS |
+------------------+ +---------------------------+ +------------------+
| | |
v v v
+-----------------------------------------------------------------------+
| |
| MODELE DE DONNEES CANONIQUE |
| |
| Contract | Account | Balance | Operation | PoolingRule | |
| PoolingMovement | ExecutionContext |
| |
+-----------------------------------------------------------------------+

2.2 Flux batch global

Le traitement Cash Pooling s'execute selon le flux sequentiel suivant:

[CBS Source]                                                    [CBS Cible]
| ^
v |
+----------+ +----------+ +----------+ +----------+ +----------+
| | | | | | | | | |
| Fichiers |--->| INPUT |--->| POOLING |--->| OUTPUT |--->| Fichiers |
| MT940 | | BATCH | | CORE | | BATCH | | Ecritures|
| | | | | | | | | |
+----------+ +----------+ +----------+ +----------+ +----------+
| | |
v v v
+---------------------------------------+
| Base de donnees locale |
| (Modele canonique persiste) |
+---------------------------------------+

2.3 Positionnement des adaptateurs CBS

Les adaptateurs constituent la couche d'abstraction entre le produit Cash Pooling et les differents Core Banking Systems. Leur positionnement garantit l'independance du noyau metier.

+-------------+     +-------------+     +-------------+
| CBS A | | CBS B | | CBS C |
| (ex: T24) | | (ex: Flexcube) | (ex: SAB) |
+-------------+ +-------------+ +-------------+
| | |
v v v
+-------------+ +-------------+ +-------------+
| Adapter IN | | Adapter IN | | Adapter IN |
| CBS A | | CBS B | | CBS C |
+-------------+ +-------------+ +-------------+
| | |
+-------------------+-------------------+
|
v
+------------------------+
| MODELE CANONIQUE |
+------------------------+
|
v
+------------------------+
| CASH POOLING CORE |
+------------------------+
|
v
+------------------------+
| MODELE CANONIQUE |
+------------------------+
|
+-------------------+-------------------+
| | |
v v v
+-------------+ +-------------+ +-------------+
| Adapter OUT | | Adapter OUT | | Adapter OUT |
| CBS A | | CBS B | | CBS C |
+-------------+ +-------------+ +-------------+
| | |
v v v
+-------------+ +-------------+ +-------------+
| CBS A | | CBS B | | CBS C |
+-------------+ +-------------+ +-------------+

3. Responsabilites par composant

3.1 Input Batch (Adapter IN)

Role: Composant d'acquisition et de normalisation des donnees en provenance du Core Banking System.

Responsabilites:

ResponsabiliteDescription
Lecture des fichiers CBSRecuperation des fichiers de soldes et mouvements (format MT940 ou equivalent) depuis le repertoire d'echange
Parsing et extractionInterpretation du format specifique CBS et extraction des donnees brutes
Validation techniqueControle de l'integrite des fichiers (checksum, structure, completude)
NormalisationTransformation des donnees vers le modele canonique
PersistenceEcriture des donnees normalisees dans la base locale
Gestion des erreursJournalisation des anomalies et generation d'alertes

Ce que fait ce composant:

  • Lit les fichiers MT940 ou equivalents deposes par le CBS
  • Valide la structure et l'integrite des fichiers recus
  • Extrait les soldes de cloture (J-1) et les operations du jour (J)
  • Convertit les donnees au format canonique
  • Persiste les comptes, soldes et operations dans la base locale
  • Genere un rapport d'execution (fichiers traites, rejetes, statistiques)

Ce que ne fait pas ce composant:

  • Aucune logique metier Cash Pooling
  • Aucun calcul de nivellement
  • Aucune decision d'eligibilite
  • Aucun acces direct au CBS (lecture fichiers uniquement)
  • Aucune generation d'ecritures comptables

3.2 Cash Pooling Core (Noyau)

Role: Composant central contenant l'ensemble de la logique metier Cash Pooling.

Responsabilites:

ResponsabiliteDescription
Gestion des contratsStockage et maintenance des contrats Cash Pooling (creation, modification, suspension, suppression logique)
Evaluation de l'eligibiliteDetermination des comptes et contrats eligibles au traitement du jour
Moteur de nivellementImplementation des algorithmes ZBA, TBA et FBA
Calcul des mouvementsProduction des mouvements de nivellement a executer
Gestion des seuilsApplication des seuils TBA et des intervalles FBA
Gestion de la hierarchieTraitement des structures multi-niveaux (comptes parents/enfants)
Contexte d'executionSuivi des dates de passage et etats de traitement

Ce que fait ce composant:

  • Charge les contrats actifs depuis la base locale
  • Verifie l'eligibilite de chaque contrat selon la periodicite configuree
  • Recupere les soldes et operations normalises
  • Applique les regles de nivellement selon le mode (ZBA/TBA/FBA) et le type de transfert (Solde/Date valeur/Operation)
  • Calcule les mouvements de nivellement en respectant la hierarchie des comptes
  • Persiste les mouvements calcules (PoolingMovement)
  • Met a jour le contexte d'execution (date dernier passage)
  • Gere les cas de non-eligibilite (aucun mouvement produit)

Ce que ne fait pas ce composant:

  • Aucune lecture directe de fichiers CBS
  • Aucune generation de fichiers d'ecritures
  • Aucune communication avec le CBS
  • Aucune transformation de format
  • Aucune gestion de l'interface utilisateur

3.3 Output Batch (Adapter OUT)

Role: Composant de transformation et d'injection des mouvements Cash Pooling vers le Core Banking System.

Responsabilites:

ResponsabiliteDescription
Lecture des mouvementsRecuperation des mouvements calcules par le noyau
TransformationConversion du format canonique vers le format CBS cible
Generation des ecrituresProduction des fichiers d'ecritures/virements au format attendu par le CBS
Depot des fichiersEcriture des fichiers dans le repertoire d'echange CBS
Gestion des statutsMise a jour des statuts des mouvements (genere, injecte, en erreur)
Gestion des retoursTraitement des acquittements CBS (si applicable)

Ce que fait ce composant:

  • Lit les mouvements de nivellement en statut "a traiter"
  • Transforme chaque mouvement en ecriture comptable au format CBS
  • Genere les fichiers d'injection (virements, ecritures)
  • Depose les fichiers dans le repertoire d'echange CBS
  • Met a jour le statut des mouvements traites
  • Genere un rapport d'execution (mouvements traites, rejetes)

Ce que ne fait pas ce composant:

  • Aucune logique metier Cash Pooling
  • Aucun calcul de nivellement
  • Aucune decision d'eligibilite
  • Aucune modification des contrats
  • Aucune lecture de fichiers CBS entrants

4. Modele de donnees canonique

4.1 Vue d'ensemble

Le modele de donnees canonique constitue le socle commun a tous les composants du produit. Il est concu pour etre stable, independant du CBS, et suffisamment expressif pour couvrir l'ensemble des cas metier du Cash Pooling Direct.

+---------------+       +---------------+       +---------------+
| Contract |1 *| Account |1 *| Balance |
+---------------+-------+---------------+-------+---------------+
| contractId | | accountId | | balanceId |
| clientCode | | contractId | | accountId |
| clientRef | | accountNumber | | balanceDate |
| companyName | | accountType | | closingBalance|
| rcNumber | | parentAccount | | availableBalance|
| address | | mirrorAccount | | currency |
| levelingType | | customLabel | | createdAt |
| levelingMode | | status | +---------------+
| transferType | | createdAt |
| ... | +---------------+
+---------------+ |1
|1 |
| |*
|* +---------------+
+---------------+ | Operation |
| PoolingRule | +---------------+
+---------------+ | operationId |
| ruleId | | accountId |
| contractId | | operationDate |
| accountId | | valueDate |
| thresholdTBA | | amount |
| thresholdFBA1 | | currency |
| thresholdFBA2 | | direction |
| thresholdFBAUser| | label |
| transferPeriod| | externalRef |
| transferDay | | createdAt |
| ... | +---------------+
+---------------+
|1
|
|*
+-------------------+ +-------------------+
| PoolingMovement | | ExecutionContext |
+-------------------+ +-------------------+
| movementId | | contextId |
| contractId | | contractId |
| sourceAccountId | | executionDate |
| targetAccountId | | lastProcessingDate|
| amount | | lastDrainDate |
| valueDate | | status |
| movementType | | errorMessage |
| status | | createdAt |
| createdAt | | updatedAt |
| processedAt | +-------------------+
+-------------------+

4.2 Entite Contract

L'entite Contract represente le contrat Cash Pooling souscrit par un groupe d'entreprises. Un groupe ne peut disposer que d'un seul contrat actif.

AttributTypeObligatoireDescription
contractIdUUIDOuiIdentifiant unique du contrat (genere automatiquement)
contractNumberVARCHAR(20)OuiNumero de contrat metier (genere et incremente automatiquement)
clientCodeVARCHAR(20)OuiCode tiers du client
clientRefVARCHAR(50)OuiReference tiers GRC
companyNameVARCHAR(100)OuiRaison sociale du groupe
rcNumberVARCHAR(30)OuiNumero de Registre du Commerce
addressVARCHAR(255)OuiAdresse du client
levelingTypeENUMOuiType de nivellement: DIRECT, INDIRECT
levelingModeENUMOuiMode de nivellement: ZBA, TBA, FBA
transferTypeENUMOuiType de transfert: BALANCE, VALUE_DATE, OPERATION
transferPeriodicityENUMOuiPeriodicite: DAILY, WEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL
transferDaysVARCHAR(20)ConditionnelJours de transfert (ex: "1,2,3,4,5" pour quotidien)
monthlyTransferDayINTEGERConditionnelJour du mois (1-28) si periodicite mensuelle
quarterlyDatesVARCHAR(50)Conditionnel4 dates JJ/MM si periodicite trimestrielle
semiAnnualDatesVARCHAR(30)Conditionnel2 dates JJ/MM si periodicite semestrielle
annualDateVARCHAR(10)Conditionnel1 date JJ/MM si periodicite annuelle
masterAccountIdUUIDOuiReference vers le compte centralisateur
billingAccountIdUUIDOuiReference vers le compte de facturation
billingTypeENUMOuiType de tarification: FLAT_FEE, PER_ACCOUNT
billingAmountDECIMAL(15,2)OuiMontant de la tarification
billingPeriodicityENUMOuiPeriodicite paiement: MONTHLY, QUARTERLY, ANNUAL
alertEmail1VARCHAR(100)OuiEmail principal pour les alertes
alertEmail2VARCHAR(100)NonEmail secondaire pour les alertes
effectiveStartDateDATEOuiDate effective de demarrage
statusENUMOuiStatut: ACTIVE, SUSPENDED, DELETED
versionINTEGEROuiVersion du contrat (incrementee a chaque modification)
createdAtTIMESTAMPOuiDate de creation
updatedAtTIMESTAMPOuiDate de derniere modification

Contraintes metier:

  • Un seul contrat actif par groupe (unicite sur clientCode + status=ACTIVE)
  • levelingType=INDIRECT implique levelingMode=ZBA uniquement (hors scope MVP)
  • levelingMode=FBA implique transferType=BALANCE uniquement
  • levelingMode=TBA implique transferType in (BALANCE, OPERATION)
  • Periodicite > DAILY implique levelingMode=ZBA et transferType=BALANCE

4.3 Entite Account

L'entite Account represente un compte bancaire participant au Cash Pooling.

AttributTypeObligatoireDescription
accountIdUUIDOuiIdentifiant unique du compte
contractIdUUIDOuiReference vers le contrat
accountNumberVARCHAR(30)OuiNumero de compte bancaire
accountTypeENUMOuiType: MASTER (centralisateur), SOURCE, INTERMEDIATE
parentAccountIdUUIDConditionnelReference vers le compte parent (si structure hierarchique)
mirrorAccountIdUUIDConditionnelReference vers le compte miroir (Cash Pooling Indirect - hors scope)
customLabelVARCHAR(14)NonLibelle personnalise (max 14 caracteres)
currencyVARCHAR(3)OuiCode devise ISO (ex: MAD, EUR)
statusENUMOuiStatut: ACTIVE, SUSPENDED, DELETED
createdAtTIMESTAMPOuiDate de creation
updatedAtTIMESTAMPOuiDate de derniere modification

Contraintes metier:

  • Un contrat possede exactement un compte de type MASTER
  • Un contrat possede au moins un compte de type SOURCE
  • Un compte SOURCE peut avoir un compte parent (INTERMEDIATE ou MASTER)
  • Un compte n'appartient qu'a une seule branche de la hierarchie
  • accountType=MASTER implique parentAccountId=NULL

4.4 Entite Balance

L'entite Balance represente le solde d'un compte a une date donnee.

AttributTypeObligatoireDescription
balanceIdUUIDOuiIdentifiant unique du solde
accountIdUUIDOuiReference vers le compte
balanceDateDATEOuiDate du solde (J-1 pour solde de cloture)
closingBalanceDECIMAL(18,2)OuiSolde de cloture
availableBalanceDECIMAL(18,2)NonSolde disponible (si different du solde de cloture)
currencyVARCHAR(3)OuiCode devise ISO
sourceVARCHAR(50)OuiSource de la donnee (ex: MT940, CBS_DIRECT)
createdAtTIMESTAMPOuiDate de creation

Contraintes metier:

  • Unicite sur (accountId, balanceDate)
  • Le solde de cloture J-1 est utilise pour le calcul du nivellement a J

4.5 Entite Operation

L'entite Operation represente un mouvement comptable sur un compte.

AttributTypeObligatoireDescription
operationIdUUIDOuiIdentifiant unique de l'operation
accountIdUUIDOuiReference vers le compte
operationDateDATEOuiDate d'operation
valueDateDATEOuiDate de valeur
amountDECIMAL(18,2)OuiMontant (positif ou negatif)
currencyVARCHAR(3)OuiCode devise ISO
directionENUMOuiSens: CREDIT, DEBIT
labelVARCHAR(140)NonLibelle de l'operation
externalRefVARCHAR(50)NonReference externe CBS
sourceVARCHAR(50)OuiSource de la donnee
createdAtTIMESTAMPOuiDate de creation

Contraintes metier:

  • Les operations du jour J sont utilisees pour le nivellement par operation ou par date valeur
  • Le regroupement par date valeur est effectue pour le transfert par VALUE_DATE

4.6 Entite PoolingRule

L'entite PoolingRule represente les regles de nivellement specifiques a un compte dans le cadre d'un contrat.

AttributTypeObligatoireDescription
ruleIdUUIDOuiIdentifiant unique de la regle
contractIdUUIDOuiReference vers le contrat
accountIdUUIDOuiReference vers le compte source
thresholdTBADECIMAL(18,2)ConditionnelSeuil TBA (obligatoire si mode=TBA)
thresholdFBA1DECIMAL(18,2)ConditionnelSeuil minimum FBA (obligatoire si mode=FBA)
thresholdFBA2DECIMAL(18,2)ConditionnelSeuil maximum FBA (obligatoire si mode=FBA)
thresholdFBAUserDECIMAL(18,2)ConditionnelSeuil cible FBA (obligatoire si mode=FBA)
isActiveBOOLEANOuiIndicateur d'activation de la regle
createdAtTIMESTAMPOuiDate de creation
updatedAtTIMESTAMPOuiDate de derniere modification

Contraintes metier:

  • Une regle par couple (contractId, accountId)
  • thresholdFBA1 < thresholdFBAUser < thresholdFBA2
  • Modification du seuil TBA implique redemarrage de la branche

4.7 Entite PoolingMovement

L'entite PoolingMovement represente un mouvement de nivellement calcule par le moteur Cash Pooling.

AttributTypeObligatoireDescription
movementIdUUIDOuiIdentifiant unique du mouvement
contractIdUUIDOuiReference vers le contrat
sourceAccountIdUUIDOuiCompte source du mouvement
targetAccountIdUUIDOuiCompte cible du mouvement (parent ou centralisateur)
amountDECIMAL(18,2)OuiMontant du mouvement
currencyVARCHAR(3)OuiCode devise ISO
valueDateDATEOuiDate de valeur du mouvement
operationDateDATEOuiDate d'operation
movementTypeENUMOuiType: BALANCE_TRANSFER, VALUE_DATE_TRANSFER, OPERATION_TRANSFER
levelingModeENUMOuiMode applique: ZBA, TBA, FBA
originalOperationIdUUIDConditionnelReference vers l'operation d'origine (si transfert par operation)
statusENUMOuiStatut: PENDING, GENERATED, INJECTED, ERROR, CANCELLED
errorMessageVARCHAR(500)NonMessage d'erreur si status=ERROR
createdAtTIMESTAMPOuiDate de creation
processedAtTIMESTAMPNonDate de traitement par l'Output Batch

Contraintes metier:

  • Un mouvement est toujours du compte source vers son compte parent ou centralisateur
  • Le montant peut etre positif (transfert vers centralisateur) ou negatif (transfert depuis centralisateur)
  • Les mouvements en statut PENDING sont traites par l'Output Batch

4.8 Entite ExecutionContext

L'entite ExecutionContext represente le contexte d'execution du Cash Pooling pour un contrat.

AttributTypeObligatoireDescription
contextIdUUIDOuiIdentifiant unique du contexte
contractIdUUIDOuiReference vers le contrat
executionDateDATEOuiDate d'execution du batch
lastProcessingDateDATENonDate du dernier traitement Cash Pooling
lastDrainDateDATENonDate du dernier vidage de compte miroir (hors scope)
lastBillingDateDATENonDate du dernier prelevement de tarification
statusENUMOuiStatut: SUCCESS, PARTIAL, FAILED, SKIPPED
processedAccountsINTEGEROuiNombre de comptes traites
generatedMovementsINTEGEROuiNombre de mouvements generes
errorMessageVARCHAR(500)NonMessage d'erreur si status=FAILED
createdAtTIMESTAMPOuiDate de creation
updatedAtTIMESTAMPOuiDate de derniere modification

Contraintes metier:

  • Un contexte par couple (contractId, executionDate)
  • lastProcessingDate est utilise pour determiner les jours a niveler (periodicite hebdomadaire)
  • status=SKIPPED indique un contrat non eligible a la date d'execution

5. Fonctionnement batch et regles metier

5.1 Cycle de traitement global

Le traitement Cash Pooling s'execute quotidiennement selon le cycle suivant:

+-------------------------------------------------------------------+
| CYCLE DE TRAITEMENT QUOTIDIEN |
+-------------------------------------------------------------------+
| |
| [1] INPUT BATCH |
| | |
| +-- Lecture fichiers MT940 (soldes J-1, operations J) |
| +-- Validation et normalisation |
| +-- Persistence dans le modele canonique |
| |
| [2] CASH POOLING CORE |
| | |
| +-- Chargement des contrats actifs |
| +-- Pour chaque contrat: |
| | |
| +-- Evaluation de l'eligibilite (periodicite, jour) |
| | |
| +-- Si eligible: |
| | +-- Recuperation soldes et operations |
| | +-- Application des regles de nivellement |
| | +-- Calcul des mouvements |
| | +-- Persistence des mouvements |
| | |
| +-- Si non eligible: |
| +-- Journalisation (aucun mouvement produit) |
| |
| +-- Mise a jour du contexte d'execution |
| |
| [3] OUTPUT BATCH |
| | |
| +-- Lecture des mouvements en statut PENDING |
| +-- Transformation au format CBS |
| +-- Generation des fichiers d'ecritures |
| +-- Depot dans le repertoire d'echange |
| +-- Mise a jour des statuts |
| |
+-------------------------------------------------------------------+

5.2 Regles d'eligibilite

L'eligibilite d'un contrat au traitement du jour est determinee par les regles suivantes:

Conditions prealables:

  • Le contrat doit etre en statut ACTIVE
  • La date d'execution doit etre >= date effective de demarrage
  • Les donnees (soldes, operations) doivent etre disponibles

Evaluation selon la periodicite:

PeriodiciteCondition d'eligibilite
DAILYEligible tous les jours ouvres (selon transferDays)
WEEKLYEligible si le jour courant correspond a transferDays
MONTHLYEligible si le jour courant = monthlyTransferDay
QUARTERLYEligible si la date courante correspond a une des 4 dates quarterlyDates
SEMI_ANNUALEligible si la date courante correspond a une des 2 dates semiAnnualDates
ANNUALEligible si la date courante correspond a annualDate

Cas de non-eligibilite:

  • Le batch s'execute mais ne produit aucun mouvement
  • Le contexte d'execution est mis a jour avec status=SKIPPED
  • Aucune erreur n'est generee

5.3 Algorithmes de nivellement

5.3.1 ZBA (Zero Balance Account)

Objectif: Ramener le solde du compte source a zero.

ZBA par Solde:

Pour chaque compte source (du niveau le plus bas vers le centralisateur):
solde_J = recuperer_solde(compte_source, date_J)
Si solde_J != 0:
mouvement = creer_mouvement(
source = compte_source,
cible = compte_parent ou centralisateur,
montant = solde_J,
type = BALANCE_TRANSFER
)
persister(mouvement)

ZBA par Date Valeur:

Pour chaque compte source:
solde_J1 = recuperer_solde(compte_source, date_J-1)
operations_J = recuperer_operations(compte_source, date_J)

# Nivellement du solde J-1
Si solde_J1 != 0:
mouvement_solde = creer_mouvement(montant = solde_J1)
persister(mouvement_solde)

# Nivellement des operations groupees par date valeur
Pour chaque date_valeur dans operations_J:
total = somme(operations_J.filtrer(date_valeur))
mouvement_dv = creer_mouvement(
montant = total,
date_valeur = date_valeur,
type = VALUE_DATE_TRANSFER
)
persister(mouvement_dv)

ZBA par Operation:

Pour chaque compte source:
solde_J1 = recuperer_solde(compte_source, date_J-1)
operations_J = recuperer_operations(compte_source, date_J)

# Nivellement du solde J-1 (au demarrage)
Si est_demarrage:
mouvement_solde = creer_mouvement(montant = solde_J1)
persister(mouvement_solde)

# Nivellement de chaque operation
Pour chaque operation dans operations_J:
mouvement_op = creer_mouvement(
montant = operation.montant,
date_valeur = operation.date_valeur,
type = OPERATION_TRANSFER,
operation_origine = operation.id
)
persister(mouvement_op)

5.3.2 TBA (Target Balance Account)

Objectif: Maintenir un seuil cible sur le compte source.

TBA par Solde:

Pour chaque compte source:
solde_J = recuperer_solde(compte_source, date_J)
seuil = recuperer_seuil_TBA(compte_source)

ecart = solde_J - seuil
Si ecart != 0:
mouvement = creer_mouvement(
source = compte_source,
cible = compte_parent ou centralisateur,
montant = ecart,
type = BALANCE_TRANSFER
)
persister(mouvement)
# Resultat: solde final = seuil

TBA par Operation:

Pour chaque compte source:
seuil = recuperer_seuil_TBA(compte_source)

# Au demarrage: atteindre le seuil
Si est_demarrage:
solde_J1 = recuperer_solde(compte_source, date_J-1)
ecart = solde_J1 - seuil
mouvement_seuil = creer_mouvement(montant = ecart)
persister(mouvement_seuil)

# Nivellement des operations du jour
operations_J = recuperer_operations(compte_source, date_J)
Pour chaque operation dans operations_J:
mouvement_op = creer_mouvement(
montant = operation.montant,
type = OPERATION_TRANSFER
)
persister(mouvement_op)

5.3.3 FBA (Fork Balance Account)

Objectif: Maintenir le solde dans un intervalle [seuil1, seuil2].

FBA par Solde:

Pour chaque compte source:
solde_J = recuperer_solde(compte_source, date_J)
seuil1 = recuperer_seuil_FBA1(compte_source) # minimum
seuil2 = recuperer_seuil_FBA2(compte_source) # maximum
seuil_cible = recuperer_seuil_FBA_user(compte_source)

Si solde_J < seuil1:
# Solde insuffisant: transfert depuis le centralisateur
ecart = seuil_cible - solde_J
mouvement = creer_mouvement(
source = centralisateur,
cible = compte_source,
montant = ecart
)
Sinon Si solde_J > seuil2:
# Solde excessif: transfert vers le centralisateur
ecart = solde_J - seuil_cible
mouvement = creer_mouvement(
source = compte_source,
cible = centralisateur,
montant = ecart
)
Sinon:
# Solde dans l'intervalle: aucun mouvement
rien

Si mouvement existe:
persister(mouvement)

5.4 Gestion de la hierarchie multi-niveaux

Le nivellement s'effectue toujours du niveau le plus bas vers le centralisateur:

Niveau 0: Compte Centralisateur (Master)
|
Niveau 1: Comptes Intermediaires
|
Niveau 2: Comptes Sources (feuilles)

Ordre de traitement:

  1. Identifier tous les comptes sans enfants (feuilles)
  2. Niveler ces comptes vers leur parent
  3. Remonter d'un niveau et repeter jusqu'au centralisateur

Regle fondamentale: Un compte parent ne peut etre nivele qu'apres tous ses comptes enfants.

5.5 Cas particuliers

Demarrage de contrat:

  • Le premier nivellement inclut le solde de cloture J-1
  • Pour TBA: le seuil est atteint des le premier traitement
  • La date de demarrage effectif est enregistree

Redemarrage de branche:

  • Declenche par modification de: nivellement, mode, type transfert, seuils, comptes
  • Le traitement reprend comme un demarrage initial
  • L'historique des mouvements precedents est conserve

Suspension de contrat/branche:

  • Les comptes suspendus sont exclus du traitement
  • La suspension d'un compte implique la suspension de toute sa branche descendante
  • Aucun mouvement n'est genere pour les comptes suspendus

Absence de donnees:

  • Si les soldes/operations ne sont pas disponibles, le contrat est marque en erreur
  • Une alerte est envoyee aux adresses email configurees
  • Le traitement des autres contrats continue

6. Points non couverts volontairement

Ce DAT exclut explicitement les elements suivants du perimetre MVP:

6.1 Cash Pooling Indirect

Le Cash Pooling Indirect, qui utilise des comptes miroirs pour isoler les ecritures Cash Pooling des operations courantes, n'est pas couvert par ce MVP. Cette fonctionnalite implique:

  • La gestion des comptes miroirs
  • Le vidage automatique et manuel des comptes miroirs
  • Les regles specifiques de nivellement indirect

Raison de l'exclusion: Complexite additionnelle significative, cas d'usage moins frequent.

6.2 Traitement temps reel

Le produit fonctionne exclusivement en mode batch. Les fonctionnalites temps reel suivantes sont exclues:

  • Nivellement intra-journalier
  • Notifications en temps reel
  • API synchrones de declenchement
  • Integration evenementielle avec le CBS

Raison de l'exclusion: Le mode batch repond aux besoins metier identifies et simplifie l'architecture.

6.3 Orchestration applicative

Il n'existe pas d'orchestrateur applicatif dans le produit. Les aspects suivants sont exclus:

  • Workflow de validation des contrats
  • Enchainement conditionnel des batchs
  • Gestion des dependances entre traitements
  • Reprise automatique sur erreur

Raison de l'exclusion: La planification est assuree par des outils externes (Control-M, cron). Les decisions metier sont prises dans le moteur Cash Pooling.

6.4 Reporting avance

Le reporting avance est hors scope MVP:

  • Tableaux de bord interactifs
  • Rapports personnalisables
  • Export multi-format (PDF, Excel avance)
  • Historique detaille des mouvements
  • Statistiques et indicateurs de performance

Raison de l'exclusion: Fonctionnalite prevue pour un lot ulterieur (LOT 2).

6.5 Interface utilisateur

L'interface utilisateur de gestion des contrats n'est pas couverte par ce DAT:

  • Ecrans de creation/modification de contrats
  • Consultation et recherche
  • Gestion des suspensions/suppressions
  • Authentification et habilitations (SAS)

Raison de l'exclusion: Ce DAT se concentre sur l'architecture technique du moteur batch. L'IHM fera l'objet d'un document separe.

6.6 Tarification

Le module de tarification (prelevement des frais de gestion) n'est pas detaille:

  • Calcul des frais par forfait ou par compte
  • Prelevement automatique selon periodicite
  • Gestion des premieres echeances

Raison de l'exclusion: Module annexe au Cash Pooling, traite separement.


7. Annexes

7.1 Glossaire

TermeDefinition
CBSCore Banking System - Systeme bancaire central
Cash PoolingTechnique de centralisation de tresorerie
Compte CentralisateurCompte principal (Master Account) recevant les fonds
Compte SourceCompte secondaire participant au nivellement
Compte IntermediaireCompte servant de relais dans une structure multi-niveaux
Compte MiroirCompte fictif utilise en Cash Pooling Indirect
ZBAZero Balance Account - Nivellement a solde nul
TBATarget Balance Account - Nivellement a seuil cible
FBAFork Balance Account - Nivellement a intervalle
MT940Format SWIFT standard pour les releves de compte
NivellementAction de transfert des fonds entre comptes
PeriodiciteFrequence d'execution du nivellement

7.2 Combinaisons valides Mode/Type de transfert

ModeSoldeDate ValeurOperation
ZBAOuiOuiOui
TBAOuiNonOui
FBAOuiNonNon

7.3 Contraintes de periodicite

PeriodiciteModes autorisesTypes de transfert autorises
QuotidienneZBA, TBA, FBATous selon le mode
HebdomadaireZBA, TBA, FBATous selon le mode
MensuelleZBA uniquementSolde uniquement
TrimestrielleZBA uniquementSolde uniquement
SemestrielleZBA uniquementSolde uniquement
AnnuelleZBA uniquementSolde uniquement

7.4 Diagramme de sequence - Traitement ZBA par Solde

Scheduler       InputBatch      Database        PoolingCore     OutputBatch      CBS
| | | | | |
|--[trigger]--->| | | | |
| |--[read MT940]------------------------------------------>| |
| |<-------------------------------------------------[file]--| |
| |--[parse & normalize]->| | | |
| | |<--[persist balances]--| | |
| | |<--[persist operations]| | |
| |--[complete]-->| | | |
| | | | | |
|--[trigger]---------------------------->| | | |
| | |<--[load contracts]----| | |
| | |<--[load balances]-----| | |
| | | | | |
| | | [evaluate eligibility] | |
| | | [calculate movements] | |
| | | | | |
| | |<--[persist movements]--| | |
| | |<--[update context]-----| | |
| | | | | |
|--[trigger]---------------------------------------->| | |
| | |<--[load movements]---------| | |
| | | | | |
| | | [transform to CBS format] | |
| | | | | |
| | | |--[write file]-------------->|
| | |<--[update status]------| | |
| | | | | |

Fin du document