§
    €šj‘Z  ã                  ó(  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZ ddlmZ ddlmZm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 ddlmZmZmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z&  G d„ de	j'        ¦  «        Z(e)dk    r e	j*        ¦   «          dS dS )a2  Unit and integration tests for Smart Debt Clearing & Auto-Settlement Engine.

Adheres strictly to Technical Director & Chief Architect Laws:
1. Strict Zero-Tolerance Synthetic Data & Real-world Data Integrity.
2. Automated Regression Gate: 100% Passed.
3. Clean Teardown: No test residue left in database.
é    )ÚannotationsN)Údate)ÚDecimal)ÚUUIDÚuuid4)Ú
TestClient)ÚBasePostgresClient)Ú
create_app)Úget_current_user)ÚSmartClearingService)Úcalculate_settlement_allocationÚ classify_non_invoice_transactionÚfind_subset_sum_invoicesÚmatch_by_exact_amountÚmatch_by_invoice_numberÚmatch_partner_keywordsÚstrip_accents)ÚClearingMethodÚDebtSettlementÚSettlementStatusc                  ó^   — e Zd Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
dd„Zdd„ZdS )ÚTestSmartClearingEngineÚreturnÚNonec                óØ   — t          ¦   «         | _        g | _        g | _        g | _        t          ¦   «         | _        d„ | j        j        t          <   t          | j        ¦  «        | _
        d S )Nc                 ó   — dddddœS )Nzadmin-test-idzdirector@dscons.vnÚ
superadminu   Nguyá»…n SÄ© SÆ¡n)ÚidÚemailÚroleÚ	full_name© r"   ó    úHC:\Projects\DSCons\tests\modules\financial\test_smart_clearing_engine.pyú<lambda>z/TestSmartClearingEngine.setUp.<locals>.<lambda>/   s   € Ø!Ø)Ø Ø,ð	C
ð C
€ r#   )r	   ÚclientÚcreated_settlement_idsÚcreated_invoice_idsÚcreated_tx_idsr
   ÚappÚdependency_overridesr   r   Útest_client)Úselfs    r$   ÚsetUpzTestSmartClearingEngine.setUp(   sc   € Ý(Ñ*Ô*ˆŒØ24ˆÔ#Ø/1ˆÔ Ø*,ˆÔå‘<”<ˆŒð;
ð ;
ˆŒÔ%Õ&6Ñ7õ & d¤hÑ/Ô/ˆÔÐÐr#   c                ó\  — t          | j        dd¦  «        pt          | j        dd¦  «        } |¦   «         5 }|                     ¦   «         5 }| j        r&|                     dd„ | j        D ¦   «         f¦  «         | j        r&|                     dd„ | j        D ¦   «         f¦  «         | j        r&|                     dd	„ | j        D ¦   «         f¦  «         |                     d
¦  «         |                     ¦   «          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;   Teardown dá»�n dáº¹p sáº¡ch sáº½ toÃ n bá»™ báº£n ghi test.Úget_connectionNÚ_open_connectionz4DELETE FROM erp_debt_settlements WHERE id = ANY(%s);c                ó,   — g | ]}t          |¦  «        ‘ŒS r"   ©Ústr©Ú.0Úis     r$   ú
<listcomp>z4TestSmartClearingEngine.tearDown.<locals>.<listcomp>A   s   € ÐFÐFÐF Q�#˜a™&œ&ÐFÐFÐFr#   z5DELETE FROM erp_bank_transactions WHERE id = ANY(%s);c                ó,   — g | ]}t          |¦  «        ‘ŒS r"   r3   r5   s     r$   r8   z4TestSmartClearingEngine.tearDown.<locals>.<listcomp>F   s   € Ð>Ð>Ð> Q�#˜a™&œ&Ð>Ð>Ð>r#   z,DELETE FROM erp_invoices WHERE id = ANY(%s);c                ó,   — g | ]}t          |¦  «        ‘ŒS r"   r3   r5   s     r$   r8   z4TestSmartClearingEngine.tearDown.<locals>.<listcomp>K   s   € ÐCÐCÐC Q�#˜a™&œ&ÐCÐCÐCr#   z<DELETE FROM erp_debt_settlements WHERE notes LIKE '%TEST-%';)Úgetattrr&   Úcursorr'   Úexecuter)   r(   Úcommit)r-   Úget_connÚconnÚcurs       r$   ÚtearDownz TestSmartClearingEngine.tearDown7   sÙ  € å˜4œ;Ð(8¸$Ñ?Ô?ð 
Å7ØŒKÐ+¨TñD
ô D
ˆð ˆX‰ZŒZð 	˜4Ø—’‘”ð  #ØÔ.ð Ø—K’KØNØFÐF¨$Ô*EÐFÑFÔFÐHñô ð ð Ô&ð Ø—K’KØOØ>Ð>¨$Ô*=Ð>Ñ>Ô>Ð@ñô ð ð Ô+ð Ø—K’KØFØCÐC¨$Ô*BÐCÑCÔCÐEñô ð ð
 —’ÐZÑ[Ô[Ð[Ø—’‘”�ð%ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s6   ·D!ÁB1D	Ã=D!Ä	D	ÄD!ÄD	ÄD!Ä!D%Ä(D%c                ó¸  — |                       t          dd¦  «        ¦  «         |                       t          dd¦  «        ¦  «         |                       t          dd¦  «        ¦  «         |                      t          dd¦  «        ¦  «         |                       t          t	          d¦  «        t	          d¦  «        ¦  «        ¦  «         |                      t          t	          d¦  «        t	          d	¦  «        ¦  «        ¦  «         t          d
d¬¦  «        \  }}|                       |¦  «         |                      |d¦  «         t          t	          d¦  «        t	          d¦  «        ¦  «        \  }}}|                      |t	          d¦  «        ¦  «         |                      |t	          d¦  «        ¦  «         |                      |d¦  «         t          t	          d¦  «        t	          d¦  «        ¦  «        \  }}}|                      |t	          d¦  «        ¦  «         |                      |t	          d¦  «        ¦  «         |                      |d¦  «         dS )u\   Kiá»ƒm thá»­ táº§ng Domain: cÃ¡c quy táº¯c so khá»›p vÃ  phÃ¢n bá»• sá»‘ tiá»�n gáº¡ch ná»£.zDSCons TT tien cat HD 000123Ú123z#Thanh toan SO 000456 CTY THIEN PHUCÚ456zDSCons thanh toan inv 789Ú789zDSCons chuyen khoan tam ungz50000000.0000z49000000.0000z,DSCons chuyen tien be tong Mai Hoa kien minhu4   CÃ´ng ty TNHH ThÆ°Æ¡ng máº¡i vÃ  Dá»‹ch vá»¥ Mai Hoa)ÚdescriptionÚpartner_namegffffffæ?Ú10000000Ú0ÚsettledÚ4000000Ú6000000Úpartially_paidN)	Ú
assertTruer   ÚassertFalser   r   r   ÚassertGreaterEqualr   ÚassertEqual)	r-   ÚmatchedÚscorerK   ÚremÚstatusÚsettled2Úrem2Ústatus2s	            r$   Ú test_domain_rules_clearing_logicz8TestSmartClearingEngine.test_domain_rules_clearing_logicQ   s?  € ð 	�ŠÕ/Ð0NÐPUÑVÔVÑWÔWÐWØ�ŠÕ/Ð0UÐW\Ñ]Ô]Ñ^Ô^Ð^Ø�ŠÕ/Ð0KÈUÑSÔSÑTÔTÐTØ×ÒÕ0Ð1NÐPUÑVÔVÑWÔWÐWð 	�ŠÝ!¥'¨/Ñ":Ô":½GÀOÑ<TÔ<TÑUÔUñ	
ô 	
ð 	
ð 	×ÒÝ!¥'¨/Ñ":Ô":½GÀOÑ<TÔ<TÑUÔUñ	
ô 	
ð 	
õ
 0ØFØOð
