§
    j#ÃjB¡  ã                  óZ  — U d dl mZ 	 d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlmZ  ej        d¦  «        Z ej        d	d
¦  «        Z ej        dd¦  «                             ¦   «         dv ZddgZdZdZ G d„ d¦  «        Zdaded<   dd„Zdd„Z dS )é    )ÚannotationsN)ÚdateÚdatetimeÚ	timedelta)ÚAny)Úformat_vn_clockÚformat_vn_time)ÚBrevoEmailService)ÚInvoiceProcessingServicezdscons.invoice.auto_syncÚINVOICE_SYNC_ALERT_EMAILzcontact@dinhsonconstruction.comÚINVOICE_AUTO_SYNC_ENABLEDÚfalse©ÚtrueÚ1Úyesé   é   é   u¶   TÃ i khoáº£n Cá»•ng Tá»•ng Cá»¥c Thuáº¿ (hoadondientu.gdt.gov.vn) bá»‹ táº¡m khÃ³a do nháº­p sai nhiá»�u láº§n. Cron job tá»± Ä‘á»“ng bá»™ Ä‘ang táº¡m ngÆ°ng chá»� má»Ÿ tÃ i khoáº£n.c                  ó  — e Zd ZdZdedddedfd8d„Zed9d„¦   «         Zed:d„¦   «         Z	ed;d„¦   «         Z
ed;d„¦   «         Zed9d„¦   «         Zd<d=d„Zd>d„Zed?d„¦   «         Zd:d„Z	 	 	 d@dAd&„Z	 	 	 dBdCd,„Z	 	 	 dDdEd5„Z	 	 dFdGd6„ZdHd7„ZdS )IÚInvoiceAutoSyncSchedulerServiceuÐ   Service Ä‘iá»�u phá»‘i tá»± Ä‘á»™ng quÃ©t vÃ  Ä‘á»“ng bá»™ hÃ³a Ä‘Æ¡n theo khung giá»� Ä‘á»‹nh ká»³ (01:00 vÃ  13:00)
    kÃ¨m biÃªn Ä‘á»™ ngáº«u nhiÃªn Â±30 phÃºt Ä‘á»ƒ chá»‘ng spam vÃ  trÃ¡nh WAF cháº·n IP.NFé   TÚinvoice_serviceúInvoiceProcessingService | NoneÚalert_emailÚstrÚ	is_pausedÚboolÚpause_reasonú
str | NoneÚmax_consecutive_auth_failuresÚintÚjitter_minutesÚenable_jitterÚreturnÚNonec                ó  — |pt          ¦   «         | _        || _        g | _        d| _        d | _        d | _        || _        |p| j        rt          nd| _	        || _
        t          d|¦  «        | _        || _        d | _        d S )NFÚ r   )r   Ú_invoice_serviceÚ_alert_emailÚ_execution_historyÚ_is_runningÚ_last_run_timeÚ_last_run_statusÚ
_is_pausedÚDEFAULT_LOCKED_PAUSE_REASONÚ_pause_reasonÚ_max_consecutive_auth_failuresÚmaxÚ_jitter_minutesÚ_enable_jitterÚ_last_scheduled_slot)Úselfr   r   r   r   r!   r#   r$   s           ú]C:\Projects\DSCons\app\modules\invoices\application\invoice_processing\auto_sync_scheduler.pyÚ__init__z(InvoiceAutoSyncSchedulerService.__init__-   sš   € ð !0Ð MÕ3KÑ3MÔ3MˆÔØ'ˆÔØ8:ˆÔØ!&ˆÔØ/3ˆÔØ,0ˆÔà )ˆŒØ".ð #
Ø+/¬?ÐBÕ'Ð'Àð 	Ôð 4QˆÔ+Ý$'¨¨>Ñ$:Ô$:ˆÔØ$1ˆÔØ=AˆÔ!Ð!Ð!ó    c                ó   — | j         S ©N)r/   ©r7   s    r8   r   z)InvoiceAutoSyncSchedulerService.is_pausedG   s
   € àŒÐr:   c                ó   — | j         S r<   )r1   r=   s    r8   r   z,InvoiceAutoSyncSchedulerService.pause_reasonK   s   € àÔ!Ð!r:   c                ó   — | j         S r<   )r2   r=   s    r8   r!   z=InvoiceAutoSyncSchedulerService.max_consecutive_auth_failuresO   s   € àÔ2Ð2r:   c                ó   — | j         S r<   )r4   r=   s    r8   r#   z.InvoiceAutoSyncSchedulerService.jitter_minutesS   s   € àÔ#Ð#r:   c                ó   — | j         S r<   )r5   r=   s    r8   r$   z-InvoiceAutoSyncSchedulerService.enable_jitterW   s   € àÔ"Ð"r:   Úreasonc                óp   — d| _         |pt          | _        t                               d| j        ¦  «         dS )uY   Táº¡m ngÆ°ng tiáº¿n trÃ¬nh cháº¡y Ä‘á»‹nh ká»³ (khÃ´ng kÃ­ch hoáº¡t quÃ©t Cá»•ng Thuáº¿).TuV   â�¸ï¸� [AUTO-SYNC] Ä�Ã£ táº¡m ngÆ°ng cron job tá»± Ä‘á»“ng bá»™ hÃ³a Ä‘Æ¡n. LÃ½ do: %sN)r/   r0   r1   ÚloggerÚwarning)r7   rB   s     r8   Úpausez%InvoiceAutoSyncSchedulerService.pause[   s@   € àˆŒØ#ÐBÕ'BˆÔÝ�ŠØdØÔñ	
ô 	
ð 	
ð 	
ð 	
r:   c                óš  — d| _         d| _        	 t          | j        d¦  «        r| j                             dd¦  «         t          | j        d¦  «        r| j                             dd¦  «         t          | j        d¦  «        r| j                             dd¦  «         n# t          $ r Y nw xY wt           	                    d¦  «         d	S )
uk   KhÃ´i phá»¥c láº¡i tiáº¿n trÃ¬nh tá»± Ä‘á»™ng quÃ©t Cá»•ng Thuáº¿ sau khi tÃ i khoáº£n Ä‘Æ°á»£c má»Ÿ láº¡i.Fr(   Úclear_auth_cooldownÚ
gdt_portalÚ
0202111150Úreset_auth_failuresÚactivate_sync_configu”   â–¶ï¸� [AUTO-SYNC] Ä�Ã£ khÃ´i phá»¥c hoáº¡t Ä‘á»™ng cho cron job tá»± Ä‘á»“ng bá»™ hÃ³a Ä‘Æ¡n Ä‘á»‹nh ká»³ (Reset failure counter & clear cooldown).N)
r/   r1   Úhasattrr)   rH   rK   rL   Ú	ExceptionrD   Úinfor=   s    r8   Úresumez&InvoiceAutoSyncSchedulerService.resumed   sí   € àˆŒØˆÔð	Ý�tÔ,Ð.CÑDÔDð VØÔ%×9Ò9¸,ÈÑUÔUÐUÝ�tÔ,Ð.CÑDÔDð VØÔ%×9Ò9¸,ÈÑUÔUÐUÝ�tÔ,Ð.DÑEÔEð WØÔ%×:Ò:¸<ÈÑVÔVÐVøøÝð 	ð 	ð 	ØˆDð	øøøå�Šð cñ	
ô 	
ð 	
ð 	
ð 	
s   �BB! Â!
B.Â-B.ú	list[int]c                ó*   — t          t          ¦  «        S r<   )ÚlistÚSCHEDULED_HOURSr=   s    r8   Úscheduled_hoursz/InvoiceAutoSyncSchedulerService.scheduled_hoursu   s   € å•OÑ$Ô$Ð$r:   c                óv   ‡— t          j        ¦   «         Šd                     ˆfd„| j        D ¦   «         ¦  «        S )u"  Danh sÃ¡ch khung giá»� cháº¡y quy Ä‘á»•i sang giá»� VN Ä‘á»ƒ hiá»ƒn thá»‹ cho ngÆ°á»�i dÃ¹ng.

        SCHEDULED_HOURS Ä‘Æ°á»£c tÃ­nh theo giá»� há»‡ thá»‘ng cá»§a mÃ¡y cháº¡y (container Cloud = UTC),
        nÃªn [1, 13] trÃªn Cloud tÆ°Æ¡ng á»©ng 08:00 vÃ  20:00 giá»� Viá»‡t Nam.
        z, c              3  óx   •K  — | ]4}t          t          ‰j        ‰j        ‰j        |d d ¦  «        ¦  «        V — Œ5dS )r   N)r   r   ÚyearÚmonthÚday)Ú.0ÚhÚtodays     €r8   ú	<genexpr>zKInvoiceAutoSyncSchedulerService.scheduled_slots_vn_label.<locals>.<genexpr>€   sW   øè è € ð 
