GH GambleHub

Parcourir les registres et automatiser

TL; DR

L'automatisation robuste « swing » repose sur trois baleines : une ingestion déterministe (livraison sûre, idempotence, contrôle de l'intégrité), une couche de données normalisée (schéma unique, clés de correspondance, unités de temps/devises/signes normalisées) et une discipline rigoureuse de la qualité (validation, tolérances, DLQ, alertes, auto-correction). L'objectif est de transformer les fichiers/webhooks hétérogènes en tableaux stables pour le rapprochement, le reporting et la BI avec SLA sur l'accessibilité.


1) Paysage des sources et des formats

1. 1 Sources

PSP/acquéreurs/agrégateurs : transactions, réseaux, commissions, disputes.
Banques : relevés de MT940, ISO 20022 CAMT. 052/053/054, paiements PAIN. 001/002.
ARM/portefeuilles/paiements (OCT/RTP/SEPA) : registres payants, retours.
Crypto-castodi/échanges : transactions on-chein, rapports de conversion/commissions.
Impôts/État. portails : CSV/XLSX/PDF, parfois via un navigateur scripté.

1. 2 Formats

CSV/TSV (séparateurs variatifs, localités, codages).
XLSX (multi-shit, cellules fusionnées).
XML (ISO 20022 CAMT/PAIN, système personnalisé XSD).
SWIFT MT940/942 (champs de position).
JSON-API/NDJSON (décharges incrémentielles, curseurs).
PDF (tabulaires - parser ; scans - OCR).
ZIP/TAR. GZ (batchi avec plusieurs fichiers).


2) Architecture ingestion-pipline

Contours :

1. Landing : l'acceptation sécurisée des fichiers (SFTP/FTPS/WebBOU/API/webhooks) → immédiatement compter checksum, garder les matières premières invariables.

2. Raw : mise en page par date/fournisseur/trampoline, stockage avec versions.

3. Normalize : parsing → unification des types/unités → tables normalisées.

4. Validé : après-validation (règles de qualité) → drapeaux, DLQ.

5. Matched : mise en correspondance avec des événements internes/banque.

6. Serving/BI : vitrines de rapprochement/finances/opérations.

Exigences clés :
  • L'idempotence de l'ingestion : '(fournisseur, file_name, file_size, checksum, statement_date)' → une clé unique.
  • Répétitions/retraits : La reprise du fichier ne crée pas de prises.
  • DLQ (dead-letter queue) : tout ce qui n'est pas reconnu/a enfreint les règles est dans une file d'attente isolée.
  • Versioning : un nouveau fichier pour le même jour → une nouvelle version avec un lien vers le précédent.

3) Sécurité de la livraison et des secrets

Canaux : SFTP avec clés limitées ; FTPS - seulement avec un TLS strict ; API - OAuth2/tokens avec TTL court.
Cryptage de contenu : PGP/GPG lors du téléchargement de fichiers ; S/MIME pour e-mail-inbox (si utilisé).
Contrôle d'intégrité : SHA-256/512 checksum, comparaison avec le hachage dans le manifeste.
Secrets : stocker dans Vault/KMS, rotation, interdit dans les fichiers/logs config.
Accès : RBAC + principe des « plus petits privilèges », comptes-services séparés.


4) Normalisation et schéma de données

4. 1 Règles universelles

Temps : toujours UTC en ISO-8601 ; pour les dates de settlement - 'DATE' sans TZ.
Montants : 'DECIMAL (p, s)' en unités mineures + 'scale' séparée ; signe : paroisse/consommation strictement selon le dictionnaire.
Devises : ISO-4217, table de taux fixe avec 'fx _ src'.
Localy : l'interdiction de l'autotest est un réglage explicite des séparateurs/décimales/millièmes.
Codages : entrée dans UTF-8 ; d'autres sont la conversion avec le logs.

4. 2 Couche « plane » normalisée (exemple)