ñ 
ô 
‰ˆ�ð 	�Š˜Ñ Ô Ð Ø×Ò  sÑ+Ô+Ð+õ  ?Ý�JÑÔ¥¨Ñ!4Ô!4ñ 
ô  
Ñˆ��fð 	×Ò˜¥'¨*Ñ"5Ô"5Ñ6Ô6Ð6Ø×Ò˜�g c™lœlÑ+Ô+Ð+Ø×Ò˜ Ñ+Ô+Ð+õ #BÝ�IÑÔ¥¨
Ñ 3Ô 3ñ#
ô #
Ñˆ�$˜ð 	×Ò˜¥7¨9Ñ#5Ô#5Ñ6Ô6Ð6Ø×Ò˜�w yÑ1Ô1Ñ2Ô2Ð2Ø×Ò˜Ð"2Ñ3Ô3Ð3Ð3Ð3r#   c                óZ  — t          ¦   «         }|                     dd¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         |j        |j        z  dz  }|                      |d¦  «         |                      |j        t          d¦  «        ¦  «         dS )u]   Kiá»ƒm thá»­ quÃ©t cáº¥n trá»« hÃ ng loáº¡t á»Ÿ cháº¿ Ä‘á»™ Dry-Run trÃªn dá»¯ liá»‡u tháº­t.Téd   )Údry_runÚlimitr   g     @U@rJ   N)
r   Úbatch_auto_clearingrO   r]   ÚassertGreaterÚtotal_transactions_scannedÚmatched_countrQ   Útotal_cleared_amount_vndr   )r-   ÚserviceÚresultÚ
match_rates       r$   Ú(test_batch_clearing_dry_run_on_real_dataz@TestSmartClearingEngine.test_batch_clearing_dry_run_on_real_dataz   s£   € å&Ñ(Ô(ˆØ×,Ò,°TÀÐ,ÑEÔEˆà�Š˜œÑ'Ô'Ð'Ø×Ò˜6Ô<¸aÑ@Ô@Ð@àÔ*¨VÔ-NÑNÐRUÑUˆ
Ø×Ò 
¨DÑ1Ô1Ð1Ø×Ò˜6Ô:½GÀC¹L¼LÑIÔIÐIÐIÐIr#   c           
     ó’
  — t          ¦   «         }t          ¦   «         }t          d¦  «        }| j                             |¦  «         t	          | j        dd¦  «        pt	          | j        dd¦  «        } |¦   «         5 }|                     ¦   «         5 }|                     d¦  «         |                     ¦   «         }|r|d         }|                     dt          |¦  «        ||f¦  «         t          ¦   «         }| j
                             |¦  «         |                     dt          |¦  «        t          |¦  «        |f¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   t          ¦   «         }	|	                     |d	¬
