§
    …‚’jN1  ã                   óf  — d dl Z d dlmZ d dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZ  eddg¬	¦  «        Z G d
„ de¦  «        Ze                     d¦  «        dedefd„¦   «         Ze                     d¦  «        defd„¦   «         Ze                     d¦  «        d„ ¦   «         Ze                     d¦  «        d„ ¦   «         Ze                     d¦  «        d„ ¦   «         Z G d„ de¦  «        Ze                     d¦  «        defd„¦   «         Ze                     d¦  «        defd „¦   «         ZdS )!é    N)Údatetime)Ú	APIRouterÚBackgroundTasksÚRequest)Ú	BaseModel)ÚPostgresClient)ÚTelegramBridgez/crmÚCRM)ÚprefixÚtagsc                   óœ   — e Zd ZU eed<   eed<   eed<   eed<   dZedz  ed<   dZedz  ed<   dZedz  ed	<   dZ	edz  ed
<   dZ
edz  ed<   dS )ÚWebhookPayloadÚ
event_nameÚ	sender_idÚsender_nameÚmessageNÚdisplay_messageÚmember_nameFÚis_groupÚphone_numberÚ	timestamp)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__r   r   r   Úboolr   r   Úint© ó    ú-C:\Projects\DSCons\app\routers\crm_webhook.pyr   r      s�   € € € € € € Ø€O€O�OØ€N€N�NØÐÐÑØ€L€L�LØ"&€O�S˜4‘ZÐ&Ð&Ñ&Ø"€K��t‘Ð"Ð"Ñ"Ø!€Hˆd�T‰kÐ!Ð!Ñ!Ø#€L�#˜‘*Ð#Ð#Ñ#Ø €Iˆs�T‰zÐ Ð Ñ Ð Ð r    r   z/webhookÚpayloadÚbackground_tasksc           	   ƒ   ó´  ‡ ‡‡‡‡K  — t          ¦   «         }t          ‰ j        ¦  «        Š‰ j        p‰ j        Šd‰v pd‰v pd‰v p
‰ j        dv p‰Š‰ j        }|‰ j        ‰ j        ‰t          j        ¦   «         t          j        ¦   «         dœ}| 	                    |¦  «         d}|dd t          j        ¦   «         t          j        ¦   «         dœ}| 
                    |¦  «         d	|› �Š‰||‰t          j        ¦   «         t          j        ¦   «         d
œ}|                     |¦  «         t          t          j        ¦   «         ¦  «        }|‰d|‰ j        ‰ j        rt          j        ‰ j        dz  ¦  «        nt          j        ¦   «         dœ}	|                     |	¦  «         ˆˆˆ fd„}
|                     |
¦  «         ˆˆ ˆfd„}|                     |¦  «         d|dœS )Nõ   SÆ¡n - GiÃ¡m Ä�á»‘cõ   GiÃ¡m Ä�á»‘cõ   SÆ¡n)Ú645566942630634031Ú8729784557598851324©ÚidÚnamer   Úis_internalÚ
created_atÚ
updated_atÚcompany_zalo_1zDSCons Zalo OA)r+   r,   r   r.   r/   Úconv_company_©r+   Úzalo_account_idÚ
contact_idr-   r.   r/   Úcontactg     @�@©r+   Úconversation_idÚsender_typer   Úcontentr   c               “   óÐ   •K  — t          ¦   «         } ‰s$|                      ‰d‰j        › �¦  «        ƒ d {V —† |                      ‰j        ‰j        ‰j        ‰¬¦  «        ƒ d {V —† d S )NzZalo - )r   r   Útextr-   )r	   Úcreate_topicr   Úforward_inbound_messager   r   )Úbridger7   r-   r"   s    €€€r!   Údispatch_telegram_forwardz1handle_webhook.<locals>.dispatch_telegram_forwardY   s¨   øè è € ÝÑ!Ô!ˆØð 	XØ×%Ò% oÐ7VÀÔATÐ7VÐ7VÑWÔWÐWÐWÐWÐWÐWÐWÐWØ×,Ò,ØÔ+ØÔ'Ø”Ø#ð	 -ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r    c               “   ó  •K  — 	 ddl m}   | ¦   «         }|                     ‰j        ‰‰j        ‰¬¦  «        ƒ d {V —† d S # t
          $ r:}dd l}|                     d¦  «                             d|› �¦  «         Y d }~d S d }~ww xY w)Nr   )ÚZaloAiDispatcher)r   r   r   r   zdscons.crm_webhookzError in Zalo AI auto-reply: )	Úapp.services.zalo_ai_dispatcherrA   Úprocess_and_replyr   r   Ú	ExceptionÚloggingÚ	getLoggerÚerror)rA   Ú
