§
    u?ºj‘  ã                  óT  — d Z ddlmZ ddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZmZ ddl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  ee¦  «                             ¦   «         j        d         Z ej        d e edz  dz  ¦  «        ¦  «        Z!dd„Z"dd„Z# G d„ d¦  «        Z$dS )zZDomain Service for Debt Ledger & Fixed Assets Synchronization (Source of Truth from MISA).é    )ÚannotationsN)ÚdateÚdatetime)ÚDecimal)ÚAny)ÚUUIDÚuuid4)ÚBasePostgresClient)ÚConsolidatedDebtOverviewÚDebtBalanceItemSchemaÚDebtLedgerResponseÚDebtReportSummaryÚFixedAssetItemSchemaÚFixedAssetResponseÚFixedAssetSummary)ÚPathé   ÚFINANCE_LEDGER_DIRÚFinanceu   Sá»• cÃ´ng ná»£ 2026Úvalr   Úreturnr   c                ó:  — t          j        | ¦  «        s#t          | ¦  «                             ¦   «         dv rt	          d¦  «        S t          | t          f¦  «        rt	          t          | ¦  «        ¦  «        S t          | t          f¦  «        r*t	          t          t          | d¦  «        ¦  «        ¦  «        S t          | ¦  «         	                    dd¦  «                             ¦   «         }	 t	          |¦  «        S # t          $ r t	          d¦  «        cY S w xY w)N©Ú ÚnanÚNoneú0.0000r   ú,r   )ÚpdÚisnaÚstrÚstripr   Ú
isinstanceÚintÚfloatÚroundÚreplaceÚ	Exception)r   Úcleaneds     úPC:\Projects\DSCons\app\modules\financial\application\debt_ledger_sync_service.pyÚ_to_decimalr+   !   sþ   € Ý	„wˆs�|„|ð !•s˜3‘x”x—~’~Ñ'Ô'Ð+>Ð>Ð>Ý�xÑ Ô Ð Ý�#��vÑÔð !Ý•s˜3‘x”xÑ Ô Ð Ý�#��xÑ Ô ð +Ý•s�5  a™=œ=Ñ)Ô)Ñ*Ô*Ð*Ý�#‰hŒh×Ò˜s BÑ'Ô'×-Ò-Ñ/Ô/€Gð!Ý�wÑÔÐøÝð !ð !ð !Ý�xÑ Ô Ð Ð Ð ð!øøøs   Ã/C> Ã>DÄDúdate | Nonec                ó  — | r#t          | ¦  «                             ¦   «         dv rd S t          | ¦  «                             ¦   «         }dD ];}	 t          j        ||¦  «                             ¦   «         c S # t
          $ r Y Œ8w xY wd S )Nr   )z%d/%m/%Yz%Y-%m-%dz%d-%m-%Y)r!   r"   r   Ústrptimer   Ú
ValueError)r   ÚsÚfmts      r*   Ú_parse_dater2   /   s�   € Øð •#�c‘(”(—.’.Ñ"Ô"Ð&9Ð9Ð9ØˆtÝˆC‰Œ�ŠÑÔ€AØ3ð ð ˆð	ÝÔ$ Q¨Ñ,Ô,×1Ò1Ñ3Ô3Ð3Ð3Ð3øÝð 	ð 	ð 	ØˆDð	øøøàˆ4s   Á&A7Á7
BÂBc                  óÜ   — e Zd ZdZd0d1d„Zd„ Zd2d
„Z	 	 d3d4d„Zd eddd¦  «        fd5d„Z	d eddd¦  «        fd5d„Z
d6d"„Zd eddd¦  «        fd5d#„Z	 d0d7d&„Z	 d8d9d+„Z	 d0d:d-„Z	 d0d;d/„ZdS )<ÚDebtLedgerSyncServicezQSynchronizes MISA accounting debt ledgers (131, 331) and fixed assets (211, 214).NÚpostgres_clientú
Any | Noner   r   c                ó0   — |pt          ¦   «         | _        d S ©N)r
   Ú_client)Úselfr5   s     r*   Ú__init__zDebtLedgerSyncService.__init__>   s   € Ø&Ð>Õ*<Ñ*>Ô*>ˆŒˆˆó    c                ó�   — t          | j        d¦  «        r| j                             ¦   «         S | j                             ¦   «         S )NÚget_connection)Úhasattrr9   r>   Ú_open_connection)r:   s    r*   Ú_get_connectionz%DebtLedgerSyncService._get_connectionA   s?   € Ý�4”<Ð!1Ñ2Ô2ð 	1Ø”<×.Ò.Ñ0Ô0Ð0ØŒ|×,Ò,Ñ.Ô.Ð.r<   r   c                óT  — |                       ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         |                     ¦   «         }|r:t	          t          |d         ¦  «        ¦  «        cddd¦  «         cddd¦  «         S |                     d¦  «         |                     ¦   «         }|r:t	          t          |d         ¦  «        ¦  «        cddd¦  «         cddd¦  «         S t          d¦  «        ‚# 1 swxY w Y   	 ddd¦  «         dS # 1 swxY w Y   dS )uF   Fetch the default company ID (CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ N).zYSELECT id FROM companies WHERE tax_code = '0202111150' OR company_code = 'DSCONS' LIMIT 1ÚidNz SELECT id FROM companies LIMIT 1uC   KhÃ´ng tÃ¬m tháº¥y CÃ´ng ty Ä�á»‹nh SÆ¡n (MST 0202111150) trong DB.)rA   ÚcursorÚexecuteÚfetchoner   r!   r/   )r:   ÚconnÚcurÚrows       r*   Úget_company_idz$DebtLedgerSyncService.get_company_idF   s  € à×!Ò!Ñ#Ô#ð 	h tØ—’‘”ð h #Ø—’Øoñô ð ð —l’l‘n”n�Øð 0Ý¥ C¨¤I¡¤Ñ/Ô/ðhð hð hð hñ hô hð hð	hð 	hð 	hð 	hñ 	hô 	hð 	hð 	hð —’Ð>Ñ?Ô?Ð?Ø—l’l‘n”n�Øð 0Ý¥ C¨¤I¡¤Ñ/Ô/ðhð hð hð hñ hô hð hð	hð 	hð 	hð 	hñ 	hô 	hð 	hð 	hõ !Ð!fÑgÔgÐgðhð hð hð høøøð hð hð hð hð hð	hð 	hð 	hñ 	hô 	hð 	hð 	hð 	hð 	hð 	hð 	hð 	høøøð 	hð 	hð 	hð 	hð 	hð 	hsH   •DªADÁ7DÂADÃDÃ5DÄD	ÄDÄD	ÄDÄD!Ä$D!FrH   r   Úpartner_coder!   Úpartner_nameÚis_customerÚboolÚ	is_vendorc                ó  — |                      ¦   «         }|                     d|f¦  «         |                     ¦   «         }|s+|                     d|f¦  «         |                     ¦   «         }|s?|r=|                     d|                      ¦   «         f¦  «         |                     ¦   «         }|s,|                     d||f¦  «         |                     ¦   «         }|rnt          t	          |d         ¦  «        ¦  «        }|d         p|}	|d         p|}