¦  «        }
|                      t          |
¦  «        d¦  «         |
d         }| j                             |j        ¦  «         |                      |j        |¦  «         |                      |j        |¦  «         |                      |j        |¦  «         |                      |j        t,          j        ¦  «         |                      |j        t2          j        ¦  «          |¦   «         5 }|                     ¦   «         5 }|                     dt          |¦  «        f¦  «         |                     ¦   «         }|                      t          t          |d         ¦  «        ¦  «        t          d¦  «        ¦  «         |                      |d         d¦  «         |                     dt          |¦  «        f¦  «         |                     ¦   «         }|                      t          |d         ¦  «        t          |¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |	                     |j        ¦  «        }|                      |d         d¦  «          |¦   «         5 }|                     ¦   «         5 }|                     dt          |¦  «        f¦  «         |                     ¦   «         }|                      t          t          |d         ¦  «        ¦  «        |¦  «         |                      |d         d¦  «         |                     dt          |¦  «        f¦  «         |                     ¦   «         }|                      |d         ¦  «         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„   Kiá»ƒm thá»­ vÃ²ng Ä‘á»�i cáº¥n trá»« 1 giao dá»‹ch: Khá»›p ná»£ -> Giáº£m sá»‘ dÆ° hÃ³a Ä‘Æ¡n -> Há»§y cáº¥n trá»« -> Phá»¥c há»“i.z35000000.0000r0   Nr1   ú!SELECT id FROM companies LIMIT 1;r   u   
                    INSERT INTO erp_invoices (
                        id, direction, invoice_number, invoice_series,
                        issue_date, seller_name, seller_tax_code,
                        buyer_name, buyer_tax_code,
                        total_amount_vnd, remaining_amount_vnd, payment_status,
                        xml_hash_sha256, notes
                    )
                    VALUES (%s, 'input', '999988', '1C26TDS', '2026-05-10',
                            'CÃ´ng ty TNHH ThÃ©p Viá»‡t Nháº­t TEST', '0202999999',
                            'CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ N', '0202111150',
                            %s, %s, 'unpaid',
                            'hash_test_999988_sha256', 'TEST-INVOICE');
                    u¿  
                    INSERT INTO erp_bank_transactions (
                        id, company_id, bank_name, account_number, account_name,
                        transaction_date, reference_number, direction, amount,
                        description, transaction_category, source_file
                    )
                    VALUES (
                        %s, %s, 'ACB', '13456888888', 'CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ N',
                        '2026-05-15', 'REF-TEST-9988', 'outflow', %s,
                        'Dinh Son chuyen khoan thanh toan tien thep theo HD 999988 Viet Nhat',
                        'SUPPLIER_PAYMENT', 'TEST_ACB.xlsx'
                    );
                    F©r]   é   r   zLSELECT remaining_amount_vnd, payment_status FROM erp_invoices WHERE id = %s;Úremaining_amount_vndrJ   Úpayment_statusrK   zCSELECT matched_invoice_id FROM erp_bank_transactions WHERE id = %s;Úmatched_invoice_idrV   ÚsuccessÚunpaid)r   r   r(   Úappendr;   r&   r<   r=   Úfetchoner4   r)   r>   r   Úreconcile_single_transactionrR   Úlenr'   r   Úbank_transaction_idÚ
