Parsarea și automatizarea registrului
TL; DR
Automatizarea fiabilă a „verificării” se bazează pe trei piloni: ingestie deterministă (livrare sigură, idempotență, control al integrității), strat normalizat de date (schemă unică, chei de potrivire, unități standardizate de timp/valute/semne) și disciplină strictă de calitate (validări, toleranțe, DLQ, alerte, corecții automate). Scopul este de a transforma fișierele pestrițe/cărți web în tabele stabile pentru reconciliere, raportare și BI cu SLA-uri privind disponibilitatea.
1) Peisaj sursă și format
1. 1 Surse
PSP/achizitori/agregatori: tranzacții, seturi, comisioane, litigii.
Banci: extrase MT940, ISO 20022 CAMT. 052/053/054, PAIN plăți. 001/002.
AWS/portofele/plăți (OCT/RTP/SEPA): registre de plăți, returnări.
Crypto-custom/exchanges: tranzacții în lanț, rapoarte de conversie/comision.
Taxe/portaluri de stat: CSV/XLSX/PDF, uneori prin intermediul unui browser scripted.
1. 2 Formate
CSV/TSV (separatoare variabile, localizări, codificări).
XLSX (mai multe foi, celule îmbinate).
XML (ISO 20022 CAMT/PAIN, scheme personalizate XSD).
SWIFT MT940/942 (câmpuri de poziție).
JSON-API/NDJSON (încărcări incrementale, cursoare).
PDF (tabular - parser; scanări - OCR).
ZIP/TAR. GZ (loturi multi-fișier).
2) Arhitectura conductei de ingestie
Contururi:1. Aterizare: acceptarea securizată a fișierelor (SFTP/FTPS/WebΜ/API/webhooks) → luați imediat în considerare suma de verificare, păstrați materiile prime invariabil.
2. Raw: layout după date/furnizori/butches, stocare cu versiuni.
3. Normalizați: parsarea → unificarea tipurilor/unităților → tabele normalizate.
4. Validat: post-validare (reguli de calitate) → steaguri, DLQ.
5. Potrivire: cartografiere la evenimente interne/bancă.
6. Servire/BI: afișarea cazurilor pentru reconciliere/financiare/tranzacții.
Cerințe cheie:- Idempotența ingestiei: „(furnizor, file_name, file_size, sumă de control, statement_date)” → o cheie unică.
- Reluări/Retrocedări: reluarea unui fișier nu creează duplicate.
- DLQ (coadă de scrisori moarte): toate regulile nerecunoscute/care încalcă - la o coadă izolată.
- Versioning: un nou fișier pentru aceeași zi → o nouă versiune cu un link către cea anterioară.
3) Securitatea livrării și secretele
Canale: SFTP cu taste limitate; FTPS - numai cu TLS strict; API - OAuth2/short jetoane TTL.
Criptarea conținutului: PGP/GPG la descărcarea fișierelor; S/MIME pentru e-mail inbox-uri (dacă este utilizat).
Verificarea integrității: SHA-256/512 sumă de control, comparație cu hash în manifest.
Secrete: magazin în Vault/KMS, rotație, interzisă în fișierele/jurnalele de configurare.
Accesări: RBAC + principiul „celor mai mici privilegii”, conturi de servicii separate.
4) Normalizarea și schema de date
4. 1 Reguli universale
Timp: întotdeauna UTC în ISO-8601; pentru datele de decontare, „DATA” fără TZ.
Sume: „DECIMAL (p, s)” în unități minore + „scară individuală”; semn: primire/cheltuiala strict conform dictionarului.
Valute: ISO-4217, tabel de rate fixe cu 'fx _ src'.
Locali: interzicerea autodetectării - setarea explicită a separatoarelor/punctului zecimal/miimii.
Codificări: intrare UTF-8; altele - conversie cu un jurnal.
4. 2 Strat normalizat „plat” (exemplu)
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 de Format: Trucuri și Rake
5. 1 CSV/TSV
Specificaţi explicit „delimiter”, „citat”, „escapechar”, „codificare”.
5. 2 XLSX
Citirea după lista albă a foilor; Auto Merge Inhibit - Aplatizează celulele fuzionate.
Conversia formulelor în valori; Excel → datele UTC cu TZ explicit.
5. 3 XML (ISO 20022 CAMT/DURERE)
Validarea de către XSD; XPath identitate mapping ('<Ntry>', '<TxDtls>', '<Amt>', '<CdtDbtInd>').
Normalizarea creditului/debitului → semn; suport pentru mai multe '<Chrgs>', '<RmtInf>'.
5. 4 MT940
Parsarea etichetelor ': 61:', ': 86:'; sprijin pentru extinderile naționale; câmpurile de poziție → regulile de tăiere.
Consolidarea mai multor „: 61:” într-un singur lot.
5. 5 JSON/NDJSON/API
5. 6 PDF/OCR
În primul rând, o încercare de parsare de masă (detector de masă), numai apoi OCR (Tesseract) cu caractere whitelist.
Post-validare: sume, totaluri de control, reconcilierea numărului de linii.
5. 7 Arhive/Loturi
Despachetarea cu conservarea structurii; fiecare fișier - un "fișier _ id' separat; manifest, controlul tuturor părților.
6) Validări și reguli privind calitatea datelor
Controale obligatorii:- Schema - Toate câmpurile obligatorii sunt prezente.
- Tipuri: sume - numeric, date - parse.
- Sumele de control/Totaluri - Suma rândurilor = Total în fișier (dacă există).
- Intervale: data într-o fereastră rezonabilă; suma> 0 (sau în conformitate cu dicționarul negativ permis).
- Unicitatea: „(furnizor, provider_txid, secvență)” nu este duplicată în normalizat.
- Toleranțele sunt permise „cantitate/fx/timp” discrepanțe.
Rezultat: 'VALID', 'VALID _ WITH _ WARNINGS',' INVALID → DLQ (reason_code) '.
7) Identitate și eliminare a duplicatelor
Cheie de ingestie: '(furnizor, file_name, filesize, checksum, statement_date)' → un singur 'file _ id'.
Row-level idem: 'row _ hash = sha256 (normalized_row_compact)'; reîncărcarea nu creează noi înregistrări.
Webhooks/API: 'idempotency _ key' provider + your tags (' _ id'), stochează TTL.
Duplicate ale furnizorului: dedup prin „provider _ txid” + „secvență”, în caz de discrepanță - în DLQ_DUPLICATE.
8) Orchestrație și programe
: Airflow/Dagster (DAG: 'adu decriptează analizează normalizează validează publică meciul').
SLA/SLO: 'Time-to-Availability (TtA)' de la apariția fișierului la 'normalizat = GATA'.
Retrai: backoff exponențial + jitter; limite de încercare; stări clare.
Concurență și izolare: OCR/parsare XLSX grele - într-o piscină separată/lucrător cu o limită CPU/RAM.
DLQ-reluare: reprelucrare periodică la actualizarea regulilor/mapări.
9) Observabilitate și alerte
Măsurători:- Ingestia Succes%, Parse Succes% de sursă.
- TtA p50/p95, Debit (linii/min).
- Rata DLQ и îmbătrânire DLQ p50/p95.
- Schema Drift Incidente.
- Duplicate Rate по 'provider _ txid'.
- „TtA p95> SLA” → P1.
- „Rata DLQ> 2%” pe oră pentru furnizorul → P1.
- „Schema Drift detectat” → P0 (opri auto-potrivire de sursă).
- „Duplicate spike” → P2 (verificați furnizorul/webhooks).
Dashbord: un fișiere pâlnie " , cardul DLQ pentru motivele, TtA-cantități.
10) Corecții și mapări automate
Antet pseudonime: dicţionar cu versiuni (de exemplu, „Amount'→'amt”, „AMOUNT'→'amt”).
11) Link către „Reconcilierea plăților și rapoartelor PSP”
Strat gata normalizat - intrare pentru potrivire (provider_txid/merchant_ref/fuzzy), calcul diff-taxonomie, auto-busteni și settlement↔bank -stitching. Câmpuri cheie: 'provider _ txid', 'succession', 'kind', 'sound _ minor', 'value _ date', 'account'.
12) Model de stocare și tabele
Tabelul fișierelor debarcate: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
);
Rânduri normalizate:
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) Pseudocodul 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 (rezervă):
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 și editarea jurnalului
Mascare/hashing: PAN/email/phone → 'sha256 + sare', busteni - fara valori primare.
Politica de păstrare: „păstrare” după tipul sursă (AML/contabilitate).
Accesele PII - numai după rol; auditul citirilor/exporturilor.
15) KPI-uri și obiective (pentru parsare/ingestie)
Succesul ingestiei% ≥ 99. 5 %/zi pe sursă.
Parse Succes% ≥ 99%, DLQ ≤ 1%.
TtA p95 (fayl→normalized) ≤ 15 minute (CSV/XML), ≤ 60 minute (PDF/OCR).
Schema Drift Incidente: 0/lună fără alertă/remediere.
Duplicate Rate по 'provider _ txid' ≤ 0. 05%.
16) Registrele de redare incidente
Schema derivă: opriți auto-potrivirea, porniți parserul „moale” cu detectarea ML a difuzoarelor, pregătiți un patch alias, rulați DLQ-reluare.
Supratensiune DLQ: depanarea celor mai recente fișiere, verificarea codificării/localizării/semnului, scăderea temporară a severității toleranțelor (cu un pavilion).
Întârzieri SFTP: trecerea la API de votare/webhooks, creșterea de retrasări, comunicarea cu furnizorul.
Spikes duplicate: activați verificarea suplimentară „row _ hash”, blocați repetările până la clarificare.
17) Pachet de caz de testare (UAT/Prod-Ready)
1. Idempotency: Repetați aceeași sarcină → 1 'file _ id', 0 linii noi.
2. Localizări: fișiere cu ', '/'. "/spații → sume corecte.
3. Parțială/rambursare: mai multe „secvență” la unul „provider _ txid”.
4. XML XSD: CAMT nevalid → 'INVALID' + DLQ.
5. variații MT940: extensii naționale → analiză corectă.
6. PDF→OCR: scanarea cu zgomot → extragerea și trecerea regulilor de bază.
7. Schema derivă: un nou antet → patch-uri alias și reprocesarea fișierelor istorice.
8. Transfer: test de încărcare a fișierelor N/oră → conformitate cu TtA SLA.
9. Ediție PII: jurnale fără PAN/e-mail, doar hash-uri.
18) Lista de verificare a implementării
- Registrul sursă: Protocol, Program, SLA, Format, Contact.
- Secure canale (SFTP/PGP/API), Vault pentru secrete.
- Idempotent ingestie + checksum + versiuni.
- Parsere după format, dicționar alias, politici sign/locale.
- Strat normalizat și indici cheie.
- Reguli de validare, toleranțe, DLQ și reluare.
- Orchestrator (DAG), Retrai/Backoff, Piscine de resurse.
- Observabilitate: valori, tablouri de bord, alerte.
- Mascare GDPR/PII, audituri de acces.
- Cazuri de testare și exerciții regulate schema-drift.
Rezumat reluare
Automatizarea parsării nu este de a „scrie un parser”, ci de a construi un circuit industrial: livrare și criptare fiabile, conducte idempotente, normalizare strictă, reguli de calitate și alerte transparente. O astfel de schiță transformă orice registre în tabele previzibile cu un SLA garantat privind disponibilitatea datelor - fundamentul pentru reconciliere, trezorerie și raportarea gestiunii.