|d         p|                      ¦   «         }|                     d	|	|
||f¦  «         |S t          ¦   «         }d
|                      ¦   «                              dd¦  «                             ¦   «         › �}|                     d||||                      ¦   «         d||dd|› d�f	¦  «         |                     ¦   «         }t          t	          |d         ¦  «        ¦  «        S )zAMatches an existing partner in erp_partners or creates a new one.z_SELECT id, short_name, is_customer, is_vendor FROM erp_partners WHERE company_name = %s LIMIT 1zmSELECT id, short_name, is_customer, is_vendor FROM erp_partners WHERE LOWER(company_name) = LOWER(%s) LIMIT 1z]SELECT id, short_name, is_customer, is_vendor FROM erp_partners WHERE short_name = %s LIMIT 1a;  
                SELECT id, short_name, is_customer, is_vendor 
                FROM erp_partners 
                WHERE %s ILIKE ('%%' || company_name || '%%') 
                   OR company_name ILIKE ('%%' || %s || '%%')
                ORDER BY LENGTH(company_name) DESC
                LIMIT 1
                rC   rM   rO   Ú
short_namez®
                UPDATE erp_partners 
                SET is_customer = %s, is_vendor = %s, short_name = %s, updated_at = NOW()
                WHERE id = %s
                zMISA-ú Ú_aÛ  
            INSERT INTO erp_partners (
                id, tax_code, company_name, short_name, 
                partner_category, is_customer, is_vendor, status, notes
            )
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
            ON CONFLICT (tax_code) DO UPDATE 
            SET is_customer = EXCLUDED.is_customer OR erp_partners.is_customer,
                is_vendor = EXCLUDED.is_vendor OR erp_partners.is_vendor
            RETURNING id
            ÚorganizationÚactiveu2   Ä�á»“ng bá»™ tá»« Sá»• cÃ´ng ná»£ MISA 2026 (MÃ£: ú))r"   rE   rF   r   r!   r	   r'   Úupper)r:   rH   rK   rL   rM   rO   Ú
clean_namerI   Ú
partner_idÚnew_is_custÚnew_is_vendÚ	new_shortÚgen_idÚgenerated_tax_codeÚress                  r*   Ú_match_or_create_partnerz.DebtLedgerSyncService._match_or_create_partnerW   sI  € ð "×'Ò'Ñ)Ô)ˆ
ð 	�ŠØmØˆMñ	
ô 	
ð 	
ð �lŠl‰nŒnˆð ð 	!Ø�KŠKØØ�ñô ð ð —,’,‘.”.ˆCð ð 	!�|ð 	!Ø�KŠKØoØ×#Ò#Ñ%Ô%Ð'ñô ð ð —,’,‘.”.ˆCð ð 	!Ø�KŠKðð ˜ZÐ(ñ
ô 
ð 
ð —,’,‘.”.ˆCàð 	Ý�c # d¤)™nœnÑ-Ô-ˆJà˜mÔ,Ð;°ˆKØ˜kÔ*Ð7¨iˆKØ˜LÔ)ÐA¨\×-?Ò-?Ñ-AÔ-AˆIØ�KŠKðð
 ˜k¨9°jÐAñô ð ð Ðõ ‘”ˆàU \×%7Ò%7Ñ%9Ô%9×%AÒ%AÀ#ÀsÑ%KÔ%K×%QÒ%QÑ%SÔ%SÐUÐUÐØ�Šð
ð Ø"ØØ×"Ò"Ñ$Ô$ØØØØØTÀ\ÐTÐTÐTð
ñ	
ô 	
ð 	
ð0 �lŠl‰nŒnˆÝ•C˜˜Dœ	‘N”NÑ#Ô#Ð#r<   éê  é   é   ÚfilepathÚ
company_idúUUID | NoneÚ
as_of_dater   údict[str, Any]c                óV	  — t           j                             |¦  «        st          d|› �¦  «        ‚|p|                      ¦   «         }t          j        |dd¬¦  «        }g }d}i }t          t          |¦  «        ¦  «        D �][}	t          j	        |j
        |	         d         ¦  «        r2t          |j
        |	         d         ¦  «                             ¦   «         nd}
|
dk    rÂd}t          |j
        |	         d	         ¦  «        t          |j
        |	         d
         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        dœ} �n9|	dk    �r0|
�r-t          j	        |j
        |	         d         ¦  «        r2t          |j
        |	         d         ¦  «                             ¦   «         n|
}|                     |
|ddt          |j
        |	         d	         ¦  «        t          |j
        |	         d
         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        dœ
¦  «         �Œ]|st          d¦  «        ‚t!          d„ |D ¦   «         t#          d¦  «        ¦  «        }t!          d„ |D ¦   «         t#          d¦  «        ¦  «        }||d         k    s||d         k    rt          d|› d|d         › �¦  «        ‚t           j                             |¦  «        }d}|                      ¦   «         5 }|                     ¦   «         5 }|D ]–}|                      ||d         |d         d¬¦  «        }|d         |d         z
  }|                     d |||d         |d         ddd!d"d#||d$         |d%         |d&         |d'         |d         |d         ||d(f¦  «         |dz  }Œ—|                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   d)|d||d         |d         d*œS )+z.Ingests TK 131 Accounts Receivable from Excel.õ   File khÃ´ng tá»“n táº¡i: r   N©Ú
sheet_nameÚheaderFr   õ   Tá»•ng cá»™ngTr   é   é   é   é   é   ©Úopening_debitÚopening_creditÚperiod_debitÚperiod_creditÚclosing_debitÚclosing_credité   é   Ú131Ú
receivable©
rK   rL   Úaccount_codeÚ	debt_typeru   rv   rw   rx   ry   rz   u?   KhÃ´ng tÃ¬m tháº¥y dÃ²ng 'Tá»•ng cá»™ng' trong file pháº£i thu.c              3  ó&   K  — | ]}|d          V — ŒdS ©ry   N© ©Ú.0Úrs     r*   ú	<genexpr>z9DebtLedgerSyncService.sync_receivables.<locals>.<genexpr>ð   ó'   è è € Ð!FÐ!F¸ ! OÔ"4Ð!FÐ!FÐ!FÐ!FÐ!FÐ!Fr<   Ú0c              3  ó&   K  — | ]}|d          V — ŒdS ©rz   Nr„   r…   s     r*   rˆ   z9DebtLedgerSyncService.sync_receivables.<locals>.<genexpr>ñ   ó(   è è € Ð"HÐ"H¸1 1Ð%5Ô#6Ð"HÐ"HÐ"HÐ"HÐ"HÐ"Hr<   ry   rz   uA   Lá»‡ch sá»‘ liá»‡u Tá»•ng há»£p Pháº£i thu: TÃ­nh toÃ¡n DÆ° Ná»£ ú
 != Excel rK   rL   )rK   rL   rM   áî  
                        INSERT INTO erp_debt_balances (
                            company_id, partner_id, partner_code, partner_name,
                            account_code, debt_type, fiscal_year, period_type, period_name, as_of_date,
                            opening_debit_vnd, opening_credit_vnd,
                            period_debit_vnd, period_credit_vnd,
                            closing_debit_vnd, closing_credit_vnd,
                            net_closing_balance_vnd, source_file, raw_metadata, updated_at
                        )
                        VALUES (
                            %s, %s, %s, %s,
                            %s, %s, %s, %s, %s, %s,
                            %s, %s,
                            %s, %s,
                            %s, %s,
                            %s, %s, %s, NOW()
                        )
                        ON CONFLICT (company_id, account_code, partner_code, as_of_date) DO UPDATE
                        SET partner_id = EXCLUDED.partner_id,
                            partner_name = EXCLUDED.partner_name,
                            opening_debit_vnd = EXCLUDED.opening_debit_vnd,
                            opening_credit_vnd = EXCLUDED.opening_credit_vnd,
                            period_debit_vnd = EXCLUDED.period_debit_vnd,
                            period_credit_vnd = EXCLUDED.period_credit_vnd,
                            closing_debit_vnd = EXCLUDED.closing_debit_vnd,
                            closing_credit_vnd = EXCLUDED.closing_credit_vnd,
                            net_closing_balance_vnd = EXCLUDED.net_closing_balance_vnd,
                            source_file = EXCLUDED.source_file,
                            updated_at = NOW()
                        ra   ÚquarterúQ1.2026ru   rv   rw   rx   ú{}Úsuccess©ÚstatusÚfiler€   Úrecords_countÚtotal_closing_debit_vndÚtotal_closing_credit_vnd©ÚosÚpathÚexistsÚFileNotFoundErrorrJ   r   Ú
