რეგისტრატორების პარსინგი და ავტომატიზაცია
TL; DR
საიმედო „სანთლის“ ავტომატიზაცია ემყარება სამ ვეშაპს: დეტერმინის ინვესტიცია (უსაფრთხო მიწოდება, იდემპოტენტურობა, მთლიანობის კონტროლი), ნორმალიზებული მონაცემთა ფენა (ერთიანი სქემა, შედარების გასაღებები, დროის/ვალუტის/ნიშნების სტანდარტიზებული ერთეულები) და მკაცრი ხარისხის დისციპლინა (ვალიდაცია, ტოლერანტობა, DLQ, ალერტები, ავტო კორექტირება). მიზანია მრავალფეროვანი ფაილების/ვებჰუკების სტაბილურ ცხრილებად გადაქცევა curved, ანგარიშგების და BI SLA- სთან წვდომის თვალსაზრისით.
1) წყაროების და ფორმატების ლანდშაფტი
1. 1 წყაროები
PSP/შემქმნელები/აგრეგატორები: გარიგებები, ნაკრები, საკომისიო, დავები.
ბანკები: MT940, ISO 20022 CAMT ამონაწერები. 052/053/054, PAIN გადახდები. 001/002.
ARM/საფულეები/გადახდები (OCT/RTP/SEPA): payouts რეესტრები, ზარალი.
Crypto-castodi/გაცვლა: on-chein გარიგებები, კონვერტაციის/საკომისიო ანგარიშები.
გადასახადები/სახელმწიფო. პორტალები: CSV/XLSX/PDF, ზოგჯერ სკრიპტირებული ბრაუზერის საშუალებით.
1. 2 ფორმატები
CSV/TSV (ვარიატიული გამყოფი, ლოკალი, კოდირება).
XLSX (მულტფილმები, კომბინირებული უჯრედები).
XML (ISO 20022 CAMT/PAIN, კასტომიური XSD სქემა).
SWIFT MT940/942 (პოზიციური ველები).
JSON-API/NDJSON (სავარაუდო გადმოტვირთვები, კურსორები).
PDF (ფირფიტა - პარსერი; Skans - OCR).
ZIP/TAR. GZ (ბრძოლები რამდენიმე ფაილით).
2) განაწილების არქიტექტურა
კონტურები:1. Landing: უსაფრთხო ფაილების მიღება (SFTP/FTPS/WebDAV/API/webhooks), დაუყოვნებლივ მიგვაჩნია checksum, ჩვენ ყოველთვის ვრჩებით ნედლეულს.
2. Raw: განლაგება თარიღების/პროვაიდერების/ბრძოლების მიხედვით, შენახვა ვერსიით.
3. Normalize: პარსინგი - ტიპების/ერთეულების გაერთიანება ნორმალიზებული ცხრილის შესახებ.
4. Validated: პოსტვალიდაცია (ხარისხის წესები) - დროშები, DLQ.
5. Matched: შედარება შიდა მოვლენებთან/ბანკთან.
6. Serving/BI: ფანჯრები გადამოწმების/ფინანსების/ოპერაციებისთვის.
ძირითადი მოთხოვნები:- Idempotention ungestion: '(provider, file _ name, file _ size, checksum, statement _ date)' არის უნიკალური გასაღები.
- გამეორება/გამეორება: ფაილის განმეორება არ ქმნის დუბლს.
- DLQ (dead-letter queue): ყველა ამოუცნობი/არღვევს წესებს - იზოლირებულ რიგში.
- ვერსია: ახალი ფაილი იმავე დღეს არის ახალი ვერსია წინა მითითებით.
3) მიწოდებისა და საიდუმლოების უსაფრთხოება
არხები: SFTP შეზღუდული კლავიშებით; FTPS - მხოლოდ მკაცრი TLS- ით; API - OAuth2/ნიშნები მოკლე TTL.
შინაარსის დაშიფვრა: PGP/GPG ფაილების ჩატვირთვისას; S/MIME ელექტრონული ფოსტის ინბოქსებისთვის (თუ გამოიყენება).
მთლიანობის კონტროლი: SHA-256/512 checksum, შედარება ჰაშასთან მანიფესტში.
საიდუმლოებები: შენახვა Vault/KMS- ში, როტაცია, აკრძალულია კონფისკაციის ფაილებში/ლოგოებში.
წვდომა: RBAC + „მინიმალური შეღავათების“ პრინციპი, ინდივიდუალური მომსახურების ანგარიშები.
4) ნორმალიზაცია და მონაცემთა სქემა
4. 1 უნივერსალური წესები
დრო: ყოველთვის UTC ISO-8601; Settlement თარიღებისთვის - 'DATE' TZ- ის გარეშე.
თანხები: 'DECIMAL (p, s)' minor units + ცალკე 'scale "; ნიშანი: მრევლი/მოხმარება მკაცრად ლექსიკონის მიხედვით.
ვალუტები: ISO-4217, კურსების ფიქსირებული ცხრილი „fx _ src“.
ლოკალი: საავტომობილო პროექტის აკრძალვა - გამყოფების/ათობითი წერტილის/ათასი.
კოდირება: შესასვლელი UTF-8; სხვები - კონვერტაცია ლოგოსთან.
4. 2 ნორმალიზებული „ბრტყელი“ ფენა (მაგალითი)
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) პარსერები ფორმატით: ხრიკები და ძარცვები
5. 1 CSV/TSV
აშკარად დაუსვით 'delimiter', 'é techar', 'escapechar', 'encoding'.
5. 2 XLSX
წაიკითხეთ sheet whitelist; ავტოკატასტროფების აკრძალვა არის ერთიანი უჯრედების გავრცელება.
ფორმულების მნიშვნელობებად გადაქცევა; Excel-UTC თარიღები აშკარა TZ- ით.
5. 3 XML (ISO 20022 CAMT/PAIN)
XSD ვალიდაცია; XPath-mapping დეტალები ('<Ntry>', '<TxDtls>', '<Amt>', '<CdtDbtInd>').
Credit/debit- ის ნორმალიზაცია ნიშანი; მხარდაჭერა მრავლობითი '<Chrgs>', '<RmtInf>'.
5. 4 MT940
ჭდეების ანალიზი ': 61:', ': 86:'; ეროვნული გაფართოების მხარდაჭერა; პოზიციური ველები - slicing წესები.
რამდენიმე 'კონსოლიდაცია: 61:' ერთ ბატში.
5. 5 JSON/NDJSON/API
5. 6 PDF/OCR
ჯერ ფირფიტის პარსინგის მცდელობა (ტაბლეტის დეტექტორი), მხოლოდ ამის შემდეგ OCR (Tesseract) whitelist სიმბოლოებით.
პოსტვალიდაცია: თანხები, საკონტროლო შედეგები, ხაზების რაოდენობის შერიგება.
5. 7 არქივები/ბატჩები
რასპაკოვკა სტრუქტურის შენარჩუნებით; თითოეული ფაილი - ცალკეული 'file _ id'; მანიფესტი, ყველა ნაწილის კონტროლი.
6) ვალიდაცია და მონაცემთა ხარისხის წესები
სავალდებულო შემოწმებები:- სქემა: ყველა required ველი არსებობს.
- ტიპები: თანხები - რიცხვები, თარიღები - ფხვიერი.
- მაკონტროლებელი თანხები/შედეგები: ხაზების ჯამი = შედეგი ფაილში (თუ არსებობს).
- დიაპაზონი: თარიღი გონივრულ ფანჯარაში; თანხა> 0 (ან დასაშვები უარყოფითი ლექსიკონის მიხედვით).
- უნიკალურობა: '(provider, provider _ txid, sequence)' არ არის დუბლირებული normalized.
- ტოლერანები: დასაშვები განსხვავებები 'amount/fx/time'.
შედეგი: 'VALID', 'VALID _ WITH _ WARNINGS', 'INVALID-DLQ (reason _ code) ".
7) Idempotence და deduplication
Ingestion key: '(provider, file _ name, filesize, checksum, statement _ date)' არის ერთადერთი 'file _ id ".
Row-level idem: `row_hash = sha256(normalized_row_compact)`; განმეორებითი დატვირთვა არ ქმნის ახალ ჩანაწერებს.
Webhooks/API: 'idempotence _ key' პროვაიდერი + თქვენი ეტიკეტები ('exec _ id'), შენახვა TTL.
პროვაიდერის დუბლები: დედაპლატი 'provider _ txid' + 'sequence', შეუსაბამობის დროს - DLQ _ DUPLICATE- ში.
8) ორკესტრი და გრაფიკი
Оркестратор: Airflow/Dagster (DAG: `fetch → decrypt → parse → normalize → validate → publish → match`).
SLA/SLO: 'Time-to-Availity (TtA)' ფაილის გამოჩენიდან 'normalized = READY ".
Retrai: ექსპონენციალური backoff + jitter; მცდელობის შეზღუდვები; მკაფიო სტატუსები.
პარალელიზმი და იზოლაცია: მძიმე OCR/პარსინგი XLSX - ცალკეულ აუზში/ვორკერში, CPU/RAM ლიმიტით.
DLQ-replay: პერიოდული რეპლიკა წესების/მაპინგის განახლების დროს.
9) დაკვირვება და ალერტა
მეტრიკა:- Ingestion Success%, Parse Success% წყაროების მიხედვით.
- TtA p50/p95, Throughput (სტრიქონები/წთ).
- DLQ Rate и Aging DLQ p50/p95.
- Schema Drift Incidents (სათაურების/ფორმატის შეცვლა).
- Duplicate Rate по `provider_txid`.
- `TtA p95 > SLA` → P1.
- 'DLQ Rate> 2%' პროვაიდერის P1 საათში.
- 'Schema Drift detected' - P0 (მანქანის მატჩის შეჩერება წყაროს მიხედვით).
- 'Duplicate spike' P2 (შეამოწმეთ პროვაიდერი/ვებჰუკი).
Dashboard: ძაბრი 'files' rows _ rows _ norm - rows _ valid- ის rows _ matched ', DLQ რუკა მიზეზების გამო, TtA კვარტალი.
10) ავტო კორექცია და მაპინგი
Header aliases: ლექსიკონი ვერსიებით (e. g., `Amount`→`amt`, `AMOUNT`→`amt`).
11) კავშირი „PSP გადახდისა და ანგარიშების შერიგებასთან“
მზა normalized ფენა - შესასვლელი მატჩის ჩასატარებლად (provider _ txid/merchant _ ref/fuzzy), diff ტაქსონომიის გაანგარიშება, ავტო ჟურნალები და stettlement - bank-fuzzy. ძირითადი ველები: 'provider _ txid', 'sequence', 'kind', 'amount _ minor', 'value _ date', 'account'.
12) საცავის და ცხრილების მოდელი
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
);
ნორმალიზებული ხაზები:
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) პარსერების ფსევდოკოდი
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 და ლოგოების რედაქტირება
შენიღბვა/ჰაშირება: PAN/email/ტელეფონი - 'sha256 + salt', ლოგოები - პირველადი მნიშვნელობების გარეშე.
შენახვის პოლიტიკა: „retention“ წყაროს ტიპის მიხედვით (AML/ბუღალტრული აღრიცხვა).
PII- ს წვდომა მხოლოდ როლისთვის; კითხვის/ექსპორტის აუდიტი.
15) KPI და მიზნები (პარსინგისთვის/განაწილებისთვის)
Ingestion Success % ≥ 99. 5 %/დღე წყაროზე.
Parse Success % ≥ 99%, DLQ ≤ 1%.
TtA p95 (ფაილი - ნორმალიზებული) - 15 წუთი (CSV/XML), 60 წუთი (PDF/OCR).
Schema Drift Incidents: 0/თვე ალერტის/ფიქსის გარეშე.
Duplicate Rate по `provider_txid` ≤ 0. 05%.
16) ინციდენტების ფლეიბუკი
Schema drift: მანქანების მატჩის გაჩერება, ჩართეთ „რბილი“ პარსერი ML დეტალურ სვეტებთან, მოამზადეთ alias-patch, გაიყვანეთ DLQ-replay.
DLQ- ის ზრდა: უახლესი ფაილების გამართვა, კოდირების/ლოკალის/ნიშნის შემოწმება, დროებით შეამციროს ტოლერანტების სიმძიმე (დროშით).
SFTP შეფერხებები: გადასვლა API-polling/webhuks- ზე, retray- ის ზრდა, კომუნიკაცია პროვაიდერთან.
Spikes duplicates: ჩართეთ 'row _ hash', გამეორების ბლოკი დაზუსტებამდე.
17) ტესტის შემთხვევის პაკეტი (UAT/Snews)
1. Idempotence: იგივე დატვირთვის განმეორება - 1 'file _ id', 0 ახალი სტრიქონი.
2. Lockaly: ფაილები ', '/'. '/ხარვეზები - სწორი თანხები.
3. Partial/refund: რამდენიმე 'sequence' ერთი 'provider _ txid'.
4. XML XSD: შეუმჩნეველი CAMT 'INVALID' + DLQ.
5. MT940 ვარიაციები: ეროვნული გაფართოებები და სწორი ანალიზი.
6. PDF - OCR: სკანირება ხმაურით - ძირითადი წესების მოპოვება და გავლა.
7. Schema drift: ახალი hader-alias-patch და ისტორიული ფაილების ხელახალი დამუშავება.
8. Throughput: დატვირთვის ტესტირება N ფაილები/სთ - შესაბამისობა TtA SLA.
9. PII გამოცემა: ლოგოები PAN/ელ.ფოსტის გარეშე, მხოლოდ ჰეში.
18) განხორციელების შემოწმების სია
- წყაროების რეესტრი: ოქმი, გრაფიკი, SLA, ფორმატი, კონტაქტი.
- უსაფრთხო არხები (SFTP/PGP/API), საიდუმლო Vault.
- Idempotent ingestion + checksum + ვერსია.
- პარსერები ფორმატებში, alias ლექსიკონში, ადგილობრივ პოლიტიკაში.
- ნორმალიზებული ფენა და გასაღების ინდექსები.
- ვალიდაციის წესები, ტოლერანები, DLQ და რეპლეი.
- ორკესტრი (DAG), retrai/backoff, რესურსების აუზები.
- დაკვირვება: მეტრიკები, დაშბორდები, ალერტები.
- GDPR/PII ნიღბები, წვდომის აუდიტი.
- ტესტის შემთხვევები და რეგულარული schema-drift drills.
რეზიუმე
პარსინგის ავტომატიზაცია არ არის „პარსერის დაწერა“, არამედ სამრეწველო წრის შექმნა: საიმედო მიწოდება და დაშიფვრა, idempotent payplines, მკაცრი ნორმალიზაცია, ხარისხის წესები და გამჭვირვალე ალერტები. ასეთი წრე ნებისმიერ რეესტრს გადააქცევს პროგნოზირებულ ცხრილში გარანტირებულ SLA- ს მონაცემების ხელმისაწვდომობის შესახებ - შედუღების, ხაზინის და მენეჯმენტის ანგარიშგების საფუძველი.