§
    ;m™j|/  ã                  ó`   — d dl mZ d dlZd dlmZ  ej        e¦  «        Z G d„ d¦  «        ZdS )é    )ÚannotationsN)ÚAnyc                  óP   — e Zd Z	 ddd	„Zddd„Zdd„Zdd„Z	 	 	 	 	 ddd„Zdd„ZdS )ÚErpFinancialMixinNé2   Ú
project_idú
str | NoneÚlimitÚintÚreturnúlist[dict[str, Any]]c                óV  — d}g }|r|dz  }|                      |¦  «         |d|› d�z  }|                      ¦   «         5 }|                     ¦   «         5 }|                     ||¦  «         |                     ¦   «         }|r|cddd¦  «         cddd¦  «         S d}g }	|r|dz  }|	                      |¦  «         |d|› d�z  }|                     ||	¦  «         |                     ¦   «         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 )	uu   Láº¥y danh sÃ¡ch cÃ¡c giao dá»‹ch dÃ²ng tiá»�n thu/chi thá»±c táº¿ tá»« sá»• cÃ¡i hoáº·c hÃ³a Ä‘Æ¡n Ä‘iá»‡n tá»­ GDT.z¼
            SELECT f.*, p.project_name as project_name
            FROM erp_financial_transactions f
            LEFT JOIN projects p ON f.project_id = p.id
            WHERE 1=1
        z AND f.project_id = %sz; ORDER BY f.transaction_date DESC, f.created_at DESC LIMIT ú;Nug  
                    SELECT 
                        i.id::text as id,
                        '0202111150' as company_id,
                        i.matched_project_id as project_id,
                        COALESCE(i.invoice_number, 'HD-' || SUBSTRING(i.id::text, 1, 8)) as transaction_code,
                        CASE 
                            WHEN i.direction = 'input' THEN 'CHI_PHI_MUA_VAO' 
                            WHEN i.direction = 'output' THEN 'DOANH_THU_XUAT_RA' 
                            ELSE 'HOA_DON' 
                        END as transaction_type,
                        CASE WHEN i.direction = 'input' THEN 'out' ELSE 'in' END as direction,
                        i.total_amount_vnd as amount,
                        COALESCE(i.issue_date, i.created_at::date) as transaction_date,
                        CASE WHEN i.direction = 'input' THEN i.seller_name ELSE i.buyer_name END as beneficiary_or_payer,
                        i.invoice_number,
                        'Chuyá»ƒn khoáº£n' as payment_method,
                        NULL as dossier_reference_id,
                        COALESCE(i.reconciliation_status, i.status, 'da_ghi_so') as accounting_status,
                        0.0 as ai_risk_score,
                        COALESCE(i.notes, i.seller_name) as notes,
                        NULL as created_by_employee_id,
                        COALESCE(p.project_name, 'HÄ�-2026 CÃ´ng trÃ¬nh chung') as project_name
                    FROM erp_invoices i
                    LEFT JOIN projects p ON i.matched_project_id = p.id
                    WHERE i.total_amount_vnd > 0
                z AND i.matched_project_id = %szD ORDER BY transaction_date DESC NULLS LAST, i.created_at DESC LIMIT ©ÚappendÚget_connectionÚcursorÚexecuteÚfetchall)
Úselfr   r
   Ú
sql_manualÚparams_manualÚconnÚcurÚrowsÚsql_invoicesÚ
params_invs
             ú@C:\Projects\DSCons\app\core\postgres\clients\financial_client.pyÚlist_financial_transactionsz-ErpFinancialMixin.list_financial_transactions
   s4  € ðˆ
ð $&ˆØð 	-ØÐ2Ñ2ˆJØ× Ò  Ñ,Ô,Ð,ØØRÈ%ÐRÐRÐRñ	
ˆ
ð × Ò Ñ"Ô"ð *	& dØ—’‘”ð )& #Ø—’˜J¨Ñ6Ô6Ð6Ø—|’|‘~”~�Øð  Øð	)&ð )&ð )&ð )&ñ )&ô )&ð )&ð*	&ð *	&ð *	&ð *	&ñ *	&ô *	&ð *	&ð *	&ð �ð6 )+�
Øð 2Ø Ð$DÑD�LØ×%Ò% jÑ1Ô1Ð1ØÐ oÐglÐ oÐ oÐ oÑo�à—’˜L¨*Ñ5Ô5Ð5Ø—|’|‘~”~ðS)&ð )&ð )&ð )&ñ )&ô )&ð )&ð*	&ð *	&ð *	&ð *	&ñ *	&ô *	&ð *	&ð *	&ð)&ð )&ð )&ð )&øøøð )&ð )&ð )&ð )&ð )&ð*	&ð *	&ð *	&ñ *	&ô *	&ð *	&ð *	&ð *	&ð *	&ð *	&ð *	&ð *	&øøøð *	&ð *	&ð *	&ð *	&ð *	&ð *	&sB   ¾DÁ.DÂDÂADÃ,DÄD		Ä	DÄD		ÄDÄD"Ä%D"é
   c                ó.  — d|› d�}|                       ¦   «         5 }|                     ¦   «         5 }|                     |¦  «         |                     ¦   «         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Ã¡c hoáº¡t Ä‘á»™ng váº­n hÃ nh vÃ  kiá»ƒm toÃ¡n thá»±c táº¿ tá»« AI, Cá»•ng Thuáº¿ GDT vÃ  Tá»± Trá»‹ DHS.uI  
            SELECT * FROM (
                SELECT 
                    'ai_agent' as activity_source,
                    COALESCE(agent_code, 'system') as actor_code,
                    CASE 
                        WHEN agent_code = 'minh' THEN 'Minh (PhÃ¡p lÃ½)'
                        WHEN agent_code = 'thao' THEN 'Tháº£o (Dá»± toÃ¡n)'
                        WHEN agent_code = 'tung' THEN 'TÃ¹ng (Kiá»ƒm toÃ¡n)'
                        WHEN agent_code = 'quynh' THEN 'Quá»³nh (Káº¿ toÃ¡n)'
                        WHEN agent_code = 'nam' THEN 'Nam (TÃ i chÃ­nh)'
                        WHEN agent_code = 'hung' THEN 'HÃ¹ng (Hiá»‡n trÆ°á»�ng)'
                        WHEN agent_code = 'lan' THEN 'Lan (KhÃ¡ch hÃ ng)'
                        WHEN agent_code = 'phuc' THEN 'PhÃºc (Tiáº¿n Ä‘á»™)'
                        WHEN agent_code = 'thuy' THEN 'Thá»§y (Trá»£ lÃ½)'
                        ELSE 'Há»‡ thá»‘ng AI'
                    END as actor_name,
                    'Tra cá»©u & xá»­ lÃ½ tri thá»©c: ' || SUBSTRING(COALESCE(query_preview, 'HoÃ n thÃ nh tÃ¡c vá»¥ RAG'), 1, 80) as description,
                    created_at
                FROM erp_ai_agent_usage_logs
                UNION ALL
                SELECT 
                    'invoice_audit' as activity_source,
                    'bot_tax' as actor_code,
                    'Cá»•ng Thuáº¿ GDT' as actor_name,
                    'Ä�á»“ng bá»™ hÃ³a Ä‘Æ¡n Ä‘iá»‡n tá»­ GDT (' || COALESCE(action_type, 'SYNC') || ')' as description,
                    created_at
                FROM erp_invoice_audit_logs
                UNION ALL
                SELECT 
                    'autonomous_healing' as activity_source,
                    COALESCE(agent_code, 'dhs') as actor_code,
                    'Há»‡ Thá»‘ng Tá»± Trá»‹ DHS' as actor_name,
                    'Chuáº©n hÃ³a dá»¯ liá»‡u: ' || SUBSTRING(COALESCE(reason, 'Audit báº£n ghi'), 1, 80) as description,
                    created_at
                FROM erp_autonomous_healing_logs
            ) combined_activities
            ORDER BY created_at DESC
            LIMIT z
;
        N©r   r   r   r   )r   r
   Úsqlr   r   s        r   Úlist_system_activitiesz(ErpFinancialMixin.list_system_activitiesH   s9  € ð'ðL ðM'ð 'ð 'ˆðP × Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜ÑÔÐØ—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s4   ›B
°)A2ÁB
Á2A6	Á6B
Á9A6	Á:B
Â
BÂBúdict[str, Any]c           
     óì  — |                       ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         |                     ¦   «         }|r|d         nd}|r|d         nd}|                     d¦  «         d„ |                     ¦   «         D ¦   «         }|                     d¦  «         |                     ¦   «         }|r|d         nd}|r|d         nd}	|                     d¦  «         |                     ¦   «         }
|
r|
d         nd}|
rt          |
d	         ¦  «        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 )uM   Tá»•ng há»£p chá»‰ sá»‘ KPI váº­n hÃ nh thá»±c táº¿ cho Báº£ng Ä�iá»�u HÃ nh.zaSELECT count(*) as total, count(*) FILTER (WHERE status = 'in_progress') as active FROM projects;Útotalr   Úactivez`SELECT project_name FROM projects WHERE status = 'in_progress' ORDER BY created_at DESC LIMIT 3;c                ó   — g | ]
}|d          ‘ŒS )Úproject_name© )Ú.0Úrs     r   ú
<listcomp>z5ErpFinancialMixin.get_kpi_summary.<locals>.<listcomp>…   s   € ÐGÐGÐG°1˜Q˜~Ô.ÐGÐGÐGó    zySELECT count(*) as total, count(*) FILTER (WHERE status = 'active' OR status = 'available') as active FROM erp_equipment;z]SELECT count(*) as total, COALESCE(sum(total_amount_vnd), 0) as sum_amount FROM erp_invoices;Ú
sum_amountg        )Útotal_projectsÚactive_projectsÚactive_project_namesÚtotal_equipmentÚactive_equipmentÚtotal_invoicesÚtotal_invoices_amount_vndN)r   r   r   Úfetchoner   Úfloat)r   r   r   Úproj_rowr1   r2   Ú	top_projsÚ	equip_rowr4   r5   Úinv_rowr6   Útotal_invoices_amounts                r   Úget_kpi_summaryz!ErpFinancialMixin.get_kpi_summaryv   s\  € à× Ò Ñ"Ô"ð '	 dØ—’‘”ð & #à—’Øwñô ð ð Ÿ<š<™>œ>�Ø6>Ð!E ¨'Ô!2Ð!2ÀA�Ø8@Ð"G (¨8Ô"4Ð"4Àa�à—’Øvñô ð ð HÐG¸¿º¹¼ÐGÑGÔG�	ð —’ð Pñô ð ð  ŸLšL™NœN�	Ø8AÐ"H )¨GÔ"4Ð"4Àq�Ø:CÐ#J 9¨XÔ#6Ð#6ÈÐ ð —’Øsñô ð ð Ÿ,š,™.œ.�Ø5<Ð!C ¨Ô!1Ð!1À!�ØHOÐ(X­¨g°lÔ.CÑ(DÔ(DÐ(DÐUXÐ%ð '5Ø'6Ø,5Ø'6Ø(8Ø&4Ø1Fðð ð=&ð &ð &ð &ñ &ô &ð &ð'	ð '	ð '	ð '	ñ '	ô '	ð '	ð '	ð&ð &ð &ð &øøøð &ð &ð &ð &ð &ð'	ð '	ð '	ñ '	ô '	ð '	ð '	ð '	ð '	ð '	ð '	ð '	øøøð '	ð '	ð '	ð '	ð '	ð '	s5   •E)ªDEÄ7E)ÅE	ÅE)ÅE	ÅE)Å)E-Å0E-Úpayloadc                óP  — d}|                       ¦   «         5 }|                     ¦   «         5 }|                     ||¦  «         |                     ¦   «          |                     ¦   «         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,   Táº¡o giao dá»‹ch thu/chi tÃ i chÃ­nh má»›i.a  
            INSERT INTO erp_financial_transactions (
                company_id, project_id, transaction_code, transaction_type,
                direction, amount, transaction_date, beneficiary_or_payer,
                invoice_number, payment_method, dossier_reference_id,
                accounting_status, ai_risk_score, notes, created_by_employee_id
            ) VALUES (
                %(company_id)s, %(project_id)s, %(transaction_code)s, %(transaction_type)s,
                %(direction)s, %(amount)s, %(transaction_date)s, %(beneficiary_or_payer)s,
                %(invoice_number)s, %(payment_method)s, %(dossier_reference_id)s,
                %(accounting_status)s, %(ai_risk_score)s, %(notes)s, %(created_by_employee_id)s
            ) RETURNING *;
        N)r   r   r   Úcommitr8   )r   r@   r#   r   r   s        r   Úcreate_financial_transactionz.ErpFinancialMixin.create_financial_transaction¡   s1  € ðˆð × Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜˜WÑ%Ô%Ð%Ø�KŠK‰MŒMˆMØ—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s4   —B¬>BÁ*BÂB	ÂBÂ
