§
    �?ºj
f  ã                  óÐ  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m	Z	 ddl
mZ ddlmZ ddlmZmZ ddlZddlZddlZddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ  ej        d¦  «        Z ddl!m"Z"  e"e#¦  «         $                    ¦   «         j%        d         Z& ej'        d e(e&dz  dz  ¦  «        ¦  «        Z)ddgZ*ddddddddœZ+dddd d d!œZ, G d"„ d#¦  «        Z-dS )$a"  Classifier and Router for Bank Statements and Payment Orders (UNC).

Automatically detects if an uploaded document is a bank statement or UNC,
classifies the issuing bank, safely routes the file to the dedicated Hot Watcher folder,
and triggers automatic transaction parsing and ingestion.
é    )ÚannotationsN)Údatetime)ÚDecimal)ÚAny)ÚUUIDÚuuid4)ÚBasePostgresClient)ÚACBExcelParser)ÚTCBPdfParser)ÚVCBExcelParser)ÚVPBankExcelParserz(dscons.banking.unc_classifier_and_router)ÚPathé   ÚUNC_HOT_WATCHER_ROOTÚFinancezUNC-2026Ú39912136Ú
0202111150zACB-2026zTechcombank-2026zVPBank 2026zVietcombank-2026zVietinbank-2026z	BIDV-2026ú
Other-2026)ÚACBÚTECHCOMBANKÚVPBANKÚVIETCOMBANKÚ
VIETINBANKÚBIDVÚOTHER)Ú13456888888õ&   CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ N)Ú19039912136018r   )Ú
8667898888r   ©ÚUNKNOWNr   )r   r   r   r   r   c                  óŽ   — e Zd ZdZd"d#d„Ze	 	 	 d$d%d„¦   «         Ze	 d"d&d„¦   «         Z	 	 d'd(d„Zd)d„Z	d)d„Z
ed*d!„¦   «         ZdS )+ÚUncClassifierAndRouterzZDetects UNC / Statements, routes files to Hot Watcher directories, and triggers ingestion.NÚpostgres_clientú
Any | NoneÚreturnÚNonec                ó0   — |pt          ¦   «         | _        d S ©N)r	   Ú_client)Úselfr$   s     úOC:\Projects\DSCons\app\modules\banking\application\unc_classifier_and_router.pyÚ__init__zUncClassifierAndRouter.__init__A   s   € Ø&Ð>Õ*<Ñ*>Ô*>ˆŒˆˆó    Ú TÚfilenameÚstrÚtextÚcontentúbytes | NoneÚenable_vision_ocrÚboolú'tuple[bool, str | None, dict[str, Any]]c                óÂ  ‡‡— |                       ¦   «         Š‰› d|› �                     ¦   «         Šg d¢}t          ˆfd„|D ¦   «         ¦  «        }g d¢}t          ˆfd„|D ¦   «         ¦  «        }|�s°|�r­|�sªd‰v r‰                     d¦  «        d         nd}|d	k    �r‚	 d
dl}	|	                     |d	¬¦  «        }
g }|
dd…         D ]@}|                     d¦  «                             ¦   «         }|r|                     |¦  «         ŒA|
 	                    ¦   «          |rId 
                    |¦  «        }‰› d|› �                     ¦   «         Št          ˆfd„|D ¦   «         ¦  «        }n¹# t          $ r¬ 	 t          j        t          j        |¦  «        ¦  «        }d„ |j        dd…         D ¦   «         }t          |¦  «        rId 
                    |¦  «        }‰› d|› �                     ¦   «         Št          ˆfd„|D ¦   «         ¦  «        }n# t          $ r Y nw xY wY nw xY wd}t          ˆfd„dD ¦   «         ¦  «        rd}n•t          ˆfd„dD ¦   «         ¦  «        rd}nwt          ˆfd„dD ¦   «         ¦  «        rd}nYt          ˆfd„dD ¦   «         ¦  «        rd}n;t          ˆfd„d D ¦   «         ¦  «        rd!}nt          ˆfd"„d#D ¦   «         ¦  «        rd$}|s|rd%}t#          |p|p|ot          ˆfd&„d'D ¦   «         ¦  «        ¦  «        }d(}d}|ot%          |¦  «        d)k    o| o| }|�r|�s|r	|r|d%k    �r|�r	d‰v r‰                     d¦  «        d         nd}|d*v rä	 d
d+lm}  |¦   «         }|                     || |¦  «        }|r‡|                     d,¦  «        s|                     d-¦  «        r]|                     d,¦  «        r|                     d,¦  «        d
k    rd.}d.}|}|                     d-¦  «        r|d-         d%k    r|d-         }n2# t          $ r%}t.                               d/|¦  «         Y d}~nd}~ww xY w|||||||r|s|rd0n|rd1nd2d3œ}|||fS )4z‰Determines if a document is an UNC / Bank Statement and identifies the bank.

        Returns: (is_unc, bank_code, details_dict)
        ú )Úunczuy nhiem chiÚ
