§
    ET·j`6  ã                  ój   — d dl mZ 	 d dlZd dlZd dlmZ  ej        e¦  «        Z G d„ d¦  «        Z	dS )é    )ÚannotationsN)ÚAnyc                  ó0   — e Zd ZdZdd„Z	 	 ddd„Zdd„ZdS )ÚInvoiceQueryDetailsMixinz@Mixin for get_invoice_detail, reconcile, and sync configs query.Ú
invoice_idÚstrÚreturnúdict[str, Any] | Nonec                ó  — |                       ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     ¦   «         }|s	 ddd¦  «         ddd¦  «         dS t	          |¦  «        }t          |d         ¦  «        |d<   |                     d¦  «        rt          |d         ¦  «        |d<   |                     d¦  «        rt          |d         ¦  «        |d<   |                     d¦  «        rt          |d         ¦  «        |d<   |                     d¦  «        rt          |d         ¦  «        |d<   |                     d¦  «        rt          |d         ¦  «        |d<   |                     d	¦  «        rt          |d	         ¦  «        |d	<   d
D ]&}||v r ||         �t          ||         ¦  «        ||<   Œ'|                     d|f¦  «         |                     ¦   «         }g }|D ]j}	t	          |	¦  «        }
t          |
d         ¦  «        |
d<   t          |
d         ¦  «        |
d<   dD ]&}||
v r |
|         �t          |
|         ¦  «        |
|<   Œ'Œkt          |¦  «        dk    �r;|                     d¦  «        �r%|d         }| 
                    d¦  «        �r	 t          j        |¦  «        }|                     d¦  «        pg }|�r™t          |t          ¦  «        �rƒt          |¦  «        dk    �rot          |d¬¦  «        D �]Z\  }}t          t          |                     d¦  «        pd¦  «                             dd¦  «                             ¦   «         pd¦  «        }t          |                     d¦  «        pd¦  «        }t          |                     d¦  «        p||z  dz  ¦  «        }|                      |                     dd¦  «        |                     dd¦  «        ¦  «        }|                     d|› �||d|                     d ¦  «        › d!|                     d"¦  «        › d#�d$|d%›�d&d'||||||z   |                     d(d)¦  «        d*d+œ¦  «         �Œ\�n.|                     d,¦  «        pddk    �rt          |                     d,¦  «        pd¦  «        }t          |                     d-¦  «        pd¦  «        }t          |                     d.¦  «        pd¦  «        }|                      |                     dd¦  «        |                     dd¦  «        ¦  «        }|                     d/|dd|                     d ¦  «        › d!|                     d"¦  «        › d#�d0d&d'||||||z   |                     d(d)¦  «        d*d+œ¦  «         n# t(          $ r Y nw xY w||d1<   |                      |                     d"¦  «        t          |                     d2d¦  «        ¦  «        ¦  «        |d3<   |                      |                     d"¦  «        t          |                     d2d¦  «        ¦  «        |                     d¦  «        ¦  «        |d4<   |                      |                     dd¦  «        |                     dd¦  «        ¦  «        |d5<   |                     d6||f¦  «         d7„ |                     ¦   «         D ¦   «         }|D ]¡}t          |d         ¦  «        |d<   |                     d8¦  «        �t          |d8         ¦  «        |d8<   |                     d9¦  «        �t          |d9         ¦  «        |d9<   |                     d:¦  «        �t          |d:         ¦  «        |d:<   Œ¢||d;<   |                     d<|f¦  «         d=„ |                     ¦   «         D ¦   «         }|D ]_}t          |d         ¦  «        |d<   t          |d         ¦  «        |d<   |                     d¦  «        rt          |d         ¦  «        |d<   Œ`||d><   |                     d?¦  «        d@k    r‡t          |¦  «        dk    sBt          |¦  «        dk    ra|d                              dAd¦  «         
                    dB¦  «        r2|                      ||¦  «        }|r|cddd¦  «         cddd¦  «         S |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 )CuZ   Láº¥y chi tiáº¿t 1 hÃ³a Ä‘Æ¡n kÃ¨m toÃ n bá»™ danh sÃ¡ch items vÃ  lá»‹ch sá»­ audit logs.a  
                    SELECT
                        i.*,
                        p.project_name AS matched_project_name,
                        p.project_code AS matched_project_code,
                        w.wbs_code AS matched_wbs_code,
                        w.task_name AS matched_wbs_task_name
                    FROM erp_invoices i
                    LEFT JOIN projects p ON i.matched_project_id = p.id
                    LEFT JOIN erp_project_wbs w ON i.matched_wbs_id = w.id
                    WHERE i.id = %s
                NÚidÚmatched_project_idÚmatched_wbs_idÚ
