§
    ÔŸ’j™$  ã                  óv   — d dl mZ 	 d dl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)ÚDecimal)ÚAnyc                  ó    — e Zd ZdZ	 	 ddd„ZdS )ÚInvoiceStorageSaveMixinz/Mixin for invoice insert and update operations.NTÚparsedúdict[str, Any]Úuser_idú
str | NoneÚauto_reconcileÚboolÚreturnc                ó"  ‡— |                       ¦   «         5 }|                     ¦   «         5 }|                     d|d         f¦  «         |                     ¦   «         }|rUdd|d         › d|d         › d|d         d	d
…         › d�t	          |d         ¦  «        dœcd	d	d	¦  «         cd	d	d	¦  «         S d	}d	}|�rP|                     d¦  «         |                     ¦   «         }	|d         › d|d         › d|                     dd¦  «        › d�Š|                     dg ¦  «        D ]}
‰|
d         › d�z  ŠŒ|	D ]Ò}|d                              ¦   «         }|d                              ¦   «         }|‰                     ¦   «         v s-t          ˆfd„| 	                    ¦   «         D ¦   «         ¦  «        rYt	          |d         ¦  «        }|                     d|f¦  «         |                     ¦   «         }|rt	          |d         ¦  «        } nŒÓ|rdnd}d}|                     |g |d         ‘|d         ‘|d         ‘|d         ‘|d         ‘|d          ‘|d!         ‘|d         ‘|                     d"d¦  «        ‘|d#         ‘|d         ‘|                     d$d¦  «        ‘|                     d%d&¦  «        ‘|                     d't          d(¦  «        ¦  «        ‘|d)         ‘|d*         ‘|d+         ‘|d,         ‘|                     d-d¦  «        ‘|                     d.d/¦  «        ‘|                     d0d¦  «        ‘|                     d1d¦  «        ‘|d         ‘|                     d2d3¦  «        ‘|                     d4d¦  «        ‘|                     d5¦  «        ‘|                     d6d7¦  «        ‘|‘|‘|‘|                     dd¦  «        ‘R ¦  «         t	          |                     ¦   «         d         ¦  «        }d8}|                     dg ¦  «        D �]}|                     d9¦  «        p=|                      |                     dd¦  «        |                     d:d¦  «        ¦  «        }|                     |||                     d;d<¦  «        |d         |                     d:d¦  «        |                     d=d>¦  «        |d?         |d@         |dA         |d*         |d+         |dB         |                     dCd¦  «        |                     dDd¦  «        |f¦  «         �Œ
dE}|                     d6d7¦  «        t	          |d,         ¦  «        |t          |                     dg ¦  «        ¦  «        dFœ}|                     ||dG|pdHt          j        |dI¬J¦  «        f¦  «         |                     ¦   «          dKdL|d         › dM|d         dNk    rdOndP› dQ�|||dRœcd	d	d	¦  «         cd	d	d	¦  «         S # 1 swxY w Y   	 d	d	d	¦  «         d	S # 1 swxY w Y   d	S )SuY   LÆ°u hÃ³a Ä‘Æ¡n vÃ  danh má»¥c hÃ ng hÃ³a vÃ o PostgreSQL trong má»™t Atomic Transaction.zVSELECT id, invoice_number, invoice_series FROM erp_invoices WHERE xml_hash_sha256 = %sÚxml_hash_sha256Ú	duplicateu   HÃ³a Ä‘Æ¡n sá»‘ Úinvoice_numberu    kÃ½ hiá»‡u Úinvoice_seriesu,    Ä‘Ã£ tá»“n táº¡i trong há»‡ thá»‘ng (Hash: Né   z...).Úid)ÚstatusÚmessageÚ
invoice_idz�SELECT id, project_code, project_name, contract_number FROM projects WHERE status != 'archived' ORDER BY created_at DESC LIMIT 20Ú
buyer_nameú Úseller_nameÚnotesÚ ÚitemsÚ	item_nameÚproject_codeÚproject_namec              3  ój   •K  — | ]-}t          |¦  «        d k    ¯|‰                     ¦   «         v V — Œ.dS )é   N)ÚlenÚupper)Ú.0ÚwÚsearch_corpuss     €úBC:\Projects\DSCons\app\services\invoice_processing\storage_save.pyú	<genexpr>z7InvoiceStorageSaveMixin.save_invoice.<locals>.<genexpr>8   sP   øè è € ð Bð Bà !Ý" 1™vœv¨šz˜zð  ×!4Ò!4Ñ!6Ô!6Ð6à)˜z˜z˜zðBð Bó    z<SELECT id FROM erp_project_wbs WHERE project_id = %s LIMIT 1Úmatched_projectÚunreconcileda)  
                    INSERT INTO erp_invoices (
                        direction, invoice_type, invoice_number, invoice_series, template_code,
                        issue_date, seller_tax_code, seller_name, seller_address,
                        buyer_tax_code, buyer_name, buyer_address, currency_code, exchange_rate,
                        subtotal_amount_vnd, vat_rate_percent, vat_amount_vnd, total_amount_vnd,
                        amount_in_words, status, tax_authority_code, xml_raw_content, xml_hash_sha256,
                        signature_valid, signed_by, signed_at, source_channel, reconciliation_status,
                        matched_project_id, matched_wbs_id, notes
                    ) VALUES (
                        %s, %s, %s, %s, %s,
                        %s, %s, %s, %s,
                        %s, %s, %s, %s, %s,
                        %s, %s, %s, %s,
                        %s, %s, %s, %s, %s,
                        %s, %s, %s, %s, %s,
                        %s, %s, %s
                    ) RETURNING id;
                Ú	directionÚinvoice_typeÚtemplate_codeÚ