read_excelÚrangeÚlenÚnotnaÚilocr!   r"   r+   Úappendr/   Úsumr   ÚbasenamerA   rD   r`   rE   Úcommit©r:   rd   re   rg   ÚcidÚdfÚrecordsÚfound_totalÚexcel_totalÚidxÚcol0Úp_nameÚcalc_closing_debitÚcalc_closing_creditÚfilenameÚsaved_countrG   rH   r‡   rY   Únet_closings                        r*   Úsync_receivablesz&DebtLedgerSyncService.sync_receivables·   sX  € õ Œw�~Š~˜hÑ'Ô'ð 	LÝ#Ð$JÀÐ$JÐ$JÑKÔKÐKàÐ1˜D×/Ò/Ñ1Ô1ˆÝŒ]˜8°¸$Ð?Ñ?Ô?ˆð )+ˆØˆØ*,ˆå�˜R™œ‘>”>ð !	ñ !	ˆCÝ35´8¸B¼GÀC¼LÈ¼OÑ3LÔ3LÐT•3�r”w˜s”| A”Ñ'Ô'×-Ò-Ñ/Ô/Ð/ÐRTˆDØ�Ò&Ð&Ø"�å%0°´¸´¸a´Ñ%AÔ%AÝ&1°"´'¸#´,¸q´/Ñ&BÔ&BÝ$/°´¸´¸Q´Ñ$@Ô$@Ý%0°´¸´¸a´Ñ%AÔ%AÝ%0°´¸´¸bÔ1AÑ%BÔ%BÝ&1°"´'¸#´,¸rÔ2BÑ&CÔ&Cðð �ð ‘à�aŠx‰x˜D‰xõ ”x ¤¨¤¨Q¤Ñ0Ô0ð•C˜œ œ QœÑ(Ô(×.Ò.Ñ0Ô0Ð0àð ð
 —’à(,Ø(.Ø(-Ø%1Ý)4°R´W¸S´\À!´_Ñ)EÔ)EÝ*5°b´g¸c´lÀ1´oÑ*FÔ*FÝ(3°B´G¸C´LÀ´OÑ(DÔ(DÝ)4°R´W¸S´\À!´_Ñ)EÔ)EÝ)4°R´W¸S´\À"Ô5EÑ)FÔ)FÝ*5°b´g¸c´lÀ2Ô6FÑ*GÔ*Gðð ñô ð ùð ð 	`ÝÐ^Ñ_Ô_Ð_õ !Ð!FÐ!F¸gÐ!FÑ!FÔ!FÍÐPSÉÌÑUÔUÐÝ!Ð"HÐ"HÀÐ"HÑ"HÔ"HÍ'ÐRUÉ,Ì,ÑWÔWÐà +¨oÔ">Ò>Ð>Ø" kÐ2BÔ&CÒCÐCåð QÐTfð  Qð  QÐr}ð  Nô  sOð  Qð  Qñô ð õ
 ”7×#Ò# HÑ-Ô-ˆØˆØ×!Ò!Ñ#Ô#ð @	 tØ—’‘”ð ? #Ø ð =%ð =%�AØ!%×!>Ò!>ØØ%& ~Ô%6Ø%& ~Ô%6Ø$(ð	 "?ñ "ô "�Jð #$ OÔ"4°qÐ9IÔ7JÑ"J�KØ—K’Kðð>  Ø&Ø˜nÔ-Ø˜nÔ-Ø!Ø(Ø Ø%Ø%Ø&Ø˜oÔ.ØÐ.Ô/Ø˜nÔ-Ø˜oÔ.Ø˜oÔ.ØÐ.Ô/Ø'Ø$Ø ð'ñ?4ô 4ð 4ðj   1Ñ$�K�KØ—’‘”�ð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?ð@	ð @	ð @	ñ @	ô @	ð @	ð @	ð @	ð @	ð @	ð @	øøøð @	ð @	ð @	ð @	ðF  ØØ!Ø(Ø'2°?Ô'CØ(3Ð4DÔ(Eð
ð 
ð 	
ó7   Î%RÎ:B.Q4Ñ(RÑ4Q8	Ñ8RÑ;Q8	Ñ<RÒRÒRc                óV	  — t           j                             |¦  «        st          d|› �¦  «        ‚|p|                      ¦   «         }t          j        |dd¬¦  «        }g }d}i }t          t          |¦  «        ¦  «        D �][}	t          j	        |j
        |	         d         ¦  «        r2t          |j
        |	         d         ¦  «                             ¦   «         nd}
|
dk    rÂd}t          |j
        |	         d	         ¦  «        t          |j
        |	         d
         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        dœ} �n9|	dk    �r0|
�r-t          j	        |j
        |	         d         ¦  «        r2t          |j
        |	         d         ¦  «                             ¦   «         n|
}|                     |
|ddt          |j
        |	         d	         ¦  «        t          |j
        |	         d
         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        dœ
