Reyestrlərin parsinqi və avtomatlaşdırılması
TL; DR
Etibarlı «sınaq» avtomatikası üç balina üzərində qurulur: determinik ingestion (təhlükəsiz çatdırılma, idempotentlik, bütövlük nəzarəti), normallaşdırılmış məlumat təbəqəsi (vahid sxem, müqayisə açarları, standartlaşdırılmış vaxt/valyuta/işarə vahidləri) və sərt keyfiyyət intizamı (validasiya, tolerans, DLQ, həyəcan, avtomatik korreksiya). Məqsəd müxtəlif faylları/vebhukları SLA ilə müqayisə, hesabat və BI üçün sabit cədvəllərə çevirməkdir.
1) Mənbələrin və formatların landşaftı
1. 1 Mənbələr
PSP/ekvayerlər/aqreqatorlar: əməliyyatlar, setlər, komissiyalar, mübahisələr.
Banklar: MT940 çıxarışları, ISO 20022 CAMT. 052/053/054, PAIN ödənişləri. 001/002.
ARM/cüzdan/ödənişlər (OCT/RTP/SEPA): payouts reyestrləri, geri qaytarmalar.
Kriptovalyuta/birjalar: on-chain əməliyyatları, konvertasiya/komissiya hesabatları.
Vergilər/dövlət. portallar: CSV/XLSX/PDF, bəzən script brauzer vasitəsilə.
1. 2 Formatlar
CSV/TSV (variativ ayırıcılar, lokallar, kodlamalar).
XLSX (multi-shit, birləşmiş hüceyrələr).
XML (ISO 20022 CAMT/PAIN, XSD xüsusi sxemləri).
SWIFT MT940/942 (mövqe sahələri).
JSON-API/NDJSON (inkremental boşaltmalar, kursorlar).
PDF (tablo - parser; skanlar - OCR).
ZIP/TAR. GZ (bir neçə fayl ilə batches).
2) ingestion-paypline arxitekturası
Konturlar:1. Landing: təhlükəsiz fayl qəbulu (SFTP/FTPS/WebDAV/API/webhooks) → dərhal checksum hesab, xammal dəyişməz saxlamaq.
2. Raw: tarixləri/provayderləri/batcham, versiyaları ilə saxlama.
3. Normalize: parsing → tipləri/vahidləri unifikasiya → normalized cədvəllər.
4. Validated: post-validation (keyfiyyət qaydaları) → bayraqlar, DLQ.
5. Matched: daxili hadisələr/bank ilə müqayisə.
6. Serving/BI: yoxlama/maliyyə/əməliyyatlar üçün vitrinlər.
Əsas tələblər:- İdempotentlik ingestion: '(provider, file_name, file_size, checksum, statement_date)' → unikal açar.
- Təkrar/retraj: Faylın təkrar təqib edilməsi dubl yaratmır.
- DLQ (dead-letter queue): tanınmayan/pozulmuş hər şey - təcrid olunmuş növbədə.
- Version: eyni gün üçün yeni fayl → əvvəlki link ilə yeni versiyası.
3) Çatdırılma və sirlərin təhlükəsizliyi
Kanallar: məhdud açarları olan SFTP; FTPS - yalnız ciddi TLS ilə; API - Qısa TTL ilə OAuth2/tokenlər.
Məzmun şifrələməsi: Faylları yükləyərkən PGP/GPG; S/MIME elektron poçt qutuları üçün (istifadə edildikdə).
Bütövlük nəzarəti: SHA-256/512 checksum, manifestdə heş ilə müqayisə.
Secrets: Vault/KMS saxlamaq, rotasiya, -fayllar/log qadağan.
Giriş: RBAC + «ən kiçik imtiyazlar» prinsipi, fərdi xidmət hesabları.
4) Məlumatların normallaşdırılması və sxemi
4. 1 Universal qaydalar
Vaxt: həmişə UTC ISO-8601; tarixlər üçün settlement - TZ olmadan 'DATE'.
Məbləğlər: 'DECIMAL (p, s)' in minor units + ayrı 'scale'; işarə: lüğət ilə ciddi gəlir/xərcləmə.
Valyutalar: ISO-4217, sabit məzənnə cədvəli 'fx _ src'.
Lokallar: avtodetektin qadağan edilməsi - bölücülərin/onluq nöqtənin/mində birinin açıq-aşkar tənzimlənməsi.
Kodlaşdırma: UTF-8-ə giriş; digərləri - log ilə konvertasiya.
4. 2 Normallaşdırılmış «düz» təbəqə (nümunə)
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) Parser formatları: fəndlər və dırmıq
5. 1 CSV/TSV
Açıq şəkildə 'delimiter', 'quotechar', 'escapechar', 'encoding'.
5. 2 XLSX
sheet whitelist; Avtomatik birləşmələrin qadağan edilməsi - birləşdirilmiş hüceyrələrin yastılaşması.
Formulların qiymətlərə çevrilməsi; açıq TZ ilə Excel → UTC tarixləri.
5. 3 XML (ISO 20022 CAMT/PAIN)
XSD ilə validasiya; XPath-mapping rekvizitləri ('<Ntry>', '<TxDtls>', '<Amt>', '<CdtDbtInd>').
Normallaşma credit/debit → işarə; çox dəstək '<Chrgs>', '<RmtInf>'.
5. 4 MT940
Etiketlərin təhlili ': 61:', ': 86:'; milli genişləndirmələrin dəstəklənməsi; mövqe sahələri → slicing qaydaları.
Bir neçə 'konsolidasiya: 61:' bir bath.
5. 5 JSON/NDJSON/API
5. 6 PDF/OCR
Əvvəlcə masa parsinqinə cəhd (tab-detektor), yalnız sonra simvolların whitelist ilə OCR (Tesseract).
Post-validasiya: məbləğlər, nəzarət nəticələri, sətir sayının müqayisəsi.
5. 7 Arxivlər/batches
Strukturu saxlayaraq açmaq; hər bir fayl üçün ayrı 'file _ id'; manifest, bütün hissələri nəzarət.
6) Validasiya və məlumat keyfiyyəti qaydaları
Məcburi yoxlamalar:- Sxem: bütün required sahələr mövcuddur.
- Növləri: məbləğlər - ədədi, tarixlər - pars.
- Nəzarət məbləğləri/nəticələri: sətirlərin cəmi = faylda cəmi (varsa).
- Diapazonlar: ağıllı pəncərədə tarix; cəmi> 0 (və ya icazə verilən mənfi lüğət).
- Unikallığı: '(provider, provider_txid, sequence)' normalized.
- Tolerans: 'amount/fx/time' uyğunsuzluqları.
Nəticə: 'VALID', 'VALID _ WITH _ WARNINGS', 'INVALID → DLQ (reason_code)'.
7) İdempotentlik və duplikasiya
Ingestion key: '(provider, file_name, filesize, checksum, statement_date)' → yeganə 'file _ id'.
Row-level idem: `row_hash = sha256(normalized_row_compact)`; təkrar yükləmə yeni qeydlər yaratmır.
Webhooks/API: 'idempotency _ key' provayder + sizin etiketlər ('exec _ id'), TTL saxlamaq.
Provayderin dubli: 'provider _ txid' + 'sequence' dedupu, uyğunsuzluq olduqda - DLQ_DUPLICATE.
8) Orkestr və cədvəllər
Оркестратор: Airflow/Dagster (DAG: `fetch → decrypt → parse → normalize → validate → publish → match`).
SLA/SLO: 'Time-to-Availability (TtA)' faylın görünüşündən 'normalized = READY' -ə qədər.
Retray: eksponensial backoff + jitter; cəhd limitləri; aydın statuslar.
Paralellik və izolyasiya: ağır OCR/parsinq XLSX - CPU/RAM limiti ilə ayrı bir hovuz/worker.
DLQ-replay: qaydaları/mappinqləri yenilədikdə periodik reprocess.
9) Müşahidə və alertlər
Metriklər:- Ingestion Success%, Parse Success% mənbələrə görə.
- TtA p50/p95, Throughput (sətir/dəq).
- DLQ Rate и Aging DLQ p50/p95.
- Schema Drift Incidents (başlıqların/formatın dəyişdirilməsi).
- Duplicate Rate по `provider_txid`.
- `TtA p95 > SLA` → P1.
- 'DLQ Rate> 2%' provayder → P1.
- 'Schema Drift detected' → P0 (mənbəyə görə avtomatik matç dayandırılması).
- 'Duplicate spike' → P2 (provayderini/vebhukini yoxlayın).
Dashbord: huni 'files → rows_raw → rows_norm → rows_valid → rows_matched', səbəblərə görə DLQ kartı, TtA-kvantili.
10) Avtomobil korreksiyaları və mappinqlər
Header aliases: versiyası ilə lüğət (e. g., `Amount`→`amt`, `AMOUNT`→`amt`).
11) «PSP ödənişlər və hesabatların müqayisəsi» ilə əlaqə
Hazır normalized təbəqə - matç (provider_txid/merchant_ref/fuzzy), diff-taksonomiya hesablanması, avto-jurnallar və bank-tikişlər üçün giriş. Açar sahələr: 'provider _ txid', 'sequence', 'kind', 'amount _ minor', 'value _ date', 'account'.
12) Saxlama modeli və cədvəllər
Landed fayllar cədvəli: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
);
Normallaşdırılmış sətirlər:
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) Parserlərin psevdokodu
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 və log redaktə
Maskalama/Hash: PAN/email/telefon → 'sha256 + salt', loqlar - ilkin dəyərlər olmadan.
Saxlama siyasəti: mənbə növünə görə 'retention' (AML/mühasibat uçotu).
PII-yə giriş - yalnız rola görə; oxu/ixrac audit.
15) KPI və məqsədlər (parsinq/ingestion üçün)
Ingestion Success % ≥ 99. mənbə başına 5 %/gün.
Parse Success % ≥ 99%, DLQ ≤ 1%.
TtA p95 (dosya → normalized) ≤ 15 dəqiqə (CSV/XML), ≤ 60 dəqiqə (PDF/OCR).
Schema Drift Incidents: 0/ay alert/fix olmadan.
Duplicate Rate по `provider_txid` ≤ 0. 05%.
16) Hadisə pleybukları
Schema drift: avtomatik matç dayandırın, ML-detektor sütunları ilə «yumşaq» parser yandırmaq, alias-patch hazırlamaq, DLQ-replay sürmək.
DLQ sıçrayışı: son faylların düzəldilməsi, kodlaşdırma/lokal/işarənin yoxlanılması, toleransın sərtliyini müvəqqəti olaraq azaltmaq (bayraqla).
SFTP gecikmələri: API-polling/vebhuklara keçid, retrajların artırılması, provayderlə ünsiyyət.
Spikes duplicates: 'row _ hash' əlavə yoxlamasını, dəqiqləşdirilmədən əvvəl təkrarlama blokunu işə salın.
17) Test case paketi (UAT/Prod hazır)
1. İdempotentlik: eyni yükləməni təkrarlayın → 1 'file _ id', 0 yeni sətir.
2. Lokallar: s ', '/'. '/boşluqlar → doğru məbləğlər.
3. Partial/refund: bir 'provider _ txid' üçün bir neçə 'sequence'.
4. XML XSD: qeyri-sabit CAMT → 'INVALID' + DLQ.
5. MT940 variasiyaları: milli uzantıları → düzgün təhlil.
6. PDF → OCR: səs-küylü skan → əsas qaydaların çıxarılması və keçməsi.
7. Schema drift: yeni heder → alias patch və tarixi faylların təkrar emalı.
8. Throughput: yük testi N faylları/saat → TtA SLA riayət.
9. PII-Edition: PAN/e-mail olmadan log, yalnız hash.
18) Giriş çek siyahısı
- Mənbələrin reyestri: protokol, cədvəl, SLA, format, əlaqə.
- Təhlükəsiz kanallar (SFTP/PGP/API), Gizli üçün Vault.
- İdempotent ingestion + checksum + versiyası.
- Format Parsers, alias-lüğət, sign/locale-siyasət.
- Normallaşdırılmış qat və açar indeksləri.
- Validasiya, tolerans, DLQ və replay qaydaları.
- Orkestrator (DAG), retrai/backoff, resurs hovuzları.
- Müşahidə: metriklər, daşbordlar, alertlər.
- GDPR/PII-maskalama, giriş auditləri.
- Test halları və müntəzəm schema-drift drills.
Xülasə
Parsinq avtomatlaşdırılması «parser yazmaq» deyil, sənaye konturunu qurmaqdır: etibarlı çatdırılma və şifrələmə, idempotent payplaynlər, ciddi normallaşma, keyfiyyət qaydaları və şəffaf alertlər. Belə bir kontur hər hansı bir reyestri məlumatların mövcudluğu üçün zəmanətli SLA ilə proqnozlaşdırıla bilən cədvəllərə çevirir - yoxlama, xəzinədarlıq və idarəetmə hesabatlarının əsası.