uynhiemchiÚuy_nhiem_chiÚsaokezsao keÚsao_keÚ	statementÚaccountstmtÚ	debitnoteÚ
creditnoteÚ
debit_noteÚcredit_noteÚtransaction_historyÚb2bz	pass.docxc              3  ó    •K  — | ]}|‰v V — Œ	d S r)   © )Ú.0ÚkÚfn_lowers     €r,   ú	<genexpr>z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>Y   s'   øè è € ÐKÐK°˜a 8˜mÐKÐKÐKÐKÐKÐKr.   )u   á»¦Y NHIá»†M CHIzUY NHIEM CHIu   Lá»†NH CHUYá»‚N TIá»€NzLENH CHUYEN TIENu   GIáº¤Y BÃ�O Ná»¢zGIAY BAO NOu   GIáº¤Y BÃ�O CÃ“zGIAY BAO COu   SAO KÃŠ TÃ€I KHOáº¢NzSAO KE TAI KHOANzACCOUNT STATEMENTzTRANSACTION HISTORYu   Báº¢NG KÃŠ GIAO Dá»ŠCHzBANG KE GIAO DICHu   Sá»” PHá»¤ TÃ€I KHOáº¢NzSO PHU TAI KHOANu   THÃ”NG BÃ�O GIAO Dá»ŠCHu   TÃ€I KHOáº¢N TRÃ�CH Ná»¢u   Ä�Æ N Vá»Š THá»¤ HÆ¯á»žNGu   NGÃ‚N HÃ€NG THá»¤ HÆ¯á»žNGu   Sá»� DÆ¯ SAU GIAO Dá»ŠCHzRUNNING BALANCEz
VALUE DATEc              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   ©rI   rJ   Úcombined_texts     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>e   s(   øè è € ÐNÐN°A˜Q -Ð/ÐNÐNÐNÐNÐNÐNr.   ú.éÿÿÿÿr/   Úpdfr   N)ÚstreamÚfiletypeé   r2   ú
c              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   rN   s     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>x   s(   øè è € Ð,^Ð,^ÀA¨Q°-Ð-?Ð,^Ð,^Ð,^Ð,^Ð,^Ð,^r.   c                ó:   — g | ]}|                      ¦   «         pd ‘ŒS )r/   )Úextract_text)rI   Úpages     r,   ú
<listcomp>z>UncClassifierAndRouter.detect_unc_and_bank.<locals>.<listcomp>|   s)   € Ð*bÐ*bÐ*bÈ¨4×+<Ò+<Ñ+>Ô+>Ð+DÀ"Ð*bÐ*bÐ*br.   c              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   rN   s     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>€   s(   øè è € Ð0bÐ0bÈ°°mÐ1CÐ0bÐ0bÐ0bÐ0bÐ0bÐ0br.   c              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   rN   s     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>†   s@   øè è € ð  cð  c aˆq�MÐ!ð  cð  cð  cð  cð  cð  cr.   )r   u   VIá»†T NAM THá»ŠNH VÆ¯á»¢NGzVIET NAM THINH VUONGr   ÚACCOUNTSTMTÚPDLDÚLD25ÚLD26r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   rN   s     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>ˆ   s@   øè è € ð  Jð  J¨��mÐ#ð  Jð  Jð  Jð  Jð  Jð  Jr.   )r   u   Ká»¸ THÆ¯Æ NGz	KY THUONGÚTCBÚ07898888ÚXXXXXXXXXX8888ÚTT261r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   rN   s     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>Š   s(   øè è € ÐbÐb¨��mÐ#ÐbÐbÐbÐbÐbÐbr.   )r   u   Ã� CHÃ‚UzA CHAUÚASCBr   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   rN   s     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>Œ   s(   øè è € ÐhÐh¨��mÐ#ÐhÐhÐhÐhÐhÐhr.   )r   u   NGOáº I THÆ¯Æ NGzNGOAI THUONGÚVCBr   c              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   rN   s     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>Ž   s(   øè è € ÐdÐd¨��mÐ#ÐdÐdÐdÐdÐdÐdr.   )r   u   CÃ”NG THÆ¯Æ NGzCONG THUONGÚCTGr   c              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   rN   s     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>�   s(   øè è € ÐVÐV¨��mÐ#ÐVÐVÐVÐVÐVÐVr.   )r   u   Ä�áº¦U TÆ¯ VÃ€ PHÃ�T TRIá»‚Nr   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   )rI   ÚextrK   s     €r,   rL   z=UncClassifierAndRouter.detect_unc_and_bank.<locals>.<genexpr>—   sI   øè è € ð  NDð  NDÐbeÈcÐU]Èoð  NDð  NDð  NDð  NDð  NDð  NDr.   )ú.xlsú.xlsxú.pdfFi€„ )rR   ÚpngÚjpgÚjpegÚwebpÚtiffÚtif©ÚMultimodalOcrServiceÚamountÚ	bank_codeTz#OCR classification check failed: %sgffffffî?g333333ë?gš™™™™™¹?)Úis_uncr|   Úfilename_matchedÚcontent_matchedÚocr_matchedÚocr_dataÚ
confidence)ÚlowerÚupperÚanyÚsplitÚpymupdfÚopenÚget_textÚstripÚappendÚcloseÚjoinÚ	ExceptionÚpypdfÚ	PdfReaderÚioÚBytesIOÚpagesr6   ÚlenÚ7app.modules.core.application.ocr.multimodal_ocr_servicerz   Úextract_banking_unc_dataÚgetÚloggerÚdebug)r0   r2   r3   r5   Úunc_filename_keywordsÚis_filename_uncÚunc_content_keywordsÚis_content_uncro   r‡   ÚdocÚextracted_pagesrZ   Úp_txtÚreaderr|   r}   r€   Úocr_detailsÚis_large_non_bankrz   Úocr_svcÚocr_resÚocr_eÚdetailsrO   rK   s                            @@r,   Údetect_unc_and_bankz*UncClassifierAndRouter.detect_unc_and_bankD   s…  øø€ ð —>’>Ñ#Ô#ˆØ#Ð,Ð, dÐ,Ð,×2Ò2Ñ4Ô4ˆð!
ð !
ð !
Ðõ ÐKÐKÐKÐKÐ5JÐKÑKÔKÑKÔKˆð 
ð  
ð  
Ðõ ÐNÐNÐNÐNÐ9MÐNÑNÔNÑNÔNˆð ñ 	˜ñ 	¨ñ 	Ø-0°H¨_¨_�(—.’. Ñ%Ô% bÔ)Ð)À"ˆCØ�eŠ|‰|ðØ"�N�N�Nà!Ÿ,š,¨gÀ˜,ÑFÔF�CØ&(�OØ # B Q B¤ð :ð :˜Ø $§¢¨fÑ 5Ô 5× ;Ò ;Ñ =Ô =˜Ø ð :Ø+×2Ò2°5Ñ9Ô9Ð9øØ—I’I‘K”K�KØ&ð _Ø#Ÿyšy¨Ñ9Ô9˜Ø+3Ð(<Ð(<°dÐ(<Ð(<×(BÒ(BÑ(DÔ(D˜Ý),Ð,^Ð,^Ð,^Ð,^ÐI]Ð,^Ñ,^Ô,^Ñ)^Ô)^˜øøÝ ð 	ð 	ð 	ðÝ!&¤µ´¸GÑ1DÔ1DÑ!EÔ!E˜Ø*bÐ*bÐQWÔQ]Ð^`Ð_`Ð^`ÔQaÐ*bÑ*bÔ*b˜Ý˜Ñ/Ô/ð cØ#'§9¢9¨_Ñ#=Ô#=˜DØ/7Ð,@Ð,@¸$Ð,@Ð,@×,FÒ,FÑ,HÔ,H˜MÝ-0Ð0bÐ0bÐ0bÐ0bÐMaÐ0bÑ0bÔ0bÑ-bÔ-b˜NøøÝ$ð ð ð Ø˜ðøøøøøð	øøøð ˆ	Ýð  cð  cð  cð  cð  ,bð  cñ  cô  cñ  cô  cð 	Ø ˆIˆIÝð  Jð  Jð  Jð  Jð  .Ið  Jñ  Jô  Jñ  Jô  Jð 		Ø%ˆIˆIÝÐbÐbÐbÐbÐ-aÐbÑbÔbÑbÔbð 	ØˆIˆIÝÐhÐhÐhÐhÐ-gÐhÑhÔhÑhÔhð 	Ø%ˆIˆIÝÐdÐdÐdÐdÐ-cÐdÑdÔdÑdÔdð 	Ø$ˆIˆIÝÐVÐVÐVÐVÐ-UÐVÑVÔVÑVÔVð 	ØˆIð ð 	 ˜_ð 	 ØˆIå�oð  E¨ð  E¸Ið  =DÍ#ð  NDð  NDð  NDð  NDð  jCð  NDñ  NDô  NDñ  KDô  KDñ  Fô  Fˆð ˆØˆØ#Ðo­¨G©¬°yÒ(@ÐoÈÐEXÐoÐaoÐ]oÐØñ 	OÐ%6ñ 	OÀð 	OÈið 	OÐ[dÐhoÒ[oÑ[oÐu|Ñ[oØ-0°H¨_¨_�(—.’. Ñ%Ô% bÔ)Ð)À"ˆCØÐJÐJÐJðOØlÐlÐlÐlÐlÐlà2Ð2Ñ4Ô4�GØ%×>Ò>¸wÈÐRUÑVÔV�GØð = G§K¢K°Ñ$9Ô$9ð =¸W¿[º[ÈÑ=UÔ=Uð =Ø"Ÿ;š; xÑ0Ô0ð *°W·[²[ÀÑ5JÔ5JÈQÒ5NÐ5NØ%)˜FØ&*˜Ø&-˜Ø"Ÿ;š; {Ñ3Ô3ð =¸ÀÔ8LÐPWÒ8WÐ8WØ(/°Ô(<˜IøøÝ ð Oð Oð OÝ—L’LÐ!FÈÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøð Ø"Ø /Ø-Ø&Ø#Ø#2Ðo°yÐoÀ[Ðo˜$˜$Ð_eÐWnÐW[ÐW[Ðknð
ð 
ˆð �y 'Ð)Ð)sQ   Â CE( Å(
HÅ3BHÈ
HÈ
HÈHÈHÈHÈHÍ#B0P Ð
QÐP>Ð>QÚfile_contentÚbytesr|   ú
str | Noneútuple[str, str]c                óJ  — |pd                      ¦   «         }t                               |d¦  «        }t          j                             t          |¦  «        }t          j        |d¬¦  «         t          j                             ||¦  «        }t          j                             |¦  «        �rt          |d¦  «        5 }t          j        |                     ¦   «         ¦  «                             ¦   «         }ddd¦  «         n# 1 swxY w Y   t          j        | ¦  «                             ¦   «         }	||	k    rt                               d|¦  «         ||fS t          j                             |¦  «        \  }
}t#          j        ¦   «                              d¦  «        }|
› d	|› |› �}t          j                             ||¦  «        }t          |d
¦  «        5 }|                     | ¦  «         ddd¦  «         n# 1 swxY w Y   t                               d|¦  «         ||fS )zuSaves file into the appropriate Hot Watcher folder.

        Returns: (target_folder_path, target_file_path)
        r   r   T)Úexist_okÚrbNz<File already exists with identical content in hot folder: %sz%Y%m%d_%H%M%SÚ_Úwbz!Routed UNC file to hot folder: %s)r„   ÚBANK_FOLDER_MAPr—   ÚosÚpathr�   ÚHOT_WATCHER_ROOTÚmakedirsÚexistsrˆ   ÚhashlibÚsha256ÚreadÚ	hexdigestr˜   ÚinfoÚsplitextr   ÚnowÚstrftimeÚwrite)r©   r0   r|   ÚbankÚfolder_nameÚ
