§
    Z?ºj:!  ã            	      ó˜  — d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZmZ ddlmZmZ ddlmZ  ej        e¦  «        Z ed	d
g¬¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Ze                     dd¬¦  «         ee¦  «        fdFd„¦   «         Ze                     dd¬¦  «         e
ddd¬¦  «         e
dd¬¦  «         e
dd¬¦  «         e
d d!d"¬#¦  «         e
dd¬$¦  «         ee¦  «        fdGd-„¦   «         Ze                     d.d/¬¦  «         ee¦  «        fdHd1„¦   «         Ze                     d2d3¬¦  «         e eg d4¢¦  «        ¦  «        fdId6„¦   «         Ze                     d7d8¬¦  «         e eg d4¢¦  «        ¦  «        fdJd9„¦   «         Ze                     d:d;¬¦  «         ee¦  «        fdHd<„¦   «         Z  G d=„ d>e¦  «        Z! G d?„ d@e¦  «        Z"e                     dAdB¬¦  «         ee¦  «        fdHdC„¦   «         Z#e                     dAdD¬¦  «         e eg d4¢¦  «        ¦  «        fdKdE„¦   «         Z$dS )Lu­   AEC 3-Way Matching API Router (Ä�á»‘i soÃ¡t HÃ³a Ä�Æ¡n <-> Dá»± Ã�n <-> GiÃ¡ Sá»Ÿ XÃ¢y Dá»±ng Háº£i PhÃ²ng).
Strict Zero-Tolerance Synthetic Data & Decimal(18,4) COMPLIANT.
é    )ÚannotationsN)ÚAny)Ú	APIRouterÚDependsÚHTTPExceptionÚQuery)Ú	BaseModelÚField)Úget_current_userÚrequire_role)ÚAec3WayMatchingServicez/v1/erp/invoices/3way-matchingz.ERP - AEC 3-Way Matching & SXD Price Benchmark)ÚprefixÚtagsc                  óX   — e Zd ZU  edd¬¦  «        Zded<    edd¬¦  «        Zded	<   dS )
ÚConfirmMatchRequest.u   ID dá»± Ã¡n cáº§n khá»›p ná»‘i©ÚdescriptionÚstrÚ
project_idNu!   ID háº¡ng má»¥c WBS (tÃ¹y chá»�n)ú
str | NoneÚwbs_id)Ú__name__Ú
__module__Ú__qualname__r
   r   Ú__annotations__r   © ó    úPC:\Projects\DSCons\app\modules\invoices\presentation\aec_3way_matching_routes.pyr   r      sT   € € € € € € Ø�e˜CÐ-MÐNÑNÔN€JÐNÐNÐNÑNØ˜˜tÐ1TÐUÑUÔU€FÐUÐUÐUÑUÐUÐUr   r   c                  ó\   — e Zd ZU  edd¬¦  «        Zded<    edddd	¬
¦  «        Zded<   dS )ÚBatchAutoMatchRequestTu@   Cháº¿ Ä‘á»™ xem trÆ°á»›c (True) hoáº·c Ã¡p dá»¥ng tháº­t (False)r   ÚboolÚdry_runéô  é   iÐ  u:   Sá»‘ lÆ°á»£ng hÃ³a Ä‘Æ¡n tá»‘i Ä‘a quÃ©t trong Ä‘á»£t nÃ y)ÚgeÚler   ÚintÚ	max_itemsN)r   r   r   r
   r"   r   r(   r   r   r   r    r       sX   € € € € € € Ø�E˜$Ð,nÐoÑoÔo€GÐoÐoÐoÑoØ�U˜3 1¨Ð;wÐxÑxÔx€IÐxÐxÐxÑxÐxÐxr   r    z/summaryuA   Láº¥y KPI Tá»•ng Há»£p 3-Way Matching & Kiá»ƒm ToÃ¡n GiÃ¡ Sá»Ÿ XD)ÚsummaryÚcurrent_userúdict[str, Any]Úreturnc                óæ   — 	 t          ¦   «         }|                     ¦   «         S # t          $ rB}t                               d|› �d¬¦  «         t          dt          |¦  «        ¬¦  «        ‚d}~ww xY w)uw   Tá»•ng há»£p 1.031 hÃ³a Ä‘Æ¡n mua vÃ o (50,3 tá»·), tá»· lá»‡ khá»›p dá»± Ã¡n vÃ  rá»§i ro Ä‘Æ¡n giÃ¡ Sá»Ÿ XÃ¢y dá»±ng.u$   Lá»—i láº¥y summary 3-way matching: T©Úexc_infor#   ©Ústatus_codeÚdetailN)r   Úget_matching_summaryÚ	ExceptionÚloggerÚerrorr   r   )r*   ÚserviceÚexcs      r   Úget_3way_summaryr9   !   s{   € ð