dispatcherÚerE   r   r"   r   s       €€€r!   Údispatch_ai_replyz)handle_webhook.<locals>.dispatch_ai_replyg   sü   øè è € ð	ØHÐHÐHÐHÐHÐHà)Ð)Ñ+Ô+ˆJØ×.Ò.Ø!Ô+Ø'ØœØ!ð	 /ñ ô ð ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	ØˆNˆNˆNà×ÒÐ2Ñ3Ô3×9Ò9Ø3°Ð3Ð3ñô ð ð ð ð ð ð ð øøøøð	øøøs   …9A  Á 
BÁ
/A?Á?BÚsuccess)ÚstatusÚ
message_id)r   r   r   r   r   r   r   r   ÚnowÚupsert_contactÚupsert_zalo_accountÚupsert_conversationr   ÚuuidÚuuid4r   r   ÚfromtimestampÚinsert_messageÚadd_task)r"   r#   Úclientr4   Úcontact_datar3   Ú	zalo_dataÚ	conv_dataÚmsg_idÚmsg_datar?   rJ   r7   r   r-   r   s   `           @@@@r!   Úhandle_webhookr]      sU  øøøøøè è € åÑÔ€Fõ �GÔ$Ñ%Ô%€HØÔ%Ð<¨Ô)<€Kà Ð,ð 	Ø˜[Ð(ð	à�[Ð ð	ð ÔÐ MÐMð	ð ð ð Ô"€JàØÔ#ØÔ,Ø"Ý”l‘n”nÝ”l‘n”nðð €Lð ×Ò˜,Ñ'Ô'Ð'ð '€OàØ ØÝ”l‘n”nÝ”l‘n”nðð €Ið ×Ò˜yÑ)Ô)Ð)ð 3 jÐ2Ð2€OàØ*Ø Ø"Ý”l‘n”nÝ”l‘n”nðð €Ið ×Ò˜yÑ)Ô)Ð)õ •”‘”ÑÔ€FàØ*Ø ØØ”?àÔð•XÔ+¨GÔ,=ÀÑ,FÑGÔGÐGåŒ\‰^Œ^ð	ð 	€Hð ×Ò˜(Ñ#Ô#Ð#ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ×ÒÐ7Ñ8Ô8Ð8ðð ð ð ð ð ð ð$ ×ÒÐ/Ñ0Ô0Ð0à¨vÐ6Ð6Ð6r    z/telegram_webhookÚrequestc              ƒ   ó”   K  — |                       ¦   «         ƒ d{V —†}t          ¦   «         }|                     |¦  «        ƒ d{V —† ddiS )z%Handle webhook updates from Telegram.NrL   Úok)Újsonr	   Úprocess_webhook)r^   Úupdater>   s      r!   Úhandle_telegram_webhookrd   ~   sc   è è € ð —<’<‘>”>Ð!Ð!Ð!Ð!Ð!Ð!€FÝÑÔ€FØ
×
 Ò
  Ñ
