FAQ

ব্যাঙ্ক স্টেটমেন্ট পার্সার সম্পর্কে সাধারণ প্রশ্ন

ডেটা গোপনীয়তা ও কমপ্লায়েন্স

কোনো ডেটা কি আমার infrastructure ছেড়ে যায়?

না — এমনকি PDF extraction-এর জন্যও না। Bank Statement Parser একটি stateless লাইব্রেরি হিসেবে কাজ করে। সমস্ত প্রক্রিয়াকরণ -- পার্সিং, PII রিডাকশন, আর্কাইভ extraction -- আপনার স্থানীয় রানটাইম মেমরিতে ঘটে। Hybrid PDF pipeline স্থানীয় LLM inference-এর জন্য Ollama ব্যবহার করে — কোনো cloud API নেই। XML পার্সার no_network=True দিয়ে শক্তিশালী করা হয়েছে, পার্সার স্তরে সমস্ত আউটবাউন্ড অ্যাক্সেস ব্লক করে। আপনার আর্থিক ডেটা কখনই আপনার পরিবেশ ছাড়ে না।

PII রিডাকশন কীভাবে কাজ করে?

সংবেদনশীল ক্ষেত্র আপনার অ্যাপ্লিকেশন লজিকে পৌঁছানোর আগেই মাস্ক করা হয়। পার্সার debtor নাম, creditor নাম, IBAN এবং ডাক ঠিকানা চিহ্নিত করে, কনসোল আউটপুট ও streaming মোডে ***REDACTED*** দিয়ে প্রতিস্থাপন করে।

  • ডিফল্টরূপে রিডাকশন চালু CLI আউটপুট ও streaming মোডে।
  • ফাইল এক্সপোর্ট (CSV, JSON, Excel) ডাউনস্ট্রিম প্রক্রিয়াকরণের জন্য অসংশোধিত ডেটা রাখে।
  • CLI-তে --show-pii বা API-তে redact_pii=False দিয়ে সম্পূর্ণ ডেটায় অপ্ট-ইন করুন।

extraction প্রক্রিয়া কি নির্ধারক?

স্ট্রাকচার্ড ফর্ম্যাটের জন্য হ্যাঁ — প্রতিটি রানে বাইট-অভিন্ন আউটপুট। একই ইনপুট ফাইল দিলে, নির্ধারক পার্সার (CAMT, PAIN.001, CSV, OFX, QFX, MT940) প্রতিবার একই ফলাফল দেয়। কোনো randomness, কোনো model inference, কোনো heuristic sampling নেই।

Hybrid PDF pipeline-এর জন্য, LLM-ভিত্তিক extraction পথ রানের মধ্যে সামান্য পার্থক্য দেখাতে পারে। এজন্যই প্রতিটি PDF extraction Golden Rule (opening + credits − debits == closing) দিয়ে যাচাই করা হয় এবং চিহ্নিত অসঙ্গতি ইন্টারেক্টিভভাবে পর্যালোচনা করা যায়।

CI 100% branch coverage-এ 718 টেস্ট দিয়ে নির্ধারকতা প্রয়োগ করে, Hypothesis-এর মাধ্যমে property-based fuzzing সহ।

প্রকল্পটি কোন কমপ্লায়েন্স স্ট্যান্ডার্ড অনুসরণ করে?

প্রকল্পটি সম্পূর্ণ traceability সহ ISO 13485-সংযুক্ত ডকুমেন্টেশন বজায় রাখে:

  • তীব্রতা/সম্ভাব্যতা স্কোরিং ও অবশিষ্ট ঝুঁকি মূল্যায়ন সহ একটি পরিমাণগত Risk Register
  • 5টি পর্যায়ে 19টি gated ধাপ সহ একটি Verification and Validation Plan
  • প্রভাব মূল্যায়ন ও rollback protocol সহ একটি Change Control Procedure
  • ঝুঁকি স্তর ও EOL tracking সহ সমস্ত ডিপেন্ডেন্সি কভার করে একটি SOUP Register
  • implementation ও verification-এ design input ম্যাপিং করে একটি Traceability Matrix

