§
    ÔŸ’j†(  ã                  ó–   — d dl mZ 	 d dlZd dlZd dlZd dlmZmZ d dlm	Z	 ddl
mZmZmZ  ej        e¦  «        Z G d„ d¦  «        ZdS )	é    )ÚannotationsN)ÚROUND_HALF_UPÚDecimal)ÚAnyé   )ÚDSCONS_DEFAULT_COMPANY_NAMEÚDSCONS_DEFAULT_TAX_CODEÚ
to_decimalc                  ó0   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddd„ZdS )ÚInvoiceFidicIpcMixinz9Mixin for generating FIDIC IPC compliant output invoices.ç      $@ç      @ç       @NÚ
SuperAdminÚ
project_idÚstrÚ	wbs_itemsúlist[dict[str, Any]]Úadvance_deduction_pctÚfloatÚretention_pctÚvat_rate_pctÚbuyer_tax_codeú
str | NoneÚ
buyer_nameÚbuyer_addressÚinvoice_numberÚinvoice_seriesÚ	user_nameÚnotesÚreturnúdict[str, Any]c                óz  — |                       ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     ¦   «         }|sdddœcddd¦  «         cddd¦  «         S |p
d|d         › �}|pd}|pd	}t	          d
¦  «        }g }t          |d¦  «        D ]ú\  }}|                     d¦  «        pd|› �}t          |                     dd¦  «        ¦  «        }t          |                     dd¦  «        ¦  «        }||z                       t	          d¦  «        t          ¬¦  «        }||z  }| 
                    |||                     dd|› �¦  «        |                     dd¦  «        |||t	          t          |¦  «        ¦  «        ddœ	¦  «         Œû|t	          d
¦  «        k    rdddœcddd¦  «         cddd¦  «         S t	          t          |¦  «        ¦  «        }t	          t          |¦  «        ¦  «        }t	          t          |¦  «        ¦  «        }||t	          d¦  «        z  z                       t	          d¦  «        t          ¬¦  «        }||t	          d¦  «        z  z                       t	          d¦  «        t          ¬¦  «        }||z
  |z
  } | |t	          d¦  «        z  z                       t	          d¦  «        t          ¬¦  «        }!| |!z   }"t          |¦  «        t          |¦  «        t          |¦  «        t          |¦  «        t          |¦  «        t          | ¦  «        t          |¦  «        t          |!¦  «        t          |"¦  «        dœ	}#|                     d¦  «         |                     ¦   «         d         dz   }$|	p!t          |$¦  «                             d¦  «        }%|