invoice_idÚsettlement_amount_vndÚclearing_methodr   ÚEXACT_INVOICE_NOrV   r   ÚSETTLEDÚreverse_settlementÚassertIsNone)r-   Útest_inv_idÚtest_company_idÚtest_amountr?   r@   rA   ÚrowÚ
test_tx_idrd   ÚsettlementsÚsettleÚinv_rowÚtx_rowÚrev_resÚinv_row_revÚ
tx_row_revs                    r$   Ú.test_single_transaction_lifecycle_and_reversalzFTestSmartClearingEngine.test_single_transaction_lifecycle_and_reversal†   s˜  € õ ‘g”gˆÝ™'œ'ˆÝ˜oÑ.Ô.ˆØÔ ×'Ò'¨Ñ4Ô4Ð4å˜4œ;Ð(8¸$Ñ?Ô?ð 
Å7ØŒKÐ+¨TñD
ô D
ˆð ˆX‰ZŒZð -	˜4Ø—’‘”ð , #à—’Ð?Ñ@Ô@Ð@Ø—l’l‘n”n�Øð 0Ø&)¨$¤i�Oà—’ðõ ˜Ñ%Ô% {°KÐ@ñô ð õ& #™WœW�
ØÔ#×*Ò*¨:Ñ6Ô6Ð6Ø—’ðõ ˜‘_”_¥c¨/Ñ&:Ô&:¸KÐHñô ð ð  —’‘”�ðY,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð-	ð -	ð -	ñ -	ô -	ð -	ð -	ð -	ð -	ð -	ð -	øøøð -	ð -	ð -	ð -	õ` 'Ñ(Ô(ˆØ×:Ò:¸:ÈuÐ:ÑUÔUˆà×Ò�˜[Ñ)Ô)¨1Ñ-Ô-Ð-Ø˜Q”ˆØÔ#×*Ò*¨6¬9Ñ5Ô5Ð5à×Ò˜Ô3°ZÑ@Ô@Ð@Ø×Ò˜Ô*¨KÑ8Ô8Ð8Ø×Ò˜Ô5°{ÑCÔCÐCØ×Ò˜Ô/µÔ1PÑQÔQÐQØ×Ò˜œÕ(8Ô(@ÑAÔAÐAð ˆX‰ZŒZð 	V˜4Ø—’‘”ð V #Ø—’ØbÝ˜Ñ%Ô%Ð'ñô ð ð Ÿ,š,™.œ.�Ø× Ò ¥­¨WÐ5KÔ-LÑ)MÔ)MÑ!NÔ!NÕPWÐX[ÑP\ÔP\Ñ]Ô]Ð]Ø× Ò  Ð)9Ô!:¸IÑFÔFÐFð —’ØYÝ˜‘_”_Ð&ñô ð ð Ÿš™œ�Ø× Ò ¥ VÐ,@Ô%AÑ!BÔ!BÅCÈÑDTÔDTÑUÔUÐUðVð Vð Vñ Vô Vð Vð Vð Vð Vð Vð Vøøøð Vð Vð Vð Vð	Vð 	Vð 	Vñ 	Vô 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vøøøð 	Vð 	Vð 	Vð 	Vð& ×,Ò,¨V¬YÑ7Ô7ˆØ×Ò˜ Ô*¨IÑ6Ô6Ð6ð ˆX‰ZŒZð 	D˜4Ø—’‘”ð D #Ø—’ØbÝ˜Ñ%Ô%Ð'ñô ð ð "Ÿlšl™nœn�Ø× Ò ¥­¨[Ð9OÔ-PÑ)QÔ)QÑ!RÔ!RÐT_Ñ`Ô`Ð`Ø× Ò  Ð-=Ô!>ÀÑIÔIÐIð —’ØYÝ˜‘_”_Ð&ñô ð ð !Ÿ\š\™^œ^�
Ø×!Ò! *Ð-AÔ"BÑCÔCÐCðDð Dð Dñ Dô Dð Dð Dð Dð Dð Dð Døøøð Dð Dð Dð Dð	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dð 	Dð 	Ds¥   Á<E=ÂC	E&ÅE=Å&E*	Å*E=Å-E*	Å.E=Å=FÆFÊOÊ1DOÎ7OÏO	ÏOÏ
O	ÏOÏOÏ!OÐ%T<Ð:CT$ÔT<Ô$T(	Ô(T<Ô+T(	Ô,T<Ô<U ÕU c                óœ  — t          dd¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         t          dd¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         t          d	d¬¦  «        }|                      |j        ¦  «         |                      |j        d
¦  «         t          dd¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         t          dd¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         t          dd¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         t          dd¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         t          dd¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         dS )uk   Kiá»ƒm thá»­ táº§ng Domain: Nháº­n diá»‡n vÃ  Ä‘á»‹nh khoáº£n dÃ²ng tiá»�n phi hÃ³a Ä‘Æ¡n theo chuáº©n VAS.z&Details  THU PHI DICH VU BSMS THANG 05Úoutflow)Ú	directionÚ642ÚNON_INVOICE_VAS_JOURNALzTRA LAI SO DU THANG 05/2026ÚinflowÚ515z&Details  NTDT+KB NOP THUE GTGT Q1/2026Ú333z&Details  DONG BHXH T05.2026 CHO DSCONSÚ3383z/Details  CHI LUONG VA TAM UNG TIEN AN CONG NHANÚ334z/CTY RANG DONG THANH TOAN TIEN HANG CTY DINH SONÚ131z#CTY TNHH XAY DUNG DINH SON RUT TIENÚ111z#NGUYEN SI SON#031090010018#NOP TK##Ú3388N)r   rO   rS   rR   Úaccount_coderx   )	r-   Úfee_resÚinterest_resÚtax_resÚbhxh_resÚpayroll_resÚinvestor_resÚcash_resÚcapital_ress	            r$   Ú&test_non_invoice_domain_classificationz>TestSmartClearingEngine.test_non_invoice_domain_classificationø   s@  € õ 3Ð3[ÐgpÐqÑqÔqˆØ�Š˜œÑ(Ô(Ð(Ø×Ò˜Ô-¨uÑ5Ô5Ð5Ø×Ò˜Ô0Ð2KÑLÔLÐLõ 8Ð8UÐaiÐjÑjÔjˆØ�Š˜Ô,Ñ-Ô-Ð-Ø×Ò˜Ô2°EÑ:Ô:Ð:õ 3Ð3[ÐgpÐqÑqÔqˆØ�Š˜œÑ(Ô(Ð(Ø×Ò˜Ô-¨uÑ5Ô5Ð5õ 4Ð4\ÐhqÐrÑrÔrˆØ�Š˜Ô(Ñ)Ô)Ð)Ø×Ò˜Ô.°Ñ7Ô7Ð7õ 7Ð7hÐt}Ð~Ñ~Ô~ˆØ�Š˜Ô+Ñ,Ô,Ð,Ø×Ò˜Ô1°5Ñ9Ô9Ð9õ 8Ð8iÐu}Ð~Ñ~Ô~ˆØ�Š˜Ô,Ñ-Ô-Ð-Ø×Ò˜Ô2°EÑ:Ô:Ð:õ 4Ð4YÐenÐoÑoÔoˆØ�Š˜Ô(Ñ)Ô)Ð)Ø×Ò˜Ô.°Ñ6Ô6Ð6õ 7Ð7\ÐhpÐqÑqÔqˆØ�Š˜Ô+Ñ,Ô,Ð,Ø×Ò˜Ô1°6Ñ:Ô:Ð:Ð:Ð:r#   c           	     óB  — t          ¦   «         ddt          d¦  «        dœt          ¦   «         ddt          d¦  «        dœt          ¦   «         ddt          d¦  «        dœt          ¦   «         ddt          d	¦  «        dœg}t          t          d	¦  «        |d
d¬¦  «        }|                      |¦  «         |                      t          |¦  «        d¦  «         t          d„ |D ¦   «         ¦  «        }|                      |t          d	¦  «        ¦  «         t          t          d¦  «        |d
d¬¦  «        }|                      |¦  «         |                      t          |¦  «        d¦  «         t          t          d¦  «        |d
¬¦  «        }|                      |¦  «         dS )u]   Kiá»ƒm thá»­ thuáº­t toÃ¡n Subset-Sum Matching: GhÃ©p 1 UNC cho nhiá»�u hÃ³a Ä‘Æ¡n cÃ¹ng NCC.Ú
0202111111zNCC AÚ15000000)r   Úseller_tax_codeÚseller_namerl   Ú20000000rI   Ú
0202999999zNCC BÚ35000000é   )Ú	max_comboÚpartner_filteré   c              3  óZ   K  — | ]&}t          t          |d          ¦  «        ¦  «        V — Œ'dS )rl   N)r   r4   )r6   Úitems     r$   ú	<genexpr>zKTestSmartClearingEngine.test_subset_sum_domain_algorithm.<locals>.<genexpr>0  s8   è è € ÐQÐQÀ4•G�C Ð%;Ô <Ñ=Ô=Ñ>Ô>ÐQÐQÐQÐQÐQÐQr#   Ú45000000é   Ú99000000)rª   N)r   r   r   ÚassertIsNotNonerR   rt   Úsumr|   )r-   ÚinvoicesÚcomboÚtotalÚcombo3Ú
combo_nones         r$   Ú test_subset_sum_domain_algorithmz8TestSmartClearingEngine.test_subset_sum_domain_algorithm#  sÎ  € õ ‘7”7¨|ÈGÕmtÐuñ  nAô  nAð  Bð  BÝ‘7”7¨|ÈGÕmtÐuñ  nAô  nAð  Bð  BÝ‘7”7¨|ÈGÕmtÐuñ  nAô  nAð  Bð  BÝ‘7”7¨|ÈGÕmtÐuñ  nAô  nAð  Bð  Bð	
ˆõ )­°Ñ)<Ô)<¸hÐRSÐdpÐqÑqÔqˆØ×Ò˜UÑ#Ô#Ð#Ø×Ò�˜U™œ QÑ'Ô'Ð'ÝÐQÐQÈ5ÐQÑQÔQÑQÔQˆØ×Ò˜¥¨
Ñ 3Ô 3Ñ4Ô4Ð4õ *­'°*Ñ*=Ô*=¸xÐSTÐeqÐrÑrÔrˆØ×Ò˜VÑ$Ô$Ð$Ø×Ò�˜V™œ aÑ(Ô(Ð(õ .­g°jÑ.AÔ.AÀ8ÐWXÐYÑYÔYˆ
Ø×Ò˜*Ñ%Ô%Ð%Ð%Ð%r#   c           	     ó(  — t          ¦   «         }t          ¦   «         }t          d¦  «        }| j                             |¦  «         t	          | j        dd¦  «        pt	          | j        dd¦  «        } |¦   «         5 }|                     ¦   «         5 }|                     d¦  «         |                     ¦   «         }|r|d         }|                     dt          |¦  «        t          |¦  «        |f¦  «         | 
                    ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   t          ¦   «         }|                     |d¬	¦  «        }	|                      t          |	¦  «        d