(Ô
(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�dÐÐr    z/qrc               ƒ   óB  K  — ddl } 	 |                      ¦   «         4 ƒd{V —†}|                     dd¬¦  «        ƒ d{V —†}|                     ¦   «         cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t          $ r}dt          |¦  «        icY d}~S d}~ww xY w)z+Proxy QR Code fetch to Node.js Zalo Bridge.r   Nzhttp://127.0.0.1:3081/api/qrç      $@©ÚtimeoutrG   ©ÚhttpxÚAsyncClientÚgetra   rD   r   ©rj   rW   ÚresponserI   s       r!   Úget_zalo_qrro   ‡   sX  è è € ð €L€L€Lð!Ø×$Ò$Ñ&Ô&ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#¨&Ø#ŸZšZÐ(FÐPT˜ZÑUÔUÐUÐUÐUÐUÐUÐUˆHØ—=’=‘?”?ð	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øõ ð !ð !ð !Ø�˜Q™œÐ Ð Ð Ð Ð Ð Ð øøøøð!øøøs@   ˆA9 ¢1A&ÁA9 Á&
A0Á0A9 Á3A0Á4A9 Á9
BÂBÂBÂBz/statusc               ƒ   óD  K  — ddl } 	 |                      ¦   «         4 ƒd{V —†}|                     dd¬¦  «        ƒ d{V —†}|                     ¦   «         cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t          $ r}dt          |¦  «        dœcY d}~S d}~ww xY w)z*Proxy status check to Node.js Zalo Bridge.r   Nz http://127.0.0.1:3081/api/statusg      @rg   F)ÚloggedInrG   ri   rm   s       r!   Úget_zalo_statusrr   ”   s[  è è € ð €L€L€Lð4Ø×$Ò$Ñ&Ô&ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#¨&Ø#ŸZšZÐ(JÐTW˜ZÑXÔXÐXÐXÐXÐXÐXÐXˆHØ—=’=‘?”?ð	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øõ ð 4ð 4ð 4Ø!­C°©F¬FÐ3Ð3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð4øøøs@   ˆA9 ¢1A&ÁA9 Á&
A0Á0A9 Á3A0Á4A9 Á9
BÂBÂBÂBz/friendsc            	   ƒ   ó¬	  K  — ddl } ddl}	 |                     ¦   «         4 ƒd{V —†}|                      |                     dd¬¦  «        |                     dd¬¦  «        d¬¦  «        ƒ d{V —†\  }}g }t          |t          ¦  «        sCt          |d	¦  «        r3|j        d
k    r(| 	                    ¦   «                              dg ¦  «        }g }t          |t          ¦  «        sCt          |d	¦  «        r3|j        d
k    r(| 	                    ¦   «                              dg ¦  «        }t          ¦   «         }|                     ¦   «         }i }	|D ]A}
|
                     d¦  «        s*|
d         |
d         |
d         |
d         dddœ|	|
d         <   ŒB|D �]}|                     dd¦  «        }|                     dd¦  «        }|sŒ2|dk    p|dk    pd|v pd|v }|                     dd¦  «        p|}|rdn|}||d<   ||d<   d|d<   ||	|<   |||                     d¦  «        |t          j        ¦   «         t          j        ¦   «         dœ}|                     |¦  «         d|› �d||t          j        ¦   «         t          j        ¦   «         dœ}|                     |¦  «         �Œi }|D ]‡}
|
d         dk    rŒ|
                     dd¦  «        p/d|
                     dd¦  «        v pd |
                     dd¦  «        v }|r0|
d         |
d         dddd!œ||
d         <   |
d         |	v r	|	|
d         = Œˆ|D ]ö}|                     dd¦  «        }|r|dk    rŒ!|                     dd"¦  «        }d|d<   d|d<   |||<   |	                     |d¦  «         |||                     d#d¦  «        › d$�dt          j        ¦   «         t          j        ¦   «         dœ}|                     |¦  «         d|› �d|dt          j        ¦   «         t          j        ¦   «         dœ}|                     |¦  «         Œ÷t#          |	                     ¦   «         ¦  «        t#          |                     ¦   «         ¦  «        z   }|t'          |¦  «        t'          |¦  «        d%œcddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t          $ r}g t)          |¦  «        d&œcY d}~S d}~ww xY w)'z?Fetch real friends and groups from Zalo and sync to PostgreSQL.r   Nz!http://127.0.0.1:3081/api/friendsrf   rg   z http://127.0.0.1:3081/api/groupsT)Úreturn_exceptionsÚstatus_codeéÈ   ÚfriendsÚgroupsr   r+   r,   r   r-   FÚ )r+   r,   ÚphoneNumberr-   r   Úavatarr)   r'   r&   r%   rz   r*   r1   r0   r2   Ú
gridVerMapu   NhÃ³mÚCty)r+   r,   r-   r   r{   u
   NhÃ³m ZaloÚtotalMemberu    thÃ nh viÃªn)rw   ÚtotalÚgroups_count)rw   rG   )Úasynciorj   rk   Úgatherrl   Ú
