§
    g~šj£@  ã                  óœ   — d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZmZ  ej        d	¦  «        Z G d
„ d¦  «        ZdS )zCPostgreSQL Repository for Debt Settlement and Bank Reconciliations.é    )ÚannotationsN)ÚDecimal)ÚAny)ÚUUID)ÚBasePostgresClient)ÚClearingMethodÚDebtSettlementÚSettlementStatusz&dscons.financial.settlement_repositoryc                  óv   — e Zd ZdZd)d*d„Zd+d	„Zd,d„Zd-d„Zd.d„Z	 d/d0d„Z		 d1d2d„Z
	 	 	 	 d3d4d%„Zd5d'„Zd6d(„ZdS )7ÚPostgresSettlementRepositoryzMInfrastructure repository managing database persistence for Debt Settlements.NÚ	db_clientú
Any | NoneÚreturnÚNonec                ó0   — |pt          ¦   «         | _        d S ©N)r   Ú_client)Úselfr   s     úPC:\Projects\DSCons\app\modules\financial\infrastructure\settlement_repository.pyÚ__init__z%PostgresSettlementRepository.__init__   s   € Ø Ð8Õ$6Ñ$8Ô$8ˆŒˆˆó    r   c                óZ   — t          | j        dd ¦  «        pt          | j        dd ¦  «        S )NÚget_connectionÚ_open_connection)Úgetattrr   )r   s    r   Ú	_get_connz&PostgresSettlementRepository._get_conn   s6   € Ý�t”|Ð%5°tÑ<Ô<ð 
ÅØŒLÐ,¨dñA
ô A
ð 	
r   Ú
settlementr	   c                óh  — |                       ¦   «         } |¦   «         5 }|                     ¦   «         5 }|j        €d}nd}d|› d�}|                     |t	          |j        ¦  «        t	          |j        ¦  «        t	          |j        ¦  «        |j        rt	          |j        ¦  «        nd|j        rt	          |j        ¦  «        nd|j	        |j
        |j        |j        |j        t          |j        t           ¦  «        r|j        j        nt	          |j        ¦  «        |j        t          |j        t(          ¦  «        r|j        j        nt	          |j        ¦  «        |j        |j        f¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |S )uM   LÆ°u trá»¯ má»™t báº£n ghi cáº¥n trá»« gáº¡ch ná»£ vÃ o erp_debt_settlements.Nz:ON CONFLICT (bank_transaction_id) WHERE invoice_id IS NULLz-ON CONFLICT (bank_transaction_id, invoice_id)aê  
                    INSERT INTO erp_debt_settlements (
                        id, company_id, bank_transaction_id, invoice_id,
                        partner_id, partner_tax_code, partner_name, account_code,
                        settlement_amount_vnd, settlement_date, clearing_method,
                        confidence_score, status, notes, created_at
                    )
                    VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                    a8   DO UPDATE SET
                        settlement_amount_vnd = EXCLUDED.settlement_amount_vnd,
                        confidence_score = EXCLUDED.confidence_score,
                        status = EXCLUDED.status,
                        notes = EXCLUDED.notes
                    RETURNING id;
                )r   ÚcursorÚ
invoice_idÚexecuteÚstrÚidÚ
company_idÚbank_transaction_idÚ
partner_idÚpartner_tax_codeÚpartner_nameÚaccount_codeÚsettlement_amount_vndÚsettlement_dateÚ
isinstanceÚclearing_methodr   ÚvalueÚconfidence_scoreÚstatusr
   ÚnotesÚ