target_dirÚtarget_file_pathÚfÚexisting_hashÚincoming_hashÚbasero   Ú	timestampÚnew_filenames                 r,   Úroute_to_hot_folderz*UncClassifierAndRouter.route_to_hot_folder»   sc  € ð Ð$˜W×+Ò+Ñ-Ô-ˆÝ%×)Ò)¨$°Ñ=Ô=ˆÝ”W—\’\Õ"2°KÑ@Ô@ˆ
Ý
Œ�J¨Ð.Ñ.Ô.Ð.åœ7Ÿ<š<¨
°HÑ=Ô=Ðõ Œ7�>Š>Ð*Ñ+Ô+ñ 	FÝÐ&¨Ñ-Ô-ð E°Ý '¤¨q¯vªv©x¬xÑ 8Ô 8× BÒ BÑ DÔ D�ðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eå#œN¨<Ñ8Ô8×BÒBÑDÔDˆMØ Ò-Ð-Ý—’ÐZÐ\lÑmÔmÐmØ!Ð#3Ð3Ð3õ œ×(Ò(¨Ñ2Ô2‰IˆD�#Ý œ™œ×/Ò/°Ñ@Ô@ˆIØ"Ð5Ð5 YÐ5°Ð5Ð5ˆLÝ!œwŸ|š|¨J¸ÑEÔEÐåÐ" DÑ)Ô)ð 	"¨QØ�GŠG�LÑ!Ô!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"õ 	�ŠÐ7Ð9IÑJÔJÐJØÐ+Ð+Ð+s$   Â=9DÄDÄ	DÇG;Ç;G?ÈG?Ú	file_pathúdict[str, Any]c                óŠ  — |smt           j                             |¦  «        st          d|› �¦  «        ‚t	          |d¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   t           j                             |¦  «        }|                     ¦   «         }|s|                      ||¬¦  «        \  }}}|pd}| 	                    ¦   «         }g }	|dk    sd|v �r| 
                    d¦  «        rÏd	}