B	ÂBÂBÂ"Béd   Ú	bank_nameÚaccount_numberÚcategoryc                ó&  — d}g }|r|dz  }|                      d|› d�¦  «         |r|dz  }|                      |¦  «         |r|dz  }|                      |¦  «         |r|dz  }|                      |¦  «         |d|› d�z  }|                      ¦   «         5 }|                     ¦   «         5 }	|	                     ||¦  «         |	                     ¦   «         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   Tra cá»©u danh sÃ¡ch giao dá»‹ch sao kÃª tá»« 4 tÃ i khoáº£n ngÃ¢n hÃ ng thá»±c táº¿ cá»§a Ä�á»‹nh SÆ¡n.a  
            SELECT b.*, p.project_name, i.invoice_number as matched_invoice_number
            FROM erp_bank_transactions b
            LEFT JOIN projects p ON b.matched_project_id = p.id
            LEFT JOIN erp_invoices i ON b.matched_invoice_id = i.id
            WHERE 1=1
        z AND b.bank_name ILIKE %sú%z AND b.account_number = %sz AND b.matched_project_id = %sz  AND b.transaction_category = %sz; ORDER BY b.transaction_date DESC, b.created_at DESC LIMIT r   Nr   )
r   rE   rF   r   rG   r
   r#   Úparamsr   r   s
             r   Úlist_bank_transactionsz(ErpFinancialMixin.list_bank_transactionsµ   sß  € ðˆð ˆØð 	,ØÐ.Ñ.ˆCØ�MŠMÐ*˜iÐ*Ð*Ð*Ñ+Ô+Ð+Øð 	*ØÐ/Ñ/ˆCØ�MŠM˜.Ñ)Ô)Ð)Øð 	&ØÐ3Ñ3ˆCØ�MŠM˜*Ñ%Ô%Ð%Øð 	$ØÐ5Ñ5ˆCØ�MŠM˜(Ñ#Ô#Ð#àÐUÈUÐUÐUÐUÑUˆà× Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜˜VÑ$Ô$Ð$Ø—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s6   ÂDÂ+*C.ÃDÃ.C2	Ã2DÃ5C2	Ã6DÄD
ÄD
c                ó~  — |                       ¦   «         5 }|                     ¦   «         5 }|                     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 )ua   BÃ¡o cÃ¡o tá»•ng há»£p sá»‘ dÆ° vÃ  Ä‘á»‘i soÃ¡t dÃ²ng tiá»�n sao kÃª ngÃ¢n hÃ ng toÃ n cÃ´ng ty.a(  
                SELECT bank_name, account_number,
                       count(*) as txn_count,
                       sum(case when direction = 'inflow' then amount else 0 end) as total_in,
                       sum(case when direction = 'outflow' then amount else 0 end) as total_out,
                       min(transaction_date) as start_date,
                       max(transaction_date) as end_date
                FROM erp_bank_transactions
                GROUP BY bank_name, account_number
                ORDER BY total_in DESC;
            a«  
                SELECT transaction_category,
                       count(*) as txn_count,
                       sum(case when direction = 'inflow' then amount else 0 end) as total_in,
                       sum(case when direction = 'outflow' then amount else 0 end) as total_out
                FROM erp_bank_transactions
                GROUP BY transaction_category
                ORDER BY sum(amount) DESC;
            )ÚbanksÚ