issue_dateÚ	signed_atÚ
created_atÚ
updated_at)Úsubtotal_amount_vndÚvat_rate_percentÚvat_amount_vndÚtotal_amount_vndÚexchange_rateÚremaining_amount_vndzMSELECT * FROM erp_invoice_items WHERE invoice_id = %s ORDER BY item_order ASCr   )ÚquantityÚunit_price_vndÚamount_before_vat_vndr   r   Útotal_item_amount_vndr   Úxml_raw_contentÚ{Ú
thttltsuaté   )ÚstartÚtsuatÚ8ú%Ú é   ÚthtienÚtthueéd   Úseller_nameÚnoteszsummary-u,   Cung cáº¥p hÃ ng hÃ³a, dá»‹ch vá»¥ theo HÄ� Úinvoice_numberz (Úinvoice_seriesú)zGDT-SUM-Ú02du   GÃ³ig      ð?Úprimary_categoryÚmaterialT)r   r   Ú
item_orderÚ	item_nameÚ	item_codeÚunitr   r   r   r   r   r   Úcost_categoryÚis_summary_liner   r   r   z	summary-1z
GDT-SUM-01ÚitemsÚtemplate_codeÚis_cash_registerÚinvoice_type_infoÚcategory_infoaV  
                    SELECT id, equipment_code, equipment_name, equipment_type, brand_model, purchase_cost_vnd, status, hourly_rate_standard, fuel_norm_per_hour
                    FROM erp_equipment
                    WHERE purchase_invoice_id = %s OR source_invoice_id = %s
                    ORDER BY equipment_code ASC;
                c                ó,   — g | ]}t          |¦  «        ‘ŒS © ©Údict)Ú.0Úeqs     úWC:\Projects\DSCons\app\modules\invoices\application\invoice_processing\query_details.pyú