t          D ]Q}	 t          |¬
¦  «        }|                     t          j        |¦  «        |¦  «        }	|	rd}
 nŒB# t           $ r Y ŒNw xY w|
sp|	sn	 t          d¬
¦  «        }|                     t          j        |¦  «        |¦  «        }	�n# t           $ r&}t"                               d|¦  «         Y d}~�nàd}~ww xY w�nÖ| 
                    d¦  «        r|                      ||¦  «        }	�n©|dk    sd|v sd|v r™| 
                    d¦  «        r‚	 t)          ¦   «         }|                     t          j        |¦  «        |¦  «        }	�nM# t           $ r<}t"                               d|¦  «         |                      ||¦  «        }	Y d}~�nd}~ww xY w�n|dk    sd|v sd|v r–| 
                    d¦  «        r€	 t+          ¦   «         }|                     t          j        |¦  «        |¦  «        }	n§# t           $ r;}t"                               d|¦  «         |                      ||¦  «        }	Y d}~ngd}~ww xY wn^	 t/          ¦   «         }|                     t          j        |¦  «        |¦  «        }	n&# t           $ r |                      ||¦  «        }	Y nw xY w|	�sò	 ddlm}  |¦   «         }t           j                             |¦  «        \  }}|                     |||                     d¦  «        ¦  «        }|�r_|                     d¦  «        �rIt=          t?          |d         ¦  «        ¦  «        }|                     dd¦  «        }|dk    r|nt=          d¦  «        }|dk    r|nt=          d¦  «        }|                     d¦  «        p%tA          j!        ¦   «          "                    d ¦  «        }tA          j#        |d ¦  «         $                    ¦   «         }|                     d!¦  «        r|d!         dk    r|d!         }|                     d"¦  «        p tJ                               |d#¦  «        d         }|                     d$¦  «        p tJ                               |d%¦  «        d&         }|	 &                    ||||||                     d'¦  «        p(d(tA          j!        ¦   «          "                    d)¦  «        › �||t=          d¦  «        |                     d*¦  «        pd+|› �|                     d,¦  «        |                     d-¦  «        |                     d.¦  «        d/œ¦  «         t"           '                    d0|                     d'¦  «        |¦  «         n2# t           $ r%}t"                               d1|¦  «         Y d}~nd}~ww xY wd}g }tJ                               |d2¦  «        \  }}tQ          | j)        d3d¦  «        ptQ          | j)        d4d¦  «        } |¦   «         5 } |  *                    ¦   «         5 }!|! +                    d5¦  «         |! ,                    ¦   «         }"|"s)|! +                    d6¦  «         |! ,                    ¦   «         }"|"r|"d7         nt[          ¦   «         }#|	D �]$}$|$                     d8¦  «        }%t]          |%t@          ¦  «        r|% $                    ¦   «         }%|%sŒDt=          t?          |$                     d9¦  «        pd¦  «        ¦  «        }t=          t?          |$                     d:¦  «        pd¦  «        ¦  «        }|dk    rd}|}&n|dk    rd}|}&nŒ½|$                     d*¦  «        pd; /                    ¦   «         }'|$                     d<¦  «        pD|$                     d=¦  «        p/d>t[          ¦   «         j0        dd?…          	                    ¦   «         › �}(|$                     d@¦  «        �1t=          t?          |$                     d@¦  «        pd¦  «        ¦  «        nd})|$                     dA¦  «        p|}*|$                     dB¦  «        p|}+|  1                    |'|¦  «        },|! +                    dC|#||*|+|%|(||&|)|'|,|f¦  «         |! ,                    ¦   «         }-|-r |d&z  }| &                    |-d7         ¦  «         �Œ&|  2                    ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   d}.|r”	 ddDl3m4}/  |/¦   «         }0|D ]+}1|0 5                    |1¦  «        }2|2r|.tm          |2¦  «        z  }.Œ,|.dk    rt"           '                    dE|.|¦  «         n2# t           $ r%}3t"                               dF|3¦  «         Y d}3~3nd}3~3ww xY wt"           '                    dG||tm          |	¦  «        ||.¦  «         dH||tm          |	¦  «        ||tm          |	¦  «        |z
  |.|dIœ	S )JzQParses a bank statement file and inserts transactions into erp_bank_transactions.zFile not found: r¯   N)r3   r   r   Útechcombankrr   F)ÚpasswordTz*TCB PDF parser failed without password: %s)rq   rp   r   Úacbr   z%ACB parser failed, trying generic: %sr   Úvpbankr@   )rp   rq   z,VPBank parser failed, trying xlrd direct: %sr   ry   rP   r{   Ú	directionÚoutflowÚ0ÚinflowÚtxn_datez%Y-%m-%dr|   Úsender_account)r!   r/   Úsender_name)r/   r   é   Úref_nozOCR-z%Y%m%d%H%M%SÚdescriptionu   Thanh toÃ¡n UNC Úreceiver_accountÚreceiver_nameÚreceiver_bank)r|   Úaccount_numberÚaccount_nameÚtransaction_dateÚ