প্রতিটি রিলিজে CycloneDX SBOM, SHA-256 checksum, এবং GitHub build provenance attestation অন্তর্ভুক্ত।

পারফরম্যান্স ও স্কেলেবিলিটি

Bank Statement Parser কত দ্রুত?

পারফরম্যান্স threshold প্রতিটি commit-এ CI-তে যাচাই করা হয়:

মেট্রিক মান
CAMT.053 থ্রুপুট 27,000+ লেনদেন/সেকেন্ড
PAIN.001 থ্রুপুট 52,000+ লেনদেন/সেকেন্ড
প্রতি-লেনদেন লেটেন্সি (CAMT) 37 মাইক্রোসেকেন্ড
প্রতি-লেনদেন লেটেন্সি (PAIN.001) 19 মাইক্রোসেকেন্ড
প্রথম ফলাফলের সময় < 2 ms

PDF extraction গতি রাউটিং পথের উপর নির্ভর করে: deterministic (সাব-সেকেন্ড), text-LLM (সেকেন্ড), vision-LLM (প্রতি পৃষ্ঠায় সেকেন্ড)।

বড় ফাইল কীভাবে পরিচালনা করা হয়?

সীমাবদ্ধ মেমরি সহ streaming — প্রতি ফাইলে 50,000 লেনদেনে পরীক্ষিত। XML ফাইল ক্রমান্বয়ে প্রক্রিয়া করতে parse_streaming() ব্যবহার করুন। প্রতিটি লেনদেন dictionary হিসেবে yield হয়; মেমরি বৃদ্ধি রোধে প্রক্রিয়াকরণের পর element পরিষ্কার করা হয়। মেমরি ফাইলের আকারের সাথে স্কেল করে না — 50K-লেনদেন পরীক্ষা (25+ MB) 10K-লেনদেন পরীক্ষার 2x-এর কম মেমরি ব্যবহার করে।

50 MB-এর বেশি ফাইলের জন্য (যেমন 100K+ পেমেন্ট সহ host-to-host PAIN.001 batch), পার্সার chunk-ভিত্তিক namespace stripping সহ temporary ফাইলের মাধ্যমে stream করে — সম্পূর্ণ ডকুমেন্ট কখনই মেমরিতে লোড হয় না।

ZIP আর্কাইভ কীভাবে নিরাপদে প্রক্রিয়া করা হয়?

iter_secure_xml_entries() extraction-এর আগে প্রতিটি member যাচাই করে:

  • Entry size cap (প্রতি এন্ট্রিতে ডিফল্ট 10 MB)
  • মোট uncompressed size cap (ডিফল্ট 50 MB)
  • Compression ratio limit (ডিফল্ট 100:1) ZIP bomb প্রতিরোধে
  • Encrypted entry rejection

ডিস্কে কোনো ফাইল লেখা হয় না। XML বাইট from_bytes()-এর মাধ্যমে সরাসরি পার্সারে পাস হয়।

আমি কি parallel-এ একাধিক ফাইল পার্স করতে পারি?

হ্যাঁ। parse_files_parallel() ব্যবহার করুন যা ProcessPoolExecutor জুড়ে কাজ বিতরণ করে:

from bankstatementparser import parse_files_parallel

results = parse_files_parallel([
    "statements/jan.xml",
    "statements/feb.xml",
    "statements/mar.xml",
])
for r in results:
    print(r.path, r.status, len(r.transactions), "rows")

Bulk PDF ingestion-এর জন্য, scan_and_ingest() ব্যবহার করুন যা স্বয়ংক্রিয় ডিডুপ্লিকেশন সহ সম্পূর্ণ ফোল্ডার ট্রি প্রক্রিয়া করে।

সমর্থিত ফর্ম্যাট

