§
    ÔŸ’j¢!  ã                  ót   — d 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mZmZ  G d„ d¦  «        Zd	S )
zADomain Service for Automated 3-Way Matching (PO - GRN - Invoice).é    )Úannotations)Údate)ÚDecimal)ÚAny)ÚGoodsReceiptSummaryÚInvoiceMatchSummaryÚMatchingDashboardResponseÚMatchStatusEnumÚPurchaseOrderSummaryÚThreeWayMatchResultc                  ó0   — e Zd ZdZddd„Zdd„Z	 ddd„ZdS )ÚThreeWayMatchingServicezYPerforms 3-Way Reconciliation between Purchase Orders, Site Goods Receipts, and Invoices.NÚpostgres_clientú
Any | NoneÚreturnÚNonec                ó   — || _         d S ©N)r   )Úselfr   s     ú3C:\Projects\DSCons\app\services\matching_service.pyÚ__init__z ThreeWayMatchingService.__init__   s   € Ø.ˆÔÐÐó    ÚpoúPurchaseOrderSummary | NoneÚgrnúGoodsReceiptSummary | NoneÚinvoicer   r   c                ó¨  — |j         }|j        }|j        }|r|j        n
|r|j        nd}|s+t	          d|j        › d�t          j        |||||dd¬¦	  «	        S |s,t	          d|j        › d�t          j        ||||||dd¬	¦
  «
        S |j	        |j
        z
  }|j        |j        z
  }	|j
        |j        z  }
|j        |
z
  }t          |¦  «        t          d
¦  «        k     r1t          |	¦  «        t          d
¦  «        k     rt          j        }d}d}n¢t          |	¦  «        t          d
¦  «        k    r$t          j        }d|j        d›d|j        d›d�}d}n^|t          d¦  «        k    r*t          j        }d|j	        › d|j        › d|j
        › d�}d}n!t          j        }d|j	        › d|j        › d�}d}t	          d|j        › �||||||||||	|||¬¦  «        S )NÚCHUA_XAC_DINHzMATCH-z-NOPOuU   HÃ³a Ä‘Æ¡n xuáº¥t khÃ´ng cÃ³ Ä�Æ¡n Ä‘áº·t hÃ ng (PO) tÆ°Æ¡ng á»©ng Ä‘Ã£ phÃª duyá»‡t.ÚHOLD_FOR_REVIEW)	Úmatch_idÚmatch_statusÚseller_tax_idÚseller_nameÚproject_codeÚ	item_nameÚinvoice_refÚdiscrepancy_explanationÚrecommended_actionz-NOGRNuf   ChÆ°a cÃ³ Phiáº¿u nháº­p kho hoáº·c VÃ© cÃ¢n táº¡i cÃ´ng trÆ°á»�ng chá»©ng minh Ä‘Ã£ nháº­n váº­t tÆ°.)
r!   r"   r#   r$   r%   r&   Úpo_refr'   r(   r)   z0.0010uf   Khá»›p ná»‘i hoÃ n háº£o 100% giá»¯a Ä�Æ¡n Ä‘áº·t hÃ ng, VÃ© cÃ¢n hiá»‡n trÆ°á»�ng vÃ  HÃ³a Ä‘Æ¡n VAT.ÚAUTO_APPROVEu#   Lá»‡ch Ä‘Æ¡n giÃ¡: Ä�Æ¡n giÃ¡ PO = z,.0fu    Ä‘, Ä�Æ¡n giÃ¡ HÄ� = u    Ä‘ú0.0000u   Khá»‘i lÆ°á»£ng trÃªn HÄ� (ú u)   ) vÆ°á»£t khá»‘i lÆ°á»£ng thá»±c nháº­n (ú)ÚREJECT_INVOICEu2   HÃ³a Ä‘Æ¡n xuáº¥t cho Ä‘á»£t nháº­n má»™t pháº§n (z / )r!   r"   r#   r$   r%   r&   r*   Úgrn_refr'   Úqty_varianceÚprice_varianceÚamount_variancer(   r)   )r#   r$   r&   r%   r   Úinvoice_numberr
   Ú