pd }&d!|› d"|&› d"|%› d"|"› �}'t          j        |'                     d#¦  «        ¦  «                             ¦   «         }(d$})|                     |)|%|&t$          t&          |||| ||!|"t&          ||p
d%|d         › �t)          j        |#d&¬'¦  «        |(f¦  «         t          |                     ¦   «         d(         ¦  «        }*d)}+|D ]¡}|d*         |t	          d¦  «        z  z                       t	          d¦  «        t          ¬¦  «        },|d*         |,z   }-|                     |+|*|d+         |d         |d         |d         |d         |d         |d*         ||,|-|d,         f¦  «         Œ¢|                     d-|*|t)          j        |#d&¬'¦  «        f¦  «         |                     ¦   «          d.d/|%› d0|&› d1�|*|#d2œ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 )3u„   Láº­p hÃ³a Ä‘Æ¡n bÃ¡n ra / Giáº¥y Ä‘á»� nghá»‹ thanh toÃ¡n Ä‘á»£t IPC theo chuáº©n FIDIC cÃ³ kháº¥u trá»« táº¡m á»©ng & báº£o hÃ nh.zRSELECT id, project_code, project_name, contract_number FROM projects WHERE id = %sÚerroru*   KhÃ´ng tÃ¬m tháº¥y dá»± Ã¡n tÆ°Æ¡ng á»©ng.)ÚstatusÚmessageNu   Chá»§ Ä�áº§u TÆ° - Úproject_nameÚ
0100100100u    Trá»¥ sá»Ÿ Ban QLDA CÃ´ng trÃ¬nhz0.0000r   Ú	item_nameu   Nghiá»‡m thu háº¡ng má»¥c WBS #Úquantityg      ð?Úunit_price_vndg        z0.0001)ÚroundingÚ	item_codezIPC-WBS-Úunitu   Ä�á»£tÚsubcontractor)	Ú
item_orderr)   r-   r.   r*   r+   Úamount_before_vat_vndÚvat_rate_percentÚcost_categoryu;   Tá»•ng giÃ¡ trá»‹ nghiá»‡m thu pháº£i lá»›n hÆ¡n 0 Ä‘á»“ng.z100.0)	Úgross_milestone_amount_vndÚadvance_deduction_percentÚadvance_deduction_amount_vndÚretention_percentÚretention_amount_vndÚnet_subtotal_vndr2   Úvat_amount_vndÚtotal_payable_vndzASELECT COUNT(*) AS c FROM erp_invoices WHERE direction = 'output'Úcé   Ú1C26TDSÚDSCons_IPC_Ú_zutf-8u	  
                    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,
                        subtotal_amount_vnd, vat_rate_percent, vat_amount_vnd, total_amount_vnd,
                        status, signature_valid, signed_by, signed_at, source_channel, reconciliation_status,
                        matched_project_id, notes, ipc_deductions_json, xml_hash_sha256
                    ) VALUES (
                        'output', 'vat', %s, %s, '1',
                        CURRENT_DATE, %s, %s, 'ThÃ´n TÃº Ä�Ã´i 3, xÃ£ Nghi DÆ°Æ¡ng, TP Háº£i PhÃ²ng',
                        %s, %s, %s,
                        %s, %s, %s, %s,
                        'valid', TRUE, %s, CURRENT_TIMESTAMP, 'manual_xml', 'matched_ipc',
                        %s, %s, %s, %s
                    ) RETURNING id;
                u8   HÃ³a Ä‘Æ¡n nghiá»‡m thu thanh toÃ¡n Ä‘á»£t IPC dá»± Ã¡n F)Úensure_asciiÚidaˆ  
                    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, cost_category
                    ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);
                r1   r0   r3   zÄ
                    INSERT INTO erp_invoice_audit_logs (invoice_id, action_type, performed_by, details_json)
                    VALUES (%s, 'CREATE_IPC_OUTPUT_INVOICE', %s, %s);
                ÚsuccessuE   Ä�Ã£ láº­p thÃ nh cÃ´ng HÃ³a Ä‘Æ¡n Ä‘á»� nghá»‹ thanh toÃ¡n IPC sá»‘ u    (KÃ½ hiá»‡u z).)r%   r&   Ú
invoice_idÚipc_deductions)Úget_connectionÚcursorÚexecuteÚfetchoner   Ú	enumerateÚgetr
   Úquantizer   Úappendr   r   ÚzfillÚhashlibÚsha256ÚencodeÚ	hexdigestr	   r   ÚjsonÚdumpsÚcommit).Úselfr   r   r   r   r   r   r   r   r   r   r   r    ÚconnÚcurÚprojÚfinal_buyer_nameÚfinal_buyer_mstÚfinal_buyer_addrÚgross_amount_vndÚparsed_itemsÚidxÚitmr)   ÚqtyÚpriceÚline_amtÚadv_rate_decÚret_rate_decÚvat_rate_decÚadvance_deduct_vndÚretention_deduct_vndr9   r:   Útotal_amount_vndrE   Ú	out_countÚfinal_inv_numÚfinal_inv_seriesÚxml_hash_seedÚxml_hashÚ