>Ý(Ñ*Ô*ˆØ×+Ò+Ñ-Ô-Ð-øÝð >ð >ð >Ý�ŠÐA¸CÐAÐAÈDˆÑQÔQÐQÝ¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøð>øøøs   ‚!$ ¤
A0®=A+Á+A0z/listu7   Danh SÃ¡ch HÃ³a Ä�Æ¡n Mua VÃ o Phá»¥c Vá»¥ Ä�á»‘i SoÃ¡tÚALLz^(ALL|MATCHED|UNMATCHED)$u   Tráº¡ng thÃ¡i khá»›p ná»‘i)Úpatternr   u   Lá»�c theo ID dá»± Ã¡nr   u?   TÃ¬m kiáº¿m theo sá»‘ HÄ�, tÃªn nhÃ  cung cáº¥p hoáº·c ghi chÃºé2   r$   éÈ   )r%   r&   ©r%   Ústatusr   r   r   ÚsearchÚlimitr'   Úoffsetc                óò   — 	 t          ¦   «         }|                     | ||||¬¦  «        S # t          $ rB}t                               d|› �d¬¦  «         t          dt          |¦  «        ¬¦  «        ‚d}~ww xY w)un   Truy xuáº¥t danh sÃ¡ch hÃ³a Ä‘Æ¡n mua vÃ o kÃ¨m nhÃ£n cáº£nh bÃ¡o Ä‘Æ¡n giÃ¡ Sá»Ÿ XÃ¢y dá»±ng vÃ  gá»£i Ã½ AI.)r?   r   r@   rA   rB   u-   Lá»—i truy xuáº¥t danh sÃ¡ch 3-way matching: Tr.   r#   r0   N)r   Úlist_matching_invoicesr4   r5   r6   r   r   )r?   r   r@   rA   rB   r*   r7   r8   s           r   Úlist_3way_invoicesrE   .   s˜   € ð>Ý(Ñ*Ô*ˆØ×-Ò-ØØ!ØØØð .ñ 
ô 
ð 	
øõ ð >ð >ð >Ý�ŠÐJÀSÐJÐJÐUYˆÑZÔZÐZÝ¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøð>øøøs   ‚'* ª
A6´=A1Á1A6z/{invoice_id}/audit-detailuE   Chi Tiáº¿t Ä�á»‘i SoÃ¡t 3 Chiá»�u (HÃ³a Ä�Æ¡n vs WBS vs GiÃ¡ Sá»Ÿ XD)Ú
invoice_idc                ó>  — 	 t          ¦   «         }|                     | ¦  «        S # t          $ r#}t          dt	          |¦  «        ¬¦  «        ‚d}~wt
          $ rB}t                               d|› �d¬¦  «         t          dt	          |¦  «        ¬¦  «        ‚d}~ww xY w)u€   PhÃ¢n rÃ£ chi tiáº¿t tá»«ng dÃ²ng hÃ ng: Ä�Æ¡n giÃ¡ thá»±c táº¿, Ä�Æ¡n giÃ¡ Sá»Ÿ XÃ¢y dá»±ng tÆ°Æ¡ng Ä‘Æ°Æ¡ng vÃ  ChÃªnh lá»‡ch.é”  r0   Nu)   Lá»—i bÃ³c tÃ¡ch chi tiáº¿t 3-way audit: Tr.   r#   )r   Úget_invoice_audit_detailÚ