ð 
àõ �H U¤Z°´¸e¼iÈÈAÈqÑQÔQÑRÔRð
ð 
ð 
ð 
ð 
ð 
r:   )r   r]   ÚjoinrU   )r7   r]   s    @r8   Úscheduled_slots_vn_labelz8InvoiceAutoSyncSchedulerService.scheduled_slots_vn_labely   sO   ø€ õ ”
‘”ˆØ�yŠyð 
ð 
ð 
ð 
àÔ)ð
ñ 
ô 
ñ 
ô 
ð 	
r:   Úcurrent_timeúdatetime | NoneÚwith_jitterúbool | NoneÚupdate_stateútuple[datetime, float]c           
     ó”  ‡‡— |pt          j        ¦   «         Š‰                     ¦   «         Š|€| j        n|}| j        dz  }|r|dk    r‰ˆˆfd„| j        D ¦   «         }|r	|d         }nA‰t          d¬¦  «        z   }t          |j        |j        |j	        | j        d         dd¦  «        }t          d|‰z
                       ¦   «         ¦  «        }	||	fS g }
‰‰t          d¬¦  «        z   fD ]o}| j        D ]e}t          |j        |j        |j	        |dd¦  «        }|t          |¬¦  «        z
  }|t          |¬¦  «        z   }|
                     |||||f¦  «         ŒfŒpd}|