¦  «         �Œ]|st          d¦  «        ‚t!          d„ |D ¦   «         t#          d¦  «        ¦  «        }t!          d„ |D ¦   «         t#          d¦  «        ¦  «        }||d         k    s||d         k    rt          d|› d|d         › �¦  «        ‚t           j                             |¦  «        }d}|                      ¦   «         5 }|                     ¦   «         5 }|D ]–}|                      ||d         |d         d¬¦  «        }|d         |d         z
  }|                     d |||d         |d         ddd!d"d#||d$         |d%         |d&         |d'         |d         |d         ||d(f¦  «         |dz  }Œ—|                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   d)|d||d         |d         d*œS )+z+Ingests TK 331 Accounts Payable from Excel.rj   r   Nrk   Fr   rn   Tr   ro   rp   rq   rr   rs   rt   r{   r|   Ú331Úpayabler   uA   KhÃ´ng tÃ¬m tháº¥y dÃ²ng 'Tá»•ng cá»™ng' trong file pháº£i tráº£.c              3  ó&   K  — | ]}|d          V — ŒdS rƒ   r„   r…   s     r*   rˆ   z6DebtLedgerSyncService.sync_payables.<locals>.<genexpr>  r‰   r<   rŠ   c              3  ó&   K  — | ]}|d          V — ŒdS rŒ   r„   r…   s     r*   rˆ   z6DebtLedgerSyncService.sync_payables.<locals>.<genexpr>€  r�   r<   ry   rz   uB   Lá»‡ch sá»‘ liá»‡u Tá»•ng há»£p Pháº£i tráº£: TÃ­nh toÃ¡n DÆ° CÃ³ rŽ   rK   rL   )rK   rL   rO   r�   ra   r�   r‘   ru   rv   rw   rx   r’   r“   r”   rš   r¨   s                        r*   Úsync_payablesz#DebtLedgerSyncService.sync_payablesH  sT  € õ Œw�~Š~˜hÑ'Ô'ð 	LÝ#Ð$JÀÐ$JÐ$JÑKÔKÐKàÐ1˜D×/Ò/Ñ1Ô1ˆÝŒ]˜8°¸$Ð?Ñ?Ô?ˆà(*ˆØˆØ*,ˆå�˜R™œ‘>”>ð !	ñ !	ˆCÝ35´8¸B¼GÀC¼LÈ¼OÑ3LÔ3LÐT•3�r”w˜s”| A”Ñ'Ô'×-Ò-Ñ/Ô/Ð/ÐRTˆDØ�Ò&Ð&Ø"�å%0°´¸´¸a´Ñ%AÔ%AÝ&1°"´'¸#´,¸q´/Ñ&BÔ&BÝ$/°´¸´¸Q´Ñ$@Ô$@Ý%0°´¸´¸a´Ñ%AÔ%AÝ%0°´¸´¸bÔ1AÑ%BÔ%BÝ&1°"´'¸#´,¸rÔ2BÑ&CÔ&Cðð �ð ‘à�aŠx‰x˜D‰xõ ”x ¤¨¤¨Q¤Ñ0Ô0ð•C˜œ œ QœÑ(Ô(×.Ò.Ñ0Ô0Ð0àð ð
 —’à(,Ø(.Ø(-Ø%.Ý)4°R´W¸S´\À!´_Ñ)EÔ)EÝ*5°b´g¸c´lÀ1´oÑ*FÔ*FÝ(3°B´G¸C´LÀ´OÑ(DÔ(DÝ)4°R´W¸S´\À!´_Ñ)EÔ)EÝ)4°R´W¸S´\À"Ô5EÑ)FÔ)FÝ*5°b´g¸c´lÀ2Ô6FÑ*GÔ*Gðð ñô ð ùð ð 	bÝÐ`ÑaÔaÐaå Ð!FÐ!F¸gÐ!FÑ!FÔ!FÍÐPSÉÌÑUÔUÐÝ!Ð"HÐ"HÀÐ"HÑ"HÔ"HÍ'ÐRUÉ,Ì,ÑWÔWÐà +¨oÔ">Ò>Ð>Ø" kÐ2BÔ&CÒCÐCåð TÐUhð  Tð  TÐtð  AQô  uRð  Tð  Tñô ð õ ”7×#Ò# HÑ-Ô-ˆØˆØ×!Ò!Ñ#Ô#ð @	 tØ—’‘”ð ? #Ø ð =%ð =%�AØ!%×!>Ò!>ØØ%& ~Ô%6Ø%& ~Ô%6Ø"&ð	 "?ñ "ô "�Jð #$ OÔ"4°qÐ9IÔ7JÑ"J�KØ—K’Kðð>  Ø&Ø˜nÔ-Ø˜nÔ-Ø!Ø%Ø Ø%Ø%Ø&Ø˜oÔ.ØÐ.Ô/Ø˜nÔ-Ø˜oÔ.Ø˜oÔ.ØÐ.Ô/Ø'Ø$Ø ð'ñ?4ô 4ð 4ðj   1Ñ$�K�KØ—’‘”�ð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?ð@	ð @	ð @	ñ @	ô @	ð @	ð @	ð @	ð @	ð @	ð @	øøøð @	ð @	ð @	ð @	ðF  ØØ!Ø(Ø'2°?Ô'CØ(3Ð4DÔ(Eð
ð 
ð 	
r·   Ú
asset_codeÚ
asset_namec           	     ó†  — ddl }|                     d|dz   |z   ¦  «        }|rŽ|                     d¦  «                             dd¦  «                             ¦   «         }|                     dd|› d�f¦  «         |                     ¦   «         }|r"t          t          |d         ¦  «        ¦  «        S d	D ]�}||                     ¦   «         v s||                     ¦   «         v r_|                     d
d|› d�d|› d�d|› d�f¦  «         |                     ¦   «         }|r$t          t          |d         ¦  «        ¦  «        c S ŒŽdS )zDFinds matching equipment in erp_equipment by license plate or model.r   Nz15[A-Z0-9-]{3,8}rR   r   zASELECT id FROM erp_equipment WHERE license_plate ILIKE %s LIMIT 1ú%rC   )ÚPC300LCzPC200-7zPC200-6ÚSK135ÚKIAzÊ
                    SELECT id FROM erp_equipment 
                    WHERE equipment_code ILIKE %s OR equipment_name ILIKE %s OR license_plate ILIKE %s
                    LIMIT 1
                    )	ÚreÚsearchÚgroupr'   rW   rE   rF   r   r!   )	r:   rH   r¾   r¿   rÅ   Úplate_matchÚplaterI   Úmodels	            r*   Ú_match_equipmentz&DebtLedgerSyncService._match_equipmentÖ  sp  € ð 	ˆ	ˆ	ˆ	à—i’iÐ 3°ZÀ#Ñ5EÈ
Ñ5RÑSÔSˆØð 	,Ø×%Ò% aÑ(Ô(×0Ò0°°bÑ9Ô9×?Ò?ÑAÔAˆEØ�KŠKØSØ�U����ñô ð ð —,’,‘.”.ˆCØð ,Ý�C  D¤	™NœNÑ+Ô+Ð+ð Gð 	0ð 	0ˆEØ˜
×(Ò(Ñ*Ô*Ð*Ð*¨e°z×7GÒ7GÑ7IÔ7IÐ.IÐ.IØ—’ðð
 "˜�\�\�\ < u < < <°°U°°°Ð>ñô ð ð —l’l‘n”n�Øð 0Ý¥ C¨¤I¡¤Ñ/Ô/Ð/Ð/Ð/øàˆtr<   c                óX  — t           j                             |¦  «        st          d|› �¦  «        ‚|p|                      ¦   «         }t          j        |dd¬¦  «        }g }d}i }t          t          |¦  «        ¦  «        D �]}	t          j	        |j
        |	         d         ¦  «        r2t          |j
        |	         d         ¦  «                             ¦   «         nd}
|
dk    rÂd}t          |j
        |	         d	         ¦  «        t          |j
        |	         d
         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        t          |j
        |	         d         ¦  «        dœ} �nó|	dk    �rê|
�rçt          |j
        |	         d         ¦  «        pt          ddd¦  «        }t          |j
        |	         d         ¦  «        p|}t          j	        |j
        |	         d         ¦  «        r t!          |j
        |	         d         ¦  «        nd}t          j	        |j
        |	         d         ¦  «        r t!          |j
        |	         d         ¦  «        nd}|                     i d|