isinstancerD   Úhasattrru   ra   r   Úget_all_contactsr   rN   rO   rQ   ÚpopÚlistÚvaluesÚlenr   )r�   rj   rW   Úfriends_respÚgroups_resprw   rx   Ú	pg_clientÚdb_contactsÚmerged_friendsÚdb_cÚfÚraw_namer4   Úis_directorr-   Údisplay_namerX   rZ   Úmerged_groupsÚis_grpÚgÚgroup_idÚ
group_nameÚcombinedrI   s                             r!   Úget_zalo_friendsrš   ¡   s–  è è € ð €N€N€Nà€L€L€LðM0Ø×$Ò$Ñ&Ô&ð J	ð J	ð J	ð J	ð J	ð J	ð J	¨&Ø.5¯nªnØ—
’
Ð>È�
ÑMÔMØ—
’
Ð=Àt�
ÑLÔLØ"&ð /=ñ /ô /ð )ð )ð )ð )ð )ð )Ñ%ˆL˜+ð ˆGå˜|­YÑ7Ô7ðAå˜L¨-Ñ8Ô8ðAð !Ô,°Ò3Ð3à&×+Ò+Ñ-Ô-×1Ò1°)¸RÑ@Ô@�àˆFå˜{­IÑ6Ô6ð>å˜K¨Ñ7Ô7ð>ð  Ô+¨sÒ2Ð2à$×)Ò)Ñ+Ô+×/Ò/°¸"Ñ=Ô=�å&Ñ(Ô(ˆIØ#×4Ò4Ñ6Ô6ˆKð  ˆNØ#ð 	ð 	�Ø—x’x 
Ñ+Ô+ð à" 4œjØ $ V¤Ø'+¨NÔ';Ø'+¨MÔ':Ø$)Ø"$ð2ð 2�N 4¨¤:Ñ.øð ð %9ñ %9�ØŸ5š5 ¨Ñ,Ô,�ØŸUšU 4¨™_œ_�
Ø!ð ØàÐ"7Ò7ð 2Ø 6Ò)ð2à Ð)ð2ð &¨Ð1ð	 ð  Ÿeše M°5Ñ9Ô9ÐH¸[�Ø8CÐQÐ4Ð4È�Ø(��&‘	Ø#.��-Ñ Ø %��*‘à-.�˜zÑ*ð %Ø(Ø$%§E¢E¨-Ñ$8Ô$8Ø#.Ý"*¤,¡.¤.Ý"*¤,¡.¤.ð ð  �ð ×(Ò(¨Ñ6Ô6Ð6ð 7¨*Ð6Ð6Ø'7Ø",Ø#.Ý"*¤,¡.¤.Ý"*¤,¡.¤.ðð �	ð ×-Ò-¨iÑ8Ô8Ð8Ñ8ð ˆMØ#ð 7ð 7�Ø˜”: Ò-Ð-Øð —H’H˜Z¨Ñ/Ô/ð 5Ø $§(¢(¨6°2Ñ"6Ô"6Ð6ð5à §¢¨°Ñ 4Ô 4Ð4ð ð
 ð 	7à" 4œjØ $ V¤Ø'+Ø$(Ø"$ð1ð 1�M $ t¤*Ñ-ð ˜D”z ^Ð3Ð3Ø*¨4°¬:Ð6øàð 9ð 9�ØŸ5š5  r™?œ?�Øð  8¨|Ò#;Ð#;ØØŸUšU 6¨<Ñ8Ô8�
Ø $��*‘Ø#'��-Ñ à*+�˜hÑ'Ø×"Ò" 8¨TÑ2Ô2Ð2ð #Ø&Ø'(§u¢u¨]¸AÑ'>Ô'>Ð$MÐ$MÐ$MØ#'Ý"*¤,¡.¤.Ý"*¤,¡.¤.ð ð  �ð ×(Ò(¨Ñ6Ô6Ð6ð 5¨(Ð4Ð4Ø'7Ø"*Ø#'Ý"*¤,¡.¤.Ý"*¤,¡.¤.ðð �	ð ×-Ò-¨iÑ8Ô8Ð8Ð8å˜N×1Ò1Ñ3Ô3Ñ4Ô4µt¸M×<PÒ<PÑ<RÔ<RÑ7SÔ7SÑSˆHà#Ý˜X™œÝ # MÑ 2Ô 2ðð ðMJ	ð J	ð J	ð J	ñ J	ô J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	ð J	øøøð J	ð J	ð J	ð J	ð J	ð J	øõV ð 0ð 0ð 0Ø­¨A©¬Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øøøøð0øøøsA   ŒR- ¦Q!RÒR- Ò
R$Ò$R- Ò'R$Ò(R- Ò-
SÒ7SÓSÓSc                   ó8   — e Zd ZU eed<   eed<   dZedz  ed<   dS )ÚSendMessageRequestÚuser_idr   FNr   )r   r   r   r   r   r   r   r   r    r!   rœ   rœ   8  s8   € € € € € € Ø€L€L�LØ€L€L�LØ!€Hˆd�T‰kÐ!Ð!Ñ!Ð!Ð!r    rœ   z/send_messageÚreqc              ƒ   óD  K  — ddl }	 |                     ¦   «         4 ƒd{V —†}|                     d| j        | j        | j        dœd¬¦  «        ƒ d{V —†}|                     ¦   «         }t          ¦   «         }d| j        › �}t          t          j
        ¦   «         ¦  «        |dd	| j        t          j        ¦   «         d
