§
    všj‘=  ã                  óÈ   — d Z ddlmZ ddlZddlZddlmZ ddlmZ d+d	„Z	d,d„Z
 ed¦  «        fd-d„Z	 d.d/d„Z G d„ d¦  «        Zd ed¦  «        fd0d„Z	 	 d1d2d'„Zd3d*„ZdS )4z<Pure Domain Rules for Bank Transaction and Invoice Clearing.é    )ÚannotationsN)ÚDecimal)ÚAnyÚtextÚstrÚreturnc                ó  — | sdS |                       dd¦  «                              dd¦  «        } t          j        d| ¦  «        } d                     d„ | D ¦   «         ¦  «        } t          j        d| ¦  «                             ¦   «         S )ue   Loáº¡i bá»� dáº¥u tiáº¿ng Viá»‡t vÃ  chuáº©n hÃ³a khoáº£ng tráº¯ng Ä‘á»ƒ so khá»›p chuá»—i tin cáº­y.Ú õ   Â ú ú	ÚNFDc              3  óJ   K  — | ]}t          j        |¦  «        d k    ¯|V — ŒdS )ÚMnN)ÚunicodedataÚcategory)Ú.0Úchs     úAC:\Projects\DSCons\app\modules\financial\domain\clearing_rules.pyú	<genexpr>z strip_accents.<locals>.<genexpr>   s7   è è € ÐIÐI˜"­Ô(<¸RÑ(@Ô(@ÀDÒ(HÐ(H�2Ð(HÐ(HÐ(HÐ(HÐIÐIó    ÚNFC)Úreplacer   Ú	normalizeÚjoinÚupper)r   s    r   Ústrip_accentsr      sƒ   € àð ØˆrØ�<Š<˜ Ñ$Ô$×,Ò,¨T°3Ñ7Ô7€DÝÔ  ¨Ñ-Ô-€DØ�7Š7ÐIÐI ÐIÑIÔIÑIÔI€DÝÔ  ¨Ñ-Ô-×3Ò3Ñ5Ô5Ð5r   ÚdescriptionÚinvoice_numberÚboolc                óŒ  — | r|sdS t          | ¦  «        }t          |¦  «                             ¦   «                              d¦  «        }|sdS dt	          j        |¦  «        › d�dt	          j        |¦  «        › d�dt	          j        |¦  «        › d�dt	          j        |¦  «        › d�dt	          j        |¦  «        › d�d	t	          j        |¦  «        › d�d
t	          j        |¦  «        › d�dt	          j        t          |¦  «                             ¦   «         ¦  «        › d�g}|D ]}t	          j        ||¦  «        r dS ŒdS )uZ   Kiá»ƒm tra sá»‘ hÃ³a Ä‘Æ¡n cÃ³ xuáº¥t hiá»‡n trong ná»™i dung chuyá»ƒn khoáº£n hay khÃ´ng.FÚ0z	\bHD\s*0*z\bz	\bSO\s*0*z
\bINV\s*0*z
\bHDO\s*0*z\bHDON\s*0*z\bHOA\s*DON\s*0*z\bHDMB\s*0*T)r   r   ÚstripÚlstripÚreÚescapeÚsearch)r   r   Ú
desc_cleanÚinv_num_cleanÚpatternsÚps         r   Úmatch_by_invoice_numberr,      sj  € àð ˜nð Øˆuå˜{Ñ+Ô+€JÝ˜Ñ'Ô'×-Ò-Ñ/Ô/×6Ò6°sÑ;Ô;€MØð Øˆuð 	2•R”Y˜}Ñ-Ô-Ð1Ð1Ð1Ø1•R”Y˜}Ñ-Ô-Ð1Ð1Ð1Ø2•b”i Ñ.Ô.Ð2Ð2Ð2Ø2•b”i Ñ.Ô.Ð2Ð2Ð2Ø3•r”y Ñ/Ô/Ð3Ð3Ð3Ø8�BœI mÑ4Ô4Ð8Ð8Ð8Ø3•r”y Ñ/Ô/Ð3Ð3Ð3Ø8�bŒi�˜NÑ+Ô+×1Ò1Ñ3Ô3Ñ4Ô4Ð8Ð8Ð8ð	€Hð ð ð ˆÝŒ9�Q˜
Ñ#Ô#ð 	Ø�4�4ð	àˆ5r   r"   Ú	tx_amountr   Úinvoice_remaining_amountÚ	tolerancec                ó~   — | t          d¦  «        k    s|t          d¦  «        k    rdS t          | |z
  ¦  «        |k    S )u\   So khá»›p sá»‘ tiá»�n giao dá»‹ch chÃ­nh xÃ¡c tuyá»‡t Ä‘á»‘i vá»›i sá»‘ dÆ° ná»£ hÃ³a Ä‘Æ¡n.r"   F)r   Úabs)r-   r.   r/   s      r   Úmatch_by_exact_amountr2   1   sD   € ð •G˜C‘L”LÒ Ð Ð$<ÅÈÁÄÒ$LÐ$LØˆuÝˆyÐ3Ñ3Ñ4Ô4¸	ÒAÐAr   Úpartner_nameÚtax_codeú