json
{
"provider": "Acquirer_A",
"source_kind": "PSP_TX    PSP_SETTLEMENT    BANK    WALLET    CRYPTO",
"kind": "AUTH    CAPTURE    REFUND    PAYOUT    FEE    SETTLEMENT    CHARGEBACK",
"payment_id": "pay_123",        // ваше
"provider_txid": "psp_abc_789",    // внешнее
"merchant_ref": "mr_456",
"sequence": 0,             // partial/refund line index
"amount_minor": 100000,        // 1000.00
"currency": "EUR",
"fee_minor": 120,           // 1.20
"fx_rate": 1.0000,
"fx_src": "PSP    ECB    BANK",
"event_ts": "2025-11-03T12:00:00Z",
"value_date": "2025-11-05",
"account": "PSP_MERCHANT_CARD_A",
"bin": "425000",
"last4": "1234",
"status": "APPROVED    CAPTURED    SUCCESS    FAILED    SETTLED",
"file_id": "ing_20251103_001",
"row_hash": "sha256(raw_row)"
}

5) Parsers par format : réceptions et râteaux

5. 1 CSV/TSV

Définissez explicitement « delimiter », « quotechar », « escapechar », « encoding ».

Détail des lignes vides/décalage des titres ; support header aliases (par exemple, 'AmountAMTTxnAmount`).
Convertir le signe (moins/parenthèse), normaliser les millièmes (', '/' ./espaces).

5. 2 XLSX

Lecture par sheet whitelist ; Interdiction de la lecture automatique - aplatissement des cellules combinées.
Convertir les formules en valeurs ; dates Excel → UTC avec TZ explicite.

5. 3 XML (ISO 20022 CAMT/PAIN)

Validation par XSD ; XPath-mapping des détails ('<Ntry>', '<TxDtls>', '<Amt>', '<CdtDbtInd>').
Normaliser le credit/debit → signe ; prise en charge des multiples '<Chrgs>', '<RmtInf>'.

5. 4 MT940

Analyse des tags ': 61 :', ': 86 :' ; soutenir les élargissements nationaux ; les champs de position → les règles de slicing.
Consolidation de plusieurs ': 61 :' en un seul batch.

5. 5 JSON/NDJSON/API

Curseurs 'since _ idcreated_atpage_token`; rate-limit aware retrai (429 → backoff + gitter).
Sémantique partiale (plusieurs lignes de refand à une seule 'provider _ txid').

5. 6 PDF/OCR

D'abord, une tentative de parsing tabulaire (clip-détecteur), puis seulement OCR (Tesseract) avec des caractères whitelist.
Post-validation : montants, résultats de contrôle, rapprochement du nombre de lignes.

5. 7 Archives/Batchi

Déballage avec conservation de la structure ; chaque fichier est un 'file _ id' distinct ; manifeste, contrôle de toutes les parties.


6) Validation et règles de qualité des données

Contrôles obligatoires :
  • Schéma : tous les champs requis sont présents.
  • Types : les montants sont numériques, les dates partent.
  • Montants de contrôle/totaux : somme des lignes = total dans le fichier (le cas échéant).
  • Fourchettes : date dans une fenêtre raisonnable ; somme> 0 (ou selon le dictionnaire des négatifs admissibles).
  • Unicité : '(provider, provider_txid, sequence)' n'est pas dupliqué dans normalized.
  • Tolérances : écarts valides 'amount/fx/time'.

Résultat : 'VALID', 'VALID _ WITH _ WARNINGS', 'INVALID → DLQ (reason_code)'.


7) Idempotence et déduplication

Ingestion key : '(fournisseur, file_name, filesize, checksum, statement_date)' → le seul 'file _ id'.
Row-level idem: `row_hash = sha256(normalized_row_compact)`; le redémarrage ne crée pas de nouveaux enregistrements.
Webhooks/API : 'idempotency _ key' fournisseur + vos étiquettes ('exec _ id'), stocker TTL.
Doublons du fournisseur : dedup par 'provider _ txid' + 'sequence', en divergence par DLQ_DUPLICATE.


8) Orchestration et horaires

