§
    g°–jü  ã                  ól   — d dl mZ d dlZd dlmZ d dlmZ  ej        e¦  «        Z G d„ d¦  «        Z	dS )é    )ÚannotationsN)Údatetime)ÚAnyc                  ó   — e Zd ZdZdd„ZdS )	ÚInvoice3WayMatchingMixinzKMixin for 3-way matching (Invoice vs Purchase Order vs Goods Receipt Note).Ú
invoice_idÚstrÚreturnúdict[str, Any]c                ó”  — |                       |¦  «        }|sdddœS |                     d¦  «        }|                     d¦  «        }d}g }	 |                      ¦   «         5 }|                     ¦   «         5 }|                     |||f¦  «         |                     ¦   «         }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   n4# t          $ r'}	t                               d|	› �¦  «         Y d}	~	nd}	~	ww xY wd	}
g }	 |                      ¦   «         5 }|                     ¦   «         5 }|                     |
||f¦  «         |                     ¦   «         }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   n4# t          $ r'}	t                               d
|	› �¦  «         Y d}	~	nd}	~	ww xY wg }d}t          |                     d¦  «        pd¦  «        }|s| 
                    ddddœ¦  «         |dz  }nit          d„ |D ¦   «         ¦  «        }t          ||z
  ¦  «        }|dk    r| 
                    ddddœ¦  «         |dz  }n| 
                    ddddœ¦  «         |s| 
                    ddddœ¦  «         |dz  }nit          d„ |D ¦   «         ¦  «        }t          ||z
  ¦  «        }|dk    r| 
                    d dd!dœ¦  «         |dz  }n| 
                    d"dd#dœ¦  «         d$}|dk    r—d%}	 |                      ¦   «         5 }|                     ¦   «         5 }|                     d&|f¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY w|||||t          j        ¦   «                              ¦   «         d'œS )(uk   Thá»±c hiá»‡n Ä‘á»‘i soÃ¡t 3-way cho hÃ³a Ä‘Æ¡n vá»›i Ä�Æ¡n Ä‘áº·t hÃ ng (PO) vÃ  Phiáº¿u nháº­p kho (GRN).Úerroru.   KhÃ´ng tÃ¬m tháº¥y hÃ³a Ä‘Æ¡n cáº§n rÃ  soÃ¡t.)ÚstatusÚmessageÚinvoice_numberÚseller_tax_codezÃ
            SELECT po_number, total_amount_vnd, status 
            FROM erp_purchase_orders 
            WHERE vendor_tax_code = %s AND (invoice_reference = %s OR status = 'fulfilled')
        Nu   KhÃ´ng thá»ƒ truy váº¥n PO: z¸
            SELECT grn_number, receipt_date, total_received_value 
            FROM erp_goods_receipt_notes 
            WHERE vendor_tax_code = %s AND invoice_reference = %s
        u   KhÃ´ng thá»ƒ truy váº¥n GRN: r   Útotal_amount_vndç        Ú