str | Noneútuple[bool, float]c                ó\  ‡
— | sdS t          | ¦  «        Š
|rF|                     ¦   «         r2|                     ¦   «         }|‰
v s|                     dd¦  «        ‰
v rdS |sdS t          |¦  «        }t          j        dd|¦  «        }d„ t          j        d|¦  «        D ¦   «         }|sd	„ t          j        d|¦  «        D ¦   «         }|sdS d                     |¦  «        }|‰
v rdS ˆ
fd
„|D ¦   «         }t          |¦  «        t          |¦  «        z  }	|	dk    rdt          d|	¦  «        fS d|	fS )uF   So khá»›p tÃªn Ä‘á»‘i tÃ¡c hoáº·c MST trong diá»…n giáº£i ngÃ¢n hÃ ng.)Fg        ú-r
   )Tç      ð?zm\b(CONG TY|CO PHAN|TNHH|DOANH NGHIEP|DNTN|TMDV|THUONG MAI|DICH VU|XAY DUNG|DAU TU|SAN XUAT|MTV|CP|TM|XD|VA)\br   c                ó8   — g | ]}t          |¦  «        d k    ¯|‘ŒS ©é   ©Úlen©r   Úws     r   ú
<listcomp>z*match_partner_keywords.<locals>.<listcomp>Y   s#   € ÐEÐEÐE�A½#¸a¹&¼&À1º*¸*ˆa¸*¸*¸*r   z\w+c                ó8   — g | ]}t          |¦  «        d k    ¯|‘ŒS r;   r=   r?   s     r   rA   z*match_partner_keywords.<locals>.<listcomp>[   s#   € ÐJÐJÐJ˜½sÀ1¹v¼vÈºz¸z�!¸z¸z¸zr   c                ó   •— g | ]}|‰v ¯|‘Œ	S © rD   )r   Útr(   s     €r   rA   z*match_partner_keywords.<locals>.<listcomp>e   s   ø€ Ð;Ð;Ð;˜A¨1°
¨?¨?�a¨?¨?¨?r   g333333ã?Tr9   F)	r   r#   r   r%   ÚsubÚfindallr   r>   Úmin)r   r3   r4   Ú	clean_mstÚ
name_cleanÚ	name_coreÚtokensÚ
key_phraseÚmatched_tokensÚratior(   s             @r   Úmatch_partner_keywordsrP   <   s|  ø€ ð ð Øˆzå˜{Ñ+Ô+€Jð ð �H—N’NÑ$Ô$ð Ø—N’NÑ$Ô$ˆ	Ø˜
Ð"Ð" i×&7Ò&7¸¸RÑ&@Ô&@ÀJÐ&NÐ&NØ�9ð ð Øˆzå˜|Ñ,Ô,€Jõ ”ØxØØñô €Ið
 FÐE�œ F¨IÑ6Ô6ÐEÑEÔE€FØð KØJÐJ�RœZ¨°
Ñ;Ô;ÐJÑJÔJˆàð Øˆzð —’˜&Ñ!Ô!€JØ�ZÐÐØˆyà;Ð;Ð;Ð; Ð;Ñ;Ô;€NÝ�ÑÔ¥# f¡+¤+Ñ-€Eà�‚|€|Ø•S˜˜e‘_”_Ð$Ð$à�%ˆ<Ðr   c                  ó   — e Zd ZdZdd„ZdS )ÚNonInvoiceClassificationu6   Káº¿t quáº£ phÃ¢n loáº¡i nghiá»‡p vá»¥ phi hÃ³a Ä‘Æ¡n.Úmatchedr    Úaccount_coder   r3   Úclearing_methodÚconfidence_scorer   Únotesr   ÚNonec                óZ   — || _         || _        || _        || _        || _        || _        d S ©N©rS   rT   r3   rU   rV   rW   )ÚselfrS   rT   r3   rU   rV   rW   s          r   Ú__init__z!NonInvoiceClassification.__init__q   s6   € ð ˆŒØ(ˆÔØ(ˆÔØ.ˆÔØ 0ˆÔØˆŒ
ˆ
ˆ
r   N)rS   r    rT   r   r3   r   rU   r   rV   r   rW   r   r   rX   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r]   rD   r   r   rR   rR   n   s.   € € € € € Ø@Ð@ðð ð ð ð ð r   rR   ÚoutflowÚ	directionÚamountc                óž  ‡— | s!t          ddddt          d¦  «        d¦  «        S t          | ¦  «        Šg d¢}|dk    rHt          ˆfd„|D ¦   «         ¦  «        r-t          ddd	d
t          d¦  «        d| dd…         › �¬¦  «        S g d¢}|dk    rHt          ˆfd„|D ¦   «         ¦  «        r-t          ddd	d
t          d¦  «        d| dd…         › �¬¦  «        S g d¢}|dk    rHt          ˆfd„|D ¦   «         ¦  «        r-t          dddd
t          d¦  «        d| dd…         › �¬¦  «        S g d¢}|dk    rHt          ˆfd„|D ¦   «         ¦  «        r-t          dddd
t          d¦  «        d| dd…         › �¬¦  «        S g d ¢}|dk    rct          ˆfd!„|D ¦   «         ¦  «        }|st	          j        d"‰¦  «        rd}|r-t          dd#d$d
t          d%¦  «        d&| dd…         › �¬¦  «        S g d'¢}	|dk    rst          ˆfd(„|	D ¦   «         ¦  «        rXd)}
d*‰v sd+‰v rd,}
nd-‰v rd.}
nd/‰v rd0}
nd1‰v rd2}
nd3‰v rd4}
t          dd5|
d
t          d6¦  «        d7|
› d8| dd…         › �¬¦  «        S g d9¢}|dk    rHt          ˆfd:„|D ¦   «         ¦  «        r-t          dd;d<d=t          d>¦  «        d?| dd…         › �¬¦  «        S g d@¢}|dk    rHt          ˆfdA„|D ¦   «         ¦  «        r-t          ddBdCd
t          d¦  «        dD| dd…         › �¬¦  «        S g dE¢}|dk    rHt          ˆfdF„|D ¦   «         ¦  «        r-t          ddGdHd
t          d¦  «        dI| dd…         › �¬¦  «        S dJdKg}|dk    rHt          ˆfdL„|D ¦   «         ¦  «        r-t          ddGdMd
t          d¦  «        dN| dd…         › �¬¦  «        S t          ddddt          d¦  «        d¦  «        S )Oul   Nháº­n diá»‡n vÃ  Ä‘á»‹nh khoáº£n tá»± Ä‘á»™ng cÃ¡c dÃ²ng tiá»�n phi hÃ³a Ä‘Æ¡n theo chuáº©n káº¿ toÃ¡n VAS.Fr
   r"   )zTHU PHIzPHI NTDTÚBSMSÚSMSÚFEEzPHI DUY TRIzPHI CHUYEN TIENzPHI QLTKzPHI THUONG NIENzTHU PHI DICH VUzPHI GDrb   c              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   ©r   Úkr(   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>›   s'   øè è € Ð%QÐ%Q¸! a¨: oÐ%QÐ%QÐ%QÐ%QÐ%QÐ%Qr   TÚ642u   NgÃ¢n hÃ ng phá»¥c vá»¥ÚNON_INVOICE_VAS_JOURNALz1.0000u   PhÃ­ dá»‹ch vá»¥ ngÃ¢n hÃ ng: Néd   r[   )zTRA LAI SO DUzLAI NHAP VONzNHAN LAI TU TKzLAI TIEN GUIzLAI KHONG KY HANzTIEN LAI PHAT SINHÚinflowc              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   rj   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>®   ó'   øè è € Ð$PÐ$P¸ Q¨* _Ð$PÐ$PÐ$PÐ$PÐ$PÐ$Pr   Ú515u2   LÃ£i tiá»�n gá»­i khÃ´ng ká»³ háº¡n nháº­p vá»‘n: )