value_dateÚreference_numberÚdebit_amount_vndÚcredit_amount_vndÚrunning_balance_vndrÜ   Úcounterparty_accountÚcounterparty_nameÚcounterparty_bankzAMultimodal OCR successfully parsed UNC transaction: %s, amount=%sz)Multimodal OCR fallback parsing error: %sr    Úget_connectionÚ_open_connectionz>SELECT id FROM companies WHERE tax_code = '0202111150' LIMIT 1z SELECT id FROM companies LIMIT 1Úidrâ   rå   ræ   r/   Útransaction_referencerä   zTXN-é   rç   rà   rá   a7  
                        INSERT INTO erp_bank_transactions (
                            company_id, bank_name, account_number, account_name,
                            transaction_date, reference_number, direction, amount,
                            running_balance, description, transaction_category,
                            source_file, created_at
                        )
                        VALUES (
                            %s, %s, %s, %s,
                            %s, %s, %s, %s,
                            %s, %s, %s,
                            %s, NOW()
                        )
                        ON CONFLICT (bank_name, account_number, reference_number, transaction_date, amount, direction)
                        DO NOTHING
                        RETURNING id
                        )ÚSmartClearingServicez3Auto-cleared %d debt settlements for statement '%s'z/Smart Clearing trigger encountered an error: %szgIngested statement file '%s' (Bank: %s): parsed %d txs, newly saved %d txs, auto-cleared %d settlementsÚsuccess)	ÚstatusÚ	file_namer|   Útotal_parsedÚnewly_savedÚinsertedÚskippedÚcleared_settlementsrÌ   )7r³   r´   r·   ÚFileNotFoundErrorrˆ   rº   Úbasenamerƒ   r¨   r„   ÚendswithÚKNOWN_PASSWORDSr   Úparser‘   r’   rŽ   r˜   ÚwarningÚ_parse_generic_or_tcb_excelr
   r   Ú_parse_vpbank_directr   r•   rz   r½   r–   Úlstripr—   r   r1   r   r¾   r¿   ÚstrptimeÚdateÚDEFAULT_ACCOUNTSr‹   r¼   Úgetattrr*   ÚcursorÚexecuteÚfetchoner   Ú
