§
    ©”jŸ  ã                   ó„   — d dl Z d dlZd dlZd dlmZmZmZ d dlmZ d dl	m
Z
  ej        d¦  «        Z G d„ d¦  «        ZdS )é    N)ÚListÚDictÚAny)Úget_settings)Ú	LLMClientzdscons.banking.reconciliationc                   ó\   — e Zd Zd„ Zdeeeef                  deeeef                  fd„ZdS )ÚReconciliationEnginec                 ól   — || _         t          ¦   «         | _        t          | j        ¦  «        | _        d S )N)Údbr   Úsettingsr   Ú
llm_client)ÚselfÚ	db_clients     úKC:\Projects\DSCons\app\modules\banking\application\reconciliation_engine.pyÚ__init__zReconciliationEngine.__init__   s)   € ØˆŒÝ$™œˆŒÝ# D¤MÑ2Ô2ˆŒˆˆó    ÚtransactionsÚreturnc              ƒ   ó’  ‡ ‡	K  — |s|S d„ |D ¦   «         }|s|S ddl }|                     d¦  «        Š	dt          dt          t          t
          t          f                  fˆ ˆ	fd„}d}g }t          dt          |¦  «        |¦  «        D ].}||||z   …         }| 	                     |||¦  «        ¦  «         Œ/|r |j
        |Ž ƒ d{V —† |S )	z¢
        Takes a list of raw transaction dicts and uses Gemini 3.1 Pro via Antigravity SDK
        to suggest matches (invoice numbers or partner names).
        c                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS )Údescription)Úget)Ú.0Útxs     r   ú
