From 5225d11d3ac98dc5897cd0242656ef8661f2982e Mon Sep 17 00:00:00 2001 From: A R R R Associates Date: Mon, 13 Jul 2026 10:30:58 +0530 Subject: [PATCH] Fix Indian Bank statement detection and extraction --- .../parsers/indian_bank.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/app/modules/bank_statement_analyzer/parsers/indian_bank.py b/app/modules/bank_statement_analyzer/parsers/indian_bank.py index 4fd6680..082aa77 100644 --- a/app/modules/bank_statement_analyzer/parsers/indian_bank.py +++ b/app/modules/bank_statement_analyzer/parsers/indian_bank.py @@ -8,11 +8,22 @@ class IndianBankModernParser(BaseParser): bank_name='Indian Bank'; parser_name='IndianBankModernParser' @classmethod def detect(cls,text): - u=text.upper(); return 0.98 if 'ACCOUNT STATEMENT' in u and 'TRANSACTION DETAILS' in u and 'TOTAL CREDITS' in u else 0 + # pdfplumber's layout mode can insert multiple spaces inside headings + # (for example, 'ACCOUNT STATEMENT'). Normalize whitespace before + # matching so the same bank PDF is detected whether pdftotext is + # installed in the runtime image or the pdfplumber fallback is used. + u=norm(text).upper() + return 0.98 if 'ACCOUNT STATEMENT' in u and 'TRANSACTION DETAILS' in u and 'TOTAL CREDITS' in u else 0 def parse(self,path,text=None): text=text or extract_text(path); meta=StatementMeta(bank_name=self.bank_name,source_file=Path(path).name,parser_name=self.parser_name,confidence='High') - meta.customer_name=find(r'Account Holder Name\s*\n\s*([^\n]+)',text) - meta.account_number=find(r'Account Number\s*\n?\s*([0-9X*]+)',text) + # Some Indian Bank statements leave these values blank. Do not let a + # value from the adjacent ACCOUNT SUMMARY column become the customer + # name merely because PDF text extraction merges the two columns. + customer=find(r'Account Holder Name[ \t]*([^\n]*)',text) + customer=norm(customer) + if customer and not re.search(r'^(Opening Balance|Account Type|Account Number|Customer)',customer,re.I): + meta.customer_name=customer + meta.account_number=find(r'Account Number[ \t]*([0-9X*]{4,})',text) m=re.search(r'For period:\s*(\d{2}\s+[A-Za-z]{3}\s+\d{4})\s*-\s*(\d{2}\s+[A-Za-z]{3}\s+\d{4})',text,re.I) if m: meta.period_from=pd.to_datetime(m.group(1),dayfirst=True).strftime('%Y-%m-%d'); meta.period_to=pd.to_datetime(m.group(2),dayfirst=True).strftime('%Y-%m-%d')