isinstancerŠ   ÚhexÚ_categorize_transactionÚcommitÚ8app.modules.financial.application.smart_clearing_servicerð   Úreconcile_single_transactionr”   )4r+   rÌ   r|   r©   rÅ   r0   rK   r°   Údetected_bankÚ
parsed_txsrñ   ÚpwdÚparserÚerz   Úocr_servicero   Úunc_dataÚamtrÓ   ÚdebitÚcreditÚtxn_date_strr×   Úacc_noÚacc_nameÚocr_errÚsaved_countÚ	saved_idsÚdefault_acc_noÚdefault_acc_nameÚget_connÚconnÚcurÚrowÚ
company_idÚtxÚt_dater{   ÚdescÚrefÚbalanceÚ	tx_acc_noÚtx_acc_nameÚcategoryÚresÚcleared_countrð   Úclearing_svcÚtx_idÚsettledÚcl_errs4                                                       r,   Úingest_statement_filez,UncClassifierAndRouter.ingest_statement_fileá   sÖ  € ð ð 	(Ý”7—>’> )Ñ,Ô,ð HÝ'Ð(F¸9Ð(FÐ(FÑGÔGÐGÝ�i Ñ&Ô&ð (¨!Ø Ÿvšv™xœx�ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (õ ”7×#Ò# IÑ.Ô.ˆØ—>’>Ñ#Ô#ˆð ð 	1Ø"&×":Ò":¸8È\Ð":Ñ"ZÔ"ZÑˆAˆ}˜aØ%Ð0¨ˆIà—O’OÑ%Ô%ˆ	Ø+-ˆ
ð ˜Ò%Ð%¨¸(Ð)BÑ)BØ× Ò  Ñ(Ô(ð Và�Ý*ð !ð !�Cð!Ý!-°sÐ!;Ñ!;Ô!;˜Ø%+§\¢\µ"´*¸\Ñ2JÔ2JÈHÑ%UÔ%U˜
Ø%ð "Ø&*˜GØ!˜Eð"øõ %ð !ð !ð !Ø ˜ð!øøøàð X zð XðXÝ!-°tÐ!<Ñ!<Ô!<˜Ø%+§\¢\µ"´*¸\Ñ2JÔ2JÈHÑ%UÔ%U˜
™
øÝ$ð Xð Xð XÝŸšÐ'SÐUVÑWÔWÐWÐWÐWÐWÐWÑWøøøøðXøøøùà×"Ò"Ð#4Ñ5Ô5ð Và!×=Ò=¸lÈHÑUÔU�
ùà˜%ÒÐ 5¨HÐ#4Ð#4¸ÈÐ8QÐ8QØ× Ò Ð!2Ñ3Ô3ð ZðZÝ+Ñ-Ô-�FØ!'§¢­b¬j¸Ñ.FÔ.FÈÑ!QÔ!Q�J‘JøÝ ð Zð Zð ZÝ—N’NÐ#JÈAÑNÔNÐNØ!%×!AÒ!AÀ,ÐPXÑ!YÔ!Y�J�J�J�J�J‘JøøøøðZøøøñ	Zð ˜(Ò"Ð" h°(Ð&:Ð&:¸mÈxÐ>WÐ>WØ× Ò Ð!2Ñ3Ô3ð SðSÝ.Ñ0Ô0�FØ!'§¢­b¬j¸Ñ.FÔ.FÈÑ!QÔ!Q�J�JøÝ ð Sð Sð SÝ—N’NÐ#QÐSTÑUÔUÐUØ!%×!:Ò!:¸<ÈÑ!RÔ!R�J�J�J�J�J�JøøøøðSøøøð	SðVÝ'Ñ)Ô)�Ø#Ÿ\š\­"¬*°\Ñ*BÔ*BÀHÑMÔM�
�
øÝð Vð Vð VØ!×=Ò=¸lÈHÑUÔU�
�
�
ðVøøøð ñ 9	Uð8Uðð ð ð ð ð ð 3Ð2Ñ4Ô4�Ýœ×)Ò)¨(Ñ3Ô3‘��3Ø&×?Ò?Ø  (¨C¯JªJ°s©O¬Oñô �ð ñ , §¢¨XÑ 6Ô 6ñ ,Ý!¥# h¨xÔ&8Ñ"9Ô"9Ñ:Ô:�CØ (§¢¨[¸)Ñ DÔ D�IØ#,°	Ò#9Ð#9˜C˜C½wÀs¹|¼|�EØ$-°Ò$9Ð$9˜S˜S½wÀs¹|¼|�FØ#+§<¢<°
Ñ#;Ô#;ð $½x¼|¹~¼~×?VÒ?VØ"ñ@ô @�Lõ  (Ô0°¸zÑJÔJ×OÒOÑQÔQ�Hð  —|’| KÑ0Ô0ð :°X¸kÔ5JÈgÒ5UÐ5UØ$,¨[Ô$9˜	à%Ÿ\š\Ð*:Ñ;Ô;ð Õ?O×?SÒ?SØ! ?ñ@ô @àô@�Fð  (Ÿ|š|¨MÑ:Ô:ð  Õ>N×>RÒ>RØ!Ð#Qñ?ô ?àô?�Hð ×%Ò%à)2Ø.4Ø,4Ø08Ø*2Ø08·²¸XÑ0FÔ0Fð 1PØO¥h¤l¡n¤n×&=Ò&=¸nÑ&MÔ&MÐOÐOØ05Ø17Ý3:¸3±<´<Ø+3¯<ª<¸Ñ+FÔ+Fð ,=Ø<°(Ð<Ð<Ø4<·L²LÐASÑ4TÔ4TØ19·²¸oÑ1NÔ1NØ19·²¸oÑ1NÔ1Nðð ñô ð õ& —K’KØ[Ø Ÿš XÑ.Ô.Øñô ð øøõ
 ð Uð Uð UÝ—’ÐJÈGÑTÔTÐTÐTÐTÐTÐTÐTøøøøðUøøøð ˆØ!ˆ	Ý+;×+?Ò+?ØÐLñ,
ô ,
Ñ(ˆÐ(õ ˜4œ<Ð)9¸4Ñ@Ô@ÐsÅGÈDÌLÐZlÐnrÑDsÔDsˆØˆX‰ZŒZð N	˜4Ø—’‘”ð M #à—’Ð\Ñ]Ô]Ð]Ø—l’l‘n”n�Øð )Ø—K’KÐ BÑCÔCÐCØŸ,š,™.œ.�CØ*-Ð:˜S œY˜Yµ5±7´7�
à$ð C4ñ C4�BØŸVšVÐ$6Ñ7Ô7�FÝ! &­(Ñ3Ô3ð /Ø!'§¢¡¤˜Ø!ð !Ø å#¥C¨¯ªÐ/AÑ(BÔ(BÐ(GÀaÑ$HÔ$HÑIÔI�EÝ$¥S¨¯ªÐ0CÑ)DÔ)DÐ)IÈÑ%JÔ%JÑKÔK�Fà ’z�zØ$,˜	Ø!'˜˜Ø š˜Ø$-˜	Ø!&˜˜à àŸFšF =Ñ1Ô1Ð7°R×>Ò>Ñ@Ô@�DàŸšÐ6Ñ7Ô7ð <ØŸ6š6Ð"4Ñ5Ô5ð<à;¥%¡'¤'¤+¨b¨q¨b¤/×"7Ò"7Ñ"9Ô"9Ð;Ð;ð ð
 SU×RXÒRXÐYnÑRoÔRoÐR{�g¥c¨"¯&ª&Ð1FÑ*GÔ*GÐ*LÈ1Ñ&MÔ&MÑNÔNÐNð  BF�GØ "§¢Ð'7Ñ 8Ô 8Ð J¸N�IØ"$§&¢&¨Ñ"8Ô"8Ð"LÐ<L�Kà#×;Ò;¸DÀ)ÑLÔL�Hà—K’Kðð$ 'Ø%Ø%Ø'Ø"ØØ%Ø"Ø#Ø Ø$Ø$ðñ% ô  ð  ðB Ÿ,š,™.œ.�CØð 4Ø# qÑ(˜Ø!×(Ò(¨¨T¬Ñ3Ô3Ð3ùØ—’‘”�ð[Mð Mð Mñ Mô Mð Mð Mð Mð Mð Mð Møøøð Mð Mð Mð MðN	ð N	ð N	ñ N	ô N	ð N	ð N	ð N	ð N	ð N	ð N	øøøð N	ð N	ð N	ð N	ðb ˆØð 	Zð
ZØiÐiÐiÐiÐiÐiØ3Ð3Ñ5Ô5�Ø&ð 6ð 6�EØ*×GÒGÈÑNÔN�GØð 6Ø%­¨W©¬Ñ5˜øØ  1Ò$Ð$Ý—K’KÐ UÐWdÐfnÑoÔoÐoøøÝð Zð Zð ZÝ—’ÐPÐRXÑYÔYÐYÐYÐYÐYÐYÐYøøøøðZøøøõ 	�ŠØuØØÝ�
‰OŒOØØñ	
ô 	
ð 	
ð  Ø!Ø"Ý 
™OœOØ&Ø#Ý˜:‘”¨Ñ4Ø#0Ø"ð

ð 

ð 
	
sç   ÁA%Á%A)Á,A)Ä<EÅ
EÅEÅ8F Æ
GÆF?Æ?GÈ6I É
JÉ1JÊJË6K8 Ë8
L=Ì1L8Ì8L=Í6M9 Í9 NÎNÎ#J>Y" Ù"
ZÙ,ZÚZÛ,gÜJ)f6æ*gæ6f:	æ:gæ=f:	æ>gçgçgçA h> è>
i-éi(é(i-úlist[dict[str, Any]]c                ó  — g }	 t          j        t          j        |¦  «        d¬¦  «        }|j        D �]!}||         }|                     d¬¦  «        D �]þ}|rt          |¦  «        dk     rŒt          |d         ¦  «                             ¦   «         }t          j
        d|¦  «        sŒV	 t          j        |dd…         d	¦  «        }	t          |¦  «        d
k    r|d
         rt          |d
         ¦  «        nd}
t          |¦  «        dk    r|d         rt          |d         ¦  «        nd}t          |¦  «        dk    r>|d         r6t          t          |d         ¦  «                             dd¦  «        ¦  «        nd}t          |¦  «        dk    r>|d         r6t          t          |d         ¦  «                             dd¦  «        ¦  «        nd}t          |¦  «        dk    r>|d         r6t          t          |d         ¦  «                             dd¦  «        ¦  «        nd}|                     |	|
||||dœ¦  «         �Œï# t           $ r Y �Œüw xY w�Œ#n2# t           $ r%}t"                               d|¦  «         Y d}~nd}~ww xY w|S )z-Parses generic or Techcombank XLSX statement.T)Ú	data_only)Úvalues_onlyé   r   z\d{2}/\d{2}/\d{4}Né
   ú%d/%m/%YrÚ   é   r/   rU   ú,ç        r   ©râ   rî   rÜ   rå   ræ   rç   zGeneric Excel parser error: %s)ÚopenpyxlÚload_workbookr‘   r’   Ú