created_atÚcommit)r   r   Úget_connÚconnÚcurÚconflict_clauseÚsqls          r   Úsave_settlementz,PostgresSettlementRepository.save_settlement   s&  € à—>’>Ñ#Ô#ˆØˆX‰ZŒZð .	˜4Ø—’‘”ð - #ØÔ(Ð0Ø&b�O�Oà&U�Oðð %ðð ð �ð —’Øå˜JœMÑ*Ô*Ý˜JÔ1Ñ2Ô2Ý˜JÔ:Ñ;Ô;Ø6@Ô6KÐU�˜JÔ1Ñ2Ô2Ð2ÐQUØ6@Ô6KÐU�˜JÔ1Ñ2Ô2Ð2ÐQUØ"Ô3Ø"Ô/Ø"Ô/Ø"Ô8Ø"Ô2å% jÔ&@Å.ÑQÔQð=˜
Ô2Ô8Ð8å  Ô!;Ñ<Ô<Ø"Ô3å% jÔ&7Õ9IÑJÔJð4˜
Ô)Ô/Ð/å  Ô!2Ñ3Ô3Ø"Ô(Ø"Ô-ð'ñô ð ð0 —’‘”�ð[-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð.	ð .	ð .	ñ .	ô .	ð .	ð .	ð .	ð .	ð .	ð .	øøøð .	ð .	ð .	ð .	ð^ Ðs5   ŸF'´EFÆF'ÆF	ÆF'ÆF	ÆF'Æ'F+Æ.F+r    r   Úsettlement_amountr   údict[str, Any]c           
     ó:  — |                       ¦   «         } |¦   «         5 }|                     ¦   «         5 }|                     dt          |¦  «        f¦  «         |                     ¦   «         }|st          d|› d�¦  «        ‚t          t          |d         pd¦  «        ¦  «        }t          t          |d         pd¦  «        ¦  «        }t          t          d¦  «        ||z
  ¦  «        }	|	t          d¦  «        k    rd}
nd	}
|                     d
|	|
t          |¦  «        f¦  «         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 )uU   Cáº­p nháº­t sá»‘ dÆ° ná»£ cÃ²n láº¡i vÃ  tráº¡ng thÃ¡i thanh toÃ¡n cá»§a hÃ³a Ä‘Æ¡n.a  
                    SELECT id, total_amount_vnd, COALESCE(remaining_amount_vnd, total_amount_vnd) AS remaining_amount_vnd, payment_status
                    FROM erp_invoices
                    WHERE id = %s
                    FOR UPDATE;
                    u   HÃ³a Ä‘Æ¡n õ    khÃ´ng tá»“n táº¡i.Útotal_amount_vndr   Úremaining_amount_vndÚ0ÚsettledÚpartially_paidap  
                    UPDATE erp_invoices
                    SET remaining_amount_vnd = %s,
                        payment_status = %s,
                        reconciliation_status = 'reconciled',
                        updated_at = NOW()
                    WHERE id = %s
                    RETURNING id, remaining_amount_vnd, payment_status;
                    N)