D ].\  }}}}}|r| j        r||f| j        k    rŒ|‰k    r	|||||f} nŒ/|sp‰t          d	¬¦  «        z   }| j        d         }t          |j        |j        |j	        |dd¦  «        }|t          |¬¦  «        z
  }|t          |¬¦  «        z   }|||||f}|\  }}}}}‰|k     r*t          j        | |¦  «        }|t          |¬¦  «        z   }n`t          d
|‰z
                       ¦   «         ¦  «        }t!          d|d	z  ¦  «        }t          j        ||¦  «        }‰t          |¬¦  «        z   }t          d|‰z
                       ¦   «         ¦  «        }	|r	||f| _        ||	fS )uý   TÃ­nh toÃ¡n thá»�i Ä‘iá»ƒm vÃ  sá»‘ giÃ¢y chá»� Ä‘áº¿n khung giá»� cháº¡y káº¿ tiáº¿p (01:00 hoáº·c 13:00).

        Há»— trá»£ biÃªn Ä‘á»™ thá»�i gian ngáº«u nhiÃªn (jitter Â±30 phÃºt) nháº±m chá»‘ng cÃ¡c bá»™ lá»�c spam vÃ  WAF Cá»•ng Thuáº¿.
        Né<   r   c           
     ó¤   •— g | ]L}t          ‰j        ‰j        ‰j        |d d ¦  «        ‰k    ¯)t          ‰j        ‰j        ‰j        |d d ¦  «        ‘ŒMS )r   )r   rX   rY   rZ   )r[   r\   Únowr]   s     €€r8   ú
<listcomp>zFInvoiceAutoSyncSchedulerService.calculate_next_run.<locals>.<listcomp>–   s^   ø€ ð ð ð àÝ˜EœJ¨¬°U´YÀÀ1ÀaÑHÔHÈ3ÒNÐNõ ˜œ U¤[°%´)¸QÀÀ1ÑEÔEàNÐNÐNr:   r   ©Údaysg        )Úsecondsr   g      ð?g      @)r   rj   r   r5   r4   rU   r   rX   rY   rZ   r3   Útotal_secondsÚappendr6   ÚrandomÚrandintÚminÚuniform)r7   ra   rc   re   Ú
use_jitterÚ
jitter_secÚ
candidatesÚnext_runÚtomorrowÚdelay_secondsÚslot_candidatesÚdr\   Úbase_dtÚ	win_startÚwin_endÚchosen_slotÚafter_tomorrowÚoffsetÚtargetÚ	remainingÚmin_leadÚ
rand_deltarj   r]   s                          @@r8   Úcalculate_next_runz2InvoiceAutoSyncSchedulerService.calculate_next_run…   sŒ  øø€ ð Ð,�hœl™nœnˆØ—’‘
”
ˆØ,7Ð,?�TÔ(Ð(À[ˆ
ØÔ)¨BÑ.ˆ
ð ð 	+˜Z¨1š_˜_ðð ð ð ð àÔ-ðñ ô ˆJð
 ð Ø% aœ=��à ¥9°!Ð#4Ñ#4Ô#4Ñ4�Ý#Ø”M 8¤>°8´<ÀÔAUÐVWÔAXÐZ[Ð]^ñô �õ    h°¡n×%CÒ%CÑ%EÔ%EÑFÔFˆMØ˜]Ð*Ð*ð QSˆØ˜¥°Ð!2Ñ!2Ô!2Ñ2Ð3ð 	Lð 	LˆAØÔ)ð Lð L�Ý" 1¤6¨1¬7°A´E¸1¸aÀÑCÔC�Ø#¥i¸
Ð&CÑ&CÔ&CÑC�	Ø!¥I°jÐ$AÑ$AÔ$AÑA�Ø×&Ò&¨¨1¨g°yÀ'Ð'JÑKÔKÐKÐKð	Lð ˆØ1@ð 	ð 	Ñ-ˆAˆq�'˜9 gØð  Ô 9ð ¸qÀ!¸fÈÔHaÒ>aÐ>aØØ˜Š}ˆ}Ø  ! W¨i¸ÐA�Ø�ð ð ð 	KØ"¥Y°AÐ%6Ñ%6Ô%6Ñ6ˆNØÔ$ QÔ'ˆAÝØÔ# ^Ô%9¸>Ô;MÈqÐRSÐUVñô ˆGð  ¥)°JÐ"?Ñ"?Ô"?Ñ?ˆIØ¥	°*Ð =Ñ =Ô =Ñ=ˆGØ)¨1¨g°yÀ'ÐJˆKà,7Ñ)ˆˆ1ˆg�y 'à�Š?ˆ?Ý”^ Z K°Ñ<Ô<ˆFØ�y°Ð8Ñ8Ô8Ñ8ˆFˆFå˜C '¨C¡-×!>Ò!>Ñ!@Ô!@ÑAÔAˆIÝ˜3 	¨A¡Ñ.Ô.ˆHÝœ¨°)Ñ<Ô<ˆJØ�9¨ZÐ8Ñ8Ô8Ñ8ˆFå˜C &¨3¡,×!=Ò!=Ñ!?Ô!?Ñ@Ô@ˆàð 	/Ø)*¨A¨ˆDÔ%à�}Ð$Ð$r:   ÚallÚtrigger_slotÚforceÚ	sync_typeúdict[str, Any]c           	   ƒ  ó’  K  — t          j        ¦   «         }|pt          |¦  «        }t                               d|¦  «         |                     ¦   «         ||ddddddœ}| j        r‰|s‡t                               d|| j        ¦  «         d|d	<   | j        |d
<   || _        d| _	        | j
                             d|¦  «         t          | j
        ¦  «        dk    r| j
        dd…         | _
        |S 	 |                     d¦  «        }|t          d¬¦  «        z
                       d¦  «        }| j                             |||¬¦  «        }	|	                     d	d¦  «        }
|	                     dd¦  «        }|	                     dd¦  «        }|	                     dg ¦  «        }d„ |D ¦   «         }|
dk    p+t          |¦  «        dk    ot%          d„ |D ¦   «         ¦  «        }| o|
dvpt          |¦  «        dk    }|rdn|
|d	<   ||d<   ||d<   |	|d<   || _        |d	         | _	        |r:|	                     d¦  «        pd}||d
<   t                               d||¦  «         �n|�r,|	                     d¦  «        pd}||d
<   t                               d||¦  «         d „ |D ¦   «         }|rt)          |¦  «        n|
d!k    }d}d"}|�r^|r|nd#d$d%œg}|D �]P}|                     d&¦  «        pd#}|                     d'¦  «        pd$}d(}t+          | j        d)¦  «        rf	 | j                             ||¦  «        }t/          |t0          ¦  «        r|}n2# t2          $ r%}t                               d*|¦  «         Y d}~nd}~ww xY wt                               d+|| j        ||¦  «         || j        k    rtd,}d-|› d.|› d/�}t+          | j        d0¦  «        rT	 | j                             |||d1¬2¦  «         �Œ# t2          $ r&}t                               d3|¦  «         Y d}~�ŒHd}~ww xY w�ŒR|rE|                      |¬4¦  «         d,|d5<   d6|d	<   |                      ||||	¬7¦  «        ƒ d{V —†}||d8<   nü|                      ||||	¬7¦  «        ƒ d{V —†}||d8<   n×t+          | j        d9¦  «        r¥	 | j                              d#d$¦  «         |D ]S}|                     d&¦  «        r<|                     d'¦  «        r'| j                              |d&         |d'         ¦  «         ŒTn2# t2          $ r%} t                               d:| ¦  «         Y d} ~ nd} ~ ww xY wt                               d;|||¦  «         n™# t2          $ rŒ}!tC          j"        ¦   «         }"tG          |!¦  «        }#t                               d<||#|"¦  «         d=|d	<   |#› d>|"› �|d
<   || _        d=| _	        |                      |d?|#› �|!¬@¦  «        ƒ d{V —†}||d8<   Y d}!~!nd}!~!ww xY w| j
                             d|¦  «         t          | j
        ¦  «        dk    r| j
        dd…         | _
        |S )Auh   Thá»±c thi tiáº¿n trÃ¬nh Ä‘á»“ng bá»™ hÃ³a Ä‘Æ¡n Ä‘á»‹nh ká»³ vÃ  gá»­i email thÃ´ng bÃ¡o khi cÃ³ lá»—i.uk   ðŸš€ [AUTO-SYNC] Báº¯t Ä‘áº§u phiÃªn Ä‘á»“ng bá»™ hÃ³a Ä‘Æ¡n tá»± Ä‘á»™ng Ä‘á»‹nh ká»³ (Khung giá»�: %s)...Úrunningr   NF)Úexecution_timer‰   rŠ   ÚstatusÚnew_importedÚ
duplicatesÚerror_detailsÚ
alert_sentuX   â�¸ï¸� [AUTO-SYNC] Bá»� qua phiÃªn Ä‘á»“ng bá»™ %s vÃ¬ cron job Ä‘ang Táº M NGÆ¯NG (%s).Úpausedr�   r“   é2   z%Y-%m-%dr   rl   )Ú	from_dateÚto_dater‹   ÚerrorÚ	total_newÚtotal_duplicatesÚ
connectorsc                ó@   — g | ]}|                      d ¦  «        dv¯|‘ŒS )r�   )ÚsuccessÚcooldown_active©Úget©r[   Úcs     r8   rk   zJInvoiceAutoSyncSchedulerService.execute_scheduled_sync.<locals>.<listcomp>  s4   € ð !ð !ð !Ø¨¯ª¨x©¬Ð@^Ð)^Ð)^�Ð)^Ð)^Ð)^r:   rŸ   c              3  óH   K  — | ]}|                      d ¦  «        dk    V — ŒdS )r�   rŸ   Nr    r¢   s     r8   r^   zIInvoiceAutoSyncSchedulerService.execute_scheduled_sync.<locals>.<genexpr>  s3   è è € Ð+eÐ+eÐUV¨A¯EªE°(©O¬OÐ?PÒ,PÐ+eÐ+eÐ+eÐ+eÐ+eÐ+er:   )rž   Únot_configuredr‘   r’   Úraw_responseÚmessageua   Ä�ang trong thá»�i gian giÃ£n cÃ¡ch 3 giá»� Ä‘á»ƒ báº£o vá»‡ an toÃ n tÃ i khoáº£n Cá»•ng Thuáº¿.uc   â�³ [AUTO-SYNC] PhiÃªn Ä‘á»“ng bá»™ %s táº¡m bá»� qua (Ä‘ang kÃ­ch hoáº¡t cooldown 3h an toÃ n): %su0   Lá»—i káº¿t ná»‘i Cá»•ng Thuáº¿ / HÃ²m thÆ° IMAPuF   âš ï¸� [AUTO-SYNC] PhÃ¡t hiá»‡n lá»—i trong phiÃªn Ä‘á»“ng bá»™ %s: %sc                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )r�   Ú
auth_errorr    r¢   s     r8   rk   zJInvoiceAutoSyncSchedulerService.execute_scheduled_sync.<locals>.<listcomp>:  s3   € ð *ð *ð *Ø¨Q¯UªU°8©_¬_ÀÒ-LÐ-L�AÐ-LÐ-LÐ-Lr:   r©   r(   rI   rJ   )ÚserviceÚtax_coderª   r«   r   Úincrement_auth_failuresu+   Lá»—i khi gá»�i increment_auth_failures: %su[   âš ï¸� [AUTO-SYNC] Cáº£nh bÃ¡o xÃ¡c thá»±c tháº¥t báº¡i láº§n thá»© %d/%d cho %s (MST: %s).Tu   Há»‡ thá»‘ng phÃ¡t hiá»‡n uC    láº§n Ä‘Äƒng nháº­p Cá»•ng Thuáº¿ tháº¥t báº¡i liÃªn tiáº¿p (MST: u�   ). Ä�Ã£ tá»± Ä‘á»™ng ngáº¯t máº¡ch (Circuit Breaker) vÃ  táº¡m ngÆ°ng toÃ n bá»™ tiáº¿n trÃ¬nh Ä‘á»ƒ báº£o vá»‡ tÃ i khoáº£n khÃ´ng bá»‹ khÃ³a.Údeactivate_sync_configÚCIRCUIT_BREAKER_SUSPENDED)Úservice_typer«   rB   r�   u*   Lá»—i khi gá»�i deactivate_sync_config: %s)rB   Úcircuit_breaker_trippedÚcircuit_breaker_suspended)Ú
slot_labelÚerror_messagerœ   Úsync_responser”   rK   u'   Lá»—i khi gá»�i reset_auth_failures: %su_   âœ… [AUTO-SYNC] PhiÃªn Ä‘á»“ng bá»™ %s thÃ nh cÃ´ng: %d hÃ³a Ä‘Æ¡n má»›i, %d hÃ³a Ä‘Æ¡n trÃ¹ng.uP   â�Œ [AUTO-SYNC] Ngoáº¡i lá»‡ báº¥t ngá»� khi Ä‘á»“ng bá»™ tá»± Ä‘á»™ng %s: %s
%sÚ	exceptionú
u    Lá»—i há»‡ thá»‘ng báº¥t ngá»�: )r²   r³   rµ   )$r   rj   r   rD   rO   Ú	isoformatr/   r1   r-   r.   r+   ÚinsertÚlenÚstrftimer   r)   Úrun_gdt_tax_syncr¡   rˆ   rE   r   rM   r¬   Ú
isinstancer"   rN   r™   r2   r­   rF   Úsend_circuit_breaker_alertÚsend_sync_failure_alertrK   Ú	tracebackÚ
format_excr   )$r7   r‰   rŠ   r‹   r�   r²   Úhistory_entryÚto_date_strÚfrom_date_strÚsync_resr�   rš   Ú	total_duprœ   Úfailed_connectorsÚis_cooldownÚ	has_errorÚcooldown_msgÚ	error_msgÚauth_failed_connectorsÚis_auth_errorr°   Úcircuit_breaker_reasonÚtarget_listr£   ÚsvcÚtcÚfailuresÚres_cntÚcnt_errÚ	deact_errÚalert_successÚrst_errÚexcÚstackÚerr_strs$                                       r8   Úexecute_scheduled_syncz6InvoiceAutoSyncSchedulerService.execute_scheduled_syncÒ   sç  è è € õ "œ™œˆØ!ÐD¥_°^Ñ%DÔ%Dˆ
Ý�ŠØyØñ	
ô 	
ð 	
ð -×6Ò6Ñ8Ô8Ø&ØØØØØ!Øð	)
ð 	)
ˆð Œ?ð 	! 5ð 	!Ý�KŠKØjØØÔ"ñô ð ð
 '/ˆM˜(Ñ#Ø-1Ô-?ˆM˜/Ñ*Ø"0ˆDÔØ$,ˆDÔ!ØÔ#×*Ò*¨1¨mÑ<Ô<Ð<Ý�4Ô*Ñ+Ô+¨bÒ0Ð0Ø*.Ô*AÀ#À2À#Ô*F�Ô'Ø Ð ðn	8à(×1Ò1°*Ñ=Ô=ˆKØ+­i¸RÐ.@Ñ.@Ô.@Ñ@×JÒJÈ:ÑVÔVˆMàÔ,×=Ò=Ø'Ø#Ø#ð >ñ ô ˆHð —\’\ (¨GÑ4Ô4ˆFØ Ÿš [°!Ñ4Ô4ˆIØ ŸšÐ%7¸Ñ;Ô;ˆIØ!Ÿš l°BÑ7Ô7ˆJð!ð !Ø%ð!ñ !ô !Ðð "Ð%6Ò6ð Ý�J‘” !Ò#Ðe­Ð+eÐ+eÐZdÐ+eÑ+eÔ+eÑ(eÔ(eð ð )˜ð ØÐ<Ð<Ð]Å#ÐFWÑBXÔBXÐ[\ÒB\ð ð <GÐ&RÐ&7Ð&7ÈFˆM˜(Ñ#Ø,5ˆM˜.Ñ)Ø*3ˆM˜,Ñ'Ø,4ˆM˜.Ñ)à"0ˆDÔØ$1°(Ô$;ˆDÔ!àð sà—L’L Ñ+Ô+ð {Øzð ð 2>�˜oÑ.Ý—’ØyØØ ñô ð ñ ð
 ñ hà—L’L Ñ+Ô+ÐaÐ/að ð 2;�˜oÑ.Ý—’Ø\ØØñô ð ð*ð *Ø)ð*ñ *ô *Ð&ð 5?Ð\•DÐ/Ñ0Ô0Ð0ÀVÈ|ÒE[ð ð +0Ð'Ø)+Ð&à ñ $jØ<Rð  #NÐ"8Ð"8Ðeqð  @Lð  ZMð  ZMð  YN�KØ(ð "jñ "j˜ØŸeše IÑ.Ô.Ð>°,˜ØŸUšU :Ñ.Ô.Ð>°,˜Ø#$˜Ý" 4Ô#8Ð:SÑTÔTð eðeØ*.Ô*?×*WÒ*WÐX[Ð]_Ñ*`Ô*` Ý#-¨gµsÑ#;Ô#;ð !7Ø/6 HøøÝ#,ð eð eð eÝ &§¢Ð-ZÐ\cÑ dÔ dÐ dÐ dÐ dÐ dÐ dÐ døøøøðeøøøõ ŸšØyØ$Ø Ô?ØØñô ð ð $ tÔ'JÒJÐJØ6:Ð3ð!p¸Xð !pð !pð  KMð !pð !pð !pð 3õ  ' tÔ'<Ð>VÑWÔWð 	jð!jØ$(Ô$9×$PÒ$PØ58Ø13Ø/EØ/Jð	 %Qñ %&ô %&ð %&ñ %&øõ (1ð !jð !jð !jÝ$*§L¢LÐ1]Ð_hÑ$iÔ$iÐ$iÐ$iÐ$iÐ$iÐ$iÑ$iøøøøð!jøøøùð +ð @Ø—J’JÐ&<�JÑ=Ô=Ð=Ø?C�MÐ";Ñ<Ø.I�M (Ñ+ð +/×*IÒ*IØ#-Ø&<Ø#-Ø&.ð	 +Jñ +ô +ð %ð %ð %ð %ð %ð %�Mð 3@�M ,Ñ/Ð/ð +/×*FÒ*FØ#-Ø&/Ø#-Ø&.ð	 +Gñ +ô +ð %ð %ð %ð %ð %ð %�Mð 3@�M ,Ñ/Ð/õ ˜4Ô0Ð2GÑHÔHð YðYØÔ-×AÒAÀ,ÐP\Ñ]Ô]Ð]Ø!+ð gð g˜AØ Ÿušu YÑ/Ô/ð g°A·E²E¸*Ñ4EÔ4Eð gØ $Ô 5× IÒ IÈ!ÈIÌ,ÐXYÐZdÔXeÑ fÔ fÐ føðgøõ %ð Yð Yð YÝŸšÐ%NÐPWÑXÔXÐXÐXÐXÐXÐXÐXøøøøðYøøøõ —’ØuØØØñ	ô ð øøõ ð 	8ð 	8ð 	8ÝÔ(Ñ*Ô*ˆEÝ˜#‘h”hˆGÝ�LŠLØcØØØñ	ô ð ð '2ˆM˜(Ñ#Ø07Ð-BÐ-B¸5Ð-BÐ-BˆM˜/Ñ*Ø"0ˆDÔØ$/ˆDÔ!à"&×">Ò">Ø%ØJÀÐJÐJØð #?ñ #ô #ð ð ð ð ð ð ˆMð
 +8ˆM˜,Ñ'Ð'Ð'Ð'Ð'Ð'øøøøð)	8øøøð. 	Ô×&Ò& q¨-Ñ8Ô8Ð8ÝˆtÔ&Ñ'Ô'¨"Ò,Ð,Ø&*Ô&=¸c¸r¸cÔ&BˆDÔ#àÐs›   Ã0H)U' Ì2MÍU' Í
M<ÍM7Í2U' Í7M<Í<AU' ÏO.Ï,U' Ï.
PÏ8PÐU' ÐPÐBU' Ò%A1T ÔU' Ô
UÔ!UÔ<U' ÕUÕ U' Õ'
W=Õ1BW8×8W=r²   r³   rœ   úlist[dict[str, Any]] | Noner´   údict[str, Any] | Nonerµ   úException | Nonec              ƒ  óÔ  K  — t          ¦   «         }|rt          j        ¦   «         nd}d}|r¯|D ]«}	t          |	                     dd¦  «        ¦  «                             ¦   «         }
t          |	                     dd¦  «        ¦  «                             ¦   «         }t          |	                     dd¦  «        ¦  «        }|dk    rd	nd
}|d|
› d|› d|› d|› d�	z  }Œ¬nd|› d�}d}|r|dk    rd|› d�}d|› d|› d|› d|                      ¦   «         › d|› d|› d�}d|› d|› �}	 t          j        | j	        ||dd¬ ¦  «        ƒ d!{V —†}|                     d"d#¦  «        }|r!t                               d$| j	        ¦  «         n.t                               d%|                     d&¦  «        ¦  «         	 d'd(lm}  |¦   «         }|rC|                     ¦   «         r/d)|› d*|› d+|› d,| j	        › d-�	}|                     |¦  «        ƒ d!{V —† n2# t"          $ r%}t                               d.|¦  «         Y d!}~nd!}~ww xY w|S # t"          $ r&}t                               d/|¦  «         Y d!}~d#S d!}~ww xY w)0uw   Gá»­i email cáº£nh bÃ¡o sá»± cá»‘ Ä‘á»“ng bá»™ hÃ³a Ä‘Æ¡n vá»� hÃ²m thÆ° cáº¥u hÃ¬nh (contact@dinhsonconstruction.com).r(   rª   ÚUnknownr�   Úunknownr§   úN/AÚSUCCESSz#4ade80z#f87171úŽ
                <tr>
                    <td style="padding: 8px 12px; border-bottom: 1px solid #334155; color: #38bdf8; font-weight: bold;">za</td>
                    <td style="padding: 8px 12px; border-bottom: 1px solid #334155; color: z; font-weight: bold;">ú|</td>
                    <td style="padding: 8px 12px; border-bottom: 1px solid #334155; color: #cbd5e1; font-size: 12px;">ú,</td>
                </tr>
                ú”
            <tr>
                <td colspan="3" style="padding: 8px 12px; border-bottom: 1px solid #334155; color: #f87171;">
                    ú5
                </td>
            </tr>
            zNoneType: None
u¡  
            <div style="background-color: #0f172a; padding: 12px; border-radius: 6px; border-left: 4px solid #ef4444; margin-top: 14px;">
                <h4 style="margin: 0 0 6px 0; color: #cbd5e1; font-size: 13px;">Chi tiáº¿t lá»—i há»‡ thá»‘ng (Stack Trace):</h4>
                <pre style="color: #fca5a5; font-size: 11px; overflow-x: auto; white-space: pre-wrap; font-family: Consolas, monospace; margin: 0;">z&</pre>
            </div>
            u4  
        <div style="background-color: #0b0f19; color: #f8fafc; padding: 24px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; border-radius: 8px; max-width: 680px; margin: 0 auto; border: 1px solid #1e293b;">
            <div style="border-bottom: 1px solid #334155; padding-bottom: 14px; margin-bottom: 16px;">
                <h2 style="color: #ef4444; margin: 0; font-size: 18px; display: flex; align-items: center;">
                    ðŸš¨ [DSCons ERP Alert] Sá»± Cá»‘ Ä�á»“ng Bá»™ HÃ³a Ä�Æ¡n Ä�á»‹nh Ká»³ (uÚ   )
                </h2>
            </div>
            
            <p style="margin: 4px 0; color: #cbd5e1; font-size: 13px;">
                <strong>Thá»�i Ä‘iá»ƒm ghi nháº­n:</strong> <span style="color: #f8fafc;">u  </span>
            </p>
            <p style="margin: 4px 0; color: #cbd5e1; font-size: 13px;">
                <strong>Khung giá»� cháº¡y tá»± Ä‘á»™ng:</strong> <span style="background: #1e293b; padding: 2px 8px; border-radius: 4px; color: #38bdf8; font-weight: bold;">u   </span> (Lá»‹ch: uï   hÃ ng ngÃ y (GMT+7), biÃªn Ä‘á»™ ngáº«u nhiÃªn Â±30 phÃºt)
            </p>
            <p style="margin: 4px 0; color: #cbd5e1; font-size: 13px;">
                <strong>MÃ£ Sá»‘ Thuáº¿ Ä�Æ¡n Vá»‹:</strong> <span style="color: #fbbf24; font-weight: bold;">0202111150 (CÃ´ng ty TNHH XÃ¢y Dá»±ng Ä�á»‹nh SÆ¡n)</span>
            </p>

            <div style="margin-top: 16px;">
                <h4 style="margin: 0 0 8px 0; color: #94a3b8; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px;">
                    Chi Tiáº¿t Tráº¡ng ThÃ¡i Káº¿t Ná»‘i Ä�á»“ng Bá»™
                </h4>
                <table style="width: 100%; border-collapse: collapse; background: #1e293b; border-radius: 6px; overflow: hidden; font-size: 13px;">
                    <thead>
                        <tr style="background: #334155; text-align: left; color: #94a3b8;">
                            <th style="padding: 8px 12px; font-size: 12px;">Dá»‹ch vá»¥</th>
                            <th style="padding: 8px 12px; font-size: 12px;">Tráº¡ng thÃ¡i</th>
                            <th style="padding: 8px 12px; font-size: 12px;">ThÃ´ng bÃ¡o</th>
                        </tr>
                    </thead>
                    <tbody>
                        zW
                    </tbody>
                </table>
            </div>

            u  

            <div style="background-color: #1e293b; padding: 14px; border-radius: 6px; margin-top: 18px; border-left: 4px solid #38bdf8;">
                <h4 style="margin: 0 0 6px 0; color: #38bdf8; font-size: 13px;">ðŸ“Œ Khuyáº¿n Nghá»‹ HÃ nh Ä�á»™ng Cho Káº¿ ToÃ¡n / Quáº£n Trá»‹ ViÃªn:</h4>
                <ul style="margin: 0; padding-left: 20px; color: #cbd5e1; font-size: 12px; line-height: 1.6;">
                    <li>Kiá»ƒm tra láº¡i thÃ´ng tin tÃ i khoáº£n, máº­t kháº©u Cá»•ng HÄ�Ä�T Tá»•ng Cá»¥c Thuáº¿ trÃªn há»‡ thá»‘ng DSCons ERP.</li>
                    <li>Ä�áº£m báº£o dá»‹ch vá»¥ máº¡ng vÃ  hÃ²m thÆ° nháº­n hÃ³a Ä‘Æ¡n (IMAP) khÃ´ng bá»‹ khÃ³a hoáº·c Ä‘á»•i máº­t kháº©u á»©ng dá»¥ng.</li>
                    <li>Truy cáº­p má»¥c <strong>Quáº£n lÃ½ HÃ³a Ä�Æ¡n &rarr; Cáº¥u hÃ¬nh Káº¿t ná»‘i</strong> trÃªn DSCons ERP Ä‘á»ƒ kiá»ƒm tra trá»±c tiáº¿p.</li>
                </ul>
            </div>

            <hr style="border: none; border-top: 1px solid #334155; margin: 20px 0 14px 0;" />
            <p style="font-size: 11px; color: #64748b; margin: 0; text-align: center;">
                Há»‡ Thá»‘ng Láº­p Lá»‹ch Tá»± Ä�á»™ng & GiÃ¡m SÃ¡t HÃ³a Ä�Æ¡n - CÃ´ng Ty TNHH XÃ¢y Dá»±ng Ä�á»‹nh SÆ¡n (MST: 0202111150).
            </p>
        </div>
        uQ   ðŸš¨ [DSCons ERP Alert] Lá»—i Ä�á»“ng Bá»™ HÃ³a Ä�Æ¡n Tá»± Ä�á»™ng Ä�á»‹nh Ká»³ (ú) - õ$   Ban Quáº£n Trá»‹ & Káº¿ ToÃ¡n DSConsú DSCons Auto Invoice Sync Monitor©Úrecipient_emailÚsubjectÚhtml_contentÚrecipient_nameÚsender_nameNrž   FuM   ðŸ“§ [AUTO-SYNC] Ä�Ã£ gá»­i email cáº£nh bÃ¡o sá»± cá»‘ thÃ nh cÃ´ng tá»›i %suE   âš ï¸� [AUTO-SYNC] KhÃ´ng thá»ƒ gá»­i email cáº£nh bÃ¡o qua Brevo: %sr™   r   ©Úget_telegram_serviceuS   ðŸš¨ *[DSCons ERP - Lá»—i Ä�á»“ng Bá»™ HÃ³a Ä�Æ¡n Ä�á»‹nh Ká»³]*
â�° Khung giá»�: `ú` (u   )
âš ï¸� Chi tiáº¿t: `u.   `
ðŸ“§ Ä�Ã£ gá»­i bÃ¡o cÃ¡o chi tiáº¿t vá»�: `ú`ú#Telegram alert skipped or error: %su5   â�Œ [AUTO-SYNC] Lá»—i khi gá»­i email cáº£nh bÃ¡o: %s)r	   r¿   rÀ   r   r¡   Úupperr`   r
   Ú