<listcomp>z8ReconciliationEngine.suggest_matches.<locals>.<listcomp>   s)   € ÐLÐLÐL °b·f²f¸]Ñ6KÔ6KÐL˜ÐLÐLÐLr   r   Né   Úchunk_startÚchunkc              “   ó   •K  — ‰4 ƒd {V —† d}|dz  }|dz  }t          |¦  «        D ]R\  }}|d|› d|                     d¦  «        › d|                     dd	¦  «        › d
|                     dd	¦  «        › d�	z  }ŒS	 ‰j                             d|dœgdd¬¦  «        ƒ d {V —†}|                     di g¦  «        d	                              di ¦  «                             dd¦  «        }|                     ¦   «         }|                     d¦  «        r
|dd …         }|                     d¦  «        r
|dd …         }|                     d¦  «        r
|d d…         }t          j        |                     ¦   «         ¦  «        }t          |¦  «        D ]�\  }}|t          |¦  «        k     rw||         }|                     d¦  «        |d<   |                     d¦  «        |d<   t          |                     dd¦  «        ¦  «        |d<   |                     dd ¦  «        |d<   Œ�nË# t          $ r¾}	t                               d!|	› �¦  «         |D ]”}|                     dd"¦  «                             ¦   «         }
t          j        d#|
¦  «        }|r:|                     d$¦  «        |d<   d%|d<   d&|                     d$¦  «        › d'�|d<   Œ{d(|
v rd)|d<   d*|d<   d+|d<   Œ�d|d<   Œ•Y d }	~	nd }	~	ww xY wd d d ¦  «        ƒd {V —† d S # 1 ƒd {V —†swxY w Y   d S ),NuÉ   Báº¡n lÃ  AI Káº¿ toÃ¡n (AI Quá»³nh) cá»§a há»‡ thá»‘ng DSCons ERP. HÃ£y phÃ¢n tÃ­ch cÃ¡c giao dá»‹ch ngÃ¢n hÃ ng sau Ä‘á»ƒ tÃ¬m ra 'sá»‘ hÃ³a Ä‘Æ¡n' (náº¿u cÃ³) hoáº·c 'tÃªn Ä‘á»‘i tÃ¡c' (náº¿u cÃ³).
u‡  Tráº£ vá»� duy nháº¥t 1 máº£ng JSON chá»©a cÃ¡c object cÃ³ Ä‘á»‹nh dáº¡ng: {"index": <int>, "suggested_invoice_number": "<string|null>", "suggested_partner_name": "<string|null>", "confidence_score": <float_0_to_1>, "reason": "<string>"}. Báº¡n Báº®T BUá»˜C pháº£i tráº£ vá»� Ä‘Ãºng sá»‘ lÆ°á»£ng object báº±ng vá»›i sá»‘ lÆ°á»£ng giao dá»‹ch Ä‘Æ°á»£c cung cáº¥p, giá»¯ nguyÃªn thá»© tá»±.

u   Danh sÃ¡ch giao dá»‹ch:
ú[u   ] Diá»…n giáº£i: r   u    | Tiá»�n vÃ o: Úcredit_amount_vndr   u    | Tiá»�n ra: Údebit_amount_vndú
Úuser)ÚroleÚcontentgš™™™™™¹?Úquynh)ÚmessagesÚtemperatureÚ
agent_codeÚchoicesÚmessager&   z[]z```jsoné   z```r   éýÿÿÿÚsuggested_invoice_numberÚsuggested_partner_nameÚconfidence_scoreg        Úreasonu!   AI khÃ´ng tÃ¬m tháº¥y thÃ´ng tin.z([ReconciliationEngine] AI chunk failed: Ú zHD\s*(\d{4,8})é   gš™™™™™é?zDetected invoice number z in descriptionz	CONG TY Az	Cong Ty Ag      à?zDescription matches Partner A)Ú	enumerater   r   Úcreate_chat_completionÚstripÚ
startswithÚendswithÚjsonÚloadsÚlenÚfloatÚ	ExceptionÚloggerÚerrorÚupperÚreÚsearchÚgroup)r   r   ÚpromptÚidxr   Úresponser&   Ú
ai_resultsÚresÚer   Úinvoice_matchr   Ú	semaphores               €€r   Úprocess_chunkz;ReconciliationEngine.suggest_matches.<locals>.process_chunk!   s‹  øè è € Ø ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð f�Øð  vñ  v�ØÐ5Ñ5�å(¨Ñ/Ô/ð oð o‘G�C˜Øð  o #ð  oð  o¸¿º¸}Ñ8MÔ8Mð  oð  oÐ_a×_eÒ_eÐfyÐ{|Ñ_}Ô_}ð  oð  oð  NP÷  NTò  NTð  Ugð  ijñ  Nkô  Nkð  oð  oð  oñ  o�F�Fð&9Ø%)¤_×%KÒ%KØ+1¸fÐ"EÐ"EÐ!FØ$'Ø#*ð &Lñ &ô &ð  ð  ð  ð  ð  ð  �Hð 'Ÿlšl¨9°r°dÑ;Ô;¸AÔ>×BÒBÀ9ÈbÑQÔQ×UÒUÐV_ÐaeÑfÔf�GØ%Ÿmšm™oœo�GØ×)Ò)¨)Ñ4Ô4ÐKÀÈÈÈÄ°gØ×)Ò)¨%Ñ0Ô0ÐG¸GÀAÀBÀB¼K°'Ø×'Ò'¨Ñ.Ô.ÐF¸'À#À2À#¼,°å!%¤¨G¯MªM©O¬OÑ!<Ô!<�Jå$-¨jÑ$9Ô$9ð bð b™˜˜SØ¥ U¡¤Ò+Ð+Ø!& s¤˜BØ=@¿WºWÐE_Ñ=`Ô=`˜BÐ9Ñ:Ø;>¿7º7ÐC[Ñ;\Ô;\˜BÐ7Ñ8Ý5:¸3¿7º7ÐCUÐWZÑ;[Ô;[Ñ5\Ô5\˜BÐ1Ñ2Ø+.¯7ª7°8Ð=`Ñ+aÔ+a˜B˜x™Løðbøõ !ð 9ð 9ð 9Ý—L’LÐ!OÈAÐ!OÐ!OÑPÔPÐPà#ð 9ð 9˜Ø&(§f¢f¨]¸BÑ&?Ô&?×&EÒ&EÑ&GÔ&G˜Ý(*¬	Ð2CÀ[Ñ(QÔ(Q˜Ø(ð 	9Ø=J×=PÒ=PÐQRÑ=SÔ=S˜BÐ9Ñ:Ø58˜BÐ1Ñ2Ø+mÀm×FYÒFYÐZ[ÑF\ÔF\Ð+mÐ+mÐ+m˜B˜x™L˜LØ(¨KÐ7Ð7Ø;F˜BÐ7Ñ8Ø58˜BÐ1Ñ2Ø+J˜B˜x™L˜Là58˜BÐ1Ñ2Ð2ð9ð 9ð 9ð 9ð 9øøøøð9øøøð?.9ð .9ð .9ñ .9ô .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9ð .9øøøð .9ð .9ð .9ð .9ð .9ð .9s>   ŒA/K=Á<F"HÈK=È
K'È)B4K"ËK=Ë"K'Ë'K=Ë=
LÌ
Lé   )ÚasyncioÚ	SemaphoreÚintr   r   Ústrr   Úranger<   ÚappendÚgather)
r   r   Útx_to_analyzerO   rM   Ú
chunk_sizeÚtasksÚir   rL   s
   `        @r   Úsuggest_matchesz$ReconciliationEngine.suggest_matches   s)  øøè è € ð
 ð 	 ØÐð MÐL lÐLÑLÔLˆØð 	 ØÐàˆˆˆØ×%Ò% aÑ(Ô(ˆ	ð/	9­Sð /	9½½dÅ3ÍÀ8¼nÔ9Mð /	9ð /	9ð /	9ð /	9ð /	9ð /	9ð /	9ðb ˆ
ØˆÝ�q�#˜mÑ,Ô,¨jÑ9Ô9ð 	2ð 	2ˆAØ! ! A¨
¡NÐ"2Ô3ˆEØ�LŠL˜˜ q¨%Ñ0Ô0Ñ1Ô1Ð1Ð1àð 	)Ø �'”. %Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(àÐr   N)	Ú__name__Ú
__module__Ú__qualname__r   r   r   rR   r   rZ   © r   r   r	   r	      sl   € € € € € ð3ð 3ð 3ð
J°$°t¸CÀ¸H´~Ô2Fð JÈ4ÐPTÐUXÐZ]ÐU]ÔP^ÔK_ð Jð Jð Jð Jð Jð Jr   r	   )rB   r:   ÚloggingÚtypingr   r   r   Úapp.core.settingsr   Ú)app.modules.agents.application.llm_clientr   Ú	getLoggerr?   r	   r^   r   r   ú<module>rd      s±   ðØ 	€	€	€	Ø €€€Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à *Ð *Ð *Ð *Ð *Ð *Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?à	ˆÔ	Ð:Ñ	;Ô	;€ðPð Pð Pð Pð Pñ Pô Pð Pð Pð Pr   