r   r   r!   r"   ÚfetchoneÚ
ValueErrorr   ÚmaxÚdictr3   )r   r    r:   r4   r5   r6   ÚrowÚtotalÚcurrent_remÚnew_remainingÚ
new_statusÚress               r   Úupdate_invoice_settlementz6PostgresSettlementRepository.update_invoice_settlementS   s5  € ð —>’>Ñ#Ô#ˆØˆX‰ZŒZð &	˜4Ø—’‘”ð % #Ø—’ðõ ˜‘_”_Ð&ñô ð ð —l’l‘n”n�Øð UÝ$Ð%S°:Ð%SÐ%SÐ%SÑTÔTÐTå¥ CÐ(:Ô$;Ð$@¸qÑ AÔ AÑBÔB�Ý%¥c¨#Ð.DÔ*EÐ*JÈÑ&KÔ&KÑLÔL�å #¥G¨C¡L¤L°+Ð@QÑ2QÑ RÔ R�Ø ¥G¨C¡L¤LÒ0Ð0Ø!*�J�Jà!1�Jà—’ðð # Jµ°J±´Ð@ñô ð õ ˜3Ÿ<š<™>œ>Ñ*Ô*�Ø—’‘”�ØðK%ð %ð %ð %ñ %ô %ð %ð&	ð &	ð &	ð &	ñ &	ô &	ð &	ð &	ð%ð %ð %ð %øøøð %ð %ð %ð %ð %ð&	ð &	ð &	ñ &	ô &	ð &	ð &	ð &	ð &	ð &	ð &	ð &	øøøð &	ð &	ð &	ð &	ð &	ð &	s5   ŸF´D*E7ÅFÅ7E;	Å;FÅ>E;	Å?FÆFÆFÚtransaction_idc           	     óX  — |                       ¦   «         } |¦   «         5 }|                     ¦   «         5 }|                     dt          |¦  «        t          |¦  «        f¦  «         |                     ¦   «          ddd¦  «         n# 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 matched_invoice_id trÃªn giao dá»‹ch ngÃ¢n hÃ ng.z™
                    UPDATE erp_bank_transactions
                    SET matched_invoice_id = %s
                    WHERE id = %s;
                    N)r   r   r!   r"   r3   )r   rN   r    r4   r5   r6   s         r   Úlink_bank_transaction_invoicez:PostgresSettlementRepository.link_bank_transaction_invoice€   s"  € ð —>’>Ñ#Ô#ˆØˆX‰ZŒZð 
	˜4Ø—’‘”ð 	 #Ø—’ðõ
 ˜‘_”_¥c¨.Ñ&9Ô&9Ð:ñô ð ð —’‘”�ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð 
	ð 
	s5   ŸB´ABÁ;BÂB	ÂBÂB	ÂBÂB#Â&B#é,  ÚlimitÚintÚ	directionú
str | Noneúlist[dict[str, Any]]c                óÜ  — d}g }|r|dz  }|                      |¦  «         |dz  }|                      |¦  «         |                      ¦   «         } |¦   «         5 }|                     ¦   «         5 }|                     |t	          |¦  «        ¦  «         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 )uU   Láº¥y danh sÃ¡ch cÃ¡c giao dá»‹ch ngÃ¢n hÃ ng chÆ°a Ä‘Æ°á»£c gáº¡ch ná»£ hoÃ n táº¥t.aô  
            SELECT b.id, b.company_id, b.bank_name, b.account_number, b.transaction_date,
                   b.reference_number, b.direction, b.amount, b.counterparty_name,
                   b.description, b.transaction_category, b.matched_invoice_id
            FROM erp_bank_transactions b
            LEFT JOIN (
                SELECT bank_transaction_id, SUM(settlement_amount_vnd) AS total_settled
                FROM erp_debt_settlements
                WHERE status = 'settled'
                GROUP BY bank_transaction_id
            ) s ON b.id = s.bank_transaction_id
            WHERE (s.total_settled IS NULL OR s.total_settled < b.amount)
              AND b.transaction_category NOT IN ('INTERNAL_TRANSFER', 'OWNER_DRAW_CAPITAL')
        z AND b.direction = %sz* ORDER BY b.transaction_date ASC LIMIT %s;c                ó,   — g | ]}t          |¦  «        ‘ŒS © ©rF   ©Ú.0Úrs     r   ú