send_emailr*   rD   rO   rE   Ú5app.modules.integrations.application.telegram_servicerò   Úis_configuredÚsend_messagerN   Údebugr™   )r7   r²   r³   rœ   r´   rµ   Útime_strÚstack_traceÚconnector_rowsr£   ÚsrvÚstÚmsgÚcolorÚstack_sectionrî   rí   ÚresÚ
is_successrò   ÚtgÚtg_msgÚtg_errÚmail_errs                           r8   r¾   z7InvoiceAutoSyncSchedulerService.send_sync_failure_alert²  s'  è è € õ "Ñ#Ô#ˆØ09ÐA•iÔ*Ñ,Ô,Ð,¸rˆð ˆØð 	Øð ð �Ý˜!Ÿ%š% 	¨9Ñ5Ô5Ñ6Ô6×<Ò<Ñ>Ô>�Ý˜Ÿš˜x¨Ñ3Ô3Ñ4Ô4×:Ò:Ñ<Ô<�Ý˜!Ÿ%š% 	¨5Ñ1Ô1Ñ2Ô2�Ø%'¨9¢_ _˜	˜	¸)�Øð #ày|ð#ð #ð ]bð#ð #ð z|ð#ð #ð x{ð	#ð #ð #ñ ��ððð #ðð ð ˆNð ˆØð 	˜;Ð*<Ò<Ð<ðð Vaðð ð ˆMð4ð ^hð	4ð 4ð \dð4ð 4ð pzð4ð 4ð MQ÷  Mjò  Mjñ  Mlô  Mlð4ð 4ð> (ð?4ð 4ðH ðI4ð 4ð 4ˆðl AÐfpð  Að  AÐv~ð  Að  Aˆð'	Ý)Ô4Ø $Ô 1ØØ)ØEØ>ðñ ô ð ð ð ð ð ð ˆCð Ÿš ¨EÑ2Ô2ˆJØð 	Ý—’ØcØÔ%ñô ð ð õ
 —’Ø[Ø—G’G˜GÑ$Ô$ñô ð ðLØfÐfÐfÐfÐfÐfà)Ð)Ñ+Ô+�Øð 2˜"×*Ò*Ñ,Ô,ð 2ð\Ø-7ð\ð \Ø<Dð\ð \à/<ð\ð \ð HLÔGXð\ð \ð \ð ð Ÿ/š/¨&Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1øøÝð Lð Lð LÝ—’ÐBÀFÑKÔKÐKÐKÐKÐKÐKÐKøøøøðLøøøð ÐøÝð 	ð 	ð 	Ý�LŠLÐPÐRZÑ[Ô[Ð[Ø�5�5�5�5�5øøøøð	øøøsD   Ä!BH7 Æ-AH ÈH7 È