Оркестратор: Airflow/Dagster (DAG: `fetch → decrypt → parse → normalize → validate → publish → match`).
SLA/SLO : 'Time-to-Availability (TtA)' de l'apparition du fichier à 'normalized = READY'.
Retrai : backoff exponentiel + jitter ; limites de tentative ; des statuts clairs.
Parallélisme et isolation : OCR/Parsing XLSX lourds - dans un pool/worker séparé avec une limite CPU/RAM.
DLQ-replay : replay périodique lors de la mise à jour des règles/mappings.


9) Observabilité et alertes

Métriques :
  • Ingestion Success %, Parse Success % selon les sources.
  • TtA p50/p95, Throughput (lignes/min).
  • DLQ Rate и Aging DLQ p50/p95.
  • Schema Drift Incidents (changement de titre/format).
  • Duplicate Rate по `provider_txid`.
Alert (exemple) :
  • `TtA p95 > SLA` → P1.
  • 'Taux DLQ> 2 % 'par heure sur le fournisseur → P1.
  • 'Schema Drift detected '→ P0 (arrêt auto-match par source).
  • 'Duplicate spike '→ P2 (vérifier le fournisseur/webhooks).

Дашборд : l'entonnoir ' files → rows_raw → rows_norm → rows_valid → rows_matched ', la carte DLQ pour les raisons, TtA-kvantili.


10) Auto-corrections et mappings

Header aliases : dictionnaire avec versions (e. g., `Amount`→`amt`, `AMOUNT`→`amt`).

Code maps : les statuts du fournisseur → votre référence ('APPROVEDCAPTUREDSETTLED`).
Politique de signature : 'CR/DR', 'C/D', parenthèses - dans un seul modèle « iconique ».
Amount repair : suppression des séparateurs milliaires, normalisation du négatif.
Timezone repair : heure locale du fournisseur → UTC avec DST pris en compte.
💡 Toute correction automatique est logée et marquée dans 'repair _ flags'.

11) Lien avec le « Rapprochement des paiements et des rapports du PSP »

La couche normalisée finie est l'entrée pour le match (provider_txid/merchant_ref/fuzzy), le calcul de la taxonomie, les journaux auto et les settlement↔bank. Champs clés : 'provider _ txid', 'sequence', 'kind',' amount _ minor ',' value _ date ',' account '.


12) Modèle de stockage et tables

Tableau des fichiers landed :
sql
CREATE TABLE landed_files (
file_id TEXT PRIMARY KEY,
provider TEXT,
source_kind TEXT,
file_name TEXT,
file_size BIGINT,
checksum TEXT,
statement_date DATE,
received_at TIMESTAMP WITH TIME ZONE,
version INT,
status TEXT, -- RECEIVED    PARSED    FAILED error TEXT
);
Lignes normalisées :
sql
CREATE TABLE psp_norm (
row_id BIGSERIAL PRIMARY KEY,
file_id TEXT REFERENCES landed_files(file_id),
provider TEXT,
source_kind TEXT,
kind TEXT,
payment_id TEXT,
provider_txid TEXT,
merchant_ref TEXT,
sequence INT,
amount_minor BIGINT,
currency CHAR(3),
fee_minor BIGINT,
fx_rate NUMERIC(18,8),
fx_src TEXT,
event_ts TIMESTAMPTZ,
value_date DATE,
account TEXT,
status TEXT,
row_hash TEXT UNIQUE,
repair_flags TEXT[]
);
CREATE INDEX idx_psp_norm_txid ON psp_norm(provider, provider_txid, sequence);

13) Pseudo-code parser

CSV/XLSX:
python def parse_table(file, spec):
df = load_csv_or_xlsx(file, delimiter=spec.delim, encoding=spec.enc, sheet=spec.sheet)
df = rename_headers(df, spec.header_aliases)
df = clean_amounts(df, thousand=spec.thousand, decimal=spec.decimal, sign_policy=spec.sign)
rows = []
for r in df.itertuples():
rows.append(normalize_row(r, spec))
return rows
XML CAMT:
python def parse_camt(xml):
root = parse_xml(xml, xsd="camt053.xsd")
for ntry in root.findall('.//Ntry'):
sign = 1 if ntry.findtext('CdtDbtInd') == 'CRDT' else -1 amt = Decimal(ntry.findtext('Amt')) sign
... map to normalized fields
OCR PDF (fallback):
python def parse_pdf_ocr(pdf):
text = tesseract(pdf, lang="eng", psm=6, whitelist="0123456789.,-;:/A-Za-z")
table = detect_table(text)
return normalize_table(table)