zNTDT+KBÚKBNNzNOP THUEzKHO BACz	THUE GTGTz	THUE TNDNzLE PHI MON BAIz	THUE TNCNzNOP NSNNzNGAN SACH NHA NUOCc              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   rj   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>Å   s'   øè è € Ð%LÐ%L¸! a¨: oÐ%LÐ%LÐ%LÐ%LÐ%LÐ%Lr   Ú333u(   Kho báº¡c NhÃ  nÆ°á»›c (CÆ¡ quan Thuáº¿)z0.9800u3   Ná»™p thuáº¿ vÃ o NgÃ¢n sÃ¡ch NhÃ  nÆ°á»›c / KBNN: )z	DONG BHXHzBHXH+ÚBHXHÚBHYTÚBHTNzBAO HIEM XA HOIc              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   rj   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>Ø   s'   øè è € Ð%RÐ%R¸! a¨: oÐ%RÐ%RÐ%RÐ%RÐ%RÐ%Rr   Ú3383u&   Báº£o hiá»ƒm XÃ£ há»™i TP Háº£i PhÃ²ngu+   Ä�Ã³ng Báº£o hiá»ƒm xÃ£ há»™i, BHYT, BHTN: )
zTT LUONGz	TRA LUONGz	CHI LUONGzTAM UNG TIEN ANz	CONG NHANzTHO LAI MAYz	UNG LUONGz
TIEN AN CAzPHU CAPzLUONG THANGc              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   rj   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>ð   s'   øè è € ÐCÐC¨Q˜˜j˜ÐCÐCÐCÐCÐCÐCr   z	\bLUONG\bÚ334u"   CÃ¡n bá»™ cÃ´ng nhÃ¢n viÃªn DSConsz0.9500uJ   Chi tráº£ lÆ°Æ¡ng, phá»¥ cáº¥p & tiá»�n Äƒn cÃ´ng nhÃ¢n hiá»‡n trÆ°á»�ng: )zTHUY LOI DA DOzBAN QLDAú	KIEN MINHÚVIMCú	RANG DONGÚMINATOz	GIAI NGANz
TAM UNG HDzTHANH TOAN DOTzNGAN HANG PHAT TRIENÚQLDAÚBQLúDA DOc              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   rj   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>  rq   r   u   Chá»§ Ä‘áº§u tÆ° / Ban QLDArƒ   zTHUY LOIu+   CÃ´ng ty TNHH MTV Khai thÃ¡c CTTL Ä�a Ä�á»™r}   u    CÃ´ng ty Cá»• pháº§n Kiáº¿n Minhr~   u-   Tá»•ng cÃ´ng ty HÃ ng háº£i Viá»‡t Nam (VIMC)r   u.   CÃ´ng ty Cá»• pháº§n XÃ¢y dá»±ng Ráº¡ng Ä�Ã´ngr€   u   CÃ´ng ty TNHH Minato Viá»‡t NamÚ131z0.9200u7   Thu giáº£i ngÃ¢n / táº¡m á»©ng há»£p Ä‘á»“ng tá»« CÄ�T z: )zDAT COCzTAM UNG TIEN HANGzCUOC THIET BIzTAM UNG MUAzTIEN COCzCOC THUEzTAM UNG HOP DONGzTT TIEN HANGzTRA TIEN HANGz
TT BE TONGzTT KINHÚHDMBzDON HANGzTIEN HANG LANc              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   rj   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>5  s'   øè è € Ð%PÐ%P¸! a¨: oÐ%PÐ%PÐ%PÐ%PÐ%PÐ%Pr   Ú331u7   NhÃ  cung cáº¥p (Táº¡m á»©ng / Há»£p Ä‘á»“ng kinh táº¿)ÚADVANCE_DEPOSITz0.9000uH   Táº¡m á»©ng / Ä�áº·t cá»�c / Thanh toÃ¡n HÄ�MB chÆ°a xuáº¥t hÃ³a Ä‘Æ¡n: )zRUT TIENzRUT TIEN MATzNHAP QUYc              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   rj   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>A  s'   øè è € Ð%VÐ%V¸! a¨: oÐ%VÐ%VÐ%VÐ%VÐ%VÐ%Vr   Ú111u.   Thá»§ quá»¹ DSCons (Nháº­p quá»¹ tiá»�n máº·t)uP   RÃºt tiá»�n gá»­i ngÃ¢n hÃ ng nháº­p quá»¹ tiá»�n máº·t (Ná»£ 1111 / CÃ³ 1121): )zNOP TKzNOP TIENzNOP TIEN MATz
NOP VAO TKzNGUYEN SI SONc              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   rj   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>M  s'   øè è € Ð$VÐ$V¸ Q¨* _Ð$VÐ$VÐ$VÐ$VÐ$VÐ$Vr   Ú3388u$   Nguyá»…n SÄ© SÆ¡n (Chá»§ sá»Ÿ há»¯u)uQ   Chá»§ sá»Ÿ há»¯u ná»™p tiá»�n vÃ o tÃ i khoáº£n cÃ´ng ty (Ná»£ 1121 / CÃ³ 3388): zCHUYEN NHAMzTRA LAI TIEN CHUYEN NHAMc              3  ó    •K  — | ]}|‰v V — Œ	d S rZ   rD   rj   s     €r   r   z3classify_non_invoice_transaction.<locals>.<genexpr>Y  s'   øè è € Ð%YÐ%Y¸! a¨: oÐ%YÐ%YÐ%YÐ%YÐ%YÐ%Yr   u   Ä�á»‘i tÃ¡c chuyá»ƒn nháº§mu;   HoÃ n tráº£ tiá»�n chuyá»ƒn nháº§m (Ná»£ 3388 / CÃ³ 1121): )rR   r   r   Úanyr%   r'   )r   rc   rd   Úbank_fee_keywordsÚinterest_keywordsÚtax_keywordsÚinsurance_keywordsÚpayroll_keywordsÚ
is_payrollÚinvestor_keywordsÚc_nameÚadvance_keywordsÚcash_withdraw_keywordsÚcapital_inflow_keywordsÚtransfer_mistake_keywordsr(   s                  @r   Ú classify_non_invoice_transactionrœ   ‚   s$  ø€ ð ð MÝ'¨¨r°2°r½7À3¹<¼<ÈÑLÔLÐLå˜{Ñ+Ô+€Jðð ð Ðð �IÒÐ¥#Ð%QÐ%QÐ%QÐ%QÐ?PÐ%QÑ%QÔ%QÑ"QÔ"QÐÝ'ØØØ2Ø5Ý$ XÑ.Ô.ØF°;¸tÀ¸tÔ3DÐFÐFð
ñ 
ô 
ð 	
ðð ð Ðð �HÒÐ¥Ð$PÐ$PÐ$PÐ$PÐ>OÐ$PÑ$PÔ$PÑ!PÔ!PÐÝ'ØØØ2Ø5Ý$ XÑ.Ô.ØZÀ{ÐSWÐTWÐSWÔGXÐZÐZð
ñ 
ô 
ð 	
ðð ð €Lð �IÒÐ¥#Ð%LÐ%LÐ%LÐ%L¸|Ð%LÑ%LÔ%LÑ"LÔ"LÐÝ'ØØØCØ5Ý$ XÑ.Ô.Ø[ÈÐTXÐUXÐTXÔHYÐ[Ð[ð
ñ 
ô 
ð 	
ðð ð Ðð �IÒÐ¥#Ð%RÐ%RÐ%RÐ%RÐ?QÐ%RÑ%RÔ%RÑ"RÔ"RÐÝ'ØØØAØ5Ý$ XÑ.Ô.ØSÀÈDÈSÈDÔ@QÐSÐSð
ñ 
ô 
ð 	
ðð ð Ðð �IÒÐÝÐCÐCÐCÐCÐ2BÐCÑCÔCÑCÔCˆ
Øð 	�bœi¨°jÑAÔAð 	ØˆJàð 	Ý+ØØ"ØAØ 9Ý!(¨Ñ!2Ô!2ØvÐcnÐosÐpsÐosÔctÐvÐvðñ ô ð ðð ð Ðð �HÒÐ¥Ð$PÐ$PÐ$PÐ$PÐ>OÐ$PÑ$PÔ$PÑ!PÔ!PÐØ.ˆØ�jÐ Ð  J°*Ð$<Ð$<ØBˆFˆFØ˜JÐ&Ð&Ø7ˆFˆFØ�zÐ!Ð!ØDˆFˆFØ˜JÐ&Ð&ØEˆFˆFØ˜Ð#Ð#Ø6ˆFå'ØØØØ5Ý$ XÑ.Ô.ØiÈFÐiÐiÐVaÐbfÐcfÐbfÔVgÐiÐið
ñ 
ô 
ð 	
ðð ð Ðð  �IÒÐ¥#Ð%PÐ%PÐ%PÐ%PÐ?OÐ%PÑ%PÔ%PÑ"PÔ"PÐÝ'ØØØRØ-Ý$ XÑ.Ô.ØpÐ]hÐimÐjmÐimÔ]nÐpÐpð
ñ 
ô 
ð 	
ð FÐEÐEÐØ�IÒÐ¥#Ð%VÐ%VÐ%VÐ%VÐ?UÐ%VÑ%VÔ%VÑ"VÔ"VÐÝ'ØØØIØ5Ý$ XÑ.Ô.ØxÐepÐquÐruÐquÔevÐxÐxð
ñ 
ô 
ð 	
ð dÐcÐcÐØ�HÒÐ¥Ð$VÐ$VÐ$VÐ$VÐ>UÐ$VÑ$VÔ$VÑ!VÔ!VÐÝ'ØØØ?Ø5Ý$ XÑ.Ô.ØyÐfqÐrvÐsvÐrvÔfwÐyÐyð
ñ 
ô 
ð 	
ð "/Ð0JÐ KÐØ�IÒÐ¥#Ð%YÐ%YÐ%YÐ%YÐ?XÐ%YÑ%YÔ%YÑ"YÔ"YÐÝ'ØØØ6Ø5Ý$ XÑ.Ô.ØcÐP[Ð\`Ð]`Ð\`ÔPaÐcÐcð
ñ 
ô 
ð 	
õ $ E¨2¨r°2µw¸s±|´|ÀRÑHÔHÐHr   é   Útarget_amountÚcandidate_invoicesúlist[dict[str, Any]]Ú	max_comboÚintÚpartner_filterúlist[dict[str, Any]] | Nonec           	     óˆ  — ddl m} | t          d¦  «        k    s|sdS g }|D ]e}t          t          |                     d¦  «        pd¦  «        ¦  «        }t          d¦  «        |cxk     r| k    rn ŒP|                     |¦  «         Œft          |¦  «        dk     rdS i }|D ]ñ}|                     d¦  «        p|                     d¦  «        pd	                     ¦   «         }	|                     d
¦  «        p|                     d¦  «        pd	                     ¦   «                              ¦   «         }
|	r|	n|
}|sŒ™|r-|                     ¦   «         |vr||                     ¦   «         vrŒÈ| 	                    |g ¦  «                             |¦  «         Œò| 
                    ¦   «         D ]š\  }}t          |¦  «        dk     rŒ|dd…         }t          dt          t          |¦  «        dz   |dz   ¦  «        ¦  «        D ]E} |||¦  «        D ]6}t          d„ |D ¦   «         ¦  «        }|| k    rt          |¦  «        c c c S Œ7ŒFŒ›dS )u5  TÃ¬m tá»• há»£p gá»“m k hÃ³a Ä‘Æ¡n (2 <= k <= max_combo) cÃ³ tá»•ng sá»‘ dÆ° ná»£ Ä‘Ãºng báº±ng target_amount.

    Chá»‰ ghÃ©p cÃ¡c hÃ³a Ä‘Æ¡n cÃ³ cÃ¹ng MÃ£ sá»‘ thuáº¿ Ä‘á»‘i tÃ¡c (hoáº·c tÃªn Ä‘á»‘i tÃ¡c) Ä‘á»ƒ Ä‘áº£m báº£o
    1 UNC chá»‰ thanh toÃ¡n gá»™p cho cÃ¹ng 1 NhÃ  cung cáº¥p / KhÃ¡ch hÃ ng.
    r   )Úcombinationsr"   NÚremaining_amount_vndé   Úseller_tax_codeÚbuyer_tax_coder
   Úseller_nameÚ