categoriesNr"   )r   r   r   rM   rN   s        r   Úget_bank_reconciliation_summaryz1ErpFinancialMixin.get_bank_reconciliation_summaryÙ   sb  € à× Ò Ñ"Ô"ð 	 d¨D¯KªK©M¬Mð 	¸SØ�KŠKð 
ñ 
ô 
ð 
ð —L’L‘N”NˆEà�KŠKð ñ ô ð ð Ÿš™œˆJð Ø(ðð ð3	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s5   •B2ªABÂB2ÂB	ÂB2Â!B	Â"B2Â2B6Â9B6)Nr   )r   r	   r
   r   r   r   )r    )r
   r   r   r   )r   r%   )r@   r%   r   r%   )NNNNrD   )rE   r	   rF   r	   r   r	   rG   r	   r
   r   r   r   )	Ú__name__Ú
__module__Ú__qualname__r   r$   r?   rC   rK   rO   r+   r/   r   r   r   	   s³   € € € € € à:<ð<&ð <&ð <&ð <&ð <&ð|,"ð ,"ð ,"ð ,"ð ,"ð\)ð )ð )ð )ðV"ð "ð "ð "ð, !%Ø%)Ø!%Ø#Øð""ð ""ð ""ð ""ð ""ðHð ð ð ð ð r/   r   )	Ú
__future__r   ÚloggingÚtypingr   Ú	getLoggerrP   Úloggerr   r+   r/   r   ú<module>rX      s€   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ðnð nð nð nð nñ nô nð nð nð nr/   