কোন ব্যাঙ্ক স্টেটমেন্ট ফর্ম্যাট সমর্থিত?

ফর্ম্যাট স্ট্যান্ডার্ড ফাইলের ধরন পার্সার/মেথড
CAMT.053 ISO 20022 Bank-to-Customer Statement .xml CamtParser
PAIN.001 ISO 20022 Credit Transfer Initiation .xml Pain001Parser
CSV জেনেরিক ব্যাঙ্ক এক্সপোর্ট .csv CsvStatementParser
OFX Open Financial Exchange .ofx OfxParser
QFX Quicken Financial Exchange .qfx QfxParser
MT940 SWIFT standard .mt940, .sta Mt940Parser
PDF ডিজিটাল ও স্ক্যান করা স্টেটমেন্ট .pdf smart_ingest()

Hybrid PDF pipeline কীভাবে কাজ করে?

Hybrid pipeline (v0.0.5+) বুদ্ধিমত্তার সাথে PDF তিনটি extraction পথে রাউট করে:

  • Path A (Deterministic): স্ট্রাকচার্ড PDF টেবিল সরাসরি পার্স করা হয় — বিনামূল্যে, দ্রুততম, কোনো LLM প্রয়োজন নেই।
  • Path B (Text-LLM): জটিল লেআউটের ডিজিটাল PDF স্থানীয় LLM (LiteLLM/Ollama) দিয়ে extract করা হয়।
  • Path C (Vision-LLM): স্ক্যান বা ফটোকপি করা স্টেটমেন্ট multimodal vision model দিয়ে প্রক্রিয়া করা হয়।

প্রতিটি extraction Golden Rule (opening + credits − debits == closing) দিয়ে যাচাই করা হয়। অসঙ্গতি --type review দিয়ে ইন্টারেক্টিভভাবে পর্যালোচনা করা যায়।

পার্সার কি CAMT.053-এর ব্যাঙ্ক-নির্দিষ্ট dialect পরিচালনা করে?

হ্যাঁ — ডিজাইন অনুসারে namespace-agnostic। পার্সার প্রক্রিয়াকরণের আগে XML namespace strip করে, যেকোনো CAMT.053 variant (camt.053.001.02, camt.053.001.04, বা proprietary ব্যাঙ্ক wrapper) namespace-নির্দিষ্ট কনফিগারেশন ছাড়াই পরিচালনা করে। XPath query element structure টার্গেট করে, namespace URI নয়।

কাস্টম envelope-এ CAMT wrap করা ব্যাঙ্কগুলির জন্য, অভ্যন্তরীণ ডকুমেন্ট সরাসরি ফিড করতে from_string() বা from_bytes() ব্যবহার করুন।

আমি কি কাস্টম CSV কলাম header স্ট্যান্ডার্ড schema-তে map করতে পারি?

হ্যাঁ — স্বয়ংক্রিয় normalisation, শূন্য কনফিগারেশন। CsvStatementParser সাধারণ header variation চেনে: "Date", "Transaction Date", "Booking Date" সব date ক্ষেত্রে map হয়। "Amount", "Value", "Sum" amount-এ map হয়। Split credit/debit কলাম (যেমন "Credit""Debit") শনাক্ত হয় এবং স্বয়ংক্রিয়ভাবে একটি একক signed amount-এ একত্রিত হয়।

আউটপুট ফর্ম্যাট কী?

সমস্ত পার্সার সামঞ্জস্যপূর্ণ কলাম type সহ standardised pandas DataFrame তৈরি করে:

ফর্ম্যাট মূল কলাম
CAMT Amount, Currency, DrCr, Debtor, Creditor, Reference, ValDt, BookgDt, AccountId
PAIN.001 PmtInfId, PmtMtd, InstdAmt, Currency, CdtrNm, EndToEndId, MsgId, CreDtTm, NbOfTxs
CSV/OFX/QFX/MT940 date, description, amount (normalised)

