§
    °lšju  ã            
       ó   — d dl mZmZmZmZmZmZ d dlmZm	Z	m
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 d dlmZ d d	lmZ d d
lmZ d dlmZmZmZmZ d dlm Z  d dl!m"Z" d dl#m$Z$  eddg e e"g d¢¦  «        ¦  «        g¬¦  «        Z%de fd„Z&e% '                    d¦  «         ed¦  «         ed¦  «         ed¦  «         ee&¦  «        fdede(de(de fd„¦   «         Z)e% '                    d¦  «         ee&¦  «        fdede	e(e
f         de fd „¦   «         Z*e% '                    d!d"¬#¦  «         ee&¦  «        fde de	e(e
f         fd$„¦   «         Z+e% ,                    d%d&¬#¦  «        de	e(e
f         fd'„¦   «         Z-dS )(é    )Ú	APIRouterÚ
UploadFileÚFileÚDependsÚHTTPExceptionÚForm)ÚListÚDictÚAny)ÚUUID)Údatetime)ÚDecimal)ÚVCBExcelParser)ÚTCBPdfParser)ÚACBExcelParser)ÚVPBankExcelParser)ÚReconciliationEngine)ÚRecordTransactionCommandÚRecordTransactionCommandHandlerÚReconcileTransactionCommandÚ"ReconcileTransactionCommandHandler©ÚBasePostgresClient)Úrequire_role)ÚBytesIOz/v1/erp/bankingzBanking & Reconciliation)Ú
superadminÚdirectorÚ
accountantÚpm)ÚprefixÚtagsÚdependenciesÚreturnc                  ó   — t          ¦   «         S )Nr   © ó    úEC:\Projects\DSCons\app\modules\banking\presentation\banking_routes.pyÚget_db_clientr(      s   € ÝÑÔÐr&   z/upload.NÚfileÚ	bank_codeÚpasswordÚ	db_clientc              ƒ   óð  K  — |                       ¦   «         ƒ d{V —†}| j                             ¦   «         }d}|dk    sd|v s|                     d¦  «        rd|v rt	          |¬¦  «        }nH|dk    sd|v sd|v rt          ¦   «         }n+|d	k    sd	|v sd
|v rt          ¦   «         }nt          ¦   «         }	 |                     t          |¦  «        | j        ¦  «        }n3# t          $ r&}t          ddt          |¦  «        › �¬¦  «        ‚d}~ww xY wg }	t          |¦  «        }
|D �]}	 t          |                     dd¦  «        t!          t          |                     dd¦  «        |                     dd¦  «        z
  ¦  «        ¦  «        |                     dt#          j        ¦   «         ¦  «        |                     dd¦  «        ¬¦  «        }|
                     |¦  «        }t          |¦  «        |d<   |	                     |¦  «         Œæ# t          $ r}t+          d|› �¦  «         Y d}~�Œd}~ww xY wt-          |¬¦  «        }|                     |	¦  «        ƒ d{V —†}d| j        t1          |¦  «        |dœS )zr
    Uploads a bank statement file. Optionally pass bank_code (vcb, tcb, acb, vpbank) and password (for PDF).
    NÚtcbÚtechcombankz.pdfÚmonthly)r+   ÚacbÚsaokeÚvpbankÚaccountstmti¦  zFailed to parse statement: ©Ústatus_codeÚdetailÚaccount_numberÚUNKNOWNÚcredit_amount_vndr   Údebit_amount_vndÚtransaction_dateÚdescriptionÚ )Úbank_account_noÚamountr<   r=   ÚidzSkipping tx due to error: )r,   zFile processed successfully)ÚmessageÚ	file_nameÚtotal_transactionsÚtransactions)ÚreadÚfilenameÚlowerÚendswithr   r   r   r   Úparser   Ú	Exceptionr   Ústrr   r   Úgetr   r   ÚutcnowÚhandleÚappendÚprintr   Úsuggest_matchesÚlen)r)   r*   r+   r,   ÚcontentÚfilename_lowerÚparserrE   ÚeÚsaved_transactionsÚrecord_handlerÚtxÚcmdÚtx_idÚengineÚsuggested_txss                   r'   Úupload_statementr_      sø  è è € ð —I’I‘K”KÐÐÐÐÐÐ€GØ”]×(Ò(Ñ*Ô*€Nð €FØ�EÒÐ˜m¨~Ð=Ð=À.×BYÒBYÐZ`ÑBaÔBaÐ=Ðfoð  tBð  gBð  gBÝ xÐ0Ñ0Ô0ˆˆØ	�eÒ	Ð	˜u¨Ð6Ð6¸'À^Ð:SÐ:SÝÑ!Ô!ˆˆØ	�hÒ	Ð	 (¨nÐ"<Ð"<ÀÐQ_Ð@_Ð@_Ý"Ñ$Ô$ˆˆõ  Ñ!Ô!ˆð\Ø—|’|¥G¨GÑ$4Ô$4°d´mÑDÔDˆˆøÝð \ð \ð \Ý¨Ð4ZÕRUÐVWÑRXÔRXÐ4ZÐ4ZÐ[Ñ[Ô[Ð[øøøøð\øøøð ÐÝ4°YÑ?Ô?€NØð 4ñ 4ˆð	4Ý*Ø "§¢Ð'7¸Ñ CÔ CÝ�s 2§6¢6Ð*=¸qÑ#AÔ#AÀBÇFÂFÐK]Ð_`ÑDaÔDaÑ#aÑbÔbÑcÔcØ!#§¢Ð(:½H¼OÑ<MÔ<MÑ!NÔ!NØŸFšF =°"Ñ5Ô5ð	ñ ô ˆCð #×)Ò)¨#Ñ.Ô.ˆEÝ˜5‘z”zˆBˆt‰HØ×%Ò% bÑ)Ô)Ð)Ð)øÝð 	4ð 	4ð 	4ÝÐ2¨qÐ2Ð2Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ñ3øøøøð	4øøøõ "¨IÐ6Ñ6Ô6€FØ ×0Ò0Ð1CÑDÔDÐDÐDÐDÐDÐDÐD€Mð 1Ø”]Ý! -Ñ0Ô0Ø%ð	ð ð s1   Â5(C Ã
DÃ(!D	Ä	DÄ(C!H
È

H1ÈH,È,H1z(/transactions/{transaction_id}/reconcileÚtransaction_idÚpayloadc                 ó˜  — |                      d¦  «        }|st          dd¬¦  «        ‚t          | t          |¦  «        ¬¦  «        }t	          |¦  «        }	 |                     |¦  «         dddœS # t          $ r#}t          dt          |¦  «        ¬¦  «        ‚d	}~wt          $ r#}t          d
t          |¦  «        ¬¦  «        ‚d	}~ww xY w)z9
    Xac nhan doi soat giao dich voi Hoa don (CQRS).
    Ú