œ}|                     |¦  «         |cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t          $ r}t          |¦  «        ddœcY d}~S d}~ww xY w)z%Send real message to Zalo via Bridge.r   Nz&http://127.0.0.1:3081/api/send-message)ÚuserIdr   ÚisGrouprf   )ra   rh   r1   Úuserr0   r6   F)rG   rK   )rj   rk   Úpostr�   r   r   ra   r   r   rR   rS   r   rN   rU   rD   )	rž   rj   rW   rn   Úres_datarŒ   Úconv_idr\   rI   s	            r!   Úsend_zalo_messager¦   >  sö  è è € ð €L€L€Lð3Ø×$Ò$Ñ&Ô&ð 	ð 	ð 	ð 	ð 	ð 	ð 	¨&Ø#Ÿ[š[Ø8à!œkØ"œ{Ø"œ|ðð ð
 ð )ñ ô ð ð ð ð ð ð ˆHð  —}’}‘”ˆHõ 'Ñ(Ô(ˆIØ3 c¤kÐ3Ð3ˆGå�$œ*™,œ,Ñ'Ô'Ø#*Ø%Ø-Øœ;Ý%œ\™^œ^ðð ˆHð ×$Ò$ XÑ.Ô.Ð.àð3	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	øõ4 ð 3ð 3ð 3Ý˜Q™œ¨EÐ2Ð2Ð2Ð2Ð2Ð2Ð2Ð2øøøøð3øøøsA   ˆC9 ¢B1C&ÃC9 Ã&
C0Ã0C9 Ã3C0Ã4C9 Ã9
DÄDÄDÄDz/messages/{contact_id}r4   c              ƒ   ó–   K  — t          ¦   «         }d| › �}|                     |¦  «        }|s|                     d| › �¦  «        }d|pg iS )z:Fetch all messages for a specific contact from PostgreSQL.r1   Úconv_company_zalo_1_Úmessages)r   Úget_messages_by_conversation)r4   rŒ   r¥   r©   s       r!   Úget_contact_messagesr«   b  sl   è è € õ Ñ Ô €IØ*˜jÐ*Ð*€GØ×5Ò5°gÑ>Ô>€HØð 
Ø×9Ò9Ø/ :Ð/Ð/ñ
ô 
ˆð ˜˜ BÐ'Ð'r    )rR   r   Úfastapir   r   r   Úpydanticr   Úapp.core.postgresr   Úapp.services.telegram_bridger	   Úrouterr   r£   r]   rd   rl   ro   rr   rš   rœ   r¦   r   r«   r   r    r!   ú<module>r±      sF  ðØ €€€Ø Ð Ð Ð Ð Ð à 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø Ð Ð Ð Ð Ð à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7à	ˆ˜&¨ wÐ	/Ñ	/Ô	/€ð	!ð 	!ð 	!ð 	!ð 	!�Yñ 	!ô 	!ð 	!ð ‡‚ˆZÑÔða7 .ð a7ÀOð a7ð a7ð a7ñ Ôða7ðH ‡‚Ð Ñ!Ô!ð¨7ð ð ð ñ "Ô!ðð ‡‚ˆEÑÔð	!ð 	!ñ Ôð	!ð ‡‚ˆIÑÔð	4ð 	4ñ Ôð	4ð ‡‚ˆJÑÔðS0ð S0ñ ÔðS0ðl"ð "ð "ð "ð "˜ñ "ô "ð "ð ‡‚ˆ_ÑÔð 3Ð!3ð  3ð  3ð  3ñ Ôð 3ðF ‡‚Ð$Ñ%Ô%ð	(¨3ð 	(ð 	(ð 	(ñ &Ô%ð	(ð 	(ð 	(r    