ValueErrorr   r   r4   r5   r6   ©rF   r*   r7   r8   s       r   rI   rI   F   s­   € ð>Ý(Ñ*Ô*ˆØ×/Ò/°
Ñ;Ô;Ð;øÝð >ð >ð >Ý¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøÝð >ð >ð >Ý�ŠÐFÀÐFÐFÐQUˆÑVÔVÐVÝ¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøð>øøøs    ‚"% ¥
B¯AÁBÁ=BÂBz/batch-auto-matchuH   KÃ­ch Hoáº¡t Tá»± Ä�á»™ng Khá»›p Ná»‘i AI HÃ ng Loáº¡t (Dry-Run / Apply))Ú
superadminÚdirectorÚ
accountantÚpmÚreqc                ó   — 	 t          ¦   «         }|                     | j        | j        ¬¦  «        S # t          $ rB}t
                               d|› �d¬¦  «         t          dt          |¦  «        ¬¦  «        ‚d}~ww xY w)ug   Tá»± Ä‘á»™ng phÃ¢n bá»• hÃ ng loáº¡t cÃ¡c hÃ³a Ä‘Æ¡n mua vÃ o chÆ°a khá»›p vÃ o Dá»± Ã�n & Trá»¥ Cá»™t.)r"   r(   u   Lá»—i batch auto match: Tr.   r#   r0   N)	r   Úbatch_auto_matchr"   r(   r4   r5   r6   r   r   )rP   r*   r7   r8   s       r   rR   rR   V   s†   € ð>Ý(Ñ*Ô*ˆØ×'Ò'°´ÀsÄ}Ð'ÑUÔUÐUøÝð >ð >ð >Ý�ŠÐ5°Ð5Ð5ÀˆÑEÔEÐEÝ¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøð>øøøs   ‚.1 ±
A=»=A8Á8A=z/{invoice_id}/confirmu8   PhÃª Duyá»‡t Khá»›p Ná»‘i HÃ³a Ä�Æ¡n VÃ o Dá»± Ã�n & WBSc                ó²  — 	 t          ¦   «         }|                     d¦  «        p|                     d¦  «        pd}|                     | |j        |j        |¬¦  «        S # t
          $ r#}t          dt          |¦  «        ¬¦  «        ‚d}~wt          $ rB}t           
                    d|› �d	¬
¦  «         t          dt          |¦  «        ¬¦  «        ‚d}~ww xY w)uP   PhÃª duyá»‡t khá»›p ná»‘i chÃ­nh thá»©c 1 hÃ³a Ä‘Æ¡n vÃ o 1 dá»± Ã¡n cá»¥ thá»ƒ.Ú	full_nameÚemailõ   Káº¿ ToÃ¡n ViÃªn)rF   r   r   Ú	user_namerH   r0   Nu+   Lá»—i xÃ¡c nháº­n khá»›p ná»‘i hÃ³a Ä‘Æ¡n: Tr.   r#   )r   ÚgetÚconfirm_matchingr   r   rJ   r   r   r4   r5   r6   )rF   rP   r*   r7   rW   r8   s         r   Úconfirm_invoice_matchingrZ   f   sô   € ð>Ý(Ñ*Ô*ˆØ ×$Ò$ [Ñ1Ô1Ðd°\×5EÒ5EÀgÑ5NÔ5NÐdÐRdˆ	Ø×'Ò'Ø!Ø”~Ø”:Øð	 (ñ 
ô 
ð 	
øõ ð >ð >ð >Ý¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøÝð >ð >ð >Ý�ŠÐHÀ3ÐHÐHÐSWˆÑXÔXÐXÝ¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøð>øøøs$   ‚AA Á
CÁ)BÂCÂ=CÃCz/{invoice_id}/suggestionsu5   Láº¥y Gá»£i Ã� Top Dá»± Ã�n PhÃ¹ Há»£p Cho HÃ³a Ä�Æ¡nc                ó@  — 	 t          ¦   «         }|                     | ¬¦  «        S # t          $ r#}t          dt	          |¦  «        ¬¦  «        ‚d}~wt
          $ rB}t                               d|› �d¬¦  «         t          dt	          |¦  «        ¬¦  «        ‚d}~ww xY w)	ut   TÃ­nh toÃ¡n vÃ  xáº¿p háº¡ng top dá»± Ã¡n thÃ´ng minh phÃ¹ há»£p cho hÃ³a Ä‘Æ¡n dá»±a trÃªn váº­t tÆ° vÃ  vá»‹ trÃ­.©rF   rH   r0   Nu   Lá»—i gá»£i Ã½ dá»± Ã¡n: Tr.   r#   )r   Úget_smart_project_suggestionsrJ   r   r   r4   r5   r6   rK   s       r   Úget_invoice_project_suggestionsr^      s¯   € ð>Ý(Ñ*Ô*ˆØ×4Ò4À