buyer_nameé   r<   c              3  óx   K  — | ]5}t          t          |                     d ¦  «        pd¦  «        ¦  «        V — Œ6dS )r§   r   N)r   r   Úget)r   Úitems     r   r   z+find_subset_sum_invoices.<locals>.<genexpr>”  sX   è è € ð "ð "àõ �C §¢Ð)?Ñ @Ô @Ð EÀAÑFÔFÑGÔGð"ð "ð "ð "ð "ð "r   )Ú	itertoolsr¦   r   r   r¯   Úappendr>   r#   r   Ú
setdefaultÚitemsÚrangerH   ÚsumÚlist)rž   rŸ   r¡   r£   r¦   Ú
valid_invsÚinvÚremÚpartner_groupsÚp_taxÚp_nameÚkeyÚpartner_keyÚ
group_invsÚlimited_invsrk   ÚcomboÚtotal_combos                     r   Úfind_subset_sum_invoicesrÄ   f  sÂ  € ð 'Ð&Ð&Ð&Ð&Ð&à� ™œÒ$Ð$Ð,>Ð$Øˆtð (*€JØ!ð #ð #ˆÝ•c˜#Ÿ'š'Ð"8Ñ9Ô9Ð>¸QÑ?Ô?Ñ@Ô@ˆÝ�3‰<Œ<˜#Ð.Ð.Ò.Ð. Ò.Ð.Ð.Ð.Ð.Ø×Ò˜cÑ"Ô"Ð"øå
ˆ:�„˜ÒÐØˆtð 79€NØð 7ð 7ˆØ—’Ð*Ñ+Ô+ÐN¨s¯wªwÐ7GÑ/HÔ/HÐNÈB×UÒUÑWÔWˆØ—'’'˜-Ñ(Ô(ÐG¨C¯GªG°LÑ,AÔ,AÐGÀR×NÒNÑPÔP×VÒVÑXÔXˆØÐ(ˆeˆe &ˆØð 	ØØð 	˜~×3Ò3Ñ5Ô5¸SÐ@Ð@ÀSÐP^×PdÒPdÑPfÔPfÐEfÐEfØØ×!Ò! # rÑ*Ô*×1Ò1°#Ñ6Ô6Ð6Ð6à#1×#7Ò#7Ñ#9Ô#9ð 'ð 'Ñˆ�ZÝˆz‰?Œ?˜QÒÐØð " # 2 #”ˆÝ�q�#�c ,Ñ/Ô/°!Ñ3°YÀ±]ÑCÔCÑDÔDð 	'ð 	'ˆAØ%˜ l°AÑ6Ô6ð 'ð '�Ý!ð "ð "à %ð"ñ "ô "ñ ô �ð  -Ò/Ð/Ý ™;œ;Ð&Ð&Ð&Ð&Ð&Ð&Ð&ð 0ð'ð	'ð ˆ4r   Úavailable_payment_amountútuple[Decimal, Decimal, str]c                óú   — | t          d¦  «        k    rt          d¦  «        |dfS t          | |¦  «        }||z
  }|t          d¦  «        k    rd}t          d¦  «        }n|t          d¦  «        k    rd}nd}|||fS )u›   TÃ­nh toÃ¡n sá»‘ tiá»�n gáº¡ch ná»£ vÃ  tráº¡ng thÃ¡i má»›i cá»§a hÃ³a Ä‘Æ¡n.

    Returns: (settled_amount, new_remaining_amount, new_payment_status)
    r"   ÚunpaidÚsettledÚpartially_paid)r   rH   )rÅ   r.   Úsettled_amountÚnew_remainingÚ