14) GDPR/PII et édition de logs

Masquage/hachage : PAN/email/téléphone → 'sha256 + salt', logs - sans valeurs primaires.
Stratégie de stockage : 'rétention' par type de source (AML/Buchet).
Accès aux IPI - uniquement par rôle ; vérification des lectures/exportations.


15) KPI et objectifs (pour parsing/ingestion)

Ingestion Success % ≥ 99. 5 %/jour par source.
Parse Success % ≥ 99%, DLQ ≤ 1%.
TtA p95 (fayl→normalized) ≤ 15 minutes (CSV/XML), ≤ 60 minutes (PDF/OCR).
Schema Drift Incidents : 0/mois sans alerte/fix.
Duplicate Rate по `provider_txid` ≤ 0. 05%.


16) Pleybooks d'incidents

Schema drift : stop auto-matching, inclure un parser « doux » avec ML-detect de colonnes, préparer un patch alias, chasser DLQ-replay.
Sursaut de DLQ : débogage des derniers fichiers, vérification du codage/local/signe, abaissement temporaire de la rigueur des tolérances (avec drapeau).
Retards SFTP : passage à API-polling/webhooks, augmentation des retraits, communication avec le fournisseur.
Spikes duplicates : activer le dopage « row _ hash », bloc de répétition jusqu'à ce qu'il soit élucidé.


17) Test-case-pack (UAT/Prod-Prepared)

1. Idempotence : Répétez le même chargement → 1 'file _ id', 0 nouvelles lignes.
2. Localy : fichiers avec ', '/'/espaces → des montants corrects.
3. Partial/refund : plusieurs 'sequence' à un 'provider _ txid'.
4. XML XSD : CAMT non valide → 'INVALID' + DLQ.
5. MT940 variations : extensions nationales → analyse correcte.
6. PDF→OCR : scan avec bruit → extraction et passage des règles de base.
7. Schema drift : un nouveau hader → un patch alias et un traitement répété des fichiers historiques.
8. Throughput : test de charge de N fichiers/heure → conformité au SLA TtA.
9. Édition PII : logs sans PAN/e-mail, hashi uniquement.


18) Chèque de mise en œuvre

  • Registre des sources : protocole, planning, SLA, format, contact.
  • Canaux sécurisés (SFTP/PGP/API), Vault pour les secrets.
  • Idempotent ingestion + checksum + versions.
  • Parser par format, alias-dictionnaire, signal/locale-politique.
  • Calque normalisé et index de clés.
  • Règles de validation, tolérances, DLQ et replay.
  • Orchestrateur (DAG), retrai/backoff, pools de ressources.
  • Observabilité : métriques, dashboards, alertes.
  • GDPR/PII-masquage, audits d'accès.
  • Cas de test et drills schema-drift réguliers.

Résumé

L'automatisation du parsing n'est pas « écrire parser », mais construire un circuit industriel : livraison et cryptage fiables, piplines idempotentes, normalisation stricte, règles de qualité et alertes transparentes. Ce schéma transforme tous les registres en tableaux prévisibles avec un SLA garanti sur l'accessibilité des données - un fondement pour les puces, la trésorerie et les rapports de gestion.

Contact

Prendre contact

Contactez-nous pour toute question ou demande d’assistance.Nous sommes toujours prêts à vous aider !

Commencer l’intégration

L’Email est obligatoire. Telegram ou WhatsApp — optionnels.

Votre nom optionnel
Email optionnel
Objet optionnel
Message optionnel
Telegram optionnel
@
Si vous indiquez Telegram — nous vous répondrons aussi là-bas.
WhatsApp optionnel
Format : +code pays et numéro (ex. +33XXXXXXXXX).

En cliquant sur ce bouton, vous acceptez le traitement de vos données.