sheetnamesÚ	iter_rowsr”   r1   rŠ   ÚreÚmatchr   r  ÚfloatÚreplacer‹   rŽ   r˜   rþ   )r+   r3   r0   Útransactionsr±   ÚsheetÚwsr$  Úr0_strÚtx_dater)  r(  r  r  r*  r  s                   r,   rÿ   z2UncClassifierAndRouter._parse_generic_or_tcb_excelä  s©  € àˆð	@ÝÔ'­¬
°7Ñ(;Ô(;ÀtÐLÑLÔLˆBØœð !ñ !�Ø˜”Y�ØŸ<š<°D˜<Ñ9Ô9ð !ñ !�CØð !¥# c¡(¤(¨Q¢, ,Ø Ý   Q¤™[œ[×.Ò.Ñ0Ô0�FÝœ8Ð$8¸&ÑAÔAð !Ø ð!Ý"*Ô"3°F¸3¸B¸3´KÀÑ"LÔ"L˜Ý-0°©X¬X¸ª\¨\¸cÀ!¼f¨\�c # a¤&™kœk˜kÈ$˜Ý.1°#©h¬h¸ªl¨l¸sÀ1¼v¨l�s 3 q¤6™{œ{˜{È2˜ÝGJÈ3ÁxÄxÐRSÂ|À|ÐX[Ð\]ÔX^À|¥¥c¨#¨a¬&¡k¤k×&9Ò&9¸#¸rÑ&BÔ&BÑ CÔ CÐ CÐdg˜ÝHKÈCÉÌÐSTÊÈÐY\Ð]^ÔY_È¥¥s¨3¨q¬6¡{¤{×':Ò':¸3ÀÑ'CÔ'CÑ!DÔ!DÐ!DÐeh˜ÝILÈSÉÌÐTUÊÈÐZ]Ð^_ÔZ`È¥%­¨C°¬F©¬×(;Ò(;¸CÀÑ(DÔ(DÑ"EÔ"EÐ"EÐfj˜à$×+Ò+Ø07Ø58Ø+/Ø05Ø17Ø3:ð-ð -ñ ô ð ñ øõ %ð !ð !ð !Ø ™ð!øøøñ-!ð!øõ4 ð 	@ð 	@ð 	@Ý�NŠNÐ;¸QÑ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð	@øøøàÐs=   „B&I Â+FIÉI É
IÉI ÉIÉI É
JÉ!JÊJc           
     óÊ  — g }	 t          j        t          j        |¦  «        ¦  «        }d}|                     ¦   «         D �]n\  }}t          |j        d         ¦  «                             ¦   «         }|dk    rd}|sŒ=t          j        |j        d         ¦  «        sdt          |j        d         ¦  «        v r �nõt          |j        d         ¦  «                             ¦   «         }		 t          j
        |	dd	…         d