¦  «         |	d         }
| j                             |
j        ¦  «         |                      |
j        d¦  «         |                      |
j        ¦  «         |                      |
j        t*          j        ¦  «         |                      |
j        |¦  «          |¦   «         5 }|                     ¦   «         5 }|                     dt          |
j        ¦  «        f¦  «         |                     ¦   «         }|                      |¦  «         |                      |d         d¦  «         |                      |d         ¦  «         |                      |d         d¦  «         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 )uZ   Kiá»ƒm thá»­ cáº¥n trá»« vÃ  lÆ°u trá»¯ DB cho bÃºt toÃ¡n phi hÃ³a Ä‘Æ¡n (LÆ°Æ¡ng TK 334).z25000000.0000r0   Nr1   ri   r   u½  
                    INSERT INTO erp_bank_transactions (
                        id, company_id, bank_name, account_number, account_name,
                        transaction_date, reference_number, direction, amount,
                        description, transaction_category, source_file
                    )
                    VALUES (
                        %s, %s, 'ACB', '13456888888', 'CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ N',
                        '2026-05-20', 'REF-TEST-PAYROLL-01', 'outflow', %s,
                        'Dinh Son chi luong va phu cap cong nhan thi cong thang 5 TEST',
                        'SALARY_PAYMENT', 'TEST_ACB.xlsx'
                    );
                    Frj   rk   r   r“   zYSELECT account_code, invoice_id, clearing_method FROM erp_debt_settlements WHERE id = %s;r—   rv   rx   rŽ   )r   r   r)   rq   r;   r&   r<   r=   rr   r4   r>   r   rs   rR   rt   r'   r   r—   r|   rv   rx   r   rŽ   rw   r³   )r-   r�   r~   r   r?   r@   rA   r€   rd   r‚   rƒ   Úrow_dbs               r$   Útest_non_invoice_db_persistencez7TestSmartClearingEngine.test_non_invoice_db_persistence<  sõ  € å‘W”Wˆ