H2ÈH-È(H7 È-H2È2H7 È7
I'ÉI"É"I'c           	   ƒ  ó6  K  — t          ¦   «         }d}|r¢|D ]ž}t          |                     dd¦  «        ¦  «                             ¦   «         }t          |                     dd¦  «        ¦  «                             ¦   «         }	t          |                     dd¦  «        ¦  «        }
|d|› d	|	› d
|
› d�z  }ŒŸnd|› d�}d|› d|› d|› d|› d�	}d|› d|› �}	 t	          j        | j        ||dd¬¦  «        ƒ d{V —†}|                     dd¦  «        }|r!t                               d| j        ¦  «         n.t           	                    d|                     d¦  «        ¦  «         	 ddl
m}  |¦   «         }|r@|                     ¦   «         r,d |› d!|› d"| j        › d#�}|                     |¦  «        ƒ d{V —† n2# t          $ r%}t                               d$|¦  «         Y d}~nd}~ww xY w|S # t          $ r&}t                               d%|¦  «         Y d}~dS d}~ww xY w)&u‹   Gá»­i email cáº£nh bÃ¡o KHáº¨N Cáº¤P khi cÆ¡ cháº¿ Circuit Breaker tá»± Ä‘á»™ng ngáº¯t máº¡ch do >= 2 láº§n Ä‘Äƒng nháº­p sai liÃªn tiáº¿p.r(   rª   rß   r�   rà   r§   rá   rã   z~</td>
                    <td style="padding: 8px 12px; border-bottom: 1px solid #334155; color: #f87171; font-weight: bold;">rä   rå   ræ   rç   uM  
        <div style="background-color: #0b0f19; color: #f8fafc; padding: 24px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; border-radius: 8px; max-width: 680px; margin: 0 auto; border: 2px solid #ef4444;">
            <div style="background-color: #7f1d1d; padding: 14px 18px; border-radius: 6px; margin-bottom: 16px;">
                <h2 style="color: #fef2f2; margin: 0; font-size: 18px;">
                    ðŸš¨ [KHáº¨N Cáº¤P - Tá»° Ä�á»˜NG Dá»ªNG] Ngáº¯t Máº¡ch Ä�á»“ng Bá»™ HÃ³a Ä�Æ¡n Cá»•ng Thuáº¿ (Circuit Breaker)
                </h2>
                <p style="color: #fecaca; font-size: 13px; margin: 6px 0 0 0;">
                    Há»‡ thá»‘ng phÃ¡t hiá»‡n sai thÃ´ng tin xÃ¡c thá»±c tá»« 2 láº§n liÃªn tiáº¿p. Ä�Ãƒ Tá»° Ä�á»˜NG Dá»ªNG NGAY TIáº¾N TRÃŒNH Ä‘á»ƒ báº£o vá»‡ tÃ i khoáº£n Cá»•ng Thuáº¿ khÃ´ng bá»‹ khÃ³a tiáº¿p.
                </p>
            </div>

            <p style="margin: 4px 0; color: #cbd5e1; font-size: 13px;">
                <strong>Thá»�i Ä‘iá»ƒm ngáº¯t máº¡ch:</strong> <span style="color: #f8fafc;">uù  </span>
            </p>
            <p style="margin: 4px 0; color: #cbd5e1; font-size: 13px;">
                <strong>MÃ£ Sá»‘ Thuáº¿:</strong> <span style="color: #fbbf24; font-weight: bold;">0202111150 (CÃ´ng ty TNHH XÃ¢y Dá»±ng Ä�á»‹nh SÆ¡n)</span>
            </p>
            <p style="margin: 4px 0; color: #cbd5e1; font-size: 13px;">
                <strong>Khung giá»� cháº¡y:</strong> <span style="background: #1e293b; padding: 2px 8px; border-radius: 4px; color: #38bdf8; font-weight: bold;">u|  </span>
            </p>

            <div style="background-color: #1e293b; padding: 14px; border-radius: 6px; margin: 16px 0; border-left: 4px solid #ef4444;">
                <h4 style="margin: 0 0 6px 0; color: #f87171; font-size: 13px;">LÃ½ do tá»± Ä‘á»™ng ngáº¯t máº¡ch an toÃ n:</h4>
                <p style="margin: 0; color: #fca5a5; font-size: 13px; font-weight: 500;">u¶  </p>
            </div>

            <div style="margin-top: 16px;">
                <h4 style="margin: 0 0 8px 0; color: #94a3b8; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px;">
                    Chi Tiáº¿t Pháº£n Há»“i Tá»« Cá»•ng Dá»‹ch Vá»¥
                </h4>
                <table style="width: 100%; border-collapse: collapse; background: #1e293b; border-radius: 6px; overflow: hidden; font-size: 13px;">
                    <thead>
                        <tr style="background: #334155; text-align: left; color: #94a3b8;">
                            <th style="padding: 8px 12px; font-size: 12px;">Dá»‹ch vá»¥</th>
                            <th style="padding: 8px 12px; font-size: 12px;">Tráº¡ng thÃ¡i</th>
                            <th style="padding: 8px 12px; font-size: 12px;">ThÃ´ng bÃ¡o</th>
                        </tr>
                    </thead>
                    <tbody>
                        u  
                    </tbody>
                </table>
            </div>

            <div style="background-color: #172554; padding: 14px; border-radius: 6px; margin-top: 18px; border-left: 4px solid #60a5fa;">
                <h4 style="margin: 0 0 6px 0; color: #93c5fd; font-size: 13px;">ðŸ› ï¸� HÆ°á»›ng Dáº«n Xá»­ LÃ½ Cho Quáº£n Trá»‹ ViÃªn / Káº¿ ToÃ¡n:</h4>
                <ol style="margin: 0; padding-left: 20px; color: #bfdbfe; font-size: 12px; line-height: 1.6;">
                    <li><strong>KhÃ´ng thá»­ Ä‘Äƒng nháº­p dá»“n dáº­p</strong> Ä‘á»ƒ trÃ¡nh bá»‹ mÃ¡y chá»§ Cá»¥c Thuáº¿ kÃ­ch hoáº¡t khÃ³a tÃ i khoáº£n.</li>
                    <li>Ä�Äƒng nháº­p thá»§ cÃ´ng vÃ o <a href="https://hoadondientu.gdt.gov.vn" style="color: #38bdf8;" target="_blank">hoadondientu.gdt.gov.vn</a> báº±ng trÃ¬nh duyá»‡t Ä‘á»ƒ xÃ¡c thá»±c chÃ­nh xÃ¡c máº­t kháº©u cá»§a MST <strong>0202111150</strong>.</li>
                    <li>Sau khi kiá»ƒm tra Ä‘Ãºng, truy cáº­p vÃ o giao diá»‡n <strong>HÃ³a Ä�Æ¡n &rarr; Cáº¥u hÃ¬nh káº¿t ná»‘i</strong> trÃªn DSCons ERP Ä‘á»ƒ cáº­p nháº­t láº¡i máº­t kháº©u vÃ  báº¥m nÃºt <strong>KhÃ´i phá»¥c Ä‘á»“ng bá»™ (Resume)</strong>.</li>
                </ol>
            </div>

            <hr style="border: none; border-top: 1px solid #334155; margin: 20px 0 14px 0;" />
            <p style="font-size: 11px; color: #64748b; margin: 0; text-align: center;">
                Há»‡ Thá»‘ng Tá»± Ä�á»™ng Ngáº¯t Máº¡ch Báº£o Vá»‡ An ToÃ n - DSCons ERP (MST: 0202111150).
            </p>
        </div>
        u‚   ðŸš¨ [KHáº¨N Cáº¤P - Tá»° Ä�á»˜NG Dá»ªNG] Ngáº¯t Máº¡ch Ä�á»“ng Bá»™ HÃ³a Ä�Æ¡n: 2 Láº§n Ä�Äƒng Nháº­p Tháº¥t Báº¡i LiÃªn Tiáº¿p (rè   ré   rê   rë   Nrž   Fu^   ðŸ“§ [AUTO-SYNC] Ä�Ã£ gá»­i email cáº£nh bÃ¡o ngáº¯t máº¡ch kháº©n cáº¥p thÃ nh cÃ´ng tá»›i %suS   âš ï¸� [AUTO-SYNC] KhÃ´ng thá»ƒ gá»­i email cáº£nh bÃ¡o ngáº¯t máº¡ch qua Brevo: %sr™   r   rñ   uV   ðŸš¨ *[DSCons ERP - KHáº¨N Cáº¤P Tá»° Ä�á»˜NG Dá»ªNG Ä�á»’NG Bá»˜]*
â�° Khung giá»�: `ró   u  )
ðŸ›‘ CÆ¡ cháº¿ ngáº¯t máº¡ch: Ä�Ã£ phÃ¡t hiá»‡n 2 láº§n Ä‘Äƒng nháº­p Cá»•ng Thuáº¿ tháº¥t báº¡i liÃªn tiáº¿p.
âš ï¸� Há»‡ thá»‘ng Ä‘Ã£ tá»± Ä‘á»™ng Táº M NGÆ¯NG tiáº¿n trÃ¬nh Ä‘á»ƒ báº£o vá»‡ tÃ i khoáº£n khÃ´ng bá»‹ khÃ³a.
ðŸ“§ Ä�Ã£ gá»­i hÆ°á»›ng dáº«n chi tiáº¿t vá»�: `rô   rõ   uC   â�Œ [AUTO-SYNC] Lá»—i khi gá»­i email cáº£nh bÃ¡o ngáº¯t máº¡ch: %s)r	   r   r¡   rö   r
   r÷   r*   rD   rO   rE   rø   rò   rù   rú   rN   rû   r™   )r7   r²   r³   rœ   r´   rü   rþ   r£   rÿ   r   r  rî   rí   r  r  rò   r  r  r  r	  s                       r8   r½   z:InvoiceAutoSyncSchedulerService.send_circuit_breaker_alert@  sq  è è € õ "Ñ#Ô#ˆàˆØð 	Øð 