new_statuss        r   Úcalculate_settlement_allocationrÎ   Ÿ  s‘   € ð  ¥7¨3¡<¤<Ò/Ð/Ý�s‰|Œ|Ð5°xÐ?Ð?åÐ1Ð3KÑLÔL€NØ,¨~Ñ=€Mà� ™œÒ$Ð$Øˆ
Ý ™œˆˆØ	�' #™,œ,Ò	&Ð	&Ø%ˆ
ˆ
àˆ
à˜=¨*Ð4Ð4r   )r   r   r   r   )r   r   r   r   r   r    )r-   r   r.   r   r/   r   r   r    rZ   )r   r   r3   r   r4   r5   r   r6   )r   r   rc   r   rd   r   r   rR   )r�   N)
rž   r   rŸ   r    r¡   r¢   r£   r5   r   r¤   )rÅ   r   r.   r   r   rÆ   )ra   Ú
__future__r   r%   r   Údecimalr   Útypingr   r   r,   r2   rP   rR   rœ   rÄ   rÎ   rD   r   r   ú<module>rÒ      sd  ðØ BÐ Bà "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð6ð 6ð 6ð 6ðð ð ð ð> !˜ ™œðBð Bð Bð Bð Bð  ð/ð /ð /ð /ð /ðdð ð ð ð ñ ô ð ð, Ø�g˜c‘l”lðaIð aIð aIð aIð aIðN Ø!%ð	5ð 5ð 5ð 5ð 5ðr5ð 5ð 5ð 5ð 5ð 5r   