¦  «        }
t          |j        d         ¦  «        }t          j        |j        d         ¦  «        s;t          t          |j        d         ¦  «                             dd¦  «        ¦  «        nd}t          j        |j        d         ¦  «        s;t          t          |j        d         ¦  «                             dd¦  «        ¦  «        nd}t          j        |j        d         ¦  «        st          |j        d         ¦  «        nd}t          |¦  «        dk    rZt          j        |j        d         ¦  «        s;t          t          |j        d         ¦  «                             dd¦  «        ¦  «        nd}|                     |
|||||dœ¦  «         �Œ_# t          $ r Y �Œlw xY wn2# t          $ r%}t                                d|¦  «         Y d}~nd}~ww xY w|S )z;Direct parser for VPBank statements using xlrd or openpyxl.Fr   Ú1Tu   Tá»•ng sá»‘ tiá»�nrÚ   r<  Nr:  r;  rU   r=  r/   r>  r   r9  é   r?  zVPBank direct parse failed: %s)ÚpdÚ
read_excelr‘   r’   Úiterrowsr1   ÚilocrŠ   Úisnar   r  rF  rG  r”   r‹   rŽ   r˜   rþ   )r+   r3   r0   rH  ÚdfÚis_datar°   r$  ÚsttÚdate_strrL  r)  r  r  r(  r*  r  s                    r,   r   z+UncClassifierAndRouter._parse_vpbank_direct  sÊ  € àˆð	@Ý”�rœz¨'Ñ2Ô2Ñ3Ô3ˆBØˆGØŸ+š+™-œ-ð ñ ‘��3Ý˜#œ( 1œ+Ñ&Ô&×,Ò,Ñ.Ô.�Ø˜#’:�:Ø"�GØð ØÝ”7˜3œ8 Aœ;Ñ'Ô'ð Ð+?Å3ÀsÄxÐPQÄ{ÑCSÔCSÐ+SÐ+SØ‘EÝ˜sœx¨œ{Ñ+Ô+×1Ò1Ñ3Ô3�ðÝ&Ô/°¸¸"¸´¸zÑJÔJ�GÝ˜cœh qœkÑ*Ô*�CÝMOÌWÐUXÔU]Ð^_ÔU`ÑMaÔMaÐj�U¥3 s¤x°¤{Ñ#3Ô#3×#;Ò#;¸CÀÑ#DÔ#DÑEÔEÐEÐgj�FÝLNÌGÐTWÔT\Ð]^ÔT_ÑL`ÔL`Ði�E¥# c¤h¨q¤kÑ"2Ô"2×":Ò":¸3ÀÑ"CÔ"CÑDÔDÐDÐfi�EÝ35´7¸3¼8ÀA¼;Ñ3GÔ3GÐO�3˜sœx¨œ{Ñ+Ô+Ð+ÈR�DÝJMÈcÉ(Ì(ÐUVÊ,È,Õ_aÔ_fÐgjÔgoÐpqÔgrÑ_sÔ_sÈ,�e¥C¨¬°¬Ñ$4Ô$4×$<Ò$<¸SÀ"Ñ$EÔ$EÑFÔFÐFÐy}�Gà ×'Ò'Ø,3Ø14Ø'+Ø,1Ø-3Ø/6ð)ð )ñ ô ð ñ øõ !ð ð ð Ø‘Hðøøøøøåð 	@ð 	@ð 	@Ý�NŠNÐ;¸QÑ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð	@øøøàÐs=   „C#J1 Ã(F5JÊJ1 Ê
J-Ê)J1 Ê,J-Ê-J1 Ê1
K Ê;KËK r(  rÓ   c                ób  ‡— |                       ¦   «         Št          ˆfd„dD ¦   «         ¦  «        rdS t          ˆfd„dD ¦   «         ¦  «        rdS t          ˆfd„dD ¦   «         ¦  «        rd	S t          ˆfd
„dD ¦   «         ¦  «        rdS t          ˆfd„dD ¦   «         ¦  «        rdS |dk    rdS dS )Nc              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   ©rI   rJ   Úd_uppers     €r,   rL   zAUncClassifierAndRouter._categorize_transaction.<locals>.<genexpr>/  s'   øè è € ÐBÐB ˆq�Gˆ|ÐBÐBÐBÐBÐBÐBr.   )ÚLUONGu   LÆ¯Æ NGÚBHXHÚSALARYc              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   r[  s     €r,   rL   zAUncClassifierAndRouter._categorize_transaction.<locals>.<genexpr>1  s'   øè è € ÐCÐC ˆq�Gˆ|ÐCÐCÐCÐCÐCÐCr.   )ÚTHUEu   THUáº¾zNTDT+KBÚTAXc              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   r[  s     €r,   rL   zAUncClassifierAndRouter._categorize_transaction.<locals>.<genexpr>3  s'   øè è € ÐyÐy ˆq�Gˆ|ÐyÐyÐyÐyÐyÐyr.   )zNO GOCu
   Ná»¢ Gá»�CzLAI VAYu   LÃƒI VAYzTHANH TOAN LAIzLAI-LDr_   ÚLOAN_REPAYMENTc              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   r[  s     €r,   rL   zAUncClassifierAndRouter._categorize_transaction.<locals>.<genexpr>5  s'   øè è € ÐKÐK ˆq�Gˆ|ÐKÐKÐKÐKÐKÐKr.   )zRUT TIENu   RÃšT TIá»€NzQUY TMÚCASH_WITHDRAWALc              3  ó    •K  — | ]}|‰v V — Œ	d S r)   rH   r[  s     €r,   rL   zAUncClassifierAndRouter._categorize_transaction.<locals>.<genexpr>7  s'   øè è € ÐPÐP ˆq�Gˆ|ÐPÐPÐPÐPÐPÐPr.   )zCHUYEN SANG TKzNOI BOu
   Ná»˜I Bá»˜ÚINTERNAL_TRANSFERrÖ   ÚREVENUE_COLLECTIONÚSUPPLIER_PAYMENT)r„   r…   )r(  rÓ   r\  s     @r,   r  z.UncClassifierAndRouter._categorize_transaction,  s  ø€ à—*’*‘,”,ˆÝÐBÐBÐBÐBÐ%AÐBÑBÔBÑBÔBð 	Ø�8ÝÐCÐCÐCÐCÐ%BÐCÑCÔCÑCÔCð 	Ø�5ÝÐyÐyÐyÐyÐ%xÐyÑyÔyÑyÔyð 	$Ø#Ð#ÝÐKÐKÐKÐKÐ%JÐKÑKÔKÑKÔKð 	%Ø$Ð$ÝÐPÐPÐPÐPÐ%OÐPÑPÔPÑPÔPð 	'Ø&Ð&Ø˜Ò Ð Ø'Ð'Ø!Ð!r.   r)   )r$   r%   r&   r'   )r/   NT)
r0   r1   r2   r1   r3   r4   r5   r6   r&   r7   )r©   rª   r0   r1   r|   r«   r&   r¬   )NN)rÌ   r1   r|   r«   r©   r4   r&   rÍ   )r3   rª   r0   r1   r&   r5  )r(  r1   rÓ   r1   r&   r1   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   Ústaticmethodr¨   rË   r4  rÿ   r   r  rH   r.   r,   r#   r#   >   s  € € € € € ØdÐdð?ð ?ð ?ð ?ð ?ð ð Ø $Ø"&ð	t*ð t*ð t*ð t*ñ „\ðt*ðl ð !%ð#,ð #,ð #,ð #,ñ „\ð#,ðP !%Ø%)ð	A
ð A
ð A
ð A
ð A
ðF!ð !ð !ð !ðF#ð #ð #ð #ðJ ð"ð "ð "ñ „\ð"ð "ð "r.   r#   ).rn  Ú
__future__r   r¸   r‘   Úloggingr³   rD  Úshutilr   Údecimalr   Útypingr   Úuuidr   r   r@  ÚpandasrP  r�   Ú&app.core.postgres.base_pkg.base_clientr	   Ú8app.modules.banking.application.parsers.acb_excel_parserr
   Ú6app.modules.banking.application.parsers.tcb_pdf_parserr   Ú8app.modules.banking.application.parsers.vcb_excel_parserr   Ú;app.modules.banking.application.parsers.vpbank_excel_parserr   Ú	getLoggerr˜   Úpathlibr   Ú__file__ÚresolveÚparentsÚ_UNC_BASE_DIRÚgetenvr1   rµ   rü   r²   r  r#   rH   r.   r,   ú<module>rƒ     s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à €€€Ø Ð Ð Ð Ø €€€à EÐ EÐ EÐ EÐ EÐ EØ SÐ SÐ SÐ SÐ SÐ SØ OÐ OÐ OÐ OÐ OÐ OØ SÐ SÐ SÐ SÐ SÐ SØ YÐ YÐ YÐ YÐ YÐ Yà	ˆÔ	ÐEÑ	FÔ	F€à Ð Ð Ð Ð Ð à��X‘”×&Ò&Ñ(Ô(Ô0°Ô3€Ø�2”9ØØ€Cˆ˜	Ñ! JÑ.Ñ/Ô/ñô Ð ð
 ˜|Ð,€ð Ø%ØØ%Ø#ØØðð €ð EØOØFØHØBðð Ð ð}"ð }"ð }"ð }"ð }"ñ }"ô }"ð }"ð }"ð }"r.   