“dt          j	        |j
        |	         d         ¦  «        r2t          |j
        |	         d         ¦  «                             ¦   «         n|
“dt          j	        |j
        |	         d         ¦  «        r2t          |j
        |	         d         ¦  «                             ¦   «         nd“dt          j	        |j
        |	         d         ¦  «        r2t          |j
        |	         d         ¦  «                             ¦   «         nd “d!|“d"t          j	        |j
        |	         d         ¦  «        r2t          |j
        |	         d         ¦  «                             ¦   «         nd“d#|“d$|“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	        |j
        |	         d-         ¦  «        r2t          |j
        |	         d-         ¦  «                             ¦   «         nd.“d/t          j	        |j
        |	         d0         ¦  «        r2t          |j
        |	         d0         ¦  «                             ¦   «         nd1“¦  «         �Œ|st%          d2¦  «        ‚t'          d3„ |D ¦   «         t)          d4¦  «        ¦  «        }t'          d5„ |D ¦   «         t)          d4¦  «        ¦  «        }||d&         k    s||d*         k    rt%          d6|› d7|d&         › �¦  «        ‚t           j                             |¦  «        }d}|                      ¦   «         5 }|                     ¦   «         5 }|D ]Þ}|                      ||d         |d         ¦  «        }|r|                     d8|d&         |f¦  «         |                     d9||d         |d         |d         |d         |d!         |d"         |d#         |d$         |d%         |d&         |d'         |d(         |d)         |d*         |d+         |d,         |d/         d:d;|||d<f¦  «         |dz  }Œß|                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   d=|||d&         |d*         d>œS )?zFIngests TK 211, 214 Fixed Assets and Depreciation schedule from Excel.rj   r   Nrk   Fr   rn   Té
   rr   é   é   é   é   )Úoriginal_costÚdepreciable_valueÚperiod_depreciationÚaccumulated_depreciationÚnet_book_valueÚmonthly_depreciationrp   r   iè  ro   r|   r{   rq   é<   é	   r¾   r¿   Ú
asset_typeé   u   MÃ¡y mÃ³c, thiáº¿t bá»‹Ú
departmentrb   u&   CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ NÚincrease_dateÚvoucher_numberÚdepreciation_start_dateÚuseful_life_monthsÚremaining_life_monthsrÒ   rÓ   rÔ   rÕ   rÖ   r×   Úcost_accounté   Ú211Údepreciation_accounté   Ú2141u:   KhÃ´ng tÃ¬m tháº¥y dÃ²ng 'Tá»•ng cá»™ng' trong file TSCÄ�.c              3  ó&   K  — | ]}|d          V — ŒdS )rÒ   Nr„   r…   s     r*   rˆ   z:DebtLedgerSyncService.sync_fixed_assets.<locals>.<genexpr>E  s'   è è € ÐBÐB°Q˜a Ô0ÐBÐBÐBÐBÐBÐBr<   rŠ   c              3  ó&   K  — | ]}|d          V — ŒdS )rÖ   Nr„   r…   s     r*   rˆ   z:DebtLedgerSyncService.sync_fixed_assets.<locals>.<genexpr>F  s(   è è € ÐCÐC°a˜aÐ 0Ô1ÐCÐCÐCÐCÐCÐCr<   u8   Lá»‡ch sá»‘ liá»‡u Sá»• TSCÄ�: TÃ­nh toÃ¡n NguyÃªn giÃ¡ rŽ   zØ
                            UPDATE erp_equipment 
                            SET purchase_cost_vnd = COALESCE(NULLIF(purchase_cost_vnd, 0), %s)
                            WHERE id = %s
                            aŸ
  
                        INSERT INTO erp_fixed_assets (
                            company_id, asset_code, asset_name, asset_type, department,
                            increase_date, voucher_number, depreciation_start_date,
                            useful_life_months, remaining_life_months,
                            original_cost_vnd, depreciable_value_vnd,
                            period_depreciation_vnd, accumulated_depreciation_vnd,
                            net_book_value_vnd, monthly_depreciation_vnd,
                            cost_account, depreciation_account,
                            fiscal_year, period_name, as_of_date,
                            matched_equipment_id, source_file, raw_metadata, updated_at
                        )
                        VALUES (
                            %s, %s, %s, %s, %s,
                            %s, %s, %s,
                            %s, %s,
                            %s, %s,
                            %s, %s,
                            %s, %s,
                            %s, %s,
                            %s, %s, %s,
                            %s, %s, %s, NOW()
                        )
                        ON CONFLICT (company_id, asset_code, as_of_date) DO UPDATE
                        SET asset_name = EXCLUDED.asset_name,
                            asset_type = EXCLUDED.asset_type,
                            department = EXCLUDED.department,
                            increase_date = EXCLUDED.increase_date,
                            voucher_number = EXCLUDED.voucher_number,
                            depreciation_start_date = EXCLUDED.depreciation_start_date,
                            useful_life_months = EXCLUDED.useful_life_months,
                            remaining_life_months = EXCLUDED.remaining_life_months,
                            original_cost_vnd = EXCLUDED.original_cost_vnd,
                            depreciable_value_vnd = EXCLUDED.depreciable_value_vnd,
                            period_depreciation_vnd = EXCLUDED.period_depreciation_vnd,
                            accumulated_depreciation_vnd = EXCLUDED.accumulated_depreciation_vnd,
                            net_book_value_vnd = EXCLUDED.net_book_value_vnd,
                            monthly_depreciation_vnd = EXCLUDED.monthly_depreciation_vnd,
                            cost_account = EXCLUDED.cost_account,
                            depreciation_account = EXCLUDED.depreciation_account,
                            matched_equipment_id = EXCLUDED.matched_equipment_id,
                            source_file = EXCLUDED.source_file,
                            updated_at = NOW()
                        ra   r‘   r’   r“   )r•   r–   Úassets_countÚtotal_original_cost_vndÚtotal_net_book_value_vnd)r›   rœ   r�   rž   rJ   r   rŸ   r    r¡   r¢   r£   r!   r"   r+   r2   r   r$   r¤   r/   r¥   r   r¦   rA   rD   rË   rE   r§   )r:   rd   re   rg   r©   rª   r«   r¬   r­   r®   r¯   Úinc_dateÚ	dep_startÚuseful_mÚrem_mÚcalc_orig_costÚcalc_net_valuer³   r´   rG   rH   r‡   Úmatched_eq_ids                          r*   Úsync_fixed_assetsz'DebtLedgerSyncService.sync_fixed_assets÷  sV  € õ Œw�~Š~˜hÑ'Ô'ð 	LÝ#Ð$JÀÐ$JÐ$JÑKÔKÐKàÐ1˜D×/Ò/Ñ1Ô1ˆÝŒ]˜8°¸$Ð?Ñ?Ô?ˆà(*ˆØˆØ*,ˆå�˜R™œ‘>”>ð 8	ñ 8	ˆCÝ35´8¸B¼GÀC¼LÈ¼OÑ3LÔ3LÐT•3�r”w˜s”| A”Ñ'Ô'×-Ò-Ñ/Ô/Ð/ÐRTˆDØ�Ò&Ð&Ø"�å%0°´¸´¸bÔ1AÑ%BÔ%BÝ)4°R´W¸S´\À"Ô5EÑ)FÔ)FÝ+6°r´w¸s´|ÀBÔ7GÑ+HÔ+HÝ0;¸B¼GÀC¼LÈÔ<LÑ0MÔ0MÝ&1°"´'¸#´,¸rÔ2BÑ&CÔ&CÝ,7¸¼À¼ÀRÔ8HÑ,IÔ,Iðð �ð ‘à�aŠx‰x˜D‰xÝ& r¤w¨s¤|°A¤Ñ7Ô7ÐK½4ÀÀaÈÑ;KÔ;K�Ý'¨¬°¬°Q¬Ñ8Ô8ÐD¸H�	å,.¬H°R´W¸S´\À!´_Ñ,EÔ,EÐM•C˜œ œ QœÑ(Ô(Ð(È2ð õ -/¬H°R´W¸S´\À!´_Ñ,EÔ,EÐL•C˜œ œ QœÑ(Ô(Ð(È1ð ð —’ðØ$ dðà$Ýœ8 B¤G¨C¤L°¤OÑ4Ô4ð'"¥c¨"¬'°#¬,°q¬/Ñ&:Ô&:×&@Ò&@Ñ&BÔ&BÐ&Bà!ð	ð
 %Ýœ8 B¤G¨C¤L°¤OÑ4Ô4ð'7¥c¨"¬'°#¬,°q¬/Ñ&:Ô&:×&@Ò&@Ñ&BÔ&BÐ&Bà6ðð %Ýœ8 B¤G¨C¤L°¤OÑ4Ô4ð'F¥c¨"¬'°#¬,°q¬/Ñ&:Ô&:×&@Ò&@Ñ&BÔ&BÐ&BàEðð (¨ðð )Ýœ8 B¤G¨C¤L°¤OÑ4Ô4ð+"­#¨b¬g°c¬l¸1¬oÑ*>Ô*>×*DÒ*DÑ*FÔ*FÐ*Fà!ðð 2°9ðð  -¨hð!ð" 0°ð#ð$ (­°R´W¸S´\À"Ô5EÑ)FÔ)Fð%ð& ,­[¸¼À¼ÀbÔ9IÑ-JÔ-Jð'ð( .­{¸2¼7À3¼<ÈÔ;KÑ/LÔ/Lð)ð* 3µKÀÄÈÄÈRÔ@PÑ4QÔ4Qð+ð, )­+°b´g¸c´lÀ2Ô6FÑ*GÔ*Gð-ð. /µ¸B¼GÀC¼LÈÔ<LÑ0MÔ0Mð/ð0 'Ýœ8 B¤G¨C¤L°Ô$4Ñ5Ô5ð)#­¨B¬G°C¬L¸Ô,<Ñ(=Ô(=×(CÒ(CÑ(EÔ(EÐ(Eà"ð5ð6 /Ýœ8 B¤G¨C¤L°Ô$4Ñ5Ô5ð1$µ°B´G¸C´LÀÔ4DÑ0EÔ0E×0KÒ0KÑ0MÔ0MÐ0Mà#ð;ñ ô  ð  ùðD ð 	[ÝÐYÑZÔZÐZåÐBÐB¸'ÐBÑBÔBÅGÈCÁLÄLÑQÔQˆÝÐCÐC¸7ÐCÑCÔCÅWÈSÁ\Ä\ÑRÔRˆà˜k¨/Ô:Ò:Ð:Ø Ð-=Ô!>Ò>Ð>åð DÈ>ð  Dð  DÐepð  rAô  fBð  Dð  Dñô ð õ ”7×#Ò# HÑ-Ô-ˆØˆØ×!Ò!Ñ#Ô#ð Z	 tØ—’‘”ð Y #Ø ð W%ð W%�AØ$(×$9Ò$9Ø˜Q˜|œ_¨a°¬oñ%ô %�Mð %ð ØŸšð ð
 ˜Ô/°Ð?ñô ð ð —K’Kð+ðZ  Ø˜lœOØ˜lœOØ˜lœOØ˜lœOØ˜oÔ.ØÐ.Ô/ØÐ7Ô8ØÐ2Ô3ØÐ5Ô6Ø˜oÔ.ØÐ1Ô2ØÐ3Ô4ØÐ8Ô9ØÐ.Ô/ØÐ4Ô5Ø˜nÔ-ØÐ4Ô5Ø Ø%Ø&Ø)Ø$Ø ð1ñ[Gô Gð GðP   1Ñ$�K�KØ—’‘”�ðsYð Yð Yñ Yô Yð Yð Yð Yð Yð Yð Yøøøð Yð Yð Yð YðZ	ð Z	ð Z	ñ Z	ô Z	ð Z	ð Z	ð Z	ð Z	ð Z	ð Z	øøøð Z	ð Z	ð Z	ð Z	ðz  ØØ'Ø'2°?Ô'CØ(3Ð4DÔ(Eð
ð 
ð 	
s7   Ù^Ù4C6]6Ý*^Ý6]:	Ý:^Ý=]:	Ý>^Þ^Þ^Úfolder_pathú
str | Nonec                ó¼  — |pt           }t          j                             |¦  «        st	          d|› �¦  «        ‚|                      ¦   «         }i }t          j                             |d¦  «        }t          j                             |¦  «        r|                      ||¬¦  «        |d<   t          j                             |d¦  «        }t          j                             |¦  «        r|  	                    ||¬¦  «        |d<   t          j                             |d¦  «        }t          j                             |¦  «        r|  
                    ||¬¦  «        |d<   |S )	z9Synchronizes all 3 Excel files from the MISA 2026 folder.u   ThÆ° má»¥c khÃ´ng tá»“n táº¡i: z'Tong_hop_cong_no_phai_thu 31.3.2026.xls)re   Úreceivablesz'Tong_hop_cong_no_phai_tra 31.3.2026.xlsÚpayableszSo_tai_san_co_dinh Q1.2026.xlsÚfixed_assets)ÚDEFAULT_FINANCE_FOLDERr›   rœ   ÚisdirÚNotADirectoryErrorrJ   Újoinr�   r¶   r½   rô   )r:   rõ   Úfolderr©   ÚresultsÚf_thuÚf_traÚf_tss           r*   Úsync_all_from_folderz*DebtLedgerSyncService.sync_all_from_folderµ  s<  € ð Ð6Õ 6ˆÝŒw�}Š}˜VÑ$Ô$ð 	QÝ$Ð%OÀvÐ%OÐ%OÑPÔPÐPà×!Ò!Ñ#Ô#ˆØ"$ˆõ ”—’˜VÐ%NÑOÔOˆÝŒ7�>Š>˜%Ñ Ô ð 	RØ%)×%:Ò%:¸5ÈSÐ%:Ñ%QÔ%QˆG�MÑ"õ ”—’˜VÐ%NÑOÔOˆÝŒ7�>Š>˜%Ñ Ô ð 	LØ"&×"4Ò"4°UÀsÐ"4Ñ"KÔ"KˆG�JÑõ Œw�|Š|˜FÐ$DÑEÔEˆÝŒ7�>Š>˜$ÑÔð 	SØ&*×&<Ò&<¸TÈcÐ&<Ñ&RÔ&RˆG�NÑ#àˆr<   r}   r€   r,   r   c                óÔ  — |pt          ddd¦  «        }|dk    rdnd}|                      ¦   «         5 }|                     ¦   «         5 }|                     d||f¦  «         |                     ¦   «         }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   d	„ |D ¦   «         }t          t          |¦  «        t          d
