§
    u�’j¥"  ã                  ón   — d dl mZ d dlZd dlmZ d dlmZ  ej        d¦  «        Z G d„ de¦  «        Z	dS )é    )ÚannotationsN)ÚAny)ÚBasePostgresClientzdscons.partners.queriesc                  ó8   — e Zd ZdZ	 	 	 	 	 	 ddd„Zdd„Zdd„ZdS )ÚPartnerQueriesMixinz=Partner lookup, detail retrieval, and manual profile editing.NÚallé   é2   Úsearchú
str | NoneÚrole_filterÚstrÚcategory_filterÚhas_historyúbool | NoneÚpageÚintÚlimitÚreturnúdict[str, Any]c           
     ó�  — |                       ¦   «         5 }|                     ¦   «         5 }dg}	g }
|rFd|                     ¦   «         › d�}|	                     d¦  «         |
                     ||||g¦  «         |dk    r|	                     d¦  «         n7|dk    r|	                     d¦  «         n|dk    r|	                     d	¦  «         |d
v r*|	                     d¦  «         |
                     |¦  «         |du r|	                     d¦  «         d                     |	¦  «        }|                     d|› d�t          |
¦  «        ¦  «         |                     ¦   «         d         }|dz
  |z  }|                     d|› d�t          |
||gz   ¦  «        ¦  «         d„ | 	                    ¦   «         D ¦   «         }|                     d¦  «         t          |                     ¦   «         ¦  «        }||||dk    r||z   dz
  |z  n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 )ui   
        Láº¥y danh sÃ¡ch Ä‘á»‘i tÃ¡c/khÃ¡ch hÃ ng vá»›i phÃ¢n trang vÃ  bá»™ lá»�c linh hoáº¡t.
        z1=1ú%zh(tax_code ILIKE %s OR company_name ILIKE %s OR current_address ILIKE %s OR representative_name ILIKE %s)Úcustomerzis_customer = TRUEÚpartnerzis_partner = TRUEÚvendorzis_vendor = TRUE)ÚorganizationÚ
individualzpartner_category = %sTzhistory_change_count > 0z AND z1SELECT COUNT(*) as total FROM erp_partners WHERE ú;Útotalr	   a  
                    SELECT 
                        id, tax_code, company_name, short_name, partner_category, current_address,
                        phone, email, representative_name,
                        is_customer, is_partner, is_vendor,
                        total_output_revenue_vnd, total_input_expense_vnd, total_invoices_count,
                        first_transaction_date, latest_transaction_date, history_change_count, status, notes
                    FROM erp_partners
                    WHERE a  
                    ORDER BY 
                        (total_output_revenue_vnd + total_input_expense_vnd) DESC,
                        total_invoices_count DESC,
                        latest_transaction_date DESC NULLS LAST
                    LIMIT %s OFFSET %s;
                c                ó,   — g | ]}t          |¦  «        ‘ŒS © ©Údict)Ú.0Úrs     úFC:\Projects\DSCons\app\modules\partners\application\partner_queries.pyú
<listcomp>z4PartnerQueriesMixin.get_partners.<locals>.<listcomp>R   s   € Ð8Ð8Ð8 A�˜Q™œÐ8Ð8Ð8ó    a“  
                    SELECT 
                        COUNT(*) as total_all,
                        COUNT(*) FILTER (WHERE is_customer = TRUE) as total_customers,
                        COUNT(*) FILTER (WHERE is_partner = TRUE) as total_partners,
                        COUNT(*) FILTER (WHERE is_vendor = TRUE) as total_vendors,
                        COUNT(*) FILTER (WHERE history_change_count > 0) as total_with_history,
                        COALESCE(SUM(total_output_revenue_vnd), 0) as grand_total_output,
                        COALESCE(SUM(total_input_expense_vnd), 0) as grand_total_input
                    FROM erp_partners;
                r   )r   r   r   Útotal_pagesÚkpisÚitemsN)Úget_connectionÚcursorÚstripÚappendÚextendÚjoinÚexecuteÚtupleÚfetchoneÚfetchallr#   )Úselfr   r   r   r   r   r   ÚconnÚcurÚwhere_clausesÚparamsÚs_cleanÚ	where_sqlÚtotal_countÚoffsetÚrowsr*   s                    r&   Úget_partnersz PartnerQueriesMixin.get_partners   sŠ  € ð × Ò Ñ"Ô"ð Q	 dØ—’‘”ð P #Ø!& �Ø$&�àð HØ3 &§,¢,¡.¤.Ð3Ð3Ð3�GØ!×(Ò(ð Cñô ð ð —M’M 7¨G°W¸gÐ"FÑGÔGÐGà *Ò,Ð,Ø!×(Ò(Ð)=Ñ>Ô>Ð>Ð>Ø  IÒ-Ð-Ø!×(Ò(Ð)<Ñ=Ô=Ð=Ð=Ø  HÒ,Ð,Ø!×(Ò(Ð);Ñ<Ô<Ð<à"Ð&DÐDÐDØ!×(Ò(Ð)@ÑAÔAÐAØ—M’M /Ñ2Ô2Ð2à $Ð&Ð&Ø!×(Ò(Ð)CÑDÔDÐDà#ŸLšL¨Ñ7Ô7�	ð —’ØTÈ	ÐTÐTÐTÝ˜&‘M”Mñô ð ð "Ÿlšl™nœn¨WÔ5�ð  ™( eÑ+�Ø—’ðð %ðð ð õ ˜& E¨6 ?Ñ2Ñ3Ô3ñ!ô ð ð& 9Ð8¨¯ª©¬Ð8Ñ8Ô8�ð —’ð 