MISSING_POÚMISSING_GRNÚbilled_quantityÚreceived_quantityÚ
unit_priceÚtotal_pre_taxÚabsr   ÚPERFECT_MATCHÚPRICE_MISMATCHÚQUANTITY_MISMATCHÚPARTIAL_RECEIPTÚordered_quantity)r   r   r   r   r#   r$   r&   r%   Úqty_varÚ	price_varÚexpected_amtÚamt_varÚstatusÚexplanationÚactions                  r   Úmatch_documentsz'ThreeWayMatchingService.match_documents   s¼  € ð  Ô-ˆØÔ)ˆØÔ%ˆ	à!ÐUˆBŒOˆO¸CÐ(T¨Ô(8Ð(8À_ð 	ð ð 	Ý&Ø? 'Ô"8Ð?Ð?Ð?Ý,Ô7Ø+Ø'Ø)Ø#Ø#Ø(Ø#4ð
ñ 
ô 
ð 
ð ð 	Ý&Ø@ 'Ô"8Ð@Ð@Ð@Ý,Ô8Ø+Ø'Ø)Ø#ØØ#ð )QØ#4ðñ ô ð ð Ô)¨CÔ,AÑAˆØÔ&¨¬Ñ6ˆ	ØÔ,¨r¬}Ñ<ˆØÔ'¨,Ñ6ˆåˆw‰<Œ<�' (Ñ+Ô+Ò+Ð+µ°I±´ÅÈÑARÔARÒ0RÐ0RÝ$Ô2ˆFð CˆKØ#ˆFˆFÝ�‰^Œ^�g hÑ/Ô/Ò/Ð/Ý$Ô3ˆFð GÀÄð  Gð  Gð  GÐjqÔj|ð  Gð  Gð  Gð  GˆKØ&ˆFˆFØ•w˜xÑ(Ô(Ò(Ð(Ý$Ô6ˆFð g¸Ô8Oð  gð  gÐRYÔRcð  gð  gð  ORô  Odð  gð  gð  gˆKØ%ˆFˆFå$Ô4ˆFð BÈwÔOfð  Bð  BÐkmÔk~ð  Bð  Bð  BˆKØ#ˆFå"Ø6˜gÔ4Ð6Ð6ØØ'Ø#Ø%ØØØØØ Ø$Ø#Ø$/Ø%ð
ñ 
ô 
ð 	
r   Ú
as_of_dateúdate | Noner	   c                ó¬  — |pt          j        ¦   «         }|                      t          dddddt	          d¦  «        t	          d¦  «        t	          d¦  «        d	¬
¦	  «	        t          dddddt	          d¦  «        t          ddd¦  «        dd	¬¦	  «	        t          dt          ddd¦  «        dddt	          d¦  «        t	          d¦  «        t	          d¦  «        t	          d¦  «        ¬¦	  «	        ¬¦  «        }|                      t          dddddt	          d¦  «        t	          d¦  «        t	          d¦  «        d¬
¦	  «	        t          d d dddt	          d¦  «        t          ddd!¦  «        d"d¬¦	  «	        t          d#t          ddd¦  «        dddt	          d¦  «        t	          d$¦  «        t	          d%¦  «        t	          d&¦  «        ¬¦	  «	        ¬¦  «        }||g}t          d'„ |D ¦   «         ¦  «        }t          d(„ |D ¦   «         ¦  «        }t          d)„ |D ¦   «         t	          d*¦  «        ¦  «        }t          |t          |¦  «        |||||¬+¦  «        S ),NzPO-2026-KM-01Ú
0201805660u   Cty CP XD TM & DV Trung KiÃªnzDA-KM-BENKEM-2025-2026u   CÃ¡t vÃ ng Ä‘á»• bÃª tÃ´ngz150.0000z320000.0000z48000000.0000u   mÂ³)	Úpo_codeÚsupplier_tax_idÚsupplier_namer%   r&   r@   r9   Útotal_amountÚunitzGRN-2026-KM-014z
TC-KM-9821iê  é   é   u   Ká»¹ sÆ° Pháº¡m VÄƒn TÃ¹ng)	Úgrn_codeÚweighbridge_ticket_numberrN   r%   r&   r8   Úreceived_dateÚreceiver_namerQ   Ú0012458é   z3840000.0000)	r4   Úinvoice_dater#   r$   r&   r7   r9   r:   Ú
tax_amount)r   r   r   zPO-2026-DADO-05Ú
0201889988u%   Cty TNHH Váº­n Táº£i & TM Loan Kháº£izDA-DADO-THUYLDT-2022-2026u   Ca mÃ¡y Ä‘Ã o bÃ¡nh xÃ­ch 0.8m3z20.0000z4500000.0000z90000000.0000ÚCazGRN-2026-DADO-088é   u   Ká»¹ sÆ° Nguyá»…n VÄƒn NamÚ0008742z4800000.0000z96000000.0000z7680000.0000c              3  óD   K  — | ]}|j         t          j        k    ¯d V — ŒdS ©é   N©r"   r
   r<   ©Ú.0Úms     r   ú	<genexpr>z@ThreeWayMatchingService.get_dashboard_summary.<locals>.<genexpr>¸   s:   è è € ð 