ð 
�Ý˜!Ÿ%š% 	¨9Ñ5Ô5Ñ6Ô6×<Ò<Ñ>Ô>�Ý˜Ÿš˜x¨Ñ3Ô3Ñ4Ô4×:Ò:Ñ<Ô<�Ý˜!Ÿ%š% 	¨5Ñ1Ô1Ñ2Ô2�Øð #ày|ð#ð #ð z|ð#ð #ð x{ð	#ð #ð #ñ ��ð	
ðð #ðð ð ˆNð:ð _gð:ð :ð$ cmð%:ð :ð. [hð/:ð :ðN (ðO:ð :ð :ˆðx rð  Xbð  rð  rð  hpð  rð  rˆð(	Ý)Ô4Ø $Ô 1ØØ)ØEØ>ðñ ô ð ð ð ð ð ð ˆCð Ÿš ¨EÑ2Ô2ˆJØð 	Ý—’ØtØÔ%ñô ð ð õ
 —’ØiØ—G’G˜GÑ$Ô$ñô ð ðLØfÐfÐfÐfÐfÐfà)Ð)Ñ+Ô+�Øð 2˜"×*Ò*Ñ,Ô,ð 2ðaØ-7ðað aØ<Dðað að MQÔL]ð	að að að ð Ÿ/š/¨&Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1øøÝð Lð Lð LÝ—’ÐBÀFÑKÔKÐKÐKÐKÐKÐKÐKøøøøðLøøøð ÐøÝð 	ð 	ð 	Ý�LŠLÐ^Ð`hÑiÔiÐiØ�5�5�5�5�5øøøøð	øøøsD   ÃBG( Å!AF4 Æ3G( Æ4