Ð4ÑKÔKÐKøÝð >ð >ð >Ý¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøÝð >ð >ð >Ý�ŠÐ6°Ð6Ð6ÀˆÑFÔFÐFÝ¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøð>øøøó    ‚#& ¦
B°AÁBÁ=BÂBc                  óš   — e Zd ZU dZded<    edd¬¦  «        Zded<    ed	d
¬¦  «        Zded<    edd
d¬¦  «        Zded<   dZ	ded<   dS )ÚItemAllocationItemNr   Úinvoice_item_id.u   ID dá»± Ã¡n nháº­n phÃ¢n bá»•r   r   r   g        r   r>   ÚfloatÚallocated_quantityu/   Sá»‘ tiá»�n thanh toÃ¡n phÃ¢n bá»• cho dá»± Ã¡n)Úgtr   Úallocated_total_amount_vndÚnotes)
r   r   r   rb   r   r
   r   rd   rf   rg   r   r   r   ra   ra   �   sš   € € € € € € Ø"&€OÐ&Ð&Ð&Ñ&Ø�e˜CÐ-LÐMÑMÔM€JÐMÐMÐMÑMØ %  c¨aÐ 0Ñ 0Ô 0ÐÐ0Ð0Ð0Ñ0Ø(-¨¨c°aÐEvÐ(wÑ(wÔ(wÐÐwÐwÐwÑwØ€EÐÐÐÑÐÐr   ra   c                  ó4   — e Zd ZU  edd¬¦  «        Zded<   dS )ÚMultiAllocationRequest.r$   )Ú
min_lengthzlist[ItemAllocationItem]ÚallocationsN)r   r   r   r
   rk   r   r   r   r   ri   ri   —   s2   € € € € € € Ø,1¨E°#À!Ð,DÑ,DÔ,D€KÐDÐDÐDÑDÐDÐDr   ri   z/{invoice_id}/allocationsu9   Láº¥y Danh SÃ¡ch PhÃ¢n Bá»• Ä�a Dá»± Ã�n Cá»§a HÃ³a Ä�Æ¡nc                ó@  — 	 t          ¦   «         }|                     | ¬¦  «        S # t          $ r#}t          dt	          |¦  «        ¬¦  «        ‚d}~wt
          $ rB}t                               d|› �d¬¦  «         t          dt	          |¦  «        ¬¦  «        ‚d}~ww xY w)	uG   Truy váº¥n báº£ng phÃ¢n bá»• chi phÃ­ Ä‘a dá»± Ã¡n cho hÃ³a Ä‘Æ¡n nÃ y.r\   rH   r0   Nu*   Lá»—i truy váº¥n phÃ¢n bá»• Ä‘a dá»± Ã¡n: Tr.   r#   )r   Úget_invoice_allocationsrJ   r   r   r4   r5   r6   rK   s       r   Ú get_invoice_allocations_endpointrn   ›   s°   € ð>Ý(Ñ*Ô*ˆØ×.Ò.¸*Ð.ÑEÔEÐEøÝð >ð >ð >Ý¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøÝð >ð >ð >Ý�ŠÐGÀ#ÐGÐGÐRVˆÑWÔWÐWÝ¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøð>øøør_   u2   LÆ°u Báº£ng PhÃ¢n Bá»• Ä�a Dá»± Ã�n Cho HÃ³a Ä�Æ¡nc                ó¾  — 	 t          ¦   «         }|                     d¦  «        p|                     d¦  «        pd}d„ |j        D ¦   «         }|                     | ||¬¦  «        S # t          $ r#}t          dt          |¦  «        ¬¦  «        ‚d}~wt          $ rB}t           	                    d	|› �d