ð 
Ø !¤.µOÔ4QÒ"QÐ"QˆAÐ"QÐ"QÐ"QÐ"Qð
ð 
r   c              3  óD   K  — | ]}|j         t          j        k    ¯d V — ŒdS ra   rc   rd   s     r   rg   z@ThreeWayMatchingService.get_dashboard_summary.<locals>.<genexpr>»   s:   è è € ð 
ð 
Ø !¤.µOÔ4QÒ"QÐ"QˆAÐ"QÐ"QÐ"QÐ"Qð
ð 
r   c              3  ó>   K  — | ]}t          |j        ¦  «        V — Œd S r   )r;   r3   rd   s     r   rg   z@ThreeWayMatchingService.get_dashboard_summary.<locals>.<genexpr>¿   s-   è è € Ð5Ð5¨�S�Ô"Ñ#Ô#Ð5Ð5Ð5Ð5Ð5Ð5r   r,   )rI   Útotal_invoices_checkedÚperfect_matches_countÚmismatches_countÚpending_approval_countÚtotal_discrepancy_amountÚmatches)
r   ÚtodayrH   r   r   r   r   Úsumr	   Úlen)	r   rI   Útarget_dateÚm1Úm2ro   Úperfect_matchesÚ
mismatchesÚtotal_discrepancys	            r   Úget_dashboard_summaryz-ThreeWayMatchingService.get_dashboard_summaryh   sØ  € ð !Ð0¥D¤J¡L¤Lˆð ×!Ò!Ý#Ø'Ø ,Ø=Ø5Ø6Ý!(¨Ñ!4Ô!4Ý" =Ñ1Ô1Ý$ _Ñ5Ô5Øð
ñ 
ô 
õ $Ø*Ø*6Ø ,Ø5Ø6Ý")¨*Ñ"5Ô"5Ý" 4¨¨BÑ/Ô/Ø:Øð
ñ 
ô 
õ (Ø(Ý! $¨¨2Ñ.Ô.Ø*Ø;Ø6Ý '¨
Ñ 3Ô 3Ý" =Ñ1Ô1Ý% oÑ6Ô6Ý" >Ñ2Ô2ð
ñ 
ô 
ð/ "ñ "
ô "
ˆðJ ×!Ò!Ý#Ø)Ø ,ØEØ8Ø;Ý!(¨Ñ!3Ô!3Ý" >Ñ2Ô2Ý$ _Ñ5Ô5Øð
ñ 
ô 
õ $Ø,Ø*.Ø ,Ø8Ø;Ý")¨)Ñ"4Ô"4Ý" 4¨¨BÑ/Ô/Ø:Øð
ñ 
ô 
õ (Ø(Ý! $¨¨2Ñ.Ô.Ø*ØCØ;Ý '¨	Ñ 2Ô 2Ý" >Ñ2Ô2Ý% oÑ6Ô6Ý" >Ñ2Ô2ð
ñ 
ô 
ð/ "ñ "
ô "
ˆðH �r�(ˆÝð 
ð 
Øð
ñ 
ô 
ñ 
ô 
ˆõ ð 
ð 
Øð
ñ 
ô 
ñ 
ô 
ˆ
õ  Ø5Ð5¨WÐ5Ñ5Ô5µw¸xÑ7HÔ7Hñ
ô 
Ðõ )Ø"Ý#& w¡<¤<Ø"1Ø'Ø#-Ø%6Øð
ñ 
ô 
ð 	
r   r   )r   r   r   r   )r   r   r   r   r   r   r   r   )rI   rJ   r   r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rH   ry   © r   r   r   r      sq   € € € € € ØcÐcð/ð /ð /ð /ð /ðM
ð M
ð M
ð M
ð` )-ðb
ð b
ð b
ð b
ð b
ð b
ð b
r   r   N)r}   Ú
__future__r   Údatetimer   Údecimalr   Útypingr   Úapp.models.matching_schemasr   r   r	   r
   r   r   r   r~   r   r   ú<module>r„      sß   ðØ GÐ Gà "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðw
ð w
ð w
ð w
ð w
ñ w
ô w
ð w
ð w
ð w
r   