invoice_idi�  zMust provide invoice_idr5   )r`   rc   ÚsuccessuL   Giao dá»‹ch Ä‘Ã£ Ä‘á»‘i soÃ¡t thÃ nh cÃ´ng vÃ  Event Ä‘Ã£ Ä‘Æ°á»£c phÃ¡t ra.)ÚstatusrB   Niô  )	rM   r   r   r   r   rO   Ú
ValueErrorrL   rK   )r`   ra   r,   rc   ÚcommandÚhandlerrW   s          r'   Úreconcile_transactionri   T   sð   € ð —’˜\Ñ*Ô*€Jàð OÝ¨Ð4MÐNÑNÔNÐNå)Ø%Ý˜
Ñ#Ô#ðñ ô €Gõ
 1°Ñ;Ô;€Gð<Ø�Š�wÑÔÐØ#Ð0~ÐÐÐøÝð <ð <ð <Ý¨µC¸±F´FÐ;Ñ;Ô;Ð;øøøøÝð <ð <ð <Ý¨µC¸±F´FÐ;Ñ;Ô;Ð;øøøøð<øøøs$   ÁA1 Á1
C	Á;BÂC	Â&CÃC	z/hot-watcher/scanuD   QuÃ©t vÃ  náº¡p toÃ n bá»™ thÆ° má»¥c Hot Watcher (Finance/UNC-2026))Úsummaryc                 óP   — ddl m}  || ¦  «        }|                     ¦   «         }|S )u[   QuÃ©t toÃ n bá»™ cÃ¢y thÆ° má»¥c Hot Watcher vÃ  tá»± Ä‘á»™ng náº¡p cÃ¡c giao dá»‹ch má»›i.r   )ÚUncHotWatcherService)Ú/app.modules.banking.application.unc_hot_watcherrl   Úscan_all_folders)r,   rl   ÚserviceÚress       r'   Úscan_hot_watcherrq   r   s=   € ð
 UÐTÐTÐTÐTÐTØ"Ð" 9Ñ-Ô-€GØ