issue_dateÚseller_tax_codeÚseller_addressÚbuyer_tax_codeÚbuyer_addressÚcurrency_codeÚVNDÚexchange_ratez1.0000Úsubtotal_amount_vndÚvat_rate_percentÚvat_amount_vndÚtotal_amount_vndÚamount_in_wordsr   ÚvalidÚtax_authority_codeÚxml_raw_contentÚsignature_validTÚ	signed_byÚ	signed_atÚsource_channelÚ
manual_xmla  
                    INSERT INTO erp_invoice_items (
                        invoice_id, item_order, item_name, item_code, unit, quantity,
                        unit_price_vnd, amount_before_vat_vnd, vat_rate_percent, vat_amount_vnd,
                        total_item_amount_vnd, matched_material_code, matched_wbs_code, cost_category
                    ) VALUES (
                        %s, %s, %s, %s, %s, %s,
                        %s, %s, %s, %s,
                        %s, %s, %s, %s
                    );
                Úcost_categoryÚ	item_codeÚ
item_orderé   Úunitu   LÃ´ÚquantityÚunit_price_vndÚamount_before_vat_vndÚtotal_item_amount_vndÚmatched_material_codeÚmatched_wbs_codezÅ
                    INSERT INTO erp_invoice_audit_logs (
                        invoice_id, action_type, performed_by, details_json
                    ) VALUES (%s, %s, %s, %s);
                )rD   r<   Úmatched_project_idÚitems_countÚ
IMPORT_XMLzSystem / AI ProcessorF)Úensure_asciiÚsuccessu(   Ä�Ã£ náº¡p thÃ nh cÃ´ng hÃ³a Ä‘Æ¡n sá»‘ z (Úoutputu	   Ä�áº§u Rau   Ä�áº§u VÃ oz).)r   r   r   rQ   Úreconciliation_status)Úget_connectionÚcursorÚexecuteÚfetchoneÚstrÚfetchallÚgetr%   ÚanyÚsplitr   Úcategorize_item_costr$   ÚjsonÚdumpsÚcommit)Úselfr   r
   r   ÚconnÚcurÚexistingÚmatched_proj_idÚmatched_wbs_idÚprojectsÚitmÚpÚp_codeÚp_nameÚwbs_rowrW   Úinsert_inv_sqlr   Úinsert_item_sqlÚitemÚcost_catÚinsert_audit_sqlÚdetailsr(   s                          @r)   Úsave_invoicez$InvoiceStorageSaveMixin.save_invoice   sð  ø€ ð × Ò Ñ"Ô"ð n	 dØ—’‘”ð m #à—’ØlØÐ-Ô.Ð0ñô ð ð Ÿ<š<™>œ>�Øð à"-ð $K°hÐ?OÔ6Pð  $Kð  $KÐ^fÐgwÔ^xð  $Kð  $Kð  gmð  nô  g@ð  ACð  BCð  ACô  gDð  $Kð  $Kð  $KÝ&)¨(°4¬.Ñ&9Ô&9ðð ðmð mð mð mñ mô mð mðn	ð n	ð n	ð n	ñ n	ô n	ð n	ð n	ð  /3�Ø-1�à!ñ "Ø—K’Kð \ñô ð ð  #Ÿ|š|™~œ~�Hà'-¨lÔ';Ð$pÐ$p¸fÀ]Ô>SÐ$pÐ$pÐV\×V`ÒV`ÐahÐjlÑVmÔVmÐ$pÐ$pÐ$p�MØ%Ÿzšz¨'°2Ñ6Ô6ð @ð @˜Ø%¨C°Ô,<Ð)?Ð)?Ð)?Ñ?˜˜à%ð "ð "˜Ø!" >Ô!2×!8Ò!8Ñ!:Ô!:˜Ø!" >Ô!2×!8Ò!8Ñ!:Ô!:˜Ø! ]×%8Ò%8Ñ%:Ô%:Ð:Ð:½cð Bð Bð Bð Bà%+§\¢\¡^¤^ðBñ Bô Bñ ?ô ?Ð:õ
 /2°!°D´'©l¬l˜OØŸKšKØ ^Ø!0Ð 2ñô ð ð '*§l¢l¡n¤n˜GØ&ð DÝ14°W¸T´]Ñ1CÔ1C Ø!˜Eð ;ð  *9ÐLÐ%Ð%¸nð &ð