„ |D ¦   «         t          d¦  «        ¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        ¬¦  «        }	t          ||d||	|¬¦  «        S )z,Queries stored debt balances for an account.ra   rb   rc   r}   r~   rº   a­  
                    SELECT id, company_id, partner_id, partner_code, partner_name,
                           account_code, debt_type, fiscal_year, period_type, period_name, as_of_date,
                           opening_debit_vnd, opening_credit_vnd,
                           period_debit_vnd, period_credit_vnd,
                           closing_debit_vnd, closing_credit_vnd,
                           net_closing_balance_vnd, source_file, raw_metadata,
                           created_at, updated_at
                    FROM erp_debt_balances
                    WHERE account_code = %s AND as_of_date = %s
                    ORDER BY partner_code ASC
                    Nc                ó&   — g | ]}t          d i |¤Ž‘ŒS ©r„   )r   r…   s     r*   ú
<listcomp>z@DebtLedgerSyncService.get_debt_ledger_report.<locals>.<listcomp>ë  s'   € Ð:Ð:Ð:°Õ&Ð+Ð+¨Ð+Ð+Ð:Ð:Ð:r<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úopening_debit_vnd©r†   Úis     r*   rˆ   z?DebtLedgerSyncService.get_debt_ledger_report.<locals>.<genexpr>î  ó%   è è € Ð(LÐ(LÀ¨Ô)<Ð(LÐ(LÐ(LÐ(LÐ(LÐ(Lr<   r   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úopening_credit_vndr  s     r*   rˆ   z?DebtLedgerSyncService.get_debt_ledger_report.<locals>.<genexpr>ï  ó%   è è € Ð)NÐ)NÀ1¨!Ô*>Ð)NÐ)NÐ)NÐ)NÐ)NÐ)Nr<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úperiod_debit_vndr  s     r*   rˆ   z?DebtLedgerSyncService.get_debt_ledger_report.<locals>.<genexpr>ð  s%   è è € Ð'JÐ'J¸q¨Ô(:Ð'JÐ'JÐ'JÐ'JÐ'JÐ'Jr<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úperiod_credit_vndr  s     r*   rˆ   z?DebtLedgerSyncService.get_debt_ledger_report.<locals>.<genexpr>ñ  r  r<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úclosing_debit_vndr  s     r*   rˆ   z?DebtLedgerSyncService.get_debt_ledger_report.<locals>.<genexpr>ò  r  r<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úclosing_credit_vndr  s     r*   rˆ   z?DebtLedgerSyncService.get_debt_ledger_report.<locals>.<genexpr>ó  r  r<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Únet_closing_balance_vndr  s     r*   rˆ   z?DebtLedgerSyncService.get_debt_ledger_report.<locals>.<genexpr>ô  s%   è è € Ð&PÐ&PÀQ qÔ'@Ð&PÐ&PÐ&PÐ&PÐ&PÐ&Pr<   )Útotal_partnersÚtotal_opening_debit_vndÚtotal_opening_credit_vndÚtotal_period_debit_vndÚtotal_period_credit_vndr˜   r™   Útotal_net_closing_vndr‘   )r€   r�   Úperiod_namerg   ÚsummaryÚitems)
r   rA   rD   rE   Úfetchallr   r¡   r¥   r   r   )
r:   r€   rg   Útarget_dater�   rG   rH   Úrowsr#  r"  s
             r*   Úget_debt_ledger_reportz,DebtLedgerSyncService.get_debt_ledger_reportÑ  sˆ  € ð !Ð5¥D¨¨q°"Ñ$5Ô$5ˆØ$0°EÒ$9Ð$9�L�L¸yˆ	à×!Ò!Ñ#Ô#ð 	& tØ—’‘”ð & #Ø—’ðð " ;Ð/ñô ð ð —|’|‘~”~�ð!&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð& ;Ð:°TÐ:Ñ:Ô:ˆÝ#Ý˜u™:œ:Ý$'Ð(LÐ(LÀeÐ(LÑ(LÔ(LÍgÐV^ÑN_ÔN_Ñ$`Ô$`Ý%(Ð)NÐ)NÈÐ)NÑ)NÔ)NÕPWÐX`ÑPaÔPaÑ%bÔ%bÝ#&Ð'JÐ'JÀEÐ'JÑ'JÔ'JÍGÐT\ÑL]ÔL]Ñ#^Ô#^Ý$'Ð(LÐ(LÀeÐ(LÑ(LÔ(LÍgÐV^ÑN_ÔN_Ñ$`Ô$`Ý$'Ð(LÐ(LÀeÐ(LÑ(LÔ(LÍgÐV^ÑN_ÔN_Ñ$`Ô$`Ý%(Ð)NÐ)NÈÐ)NÑ)NÔ)NÕPWÐX`ÑPaÔPaÑ%bÔ%bÝ"%Ð&PÐ&PÈ%Ð&PÑ&PÔ&PÕRYÐZbÑRcÔRcÑ"dÔ"dð	