insert_sqlÚ
new_inv_idÚitem_insert_sqlÚline_vatÚline_tots.                                                 úIC:\Projects\DSCons\app\services\invoice_processing\fidic_ipc_generator.pyÚcreate_fidic_ipc_output_invoicez4InvoiceFidicIpcMixin.create_fidic_ipc_output_invoice   sÞ  € ð  × Ò Ñ"Ô"ð z	 dØ—’‘”ð y #à—’ØhØ�Mñô ð ð —|’|‘~”~�Øð à")Ø#Oðð ðyð yð yð yñ yô yð yðz	ð z	ð z	ð z	ñ z	ô z	ð z	ð z	ð $.Ð#]Ð1]ÀtÈNÔG[Ð1]Ð1]Ð Ø"0Ð"@°L�Ø#0Ð#VÐ4VÐ õ $+¨8Ñ#4Ô#4Ð Ø!�Ý )¨)°QÑ 7Ô 7ð ð ‘H�C˜àŸš Ñ,Ô,ÐWÐ0WÐRUÐ0WÐ0Wð õ % S§W¢W¨Z¸Ñ%=Ô%=Ñ>Ô>�CÝ& s§w¢wÐ/?ÀÑ'EÔ'EÑFÔF�EØ # e¡×5Ò5Ý Ñ)Ô)µMð  6ñ  ô  �Hð %¨Ñ0Ð$Ø ×'Ò'à*-Ø)2Ø),¯ª°Ð>NÈÐ>NÐ>NÑ)OÔ)OØ$'§G¢G¨F°HÑ$=Ô$=Ø(+Ø.3Ø5=Ý07½¸LÑ8IÔ8IÑ0JÔ0JØ-<ð
ð 
ñô ð ð ð $¥w¨xÑ'8Ô'8Ò8Ð8à")Ø#`ðð ð[yð yð yð yñ yô yð yðz	ð z	ð z	ð z	ñ z	ô z	ð z	ð z	õh  '¥sÐ+@Ñ'AÔ'AÑBÔB�Ý&¥s¨=Ñ'9Ô'9Ñ:Ô:�Ý&¥s¨<Ñ'8Ô'8Ñ9Ô9�ð %¨µw¸wÑ7GÔ7GÑ(GÑHß’(�7 8Ñ,Ô,µ}�(ÑEÔEð #ð %¨µw¸wÑ7GÔ7GÑ(GÑHß’(�7 8Ñ,Ô,µ}�(ÑEÔEð %ð %Ð'9Ñ9Ð<PÑPð !ð
 %¨µw¸wÑ7GÔ7GÑ(GÑHß’(�7 8Ñ,Ô,µ}�(ÑEÔEð ð $4°nÑ#DÐ õ 38Ð8HÑ2IÔ2IÝ16°|Ñ1DÔ1DÝ49Ð:LÑ4MÔ4MÝ).¨|Ñ)<Ô)<Ý,1Ð2FÑ,GÔ,GÝ(-Ð.>Ñ(?Ô(?Ý(-¨lÑ(;Ô(;Ý&+¨NÑ&;Ô&;Ý).Ð/?Ñ)@Ô)@ð
"ð 
"�ð —’ØWñô ð ð  ŸLšL™NœN¨3Ô/°!Ñ3�	Ø .Ð Iµ#°i±.´.×2FÒ2FÀqÑ2IÔ2I�Ø#1Ð#>°YÐ à p¨jÐ pÐ pÐ;KÐ pÐ pÈmÐ pÐ pÐ^nÐ pÐ p�Ý"œ>¨-×*>Ò*>¸wÑ*GÔ*GÑHÔH×RÒRÑTÔT�ð�
ð" —’Øà%Ø(Ý/Ý3Ø'Ø(Ø(Ø(Ø$Ø&Ø(Ý3Ø"Øð mØlÐVZÐ[iÔVjÐlÐlÝœ
 >ÀÐFÑFÔFØ ð#ñô ð õ, ! §¢¡¤°Ô!5Ñ6Ô6�
ð#�ð (ð ð �CàÐ3Ô4¸ÅwÈwÑGWÔGWÑ8WÑXß’h�w xÑ0Ô0½=�hÑIÔIð ð  #Ð#:Ô;¸hÑF�HØ—K’KØ'à&Ø Ô-Ø Ô,Ø Ô,Ø œKØ 
œOØÐ 0Ô1ØÐ 7Ô8Ø(Ø$Ø$Ø Ô0ðñô ð ð ð& —’ðð
 #Ø!Ýœ
 >ÀÐFÑFÔFðñ
ô 
ð 
ð —’‘”�à'ð  XÐgtð   Xð   Xð  DTð   Xð   Xð   XØ",Ø&4ð	ð ðiyð yð yð yñ yô yð yðz	ð z	ð z	ð z	ñ z	ô z	ð z	ð z	ðyð yð yð yøøøð yð yð yð yð yðz	ð z	ð z	ñ z	ô z	ð z	ð z	ð z	ð z	ð z	ð z	ð z	øøøð z	ð z	ð z	ð z	ð z	ð z	sN   •V0ª2VÁV0Á5EVÆ=V0ÇN(VÕ>V0ÖV	ÖV0ÖV	ÖV0Ö0V4Ö7V4)
r   r   r   NNNNNr   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r"   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ru   © ó    rt   r   r      sZ   € € € € € ØCÐCð (,Ø"Ø!Ø%)Ø!%Ø$(Ø%)Ø%)Ø%Ø ðJð Jð Jð Jð Jð Jð Jr{   r   )Ú
__future__r   rO   rS   ÚloggingÚdecimalr   r   Útypingr   Úcommonr   r	   r
   Ú	getLoggerrv   Úloggerr   rz   r{   rt   ú<module>rƒ      sÍ   ðØ "Ð "Ð "Ð "Ð "Ð "à 1ð €€€Ø €€€Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð à TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ Tà	ˆÔ	˜8Ñ	$Ô	$€ðMð Mð Mð Mð Mñ Mô Mð Mð Mð Mr{   