আপনি CSV, JSON, Excel, Polars DataFrame, hledger, বা beancount জার্নাল ফর্ম্যাটেও এক্সপোর্ট করতে পারেন।

PDF ও LLM বৈশিষ্ট্য

Hybrid pipeline কোন LLM model সমর্থন করে?

Pipeline model abstraction layer হিসেবে LiteLLM এবং vision prompt-এর জন্য সরাসরি Ollama bridge ব্যবহার করে। প্রস্তাবিত model:

  • Text extraction: যেকোনো LiteLLM-compatible model (local বা remote)।
  • Vision extraction: ollama/minicpm-v (প্রস্তাবিত) স্ক্যান করা PDF-এর জন্য।
  • Categorisation: যেকোনো LiteLLM-compatible model।

সমস্ত model Ollama-র মাধ্যমে 100% স্থানীয়ভাবে চলতে পারে — কোনো API key প্রয়োজন নেই।

Golden Rule verification কী?

প্রতিটি PDF extraction এই সমীকরণ দিয়ে যাচাই করা হয়: opening balance + credits − debits == closing balance। ফলাফল এভাবে ট্যাগ করা হয়:

  • VERIFIED: ব্যালেন্স সঠিকভাবে মিলেছে।
  • DISCREPANCY: ব্যালেন্স মিলছে না — পর্যালোচনা প্রস্তাবিত।
  • FAILED: যাচাই করা সম্ভব হয়নি (ব্যালেন্স ডেটা অনুপস্থিত)।

আমি কি স্বয়ংক্রিয়ভাবে লেনদেন categorise করতে পারি?

হ্যাঁ। Enrichment module (v0.0.6+) LLM-চালিত transaction categorisation প্রদান করে:

from bankstatementparser.enrichment import Categorizer

categorizer = Categorizer()
enriched = categorizer.categorize_batch(transactions)

ডিফল্ট schema 13টি Plaid-compatible category ব্যবহার করে। আপনি নিজের category schema দিতে পারেন।

আমি কি hledger বা beancount-এ এক্সপোর্ট করতে পারি?

হ্যাঁ (v0.0.8+)। Account mapping সহ plaintext-accounting জার্নাল ফর্ম্যাটে লেনদেন এক্সপোর্ট করুন:

from bankstatementparser.export import to_hledger, to_beancount

journal = to_hledger(transactions, account="Assets:Bank:Checking")

ট্রেজারি ওয়ার্কফ্লো

পার্সার কীভাবে multi-currency স্টেটমেন্ট পরিচালনা করে?

প্রতিটি লেনদেন তার মূল মুদ্রা সংরক্ষণ করে — কোনো implicit conversion নয়। Currency ক্ষেত্র XML Ccy attribute থেকে প্রতি লেনদেনে extract হয়। Multi-currency স্টেটমেন্ট যেমন আছে তেমনই থাকে। get_account_balances() method মূল currency code সহ প্রতি account-এ opening ও closing balance ফেরত দেয়।

v0.0.8 থেকে, verify_balance_multi_currency() মুদ্রা অনুযায়ী লেনদেন গোষ্ঠীবদ্ধ করে এবং প্রতি গোষ্ঠীতে স্বতন্ত্রভাবে Golden Rule চালায় — একাধিক মুদ্রা ধারণকারী অ্যাকাউন্টের জন্য উপযোগী।

পার্সার কি outgoing ও incoming উভয় ফর্ম্যাট সমর্থন করে?

হ্যাঁ। Pain001Parser ISO 20022 PAIN.001 credit transfer initiation ফাইল (outgoing payment) পরিচালনা করে। CamtParser CAMT.053 bank-to-customer statement ফাইল (incoming reporting) পরিচালনা করে। উভয়ই streaming, PII রিডাকশন, এবং CSV, JSON, Excel, hledger, ও beancount-এ এক্সপোর্ট সমর্থন করে। স্বয়ংক্রিয়ভাবে ফর্ম্যাট শনাক্ত করতে detect_statement_format() ব্যবহার করুন।