Ý™'œ'ˆÝ˜oÑ.Ô.ˆØÔ×"Ò" :Ñ.Ô.Ð.å˜4œ;Ð(8¸$Ñ?Ô?ð 
Å7ØŒKÐ+¨TñD
ô D
ˆð ˆX‰ZŒZð 	˜4Ø—’‘”ð  #Ø—’Ð?Ñ@Ô@Ð@Ø—l’l‘n”n�Øð 0Ø&)¨$¤i�Oà—’ðõ ˜‘_”_¥c¨/Ñ&:Ô&:¸KÐHñô ð ð  —’‘”�ð-ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ2 'Ñ(Ô(ˆØ×:Ò:¸:ÈuÐ:ÑUÔUˆà×Ò�˜[Ñ)Ô)¨1Ñ-Ô-Ð-Ø˜Q”ˆØÔ#×*Ò*¨6¬9Ñ5Ô5Ð5à×Ò˜Ô,¨eÑ4Ô4Ð4Ø×Ò˜&Ô+Ñ,Ô,Ð,Ø×Ò˜Ô/µÔ1WÑXÔXÐXØ×Ò˜Ô5°{ÑCÔCÐCð ˆX‰ZŒZð 
	W˜4Ø—’‘”ð 	W #Ø—’ØoÝ˜œ‘^”^Ð%ñô ð ð Ÿš™œ�Ø×$Ò$ VÑ,Ô,Ð,Ø× Ò  ¨Ô!7¸Ñ?Ô?Ð?Ø×!Ò! &¨Ô"6Ñ7Ô7Ð7Ø× Ò  Ð(9Ô!:Ð<UÑVÔVÐVð	Wð 	Wð 	Wñ 	Wô 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wøøøð 	Wð 	Wð 	Wð 	Wð
	Wð 
	Wð 
	Wñ 
	Wô 
	Wð 
	Wð 
	Wð 
	Wð 
	Wð 
	Wð 
	Wð 
	Wøøøð 
	Wð 
	Wð 
	Wð 
	Wð 
	Wð 
	Wsn   Á<D/ÂA;DÄD/ÄD	ÄD/ÄD	Ä D/Ä/D3Ä6D3È(LÈ=B&K/Ë#LË/K3	Ë3LË6K3	Ë7LÌLÌLc                óÊ  — t          ¦   «         }t          ¦   «         }t          ¦   «         }t          ¦   «         }t          d¦  «        }t          d¦  «        }||z   }| j                             ||g¦  «         | j                             |¦  «         t          | j        dd¦  «        pt          | j        dd¦  «        } |¦   «         5 }	|	                     ¦   «         5 }
|
 	                    d¦  «         |
 
                    ¦   «         }|r|d         }|
 	                    dt          |¦  «        ||t          |¦  «        ||f¦  «         |
 	                    d	t          |¦  «        t          |¦  «        |f¦  «         |	                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   t          ¦   «         }|                     |d