G#Æ>GÇG( ÇG#Ç#G( Ç(
HÇ2HÈHc                ó²  — |                       d¬¦  «        \  }}| j        | j        | j        | j        t
          d„ t
          D ¦   «         | j        | j        | j        | j        s| 	                    ¦   «         nd| j        st          |d¦  «        nd| j        r| j         	                    ¦   «         nd| j        t          | j        ¦  «        | j        dd…         dœS )ua   Láº¥y thÃ´ng tin tráº¡ng thÃ¡i láº­p lá»‹ch hiá»‡n táº¡i vÃ  lá»‹ch sá»­ cÃ¡c láº§n Ä‘á»“ng bá»™.F)rc   c                ó   — g | ]}|d ›d�‘Œ	S )Ú02dz:00© )r[   r\   s     r8   rk   z>InvoiceAutoSyncSchedulerService.get_status.<locals>.<listcomp>Ñ  s    € ÐGÐGÐG°! 1    ÐGÐGÐGr:   Nr   é
   )Ú
is_runningr   r   r!   rU   Úscheduled_slotsr#   r$   Úalert_recipient_emailÚnext_run_atÚseconds_until_next_runÚlast_run_atÚlast_run_statusÚhistory_countÚrecent_history)r‡   r,   r/   r1   r2   rT   r4   r5   r*   r·   Úroundr-   r.   r¹   r+   )r7   rx   rz   s      r8   Ú
get_statusz*InvoiceAutoSyncSchedulerService.get_statusÈ  sã   € à"&×"9Ò"9ÀeÐ"9Ñ"LÔ"LÑˆ�-àÔ*ØœØ Ô.Ø-1Ô-PÝ.ØGÐGµÐGÑGÔGØ"Ô2Ø!Ô0Ø%)Ô%6Ø7;´ÐP˜8×-Ò-Ñ/Ô/Ð/ÈDØEIÄ_Ð&^¥e¨M¸1Ñ&=Ô&=Ð&=ÐZ^àÔ"ð˜4Ô.×8Ò8Ñ:Ô:Ð:àØ#Ô4Ý  Ô!8Ñ9Ô9Ø"Ô5°c°r°cÔ:ð#
ð 
ð 	
r:   )r   r   r   r   r   r   r   r    r!   r"   r#   r"   r$   r   r%   r&   )r%   r   )r%   r   )r%   r"   r<   )rB   r    r%   r&   ©r%   r&   )r%   rQ   )NNF)ra   rb   rc   rd   re   r   r%   rf   )NFrˆ   )r‰   r    rŠ   r   r‹   r   r%   rŒ   )NNN)r²   r   r³   r   rœ   rÛ   r´   rÜ   rµ   rÝ   r%   r   )NN)
r²   r   r³   r   rœ   rÛ   r´   rÜ   r%   r   )r%   rŒ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚINVOICE_SYNC_ALERT_RECIPIENTÚDEFAULT_JITTER_MINUTESr9   Úpropertyr   r   r!   r#   r$   rF   rP   rU   r`   r‡   rÚ   r¾   r½   r  r  r:   r8   r   r   )   s  € € € € € ð^ð ^ð
 <@Ø7ØØ#'Ø-.Ø4Ø"ðBð Bð Bð Bð Bð4 ðð ð ñ „Xðð ð"ð "ð "ñ „Xð"ð ð3ð 3ð 3ñ „Xð3ð ð$ð $ð $ñ „Xð$ð ð#ð #ð #ñ „Xð#ð