ñ 
ô 
ð 
õ ˜CŸLšL™NœNÑ+Ô+�ð )Ø Ø"à˜q’y�yð %0°%Ñ$7¸!Ñ$;ÀÑ#EÐ#EàØ Ø!ð	ð 	ðOPð Pð Pð Pñ Pô Pð PðQ	ð Q	ð Q	ð Q	ñ Q	ô Q	ð Q	ð Q	ðPð Pð Pð Pøøøð Pð Pð Pð Pð PðQ	ð Q	ð Q	ñ Q	ô Q	ð Q	ð Q	ð Q	ð Q	ð Q	ð Q	ð Q	øøøð Q	ð Q	ð Q	ð Q	ð Q	ð Q	s5   •H;ªGH"È	H;È"H&	È&H;È)H&	È*H;È;H?ÉH?Ú
partner_idúdict[str, Any] | Nonec                ó  — |                       ¦   «         5 }|                     ¦   «         5 }|                     d||f¦  «         |                     ¦   «         }|s	 ddd¦  «         ddd¦  «         dS t	          |¦  «        }t          |d         ¦  «        }|d         }|                     d|f¦  «         d„ |                     ¦   «         D ¦   «         }||d<   |                     d||f¦  «         d	„ |                     ¦   «         D ¦   «         }	|	|d
<   |                     d||f¦  «         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 chi tiáº¿t Ä‘á»‘i tÃ¡c, kÃ¨m toÃ n bá»™ lá»‹ch sá»­ thay Ä‘á»•i tÃªn/Ä‘á»‹a chá»‰,
        danh sÃ¡ch hÃ³a Ä‘Æ¡n liÃªn quan vÃ  dá»± Ã¡n liÃªn káº¿t.
        zf
                    SELECT * FROM erp_partners WHERE id::text = %s OR tax_code = %s;
                NÚidÚtax_codeaƒ  
                    SELECT 
                        id, historical_name, historical_address,
                        source_invoice_id, source_invoice_number, source_invoice_series, recorded_date, created_at
                    FROM erp_partner_history
                    WHERE partner_id = %s
                    ORDER BY recorded_date ASC, source_invoice_number ASC;
                c                ó,   — g | ]}t          |¦  «        ‘ŒS r!   r"   )r$   Úhs     r&   r'   z:PartnerQueriesMixin.get_partner_detail.<locals>.<listcomp>�   s   € Ð@Ð@Ð@¨A¥ Q¡¤Ð@Ð@Ð@r(   Úhistorya  
                    SELECT 
                        id, direction, invoice_number, invoice_series, issue_date,
                        seller_name, seller_tax_code, buyer_name, buyer_tax_code,
                        subtotal_amount_vnd, vat_amount_vnd, total_amount_vnd,
                        matched_project_id
                    FROM erp_invoices
                    WHERE seller_tax_code = %s OR buyer_tax_code = %s
                    ORDER BY issue_date DESC, invoice_number DESC
                    LIMIT 50;
                c                ó,   — g | ]}t          |¦  «        ‘ŒS r!   r"   )r$   Úis     r&   r'   z:PartnerQueriesMixin.get_partner_detail.<locals>.<listcomp>¡   s   € Ð<Ð<Ð<¨�D ™GœGÐ<Ð<Ð<r(   Úrelated_invoicesa,  
                    SELECT DISTINCT p.id, p.project_code, p.project_name, p.status, p.contract_value
                    FROM projects p
                    JOIN erp_invoices i ON i.matched_project_id = p.id
                    WHERE i.seller_tax_code = %s OR i.buyer_tax_code = %s;
                c                ó,   — g | ]}t          |¦  «        ‘ŒS r!   r"   )r$   Úprs     r&   r'   z:PartnerQueriesMixin.get_partner_detail.<locals>.<listcomp>®   s   € Ð>Ð>Ð>¨�D ™HœHÐ>Ð>Ð>r(   Úlinked_projects)r,   r-   r2   r4   r#   r   r5   )r6   rA   r7   r8   r   Úp_dictÚp_idÚp_taxÚhistory_rowsÚinvoicesÚprojectss              r&   Úget_partner_detailz&PartnerQueriesMixin.get_partner_detailm   s�  € ð
 × Ò Ñ"Ô"ð ?	 dØ—’‘”ð > #à—’ðð   Ð,ñ	ô ð ð Ÿ,š,™.œ.�Øð  Øð>ð >ð >ñ >ô >ð >ð?	ð ?	ð ?	ñ ?	ô ?	ð ?	ð ?	ð ?	õ ˜g™œ�Ý˜6 $œ<Ñ(Ô(�Ø˜zÔ*�ð —’ðð �Gñ