×
"Ò
"Ñ
$Ô
$€CØ€Jr&   z/hot-watcher/statusu/   Kiá»ƒm tra tráº¡ng thÃ¡i thÆ° má»¥c Hot Watcherc                  óŽ  — ddl } ddlm}m} | j                             |¦  «        }i }|r•|                     ¦   «         D ]€\  }}| j                             ||¦  «        }| j                             |¦  «        r"t          |  	                    |¦  «        ¦  «        nd}||| j                             |¦  «        |dœ||<   Œ�||||dœS )uP   Kiá»ƒm tra Ä‘Æ°á»�ng dáº«n vÃ  danh sÃ¡ch cÃ¡c thÆ° má»¥c con cá»§a Hot Watcher.r   N)ÚHOT_WATCHER_ROOTÚBANK_FOLDER_MAP)ÚfolderÚpathÚexistsÚ
file_count)Úhot_watcher_rootrw   ÚbanksÚ
subfolders)
ÚosÚ9app.modules.banking.application.unc_classifier_and_routerrs   rt   rv   rw   ÚitemsÚjoinrS   Úlistdir)	r|   rs   rt   rw   r{   Úbankru   Úf_pathrx   s	            r'   Úget_hot_watcher_statusrƒ   }   sø   € ð €I€I€IØkÐkÐkÐkÐkÐkÐkÐkàŒW�^Š^Ð,Ñ-Ô-€FØ€JØð 	Ø+×1Ò1Ñ3Ô3ð 	ð 	‰LˆD�&Ø”W—\’\Ð"2°FÑ;Ô;ˆFØ46´G·N²NÀ6Ñ4JÔ4JÐQ�˜RŸZšZ¨Ñ/Ô/Ñ0Ô0Ð0ÐPQˆJà ØØœ'Ÿ.š.¨Ñ0Ô0Ø(ð	 ð  ˆJ�tÑÐð -ØØØ ð	ð ð r&   ).Úfastapir   r   r   r   r   r   Útypingr	   r
   r   Úuuidr   r   Údecimalr   Ú8app.modules.banking.application.parsers.vcb_excel_parserr   Ú6app.modules.banking.application.parsers.tcb_pdf_parserr   Ú8app.modules.banking.application.parsers.acb_excel_parserr   Ú;app.modules.banking.application.parsers.vpbank_excel_parserr   Ú5app.modules.banking.application.reconciliation_enginer   Ú(app.modules.banking.application.commandsr   r   r   r   Ú&app.core.postgres.base_pkg.base_clientr   Ú"app.modules.auth.presentation.authr   Úior   Úrouterr(   ÚpostrL   r_   ri   rq   rM   rƒ   r%   r&   r'   ú<module>r“      sQ  ðØ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à SÐ SÐ SÐ SÐ SÐ SØ OÐ OÐ OÐ OÐ OÐ OØ SÐ SÐ SÐ SÐ SÐ SØ YÐ YÐ YÐ YÐ YÐ YØ VÐ VÐ VÐ VÐ VÐ Vð pð  pð  pð  pð  pð  pð  pð  pð  pð  pð  pð  pØ EÐ EÐ EÐ EÐ EÐ EØ ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø Ð Ð Ð Ð Ð à	ˆØØ
$Ð	%Ø�'˜,˜,Ð'UÐ'UÐ'UÑVÔVÑWÔWÐXð
ñ 
ô 
€ð Ð)ð  ð  ð  ð  ð ‡‚ˆYÑÔà�t˜C‘y”yØ�T˜$‘Z”ZØ�D˜‘J”JØ$+ G¨MÑ$:Ô$:ð	7ð 7Ø
ð7àð7ð ð7ð "ð	7ð 7ð 7ñ Ôð7ðr ‡‚Ð7Ñ8Ô8ð %, G¨MÑ$:Ô$:ð<ð <Øð<à�#�s�(Œ^ð<ð "ð<ð <ð <ñ 9Ô8ð<ð: ‡‚Ð Ð*p€ÑqÔqà$+ G¨MÑ$:Ô$:ðð Ø!ðà	ˆ#ˆsˆ(„^ðð ð ñ rÔqðð ‡‚Ð!Ð+\€Ñ]Ô]ð  S¨# X¤ð ð ð ñ ^Ô]ðð ð r&   