ð 
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð" ð%ð %ð %ñ „Xð%ð

ð 

ð 

ð 

ð )-Ø#'Ø"ð	K%ð K%ð K%ð K%ð K%ð^ $(ØØð	^ð ^ð ^ð ^ð ^ðH 37Ø/3Ø&*ðLð Lð Lð Lð Lðd 37Ø/3ðFð Fð Fð Fð FðP
ð 
ð 
ð 
ð 
ð 
r:   r   z&InvoiceAutoSyncSchedulerService | NoneÚ_invoice_auto_sync_instancer%   c                 ó–   — t           €<t          j        dd¦  «                             ¦   «         dv } |  }t	          |¬¦  «        a t           S )z6Singleton factory cho InvoiceAutoSyncSchedulerService.Nr   r   r   )r   )r#  ÚosÚgetenvÚlowerr   )Úauto_sync_enabledr   s     r8   Úget_invoice_auto_sync_servicer)  ã  sV   € õ #Ð*åœIÐ&AÀ7ÑKÔK×QÒQÑSÔSð X
ð 
Ðð
 *Ð)ˆ	Ý&EÐPYÐ&ZÑ&ZÔ&ZÐ#Ý&Ð&r:   r&   c               ƒ  óÂ  K  — t          ¦   «         } d| _        | j        r!t                               d| j        ¦  «         n3t                               d|                      ¦   «         | j        ¦  «         	 	 |  	                    dd¬¦  «        \  }}| j        r/t                               d| j        t          |¦  «        ¦  «         n<t                               dt          |¦  «        t          |¦  «        | j        ¦  «         t          j        |¦  «        ƒ d{V —† t          |¦  «        }|                      |¬¦  «        ƒ d{V —† t          j        d	¦  «        ƒ d{V —† n~# t          j        $ r% d
| _        t                               d¦  «         Y dS t"          $ r?}t                               d|¦  «         t          j        d¦  «        ƒ d{V —† Y d}~nd}~ww xY w�Œm)uÊ   VÃ²ng láº·p cháº¡y ná»�n cá»§a Invoice Auto-Sync Scheduler.

    Tá»± Ä‘á»™ng kÃ­ch hoáº¡t cÃ¡c má»‘c 01:00 vÃ  13:00 má»—i ngÃ y (kÃ¨m biÃªn Ä‘á»™ ngáº«u nhiÃªn Â±30 phÃºt Ä‘á»ƒ chá»‘ng spam/WAF).
    TuÂ   â�¸ï¸� [DSCons] Invoice Auto-Sync Scheduler Loop Ä‘Ã£ khá»Ÿi Ä‘á»™ng nhÆ°ng á»Ÿ tráº¡ng thÃ¡i Táº M NGÆ¯NG (%s). CÃ¡c má»‘c cháº¡y tá»± Ä‘á»™ng sáº½ bá»� qua cho tá»›i khi Ä‘Æ°á»£c khÃ´i phá»¥c.u‹   â�° [DSCons] Invoice Auto-Sync Scheduler Loop Ä‘Ã£ khá»Ÿi Ä‘á»™ng. Lá»‹ch cháº¡y: %s (GMT+7) hÃ ng ngÃ y (biÃªn Ä‘á»™ ngáº«u nhiÃªn Â±%dp).)rc   re   ud   â�¸ï¸� [AUTO-SYNC] Ä�ang táº¡m ngÆ°ng (LÃ½ do: %s). VÃ²ng láº·p ngá»§ Ä‘áº¿n má»‘c tiáº¿p theo %s...ua   â�³ [AUTO-SYNC] Ä�ang chá»� phiÃªn káº¿ tiáº¿p vÃ o lÃºc %s (cÃ²n %d giÃ¢y, biÃªn Ä‘á»™ Â±%dp)...N)r‰   r   FuJ   ðŸ›‘ [AUTO-SYNC] Invoice Auto-Sync Scheduler Loop Ä‘Ã£ dá»«ng (Cancelled).u/   â�Œ [AUTO-SYNC] Lá»—i vÃ²ng láº·p Scheduler: %sr   )r)  r,   r   rD   rE   r   rO   r`   r#   r‡   r	   r"   ÚasyncioÚsleepr   rÚ   ÚCancelledErrorrN   r™   )rª   rx   rz   r‰   Úerrs        r8   Ú&start_invoice_auto_sync_scheduler_loopr/  ò  sO  è è € õ
 ,Ñ-Ô-€GØ€GÔØÔð 

Ý�Šð QØÔ ñ	
ô 	
ð 	
ð 	
õ
 	�Šð ZØ×,Ò,Ñ.Ô.ØÔ"ñ	
ô 	
ð 	
ð'$ð&	$Ø&-×&@Ò&@Ø ¨tð 'Añ 'ô 'Ñ#ˆH�mð Ô ð Ý—’ØzØÔ(Ý" 8Ñ,Ô,ñô ð ð õ —’ØwÝ" 8Ñ,Ô,Ý˜Ñ&Ô&ØÔ*ñ	ô ð õ ”- Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.õ +¨8Ñ4Ô4ˆLØ×0Ò0¸lÐ0ÑKÔKÐKÐKÐKÐKÐKÐKÐKõ ”- Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"øåÔ%ð 	ð 	ð 	Ø"'ˆGÔÝ�KŠKØ\ñô ð ð ˆEˆEÝð 	$ð 	$ð 	$Ý�LŠLÐJÈCÑPÔPÐPÝ”- Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#øøøøð	$øøøñK'$s   Á5C+E! Å!0GÆ	GÆ5GÇG)r%   r   r  )!Ú
__future__r   r+  Úloggingr%  rq   r¿   r   r   r   Útypingr   Úapp.core.vn_timer   r	   Ú*app.modules.core.application.alert_servicer
   Ú;app.modules.invoices.application.invoice_processing.servicer   Ú	getLoggerrD   r&  r   r'  r   rT   r!  r0   r   r#  Ú__annotations__r)  r/  r  r:   r8   ú<module>r8     s¸  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "ðð €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð à <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø HÐ HÐ HÐ HÐ HÐ Hðð ð ð ð ð ð 
ˆÔ	Ð5Ñ	6Ô	6€à(˜rœyØÐ Añ ô  Ð ð €B„IÐ)¨7Ñ3Ô3×9Ò9Ñ;Ô;Ð?SÐSð ð �b�'€ØÐ ðMð ðt

ð t

ð t

ð t

ð t

ñ t

ô t

ð t

ðn GKÐ Ð JÐ JÐ JÑ Jð'ð 'ð 'ð 'ð:$ð :$ð :$ð :$ð :$ð :$r:   