ô 
ð 
ð  AÐ@°·²±´Ð@Ñ@Ô@�Ø$0��yÑ!ð —’ð
ð ˜E�Nñô ð ð =Ð<¨S¯\ª\©^¬^Ð<Ñ<Ô<�Ø-5�Ð)Ñ*ð —’ðð ˜E�Nñô ð ð ?Ð>¨s¯|ª|©~¬~Ð>Ñ>Ô>�Ø,4�Ð(Ñ)àð}>ð >ð >ð >ñ >ô >ð >ð?	ð ?	ð ?	ð ?	ñ ?	ô ?	ð ?	ð ?	ð>ð >ð >ð >øøøð >ð >ð >ð >ð >ð?	ð ?	ð ?	ñ ?	ô ?	ð ?	ð ?	ð ?	ð ?	ð ?	ð ?	ð ?	øøøð ?	ð ?	ð ?	ð ?	ð ?	ð ?	sA   •Fª0E(ÁFÁ2CE(ÅFÅ(E,	Å,FÅ/E,	Å0FÆFÆFÚupdatesc                óî  — |                       ¦   «         5 }|                     ¦   «         5 }g d¢}g }g }|                     ¦   «         D ]6\  }}	||v r-|                     |› d�¦  «         |                     |	¦  «         Œ7|s-|                      |¦  «        cddd¦  «         cddd¦  «         S |                     d¦  «         |                     |¦  «         |                     dd                     |¦  «        › d�t          |¦  «        ¦  «         |                     ¦   «          |                      |¦  «        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�   
        Cáº­p nháº­t thÃ´ng tin Ä‘á»‘i tÃ¡c thá»§ cÃ´ng (sá»‘ Ä‘iá»‡n thoáº¡i, email, Ä‘áº¡i diá»‡n, ghi chÃº, vai trÃ² Ä‘á»‘i tÃ¡c).
        )Ú
short_nameÚphoneÚemailÚrepresentative_nameÚ
is_partnerÚstatusÚnotesz = %sNzupdated_at = NOW()zA
                    UPDATE erp_partners
                    SET z, zU
                    WHERE id = %s
                    RETURNING id;
                )	r,   r-   r+   r/   rU   r2   r1   r3   Úcommit)
r6   rA   rV   r7   r8   Úallowed_fieldsÚset_clausesr:   ÚkÚvs
             r&   Úupdate_partnerz"PartnerQueriesMixin.update_partner³   s`  € ð × Ò Ñ"Ô"ð #	7 d¨D¯KªK©M¬Mð #	7¸Sðð ð ˆNð ˆKØ "ˆFàŸš™œð %ð %‘��1Ø˜Ð&Ð&Ø×&Ò&¨! { { {Ñ3Ô3Ð3Ø—M’M !Ñ$Ô$Ð$øàð ;Ø×.Ò.¨zÑ:Ô:ð'#	7ð #	7ð #	7ð #	7ñ #	7ô #	7ð #	7ð #	7ð #	7ð #	7ð #	7ñ #	7ô #	7ð #	7ð #	7ð* ×ÒÐ3Ñ4Ô4Ð4Ø�MŠM˜*Ñ%Ô%Ð%à�KŠKðàŸš ;Ñ/Ô/ðð ð õ �f‘”ñô ð ð �KŠK‰MŒMˆMà×*Ò*¨:Ñ6Ô6ðG#	7ð #	7ð #	7ð #	7ñ #	7ô #	7ð #	7ð #	7ð #	7ð #	7ð #	7ñ #	7ô #	7ð #	7ð #	7ð #	7ð #	7ð #	7ð #	7øøøð #	7ð #	7ð #	7ð #	7ð #	7ð #	7ð #	7ñ #	7ô #	7ð #	7ð #	7ð #	7ð #	7ð #	7ð #	7ð #	7øøøð #	7ð #	7ð #	7ð #	7ð #	7ð #	7sB   •E*ªA*EÂE*Â-BEÄ9E*ÅE	ÅE*ÅE	ÅE*Å*E.Å1E.)Nr   r   Nr	   r
   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rA   r   r   rB   )rA   r   rV   r   r   rB   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r@   rU   rd   r!   r(   r&   r   r      sz   € € € € € ØGÐGð "Ø Ø$Ø#'ØØð]ð ]ð ]ð ]ð ]ð~Dð Dð Dð DðL)7ð )7ð )7ð )7ð )7ð )7r(   r   )
Ú
__future__r   ÚloggingÚtypingr   Úapp.core.postgres.baser   Ú	getLoggerÚloggerr   r!   r(   r&   ú<module>ro      s–   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à 5Ð 5Ð 5Ð 5Ð 5Ð 5à	ˆÔ	Ð4Ñ	5Ô	5€ðQ7ð Q7ð Q7ð Q7ð Q7Ð,ñ Q7ô Q7ð Q7ð Q7ð Q7r(   