কোনো লেনদেন entry ত্রুটিপূর্ণ হলে কী হয়?

আচরণ parsing mode-এর উপর নির্ভর করে:

  • parse() (batch mode) -- প্রয়োজনীয় ক্ষেত্র (Amount, Currency, বা CdtDbtInd) অনুপস্থিত ত্রুটিপূর্ণ entry warning log সহ skip করা হয়। বাকি স্টেটমেন্ট স্বাভাবিকভাবে পার্স হয়।
  • parse_streaming() (streaming mode) -- পার্স error exception হিসেবে তাৎক্ষণিকভাবে propagate হয়। কোনো নীরব ডেটা ক্ষতি নেই। এই fail-fast আচরণ আর্থিক ওয়ার্কফ্লোর জন্য ইচ্ছাকৃত যেখানে প্রতিটি লেনদেনের হিসাব রাখা আবশ্যক।
  • smart_ingest() (hybrid PDF) -- Extraction error IngestResult-এ verification status সহ ক্যাপচার হয়, interactive review-এর সুযোগ দেয়।

Deduplication কীভাবে কাজ করে?

প্রতিটি লেনদেনে key field-এর উপর ভিত্তি করে একটি idempotent transaction_hash (MD5 fingerprint) বরাদ্দ করা হয়। এটি নিরাপদ incremental ingestion সক্ষম করে — একই ফাইল পুনরায় প্রক্রিয়া করলে একই hash তৈরি হয়, তাই duplicate স্বয়ংক্রিয়ভাবে শনাক্ত হয়।

from bankstatementparser import CamtParser, Deduplicator

parser = CamtParser("statement.xml")
dedup = Deduplicator()
result = dedup.deduplicate(dedup.from_dataframe(parser.parse()))

print(f"Unique: {len(result.unique_transactions)}")
print(f"Exact duplicates: {len(result.exact_duplicates)}")
print(f"Suspected matches: {len(result.suspected_matches)}")

ইনস্টলেশন ও সামঞ্জস্যতা

আমি কীভাবে Bank Statement Parser ইনস্টল করব?

# Core install (deterministic parsers only)
pip install bankstatementparser

# PDF hybrid pipeline
pip install 'bankstatementparser[hybrid]'         # Text-LLM path
pip install 'bankstatementparser[hybrid-vision]'   # Vision-LLM path

# Extras
pip install 'bankstatementparser[enrichment]'      # Transaction categorisation
pip install 'bankstatementparser[api]'             # REST API microservice
pip install 'bankstatementparser[polars]'          # Polars DataFrame support

কোন Python version সমর্থিত?

Python 3.10 থেকে 3.14। Python 3.9 সাপোর্ট v0.0.6-এ বাদ দেওয়া হয়েছে (EOL 2025-10-31)। সমস্ত version 100% branch coverage-এ 718 টেস্ট সহ CI-তে পরীক্ষিত।

ডিপেন্ডেন্সি কী?

Core লাইব্রেরির 5টি সরাসরি ডিপেন্ডেন্সি আছে:

  • lxml -- security hardening সহ XML পার্সিং
  • pandas -- DataFrame ও ডেটা manipulation
  • openpyxl -- Excel export
  • pydantic -- ডেটা validation ও model
  • defusedxml -- XXE সুরক্ষা

ঐচ্ছিক extras যোগ করে: litellm, pypdf, pdfplumber, pypdfium2, fastapi, uvicorn, polars

সমস্ত ডিপেন্ডেন্সির SHA-256 hash-locked version আছে। CycloneDX SBOM প্রতিটি runtime component map করে।

এটি কি macOS, Linux ও Windows-এ কাজ করে?

হ্যাঁ। লাইব্রেরিটি macOS, Linux, এবং Windows (WSL-এর মাধ্যমে) কাজ করে। কোনো platform-নির্দিষ্ট ডিপেন্ডেন্সি নেই।