¬¦  «        }|                      t!          |¦  «        d¦  «         |D ]a}| j                             |j        ¦  «         |                      |j        t(          j        ¦  «         |                      |j        |¦  «         Œb |¦   «         5 }	|	                     ¦   «         5 }
|
 	                    dt          |¦  «        t          |¦  «        gf¦  «         |
                     ¦   «         }|D ]a}|                      t          t          |d         ¦  «        ¦  «        t          d¦  «        ¦  «         |                      |d         d¦  «         Œb	 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`   Kiá»ƒm thá»­ vÃ²ng Ä‘á»�i khá»›p gá»™p 1 UNC cho 2 hÃ³a Ä‘Æ¡n cá»§a cÃ¹ng má»™t NhÃ  cung cáº¥p.z18000000.0000z22000000.0000r0   Nr1   ri   r   uÿ  
                    INSERT INTO erp_invoices (
                        id, direction, invoice_number, invoice_series,
                        issue_date, seller_name, seller_tax_code,
                        buyer_name, buyer_tax_code,
                        total_amount_vnd, remaining_amount_vnd, payment_status,
                        xml_hash_sha256, notes
                    )
                    VALUES
                    (%s, 'input', '888801', '1C26TDS', '2026-05-11',
                     'CÃ´ng ty TNHH CÃ¡t Ä�Ã¡ SÃ´ng TEST', '0202888801',
                     'CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ N', '0202111150',
                     %s, %s, 'unpaid', 'hash_test_888801', 'TEST-COMBO-1'),
                    (%s, 'input', '888802', '1C26TDS', '2026-05-12',
                     'CÃ´ng ty TNHH CÃ¡t Ä�Ã¡ SÃ´ng TEST', '0202888801',
                     'CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ N', '0202111150',
                     %s, %s, 'unpaid', 'hash_test_888802', 'TEST-COMBO-2');
                    u¿  
                    INSERT INTO erp_bank_transactions (
                        id, company_id, bank_name, account_number, account_name,
                        transaction_date, reference_number, direction, amount,
                        description, transaction_category, source_file
                    )
                    VALUES (
                        %s, %s, 'ACB', '13456888888', 'CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ N',
                        '2026-05-16', 'REF-TEST-COMBO-40M', 'outflow', %s,
                        'Dinh Son chuyen tien thanh toan tien hang cho Cat Da Song TEST',
                        'SUPPLIER_PAYMENT', 'TEST_ACB.xlsx'
                    );
                    Frj   r¬   zQSELECT remaining_amount_vnd, payment_status FROM erp_invoices WHERE id = ANY(%s);rl   rJ   rm   rK   )r   r   r(   Úextendr)   rq   r;   r&   r<   r=   rr   r4   r>   r   rs   rR   rt   r'   r   rx   r   ÚSUBSET_SUM_INVOICESru   Úfetchall)r-   Útest_inv1_idÚtest_inv2_idr�   r~   Úamt1Úamt2Ú	total_amtr?   r@   rA   r€   rd   r‚   ÚsÚrowsÚrs                    r$   Ú*test_subset_sum_multi_invoice_db_lifecyclezBTestSmartClearingEngine.test_subset_sum_multi_invoice_db_lifecyclex  sh  € å‘w”wˆÝ‘w”wˆÝ‘W”Wˆ
Ý™'œ'ˆÝ�Ñ'Ô'ˆÝ�Ñ'Ô'ˆØ˜4‘Kˆ	àÔ ×'Ò'¨°|Ð(DÑEÔEÐEØÔ×"Ò" :Ñ.Ô.Ð.å˜4œ;Ð(8¸$Ñ?Ô?ð 
Å7ØŒKÐ+¨TñD
ô D
ˆð ˆX‰ZŒZð /	˜4Ø—’‘”ð . #Ø—’Ð?Ñ@Ô@Ð@Ø—l’l‘n”n�Øð 0Ø&)¨$¤i�Oð —’ðõ$ ˜Ñ&Ô&¨¨dµC¸Ñ4EÔ4EÀtÈTÐRñ'ô ð ð. —’ðõ ˜‘_”_¥c¨/Ñ&:Ô&:¸IÐFñô ð ð  —’‘”�ð].ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð/	ð /	ð /	ñ /	ô /	ð /	ð /	ð /	ð /	ð /	ð /	øøøð /	ð /	ð /	ð /	õb 'Ñ(Ô(ˆØ×:Ò:¸:ÈuÐ:ÑUÔUˆà×Ò�˜[Ñ)Ô)¨1Ñ-Ô-Ð-Øð 	@ð 	@ˆAØÔ'×.Ò.¨q¬tÑ4Ô4Ð4Ø×Ò˜QÔ.µÔ0RÑSÔSÐSØ×Ò˜QÔ2°JÑ?Ô?Ð?Ð?ð ˆX‰ZŒZð 		E˜4Ø—’‘”ð E #Ø—’ØgÝ˜,Ñ'Ô'­¨\Ñ):Ô):Ð;Ð=ñô ð ð —|’|‘~”~�Øð Eð E�AØ×$Ò$¥W­S°Ð3IÔ1JÑ-KÔ-KÑ%LÔ%LÍgÐVYÉlÌlÑ[Ô[Ð[Ø×$Ò$ QÐ'7Ô%8¸)ÑDÔDÐDÐDðEðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eð		Eð 		Eð 		Eñ 		Eô 		Eð 		Eð 		Eð 		Eð 		Eð 		Eð 		Eð 		Eøøøð 		Eð 		Eð 		Eð 		Eð 		Eð 		Esn   ÃF1ÃB1FÆF1ÆF	ÆF1Æ!F	Æ"F1Æ1F5Æ8F5É2MÊB,M Ì4MÍ M	ÍMÍM	ÍMÍMÍMc                óJ  — | j                              d¦  «        }|                      |j        d¦  «         |                     ¦   «         }|                      d|¦  «         |                      d|¦  «         |                      d|¦  «         | j                              dddd	d
œ¬¦  «        }|                      |j        d¦  «         |                     ¦   «         }|                      |d         d¦  «         |                      |d         ¦  «         |                      d|¦  «         | j                              d¦  «        }|                      |j        d¦  «         |                     ¦   «         }|                      |d         d¦  «         |                      d|¦  «         dS )u8   Kiá»ƒm thá»­ cÃ¡c API routes /v1/erp/finance/clearing/*.z /v1/erp/finance/clearing/summaryéÈ   Úsettlements_by_accountÚinvoices_breakdownÚunreconciled_transactionsz"/v1/erp/finance/clearing/batch-runTgš™™™™™é?é   )r]   Úmin_confidencer^   )ÚjsonrV   ro   r]   r‚   z-/v1/erp/finance/clearing/settlements?limit=10ÚdataN)r,   ÚgetrR   Ústatus_coderÒ   ÚassertInÚpostrO   )r-   Úresp_sumÚdata_sumÚ
resp_batchÚ
data_batchÚ	resp_listÚ	data_lists          r$   Útest_clearing_api_endpointsz3TestSmartClearingEngine.test_clearing_api_endpointsÎ  s•  € ð Ô#×'Ò'Ð(JÑKÔKˆØ×Ò˜Ô-¨sÑ3Ô3Ð3Ø—=’=‘?”?ˆØ�ŠÐ.°Ñ9Ô9Ð9Ø�ŠÐ*¨HÑ5Ô5Ð5Ø�ŠÐ1°8Ñ<Ô<Ð<ð Ô%×*Ò*Ø0Ø!°SÀ2ÐFÐFð +ñ 
ô 
ˆ
ð 	×Ò˜Ô/°Ñ5Ô5Ð5Ø—_’_Ñ&Ô&ˆ
Ø×Ò˜ HÔ-¨yÑ9Ô9Ð9Ø�Š˜
 9Ô-Ñ.Ô.Ð.Ø�Š�m ZÑ0Ô0Ð0ð Ô$×(Ò(Ð)XÑYÔYˆ	Ø×Ò˜Ô.°Ñ4Ô4Ð4Ø—N’NÑ$Ô$ˆ	Ø×Ò˜ 8Ô,¨iÑ8Ô8Ð8Ø�Š�f˜iÑ(Ô(Ð(Ð(Ð(r#   N)r   r   )Ú__name__Ú
__module__Ú__qualname__r.   rB   rZ   rg   r‰   r    rº   r½   rÊ   rÞ   r"   r#   r$   r   r   '   sù   € € € € € ð0ð 0ð 0ð 0ðð ð ð ð4'4ð '4ð '4ð '4ðR
Jð 
Jð 
Jð 
JðpDð pDð pDð pDðd);ð );ð );ð );ðV&ð &ð &ð &ð2:Wð :Wð :Wð :WðxTEð TEð TEð TEðl)ð )ð )ð )ð )ð )r#   r   Ú__main__)+Ú__doc__Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚunittestÚdatetimer   Údecimalr   Úuuidr   r   Úfastapi.testclientr   Ú&app.core.postgres.base_pkg.base_clientr	   Úapp.mainr
   Ú"app.modules.auth.presentation.authr   Ú8app.modules.financial.application.smart_clearing_servicer   Ú+app.modules.financial.domain.clearing_rulesr   r   r   r   r   r   r   Ú0app.modules.financial.domain.settlement_entitiesr   r   r   ÚTestCaser   rß   Úmainr"   r#   r$   ú<module>rø      sÄ  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à )Ð )Ð )Ð )Ð )Ð )à EÐ EÐ EÐ EÐ EÐ EØ Ð Ð Ð Ð Ð Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø YÐ YÐ YÐ YÐ YÐ Yðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ðA)ð A)ð A)ð A)ð A)˜hÔ/ñ A)ô A)ð A)ðH ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr#   