ñ 	
ô 	
ˆõ "Ø%ØØ!Ø"ØØð
ñ 
ô 
ð 	
s5   ²BÁ-B Á4BÂ B	ÂBÂB	ÂBÂBÂBr   c                ón  — |pt          ddd¦  «        }|                      ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     ¦   «         }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   d„ |D ¦   «         }t          t          |¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        t          d	„ |D ¦   «         t          d¦  «        ¦  «        t          d
„ |D ¦   «         t          d¦  «        ¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        t          d„ |D ¦   «         t          d¦  «        ¦  «        ¬¦  «        }t          d|||¬¦  «        S )z6Queries stored fixed assets and depreciation schedule.ra   rb   rc   aj  
                    SELECT id, company_id, asset_code, asset_name, asset_type, department,
                           increase_date, voucher_number, depreciation_start_date,
                           useful_life_months, remaining_life_months,
                           original_cost_vnd, depreciable_value_vnd,
                           period_depreciation_vnd, accumulated_depreciation_vnd,
                           net_book_value_vnd, monthly_depreciation_vnd,
                           cost_account, depreciation_account,
                           fiscal_year, period_name, as_of_date,
                           matched_equipment_id, source_file, raw_metadata,
                           created_at, updated_at
                    FROM erp_fixed_assets
                    WHERE as_of_date = %s
                    ORDER BY increase_date ASC
                    Nc                ó&   — g | ]}t          d i |¤Ž‘ŒS r  )r   r…   s     r*   r  zADebtLedgerSyncService.get_fixed_assets_report.<locals>.<listcomp>  s'   € Ð9Ð9Ð9¨qÕ%Ð*Ð*¨Ð*Ð*Ð9Ð9Ð9r<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úoriginal_cost_vndr  s     r*   rˆ   z@DebtLedgerSyncService.get_fixed_assets_report.<locals>.<genexpr>  r  r<   r   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Údepreciable_value_vndr  s     r*   rˆ   z@DebtLedgerSyncService.get_fixed_assets_report.<locals>.<genexpr>   s%   è è € Ð,TÐ,TÈ¨QÔ-DÐ,TÐ,TÐ,TÐ,TÐ,TÐ,Tr<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úperiod_depreciation_vndr  s     r*   rˆ   z@DebtLedgerSyncService.get_fixed_assets_report.<locals>.<genexpr>!  s%   è è € Ð.XÐ.XÈQ¨qÔ/HÐ.XÐ.XÐ.XÐ.XÐ.XÐ.Xr<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úaccumulated_depreciation_vndr  s     r*   rˆ   z@DebtLedgerSyncService.get_fixed_assets_report.<locals>.<genexpr>"  s&   è è € Ð3bÐ3bÐWX°AÔ4RÐ3bÐ3bÐ3bÐ3bÐ3bÐ3br<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Únet_book_value_vndr  s     r*   rˆ   z@DebtLedgerSyncService.get_fixed_assets_report.<locals>.<genexpr>#  r  r<   c              3  ó$   K  — | ]}|j         V — Œd S r8   )Úmonthly_depreciation_vndr  s     r*   rˆ   z@DebtLedgerSyncService.get_fixed_assets_report.<locals>.<genexpr>$  s%   è è € Ð/ZÐ/ZÈq°Ô0JÐ/ZÐ/ZÐ/ZÐ/ZÐ/ZÐ/Zr<   )Útotal_assetsrë   Útotal_depreciable_value_vndÚtotal_period_depreciation_vndÚ"total_accumulated_depreciation_vndrì   Útotal_monthly_depreciation_vndr‘   )r!  rg   r"  r#  )