<listcomp>zNPostgresSettlementRepository.get_unreconciled_transactions.<locals>.<listcomp>®   ó   € Ð8Ð8Ð8 A�˜Q™œÐ8Ð8Ð8r   N)Úappendr   r   r!   ÚtupleÚfetchall)r   rR   rT   ÚqueryÚparamsr4   r5   r6   s           r   Úget_unreconciled_transactionsz:PostgresSettlementRepository.get_unreconciled_transactions‘   sŽ  € ðˆð ˆØð 	%ØÐ,Ñ,ˆEØ�MŠM˜)Ñ$Ô$Ð$ØÐ=Ñ=ˆØ�Š�eÑÔÐà—>’>Ñ#Ô#ˆØˆX‰ZŒZð 	9˜4Ø—’‘”ð 9 #Ø—’˜E¥5¨¡=¤=Ñ1Ô1Ð1Ø8Ð8¨¯ª©¬Ð8Ñ8Ô8ð9ð 9ð 9ð 9ñ 9ô 9ð 9ð	9ð 	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9s7   ÁC!Á.ACÂ/C!ÃC	ÃC!ÃC	ÃC!Ã!C%Ã(C%ÚinputéÜ  r"   c                ób  — |dv rdnd}|                       ¦   «         } |¦   «         5 }|                     ¦   «         5 }|                     d||f¦  «         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 )uE   Láº¥y danh sÃ¡ch hÃ³a Ä‘Æ¡n cÃ²n ná»£ (unpaid hoáº·c partially_paid).)rf   Úinboundrf   ÚoutputaÉ  
                    SELECT id, direction, invoice_number, invoice_series,
                           issue_date, seller_tax_code, seller_name, buyer_tax_code,
                           buyer_name, total_amount_vnd,
                           COALESCE(remaining_amount_vnd, total_amount_vnd) AS remaining_amount_vnd,
                           payment_status
                    FROM erp_invoices
                    WHERE direction = %s
                      AND (payment_status IN ('unpaid', 'partially_paid') OR payment_status IS NULL)
                      AND COALESCE(remaining_amount_vnd, total_amount_vnd) > 0
                    ORDER BY issue_date ASC
                    LIMIT %s;
                    c                ó,   — g | ]}t          |¦  «        ‘ŒS rY   rZ   r[   s     r   r^   zDPostgresSettlementRepository.get_unpaid_invoices.<locals>.<listcomp>È   r_   r   N©r   r   r!   rb   )r   rT   rR   Údir_valr4   r5   r6   s          r   Úget_unpaid_invoicesz0PostgresSettlementRepository.get_unpaid_invoices°   sa  € ð 'Ð*>Ð>Ð>�'�'ÀHˆØ—>’>Ñ#Ô#ˆØˆX‰ZŒZð 	9˜4Ø—’‘”ð 9 #Ø—’ðð ˜eÐ$ñô ð ð  9Ð8¨¯ª©¬Ð8Ñ8Ô8ð#9ð 9ð 9ð 9ñ 9ô 9ð 9ð	9ð 	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9s4   §B$¼6BÁ2B$ÂB	ÂB$ÂB	ÂB$Â$B(Â+B(éd   r   r0   r'   Úoffsetc                ó  — d}g }|r|dz  }|                      |¦  «         |r|dz  }|                      |¦  «         |dz  }|                     ||g¦  «         |                      ¦   «         } |¦   «         5 }|                     ¦   «         5 }	|	                     |t          |¦  «        ¦  «         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 )u0   Tra cá»©u danh sÃ¡ch cÃ¡c báº£n ghi gáº¡ch ná»£.aø  
            SELECT s.id, s.company_id, s.bank_transaction_id, s.invoice_id,
                   s.partner_id, s.partner_tax_code, s.partner_name, s.account_code,
                   s.settlement_amount_vnd, s.settlement_date, s.clearing_method,
                   s.confidence_score, s.status, s.notes, s.created_at,
                   b.bank_name, b.reference_number, b.description AS tx_description,
                   i.invoice_number, i.total_amount_vnd AS invoice_total_amount,
                   i.remaining_amount_vnd AS invoice_remaining_amount
            FROM erp_debt_settlements s
            LEFT JOIN erp_bank_transactions b ON s.bank_transaction_id = b.id
            LEFT JOIN erp_invoices i ON s.invoice_id = i.id
            WHERE 1=1
        z AND s.status = %sz AND s.partner_tax_code = %sz/ ORDER BY s.created_at DESC LIMIT %s OFFSET %s;c                ó,   — g | ]}t          |¦  «        ‘ŒS rY   rZ   r[   s     r   r^   z@PostgresSettlementRepository.get_settlements.<locals>.<listcomp>î   r_   r   N)r`   Úextendr   r   r!   ra   rb   )
r   r0   r'   rR   rp   rc   rd   r4   r5   r6   s
             r   Úget_settlementsz,PostgresSettlementRepository.get_settlementsÊ   s¸  € ðˆð ˆØð 	"ØÐ)Ñ)ˆEØ�MŠM˜&Ñ!Ô!Ð!Øð 	,ØÐ3Ñ3ˆEØ�MŠMÐ*Ñ+Ô+Ð+àÐBÑBˆØ�Š�u˜f�oÑ&Ô&Ð&à—>’>Ñ#Ô#ˆØˆX‰ZŒZð 	9˜4Ø—’‘”ð 9 #Ø—’˜E¥5¨¡=¤=Ñ1Ô1Ð1Ø8Ð8¨¯ª©¬Ð8Ñ8Ô8ð9ð 9ð 9ð 9ñ 9ô 9ð 9ð	9ð 	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9s7   Á7C?ÂAC&ÃC?Ã&C*	Ã*C?Ã-C*	Ã.C?Ã?DÄDÚsettlement_idc           
     ó@  — |                       ¦   «         } |¦   «         5 }|                     ¦   «         5 }|                     dt          |¦  «        f¦  «         |                     ¦   «         }|st          d|› d�¦  «        ‚|d         dk    r*dt          |¦  «        dœcddd¦  «         cddd¦  «         S t          t          |d	         ¦  «        ¦  «        }|d
         }|d         }|rÁ|                     dt          |¦  «        f¦  «         |                     ¦   «         }	|	r‡t          t          |	d         ¦  «        ¦  «        }
t          t          |	d         ¦  «        ¦  «        }t          |
||z   ¦  «        }||
k    rdnd}|                     d||t          |¦  «        f¦  «         |                     dt          |¦  «        f¦  «         |                     dt          |¦  «        f¦  «         |                     ¦   «         d         dk    r$|                     dt          |¦  «        f¦  «         |                     ¦   «          dd|› d�t          |¦  «        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 )uN   Há»§y bÃºt toÃ¡n cáº¥n trá»« gáº¡ch ná»£ vÃ  phá»¥c há»“i sá»‘ dÆ° hÃ³a Ä‘Æ¡n.zã
                    SELECT id, invoice_id, bank_transaction_id, settlement_amount_vnd, status
                    FROM erp_debt_settlements
                    WHERE id = %s
                    FOR UPDATE;
                    u   Báº£n ghi cáº¥n trá»« r=   r0   ÚreversedÚalready_reversed)r0   r#   Nr*   r    r%   zø
                        SELECT total_amount_vnd, COALESCE(remaining_amount_vnd, 0) AS remaining_amount_vnd
                        FROM erp_invoices
                        WHERE id = %s
                        FOR UPDATE;
                        r>   r?   ÚunpaidrB   a  
                            UPDATE erp_invoices
                            SET remaining_amount_vnd = %s,
                                payment_status = %s,
                                updated_at = NOW()
                            WHERE id = %s;
                            u  
                    UPDATE erp_debt_settlements
                    SET status = 'reversed',
                        notes = COALESCE(notes, '') || ' [Ä�Ã£ há»§y cáº¥n trá»« lÃºc ' || NOW()::text || ']'
                    WHERE id = %s;
                    zÂ
                    SELECT COUNT(*) AS active_count
                    FROM erp_debt_settlements
                    WHERE bank_transaction_id = %s AND status = 'settled';
                    Úactive_countr   z«
                        UPDATE erp_bank_transactions
                        SET matched_invoice_id = NULL
                        WHERE id = %s;
                        Úsuccessu"   Ä�Ã£ há»§y bÃºt toÃ¡n gáº¡ch ná»£ u    thÃ nh cÃ´ng.)r0   Úmessager#   )	r   r   r!   r"   rC   rD   r   Úminr3   )r   ru   r4   r5   r6   ÚsettleÚsettle_amountr    Útx_idÚinvÚtotÚremÚrestored_remrK   s                 r   Úreverse_settlementz/PostgresSettlementRepository.reverse_settlementð   sç  € à—>’>Ñ#Ô#ˆØˆX‰ZŒZð U	˜4Ø—’‘”ð T #Ø—’ðõ ˜Ñ'Ô'Ð)ñô ð ð Ÿš™œ�Øð cÝ$Ð%a¸mÐ%aÐ%aÐ%aÑbÔbÐbà˜(Ô# zÒ1Ð1Ø&8ÅÀMÑ@RÔ@RÐSÐSðTð Tð Tð Tñ Tô Tð TðU	ð U	ð U	ð U	ñ U	ô U	ð U	ð U	õ$ !(­¨FÐ3JÔ,KÑ(LÔ(LÑ MÔ M�Ø# LÔ1�
ØÐ4Ô5�ð ð Ø—K’Kðõ ˜Z™œÐ*ñô ð ð Ÿ,š,™.œ.�CØð Ý%¥c¨#Ð.@Ô*AÑ&BÔ&BÑCÔC˜Ý%¥c¨#Ð.DÔ*EÑ&FÔ&FÑGÔG˜Ý'*¨3°°mÑ0CÑ'DÔ'D˜Ø1=ÀÒ1DÐ1D X XÐJZ˜
ØŸšð ð *¨:µs¸:±´ÐGñ	ô 	ð 	ð —’ðõ ˜Ñ'Ô'Ð)ñô ð ð —’ðõ
 ˜‘Z”Z�Mñô ð ð —<’<‘>”> .Ô1°QÒ6Ð6Ø—K’Kðõ
 ˜U™œ˜ñô ð ð —’‘”�à'ØaÀMÐaÐaÐaÝ˜mÑ,Ô,ðð ðaTð Tð Tð Tñ Tô Tð TðU	ð U	ð U	ð U	ñ U	ô U	ð U	ð U	ðTð Tð Tð Tøøøð Tð Tð Tð Tð TðU	ð U	ð U	ñ U	ô U	ð U	ð U	ð U	ð U	ð U	ð U	ð U	øøøð U	ð U	ð U	ð U	ð U	ð U	sB   ŸJ´A+I:ÂJÂ8F)I:É!JÉ:I>	É>JÊI>	ÊJÊJÊJc                ó$  — |                       ¦   «         } |¦   «         5 }|                     ¦   «         5 }|                     d¦  «         d„ |                     ¦   «         D ¦   «         }|                     d¦  «         d„ |                     ¦   «         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 )	uD   Tá»•ng há»£p sá»‘ liá»‡u thá»‘ng kÃª gáº¡ch ná»£ toÃ n há»‡ thá»‘ng.aY  
                    SELECT account_code,
                           COUNT(*) AS count_settlements,
                           COALESCE(SUM(settlement_amount_vnd), 0) AS total_settled_amount
                    FROM erp_debt_settlements
                    WHERE status = 'settled'
                    GROUP BY account_code;
                    c                ó:   — i | ]}|d          t          |¦  «        “ŒS )r)   rZ   r[   s     r   ú
<dictcomp>zEPostgresSettlementRepository.get_clearing_summary.<locals>.<dictcomp>Z  s%   € ÐQÐQÐQ¸Q˜a Ô/µ°a±´ÐQÐQÐQr   aÅ  
                    SELECT direction,
                           COALESCE(payment_status, 'unpaid') AS payment_status,
                           COUNT(*) AS count_invoices,
                           COALESCE(SUM(total_amount_vnd), 0) AS total_amount,
                           COALESCE(SUM(remaining_amount_vnd), 0) AS total_remaining
                    FROM erp_invoices
                    GROUP BY direction, payment_status;
                    c                ó,   — g | ]}t          |¦  «        ‘ŒS rY   rZ   r[   s     r   r^   zEPostgresSettlementRepository.get_clearing_summary.<locals>.<listcomp>h  s   € Ð%FÐ%FÐ%F°!¥d¨1¡g¤gÐ%FÐ%FÐ%Fr   ah  
                    SELECT direction, COUNT(*) AS count_tx, COALESCE(SUM(amount), 0) AS total_amount
                    FROM erp_bank_transactions
                    WHERE matched_invoice_id IS NULL
                      AND transaction_category NOT IN ('INTERNAL_TRANSFER', 'OWNER_DRAW_CAPITAL')
                    GROUP BY direction;
                    c                ó,   — g | ]}t          |¦  «        ‘ŒS rY   rZ   r[   s     r   r^   zEPostgresSettlementRepository.get_clearing_summary.<locals>.<listcomp>t  s   € Ð"CÐ"CÐ"C¨q¥4¨¡7¤7Ð"CÐ"CÐ"Cr   )Úsettlements_by_accountÚinvoices_breakdownÚunreconciled_transactionsNrl   )r   r4   r5   r6   Ú
by_accountrŒ   Úunreconciled_txs          r   Úget_clearing_summaryz1PostgresSettlementRepository.get_clearing_summaryJ  sÑ  € à—>’>Ñ#Ô#ˆØˆX‰ZŒZð -	˜4Ø—’‘”ð , #à—’ðñ	ô 	ð 	ð RÐQÀ#Ç,Â,Á.Ä.ÐQÑQÔQ�
ð —’ðñ
ô 
ð 
ð &GÐ%F°s·|²|±~´~Ð%FÑ%FÔ%FÐ"ð —’ðñô ð ð #DÐ"C°C·L²L±N´NÐ"CÑ"CÔ"C�ð /9Ø*<Ø1@ðð ðQ,ð ,ð ,ð ,ñ ,ô ,ð ,ð-	ð -	ð -	ð -	ñ -	ô -	ð -	ð -	ð,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð ,ð-	ð -	ð -	ñ -	ô -	ð -	ð -	ð -	ð -	ð -	ð -	ð -	øøøð -	ð -	ð -	ð -	ð -	ð -	s5   ŸD´BC,ÃDÃ,C0	Ã0DÃ3C0	Ã4DÄD	ÄD	r   )r   r   r   r   )r   r   )r   r	   r   r	   )r    r   r:   r   r   r;   )rN   r   r    r   r   r   )rQ   N)rR   rS   rT   rU   r   rV   )rf   rg   )rT   r"   rR   rS   r   rV   )NNro   r   )
r0   rU   r'   rU   rR   rS   rp   rS   r   rV   )ru   r   r   r;   )r   r;   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r9   rM   rP   re   rn   rt   r…   r�   rY   r   r   r   r      s  € € € € € ØWÐWð9ð 9ð 9ð 9ð 9ð
ð 
ð 
ð 
ð
2ð 2ð 2ð 2ðh+ð +ð +ð +ðZð ð ð ð$ 9=ð9ð 9ð 9ð 9ð 9ð@ 6:ð9ð 9ð 9ð 9ð 9ð8 "Ø'+ØØð$9ð $9ð $9ð $9ð $9ðLXð Xð Xð Xðt0ð 0ð 0ð 0ð 0ð 0r   r   )r”   Ú
__future__r   ÚloggingÚdecimalr   Útypingr   Úuuidr   Ú&app.core.postgres.base_pkg.base_clientr   Ú0app.modules.financial.domain.settlement_entitiesr   r	   r
   Ú	getLoggerÚloggerr   rY   r   r   ú<module>rž      sñ   ðØ IÐ Ià "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à EÐ EÐ EÐ EÐ EÐ Eðð ð ð ð ð ð ð ð ð ð 
ˆÔ	ÐCÑ	DÔ	D€ðfð fð fð fð fñ fô fð fð fð fr   