"�ð& —’Ø"ð Ø˜{Ô+ð à˜~Ô.ð ð Ð/Ô0ð ð Ð/Ô0ð	 ð
 ˜Ô/ð ð ˜|Ô,ð ð Ð0Ô1ð ð ˜}Ô-ð ð Ÿ
š
Ð#3°RÑ8Ô8ð ð Ð/Ô0ð ð ˜|Ô,ð ð Ÿ
š
 ?°BÑ7Ô7ð ð Ÿ
š
 ?°EÑ:Ô:ð ð Ÿ
š
 ?µG¸HÑ4EÔ4EÑFÔFð ð Ð4Ô5ð ð  Ð1Ô2ð! ð" Ð/Ô0ð# ð$ Ð1Ô2ð% ð& Ÿ
š
Ð#4°bÑ9Ô9ð' ð( Ÿ
š
 8¨WÑ5Ô5ð) ð* Ÿ
š
Ð#7¸Ñ<Ô<ð+ ð, Ÿ
š
Ð#4°bÑ9Ô9ð- ð. Ð0Ô1ð/ ð0 Ÿ
š
Ð#4°dÑ;Ô;ð1 ð2 Ÿ
š
 ;°Ñ3Ô3ð3 ð4 Ÿ
š
 ;Ñ/Ô/ð5 ð6 Ÿ
š
Ð#3°\ÑBÔBð7 ð8 .ð9 ð: (ð; ð< 'ð= ð> Ÿ
š
 7¨BÑ/Ô/ð? ð  ñ#ô #ð #õH ! §¢¡¤°Ô!5Ñ6Ô6�
ð
#�ð #ŸJšJ w°Ñ3Ô3ð ñ �DØ#Ÿxšx¨Ñ8Ô8ð  ¸D×<UÒ<UØŸš ¨bÑ1Ô1°4·8²8¸KÈÑ3LÔ3Lñ=ô =�Hð —K’KØ'à&Ø ŸHšH \°1Ñ5Ô5Ø  Ô-Ø ŸHšH [°"Ñ5Ô5Ø ŸHšH V¨UÑ3Ô3Ø  Ô,Ø Ð!1Ô2Ø Ð!8Ô9Ø Ð!3Ô4Ø Ð!1Ô2Ø Ð!8Ô9Ø ŸHšHÐ%<¸bÑAÔAØ ŸHšHÐ%7¸Ñ<Ô<Ø$ðñô ð ñ ð*$Ð ð '-§j¢jÐ1AÀ<Ñ&PÔ&PÝ(+¨FÐ3EÔ,FÑ(GÔ(GØ*9Ý#& v§z¢z°'¸2Ñ'>Ô'>Ñ#?Ô#?ð	ð �ð —’Ø$à"Ø$ØÐ:Ð#:Ýœ
 7¸Ð?Ñ?Ô?ð	ñô ð ð —’‘”�à'ð  lÈ&ÐQaÔJbð   lð   lÐu{ð  }Hô  vIð  MUò  vUð  vUÐfqÐfqð  [hð   lð   lð   lØ",Ø*9Ø-Bðð ðOmð mð mð mñ mô mð mðn	ð n	ð n	ð n	ñ n	ô n	ð n	ð n	ðmð mð mð møøøð mð mð mð mð mðn	ð n	ð n	ñ n	ô n	ð n	ð n	ð n	ð n	ð n	ð n	ð n	øøøð n	ð n	ð n	ð n	ð n	ð n	sB   –X«A0W+ÂXÂ4TW+×X×+W/	×/X×2W/	×3XØXØX)NT)r   r	   r
   r   r   r   r   r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rw   © r+   r)   r   r      sB   € € € € € Ø9Ð9ð
 #Ø#ð	uð uð uð uð uð uð ur+   r   )Ú
__future__r   rb   ÚloggingÚdecimalr   Útypingr   Ú	getLoggerrx   Úloggerr   r|   r+   r)   ú<module>rƒ      s    ðØ "Ð "Ð "Ð "Ð "Ð "à Eð €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ðxð xð xð xð xñ xô xð xð xð xr+   