r   rA   rD   rE   r$  r   r¡   r¥   r   r   )r:   rg   r%  rG   rH   r&  r#  r"  s           r*   Úget_fixed_assets_reportz-DebtLedgerSyncService.get_fixed_assets_report   sL  € ð !Ð5¥D¨¨q°"Ñ$5Ô$5ˆà×!Ò!Ñ#Ô#ð 	& tØ—’‘”ð & #Ø—’ðð !�Nñ!ô ð ð$ —|’|‘~”~�ð'&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð, :Ð9°DÐ9Ñ9Ô9ˆÝ#Ý˜U™œÝ$'Ð(LÐ(LÀeÐ(LÑ(LÔ(LÍgÐV^ÑN_ÔN_Ñ$`Ô$`Ý(+Ð,TÐ,TÈeÐ,TÑ,TÔ,TÕV]Ð^fÑVgÔVgÑ(hÔ(hÝ*-Ð.XÐ.XÐRWÐ.XÑ.XÔ.XÕZaÐbjÑZkÔZkÑ*lÔ*lÝ/2Ð3bÐ3bÐ\aÐ3bÑ3bÔ3bÕdkÐltÑduÔduÑ/vÔ/vÝ%(Ð)NÐ)NÈÐ)NÑ)NÔ)NÕPWÐX`ÑPaÔPaÑ%bÔ%bÝ+.Ð/ZÐ/ZÐTYÐ/ZÑ/ZÔ/ZÕ\cÐdlÑ\mÔ\mÑ+nÔ+nð
ñ 
ô 
ˆõ "Ø!Ø"ØØð	
ñ 
ô 
ð 	
s4   ¨B½,A5Á)BÁ5A9	Á9BÁ<A9	Á=BÂBÂBr   c           
     ód  — |pt          ddd¦  «        }|                      d|¦  «        }|                      d|¦  «        }|                      |¦  «        }|j        j        |j        j        z
  }|j        j        |j        j        z
  }||z
  }t          |d|j        |j        |j        |||¬¦  «        S )z5Consolidates Receivables, Payables, and Fixed Assets.ra   rb   rc   r}   r¹   r‘   )rg   r!  Úreceivables_summaryÚpayables_summaryÚfixed_assets_summaryÚ"net_working_capital_receivable_vndÚnet_working_capital_payable_vndÚnet_trade_debt_balance_vnd)r   r'  r;  r"  r˜   r™   r   )	r:   rg   r%  ÚrecÚpayÚassetsÚnet_recÚnet_payÚ	net_trades	            r*   Úget_consolidated_overviewz/DebtLedgerSyncService.get_consolidated_overview.  sÀ   € ð !Ð5¥D¨¨q°"Ñ$5Ô$5ˆØ×)Ò)¨%°Ñ=Ô=ˆØ×)Ò)¨%°Ñ=Ô=ˆØ×-Ò-¨kÑ:Ô:ˆð ”+Ô5¸¼Ô8\Ñ\ˆà”+Ô6¸¼Ô9\Ñ\ˆà˜gÑ%ˆ	å'Ø"Ø!Ø #¤Ø œ[Ø!'¤Ø/6Ø,3Ø'0ð	
ñ 	
ô 	
ð 		
r<   r8   )r5   r6   r   r   )r   r   )FF)rH   r   rK   r!   rL   r!   rM   rN   rO   rN   r   r   )rd   r!   re   rf   rg   r   r   rh   )rH   r   r¾   r!   r¿   r!   r   rf   )rõ   rö   r   rh   )r}   N)r€   r!   rg   r,   r   r   )rg   r,   r   r   )rg   r,   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   rA   rJ   r`   r   r¶   r½   rË   rô   r  r'  r;  rI  r„   r<   r*   r4   r4   ;   s±  € € € € € Ø[Ð[ð?ð ?ð ?ð ?ð ?ð/ð /ð /ð
hð hð hð hð, "Øð^$ð ^$ð ^$ð ^$ð ^$ðF #'Ø˜4  a¨Ñ,Ô,ð	O
ð O
ð O
ð O
ð O
ðh #'Ø˜4  a¨Ñ,Ô,ð	L
ð L
ð L
ð L
ð L
ð\ð ð ð ðH #'Ø˜4  a¨Ñ,Ô,ð	|
ð |
ð |
ð |
ð |
ð~ )-ðð ð ð ð ð: DHð-
ð -
ð -
ð -
ð -
ð` )-ð,
ð ,
ð ,
ð ,
ð ,
ð^ )-ð
ð 
ð 
ð 
ð 
ð 
ð 
r<   r4   )r   r   r   r   )r   r   r   r,   )%rM  Ú
__future__r   r›   r   r   Údecimalr   Útypingr   Úuuidr   r	   Úpandasr   Ú&app.core.postgres.base_pkg.base_clientr
   Úapp.models.debt_ledger_schemasr   r   r   r   r   r   r   Úpathlibr   Ú__file__ÚresolveÚparentsÚ_DEFAULT_BASE_DIRÚgetenvr!   rû   r+   r2   r4   r„   r<   r*   ú<module>r[     s¼  ðØ `Ð `à "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à Ð Ð Ð à EÐ EÐ EÐ EÐ EÐ Eðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð Ð Ð Ð Ð à�D˜‘N”N×*Ò*Ñ,Ô,Ô4°QÔ7Ð Ø"˜œØØ€CÐ˜IÑ%Ð(>Ñ>Ñ?Ô?ñô Ð ð!ð !ð !ð !ð	ð 	ð 	ð 	ðM
ð M
ð M
ð M
ð M
ñ M
ô M
ð M
ð M
ð M
r<   