কোনো REST API আছে?

হ্যাঁ (v0.0.8+)। pip install 'bankstatementparser[api]' দিয়ে ইনস্টল করুন এবং চালান:

bankstatementparser-api --port 8000

Endpoint: POST /ingest (স্টেটমেন্ট পার্স করুন) এবং GET /health (health check)।

পুনরুত্পাদনযোগ্যতা ও নিরাপত্তা

আমি কীভাবে পুনরুত্পাদনযোগ্যতা যাচাই করতে পারি?

python -m pytest                              # 718 tests, 100% branch coverage
python scripts/verify_locked_hashes.py        # SHA-256 hash verification
git log --show-signature -1                   # Verify commit signature

কোন নিরাপত্তা সুরক্ষা বিল্ট-ইন?

  • XXE সুরক্ষা: resolve_entities=False, no_network=True, load_dtd=False
  • ZIP Bomb সুরক্ষা: Compression ratio limit, entry size cap, encrypted entry rejection
  • Path Traversal প্রতিরোধ: বিপজ্জনক pattern blocklist ও symlink resolution
  • Input Validation: ফাইল size limit (100 MB ডিফল্ট), extension/format validation
  • Supply Chain: SHA-256 hash-locked ডিপেন্ডেন্সি, CycloneDX SBOM, build provenance attestation
  • Signed Commits: CI-তে প্রয়োগকৃত
  • স্থানীয় LLM: Hybrid PDF pipeline Ollama ব্যবহার করে — কোনো cloud API call নেই

Bank Statement Parser কীভাবে pyiso20022-এর সাথে তুলনা করে?

pyiso20022 একটি বিস্তৃত ISO 20022 টুলকিট যা ISO XML schema থেকে Python dataclass তৈরি করে। এটি schema validation সহ বিস্তৃত ISO 20022 message type (PACS, PAIN, CAMT, ADMI) কভার করে। Bank Statement Parser hybrid PDF সাপোর্ট, balance verification, enrichment, ledger export, এবং নন-ISO ফর্ম্যাট (CSV, OFX, QFX, MT940, PDF) সহ সাতটি ফর্ম্যাটে unified API সহ ব্যাঙ্ক স্টেটমেন্ট পার্সিংয়ের জন্য উদ্দেশ্য-নির্মিত। প্রোডাকশন-গ্রেড security সহ DataFrame-এ ব্যাঙ্ক স্টেটমেন্ট পার্স করতে Bank Statement Parser ব্যবহার করুন। সম্পূর্ণ ISO 20022 message catalogue নিয়ে কাজ করতে pyiso20022 ব্যবহার করুন।

SWIFT ISO 20022 মাইগ্রেশনের সময়সীমা কী?

SWIFT একটি পর্যায়ক্রমিক মাইগ্রেশন টাইমলাইন প্রকাশ করেছে:

  • নভেম্বর 2026: Structured ও hybrid ঠিকানা বাধ্যতামূলক হবে। MT101 multi-instruction message প্রত্যাখ্যান করা হবে। Case Management Phase 1 শুরু।
  • নভেম্বর 2027: সমস্ত আর্থিক প্রতিষ্ঠান CAMT.053 স্টেটমেন্ট নেটিভভাবে গ্রহণ করতে সক্ষম হতে হবে। SWIFT MT-কে ISO ফর্ম্যাটে রূপান্তর বন্ধ করবে।
  • নভেম্বর 2028: MT940, MT942, MT950, MT900 ও MT910-এর সম্পূর্ণ অবসর। এগুলি CAMT.052, CAMT.053, ও CAMT.054 equivalent দ্বারা প্রতিস্থাপিত হবে।

Bank Statement Parser legacy MT940 ফর্ম্যাট ও আধুনিক CAMT.053/PAIN.001 ফর্ম্যাট উভয়কেই সমর্থন করে, এটিকে transition সময়ের জন্য আদর্শ করে।