<listcomp>z?InvoiceQueryDetailsMixin.get_invoice_detail.<locals>.<listcomp>¥   s   € Ð@Ð@Ð@¨2�d 2™hœhÐ@Ð@Ð@ó    Úpurchase_cost_vndÚhourly_rate_standardÚfuel_norm_per_hourÚlinked_equipmentzSSELECT * FROM erp_invoice_audit_logs WHERE invoice_id = %s ORDER BY created_at DESCc                ó,   — g | ]}t          |¦  «        ‘ŒS r>   r?   )rA   Úls     rC   rD   z?InvoiceQueryDetailsMixin.get_invoice_detail.<locals>.<listcomp>´   s   € Ð8Ð8Ð8 A�˜Q™œÐ8Ð8Ð8rE   Ú
audit_logsÚsource_channelÚgdt_syncr4   zGDT-)Úget_connectionÚcursorÚexecuteÚfetchoner@   r   ÚgetÚfloatÚfetchallÚlenÚ
startswithÚjsonÚloadsÚ
isinstanceÚlistÚ	enumerateÚreplaceÚstripÚinfer_invoice_categoryÚappendÚ	ExceptionÚis_cash_register_invoiceÚget_invoice_type_metadataÚ$_enrich_gdt_invoice_detail_on_demand)Úselfr   ÚconnÚcurÚinv_rowÚinv_dataÚnum_colÚ	item_rowsr8   ÚitmÚidictÚraw_strÚraw_objÚthttlÚidxÚvbÚt_rateÚt_amtÚt_vatÚcat_infoÚsubÚvatÚv_rateÚ
linked_eqsrB   ÚlogsrK   Úenricheds                               rC   Úget_invoice_detailz+InvoiceQueryDetailsMixin.get_invoice_detail   sP  € à× Ò Ñ"Ô"ð x	  dØ—’‘”ð w  #Ø—’ðð  �Mñô ð ð Ÿ,š,™.œ.�Øð  Øð%w ð w ð w ñ w ô w ð w ðx	 ð x	 ð x	 ñ x	 ô x	 ð x	 ð x	 ð x	 õ*   ™=œ=�Ý!$ X¨d¤^Ñ!4Ô!4�˜‘Ø—<’<Ð 4Ñ5Ô5ð YÝ58¸ÐBVÔ9WÑ5XÔ5X�HÐ1Ñ2Ø—<’<Ð 0Ñ1Ô1ð QÝ14°XÐ>NÔ5OÑ1PÔ1P�HÐ-Ñ.Ø—<’< Ñ-Ô-ð IÝ-0°¸,Ô1GÑ-HÔ-H�H˜\Ñ*Ø—<’< Ñ,Ô,ð GÝ,/°¸Ô0EÑ,FÔ,F�H˜[Ñ)Ø—<’< Ñ-Ô-ð IÝ-0°¸,Ô1GÑ-HÔ-H�H˜\Ñ*Ø—<’< Ñ-Ô-ð IÝ-0°¸,Ô1GÑ-HÔ-H�H˜\Ñ*ð ð 	Eð 	E�Gð  (Ð*Ð*¨x¸Ô/@Ð/LÝ,1°(¸7Ô2CÑ,DÔ,D˜ Ñ)øà—’ØcØ�Mñô ð ð  ŸLšL™NœN�	Ø.0�Ø$ð Cð C�CÝ  ™IœI�EÝ"% e¨D¤kÑ"2Ô"2�E˜$‘KÝ*-¨e°LÔ.AÑ*BÔ*B�E˜,Ñ'ð$ð 	Cð 	C˜ð # eÐ+Ð+°°g´Ð0JÝ-2°5¸´>Ñ-BÔ-B˜E '™Nøð	Cõ �u‘:”: ’?‘? x§|¢|Ð4EÑ'FÔ'F‘?Ø&Ð'8Ô9�GØ×)Ò)¨#Ñ.Ô.ñ 4!ð3!Ý&*¤j°Ñ&9Ô&9˜GØ$+§K¢K°Ñ$=Ô$=Ð$CÀ˜EØ$ñ .#­°E½4Ñ)@Ô)@ñ .#ÅSÈÁZÄZÐRSÂ^Á^Ý/8¸ÀaÐ/HÑ/HÔ/Hð !'ñ !'¡G C¨Ý-2µ3°r·v²v¸g±´Ð7MÈ#Ñ3NÔ3N×3VÒ3VÐWZÐ\^Ñ3_Ô3_×3eÒ3eÑ3gÔ3gÐ3lÐklÑ-mÔ-m FÝ,1°"·&²&¸Ñ2BÔ2BÐ2GÀaÑ,HÔ,H EÝ,1°"·&²&¸±/´/Ð2[ÀeÈfÁnÐWZÑFZÑ,\Ô,\ EØ/3×/JÒ/JØ(0¯ª°]ÀBÑ(GÔ(GÈÏÊÐV]Ð_aÑIbÔIbñ0&ô 0& Hð %*§L¢LØ.>¸Ð.>Ð.>Ø6@Ø69ð 6hÐdl×dpÒdpð  rBñ  eCô  eCð  6hð  6hð  GO÷  GSò  GSð  Tdñ  Geô  Geð  6hð  6hð  6hØ5IÀÐ5IÐ5IÐ5IØ06Ø47Ø:?ØAFØ<BØ:?ØAFÈÁØ9A¿ºÐFXÐZdÑ9eÔ9eØ;?ð2&ð 2&ñ %'ô %'ð %'ñ %'ñ!'ð. #+§,¢,Ð/DÑ"EÔ"EÐ"JÈÈaÒ!OÑ!OÝ&+¨H¯LªLÐ9NÑ,OÔ,OÐ,TÐSTÑ&UÔ&U Ý&+¨H¯LªLÐ9IÑ,JÔ,JÐ,OÈaÑ&PÔ&P Ý).¨x¯|ª|Ð<NÑ/OÔ/OÐ/TÐSTÑ)UÔ)U Ø+/×+FÒ+FØ$,§L¢L°ÀÑ$CÔ$CÀXÇ\Â\ÐRYÐ[]ÑE^ÔE^ñ,"ô ," ð !&§¢Ø*5Ø2<Ø23ð 2dÐ`h×`lÒ`lÐm}Ñ`~Ô`~ð  2dð  2dð  CK÷  COò  COð  P`ñ  Caô  Cað  2dð  2dð  2dØ1=Ø,2Ø03Ø69Ø=@Ø8>Ø69Ø=@À3¹YØ5=·\²\ÐBTÐV`Ñ5aÔ5aØ7;ð."ð ."ñ !#ô !#ð !#øøõ   )ð !ð !ð !Ø ˜Dð!øøøð %*�˜Ñ!Ø/3×/LÒ/LØ—L’LÐ!1Ñ2Ô2Ý˜Ÿš _°bÑ9Ô9Ñ:Ô:ñ0ô 0�Ð+Ñ,ð 15×0NÒ0NØ—L’LÐ!1Ñ2Ô2Ý˜Ÿš _°bÑ9Ô9Ñ:Ô:Ø—L’L Ñ/Ô/ñ1ô 1�Ð,Ñ-ð
 -1×,GÒ,GØ—L’L °Ñ3Ô3°X·\²\À'È2Ñ5NÔ5Nñ-ô -�˜Ñ)ð
 —’ðð   Ð,ñô ð ð AÐ@°·²±´Ð@Ñ@Ô@�
Ø$ð Sð S�BÝ" 2 d¤8™}œ}�B�t‘HØ—v’vÐ1Ñ2Ô2Ð>Ý27¸Ð;NÔ8OÑ2PÔ2P˜Ð.Ñ/Ø—v’vÐ4Ñ5Ô5ÐAÝ5:¸2Ð>TÔ;UÑ5VÔ5V˜Ð1Ñ2Ø—v’vÐ2Ñ3Ô3Ð?Ý38¸Ð<PÔ9QÑ3RÔ3R˜Ð/Ñ0øØ/9�Ð+Ñ,à—’ØiØ�Mñô ð ð 9Ð8¨¯ª©¬Ð8Ñ8Ô8�Øð ?ð ?�AÝ! ! D¤'™lœl�A�d‘GÝ&)¨!¨L¬/Ñ&:Ô&:�A�l‘OØ—u’u˜\Ñ*Ô*ð ?Ý*-¨a°¬oÑ*>Ô*>˜˜,™øØ)-�˜Ñ&ð —<’<Ð 0Ñ1Ô1°ZÒ?Ð?Ý˜‘J”J !’O�Oå˜E™
œ
 aš˜Ø! !œHŸLšL¨°bÑ9Ô9×DÒDÀVÑLÔLð (ð  $×HÒHØ" Hñ ô  �Hð  ð (Ø'ðkw ð w ð w ð w ñ w ô w ð w ðx	 ð x	 ð x	 ð x	 ñ x	 ô x	 ð x	 ð x	 ðp  ðow ð w ð w ð w ñ w ô w ð w ðx	 ð x	 ð x	 ð x	 ñ x	 ô x	 ð x	 ð x	 ðw ð w ð w ð w øøøð w ð w ð w ð w ð w ðx	 ð x	 ð x	 ñ x	 ô x	 ð x	 ð x	 ð x	 ð x	 ð x	 ð x	 ð x	 øøøð x	 ð x	 ð x	 ð x	 ð x	 ð x	 ss   •c:ª/c!Ác:Á1I c!Ê2K5V(Ö'c!Ö(
V5Ö2c!Ö4V5Ö5K9c!â.c:ãc!ãc:ã!c%	ã%c:ã(c%	ã)c:ã:c>äc>NÚ
SuperAdminÚ
project_idÚwbs_idú
str | NoneÚuser_idúdict[str, Any]c                ó  — |                       ¦   «         5 }|                     ¦   «         5 }|                     d|||f¦  «         |                     ¦   «         }|sdddœcddd¦  «         cddd¦  «         S |                     d||t	          j        ||dœd¬	¦  «        f¦  «         |                     ¦   «          d
d|d         › d�|dœ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 )uH   Khá»›p ná»‘i thá»§ cÃ´ng hÃ³a Ä‘Æ¡n vá»›i dá»± Ã¡n vÃ  háº¡ng má»¥c WBS.a~  
                    UPDATE erp_invoices
                    SET matched_project_id = %s,
                        matched_wbs_id = %s,
                        reconciliation_status = 'manual_approved',
                        updated_at = CURRENT_TIMESTAMP
                    WHERE id = %s
                    RETURNING invoice_number, direction, total_amount_vnd;
                Úerroru   HÃ³a Ä‘Æ¡n khÃ´ng tá»“n táº¡i.)ÚstatusÚmessageNz»
                    INSERT INTO erp_invoice_audit_logs (invoice_id, action_type, performed_by, details_json)
                    VALUES (%s, 'RECONCILE_MANUAL', %s, %s);
                )r   r   F)Úensure_asciiÚsuccessu)   Ä�Ã£ khá»›p thÃ nh cÃ´ng hÃ³a Ä‘Æ¡n sá»‘ r,   u    vá»›i dá»± Ã¡n.)r†   r‡   r   )rO   rP   rQ   rR   rX   ÚdumpsÚcommit)re   r   r   r€   r‚   rf   rg   Úrows           rC   Úreconcile_invoicez*InvoiceQueryDetailsMixin.reconcile_invoiceÌ   s!  € ð × Ò Ñ"Ô"ð )	 dØ—’‘”ð ( #Ø—’ðð   ¨Ð4ñô ð ð —l’l‘n”n�Øð \Ø&-Ð:ZÐ[Ð[ð(ð (ð (ð (ñ (ô (ð (ð)	ð )	ð )	ð )	ñ )	ô )	ð )	ð )	ð$ —’ðð
 #ØÝœ
à6@Ø28ðð ð */ðñ ô ð
ñô ð ð$ —’‘”�à'ØrÈ3ÐO_ÔK`ÐrÐrÐrØ",ðð ðI(ð (ð (ð (ñ (ô (ð (ð)	ð )	ð )	ð )	ñ )	ô )	ð )	ð )	ð(ð (ð (ð (øøøð (ð (ð (ð (ð (ð)	ð )	ð )	ñ )	ô )	ð )	ð )	ð )	ð )	ð )	ð )	ð )	øøøð )	ð )	ð )	ð )	ð )	ð )	sA   •C<ª4C#ÁC<Á7AC#Ã
C<Ã#C'	Ã'C<Ã*C'	Ã+C<Ã<D ÄD úlist[dict[str, Any]]c                óÆ  — |                       ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         |                     ¦   «         }g }|D ]Ê}t	          |¦  «        }t          |d         ¦  «        |d<   |                     d¦  «        rt          |d         ¦  «        |d<   |                     d¦  «        rt          |d         ¦  «        |d<   |                     d¦  «        rt          |d         ¦  «        |d<   d|d<   |                     |¦  «         ŒË|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 )	u^   Láº¥y danh sÃ¡ch cáº¥u hÃ¬nh tÃ i khoáº£n káº¿t ná»‘i Cá»•ng Thuáº¿, meInvoice vÃ  Email IMAP.a1  
                    SELECT id, service_type, tax_code, username, extra_config, is_active,
                           last_sync_at, last_sync_status, last_sync_message, created_at, updated_at
                    FROM erp_invoice_sync_configs
                    ORDER BY service_type ASC;
                r   Úlast_sync_atr   r   TÚhas_passwordN)rO   rP   rQ   rU   r@   r   rS   r`   )re   rf   rg   ÚrowsÚresultsÚrÚds          rC   Úget_sync_configsz)InvoiceQueryDetailsMixin.get_sync_configsÿ   sþ  € à× Ò Ñ"Ô"ð 	 dØ—’‘”ð  #Ø—’ð ñ ô ð ð —|’|‘~”~�Ø�Øð &ð &�AÝ˜Q™œ�AÝ! ! D¤'™lœl�A�d‘GØ—u’u˜^Ñ,Ô,ð CÝ,/°°.Ô0AÑ,BÔ,B˜˜.Ñ)Ø—u’u˜\Ñ*Ô*ð ?Ý*-¨a°¬oÑ*>Ô*>˜˜,™Ø—u’u˜\Ñ*Ô*ð ?Ý*-¨a°¬oÑ*>Ô*>˜˜,™à(,�A�nÑ%Ø—N’N 1Ñ%Ô%Ð%Ð%Øð+ð ð ð ñ ô ð ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ðð ð ð øøøð ð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s5   •EªC:D=Ä$EÄ=E	ÅEÅE	ÅEÅEÅE)r   r   r	   r
   )Nr~   )
r   r   r   r   r€   r�   r‚   r   r	   rƒ   )r	   rŽ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r}   r�   r–   r>   rE   rC   r   r      si   € € € € € ØJÐJðz ð z ð z ð z ð@ "Ø#ð1ð 1ð 1ð 1ð 1ðfð ð ð ð ð rE   r   )
Ú
__future__r   rX   ÚloggingÚtypingr   Ú	getLoggerr—   Úloggerr   r>   rE   rC   ú<module>r       sŽ   ðØ "Ð "Ð "Ð "Ð "Ð "à ;ð €€€Ø €€€Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ðJð Jð Jð Jð Jñ Jô Jð Jð Jð JrE   