PO_MISSINGÚmediumui   KhÃ´ng tÃ¬m tháº¥y Ä�Æ¡n Ä‘áº·t hÃ ng (PO) nÃ o khá»›p vá»›i nhÃ  cung cáº¥p hoáº·c sá»‘ hÃ³a Ä‘Æ¡n nÃ y.)ÚtypeÚseverityr   é   c              3  ó^   K  — | ](}t          |                     d ¦  «        pd¦  «        V — Œ)dS )r   r   N©ÚfloatÚget)Ú.0Úpos     úaC:\Projects\DSCons\app\modules\invoices\application\invoice_processing\analytics_3way_matching.pyú	<genexpr>z?Invoice3WayMatchingMixin.audit_3way_matching.<locals>.<genexpr>?   s<   è è € ÐRÐRÈ�5 §¢Ð(:Ñ!;Ô!;Ð!B¸sÑCÔCÐRÐRÐRÐRÐRÐRó    iè  ÚPO_AMOUNT_MISMATCHÚhighu0   GiÃ¡ trá»‹ hÃ³a Ä‘Æ¡n lá»‡ch so vá»›i tá»•ng PO.é   Ú
PO_MATCHEDÚsafeu6   GiÃ¡ trá»‹ hÃ³a Ä‘Æ¡n khá»›p vá»›i Ä�Æ¡n Ä‘áº·t hÃ ng.ÚGRN_MISSINGuC   ChÆ°a cÃ³ Phiáº¿u nháº­p kho (GRN) thá»±c táº¿ cho hÃ³a Ä‘Æ¡n nÃ y.é(   c              3  ó^   K  — | ](}t          |                     d ¦  «        pd¦  «        V — Œ)dS )Útotal_received_valuer   Nr   )r   Úgs     r   r    z?Invoice3WayMatchingMixin.audit_3way_matching.<locals>.<genexpr>X   s<   è è € ÐVÐVÈA�E !§%¢%Ð(>Ñ"?Ô"?Ð"FÀ3ÑGÔGÐVÐVÐVÐVÐVÐVr!   ÚGRN_AMOUNT_MISMATCHu9   GiÃ¡ trá»‹ hÃ³a Ä‘Æ¡n lá»‡ch so vá»›i Phiáº¿u nháº­p kho.ÚGRN_MATCHEDu6   GiÃ¡ trá»‹ hÃ³a Ä‘Æ¡n khá»›p vá»›i Phiáº¿u nháº­p kho.ÚDRAFTÚ3WAY_MATCHEDz9UPDATE erp_invoices SET status = 'approved' WHERE id = %s)r   r   Ú3way_statusÚmatch_flagsÚ
risk_scoreÚaudit_timestamp)Úget_invoice_detailr   Úget_connectionÚcursorÚexecuteÚfetchallÚ	ExceptionÚloggerÚwarningr   ÚappendÚsumÚabsÚcommitr   ÚnowÚ	isoformat)Úselfr   Úinvr   r   ÚsqlÚposÚconnÚcurÚeÚsql_grnÚgrnsr1   r2   Útotal_inv_amountÚpo_totalÚdiffÚ	grn_totalr   s                      r   Úaudit_3way_matchingz,Invoice3WayMatchingMixin.audit_3way_matching   s/  € à×%Ò% jÑ1Ô1ˆØð 	dØ%Ð2bÐcÐcÐcàŸšÐ!1Ñ2Ô2ˆØŸ'š'Ð"3Ñ4Ô4ˆðˆð
 ˆð	?Ø×$Ò$Ñ&Ô&ð %¨$°·²±´ð %ÀØ—’˜C /°>Ð!BÑCÔCÐCØ—l’l‘n”n�ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð %ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %øøõ ð 	?ð 	?ð 	?Ý�NŠNÐ=¸!Ð=Ð=Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>øøøøð	?øøøðˆð
 ˆð	@Ø×$Ò$Ñ&Ô&ð &¨$°·²±´ð &ÀØ—’˜G o°~Ð%FÑGÔGÐGØ—|’|‘~”~�ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð &ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &øøõ ð 	@ð 	@ð 	@Ý�NŠNÐ>¸1Ð>Ð>Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð	@øøøð ˆØˆ
Ý  §¢Ð);Ñ!<Ô!<Ð!CÀÑDÔDÐð ð 	Ø×ÒØ$Ø$ð Gð ð  ñ ô ð ð
 ˜"ÑˆJˆJåÐRÐRÈcÐRÑRÔRÑRÔRˆHÝÐ'¨(Ñ2Ñ3Ô3ˆDØ�dŠ{ˆ{Ø×"Ò"Ø0Ø &ØRð$ð $ñ ô ð ð
 ˜bÑ �
�
à×"Ò"Ø(Ø &ØXð$ð $ñ ô ð ð ð 	Ø×ÒØ%Ø"Ø`ð ð  ñ ô ð ð
 ˜"ÑˆJˆJåÐVÐVÐQUÐVÑVÔVÑVÔVˆIÝÐ'¨)Ñ3Ñ4Ô4ˆDØ�dŠ{ˆ{Ø×"Ò"Ø1Ø &Ø[ð$ð $ñ ô ð ð
 ˜bÑ �
�
à×"Ò"Ø)Ø &ØXð$ð $ñ ô ð ð ˆØ˜Š?ˆ?Ø#ˆFðØ×(Ò(Ñ*Ô*ð "¨d°D·K²K±M´Mð "ÀSØ—K’KÐ [Ð^hÐ]jÑkÔkÐkØ—K’K‘M”M�Mð"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð "ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "øøõ ð ð ð Ø�ðøøøð %Ø,Ø!Ø&Ø$Ý'œ|™~œ~×7Ò7Ñ9Ô9ð
ð 
ð 	
s  ÁC Á CÁ5-B.Â"CÂ.B2	Â2CÂ5B2	Â6CÂ9C ÃC	Ã	C ÃC	ÃC Ã
DÃC=Ã=DÄ
F ÄFÄ3-E,Å FÅ,E0	Å0FÅ3E0	Å4FÅ7F ÆFÆF Æ
FÆF Æ
G ÆF;Æ;G Ì
N ÌNÌ3,M+ÍNÍ+M/	Í/NÍ2M/	Í3NÍ6N ÎNÎN Î	NÎ
N Î
NÎNN)r   r	   r
   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rO   © r!   r   r   r   
   s4   € € € € € ØUÐUðl
ð l
ð l
ð l
ð l
ð l
r!   r   )
Ú
__future__r   Úloggingr   Útypingr   Ú	getLoggerrP   r:   r   rT   r!   r   ú<module>rY      s’   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ðo
ð o
ð o
ð o
ð o
ñ o
ô o
ð o
ð o
ð o
r!   