¬¦  «         t          dt          |¦  «        ¬¦  «        ‚d}~ww xY w)uY   PhÃ¢n bá»• hÃ³a Ä‘Æ¡n Ä‘áº§u vÃ o cho nhiá»�u dá»± Ã¡n / nhiá»�u cÃ´ng trÃ¬nh khÃ¡c nhau.rT   rU   rV   c                ó6   — g | ]}|                      ¦   «         ‘ŒS r   )Ú
model_dump)Ú.0Úas     r   ú
<listcomp>z5save_invoice_allocations_endpoint.<locals>.<listcomp>·   s    € Ð?Ð?Ð?¨!�q—|’|‘~”~Ð?Ð?Ð?r   )rF   rk   rW   i�  r0   Nu$   Lá»—i lÆ°u phÃ¢n bá»• Ä‘a dá»± Ã¡n: Tr.   r#   )
r   rX   rk   Úsave_invoice_multi_allocationsrJ   r   r   r4   r5   r6   )rF   rP   r*   r7   rW   Úalloc_dictsr8   s          r   Ú!save_invoice_allocations_endpointrw   «   s  € ð>Ý(Ñ*Ô*ˆØ ×$Ò$ [Ñ1Ô1Ðd°\×5EÒ5EÀgÑ5NÔ5NÐdÐRdˆ	Ø?Ð?¨s¬Ð?Ñ?Ô?ˆØ×5Ò5Ø!Ø#Øð 6ñ 
ô 
ð 	
øõ
 ð >ð >ð >Ý¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøÝð >ð >ð >Ý�ŠÐA¸CÐAÐAÈDˆÑQÔQÐQÝ¨µC¸±H´HÐ=Ñ=Ô=Ð=øøøøð>øøøs$   ‚A"A% Á%
CÁ/BÂCÂ=CÃC)r*   r+   r,   r+   )r?   r   r   r   r@   r   rA   r'   rB   r'   r*   r+   r,   r+   )rF   r   r*   r+   r,   r+   )rP   r    r*   r+   r,   r+   )rF   r   rP   r   r*   r+   r,   r+   )rF   r   rP   ri   r*   r+   r,   r+   )%Ú__doc__Ú
__future__r   ÚloggingÚtypingr   Úfastapir   r   r   r   Úpydanticr	   r
   Ú"app.modules.auth.presentation.authr   r   Ú:app.modules.invoices.application.aec_3way_matching_servicer   Ú	getLoggerr   r5   Úrouterr   r    rX   r9   rE   rI   ÚpostrR   rZ   r^   ra   ri   rn   rw   r   r   r   ú<module>rƒ      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ ]Ð ]Ð ]Ð ]Ð ]Ð ]à	ˆÔ	˜8Ñ	$Ô	$€à	ˆØ+Ø
:Ð	;ð
ñ 
ô 
€ðVð Vð Vð Vð V˜)ñ Vô Vð Vð
yð yð yð yð y˜Iñ yô yð yð
 ‡‚ˆJÐ c€ÑdÔdà#* 7Ð+;Ñ#<Ô#<ð	>ð 	>ð 	>ð 	>ñ eÔdð	>ð ‡‚ˆGÐV€ÑWÔWà�%˜Ð'BÐPlÐmÑmÔmØ"˜U 4Ð5MÐNÑNÔNØ˜˜tÐ1rÐsÑsÔsØ��r˜a CÐ(Ñ(Ô(Ø�%˜˜a�.‘.”.Ø#* 7Ð+;Ñ#<Ô#<ð>ð >ð >ð >ñ XÔWð>ð. ‡‚Ð(Ð2y€ÑzÔzð $+ 7Ð+;Ñ#<Ô#<ð>ð >ð >ð >ñ {Ôzð>ð ‡‚Ð Ð*t€ÑuÔuð $+ 7ØˆÐCÐCÐCÑDÔDñ$ô $ð>ð >ð >ð >ñ vÔuð>ð ‡‚Ð$Ð.h€ÑiÔið $+ 7ØˆÐCÐCÐCÑDÔDñ$ô $ð>ð >ð >ð >ñ jÔið>ð0 ‡‚Ð'Ð1h€ÑiÔið $+ 7Ð+;Ñ#<Ô#<ð>ð >ð >ð >ñ jÔið>ðð ð ð ð ˜ñ ô ð ðEð Eð Eð Eð E˜Yñ Eô Eð Eð ‡‚Ð'Ð1l€ÑmÔmð $+ 7Ð+;Ñ#<Ô#<ð>ð >ð >ð >ñ nÔmð>ð ‡‚Ð(Ð2f€ÑgÔgð $+ 7ØˆÐCÐCÐCÑDÔDñ$ô $ð>ð >ð >ð >ñ hÔgð>ð >ð >r   