Ë
    ¬ÿ}j«7 ã            )       ó  — U d Z ddlZddlZddlmZ ej                  j                  d e ee	«      j                  «       j                  «      «       ddlZddlZddl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mZmZmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC ddlDmEZE dd	lFmGZG ddlZH eeI«      ZJej–                  j™                  d
«      xs deJ_M        ej–                  j™                  dd«      j�                  «       ZOdePfd„ZQddlRmSZS ddlZT eSeU«      ZV eTj®                  «       ZXdZYdZZdefd„Z[dedePfd„Z\defd„Z]defd„Z^ e eJ«      Z_de__`        de__a        de__b        e_jÆ                  d„ «       Zd	 ddlemfZf  efeJ«       i ZjdZk ee	«      j                  «       j                  dz  Zld „ Zmdenfd!„Zo	 	 �did"ed#ed$ed%ed&ef
d'„Zpd(ed$edefd)„Zqd*Zrd+Zsd,edetfd-„Zud.ed,ed/ed0ed1ed2edevfd3„Zw�djd4etd,ed5eUd/edevf
d6„Zxd%ed(ed,ed7ededz  f
d8„Zyd7edetfd9„Zz�dkd4etd,ed7ed:ed;etdevfd<„Z{	 �dld4etd.ed,ed7ed0ed=ed:edevfd>„Z|d4etde}fd?„Z~	 	 	 	 	 	 �dmd&edAed$edBe}d,ed7ed0ed=edCed/edDedEePdFe}dGePdHedIedJe}dKedLedMe}f(dN„Z€dO„ Z�dP„ Z‚dQ„ Zƒ edR«      Z„e„�j                  dS¬T«       d&edUeUfdV„Z†d&edeUfdW„Z‡dXeUdefdY„ZˆdZedetfd[„Z‰�dndZed\ed$edetfd]„ZŠ�dod.ed,ed7ed^etd_ef
d`„Z‹	 �dpd&edXeUd,ed7ed0ed=edaePfdb„ZŒeJ�j                  dcdddeg¬f«      dg„ «       ZŽeJ�j                  dh«      e#di„ «       «       Z�eJ�j                  dj«      e#dk„ «       «       Z�eJ�j                  dldeg¬f«      e#dm„ «       «       Z‘eJ�j                  dndeg¬f«      e#do„ «       «       Z’eJ�j                  dpdeg¬f«      e#dq„ «       «       Z“eJ�j                  drdeg¬f«      e#ds„ «       «       Z”eJ�j                  dt«      e#du„ «       «       Z•eJ�j                  dvdeg¬f«      e#dw„ «       «       Z–eJ�j                  dxddg¬f«      e#dy„ «       «       Z—eJ�j                  dzddg¬f«      e#d{„ «       «       Z˜eJ�j                  dxdeg¬f«      e#d|„ «       «       Z™d}„ ZšeJ�j                  d~ddg¬f«      e#d„ «       «       Z›eJ�j                  d~deg¬f«      e#d€„ «       «       ZœeJ�j                  d�d‚g¬f«      e#dƒ„ «       «       Z�eJ�j                  d�d„g¬f«      e#d…„ «       «       ZžeJ�j                  d†ddg¬f«      e#d‡„ «       «       ZŸeJ�j                  dˆdeg¬f«      e#d‰„ «       «       Z eJ�j                  dŠdeg¬f«      e#d‹„ «       «       Z¡eJ�j                  dŒdeg¬f«      e#d�„ «       «       Z¢eJ�j                  dŽ«      e#d�„ «       «       Z£eJ�j                  d�«      e#d‘„ «       «       Z¤ddl¥Z¥ ed’«      Z¦ ed“«      Z§ ed”«      Z¨ ed•«      Z©d–d—d˜d™dšd›dœd�œZª eUeª�jW                  «       «      Z¬detfdž„Z­dŸetddfd „Z®detfd¡„Z¯devePef   fd¢„Z°devePef   fd£„Z±eJ�j                  d¤ddg¬f«      e#d¥„ «       «       Z²eJ�j                  d¦ddg¬f«      e#d§„ «       «       Z³eJ�j                  d¤deg¬f«      e#d¨„ «       «       Z´eJ�j                  d©deg¬f«      e#dª„ «       «       ZµeJ�j                  d«deg¬f«      e#d¬„ «       «       Z¶eJ�j                  d­«      e#d®„ «       «       Z·eJ�j                  d¯deg¬f«      e#d°„ «       «       Z¸eJ�j                  d±«      e#d²„ «       «       Z¹eJ�j                  d³«      e#d´„ «       «       ZºeJ�j                  dµdeg¬f«      e#d¶„ «       «       Z»eJ�j                  d·deg¬f«      e#d¸„ «       «       Z¼eJ�j                  d¹deg¬f«      e#dº„ «       «       Z½eJ�j                  d»deg¬f«      e#d¼„ «       «       Z¾eJ�j                  d½«      e#d¾„ «       «       Z¿eJ�j                  d¿deg¬f«      e#dÀ„ «       «       ZÀeJ�j                  dÁdeg¬f«      e#dÂ„ «       «       ZÁeJ�j                  dÃdeg¬f«      e#dÄ„ «       «       ZÂeJ�j                  dÅdeg¬f«      e#dÆ„ «       «       ZÃeJ�j                  dÇdeg¬f«      e#dÈ„ «       «       ZÄ edÉ«      ZÅdÊdËdÌdÍœdÎdËdÏdÍœdÐdËdÑdÍœdÒdËdÓdÍœdÔdËdÕdÍœdÖdËd×dÍœdØdËdÙdÍœgZÆdÚdËdÛdÍœdÎdËdÏdÍœdÐdËdÜdÍœdÒdËdÝdÍœdÔdËdÞdÍœdÖdËdßdÍœdØdËdàdÍœgZÇeÆZÈdetfdá„ZÉdâetfdã„ZÊeJ�j                  dädeg¬f«      e#då„ «       «       ZËeJ�j                  dæ«      e#dç„ «       «       ZÌddlÍZÍ eÍ�jœ                  dè«      ZÏej                  j                  ddé«       	 ddêlÐmÑZÒmÓZÔ d*Z×dìZØ edí«      ZÙd(edetdz  fdî„ZÚdïedetfdð„Zudefdñ„ZÛdòetdetdz  fdó„ZÜdôetdefdõ„ZÝdöedefd÷„ZÞ�djdøedùetdúedeßdz  fdû„Zàdüeßdýedefdþ„Zád%edïedÿededz  f�d „Zâd%edïedÿededz  f�d„Zãd.e�dedïedePf�d„Zäd.edïedÿededz  f�d„Zå�ded.e�de�dedïedePf�d„Zæd.e�dedïeddf�d„Zç�d	ef�d
„ZèeJ�j                  �ddeg¬f«      �d„ «       ZéeJ�j                  �ddeg¬f«      �d„ «       Zêdetf�d„Zëd%e�dedúedePf�d„ZìeJ�j                  �ddddeg¬f«      �d„ «       ZíeJ�j                  �ddeg¬f«      �d„ «       Zî�dZï en«       aðeneñ�d<   �do�def�d„Zòdenf�d„Zó�dqdBe}f�d„Zô�d„ Zõ�d„ Zö e�d«      Z÷�dZø�d �d!�d"�d#�d$�d%�d&�d'�d(�d)�d*œ
Zùdd�d+œZúi Zûeteñ�d,<    ej®                  «       Zü�d-Zý�dedïeddf�d.„Zþd.eddf�d/„Zÿdef�d0„�Z �dr�dedïedBe}deUet   f�d1„�Z�d2eUet   �d3edef�d4„�Z�ded.e�dedïedePf
�d5„�Zd.edïededz  f�d6„�Zd_ed=edïedePf�d7„�Zd.ed5eUe   dïeddf�d8„�Z�d9�Z�dedePf�d:„�Z�d;edetf�d<„�Z	eJ�j                  �d=deg¬f«      �d>„ «       �Z
 e�j                  eödS�d?�¬@«      �j                  «        d�dAl�m�Z dd�l�Z �e�j                   «        �dBh�Z�dC„ �ZeJ�j                  �dDdeg¬f«      e#�dE„ «       «       �ZeJ�j                  �dF«      e#�dG„ «       «       �ZeJ�j                  �dH«      e#�dI„ «       «       �ZeJ�j                  �dJ«      e#�dK„ «       «       �Z	  e&«        ddlRmS�Z ddl�Zddl�Z �eeU«      �Zeteñ�dM<    �ej®                  «       �Z�dN�Zd,edePf�dO„�Z�dP„ �Z�dQ„ �ZdePf�dR„�Z eJ�j                  �dSdeg¬f«      �e�dT„ «       «       �Z!eJ�j                  �dUddg¬f«      �e�dV„ «       «       �Z"eJ�j                  �dWddg¬f«      �e�dX„ «       «       �Z#eJ�j                  �dYdeg¬f«      �e�dZ„ «       «       �Z$eJ�j                  �d[ddg¬f«      �e�d\„ «       «       �Z%eJ�j                  �d]ddg¬f«      �e�d^„ «       «       �Z&eJ�j                  �d_ddg¬f«      �e�d`„ «       «       �Z'eI�dak(  rD e&«        	  e@«       �Z(�e(r ei�db�e(› �dc�«        ei�de«       eJ�jU                  �df�dgd@�¬h«       yy# eg$ rZh eideh› d�«       Y dZh[h�ŒÊdZh[hww xY w# eg$ r$ZÕeÏ�j­                  dëeÕ› �«       dZÒdZÔY dZÕ[Õ�Œ;dZÕ[Õww xY w# eg$ rZÕ ei�dLeÕ› �«       Y dZÕ[Õ�ŒýdZÕ[Õww xY w# eg$ r�Z) ei�dd�e)› �«       Y d�Z)�[)Œ§d�Z)�[)ww xY w(s  uT   
Interface Web - ProspecÃ§Ã£o Ativa via Google Maps
Flask app rodando na porta 5050
é    N)ÚPath)ÚdatetimeÚtimezoneÚ	timedelta)ÚFlaskÚjsonifyÚrender_templateÚrequestÚredirectÚurl_forÚflash)ÚLoginManagerÚ
login_userÚlogout_userÚlogin_requiredÚcurrent_user)Úinit_dbÚbuscar_por_emailÚcriar_usuarioÚlistar_usuariosÚatualizar_usuarioÚdeletar_usuarioÚverificar_senhaÚregistrar_acessoÚUserÚget_ghl_configÚsave_ghl_configÚcriar_contaÚlistar_contasÚ	get_contaÚdeletar_contaÚrenomear_contaÚ	get_quotaÚincrementar_quotaÚresetar_quota_se_novo_mesÚsalvar_job_historicoÚlistar_jobs_historicoÚlistar_perfis_crmÚget_perfil_crmÚsalvar_perfil_crmÚdeletar_perfil_crmÚcontar_perfis_crmÚmigrar_ghl_config_para_perfisÚbuscar_por_tokenÚgerar_api_tokenÚset_ip_whitelist)Úget_dashboard_saude©ÚwrapsÚFLASK_SECRET_KEYzprospeccao-climb-2026-secretÚWEBHOOK_SECRETÚ Úreturnc                  óÆ   — t         syt        j                  j                  d«      xs# t        j                  j                  d«      xs dj                  «       } | t         k(  S )zRTrue se o webhook pode prosseguir. Se WEBHOOK_SECRET estiver vazio, sempre libera.TÚszX-Webhook-Secretr6   )r5   r
   ÚargsÚgetÚheadersÚstrip)Ú	fornecidos    ú2/opt/mia/workspace/prospeccao_ativa-staging/app.pyÚ_webhook_autorizador@   3   sK   € åØÜ—‘×!Ñ! #Ó&ÒW¬'¯/©/×*=Ñ*=Ð>PÓ*QÒWÐUW×^Ñ^Ó`€IØœÑ&Ð&ó    )Údefaultdicté
   i„  c                  ó¸   — t         j                  j                  d«      xs dj                  d«      d   j	                  «       } | xs t         j
                  xs dS )NúX-Forwarded-Forr6   ú,r   Údesconhecido)r
   r<   r;   Úsplitr=   Úremote_addr)Úfwds    r?   Ú	_login_iprK   E   sK   € Ü�?‰?×ÑÐ0Ó1Ò7°R×
>Ñ
>¸sÓ
CÀAÑ
F×
LÑ
LÓ
N€CØÒ9”7×&Ñ&Ò8¨.Ð9rA   Úipc                 óè   — t        j                   «       }t        5  t        |    D �cg c]  }||z
  t        k  sŒ|‘Œ }}|t        | <   t	        |«      t
        k\  cd d d «       S c c}w # 1 sw Y   y xY w©N)ÚtimeÚ_LOGIN_FAILS_LOCKÚ_LOGIN_FAILSÚ_LOGIN_WINDOW_SEGÚlenÚ_LOGIN_MAX_FAILS)rL   ÚagoraÚtÚrecentess       r?   Ú_login_bloqueadorX   J   sh   € Ü�I‰I‹K€EÜ	ñ 1Ü+¨BÑ/ÖQ˜!°5¸1±9Ô?PÓ3P’AÐQˆÐQØ#Œ�RÑÜ�8‹}Ô 0Ñ0÷1ñ 1ùÚQ÷1ð 1ús    ›A(§A#¹A#½A(Á#A(Á(A1c                 óŽ   — t         5  t        |    j                  t        j                  «       «       d d d «       y # 1 sw Y   y xY wrN   )rP   rQ   ÚappendrO   ©rL   s    r?   Ú_login_registrar_falhar\   R   s3   € Ü	ñ -Ü�RÑ×Ñ¤§	¡	£Ô,÷-÷ -ñ -ús	   ‡+;»Ac                 óf   — t         5  t        j                  | d «       d d d «       y # 1 sw Y   y xY wrN   )rP   rQ   Úpopr[   s    r?   Ú_login_limparr_   W   s*   € Ü	ñ #Ü×Ñ˜˜TÔ"÷#÷ #ñ #ús   ‡'§0Úloginu&   FaÃ§a login para acessar a ferramenta.Úerrorc                 ó,   — t        j                  | «      S rN   )r   r;   )Úuser_ids    r?   Ú	load_userrd   `   s   € ä�8‰8�GÓÐrA   )Úregister_climbleads_routesu,   [climbleads] AVISO: mÃ³dulo nÃ£o carregado (ú)zusers.dbc                  óJ   — ddl } | j                  t        t        «      d¬«      S )u<   Abre conexÃ£o nova no users.db. Cada thread abre a prÃ³pria.r   Né   ©Útimeout)Úsqlite3ÚconnectÚstrÚ_USERS_DB_PATH)rk   s    r?   Ú_users_db_connro   x   s   € ãØ�?‰?œ3œ~Ó.¸ˆ?Ó;Ð;rA   c                 óV  — | s
t        «       S 	 t        «       }|j                  «       }|j                  dt	        | «      f«      j                  «       }|j                  «        |D �ch c]  }|d   ’Œ	 c}S c c}w # t        $ r%}t        d| › d|› �«       t        «       cY d}~S d}~ww xY w)u†   Carrega chaves de empresas jÃ¡ prospectadas PELA CONTA especificada.
    conta_id None ou invÃ¡lido â†’ retorna set vazio (fail-safe).z1SELECT chave FROM prospectados WHERE conta_id = ?r   z)[prospectados] erro ao carregar conta_id=ú: N)	Úsetro   ÚcursorÚexecuteÚintÚfetchallÚcloseÚ	ExceptionÚprint)Úconta_idÚconnÚcurÚrowsÚrÚes         r?   Ú_carregar_registror€   }   s�   € ñ Ü‹uˆðÜÓˆØ�k‰k‹mˆØ�{‰{Ø?Ü�‹]Ðó
÷ ‰(‹*ð 	ð 	�
‰
ŒØ"Ö#˜��!“Ò#Ð#ùÒ#øÜò ÜÐ9¸(¸À2ÀaÀSÐIÔJÜ‹u�ûðús0   ŽAA: Á&A5Á2A: Á5A: Á:	B(ÂB#ÂB(Â#B(ÚchaveÚempresaÚcidadeÚtelefoneÚjob_idc           
      ót  — | r|sy	 t        «       }|j                  «       }|j                  dt        | «      ||xs d|xs d|xs dt	        j
                  «       j                  «       |f«       |j                  «        |j                  «        y# t        $ r}t        d| › d|›d|› �«       Y d}~yd}~ww xY w)u„   Insere UMA chave no registro da conta. Idempotente (UNIQUE conta_id+chave).
    Substituiu a versÃ£o antiga que gravava JSON global.NzyINSERT OR IGNORE INTO prospectados (conta_id, chave, empresa, cidade, telefone, criado_em, job_id) VALUES (?,?,?,?,?,?,?)r6   z'[prospectados] erro ao salvar conta_id=z chave=rq   ©ro   rs   rt   ru   r   ÚnowÚ	isoformatÚcommitrw   rx   ry   )	rz   r�   r‚   rƒ   r„   r…   r{   r|   r   s	            r?   Ú_salvar_registror‹   �   s²   € ñ ™5ØðYÜÓˆØ�k‰k‹mˆØ�‰ð%ä�‹]˜E 7¢=¨b°&²,¸BÀÂÈBÜ�\‰\‹^×%Ñ%Ó'¨ð1ô	
ð 	�‰ŒØ�
‰
�øÜò YÜÐ7¸°zÀÈÈ	ÐQSÐTUÐSVÐW×XÑXûðYús   ‡BB Â	B7ÂB2Â2B7Únomec                 ó€   — | j                  «       j                  «       › d|j                  «       j                  «       › �S )Nú|)Úlowerr=   )rŒ   rƒ   s     r?   Ú_chave_empresar�   £   s3   € Ø�j‰j‹l× Ñ Ó"Ð# 1 V§\¡\£^×%9Ñ%9Ó%;Ð$<Ð=Ð=rA   z$https://services.leadconnectorhq.comzhttps://unnichat.com.brÚtokenc                 ó   — d| › �dddœS )NúBearer úapplication/jsonú
2021-07-28)ÚAuthorizationúContent-TypeÚVersion© )r‘   s    r?   Ú_ghl_headersrš   ª   s   € à" 5 'Ð*Ø*Øñð rA   Ú
contact_idÚconnection_idÚpipeline_idÚ	column_idÚbusiness_namec                 óž  — d|› �ddœ}|r||d<   |||dœ}	 t        j                  t        › d| › d�||d¬	«      }|j                  d
v ry	 |j	                  «       j                  d«      xs |j                  dd }	dd|j                  › d|	› �fS # t        $ r |j                  dd }	Y Œ.w xY w# t        $ r}
dt        |
«      fcY d}
~
S d}
~
ww xY w)z6Adiciona contato a uma coluna do pipeline no Unnichat.r“   r”   ©r–   r—   úx-connection-id)Úcrm_idrž   rŸ   z/api/contact/z/crmrh   ©r<   Újsonrj   ©éÈ   éÉ   )TNÚmessageNéx   FúHTTP rq   )	ÚrequestsÚpostÚUNNICHAT_BASEÚstatus_coder¥   r;   Útextrx   rm   )r›   r‘   rœ   r�   rž   rŸ   r<   Úpayloadr~   Úmsgr   s              r?   Úunnichat_adicionar_pipeliner³   ´   sô   € ð #*¨%¨Ð 1ÐCUÑV€GÙØ%2ˆÐ!Ñ"àØØ&ñ€Gð
Ü�M‰MÜˆo˜]¨:¨,°dÐ;Ø '°2ô
ˆð �=‰=˜JÑ&Øð	Ø—&‘&“(—,‘,˜yÓ)Ò9¨Q¯V©V°D°S¨\ˆCð ˜˜aŸm™m˜_¨B¨s¨eÐ4Ð4Ð4øô ò 	Ø—&‘&˜˜#�,ŠCð	ûô ò Ø”c˜!“fˆ}ÕûðúsA   —1B, Á
0B Á:B, ÂB)Â&B, Â(B)Â)B, Â,	CÂ5CÃCÃCÚleadÚtagsc                 óâ  — t        j                  dd| j                  dd«      «      }| d   |xs d| j                  d«      xs d|xs dgdœ}|j                  «       D ��ci c]  \  }}|€Œ	||“Œ }}}d	|› �d
dœ}|r||d<   	 t	        j
                  t        › d�||d¬«      }	|	j                  dv r3|	j                  «       j                  di «      }
|
j                  d«      dfS 	 |	j                  «       j                  d«      xs |	j                  dd }dd|	j                  › d|› �fS c c}}w # t        $ r |	j                  dd }Y Œ4w xY w# t        $ r}dt        |«      fcY d}~S d}~ww xY w)z5Cria contato no Unnichat. Retorna (contact_id, erro).ú[^\d+]r6   r„   rŒ   NÚemailúprospeccao-ativa)ÚnameÚphoner¸   rµ   r“   r”   r¡   r¢   z/api/contactrh   r¤   r¦   ÚdataÚidr©   rª   r«   rq   )ÚreÚsubr;   Úitemsr¬   r­   r®   r¯   r¥   r°   rx   rm   )r´   r‘   rµ   rœ   r„   r±   ÚkÚvr<   r~   r¼   r²   r   s                r?   Úunnichat_criar_contatorÃ   Ï   s�  € ä�v‰v�i  T§X¡X¨j¸"Ó%=Ó>€Hà�V‘ØÒ!˜TØ—‘˜'Ó"Ò* dØÒ,Ð+Ð,ñ	€Gð !(§¡£×A™˜˜1°1±=ˆq�!‰tÐA€GÑAØ")¨%¨Ð 1ÐCUÑV€GÙØ%2ˆÐ!Ñ"ðÜ�M‰MÜˆo˜\Ð*ØØØô	
ˆð �=‰=˜JÑ&Ø—6‘6“8—<‘< ¨Ó+ˆDØ—8‘8˜D“> 4Ð'Ð'ð	Ø—&‘&“(—,‘,˜yÓ)Ò9¨Q¯V©V°D°S¨\ˆCð �u˜QŸ]™]˜O¨2¨c¨UÐ3Ð3Ð3ùó% Bøô  ò 	Ø—&‘&˜˜#�,ŠCð	ûô ò Ø”S˜“Vˆ|ÕûðúsO   Á!
D*Á,D*ÂA E Ã&0D0 ÄE Ä0EÅE Å
EÅE Å	E.ÅE)Å#E.Å)E.Úlocation_idc                 ó¤  — t        |«      }| rj	 t        j                  t        › d�||| ddœd¬«      }|j                  dk(  r6|j                  «       j                  dg «      }|r|d   j                  d	«      S 	 t        j                  t        › d�|||d
d ddœd¬«      }|j                  dk(  r„|j                  «       j                  dg «      }|D ]I  }|j                  d«      xs dj                  «       |j                  «       k(  sŒ8|j                  d	«      c S  |r|d   j                  d	«      S y
# t        $ r Y ŒÇw xY w# t        $ r Y y
w xY w)z-Busca contato existente por telefone ou nome.ú
/contacts/é   )Ú
locationIdÚqueryÚlimitrC   ©r<   Úparamsrj   r§   Úcontactsr   r½   Né2   é   ÚcompanyNamer6   )rš   r¬   r;   ÚGHL_BASEr¯   r¥   rx   r�   )r„   rŒ   r‘   rÄ   r<   r~   rÍ   Úcs           r?   Úbuscar_contato_existente_ghlrÓ   ï   sX  € ä˜5Ó!€Gñ ð	Ü—‘Ü�*˜JÐ'ØØ&1¸HÈqÑQØô	ˆAð �}‰} Ò#ØŸ6™6›8Ÿ<™<¨
°BÓ7�ÙØ# A™;Ÿ?™?¨4Ó0Ð0ð
Ü�L‰LÜˆj˜
Ð#ØØ"-¸¸S¸b¸	ÈAÑNØô	
ˆð �=‰=˜CÒØ—v‘v“x—|‘| J°Ó3ˆHàò '�Ø—E‘E˜-Ó(Ò.¨B×5Ñ5Ó7¸4¿:¹:»<ÓGØŸ5™5 ›;Ò&ð'ñ Ø ‘{—‘ tÓ,Ð,ð øô/ ò 	Ùð	ûô( ò Øàðús1   �A(D4 Á9BE Ä	E ÄE Ä4	E Ä?E Å	EÅEc                 ó€  — ddi}|j                  | «      }|r„t        j                  j                  |«      re	 t	        |«      5 }t        j                  |«      }ddd«       j                  «       D ��ci c]  \  }}|dk7  sŒt        |t        «      sŒ||“Œ! c}}S i S # 1 sw Y   ŒFxY wc c}}w # t        $ r Y i S w xY w)z:Carrega mapeamento de campos customizados por location_id.Ú4z6Fjpgj2soAQZpu8Ddkz8/opt/mia/workspace/clientes/sweet_angels/campos_crm.jsonNÚ_meta)r;   ÚosÚpathÚexistsÚopenr¥   ÚloadrÀ   Ú
isinstancerm   rx   )rÄ   ÚmaparØ   Úfr¼   rÁ   rÂ   s          r?   Ú_carregar_campos_crmrß     s¸   € ð 	Ð Zð€Dð �8‰8�KÓ €DÙ”—‘—‘˜tÔ$ð	Ü�d“ð $˜qÜ—y‘y “|�÷$ð &*§Z¡Z£\×Y™T˜Q °Q¸'³\ÄjÐQRÔTWÕFX�A�q‘DÓYÐYð €I÷$ð $üó ZøÜò 	ØØ€Ið	úsA   ¸B0 ÁBÁB0 Á4B*ÂB*ÂB*ÂB0 ÂB'Â#B0 Â0	B=Â<B=ÚsourceÚcustom_fields_mapc                 óÄ  — | d   j                  dd«      }|d   }t        |«      dkD  r|d   nd}t        j                  dd| j	                  dd«      «      }| j	                  d«      xs% d	| j	                  d
d«      | j	                  dd«      g}	|	D �
cg c]  }
|
sŒ|
‘Œ	 }	}
|||| j	                  d«      xs | d   |xs d| j	                  d«      xs d| j	                  d«      xs d| j	                  d«      xs d|	|dœ
}|j                  «       D ��ci c]  \  }}|€Œ	||“Œ }}}g }|r‰|j                  «       D ]v  \  }}|dk(  r;| j	                  d«      xs g }|r#|j                  |dj                  |«      dœ«       ŒF| j	                  |«      }|sŒZ|j                  |t        |«      dœ«       Œx |r||d<   t        j                  t        › d�t        |«      |d¬«      }|j                  dv r1|j                  «       j	                  di «      j	                  d«      dfS 	 |j                  «       j	                  d«      xs# |j                  «       j	                  d«      xs d}|j                  d k(  r+d!|j#                  «       v rt%        || d   ||«      }|r|dfS d%S dd"|j                  › d#|dd$ › �fS c c}
w c c}}w # t        $ r |j                   dd }Y Œvw xY w)&zWCria contato no CRM e retorna (contact_id, erro). Se duplicado, retorna o ID existente.rŒ   ú rÇ   r   r6   r·   r„   rµ   r¹   Únichorƒ   r‚   Nr¸   ÚsiteÚendereco)
rÈ   Ú	firstNameÚlastNamerÐ   r»   r¸   ÚwebsiteÚaddress1rµ   rà   Úfontes_enriquecimentoÚfontesú, )r½   ÚvalueÚcustomFieldsrÆ   rh   r¤   r¦   Úcontactr½   r©   r²   r§   é�  Ú	duplicater«   rq   rª   )Nu&   Duplicado mas nÃ£o encontrado na busca)rH   rS   r¾   r¿   r;   rÀ   rZ   Újoinrm   r¬   r­   rÑ   rš   r¯   r¥   rx   r°   r�   rÓ   )r´   r‘   rÄ   rà   rá   Ú
nome_splitÚprimeiroÚ	sobrenomer„   rµ   rV   r±   rÁ   rÂ   Úcustom_fieldsÚcampoÚfield_idrì   Úvalorr~   r²   r›   s                         r?   Úcriar_contato_ghlrû   +  sæ  € à�f‘×#Ñ# C¨Ó+€JØ˜!‰}€HÜ!$ Z£°1Ò!4�
˜1’¸"€Iä�v‰v�i  T§X¡X¨j¸"Ó%=Ó>€HØ�8‰8�FÓÒbÐ 2°D·H±H¸WÀbÓ4IÈ4Ï8É8ÐT\Ð^`ÓKaÐb€DØÖ!�!šqŠAÐ!€DÐ!ð "ØØØ—x‘x 	Ó*Ò:¨d°6©lØÒ!˜TØ—‘˜'Ó"Ò* dØ—8‘8˜FÓ#Ò+ tØ—H‘H˜ZÓ(Ò0¨DØØñ€Gð !(§¡£×A™˜˜1°1±=ˆq�!‰tÐA€GÑAð €MÙØ0×6Ñ6Ó8ò 	L‰OˆE�8ØÐ/Ò/ØŸ™ (Ó+Ò1¨r�ÙØ!×(Ñ(°À4Ç9Á9ÈVÓCTÑ)UÔVØØ—H‘H˜U“OˆEÚØ×$Ñ$¨H¼sÀ5»zÑ%JÕKð	Lñ Ø"/ˆ�Ñä�‰Üˆ*�JÐÜ˜UÓ#ØØô		€Að 	‡}�}˜
Ñ"Ø�v‰v‹x�|‰|˜I rÓ*×.Ñ.¨tÓ4°dÐ:Ð:ðØ�f‰f‹h�l‰l˜9Ó%ÒB¨¯©«¯©°eÓ)<ÒBÀˆð 	‡}�}˜Ò ¨s¯y©y«{Ñ :Ü1°(¸DÀ¹LÈ%ÐQ\Ó]ˆ
ÙØ˜tÐ#Ð#Ø>Ð>à�5˜Ÿ™˜ r¨#¨d¨s¨)¨Ð5Ð5Ð5ùòk "ùó Bøô< ò Ø�f‰f�T�cˆlŠðús+   ÂJ9ÂJ9Ä
J>ÄJ>È$AK ËKËKÚstage_idc                 óx  — ||| j                  d«      xs | d   |d||dœ}t        j                  t        › d�t	        |«      |d¬«      }|j
                  dv rU|j                  «       j                  d	i «      j                  d
«      xs |j                  «       j                  d
«      }	d|	dfS 	 |j                  «       j                  d«      xs: |j                  «       j                  d«      xs t        |j                  «       «      }
ddd|j
                  › d|
› �fS # t        $ r |j                  dd }
Y Œ/w xY w)zBCria oportunidade no pipeline. Retorna (ok, opportunity_id, erro).r‚   rŒ   rÚ   )Ú
pipelineIdrÈ   rº   ÚpipelineStageIdÚstatusÚ	contactIdrà   ú/opportunities/rh   r¤   r¦   Úopportunityr½   TNr©   r²   rª   Fr«   rq   )
r;   r¬   r­   rÑ   rš   r¯   r¥   rm   rx   r°   )r´   r›   r‘   rÄ   r�   rü   rà   r±   r~   Úopp_idÚerros              r?   Úcriar_oportunidade_ghlr  k  s&  € ð "Ø!Ø—‘˜Ó#Ò3 t¨F¡|Ø#ØØØñ€Gô 	�‰Üˆ*�OÐ$Ü˜UÓ#ØØô		€Að 	‡}�}˜
Ñ"Ø—‘“—‘˜m¨RÓ0×4Ñ4°TÓ:ÒP¸a¿f¹f»h¿l¹lÈ4Ó>PˆØ�V˜TÐ!Ð!ðØ�v‰v‹x�|‰|˜IÓ&ÒN¨!¯&©&«(¯,©,°uÓ*=ÒNÄÀQÇVÁVÃXÃˆð �$˜% §¡˜¨b°°Ð7Ð7Ð7øô ò Ø�v‰v�d�sˆ|Šðús   Â.AD ÄD9Ä8D9c                 óÆ  — d}	 t        | j                  d«      xs d«      }|t        |dz  dz  «      z  }	 t        | j                  d«      xs d«      }|dk\  r|dz  }n|dk\  r|d	z  }n
|d
k\  r|d
z  }| j                  d«      r|dz  }| j                  d«      r|d
z  }| j                  d«      r|dz  }t	        |d«      S # t        $ r Y Œ˜w xY w# t        $ r d}Y ŒŠw xY w)uc   Calcula score 0-100 do perfil GMB com base em rating, avaliaÃ§Ãµes, descriÃ§Ã£o, categoria e fotos.r   Ú	avaliacaorÏ   é(   Únum_avaliacoesr§   é   rÎ   é   rC   Ú	descricaorh   Ú	categoriaÚ	tem_fotoséd   )Úfloatr;   ru   rx   Úmin)r´   ÚscoreÚratingÚns       r?   Úcalcular_score_gmbr  ˆ  s   € à€EðÜ�t—x‘x Ó,Ò1°Ó2ˆØ”�f˜q‘j BÑ&Ó'Ñ'ˆðÜ�—‘Ð)Ó*Ò/¨aÓ0ˆð 	ˆC‚xØ�‰‰Ø	
ˆbŠØ�‰‰Ø	
ˆbŠØ�‰ˆà‡x�x�ÔØ�‰ˆà‡x�x�ÔØ�‰ˆà‡x�x�ÔØ�‰
ˆÜˆu�c‹?Ðøô- ò Ùðûô
 ò ØŠðús"   „2C ·C Ã	CÃCÃC ÃC Frä   ÚlimiteÚcrm_typeÚpaisÚenriquecimento_autorz   Úfiltro_sem_siteÚfiltro_notaÚfiltro_site_gmbÚscore_minimoÚlatÚlngÚraio_kmc                 ó\  ‡ ‡‡‡‡
‡‡‡‡‡,‡-‡.‡/— t         ‰    Š.d‰.d<   ‰
‰.d<   ‰‰.d<   ‰
dk(  rdnd}‰.d   j                  d	t        «       › d
‰› d|› d‰› d‰› d�«       	 g }ˆ,ˆ-fd„}dt        dt        fˆˆˆ.ˆ ˆˆˆˆˆ
ˆf
d„Š,dt        fˆˆˆ.ˆ ˆˆˆ
fd„Š- |«       }‰.d   dk(  r!‰.d   j                  d	t        «       › d�«       y‰.d   dk(  r,‰.d   j                  d	t        «       › dt        |«      › d�«       t	        |«      }|r||rzt        |«      }|D �cg c]'  }|j                  d«      xs dj                  «       s|‘Œ) }}|t        |«      z
  }‰.d   j                  d	t        «       › d|› dt        |«      › d�«       |sWd‰.d<   t        j                  «       j                  «       ‰.d<   ‰.d   j                  d	t        «       › d �«       	 t        ‰.«       y|r9‰.d   j                  d	t        «       › d$t        |«      › d%t        |«      › d&�«       n,‰.d   j                  d	t        «       › d$t        |«      › d'�«       |�rþ‰.d   j                  d	t        «       › d(‰
› d)�«       t        |«      D �]¬  \  }Š/	 ‰
dk(  r"t        ‰/d*   ‰/j                  dd«      ‰¬+«      }nt!        ‰/d*   «      }|j                  d,«      r‰/j                  d,«      s|d,   ‰/d,<   |j                  d-«      r‰/j                  d-«      s|d-   ‰/d-<   |j                  d.«      r|d.   ‰/d.<   |j                  d/«      r|d/   ‰/d/<   |j                  d0d«      ‰/d0<   |j                  d1«      r|d1   ‰/d1<   |j                  d«      r‰/j                  d«      s|d   ‰/d<   |j                  d2«      r|d2   ‰/d2<   |j                  d3«      r|d3   ‰/d3<   d4j#                  |j                  d5g «      «      }‰.d   j                  d	t        «       › d6|d7z   › d8t        |«      › d9‰/d*   › d:|xs d;› d<�«       �Œ¯ ‰.d   j                  d	t        «       › d>�«       d?}d‰.d<   |�rbt        |«      D �]S  \  }Š/‰.d   dk(  r �nE|d@k(  rÚt%        ‰/|dA‰/j                  dBd«      ‰/j                  dCd«      g|	¬D«      \  } }!| ryt'        | ||	|xs dE|xs dF‰/d*   ¬G«      \  }"}#dH‰/dI<   | ‰/dJ<   |d7z  }|‰.dK<   |"rdLndM|#› d�}$‰.d   j                  d	t        «       › dN|d7z   › d8t        |«      › d9‰/d*   › dO|$› �
«       �n\‰.d   j                  d	t        «       › dP‰/d*   › dQ|!› �«       �n2t)        ‰/||«      \  } }!| røt+        ‰/| ||||«      \  }%}&}'|'xr dR|'j-                  «       v }(|%s|(r¡dH‰/dI<   | ‰/dJ<   |d7z  }|‰.dK<   |(rdSndT})‰.d   j                  d	t        «       › dU|d7z   › d8t        |«      › d9‰/d*   › d|)› �
«       |rœt/        ˆ/fdV„dWD «       «      rˆ	 t1        | ||‰/|&¬X«       ‰.d   j                  d	t        «       › dY‰/d*   › �«       nQ‰.d   j                  d	t        «       › d[‰/d*   › dQ|'› �«       n(‰.d   j                  d	t        «       › d\‰/d*   › dQ|!› �«       t        ‰.d   «      d]kD  r‰.d   d^d ‰.d<   t3        j4                  d_«       �ŒV |‰.dK<   |‰.d`<   d‰.d<   |r<‰.d   j                  d	t        «       › da|› d8t        |«      › dbt        |«      › dc�	«       n,‰.d   j                  d	t        «       › dat        |«      › dd�«       t        j                  «       j                  «       ‰.d<   	 ‰r`t        |«      d?kD  rRt7        ‰«       t9        ‰t        |«      «      }*‰.d   j                  d	t        «       › de|*df   › d8|*dg   › dh|*di   › dj�	«       	 t        ‰.«       yc c}w # t        $ r*}t        d!‰.j                  d"«      › d#|› �«       Y d}~yd}~ww xY w# t        $ r3}‰.d   j                  d	t        «       › d=‰/d*   › d#|› �«       Y d}~�Œ¼d}~ww xY w# t        $ r3}‰.d   j                  d	t        «       › dZ‰/d*   › d#|› �«       Y d}~�Œód}~ww xY w# t        $ r9}‰.d   j                  d	t        «       › dkt        |«      ddl › �«       Y d}~�Œd}~ww xY w# t        $ r*}t        d!‰.j                  d"«      › d#|› �«       Y d}~yd}~ww xY w# t        $ rµ}dm‰.d<   t        |«      ‰.dm<   t        j                  «       j                  «       ‰.d<   ‰.d   j                  d	t        «       › dnt        |«      › �«       	 t        ‰.«       n;# t        $ r*}+t        do‰.j                  d"«      › d#|+› �«       Y d}+~+nd}+~+ww xY wY d}~yY d}~yd}~ww xY w)pu~  Executa o scraper em thread separada com callbacks de progresso.

    Nota: os parÃ¢metros filtro_nota, filtro_site_gmb e score_minimo permanecem
    na assinatura por compatibilidade, mas NÃƒO sÃ£o mais aplicados durante a coleta.
    O score continua sendo calculado e salvo em cada lead; a filtragem por
    nota/site/score foi movida pra tabela de resultados (pÃ³s-coleta).
    Úem_andamentor   r  rz   ÚUSÚinÚemÚlogsú[z] Iniciando busca: rã   z
 (limite: rf   c                  óV   •— 	 ddl m}  | r ‰| «      S  ‰«       S # t        $ r d} Y Œw xY w)Nr   ©ÚGOOGLE_PLACES_KEYr6   )Úconfigr+  ÚImportError)r+  Ú_buscar_via_places_apiÚ_buscar_via_playwrights    €€r?   Úscrape_com_progressoz,run_prospector.<locals>.scrape_com_progressoÁ  s<   ø€ ð'Ý4ñ !Ù-Ð.?Ó@Ð@á-Ó/Ð/øô ò 'Ø$&Ò!ð'ús   ƒ š(§(Úapi_keyr7   c                 ón	  •
— d}d}‰"dk(  rdnd}‰!› d|› d‰› �}‰r3‰ r1‰#r/‰d   j                  dt        «       › d	|› d
‰#› d‰d›d‰ d›d�«       n#‰d   j                  dt        «       › d	|› d�«       g }t        ‰«      }d}d}d}	|	‰k  �r­‰d   dv r�n¤|ddœ}
|r||
d<   ‰r;‰ r9‰#r7t        t	        ‰#«      dz  d«      }dt	        ‰«      t	        ‰ «      dœ|dœi|
d<   	 t        j                  |d| |dœ|
d¬ «      }|j                  d!k7  r>‰d   j                  dt        «       › d"|j                  › d|j                  dd# › �«       �nð|j                  «       }|j                  d$g «      }|s�nÊt        ‰‰d%   t        |«      z   «      ‰d%<   |D �]v  }‰d   dv s|	‰k\  r �ng|j                  d&i «      j                  d'd(«      j                  «       }|rt        |«      d)k  rŒTt        |‰«      }||v r|d*z  }Œj|j                  d+d«      xs d}	 t	        |«      }|j                  d-d(«      xs d(}t        |j                  d.«      «      }|j                  d/d«      xs d}|d0k(  xr	 |xr |dkD  }||j                  d1d(«      j                  «       |j                  d2d(«      j                  «       |j                  d3d(«      j                  «       t!        |j                  d+d(«      «      ||j                  d4«      xs i j                  d'd(«      xs d(|j                  d5«      xs i j                  d'd(«      xs d(|||‰!‰d6dd7œ}t#        |«      |d8<   |j%                  |«       t'        ‰||‰|j                  d9d(«      ‰¬:«       |j                  |«       |	d*z  }	|	‰d;<   ‰d<   j                  |«       ‰d   j                  dt        «       › d=|	› d>|› d?|d9   xs d@› dA|d8   › �
«       t        ‰d   «      dBkD  s�Œl‰d   dCd ‰d<   �Œy |j                  dD«      }|snt)        j*                  d)«       |	‰k  r�Œ­|dkD  r#‰d   j                  dt        «       › dF|› dG�«       |S # t        $ r d,}Y �ŒVw xY w# t        $ r8}‰d   j                  dt        «       › dEt!        |«      dd# › �«       Y d}~Œxd}~ww xY w)HuN   Busca empresas via Google Places API (New) â€” oficial, sem risco de bloqueio.z2https://places.googleapis.com/v1/places:searchTextzàplaces.displayName,places.formattedAddress,places.nationalPhoneNumber,places.websiteUri,places.rating,places.userRatingCount,places.id,places.editorialSummary,places.primaryTypeDisplayName,places.photos,places.businessStatusr$  r%  r&  rã   r'  r(  z] Google Places API: buscando 'u   ' | cÃ­rculo zkm em (z.4frí   rf   z'...r   Nr   ©Ú	canceladoÚpausador  )Ú	textQueryÚmaxResultCountÚ	pageTokeng     @�@g     jè@Úcircle)ÚlatitudeÚ	longitude)ÚcenterÚradiusÚlocationBiasr”   )r—   zX-Goog-Api-KeyzX-Goog-FieldMaskrh   r¤   r§   z] Places API erro: r  ÚplacesÚtotalÚdisplayNamer°   r6   é   rÇ   r  g        ÚbusinessStatusÚphotosÚuserRatingCountÚOPERATIONALÚnationalPhoneNumberÚ
websiteUriÚformattedAddressÚeditorialSummaryÚprimaryTypeDisplayNameF)rŒ   r„   rå   ræ   r  r
  r  r  r  Úbusiness_statusÚverificado_gmbrä   rƒ   Úenviado_crmr›   Ú	score_gmbr„   ©r‚   rƒ   r„   r…   Ú	progressoÚleadsú] Coletado (ú): ú | úsem telú	 | score rÎ   éÎÿÿÿÚnextPageTokenu   ] Places API exceÃ§Ã£o: ú] õ,    empresa(s) puladas (jÃ¡ prospectadas antes))rZ   Ú_tsr€   r  r  r¬   r­   r¯   r°   r¥   r;   rS   r=   r�   rx   Úboolrm   r  Úaddr‹   rO   Úsleep)$r1  Ú
PLACES_URLÚ
FIELD_MASKÚpreposicao_qrÉ   rR  ÚregistroÚpuladosÚ
page_tokenÚ	coletadosÚbodyÚraio_mr~   r¼   r?  ÚplacerŒ   r�   Ú
rating_valr  rL  Útem_fotos_gmbÚnum_aval_gmbrM  r´   r   rƒ   rz   Újobr…   r  r  r   rä   r  r!  s$                             €€€€€€€€€€r?   r.  z.run_prospector.<locals>._buscar_via_places_apiÌ  sw  ø€ àMˆJð |ˆJà#'¨4¢<™4°TˆLð �g˜Q˜|˜n¨A¨f¨XÐ6ˆEÙ‘s™wØ�F‘×"Ñ"Øœ›�wÐ=¸e¸WÀMÐRYÐQZÐZaÐbeÐfiÐajÐjlÐmpÐqtÐluÐuvÐwõð �F‘×"Ñ" Q¤s£u gÐ-LÈUÈGÐSWÐ#XÔYàˆEÜ)¨(Ó3ˆHØˆGØˆJØˆIà˜fÓ$Ø�x‘=Ð$<Ñ<Ùà%*¸bÑA�ÙØ(2�D˜Ñ%ñ ™3¡7Ü ¤ w£°&Ñ!8¸'ÓB�Fà Ü38¸³:ÌEÐRUËJÑ&WØ&,ñ#ð,�D˜Ñ(ðaÜ Ÿ™Ø"à,>Ø.5Ø0:ñ!ð
 "Ø "ô	�Að —}‘}¨Ò+Ø˜F™×*Ñ*¨Q¬s«u¨gÐ5HÈÏÉÈÐWXÐYZ×Y_ÑY_Ð`dÐadÐYeÐXfÐ+gÔhÙàŸ6™6›8�DØ!ŸX™X h°Ó3�FÙ!Ùä#& v¨s°7©|¼cÀ&»kÑ/IÓ#J�C˜‘Là!'ó A<˜Ø˜x™=Ð,DÑDÈ	ÐU[ÒH[Ú!à$Ÿy™y¨¸Ó;×?Ñ?ÀÈÓK×QÑQÓS˜Ù#¤s¨4£y°1¢}Ø$ä .¨t°VÓ <˜Ø  HÑ,Ø# q™L˜GØ$à%*§Y¡Y¨x¸Ó%;Ò%@¸q˜
ð)Ü%*¨:Ó%6˜Fð +0¯)©)Ð4DÀbÓ*IÒ*OÈR˜Ü(,¨U¯Y©Y°xÓ-@Ó(A˜Ø',§y¡yÐ1BÀAÓ'FÒ'KÈ!˜à+¨}Ñ<ò 1Ø -ò1à ,¨qÑ 0ð 'ð %)Ø(-¯	©	Ð2GÈÓ(L×(RÑ(RÓ(TØ$)§I¡I¨l¸BÓ$?×$EÑ$EÓ$GØ(-¯	©	Ð2DÀbÓ(I×(OÑ(OÓ(QÜ),¨U¯Y©Y°xÀÓ-DÓ)EØ.:Ø*/¯)©)Ð4FÓ*GÒ*MÈ2×)RÑ)RÐSYÐ[]Ó)^Ò)dÐbdØ*/¯)©)Ð4LÓ*MÒ*SÐQS×)XÑ)XÐY_ÐacÓ)dÒ)jÐhjØ)6Ø/>Ø.<Ø%*Ø&,Ø+0Ø*.ñ ˜ô( -?¸tÓ,D˜˜[Ñ)à Ÿ™ UÔ+Ü(¨°5À$ÈvØ26·(±(¸:ÀrÓ2JÐSYõ[àŸ™ TÔ*Ø! Q™˜	Ø+4˜˜KÑ(Ø˜G™×+Ñ+¨DÔ1Ø˜F™×*Ñ*Ø¤£˜w l°9°+¸SÀÀÀcÈ$ÈzÑJZÒJgÐ^gÐIhÐhqÐrvð  xCñ  sDð  rEð  Fôô ˜s 6™{Ó+¨bÔ0Ø*-¨f©+°c°dÐ*;˜C ›KðCA<ðF "&§¡¨/Ó!:�JÙ%Øä—J‘J˜q”Mða ˜fÔ$ðl ˜Š{Ø�F‘×"Ñ" Q¤s£u g¨R°¨yÐ8dÐ#eÔfàˆLøôA  )ò )Ø%(›Fð)ûôr !ò Ø˜‘K×&Ñ&¨¬3«5¨'Ð1IÌ#ÈaË&ÐQUÐRUÈ,ÈÐ'XÔYÜûðúsW   ÃA(Q3 Å$Q3 Å-B Q3 ÈQ!ÈGQ3 Ï9!Q3 ÐQ3 Ñ!Q0Ñ,Q3 Ñ/Q0Ñ0Q3 Ñ3	R4Ñ<.R/Ò/R4c                  óz  •— ddl m}  g }‰&dk(  rdnd}‰%› d|› d‰ › �}‰&dk(  rdnd} | «       5 }|j                  j                  d	¬
«      }|j	                  «       }‰"d   j                  dt        «       › d|› �«       |j                  d|j                  dd«      › d|› �«       |j                  d«       ‰"d   dk(  r|j                  «        |cddd«       S t        ‰$dz  d«      }t        |«      D ]J  }	‰"d   dk(  r n@	 |j                  d«      j                  }
|
j                  d«       |j                  d«       ŒL |j                  d«      j#                  «       }t%        |«      ‰"d<   ‰"d   j                  dt        «       › dt%        |«      › d‰$› d�«       t'        ‰!«      }d}t)        |«      D �]H  \  }}‰"d   dv st%        |«      ‰$k\  r �n-	 i }	 |j+                  d d!¬"«      xs d#}|r"|j-                  «       j/                  d$«      d   n1|j1                  d!¬"«      j-                  «       j/                  d$«      d   |d%<   |d%   rt%        |d%   «      d&k  rŒªt3        |d%   ‰ «      }||v r|d'z  }ŒÃ|j5                  «        |j                  d(«       d)d*d+„ fd,d-d.„ fd/d0d1„ ffD ]—  \  }}}	 |j                  |«      j                  }|j+                  d2|v sd3|v rd4nd4d(¬"«      }|d-k(  r|j+                  d5d(¬"«      xs d#||<   n8|d0k(  r$|j1                  d(¬"«      j-                  «       ||<   n ||xs d#«      ||<   Œ™ |j7                  d6d#«       d}	 |j                  d7«      j                  j1                  d¬"«      }t9        j:                  d8|xs d#«      }|r:t=        |j?                  d'«      j                  d9d#«      j                  d:d#«      «      }||d;<   	 |jA                  d6«      s@t9        j:                  d<|xs d#«      }|r$|j?                  d'«      j                  d:d9«      |d6<   d#}d=D ]@  }	 |j                  |«      j                  j1                  d!¬"«      j-                  «       }|r nŒB ||d><   	 |j                  d?«      j                  j1                  d!¬"«      j-                  «       |d@<   	 |j                  dA«      jC                  «       dkD  |dB<   	 |j                  dD«      j                  }|jE                  d!¬"«      |dE<   ‰%|dF<   ‰ |dG<   dC|dH<   d|dI<   tG        |«      |dJ<   |jI                  |«       tK        ‰!||d%   ‰ |jA                  d*d#«      ‰#¬K«       |j                  |«       t%        |«      ‰"dL<   ‰"dM   j                  |«       ‰"d   j                  dt        «       › dN|d'z   › dO|d%   › dP|jA                  d*«      xs dQ› dR|dJ   › �
«       t%        ‰"d   «      dSkD  r‰"d   dTd ‰"d<   �ŒK |dkD  r#‰"d   j                  dt        «       › d|› dX�«       |j                  «        ddd«       |S # t         $ r Y  �Œw xY w# t         $ r Y �Œ«w xY w# t         $ r	 d#||<   Y �ŒËw xY w# t         $ r Y �Œ«w xY w# t         $ r Y �Œdw xY w# t         $ r Y �Œpw xY w# t         $ r	 d#|d@<   Y �Œ w xY w# t         $ r	 dC|dB<   Y �Œïw xY w# t         $ r	 dC|dE<   Y �ŒÓw xY w# t         $ r?}‰"d   j                  dt        «       › dU|d'z   › dVtM        |«      ddW › �«       Y d}~�Œvd}~ww xY w# 1 sw Y   |S xY w)Yz;Fallback: busca via scraping do Google Maps com Playwright.r   )Úsync_playwrightr$  r%  r&  rã   zhl=en&gl=uszhl=pt-BR&gl=brT)Úheadlessr'  r(  z] Buscando (scraping): z#https://www.google.com/maps/search/ú+ú?i¸  r   r4  NrÏ   r  zdiv[role="feed"]zel => el.scrollTop += 1500iÜ  za[href*="/maps/place/"]r@  rZ  u(    resultados encontrados, coletando atÃ© z	 novos...r3  z
aria-labeléè  ri   r6   ú
rŒ   rB  rÇ   iÐ  z[data-item-id^="phone"]r„   c                 óB   — | j                  dd«      j                  «       S )Nz
phone:tel:r6   )Úreplacer=   ©rÂ   s    r?   ú<lambda>z@run_prospector.<locals>._buscar_via_playwright.<locals>.<lambda>œ  s   € ÈaÏiÉiÐXdÐfhÓNi×NoÑNoÓNq€ rA   z[data-item-id="authority"]rå   c                 ó   — | xs dS )Nr6   r™   rw  s    r?   rx  z@run_prospector.<locals>._buscar_via_playwright.<locals>.<lambda>�  s   € ÈQÊWÐRT€ rA   z[data-item-id^="address"]ræ   c                 ó   — | S rN   r™   rw  s    r?   rx  z@run_prospector.<locals>._buscar_via_playwright.<locals>.<lambda>ž  s   € ÐPQ€ rA   r»   Ú	authorityzdata-item-idÚhrefr  z+button[jsaction*="pane.rating.moreReviews"]z
([\d\.,]+)ú.rF   r
  z$(\d[\.,]\d)\s*(?:estrelas|stars|/5)?)z![data-attrid="kc:/local:summary"]z&div[jsaction*="pane.editorialSummary"]r  z(button[jsaction*="pane.rating.category"]r  z(button[jsaction*="pane.heroHeaderImage"]r  Fzv[aria-label*="verificado" i], [aria-label*="verified" i], [data-tooltip*="verificado" i], [data-tooltip*="verified" i]rM  rä   rƒ   rN  r›   rO  rP  rQ  rR  rS  rT  rU  rV  rW  rÎ   rX  z] Aviso card rq   éP   r[  )'Úplaywright.sync_apiro  ÚchromiumÚlaunchÚnew_pagerZ   r\  Úgotorv  Úwait_for_timeoutrw   r  ÚrangeÚlocatorÚfirstÚevaluaterx   ÚallrS   r€   Ú	enumerateÚget_attributer=   rH   Ú
inner_textr�   ÚclickÚ
setdefaultr¾   Úsearchru   Úgroupr;   ÚcountÚ
is_visibler  r^  r‹   rm   )'ro  rR  rb  rÉ   Ú
lang_paramÚpÚbrowserÚpageÚscrollsÚiÚpanelÚcardsrc  rd  ÚidxÚcardr´   Úariar�   Úseletorrø   Ú	transformÚelÚattrÚnum_avalÚaval_txtÚmÚm_starr  ÚselÚverif_elr   rƒ   rz   rm  r…   r  rä   r  s'                                   €€€€€€€r?   r/  z.run_prospector.<locals>._buscar_via_playwright^  sA  ø€ å;àˆEØ#'¨4¢<™4°TˆLØ�g˜Q˜|˜n¨A¨f¨XÐ6ˆEØ*.°$ª,™Ð<LˆJá Ó"ð [  aØŸ*™*×+Ñ+°TÐ+Ó:�Ø×'Ñ'Ó)�à�F‘×"Ñ" Q¤s£u gÐ-DÀUÀGÐ#LÔMØ—	‘	Ð?ÀÇÁÈcÐSVÓ@WÐ?XÐXYÐZdÐYeÐfÔgØ×%Ñ% dÔ+à�x‘= KÒ/Ø—M‘M”OØ ÷[ ñ [ ô ˜f¨™k¨2Ó.�Ü˜w›ò �AØ˜8‘}¨Ò3ÙðØ $§¡Ð-?Ó @× FÑ F˜ØŸ™Ð'CÔDØ×-Ñ-¨dÕ3ðð Ÿ™Ð%>Ó?×CÑCÓE�Ü" 5›z��G‘Ø�F‘×"Ñ" Q¤s£u g¨R´°E³
¨|Ð;cÐdjÐckÐktÐ#uÔvä-¨hÓ7�Ø�ä!*¨5Ó!1ó y!‘I�C˜Ø˜8‘}Ð(@Ñ@ÄCÈÃJÐRXÒDXÚðv!Ø!˜ð%Ø#'×#5Ñ#5°lÈDÐ#5Ó#QÒ#WÐUW˜DÙJN¨4¯:©:«<×+=Ñ+=¸dÓ+CÀAÒ+FÐTX×TcÑTcÐlpÐTcÓTq×TwÑTwÓTy×TÑTð  AEó  UFð  GHñ  UI˜D ™Lð  $ Fš|¬s°4¸±<Ó/@À1Ò/DØ$ä .¨t°F©|¸VÓ D˜Ø  HÑ,Ø# q™L˜GØ$àŸ
™
œØ×-Ñ-¨dÔ3ð 7¸
ÑDqÐrØ9¸6ÑCTÐUØ8¸*ÁkÐRð:ò 1Ñ5˜G U¨Ið

1Ø%)§\¡\°'Ó%:×%@Ñ%@ Ø')×'7Ñ'7È'ÐU\ÑJ\Ð`kÐovÑ`v¹ð  }Kð  UYÐ'7ó  (Z Ø#(¨F¢?Ø24×2BÑ2BÀ6ÐSWÐ2BÓ2XÒ2^Ð\^ D¨¢KØ%*¨jÒ%8Ø24·-±-È°-Ó2M×2SÑ2SÓ2U D¨¢Ká2;¸DºJÀBÓ2G D¨¡Køð1ð" Ÿ™¨°RÔ8ð $%˜ð!Ø'+§|¡|Ð4aÓ'b×'hÑ'h×'sÑ'sð  }AÐ'só  (B˜HÜ "§	¡	¨-¸ºÀRÓ H˜AÙ Ü+.¨q¯w©w°q«z×/AÑ/AÀ#ÀrÓ/J×/RÑ/RÐSVÐXZÓ/[Ó+\ ð 2:˜Ð-Ñ.ð!Ø#'§8¡8¨KÔ#8Ü)+¯©Ð3ZÐ\`Ò\fÐdfÓ)g Ù#)Ø8>¿¹ÀQ»×8OÑ8OÐPSÐUXÓ8Y D¨Ñ$5ð
 %'˜	ð$ò 	)˜Cð)Ø,0¯L©L¸Ó,=×,CÑ,C×,NÑ,NÐW[Ð,NÓ,\×,bÑ,bÓ,d 	Ù#,Ù$)ð $-ð	)ð -6˜˜[Ñ)ð3Ø04·±Ð=gÓ0h×0nÑ0n×0yÑ0yð  CGÐ0yó  1H÷  1Nñ  1Nó  1P˜D Ñ-ð
6Ø04·±Ð=gÓ0h×0nÑ0nÓ0pÐstÑ0t˜D Ñ-ð;Ø'+§|¡|ð!_ó(÷ $™eð %ð 6>×5HÑ5HÐQUÐ5HÓ5V˜DÐ!1Ñ2ð ).˜˜W™Ø)/˜˜X™Ø.3˜˜]Ñ+Ø-1˜˜\Ñ*ô -?¸tÓ,D˜˜[Ñ)à Ÿ™ UÔ+Ü(¨°5À$ÀvÁ,ÐW]Ø26·(±(¸:ÀrÓ2JÐSYõ[àŸ™ TÔ*Ü+.¨u«:˜˜KÑ(Ø˜G™×+Ñ+¨DÔ1Ø˜F™×*Ñ*Ø¤£˜w l°3°q±5°'¸¸TÀ&¹\¸NÈ#ÈdÏhÉhÐWaÓNbÒNoÐfoÐMpÐpyÐz~ð  @Kñ  {Lð  zMð  Nôô ˜s 6™{Ó+¨bÒ0Ø*-¨f©+°c°dÐ*;˜C ™Kùðky!ðv ˜Q’;Ø˜‘K×&Ñ&¨¬3«5¨'°°G°9Ð<hÐ'iÔjØ—‘”÷w[ ðz ˆLøôS %ò Ûðûô$  )ò %Ú$ð%ûô8 $-ò 1Ø.0  U¤ð1ûô  )ò !Ú ð!ûô  )ò !Ú ð!ûô $-ò )Ú (ð)ûô  )ò 3Ø02˜D Ô-ð3ûô  )ò 6Ø05˜D Ô-ð6ûô  )ò ;Ø5:˜DÐ!1Ô2ð;ûô. %ò !Ø˜F™×*Ñ*¨Q¬s«u¨g°]À3ÀqÁ5À'ÈÌCÐPQËFÐSVÐTVÈKÈ=Ð+YÔZÝ ûð!ú÷k[ ðz ˆLús˜  ­B \0Ã'\0Ã?=Y Ä<B\0Ç[%ÇA0YÉ[%É\0É[%É4\0É59[%Ê/BY!Ì?[%ÍBY6Ï[%ÏAZÐ.[%Ð6;ZÑ1	[%Ñ;<Z&Ò8%Z;Ó0[ÔC-[%×;;\0Ù 	YÙ	\0ÙYÙ\0Ù	YÙ[%Ù\0ÙYÙ[%Ù!Y3	Ù/[%Ù2Y3	Ù3[%Ù6	ZÙ?[%ÚZÚ[%Ú	ZÚ[%ÚZÚ[%Ú	Z#	Ú[%Ú"Z#	Ú#[%Ú&Z8Ú4[%Ú7Z8Ú8[%Ú;[Û	[%Û[Û[%Û["Û[%Û!["Û"[%Û%	\-Û.4\(Ü"\0Ü(\-Ü-\0Ü0\:r4  z] Job cancelado pelo usuarioNr5  z"] Pausado pelo usuario - enviando z leads coletados ao CRM...rå   r6   z] Filtro 'sem site': z com site ignorados, u    vÃ£o ao CRMÚ	concluidoÚconcluido_emz] Nenhum lead encontradoú*[jobs_historico] erro ao salvar conclusao r½   rq   rZ  z leads coletados. Enviando z
 ao CRM...uQ    leads coletados. Modo AnÃ¡lise: leads ficam na tabela para anÃ¡lise lead a lead.z] Enriquecendo leads (z) antes de enviar ao CRM...rŒ   )ré   rƒ   r„   r¸   ÚcnpjÚdecisor_nomeÚdecisor_cargoÚlinkedin_urlÚ	instagramÚfacebookrí   rì   z	] Enriq (rÇ   ú/rT  z [zsem dados extrasú]z] Enriq erro para u/   ] Enriquecimento concluÃ­do. Enviando ao CRM...r   Úunnichatr¹   rä   rƒ   ©rœ   Ú8TgKxh0VK37bGNkbN8yOÚHThNTr24Yy2fN0vmeLm2©r�   rž   rŸ   TrN  r›   Úleads_enviadosz
+ pipelinez(pipeline: z] Unnichat (z	 enviado z] Unnichat: falhou para rU  rò   u   jÃ¡ existe no pipelineÚenviadoz] CRM (c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrN   ©r;   )Ú.0rÁ   r´   s     €r?   ú	<genexpr>z!run_prospector.<locals>.<genexpr>‡  s   øè ø€ ò  ;CÈ1¸4¿8¹8ÀA¿;ñ  ;Cùs   ƒ)r¸   r«  r¬  r®  ©Úopportunity_idz] Campos enriquecidos salvos: z"] Aviso: erro ao salvar campos de z ] CRM: oportunidade falhou para z] CRM: contato falhou para rÎ   rX  ç      à?rR  z] Concluido: z leads enviados ao CRM (z total coletados)uJ    leads na tabela (modo AnÃ¡lise). Use 'Analisar Lead' pra estudar cada um.z	] Quota: Úusadosr  ú (Ú
disponivelz disponiveis)z] Aviso quota: r~  r  ú] ERRO: ú%[jobs_historico] erro ao salvar erro )ÚjobsrZ   r\  rm   ÚlistrS   r;   r=   r   rˆ   r‰   r&   rx   ry   rŠ  Úenriquecer_empresa_usÚenriquecer_empresaró   rÃ   r³   rû   r  r�   ÚanyÚ_adicionar_nota_ghlrO   r_  r%   r$   )0r…   rä   rƒ   r  r‘   rÄ   r�   rü   r  rœ   r  r  rz   r  r  r  r  r  r   r!  Ú
preposicaoÚleads_coletadosr0  Útodos_leads_para_exibirÚantesÚlÚpulados_siter   r˜  Údadosrì   Úenviadosr›   Úerr_contatoÚpip_okÚpip_errÚ
status_pipÚokr¿  Ú	err_oportÚis_duplicateÚ
status_msgÚquotaÚeer.  r/  rm  r´   s0   ````      ` `    ```                        @@@@r?   Úrun_prospectorrÞ  ¨  sB  ÿü€ ô ˆv‰,€CØ"€Cˆ�MØ€Cˆ�KØ€Cˆ
�OØ š‘¨4€JØˆ�K×Ñ˜œ3›5˜'Ð!4°U°G¸1¸Z¸LÈÈ&ÈÐQ[Ð\bÐ[cÐcdÐeÔfðEQØˆõ		0ðP	¬Cð P	´D÷ P	ö P	ðdf	¬÷ f	ó f	ñP /Ó0ˆàˆx‰=˜KÒ'Ø�‰K×Ñ ¤3£5 'Ð)EÐFÔGØàˆx‰=˜IÒ%Ø�‰K×Ñ ¤3£5 'Ð)KÌCÐP_ÓL`ÐKaÐa{Ð|Ô}ô #' Ó"7Ðñ ™Ü˜Ó(ˆEà*öØØŸ™˜f›Ò+¨×2Ñ2Ô4ò ðˆOð ð !¤3 Ó#7Ñ7ˆLØ�‰K×ÑØ”C“E�7Ð/°¨~Ð=RÜ�Ó'Ð(¨ð6ôñ
 'Ø'ˆC�‰MÜ"*§,¡,£.×":Ñ":Ó"<ˆC�ÑØ�‰K×Ñ ¤3£5 'Ð)AÐBÔCðYÜ$ SÔ)ð áØ�‰K×Ñ ¤3£5 '¨¬CÐ0GÓ,HÐ+IÐIdÔehÐixÓeyÐdzð  {Eð   Fõ  Gà�‰K×Ñ ¤3£5 '¨¬CÐ0GÓ,HÐ+Ið  J[ð   \ô  ]ò Ø�‰K×Ñ ¤3£5 'Ð)?À¸vÐE`ÐaÔbÜ$ _Ó5ó Y‘��4ðYØ˜t’|Ü 5Ø  ™LØ$(§H¡H¨V°RÓ$8Ø#)ô!™ô !3°4¸±<Ó @˜à—y‘y Ô,°T·X±X¸jÔ5IØ+0°Ñ+<˜˜ZÑ(Ø—y‘y Ô)°$·(±(¸7Ô2CØ(-¨g©˜˜W™Ø—y‘y Ô(Ø',¨V¡}˜˜V™Ø—y‘y Ô0Ø/4°^Ñ/D˜˜^Ñ,Ø05·	±	¸/È2Ó0N˜˜_Ñ-Ø—y‘y Ô0Ø/4°^Ñ/D˜˜^Ñ,Ø—y‘y Ô(°·±¸&Ô1AØ',¨V¡}˜˜V™Ø—y‘y Ô-Ø,1°+Ñ,>˜˜[Ñ)Ø—y‘y Ô,Ø+0°Ñ+<˜˜ZÑ(Ø!ŸY™Y u§y¡y°¸2Ó'>Ó?�FØ˜‘K×&Ñ&¨¬3«5¨'°¸1¸Q¹3¸%¸qÄÀ_ÓAUÐ@VÐVYÐZ^Ð_eÑZfÐYgÐgiÐjpò  kGð  uGð  jHð  HIð  (Jö  Kð;Yð@ �‰K×Ñ ¤3£5 'Ð)XÐYÔZàˆØ&ˆˆH‰ò Ü$ _Ó5ó B ‘��4Ø�x‘= KÒ/Úà˜zÒ)ä.DØ˜eÐ&8¸$¿(¹(À7ÈBÓ:OÐQU×QYÑQYÐZbÐdfÓQgÐ%hØ&3ô/Ñ+�J ñ "ä*EØ&¨¨}Ø(3Ò(MÐ7MØ&.Ò&HÐ2HØ*.¨v©,ô	+™˜ ð /3˜˜]Ñ+Ø-7˜˜\Ñ*Ø  A™˜Ø08˜Ð,Ñ-Ù5;¡\À;ÈwÈiÐWXÐAY˜
Ø˜F™×*Ñ*Ø¤£˜w l°1°Q±3°%°q¼¸_Ó9MÐ8NÈcÐRVÐW]ÑR^ÐQ_Ð_hÐisÐhtÐuöð ˜F™×*Ñ*Ø¤£˜wÐ&>¸tÀF¹|¸nÈCÐP[È}Ð]öô
 /@ÀÀeÈ[Ó.YÑ+�J Ù!Ü8NÈtÐU_ÐafÐhsð  vAð  CKó  9LÑ5˜˜N¨IØ'0Ò'U°[ÀIÇOÁOÓDUÐ5U˜Ù¡Ø26˜D Ñ/Ø1;˜D Ñ.Ø$¨™M˜HØ4<˜CÐ 0Ñ1ÙEQÑ)AÐW`˜JØ ™K×.Ñ.Ø"#¤C£E 7¨'°!°A±#°°a¼¸OÓ8LÐ7MÈSÐQUÐV\ÑQ]ÐP^Ð^_Ð`jÐ_kÐ lôñ  3´só  ;Cð  QBô  ;Cô  8Cð!yÜ$7¸
ÀEÈ;ÐX\Ðm{Õ$|Ø$'¨¡K×$6Ñ$6Ø*+¬C«E¨7Ð2PÐQUÐV\ÑQ]ÐP^Ð(_õ%&ð   ™K×.Ñ.Ø"#¤C£E 7Ð*JÈ4ÐPVÉ<È.ÐX[Ð\eÐ[fÐ gõð ˜F™×*Ñ*Ø¤£˜wÐ&AÀ$ÀvÁ,ÀÈsÐS^ÐR_Ð`ôô �s˜6‘{Ó# bÒ(Ø"% f¡+¨c¨dÐ"3�C˜‘Kä—
‘
˜3–ðEB ðH !)ˆÐÑà.ˆˆG‰Ø#ˆˆH‰ÙØ�‰K×ÑØ”C“E�7˜-¨ z°´3°Ó3GÐ2HÐH`ÔadÐe|Óa}Ð`~ð  Pð  Qõð �‰K×ÑØ”C“E�7˜-¬Ð,CÓ(DÐ'Eð  FPð  Qôô 'Ÿl™l›n×6Ñ6Ó8ˆˆNÑð	HÙœCÐ 7Ó8¸1Ò<Ü)¨(Ô3Ü)¨(´CÐ8OÓ4PÓQ�Ø�F‘×"Ñ"Øœ›�w˜i¨¨h©Ð'8¸¸%À¹/Ð9JÈ"ÈUÐS_ÑM`ÐLaÐanÐoôð	UÜ  Õ%ùòEøô  ò YÜÐBÀ3Ç7Á7È4Ã=À/ÐQSÐTUÐSVÐW×XÐXØûðYûôT !ò YØ˜‘K×&Ñ&¨¬3«5¨'Ð1CÀDÈÁLÀ>ÐQSÐTUÐSVÐ'W×XÒXûðYûô| (1ò !yØ$'¨¡K×$6Ñ$6¸¼3»5¸'ÐAcÐdhÐioÑdpÐcqÐqsÐtuÐsvÐ7w×$xÒ$xûð!yûôL ò 	HØ�‰K×Ñ ¤3£5 '¨¼¸Q»ÀÀ¸¸ÐF×GÒGûð	Hûô
 ò 	UÜÐ>¸s¿w¹wÀt»}¸oÈRÐPQÈsÐS×TÑTûð	Uûô ò QØˆˆH‰Ü˜!“fˆˆF‰Ü&Ÿl™l›n×6Ñ6Ó8ˆˆNÑØˆF‰×Ñ˜Qœs›u˜g X¬c°!«f¨XÐ6Ô7ð	QÜ  Õ%øÜò 	QÜÐ9¸#¿'¹'À$»-¸ÈÈ2È$ÐO×PÑPûð	QúÜPô &ûðQús)  ÁA$c- ÃAc- Ä,^9Ä?Bc- Ç^> ÇBc- É7F%_4ÐGc- ×05`3Ø%D$c- Ý
A"a2 Þ-b7 Þ9c- Þ>	_1ß _,ß'c- ß,_1ß1c- ß4	`0ß=(`+à%c- à+`0à0c- à3	a/à<(a*á$c- á*a/á/c- á2	b4á;.b/â)c- â/b4â4c- â7	c*ã  c%ã c- ã%c*ã*c- ã-	f+ã6A#f&åe&å%f&å&	få/ fæf&æfæf&æ&f+c                  óH   — t        j                  «       j                  d«      S )Nz%H:%M:%S)r   rˆ   Ústrftimer™   rA   r?   r\  r\  Æ  s   € Ü�<‰<‹>×"Ñ" :Ó.Ð.rA   c                  ó¢   — 	 t         r9t         j                  r)t         j                  t        t         j                  «      fS y# t
        $ r Y yw xY w)uQ   Retorna (conta_id, user_id) do usuÃ¡rio logado, ou (None, None) fora de contexto.©NN)r   Úis_authenticatedrz   ru   r½   rx   r™   rA   r?   Ú_dono_atualrä  Ê  sH   € ðÝœL×9Ò9Ü×(Ñ(¬#¬l¯o©oÓ*>Ð>Ð>ð øô ò ØØðús   ‚>A Á	AÁAc                 ó   — t        t        j                  «       «      d d }t        «       \  }}i d|“dd“d| “d|“d|“d|“d	|“d
d“dd“d|“dd“dg “dg “dd “dt	        j
                  «       j                  «       “dd “t        |<   t        t        «      t        kD  r6t        t        j                  «       d„ ¬«      }|d t          D ]	  }t        |= Œ 	 t        t        |   «       |S # t        $ r}t        d|› d|› �«       Y d }~|S d }~ww xY w)Né   r½   ÚtipoÚ
prospeccaorä   rƒ   r  rz   rc   r   Ú
aguardandorQ  r   r@  r¸  rR  r'  r  Ú	criado_emr©  c                 ó   — t         |    d   S ©Nrê  ©rÆ  ©rÁ   s    r?   rx  z_novo_job.<locals>.<lambda>ê  ó   € ¼$¸q¹'À+Ñ:N€ rA   ©Úkeyõ*   [jobs_historico] erro ao salvar criaÃ§Ã£o rq   )rm   ÚuuidÚuuid4rä  r   rˆ   r‰   rÆ  rS   ÚMAX_JOBS_HISTORYÚsortedÚkeysr&   rx   ry   )	rä   rƒ   r  r…   Ú_cidÚ_uidÚids_ordenadosÚold_idr   s	            r?   Ú	_novo_jobrü  Ô  s‰  € Ü”—‘“Ó˜r Ð"€FÜ“�J€Dˆ$ðØˆfðà�ðð 	�ðð 	�&ð	ð
 	�&ðð 	�Dðð 	�4ðð 	�,ðð 	�Qðð 	�ðð 	˜!ðð 	�ðð 	�ðð 	�ðð 	”X—\‘\“^×-Ñ-Ó/ðð  	˜ð!„Dˆ�Lô$ Œ4ƒyÔ#Ò#ÜœtŸy™y›{Ñ0NÔOˆØ#Ð$6Ô&6Ð%6Ð7ò 	ˆFÜ�V‘ð	ðJÜœT &™\Ô*ð €Møô ò JÜÐ:¸6¸(À"ÀQÀCÐH×IÐIØ€MûðJús   ÃC( Ã(	DÃ1DÄDz//opt/mia/workspace/prospeccao_ativa/enriq_leadsT)Úexist_okrR  c                 ód   — t         | › d�z  j                  t        j                  |d¬«      «       y )Nú.jsonF)Úensure_ascii)ÚENRIQ_LEADS_DIRÚ
write_textr¥   Údumps)r…   rR  s     r?   Ú_persistir_leads_enriqr  ø  s(   € Ü˜&˜ Ð'Ñ'×3Ñ3´D·J±J¸uÐSXÔ4YÕZrA   c                 ó„   — t         | › d�z  }|j                  «       r#t        j                  |j	                  «       «      S g S )Nrÿ  )r  rÙ   r¥   ÚloadsÚ	read_text)r…   rÞ   s     r?   Ú_carregar_leads_enriqr  ü  s6   € Ü˜V˜H EÐ*Ñ*€AØ‡x�x„zÜ�z‰z˜!Ÿ+™+›-Ó(Ð(Ø€IrA   Úempresasc                 óð  — t        t        j                  «       «      d d }t        «       \  }}|d| ||ddt	        | «      dg g d t        j                  «       j                  «       d dœt        |<   t	        t        «      t        kD  r6t        t        j                  «       d„ ¬«      }|d t          D ]	  }t        |= Œ 	 t        t        |   «       |S # t        $ r}t        d|› d	|› �«       Y d }~|S d }~ww xY w)
Nræ  Úenriquecimentoré  r   )r½   rç  r	  rz   rc   r   rQ  r@  r¸  r'  rR  r  rê  r©  c                 ó   — t         |    d   S rì  rí  rî  s    r?   rx  z!_novo_job_enriq.<locals>.<lambda>  rï  rA   rð  rò  rq   )rm   ró  rô  rä  rS   r   rˆ   r‰   rÆ  rõ  rö  r÷  r&   rx   ry   )r	  r…   rø  rù  rú  rû  r   s          r?   Ú_novo_job_enriqr    sû   € Ü”—‘“Ó˜r Ð"€FÜ“�J€Dˆ$àØ ØØØØØÜ�X“ØØØØÜ—\‘\“^×-Ñ-Ó/Øñ„Dˆ�Lô  Œ4ƒyÔ#Ò#ÜœtŸy™y›{Ñ0NÔOˆØ#Ð$6Ô&6Ð%6Ð7ò 	ˆFÜ�V‘ð	ðJÜœT &™\Ô*ð €Møô ò JÜÐ:¸6¸(À"ÀQÀCÐH×IÐIØ€MûðJús   Â<C Ã	C5ÃC0Ã0C5Únome_empresac                 ó&  ‡2‡3‡4— ddl m} ddlm} ddlm}m} | ddddddddddddg dœ}d}	  |«       5 }t        |j                  | › d�dd	¬
«      «      }ddd«       D ]¢  }	|	j                  dd«      dz   |	j                  dd«      z   dz   |	j                  dd«      z   }
t        j                  d|
«      }|D ]C  }t        j                  dd|«      }t        |«      dk(  sŒ)t        t        |«      «      dkD  sŒA|} n |sŒ¢ n t        j                   d«       |�rót        j                  dd|«      }t        |«      dk(  �rÍ	 t%        j                  d|› �ddid¬«      }|j&                  dk(  �rŠ|j)                  «       }|j                  d«      dk7  �re|j                  dd«      j+                  «       }|r
||d<   ||d<   |j                  dd«      xs dj+                  «       |d<   |j                  d d«      |j                  d!d«      |j                  d"d«      |j                  d#d«      |j                  d$d«      fD �cg c]  }|r|‘Œ }}d%j-                  |«      |d&<   |}|dd' › d(|d'd › d(|dd) › d*|d)d › d+|dd › �	|d,<   |j                  d-g «      }|rL|d   j                  d.d«      j+                  «       |d/<   |d   j                  d0d«      j+                  «       |d1<   |d2   j/                  d3«       t        j                   d«       	  |«       5 }t        |j                  d4| › d5�dd	¬
«      «      }ddd«       D ]E  }	|	j                  dd«      Š4d6‰4v sŒ‰4j1                  d7«      d   |d8<   |d2   j/                  d9«        n t        j                   d«       |j                  d:«      s‘	  |«       5 }t        |j                  d;| › d5�dd	¬
«      «      }ddd«       D ]E  }	|	j                  dd«      Š4d<‰4v sŒ‰4j1                  d7«      d   |d:<   |d2   j/                  d=«        n t        j                   d«       |d>   s¨	  |«       5 }t        |j                  d5| › d?�dd	¬
«      «      }ddd«       D ]\  }	|	j                  dd«      Š4g d@¢}‰4sŒt3        ˆ4fdA„|D «       «      rŒ1‰4j1                  d7«      d   |d><   |d2   j/                  dB«        n t        j                   d«       |d>   �rTdCdDdEœ}|d>   j5                  d*«      }	  ||«      }|j6                  r(|j8                  r|j6                  › dF|j8                  › �}n|}||› dG�|› dH�|› dI�|› dJ�|› dK�g}t        «       }g } |D ],  }!|!sŒ|!|vsŒ|j;                  |!«       | j/                  |!«       Œ. dL}"| D �]ƒ  }#	 t%        j                  |#|d)dM¬N«      }$|$j&                  dk7  rŒ.|$j                  }% ||%dO«      }&|&j=                  dPdM¬Q«      D �]8  }'|'d   }(dR|(v rd|j                  dS«      sSt        j>                  dT|(«      })|)r;|)jA                  d«      dUvr(dV|)jA                  d«      j5                  d*«      › �|dS<   dM}"dW|(v rd|j                  dX«      sSt        j>                  dY|(«      })|)r;|)jA                  d«      dZvr(d[|)jA                  d«      j5                  d*«      › �|dX<   dM}"d6|(v r*|j                  d8«      s|(j1                  d7«      d   |d8<   dM}"d<|(v s�Œ|j                  d:«      r�Œ |(j1                  d7«      d   |d:<   dM}"�Œ; |j                  d«      sJt        j                  d\|%«      }*|*D ]/  Š2‰2jC                  «       Š3t3        ˆ3fd]„d^D «       «      rŒ(‰2|d<   dM}" n |j                  d«      s†t        j                  d_|%«      }+|+D ]k  }t        j                  dd|«      },d`t        |,«      cxk  rdak  sŒ/n Œ2|j+                  «       |d<   |j                  d«      s|j+                  «       |d<   dM}" n �Œ† |"rdb|d2   vr|d2   j/                  db«       |dS   s±	  |«       5 }t        |j                  dc| › d5�dd	¬
«      «      }-ddd«       -D ]e  }	|	j                  dd«      Š4dR‰4v sŒt        j>                  dd‰4«      })|)sŒ3|)jA                  d«      }.|.devsŒIdV|.› �|dS<   |d2   j/                  dS«        n t        j                   d«       |dX   s±	  |«       5 }t        |j                  df| › d5�dd	¬
«      «      }/ddd«       /D ]e  }	|	j                  dd«      Š4dW‰4v sŒt        j>                  dg‰4«      })|)sŒ3|)jA                  d«      }.|.dhvsŒId[|.› �|dX<   |d2   j/                  dX«        n t        j                   d«       |d/   rÖ|d   sÑ	  |«       5 }t        |j                  d5|d/   › di| › dj�dd	¬
«      «      }0ddd«       0D ]}  }	|	j                  dd«      dz   |	j                  dd«      z   }
t        j                  d\|
«      }1|1D ]1  Š2t3        ˆ2fdk„dlD «       «      rŒ‰2|d<   |d2   j/                  dm«        n |d   sŒ} n t        j                   d«       |S |S # 1 sw Y   �
Œ?xY w# t"        $ r Y �	Œ’w xY wc c}w # t"        $ r Y �Œ±w xY w# 1 sw Y   �Œ�xY w# t"        $ r Y �Œ=w xY w# 1 sw Y   �ŒxY w# t"        $ r Y �Œ¸w xY w# 1 sw Y   �Œ�xY w# t"        $ r Y �Œ(w xY w# t"        $ r |}Y �ŒÜw xY w# t"        $ r Y �Œ”w xY w# 1 sw Y   �ŒÇxY w# t"        $ r Y �ŒWw xY w# 1 sw Y   �Œ.xY w# t"        $ r Y �Œ¾w xY w# 1 sw Y   �ŒŠxY w# t"        $ r Y |S w xY w)nuî   
    Dado o nome da empresa:
    1. Busca CNPJ via DuckDuckGo (extrai de sites de consulta)
    2. Consulta ReceitaWS com o CNPJ -> telefone, email, endereÃ§o, sÃ³cios (Receita Federal)
    3. Busca LinkedIn do decisor via DuckDuckGo
    r   ©ÚDDGS©ÚBeautifulSoup)ÚurljoinÚurlparser6   )rŒ   r«  r„   Úwhatsappr¸   rå   r¯  r°  r¬  r­  r®  Úlinkedin_empresaræ   rì   z CNPJrÏ   zbr-pt©Úmax_resultsÚregionNrg  rã   r|  Útitlez$\d{2}\.?\d{3}\.?\d{3}\/?\d{4}-?\d{2}z[^\d]é   é   rÇ   z!https://receitaws.com.br/v1/cnpj/ú
User-AgentzMozilla/5.0é   ©r<   rj   r§   r   ÚERRORr„   r  r¸   Ú
logradouroÚnumeroÚbairroÚ	municipioÚufrí   ræ   rB  r}  ræ  r±  ú-r«  ÚqsarŒ   r¬  Úqualr­  rì   Úreceita_federalúsite:linkedin.com/in "ú"úlinkedin.com/in/rr  r®  Úlinkedinr  zsite:linkedin.com/company "zlinkedin.com/company/Úlinkedin_companyrå   z" site oficial)zfacebook.comzinstagram.comzlinkedin.comzcnpj.bizzreceita.ÚinfocnpjÚcnpjaÚ	jusbrasilz
google.comzyoutube.comÚ	wikipediaÚ	receitawsc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrN   r™   )r¼  ÚxÚurls     €r?   r½  z%enriquecer_empresa.<locals>.<genexpr>®  s   øè ø€ Ò"=° 1¨¤8Ñ"=ùó   ƒÚsite_oficialúUMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120 Safari/537.36zpt-BR,pt;q=0.9,en;q=0.8©r  zAccept-Languagez://z/contatoz/sobrez/quem-somosz/equipez/fale-conoscoFT©r<   rj   Úallow_redirectsúhtml.parserÚa)r|  zinstagram.com/r¯  zinstagram\.com/([^/?#"\']+))r”  ÚreelÚexploreÚstoriesÚtvÚaccountsÚsharedfileszhttps://instagram.com/zfacebook.com/r°  zfacebook\.com/([^/?#"\']+))	ÚsharerÚsharer`   ÚgroupsÚpagesÚeventsÚwatchÚdialogÚtrzhttps://facebook.com/ú0[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrN   r™   )r¼  r6  Úem_lows     €r?   r½  z%enriquecer_empresa.<locals>.<genexpr>ý  s   øè ø€ ò  #U°1 1¨¤;ñ  #Uùr8  )	ÚexampleÚtestÚnoreplyúno-replyÚsentryÚwixpressz	sentry.ioz@2xz@3xz9(?:\+55[-.\s]?)?(?:\(?\d{2}\)?)[-.\s]?\d{4,5}[-.\s]?\d{4}rC   é   Úwebsite_scrapingzsite:instagram.com "zinstagram\.com/([^/?#]+))r”  r@  rA  rB  rC  zsite:facebook.com "zfacebook\.com/([^/?#]+))rI  rH  rJ  r`   rF  rG  rK  z" "z" email contatoc              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­wrN   ©r�   ©r¼  r6  r&  s     €r?   r½  z%enriquecer_empresa.<locals>.<genexpr>Q  s   øè ø€ Òm°1˜q B§H¡H£JœÑmùó   ƒ)rQ  rR  rS  rT  rU  Úemail_decisor)"Úddgsr  Úbs4r  Úurllib.parser  r  rÇ  r°   r;   r¾   Úfindallr¿   rS   rr   rO   r_  rx   r¬   r¯   r¥   r=   ró   rZ   rH   rÊ  ÚrstripÚschemeÚnetlocr^  Úfind_allr�  r�  r�   )5r  r  r  r  r  rÒ  Úcnpj_rawr^  Ú
resultadosr~   ÚtextoÚmatchesÚmatchÚlimpoÚ
cnpj_limpoÚr_apiÚapi_dataÚtelr”  ÚpartesrÒ   r(  Ú
li_resultsÚ
li_companyÚsite_resultsÚignorarÚheaders_reqÚ	base_siteÚ_parsedÚorigemÚpaginas_tentarÚ	seen_urlsÚpaginas_unicasÚuÚachou_algo_siteÚpag_urlÚrespÚhtmlÚsoupÚa_tagr|  r¤  Ú
emails_pagÚtels_pagÚdigitosÚ
ig_resultsÚhandleÚ
fb_resultsÚ
em_resultsÚemailsr&  rP  r7  s5                                                     @@@r?   rÉ  rÉ  #  s¼  ú€ õ Ý!ß.ð ØØØØØØØØØØØØØñ€Eð$ €HðÙ‹Vð 	`�tÜ˜dŸi™i¨<¨.¸Ð(>ÈAÐV]˜iÓ^Ó_ˆJ÷	`àò 		ˆAØ—E‘E˜& "Ó%¨Ñ+¨a¯e©e°F¸BÓ.?Ñ?À#ÑEÈÏÉÈgÐWYÓHZÑZˆEÜ—j‘jÐ!HÈ%ÓPˆGØ ò �ÜŸ™˜x¨¨UÓ3�Ü�u“: Ó#¬¬C°«J«¸!Ó(;Ø$�HÙð	ò
 Ùð		ô 	�
‰
�1Œò
 Ü—V‘V˜H b¨(Ó3ˆ
Üˆz‹?˜bÓ ð"Ü Ÿ™Ø7¸
°|ÐDØ)¨=Ð9Øô�ð
 ×$Ñ$¨Ó+Ø$Ÿz™z›|�HØ—|‘| HÓ-°Ó8Ø&Ÿl™l¨:°rÓ:×@Ñ@ÓB˜ÙØ03˜E *Ñ-Ø03˜E *Ñ-Ø*2¯,©,°wÀÓ*CÒ*IÀr×)PÑ)PÓ)R˜˜g™ð %ŸL™L¨°rÓ:Ø$ŸL™L¨°2Ó6Ø$ŸL™L¨°2Ó6Ø$ŸL™L¨°bÓ9Ø$ŸL™L¨¨rÓ2ð.ö " ¨ñ ò #$ð " ˜ð " ð -1¯I©I°fÓ,=˜˜jÑ)à&˜Ø+,¨R¨a¨5¨'°°1°Q°q°6°(¸!¸A¸aÀ¸F¸8À1ÀQÀqÈÀWÀIÈQÈqÐQSÐTVÈxÈjÐ(Y˜˜f™à&Ÿl™l¨5°"Ó5˜ÙØ47¸±F·J±J¸vÀrÓ4J×4PÑ4PÓ4R˜E .Ñ1Ø58¸±V·Z±ZÀÈÓ5K×5QÑ5QÓ5S˜E /Ñ2Ø˜h™×.Ñ.Ð/@ÔAÜ—
‘
˜1”ð
Ù‹Vð 	�tÜ˜dŸi™iØ(¨¨°aÐ8ØØð (ó ó ˆJ÷	ð ò 	ˆAØ—%‘%˜ Ó#ˆCØ! SÒ(Ø(+¯	©	°#«°qÑ(9��nÑ%Ø�h‘×&Ñ& zÔ2Ùð	ô 	�
‰
�1Œð
 �9‰9Ð'Ô(ð	Ù“ð ˜4Ü! $§)¡)Ø1°,°¸qÐAØ !Ø"ð #,ó #ó �
÷ð  ò �Ø—e‘e˜F BÓ'�Ø*¨cÒ1Ø03·	±	¸#³¸qÑ0A�EÐ,Ñ-Ø˜(‘O×*Ñ*Ð+=Ô>Ùðô �J‰J�qŒMð
 �Š=ð	Ù“ð ˜4Ü# D§I¡IØ˜�~ ^Ð4Ø !Ø"ð %.ó %ó  �÷ð "ò 	�Ø—e‘e˜F BÓ'�òD�ò œsÓ"=°WÔ"=Õ=Ø$'§I¡I¨c£N°1Ñ$5�E˜&‘MØ˜(‘O×*Ñ*¨>Ô:Ùð	ô �J‰J�qŒMð
 ˆVƒ}àqØ8ñ
ˆð ˜&‘M×(Ñ(¨Ó-ˆ	ð	Ù˜yÓ)ˆGØ�~Š~ '§.¢.Ø#ŸN™NÐ+¨3¨w¯~©~Ð.>Ð?‘à"�ð
 Øˆh�hÐØˆh�fÐØˆh�kÐ"Øˆh�gÐØˆh�mÐ$ð
ˆô “Eˆ	ØˆØò 	)ˆAÚ�Q˜iÒ'Ø—‘˜aÔ Ø×%Ñ% aÕ(ð	)ð
  ˆØ%ó 8	ˆGð7Ü—|‘| G°[È!Ð]aÔb�Ø×#Ñ# sÒ*ØØ—y‘y�Ù$ T¨=Ó9�ð "Ÿ]™]¨3°T˜]Ó:ó /�EØ  ™=�Dà'¨4Ñ/¸¿	¹	À+Ô8NÜŸI™IÐ&DÀdÓK˜Ù §¡¨£Ð3wÑ!wØ3IÈ!Ï'É'ÐRSË*×J[ÑJ[Ð\_ÓJ`ÐIaÐ1b˜E +Ñ.Ø.2˜Oà&¨$Ñ.°u·y±yÀÔ7LÜŸI™IÐ&CÀTÓJ˜Ù §¡¨£ð  4Fñ  "FØ2GÈÏÉÐPQË
×HYÑHYÐZ]ÓH^ÐG_Ð0`˜E *Ñ-Ø.2˜Oà)¨TÑ1¸%¿)¹)ÀNÔ:SØ04·
±
¸3³ÀÑ0B˜˜nÑ-Ø*.˜à.°$Ó6¸u¿y¹yÐI[Ö?\Ø48·J±J¸s³OÀAÑ4F˜Ð0Ñ1Ø*.šð+/ð0 —y‘y Ô)Ü!#§¡Ð,_ÐaeÓ!f�JØ(ò "˜Ø!#§¡£˜Ü"ó  #Uð  9Tô  #Uõ   UØ-/˜E '™NØ.2˜OÙ!ð"ð —y‘y Ô,Ü!Ÿz™zÐ*fÐhlÓm�HØ'ò "˜ä"$§&¡&¨°2°sÓ";˜Ø¤ W£Ô3°Ö3Ø03·	±	³˜E *Ñ-Ø#(§9¡9¨ZÔ#8Ø47·I±I³K  jÑ 1Ø.2˜OÙ!ð"ùð[8	ñt Ð1¸¸x¹ÑHØ�(‰O×"Ñ"Ð#5Ô6ð �Òð	Ù“ð ˜4Ü! $§)¡)Ø*¨<¨.¸Ð:Ø !Ø"ð #,ó #ó �
÷ð  ò 
"�Ø—e‘e˜F BÓ'�Ø# sÒ*äŸ	™	Ð"=¸sÓC�AÚØ!"§¡¨£˜Ø!Ð)RÒRØ3IÈ&ÈÐ1R˜E +Ñ.Ø! (™O×2Ñ2°;Ô?Ù!ð
"ô �J‰J�qŒMð
 �Òð	Ù“ð ˜4Ü! $§)¡)Ø)¨,¨°qÐ9Ø !Ø"ð #,ó #ó �
÷ð  ò 	"�Ø—e‘e˜F BÓ'�Ø" cÒ)ÜŸ	™	Ð"<¸cÓB�AÚØ!"§¡¨£˜Ø!Ð)kÒkØ2GÈÀxÐ0P˜E *Ñ-Ø! (™O×2Ñ2°:Ô>Ù!ð	"ô �J‰J�qŒMð
 ˆ^Ò U¨7¢^ð	Ù“ð ˜4Ü! $§)¡)Ø˜˜nÑ-Ð.¨c°,°¸ÐOØ !Ø"ð #,ó #ó �
÷ð  ò 	�ØŸ™˜f bÓ)¨CÑ/°!·%±%¸ÀÓ2DÑD�ÜŸ™Ð$WÐY^Ó_�Ø ò �BÜÓmÐ8lÔmÕmØ)+˜˜g™Ø˜h™×.Ñ.¨Ô?Ùð	ð
 ˜“>Ùð	ô �J‰J�qŒMð €Lˆ5€L÷s	`ñ 	`ûô ò Úðüò," øô$ ò Úðú÷
	ñ 	ûô ò Úðú÷ñ ûô ò 	Úð	ú÷ñ ûô" ò 	Úð	ûô" ò 	Ø‹Fð	ûôV ò Úðú÷ñ ûô$ ò 	Úð	ú÷ñ ûô" ò 	Úð	ú÷ñ ûô" ò 	Øà€Lð	úsî  ¬j ³!jÁBj Ã j Ã8j Ä j ÅC>j3 É j.ÉCj3 Ìk Ì"kÌ8#k ÍAk Î1k- Î8"k Ï#k- Ï>Ak- Ñl
 Ñ"k=Ñ0%l
 Òl
 Ò+Al
 Ô>l Ö)(l,×D3l,Ül,ÜA,l,ÞA!l,ß)?l,ám	 á"l<á7#m	 âm	 â4m	 ã
4m	 äm& ä"mä-#m& åm& å*m& æ 4m& æ?n ç(m6ç.A$n é!n é5n êjêj ê	j+ê*j+ê.j3 ê3	k ê?k ëkëk ë	këkë k*ë%k- ë-	k:ë9k:ë=lìl
 ì
	lìlìl)ì(l)ì,	l9ì8l9ì<mím	 í		mímím#ím& í&	m3í2m3í6n í;n î	nînré   c                 ó¤
  ‡ — ddl m} ddlm} | ddd|xs dddddg dœ
}dddœ}|r|j	                  «       nd}|r|j                  d	«      sd
|z   }|�r¹|g}dD ]%  }	|j                  |j                  d«      |	z   «       Œ' d}
d}d}|dd D �](  }	 t        j                  ||dd¬«      }|j                  dk7  rŒ. ||j                  d«      }|j                  dd¬«      }|
s>t        j                  d|«      }|D ]  Š t        ˆ fd„dD «       «      rŒ‰ }
 n |
s|r|d   }
|st        j                  d|«      }|r|d   }|sYt        j                   d|«      }|rA|j#                  d«      j	                  «       }|j#                  d«      j	                  «       |d<   |
r|r nt%        j&                  d«       �Œ+ |
r|
|d<   |d    j                  d!«       |r1|j                  d"«      s ||d"<   d!|d    vr|d    j                  d!«       |r||d#<   |d#   �s	 d$| › d%|› d&�j	                  «       } |«       5 }t+        |j                  |d'd(¬)«      «      }ddd«       D ]¹  }|j                  d*d«      dz   |j                  d+d«      z   }t        j                   d,|t        j,                  «      }|sŒS|j#                  d«      j	                  «       |d#<   |j#                  d«      j	                  «       j/                  «       |d<   |d    j                  d-«        n t%        j&                  d«       	 d.| › d/�} |«       5 }t+        |j                  |d0d(¬)«      «      }ddd«       D ]�  }|j                  d1d«      }d2|v sŒ|j1                  d3«      d   |d4<   d5|d    vr|d    j                  d5«       |d#   s>|j                  d+d«      }t        j2                  d6|«      }|r|j#                  d«      |d#<    n t%        j&                  d«       |d   sÞ	 d$| › d%|› d7�j	                  «       } |«       5 }t+        |j                  |d'd(¬)«      «      }ddd«       D ]}  }|j                  d*d«      dz   |j                  d+d«      z   }t        j                  d|«      }|D ]1  Š t        ˆ fd8„d9D «       «      rŒ‰ |d<   |d    j                  d:«        n |d   sŒ} n t%        j&                  d«       |S |S # t(        $ r Y �Œmw xY w# 1 sw Y   �Œ¯xY w# t(        $ r Y �Œëw xY w# 1 sw Y   �ŒÅxY w# t(        $ r Y �Œ+w xY w# 1 sw Y   ŒîxY w# t(        $ r Y |S w xY w);uÀ   
    Enriquecimento para empresas nos EUA (sem CNPJ):
    1. Scraping do site da empresa: emails, telefones, nome do responsÃ¡vel
    2. DuckDuckGo: decisor (owner/CEO/founder) + LinkedIn
    r   r  r  r6   )
rŒ   r«  r„   r¸   rå   r¬  r­  r®  ræ   rì   r:  zen-US,en;q=0.9r;  Úhttpzhttps://)z/contactz/contact-usz/aboutz	/about-usz/teamr±  Né   ræ  Tr<  r§   r>  rã   ©r=   rN  c              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­wrN   rZ  r[  s     €r?   r½  z(enriquecer_empresa_us.<locals>.<genexpr>“  s   øè ø€ Ò"{°q 1¨¯©«
¤?Ñ"{ùr\  )rQ  Ú	youremailrR  rS  zinfo@zhello@z0(?:\+1[-.\s]?)?\(?\d{3}\)?[-.\s]\d{3}[-.\s]\d{4}u‡   ([A-Z][a-z]+ [A-Z][a-z]+(?:\s[A-Z][a-z]+)?)\s*[,\-â€“|]?\s*(Owner|Co-Owner|CEO|Founder|Co-Founder|President|Director|Manager|Principal)rÇ   rB  r­  rÀ  r¸   rì   rX  r„   r¬  r,  z" z owner OR CEO OR founderrÏ   zus-enr  rg  r  uV   ([A-Z][a-z]+ [A-Z][a-z]+)\s*[,\-â€“]?\s*(owner|CEO|founder|president|director|manager)Ú
duckduckgor+  z" owner OR CEO OR founderr  r|  r-  rr  r®  r.  z^([A-Z][a-z]+ [A-Z][a-z]+)z email contactc              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­wrN   rZ  r[  s     €r?   r½  z(enriquecer_empresa_us.<locals>.<genexpr>ð  s   øè ø€ ÒY°1˜q B§H¡H£JœÑYùr\  )rQ  r�  rR  Úduckduckgo_email)r^  r  r_  r  r=   Ú
startswithrZ   rb  r¬   r;   r¯   r°   Úget_textr¾   ra  rÊ  r�  r�  rO   r_  rx   rÇ  Ú
IGNORECASEr  rH   rj  )!r  ré   rƒ   r  r  rÒ  ru  Úsite_urlÚpages_to_tryÚsuffixÚfound_emailÚfound_phoneÚfound_personÚpage_urlr  r�  r°   rŠ  Úphonesrj  rÉ   r^  Úresultsr~   Úsnippetr¤  Úli_queryrq  r7  r  ÚeqÚ
eq_resultsr&  s!                                   @r?   rÈ  rÈ  ^  sÅ  ø€ õ Ý!ð ØØØØ’˜2ØØØØØñ€Eð nØ+ñ€Kñ #*ˆw�}‰}Œ¨r€HÙ˜×+Ñ+¨FÔ3Ø Ñ(ˆâØ �zˆØQò 	?ˆFØ×Ñ §¡°Ó 4°vÑ =Õ>ð	?ð ˆØˆØˆà$ R aÐ(ó (	ˆHð'Ü—|‘| H°kÈ1Ð^bÔc�Ø×#Ñ# sÒ*ØÙ$ T§Y¡Y°Ó>�Ø—}‘} S°�}Ó5�ñ #ÜŸZ™ZÐ([Ð]aÓb�FØ$ò "˜Ü"Ó"{Ð<zÔ"{Õ{Ø*,˜KÙ!ð"ñ '©6Ø&,¨Q¡i˜ñ #ÜŸZ™ZÐ([Ð]aÓb�FÙØ&,¨Q¡i˜ñ $ÜŸI™Iðhàó�Eñ
 Ø',§{¡{°1£~×';Ñ';Ó'=˜Ø16·±¸Q³×1EÑ1EÓ1G˜˜oÑ.á¡;ÙÜ—
‘
˜3–ðK(	ñT Ø(ˆE�'‰NØ�(‰O×"Ñ"Ð#5Ô6Ù˜uŸy™y¨Ô4Ø +ˆE�*ÑØ!¨¨x©Ñ8Ø�h‘×&Ñ&Ð'9Ô:ÙØ$0ˆE�.Ñ!ð �Ó ð	Ø˜�~ R¨ xÐ/GÐH×NÑNÓPˆEÙ“ð P˜4Ü˜tŸy™y¨¸AÀg˜yÓNÓO�÷Pàò 
�ØŸ%™% ¨Ó+¨cÑ1°A·E±E¸'À2Ó4FÑF�Ü—I‘IØmØœRŸ]™]ó�ò Ø,-¯G©G°A«J×,<Ñ,<Ó,>�E˜.Ñ)Ø-.¯W©W°Q«Z×-=Ñ-=Ó-?×-EÑ-EÓ-G�E˜/Ñ*Ø˜(‘O×*Ñ*¨<Ô8Ùð
ô �J‰J�qŒMð
Ø+¨L¨>Ð9RÐSˆÙ‹Vð 	R�tÜ˜dŸi™i¨¸aÈ˜iÓPÓQˆJ÷	Ràò 	ˆAØ—%‘%˜ Ó#ˆCØ! SÒ(Ø(+¯	©	°#«°qÑ(9��nÑ%Ø U¨8¡_Ñ4Ø˜(‘O×*Ñ*¨:Ô6à˜^Ò,ØŸE™E '¨2Ó.�EÜŸ™Ð!>ÀÓF�AÙØ01·±¸³
˜˜nÑ-Ùð	ô 	�
‰
�1Œð
 �Š>ð	Ø�\�N " V H¨NÐ;×AÑAÓCˆBÙ“ð P˜4Ü! $§)¡)¨B¸AÀg )Ó"NÓO�
÷Pàò 	�Ø—u‘u˜V RÓ(¨3Ñ.°·±°wÀÓ1CÑC�ÜŸ™Ð$WÐY]Ó^�Ø ò �BÜÓYÐ8XÔYÕYØ)+˜˜g™Ø˜h™×.Ñ.Ð/AÔBÙð	ð
 ˜“>Ùð	ô �J‰J�qŒMð €Lˆ5€LøôY ò Úðú÷"Pñ Pûô ò 	Úð	ú÷	Rñ 	Rûô  ò Úðú÷Pð Pûô ò 	Øà€Lð	úsÀ   Â(S,Â9AS,ÄBS,ÆS,ÈT	 È1S<ÉAT	 Ê,A>T	 Ì+T& Ì8TÍ#T& Í:BT& ÐU Ð+T6Ñ	A$U Ò.!U ÓU Ó,	S9Ó8S9Ó<TÔT	 Ô		TÔTÔT#ÔT& Ô&	T3Ô2T3Ô6T?Ô;U Õ	UÕUrÒ  r¿  c                 óŠ  — t        «       }g }|j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  d	d«      d
œ}|j                  «       D ]0  \  }}	|j                  |«      }
|
sŒ|	sŒ|j                  |
|	dœ«       Œ2 |r0|r.	 t	        j
                  t        › d|› �t        |«      d|id¬«       g }|j                  d«      r|j                  d|d   › �«       |j                  d«      r|j                  d|d   › �«       |j                  d«      r+|j                  d|d   › d|j                  dd«      › d�«       |j                  d«      r|j                  d|d   › �«       |j                  d«      r|j                  d|d   › �«       |j                  d«      r|j                  d|d   › �«       |j                  d	«      r|j                  d|d	   › �«       |j                  d«      r|j                  d|d   › �«       |r@	 t	        j                  t        › d| › d�t        |«      dj                  |«      |dœd¬«       yy# t        $ r Y �Œ¥w xY w# t        $ r Y yw xY w) z=Popula campos personalizados na oportunidade + adiciona nota.r«  r6   r¸   r®  r¬  r­  rå   r¯  r°  )ÚCNPJÚEmailÚLinkedInÚDecisorúCargo do DecisorÚSiteÚ	InstagramÚFacebook)r½   Úfield_valuer  rï   rC   r¤   zCNPJ: zEmail: z	Decisor: rÂ  rf   z
LinkedIn: zSite: zInstagram: z
Facebook: ræ   u   EndereÃ§o: rÆ   ú/notesrt  ©rg  ÚuserIdN)Ú_carregar_campos_ghlr;   rÀ   rZ   r¬   ÚputrÑ   rš   rx   r­   ró   )r›   r‘   rÄ   rÒ  r¿  Ú
campos_idsr÷   rÝ   Ú
nome_camporú   rù   Úlinhass               r?   rË  rË  ý  s¯  € ô &Ó'€JØ€Mà!ŸI™I f¨bÓ1Ø!ŸI™I g¨rÓ2Ø!ŸI™I n°bÓ9Ø!ŸI™I n°bÓ9Ø!ŸI™I o°rÓ:Ø!ŸI™I f¨bÓ1Ø!ŸI™I k°2Ó6Ø!ŸI™I j°"Ó5ñ	€Dð "ŸZ™Z›\ò IÑˆ
�EØ—>‘> *Ó-ˆÚšØ× Ñ ¨ÀÑ!GÕHðIñ ™ð	Ü�L‰LÜ�*˜O¨NÐ+;Ð<Ü$ UÓ+Ø$ mÐ4Øõ	ð €FØ‡y�y�Ô &§-¡-°&¸¸v¹¸Ð0HÔ"IØ‡y�y�Ô &§-¡-°'¸%À¹.Ð9IÐ0JÔ"KØ‡y�y�Ô  &§-¡-°)¸EÀ.Ñ<QÐ;RÐRTÐUZ×U^ÑU^Ð_nÐprÓUsÐTtÐtuÐ0vÔ"wØ‡y�y�Ô  &§-¡-°*¸UÀ>Ñ=RÐ<SÐ0TÔ"UØ‡y�y�Ô &§-¡-°&¸¸v¹¸Ð0HÔ"IØ‡y�y�Ô &§-¡-°+¸eÀKÑ>PÐ=QÐ0RÔ"SØ‡y�y�Ô &§-¡-°*¸UÀ:Ñ=NÐ<OÐ0PÔ"QØ‡y�y�Ô &§-¡-°+¸eÀJÑ>OÐ=PÐ0QÔ"Ráð	Ü�M‰MÜ�*˜J z l°&Ð9Ü$ UÓ+Ø"Ÿi™i¨Ó/¸;ÑGØö	ð øô ò 	Úð	ûô, ò 	Ùð	ús$   Ã -J& É&>J6 Ê&	J3Ê2J3Ê6	KËKÚ
enviar_crmc                 ó
  — t         |    }d|d<   t        |«      |d<   |j                  d«      }	 t        |«      D �]æ  \  }	}
|d   dk(  r �nØ|d   j	                  dt        «       › d|	d	z   › d
t        |«      › d|
› �«       t        |d   «      dkD  r|d   dd |d<   t        |
«      }|j                  d«      xs |
|j                  dd«      |j                  dd«      |
|j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  d«      xs g dœ}ddg}|j                  d«      r|j	                  d«       |j                  d«      r|j	                  d«       ||d <   |rÕ|rÓ|rÑt        |||d!t        |«      xs d¬"«      \  }}|r‰d}|r|rt        ||||||d!¬#«      \  }}}t        |||||¬$«       |d%xx   d	z  cc<   |d   j	                  dt        «       › d&|
› d'|j                  d«      xs d(› d)|j                  d«      rd*nd+› d,�	«       nu|d   j	                  dt        «       › d-|
› d.|› �«       nO|d   j	                  dt        «       › d&|
› d/|j                  d«      xs d(› d)|j                  d«      rd*nd+› d0�	«       |	d	z   |d1<   |d2   j	                  |«       t        j                  d	«       �Œé d3|d<   t        j                  «       j                  «       |d4<   |r3|d   j	                  dt        «       › d5|d%   › d
t        |«      › d6�«       n;|d   j	                  dt        «       › d5t        |d2   «      › d
t        |«      › d7�«       	 t!        |«       	 t'        | |j                  d2g «      «       y# t"        $ r*}t%        d8|j                  d9«      › d:|› �«       Y d}~ŒLd}~ww xY w# t"        $ r}t%        d;| › d:|› �«       Y d}~yd}~ww xY w# t"        $ rµ}d<|d<   t)        |«      |d<<   t        j                  «       j                  «       |d4<   |d   j	                  dt        «       › d=t)        |«      › �«       	 t!        |«       n;# t"        $ r*}t%        d>|j                  d9«      › d:|› �«       Y d}~nd}~ww xY wY d}~yY d}~yd}~ww xY w)?zCEnriquece lista de empresas e (opcionalmente) cria contatos no CRM.r#  r   r@  rz   r4  r'  r(  z] Enriquecendo (rÇ   r±  rT  r  iœÿÿÿNr¬  r„   r6   r¸   ræ   rå   r«  r­  r®  r¯  r°  rì   )rŒ   r„   r¸   r‚   ræ   rå   r«  r¬  r­  r®  r¯  r°  rì   úlista-enriquecidaÚenriquecedorúlinkedin-encontradoúcnpj-encontradorµ   ÚEnriquecimento©rà   rá   ©rà   r¾  r¸  õ   ] âœ“ u    â†’ CRM (fone: õ   â€”z | LinkedIn: Úsimu   nÃ£orf   õ   ] âœ— õ    â†’ erro CRM: u    â†’ enriquecido (fone: u   ) â€” aguardando envio manualrQ  rR  r¨  r©  u   ] ConcluÃ­do: z enviados ao CRMu*    enriquecidos â€” pronto para envio ao CRMrª  r½   rq   z [enriq] erro ao persistir leads r  rÄ  rÅ  )rÆ  rS   r;   rŠ  rZ   r\  rÉ  rû   rß   r  rË  rO   r_  r   rˆ   r‰   r&   rx   ry   r  rm   )r…   r	  r‘   rÄ   r�   rü   r¶  rm  rz   r˜  r  rÒ  r´   rµ   r›   Úerrr¿  rØ  Ú_r   rÝ  s                        r?   Úrun_enriquecedorrÆ  5  s3  € ô ˆv‰,€CØ"€Cˆ�MÜ�x“=€Cˆ�Lð �w‰w�zÓ"€Hð^QÜ(¨Ó2ó @	‰OˆAˆ|Ø�8‰} Ò+Úà�‰K×Ñ ¤3£5 'Ð)9¸!¸A¹#¸¸aÄÀHÃ¸ÈcÐR^ÐQ_Ð`ÔaÜ�3�v‘;Ó #Ò%Ø! &™k¨$¨%Ð0��F‘ä& |Ó4ˆEð Ÿ	™	 .Ó1ÒA°\Ø!ŸI™I j°"Ó5ØŸ™ 7¨BÓ/Ø'Ø!ŸI™I j°"Ó5ØŸ	™	 &¨"Ó-àŸ	™	 &¨"Ó-Ø %§	¡	¨.¸"Ó =Ø!&§¡¨?¸BÓ!?Ø %§	¡	¨.¸"Ó =Ø"ŸY™Y {°BÓ7Ø!ŸI™I j°"Ó5ØŸ)™) HÓ-Ò3°ñˆDð" (¨Ð8ˆDØ�y‰y˜Ô(Ø—‘Ð1Ô2Ø�y‰y˜Ô Ø—‘Ð-Ô.ØˆD�‰Lá™e©Ü"3Ø˜% Ð5EÜ&:¸;Ó&GÒ&OÈ4ô#‘�
˜Cñ Ø%)�NÙ"¡xÜ0FØ  *¨e°[À+ÈxÐ`pô1Ñ-˜˜N¨Aô (¨
°E¸;ÈÐ^lÕmØÐ(Ó)¨QÑ.Ó)Ø˜‘K×&Ñ&ØœC›E˜7 &¨¨ð 7"Ø"'§)¡)¨JÓ"7Ò"@¸5Ð!Að B%Ø.3¯i©i¸Ô.G¡UÈVÐ$TÐTUðWõð ˜‘K×&Ñ&¨¬3«5¨'°¸°~À_ÐUXÐTYÐ'ZÕ[à�F‘×"Ñ"Øœ›�w˜f \ Nð 3Ø#Ÿi™i¨
Ó3Ò<°uÐ=ð >!Ø*/¯)©)°NÔ*C¡ÈÐ PÐPmðoôð  ! 1™uˆC�ÑØ�‰L×Ñ Ô&Ü�J‰J�qŽMðA@	ðD $ˆˆH‰Ü&Ÿl™l›n×6Ñ6Ó8ˆˆNÑÙØ�‰K×ÑØ”C“E�7˜.¨Ð-=Ñ)>Ð(?¸qÄÀXÃÀÐO_Ð`õð �‰K×ÑØ”C“E�7˜.¬¨S°©\Ó):Ð(;¸1¼SÀ»]¸OÐKuÐvôð	UÜ  Ô%ð	DÜ" 6¨3¯7©7°7¸BÓ+?Õ@øô ò 	UÜÐ>¸s¿w¹wÀt»}¸oÈRÐPQÈsÐS×TÑTûð	Uûô ò 	DÜÐ4°V°H¸B¸q¸cÐB×CÑCûð	Dûô ò QØˆˆH‰Ü˜!“fˆˆF‰Ü&Ÿl™l›n×6Ñ6Ó8ˆˆNÑØˆF‰×Ñ˜Qœs›u˜g X¬c°!«f¨XÐ6Ô7ð	QÜ  Õ%øÜò 	QÜÐ9¸#¿'¹'À$»-¸ÈÈ2È$ÐO×PÑPûð	QúÜPô &ûðQús‹   ¯NQ Î?O( ÏP Ï(	PÏ1 PÐQ ÐPÐQ Ð	QÐ'P=Ð8Q Ð=QÑQ Ñ	TÑA#S>Ò2R>Ò=S>Ò>	S1Ó S,Ó'S>Ó,S1Ó1S>Ó>Tz/loginÚGETÚPOST)Úmethodsc                  óþ  — t         j                  rt        t        d«      «      S t        j
                  dk(  �r;t        «       } t        | «      rt        dd«       t        d«      dfS t        j                  j                  d«      xs dj                  «       j                  «       }t        j                  j                  d	«      xs dj                  «       }t        |«      }|ryt        ||«      rm|j                   st        d
d«       t        d«      S t#        | «       t%        |d¬«       t'        t)        |j*                  «      «       t        t        d«      «      S t-        | «       t        dd«       t        d«      S )NÚindexrÈ  zCMuitas tentativas de login. Aguarde alguns minutos e tente de novo.ra   z
login.htmlé­  r¸   r6   Úsenhaú4Conta inativa. Entre em contato com o administrador.T)ÚrememberzE-mail ou senha incorretos.)r   rã  r   r   r
   ÚmethodrK   rX   r   r	   Úformr;   r=   r�   r   r   Úativor_   r   r   ru   r½   r\   )rL   r¸   rÍ  Úusers       r?   r`   r`   ¤  s"  € ä×$Ò$Üœ Ó(Ó)Ð)Ü‡~�~˜ÓÜ‹[ˆÜ˜BÔÜÐWÐY`ÔaÜ" <Ó0°#Ð5Ð5Ü—‘×!Ñ! 'Ó*Ò0¨b×7Ñ7Ó9×?Ñ?ÓAˆÜ—‘×!Ñ! 'Ó*Ò0¨b×7Ñ7Ó9ˆÜ Ó&ˆÙ”O D¨%Ô0Ø—:’:ÜÐLÈgÔVÜ& |Ó4Ð4Ü˜"ÔÜ�t dÕ+ÜœS §¡›\Ô*ÜœG GÓ,Ó-Ð-Ü˜rÔ"ÜÐ+¨WÔ5Ü˜<Ó(Ð(rA   z/logoutc                  ó>   — t        «        t        t        d«      «      S )Nr`   )r   r   r   r™   rA   r?   ÚlogoutrÕ  ½  s   € ô „MÜ”G˜GÓ$Ó%Ð%rA   z/adminc                  ód  — t         j                  st        t        d«      «      S t	        «       } t        «       }i }|D ]  }t        |d   «      }|r|d   nd ||d   <   Œ! 	 t        «       }t        d| |||¬«      S # t        $ r,}t        j                  j                  d|«       d }Y d }~Œ@d }~ww xY w)NrË  r½   Úlocation_namez#Falha ao montar dashboard_saude: %sz
admin.html)ÚusuariosÚcontasÚ
ghl_statusÚdashboard_saude)r   Úis_super_adminr   r   r   r   r   r1   rx   ÚappÚloggerÚ	exceptionr	   )rØ  rÙ  rÚ  rÒ   ÚcfgrÛ  Ú_es          r?   Úadminrâ  Ä  s¾   € ô ×&Ò&Üœ Ó(Ó)Ð)ÜÓ €HÜ‹€Fà€JØò DˆÜ˜Q˜t™WÓ%ˆÙ69˜c /Ò2¸tˆ
�1�T‘7ÒðDðÜ-Ó/ˆô ØØØØØ'ôð øô ò Ü�
‰
×ÑÐBÀBÔGØ�ûðús   Á 
A: Á:	B/Â"B*Â*B/z/admin/criar-usuarioc                  óÂ  — t         j                  st        t        d«      «      S t        j
                  j                  d«      xs dj                  «       } t        j
                  j                  d«      xs dj                  «       }t        j
                  j                  d«      xs dj                  «       }t        j
                  j                  d«      xs dj                  «       }t        j
                  j                  d«      xs d }|rt        |«      }t        | ||||«      \  }}|rt        d	|› �d
«       nt        d| › d�d«       t        t        d«      «      S )NrË  rŒ   r6   r¸   rÍ  ÚplanoÚbetarz   u   Erro ao criar usuÃ¡rio: ra   u	   UsuÃ¡rio z criado.Úsuccessrâ  )r   rÜ  r   r   r
   rÑ  r;   r=   ru   r   r   )rŒ   r¸   rÍ  rä  rz   rÓ  r  s          r?   Úadmin_criar_usuariorç  ß  s  € ô ×&Ò&Üœ Ó(Ó)Ð)Ü—‘× Ñ  Ó(Ò.¨B×5Ñ5Ó7€DÜ—‘× Ñ  Ó)Ò/¨R×6Ñ6Ó8€EÜ—‘× Ñ  Ó)Ò/¨R×6Ñ6Ó8€EÜ—‘× Ñ  Ó)Ò3¨V×:Ñ:Ó<€EÜ�|‰|×Ñ 
Ó+Ò3¨t€HÙÜ�x“=ˆÜ˜t U¨E°5¸(ÓC�J€Dˆ$ÙÜÐ(¨¨Ð/°Õ9ä�	˜$˜˜xÐ(¨)Ô4Ü”G˜GÓ$Ó%Ð%rA   z/admin/usuario/<int:uid>/contac                 óT  — t         j                  st        t        d«      «      S t        j
                  j                  d«      xs d }t        j
                  j                  d«      xs d }i }|�|rt        |«      nd |d<   |r||d<   |rt        | fi |¤Ž t        t        d«      «      S )NrË  rz   rä  râ  )	r   rÜ  r   r   r
   rÑ  r;   ru   r   )Úuidrz   rä  Úupdatess       r?   Úadmin_atribuir_contarë  ó  s™   € ô ×&Ò&Üœ Ó(Ó)Ð)Ü�|‰|×Ñ 
Ó+Ò3¨t€HÜ�|‰|×Ñ Ó(Ò0¨D€EØ€GØÐÙ/7œc (œm¸Tˆ�
ÑÙØ ˆ�ÑÙÜ˜#Ñ) Ò)Ü”G˜GÓ$Ó%Ð%rA   z/admin/toggle-usuario/<int:uid>c                 óÚ   — t         j                  st        t        d«      «      S t	        j
                  | «      }|r|j                  rdnd}t        | |¬«       t        t        d«      «      S )NrË  r   rÇ   )rÒ  râ  )r   rÜ  r   r   r   r;   rÒ  r   )ré  rÓ  Únovo_statuss      r?   Úadmin_toggle_usuariorî    sT   € ô ×&Ò&Üœ Ó(Ó)Ð)Ü�8‰8�C‹=€DÙØŸ:š:‘a¨1ˆÜ˜# [Õ1Ü”G˜GÓ$Ó%Ð%rA   z /admin/deletar-usuario/<int:uid>c                 óÀ   — t         j                  st        t        d«      «      S t	        | «      t         j
                  k7  rt        | «       t        t        d«      «      S )NrË  râ  )r   rÜ  r   r   rm   r½   r   )ré  s    r?   Úadmin_deletar_usuariorð    sE   € ô ×&Ò&Üœ Ó(Ó)Ð)Ü
ˆ3ƒx”<—?‘?Ò"Ü˜ÔÜ”G˜GÓ$Ó%Ð%rA   r±  c                  óV   — t        dt        j                  t        j                  ¬«      S )Nz
index.html)Úis_adminÚis_conta_admin)r	   r   rÜ  ró  r™   rA   r?   rË  rË    s'   € ô ˜<Ü$0×$?Ñ$?Ü*6×*EÑ*EôGð GrA   z/api/conectarc                  ó˜  — t        j                  «       } | j                  d«      xs dj                  «       j	                  «       }| j                  d«      xs dj                  «       }|j	                  «       j                  d«      r|dd j                  «       }|st        dd	d
œ«      dfS |dk(  rŽ| j                  d«      xs dj                  «       }	 dd|› �i}|r||d<   t        j                  t        › d�|d¬«      }|j                  dk(  rt        ddd|dœ«      S t        dd|j                  › d�d
œ«      dfS | j                  d«      xs dj                  «       }|st        ddd
œ«      dfS 	 t        j                  t        › d�t        |«      d|id¬«      }|j                  dk7  rt        dd |j                  › d�d
œ«      dfS |j!                  «       j                  d!g «      }|}		 t        j                  t        › d"|› �t        |«      d#¬«      }
|
j                  dk(  rH|
j!                  «       }|j                  d$i «      j                  d%«      xs |j                  d%«      xs |}	g }|D ]u  }|j                  d&g «      D �cg c]%  }|j                  d'«      |j                  d%«      d(œ‘Œ' }}|j#                  |j                  d'«      |j                  d%«      |d)œ«       Œw t        dd|	|d*œ«      S # t        j                  j                  $ r t        ddd
œ«      dfcY S t        $ r#}t        dt        |«      d
œ«      dfcY d}~S d}~ww xY w# t        $ r Y Œôw xY wc c}w # t        j                  j                  $ r t        dd+d
œ«      dfcY S t        $ r#}t        dt        |«      d
œ«      dfcY d}~S d}~ww xY w),u3   Valida credenciais do CRM e retorna configuraÃ§Ã£o.r  Úghlr‘   r6   úbearer é   NFu   Token obrigatÃ³rio©rØ  r  rñ   r³  rœ   r–   r“   r¢   z	/api/tagsrC   r   r§   TÚUnnichat)rØ  r  r×  rœ   u   Token invÃ¡lido (HTTP rf   z"Timeout ao conectar com o UnnichatrÄ   z$token e location_id sao obrigatoriosú/opportunities/pipelinesrÈ   rË   zCredenciais invalidas (HTTP Ú	pipelinesú/locations/ræ  Úlocationrº   Ústagesr½   ©r½   rº   ©r½   rº   rþ  )rØ  r  r×  rû  zTimeout ao conectar com o CRM)r
   Úget_jsonr;   r=   r�   r”  r   r¬   r®   r¯   Ú
exceptionsÚTimeoutrx   rm   rÑ   rš   r¥   rZ   )r¼   r  r‘   rœ   r<   r~   r   rÄ   Úpipelines_rawr×  Úr_locÚloc_datarû  r”  r9   rþ  s                   r?   Úapi_conectarr  "  sÐ  € ô ×ÑÓ€DØ—‘˜Ó$Ò-¨×4Ñ4Ó6×<Ñ<Ó>€HØ�X‰X�gÓÒ$ "×+Ñ+Ó-€Eà‡{�{ƒ}×Ñ 	Ô*Ø�a�b�	—‘Ó!ˆáÜ˜eÐ-AÑBÓCÀSÐHÐHð �:ÒØŸ™ /Ó2Ò8°b×?Ñ?ÓAˆð	?Ø&¨'°%°Ð(9Ð:ˆGÙØ-:�Ð)Ñ*Ü—‘¤˜¨iÐ8À'ÐSUÔVˆAØ�}‰} Ò#Ü d¸
ÐU_Ðrñ   Aó  Bð  BÜ %Ð3IÈ!Ï-É-ÈÐXYÐ1ZÑ[Ó\Ð^aÐaÐað —8‘8˜MÓ*Ò0¨b×7Ñ7Ó9€KÙÜ˜eÐ-SÑTÓUÐWZÐZÐZð&;Ü�L‰LÜˆjÐ0Ð1Ü  Ó'Ø  +Ð.Øô	
ˆð �=‰=˜CÒÜ %Ð3OÐPQ×P]ÑP]ÈÐ^_Ð1`ÑaÓbÐdgÐgÐgàŸ™›Ÿ™ [°"Ó5ˆØ#ˆð	Ü—L‘LÜ�*˜K¨ }Ð5Ü$ UÓ+ØôˆEð
 × Ñ  CÒ'Ø Ÿ:™:›<�à—L‘L ¨RÓ0×4Ñ4°VÓ<ò #Ø—|‘| FÓ+ò#à"ð ð ˆ	Øò 	[ˆAØJKÏ%É%ÐPXÐZ\ÓJ]Ö^ÀQ˜QŸU™U 4›[°!·%±%¸³-Ó@Ð^ˆFÐ^Ø×Ñ A§E¡E¨$£K¸¿¹¸v»ÐRXÑYÕZð	[ô ˜d°ÈÐdmÑnÓoÐoøôW ×"Ñ"×*Ñ*ò 	]Ü %Ð1UÑVÓWÐY\Ð\Ò\Üò 	?Ü %´°Q³Ñ8Ó9¸3Ð>Õ>ûð	?ûôB ò 	Ùð	üò
 _øô
 ×Ñ×&Ñ&ò TÜ˜eÐ-LÑMÓNÐPSÐSÒSÜò ;Ü˜e¬S°«VÑ4Ó5°sÐ:Õ:ûð;úsˆ   ÃAK> Ä"K> Å6AM/ Ç"M/ Ç1BM É2M/ Ê*M*Ê7AM/ Ë>-MÌ-MÌ5MÍMÍMÍ	M'Í$M/ Í&M'Í'M/ Í/-O	ÎO	Î&OÎ>O	ÏO	z/api/ghl-configc                  óf  — t         j                  } t         j                  r'| s%t        j                  j                  dt        ¬«      } | st        dddœ«      S t        | «      }|r|j                  d«      st        dd| dœ«      S t        dd|d   |d   |d	   |d
   |d   |d   |d   |d   dœ
«      S )u;   Retorna config GHL da conta do usuÃ¡rio para auto-conectar.rz   ©ÚtypeF)rØ  Úconfigurador‘   )rØ  r  rz   Tr  rÄ   r�   rü   r×  Úpipeline_nameÚ
stage_name)
rØ  r  r  r‘   rÄ   r�   rü   r×  r  r  )	r   rz   rÜ  r
   r:   r;   ru   r   r   )rz   rà  s     r?   Úapi_get_ghl_configr  n  sÀ   € ô ×$Ñ$€Hä×"Ò"©8Ü—<‘<×#Ñ# J´SÐ#Ó9ˆÙÜ˜e°EÑ:Ó;Ð;Ü
˜Ó
"€CÙ�c—g‘g˜gÔ&Ü˜e°EÀxÑPÓQÐQÜØ 4Ø˜
‘O¨c°'©lØ˜=Ñ)¸#¸mÑ:LØ˜
‘O°c¸/Ñ6JØ˜_Ñ-¸SÀÑ=Nñó ð rA   z/api/ghl-pipelinesc                  óô  — t         j                  } t         j                  r'| s%t        j                  j                  dt        ¬«      } | st        dddœ«      dfS t        | «      }|r|j                  d«      st        dddœ«      d	fS |j                  d
«      xs ddk7  rt        dddœ«      d	fS |j                  d«      xs d}|j                  d«      xs d}|r|st        dddœ«      d	fS 	 t        j
                  t        › d�t        |«      d|id¬«      }|j                  d	k7  rt        dd|j                  › �dœ«      d	fS |j                  «       j                  dg «      }g }|D ]u  }|j                  dg «      D �cg c]%  }|j                  d«      |j                  d«      dœ‘Œ' }	}|j                  |j                  d«      |j                  d«      |	dœ«       Œw t        d||j                  d«      xs d|j                  d«      xs ddœ«      S c c}w # t        j                  j                   $ r t        dddœ«      d	fcY S t"        $ r#}
t        dt%        |
«      dœ«      d	fcY d }
~
S d }
~
ww xY w)!u¿   Lista pipelines e stages GHL da conta do usuÃ¡rio logado.
    Usado pelos dropdowns inline da tela principal para trocar pipeline/stage
    sem precisar entrar na tela de configuraÃ§Ã£o.
    rz   r	  Fõ   Conta nÃ£o definida.rø  rñ   r‘   u   CRM nÃ£o configurado.r§   r  rõ  u$   Pipelines sÃ³ disponÃ­veis para GHL.r6   rÄ   z(Token ou location_id ausentes na config.rú  rÈ   rC   rË   zGHL retornou HTTP rû  rþ  r½   rº   rÿ  r   Tr�   rü   )rØ  rû  Úcurrent_pipeline_idÚcurrent_stage_idz&Timeout ao consultar pipelines na GHL.N)r   rz   rÜ  r
   r:   r;   ru   r   r   r¬   rÑ   rš   r¯   r¥   rZ   r  r  rx   rm   )rz   rà  r‘   rÄ   r~   r  rû  r”  r9   rþ  r   s              r?   Úapi_ghl_pipelinesr  „  s{  € ô ×$Ñ$€HÜ×"Ò"©8Ü—<‘<×#Ñ# J´SÐ#Ó9ˆÙÜ˜eÐ-CÑDÓEÀsÐJÐJä
˜Ó
"€CÙ�c—g‘g˜gÔ&Ü˜eÐ-DÑEÓFÈÐKÐKð 	�‰�
ÓÒ$˜u¨Ò.Ü˜eÐ-SÑTÓUÐWZÐZÐZà�G‰G�GÓÒ" €EØ—'‘'˜-Ó(Ò.¨B€KÙ‘kÜ˜eÐ-WÑXÓYÐ[^Ð^Ð^ð!;Ü�L‰LÜˆjÐ0Ð1Ü  Ó'Ø  +Ð.Øô	
ˆð �=‰=˜CÒÜ %Ð3EÀaÇmÁmÀ_Ð1UÑVÓWÐY\Ð\Ð\àŸ™›Ÿ™ [°"Ó5ˆØˆ	Øò 		ˆAð Ÿ™˜x¨Ó,öàð —u‘u˜T“{¨A¯E©E°&«MÓ:ðˆFð ð ×ÑØ—e‘e˜D“kØŸ™˜f›Ø ñõ ð		ô ØØ"Ø#&§7¡7¨=Ó#9Ò#?¸RØ #§¡¨
Ó 3Ò 9°rñ	
ó ð 	ùòøô" ×Ñ×&Ñ&ò ]Ü˜eÐ-UÑVÓWÐY\Ð\Ò\Üò ;Ü˜e¬S°«VÑ4Ó5°sÐ:Õ:ûð;ús>   Ã/AH Å;H Æ*HÆ+A,H ÈH È-I7ÉI7ÉI2É,I7É2I7c                  ó–  — t         j                  st        dddœ«      dfS t        j                  «       } | j                  d«      xs dj                  «       }|st        dddœ«      dfS t         j                  }t         j                  r| j                  d	«      xs |}|st        dd
dœ«      dfS t        t        |«      | j                  dd«      || j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      ¬«	       t        ddi«      S )z7Salva config GHL da conta (conta_admin ou super_admin).Fõ   PermissÃ£o negada.rø  é“  r‘   r6   u   Token obrigatÃ³rio.rñ   rz   r  r  rõ  rÄ   r�   rü   r×  r  r  )	rz   r  r‘   rÄ   r�   rü   r×  r  r  rØ  T)r   ró  r   r
   r  r;   r=   rz   rÜ  r   ru   )r¼   r‘   rz   s      r?   Úapi_save_ghl_configr  Â  s+  € ô ×&Ò&Ü˜eÐ-AÑBÓCÀSÐHÐHÜ×ÑÓ€DØ�X‰X�gÓÒ$ "×+Ñ+Ó-€EÙÜ˜eÐ-BÑCÓDÀcÐIÐIä×$Ñ$€HÜ×"Ò"Ø—8‘8˜JÓ'Ò3¨8ˆÙÜ˜eÐ-CÑDÓEÀsÐJÐJÜÜ�X“Ø—‘˜* eÓ,ØØ—H‘H˜]¨BÓ/Ø—H‘H˜]¨BÓ/Ø—‘˜* bÓ)Ø—h‘h˜°Ó3Ø—h‘h˜°Ó3Ø—8‘8˜L¨"Ó-õ
ô �D˜$�<Ó Ð rA   c                  ó8  — t         j                  } t         j                  rlt        j                  j                  dt        ¬«      }d}t        j                  r+t        j                  d¬«      xs i }|j                  d«      }|xs |xs | } | rt        | «      S dS )uZ   Resolve o conta_id do request: usa o do usuÃ¡rio, ou aceita ?conta_id= se for super_admin.rz   r	  NT©Úsilent)	r   rz   rÜ  r
   r:   r;   ru   Úis_jsonr  )rz   Ú	via_queryÚvia_jsonrg  s       r?   Ú_resolver_conta_id_adminr  â  s~   € ä×$Ñ$€HÜ×"Ò"Ü—L‘L×$Ñ$ Z´cÐ$Ó:ˆ	ØˆÜ�?Š?Ü×#Ñ#¨4Ô0Ò6°BˆDØ—x‘x 
Ó+ˆHØÒ4 Ò4¨HˆÙ$Œ3ˆx‹=Ð.¨$Ð.rA   z/api/crm-perfisc                  óþ   — t        «       } | st        dg dœ«      S t        | «      }t        j                  s:|D ]5  }|j                  d«      sŒt        |d   «      dkD  r|d   dd dz   nd|d	<   Œ7 t        d|| d
œ«      S )uy   Lista os perfis de CRM da conta do usuÃ¡rio logado.
    Super_admin pode passar ?conta_id= para consultar de outra conta.T)rØ  Úperfisr‘   r  Nræ  z...z***Útoken_preview)rØ  r   rz   )r  r   r(   r   ró  r;   rS   )rz   r   r”  s      r?   Úapi_listar_crm_perfisr"  ï  sŽ   € ô
 (Ó)€HÙÜ˜d¨bÑ1Ó2Ð2Ü˜xÓ(€Fä×&Ò&Øò 	_ˆAØ�u‰u�W�~Ü?BÀ1ÀWÁ:»ÐQSÒ?S Q w¡Z°° ^°eÒ%;ÐY^��/Ò"ð	_ô
 ˜$¨&¸hÑGÓHÐHrA   c                  ó.  — t         j                  st        dddœ«      dfS t        j                  «       xs i } | j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       }|st        dddœ«      d	fS |st        dd
dœ«      d	fS t         j                  }t         j                  r| j                  d«      xs |}|st        dddœ«      d	fS t        t        |«      || j                  dd«      || j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      ¬«      }t        d|dœ«      S )z(Cria um novo perfil de CRM para a conta.Fr  rø  r  rŒ   r6   r‘   u   Nome do perfil Ã© obrigatÃ³rio.rñ   u   Token Ã© obrigatÃ³rio.rz   r  r  rõ  rÄ   r�   rü   r×  r  r  rœ   )rz   rŒ   r  r‘   rÄ   r�   rü   r×  r  r  rœ   T©rØ  Úperfil)r   ró  r   r
   r  r;   r=   rz   rÜ  r*   ru   )r¼   rŒ   r‘   rz   r%  s        r?   Úapi_criar_crm_perfilr&    sz  € ô ×&Ò&Ü˜eÐ-AÑBÓCÀSÐHÐHÜ×ÑÓÒ# €DØ�H‰H�VÓÒ" ×)Ñ)Ó+€DØ�X‰X�gÓÒ$ "×+Ñ+Ó-€EÙÜ˜eÐ-NÑOÓPÐRUÐUÐUÙÜ˜eÐ-EÑFÓGÈÐLÐLä×$Ñ$€HÜ×"Ò"Ø—8‘8˜JÓ'Ò3¨8ˆÙÜ˜eÐ-CÑDÓEÀsÐJÐJäÜ�X“ØØ—‘˜* eÓ,ØØ—H‘H˜]¨BÓ/Ø—H‘H˜]¨BÓ/Ø—‘˜* bÓ)Ø—h‘h˜°Ó3Ø—h‘h˜°Ó3Ø—8‘8˜L¨"Ó-Ø—h‘h˜°Ó3ô€Fô ˜$¨&Ñ1Ó2Ð2rA   z/api/crm-perfis/<int:perfil_id>ÚPUTc                 ór  — t         j                  st        dddœ«      dfS t        j                  «       xs i }t        | «      }|st        dddœ«      dfS t         j                  s&|d   t         j                  k7  rt        dddœ«      dfS |j                  d«      xs |d   j                  «       }|j                  d	«      xs |d	   j                  «       }|r|st        dd
dœ«      dfS t        |d   ||j                  d|d   «      ||j                  d|d   «      |j                  d|d   «      |j                  d|d   «      |j                  d|d   «      |j                  d|d   «      |j                  d|d   «      |j                  d|j                  dd«      «      | ¬«      }t        d|dœ«      S )zAtualiza um perfil existente.Fr  rø  r  õ   Perfil nÃ£o encontrado.é”  rz   rŒ   r‘   u    Nome e token sÃ£o obrigatÃ³rios.rñ   r  rÄ   r�   rü   r×  r  r  rœ   r6   )rz   rŒ   r  r‘   rÄ   r�   rü   r×  r  r  rœ   Ú	perfil_idTr$  )r   ró  r   r
   r  r)   rÜ  rz   r;   r=   r*   )r+  r¼   r%  rŒ   r‘   Ú
atualizados         r?   Úapi_atualizar_crm_perfilr-  &  s±  € ô ×&Ò&Ü˜eÐ-AÑBÓCÀSÐHÐHÜ×ÑÓÒ# €DÜ˜IÓ&€FÙÜ˜eÐ-FÑGÓHÈ#ÐMÐMä×&Ò&¨6°*Ñ+=Ä×AVÑAVÒ+VÜ˜eÐ-AÑBÓCÀSÐHÐHà�H‰H�VÓÒ.  v¡×5Ñ5Ó7€DØ�X‰X�gÓÒ1 &¨¡/×8Ñ8Ó:€EÙ‘uÜ˜eÐ-OÑPÓQÐSVÐVÐVä"Ø˜
Ñ#ØØ—‘˜* f¨ZÑ&8Ó9ØØ—H‘H˜]¨F°=Ñ,AÓBØ—H‘H˜]¨F°=Ñ,AÓBØ—‘˜* f¨ZÑ&8Ó9Ø—h‘h˜°°Ñ0GÓHØ—h‘h˜°°Ñ0GÓHØ—8‘8˜L¨&°Ñ*>Ó?Ø—h‘h˜°·
±
¸?ÈBÓ0OÓPØô€Jô ˜$¨*Ñ5Ó6Ð6rA   ÚDELETEc                 ó^  — t         j                  st        dddœ«      dfS t        | «      }|st        dddœ«      dfS t         j                  s&|d   t         j
                  k7  rt        dddœ«      dfS t        |d   «      }|dk  rt        dd	dœ«      d
fS t        | «       t        ddi«      S )u8   Deleta um perfil, desde que nÃ£o seja o Ãºnico da conta.Fr  rø  r  r)  r*  rz   rÇ   u3   NÃ£o Ã© possÃ­vel deletar o Ãºnico perfil da conta.rñ   rØ  T)r   ró  r   r)   rÜ  rz   r,   r+   )r+  r%  r@  s      r?   Úapi_deletar_crm_perfilr0  J  s»   € ô ×&Ò&Ü˜eÐ-AÑBÓCÀSÐHÐHÜ˜IÓ&€FÙÜ˜eÐ-FÑGÓHÈ#ÐMÐMÜ×&Ò&¨6°*Ñ+=Ä×AVÑAVÒ+VÜ˜eÐ-AÑBÓCÀSÐHÐHä˜f ZÑ0Ó1€EØ�‚zÜ˜eÐ-bÑcÓdÐfiÐiÐiÜ�yÔ!Ü�D˜$�<Ó Ð rA   z
/api/quotac            	      ó  — t         j                  } | st        dddddddœ«      S 	 t        | «       t	        | «      }t        d|d   |d   |d   |d   d	œ«      S # t
        $ r#}t        d
t        |«      dœ«      dfcY d}~S d}~ww xY w)u<   Retorna a quota mensal de leads da conta do usuÃ¡rio logado.Tr   N)rØ  r  rÁ  rÃ  Úreset_emÚ	sem_contar  rÁ  rÃ  r2  )rØ  r  rÁ  rÃ  r2  Frø  éô  )r   rz   r   r%   r#   rx   rm   )rz   Úqr   s      r?   Ú	api_quotar6  _  s¦   € ô ×$Ñ$€HÙäØ !¨qØ¨Øñ
ó ð 	ð
;Ü! (Ô+Ü�hÓˆÜØØ˜‘kØ˜‘kØ˜L™/Ø˜*™ñ
ó ð 	øô ò ;Ü˜e¬S°«VÑ4Ó5°sÐ:Õ:ûð;ús   ¦2A Á	BÁ"B Á:BÂ Bz/admin/conta/criarc                  óF  — t         j                  st        dddœ«      dfS t        j                  j                  d«      xs dj                  «       } | s t        dd«       t        t        d	«      «      S t        | «       t        d
| › d�d«       t        t        d	«      «      S )NFr  rø  r  rŒ   r6   u   Nome da conta Ã© obrigatÃ³rio.ra   râ  zConta 'z	' criada.ræ  )r   rÜ  r   r
   rÑ  r;   r=   r   r   r   r   ©rŒ   s    r?   Úadmin_criar_contar9  {  sŽ   € ô ×&Ò&Ü˜eÐ-AÑBÓCÀSÐHÐHÜ�L‰L×Ñ˜VÓ$Ò*¨×1Ñ1Ó3€DÙÜÐ.°Ô8Üœ Ó(Ó)Ð)Ü�ÔÜ	ˆG�D�6˜Ð
# YÔ/Ü”G˜GÓ$Ó%Ð%rA   z/admin/conta/<int:cid>/deletarc                 ó˜   — t         j                  st        dddœ«      dfS t        | «       t	        dd«       t        t        d«      «      S )NFr  rø  r  zConta removida.ræ  râ  )r   rÜ  r   r!   r   r   r   )Úcids    r?   Úadmin_deletar_contar<  ‰  sF   € ô ×&Ò&Ü˜eÐ-AÑBÓCÀSÐHÐHÜ�#ÔÜ	Ð
˜YÔ'Ü”G˜GÓ$Ó%Ð%rA   z/admin/conta/<int:cid>/renomearc                 óè   — t         j                  st        dddœ«      dfS t        j                  j                  d«      xs dj                  «       }|rt        | |«       t        t        d«      «      S )NFr  rø  r  rŒ   r6   râ  )
r   rÜ  r   r
   rÑ  r;   r=   r"   r   r   )r;  rŒ   s     r?   Úadmin_renomear_contar>  “  sb   € ô ×&Ò&Ü˜eÐ-AÑBÓCÀSÐHÐHÜ�L‰L×Ñ˜VÓ$Ò*¨×1Ñ1Ó3€DÙÜ�s˜DÔ!Ü”G˜GÓ$Ó%Ð%rA   z"/admin/entrar-como-conta/<int:cid>c                 ó  — ddl m} t        j                  st	        t        d«      «      S t        | ¬«      }|s t        dd«       t	        t        d«      «      S t        j                  |d<   t        |d   «       t	        t        d«      «      S )	Nr   ©ÚsessionrË  ©rz   uD   Esta conta nÃ£o tem usuÃ¡rios vinculados. Crie um usuÃ¡rio primeiro.ra   râ  Ú_super_admin_id)
ÚflaskrA  r   rÜ  r   r   r   r   r½   r   )r;  rA  Úmembross      r?   Úadmin_entrar_como_contarF  ž  st   € õ Ü×&Ò&Üœ Ó(Ó)Ð)Ü sÔ+€GÙÜÐTÐV]Ô^Üœ Ó(Ó)Ð)Ü!-§¡€GÐÑÜˆw�q‰zÔÜ”G˜GÓ$Ó%Ð%rA   z/admin/sair-impersonacaoc                  óÊ   — ddl m}  | j                  dd «      }|r6t        j                  |«      }|rt        |«       t        t        d«      «      S t        t        d«      «      S )Nr   r@  rC  râ  rË  )rD  rA  r^   r   r;   r   r   r   )rA  Úsuper_idrÓ  s      r?   Úadmin_sair_impersonacaorI  ­  sT   € õ Ø�{‰{Ð,¨dÓ3€HÙÜ�x‰x˜Ó!ˆÙÜ�tÔÜœG GÓ,Ó-Ð-Ü”G˜GÓ$Ó%Ð%rA   z</opt/mia/workspace/prospeccao_ativa/prospeccao_schedule.jsonz6/opt/mia/workspace/prospeccao_ativa/prospeccao_auto.pyz!/opt/mia/logs/prospeccao_auto.logzA/opt/mia/workspace/prospeccao_ativa/prospeccao_auto_progress.jsonÚMonÚTueÚWedÚThuÚFriÚSatÚSun)ÚsegundaÚtercaÚquartaÚquintaÚsextaÚsabadoÚdomingoc                  ó°  — ddg g g dg d¢dddi dœ} 	 t         j                  «       rˆt        j                  t         j	                  d¬«      «      }| j                  «       D ]  \  }}|j                  ||«       Œ |j                  d	«      s"|j                  d
«      rt        |d
   «      |d	<   |S 	 | S # t        $ r}t        d|› �d¬«       Y d}~| S d}~ww xY w)z.Le a config do JSON, garantindo campos padrao.Fr  ú08:00)rQ  rS  rU  ÚBR©rÒ  Úlimite_por_buscaÚpalavras_chaveÚnichosÚcidadesÚhorarioÚdias_semanar  Ú
enriquecerr  Úcrmúutf-8©Úencodingr]  r^  z [automacao] erro ao ler config: T)ÚflushN)ÚAUTOMACAO_CONFIG_PATHrÙ   r¥   r  r  rÀ   rŽ  r;   rÇ  rx   ry   )Údefaultr¼   rÁ   rÂ   r   s        r?   Ú_automacao_carregar_configrj  Ò  sï   € ð ØØØØØÚ5ØØØ Øñ€Gð
BÜ ×'Ñ'Ô)Ü—:‘:Ô3×=Ñ=ÀwÐ=ÓOÓPˆDØŸ™›ò &‘��1Ø—‘  1Õ%ð&ð —8‘8Ð,Ô-°$·(±(¸8Ô2DÜ)-¨d°8©nÓ)=�Ð%Ñ&ØˆKð *ð €Nøô ò BÜÐ0°°Ð4¸D×AÑAØ€NûðBús   ’BB1 Â1	CÂ:CÃCr,  c                 óª   — t         j                  d«      }|j                  t        j                  | dd¬«      d¬«       |j                  t         «       y )Nz	.json.tmpFrB  ©r   Úindentrd  re  )rh  Úwith_suffixr  r¥   r  rv  )r,  Útmps     r?   Ú_automacao_salvar_configrp  ï  s<   € Ü
×
+Ñ
+¨KÓ
8€CØ‡N�N”4—:‘:˜f°5ÀÔCÈg€NÔVØ‡K�KÔ%Õ&rA   c                  óH  — 	 t        j                  g d¢ddd¬«      j                  j                  «       } 	 t        j                  g d¢ddd¬«      j                  j                  «       }| |dœS # t        $ r}d|› �} Y d}~ŒLd}~ww xY w# t        $ r}d|› �}Y d}~Œ3d}~ww xY w)	z/Retorna se o timer systemd esta enabled/active.)ú/bin/systemctlz
is-enabledúprospeccao-auto.timerTrÏ   ©Úcapture_outputr°   rj   zerro: N)rr  z	is-activers  )ÚenabledÚactive)Ú
subprocessÚrunÚstdoutr=   rx   )rv  r   rw  s      r?   Ú_automacao_timer_statusr{  õ  s¢   € ðÜ—.‘.ÚEØ d°Aô
÷ ‰&—‘“ð 	ðÜ—‘ÚDØ d°Aô
÷ ‰&—‘“ð 	ð ¨&Ñ1Ð1øô ò Ø˜1˜#�,�ûðûô ò Ø˜!˜��ûðús.   ‚3A. ¶3B	 Á.	BÁ7BÂBÂ		B!ÂBÂB!c                  óP  — 	 t        j                  g d¢dddd¬«       t        j                  g d¢dddd¬«       y# t         j                  $ r6} d| j                  xs | j                  xs t        | «      d d fcY d } ~ S d } ~ wt        $ r} dt        | «      d d fcY d } ~ S d } ~ ww xY w)	N)Úsudoú-nrr  Úenablers  TrC   )ru  r°   rj   Úcheck)r}  r~  rr  Ústartrs  ©Tr6   Frñ   )rx  ry  ÚCalledProcessErrorÚstderrrz  rm   rx   ©r   s    r?   Ú_automacao_timer_ligarr†  	  sš   € ð#Ü�‰ÚOØ d°B¸dõ	
ô 	�‰ÚNØ d°B¸dõ	
ð øÜ×(Ñ(ò =Ø�q—x‘xÒ5 1§8¡8Ò5¬s°1«v°t¸Ð<Ð<Õ<ûÜò #Ø”c˜!“f˜T˜c�lÐ"Õ"ûð#ús-   ‚8; »B%Á+A?Á9B%Á?B%ÂB ÂB%Â B%c                  óÂ   — d} 	 t        j                  g d¢ddd¬«       t        j                  g d¢ddd¬«       y# t        $ r}dt        |«      d d	 fcY d }~S d }~ww xY w)
Nr6   )r}  r~  rr  Ústoprs  TrC   rt  )r}  r~  rr  Údisablers  r‚  Frñ   )rx  ry  rx   rm   )rÄ  r   s     r?   Ú_automacao_timer_desligarrŠ  	  sd   € Ø
€Cð#Ü�‰ÚMØ d°Bõ	
ô 	�‰ÚPØ d°Bõ	
ð øÜò #Ø”c˜!“f˜T˜c�lÐ"Õ"ûð#ús   „6; »	AÁAÁAÁAz
/automacaoc                  ó6  — t        «       } t        «       }t        | «      }| j                  d«      xs i }|j                  dd«      |j                  dd«      |j                  dd«      t	        |j                  d«      «      dœ|d<   t        d||t        d	œ«      S )
z/Retorna a configuracao atual e status do timer.rc  rÄ   r6   r�   rü   r‘   ©rÄ   r�   rü   r  T)rØ  r,  ÚtimerÚdias_semana_validos)rj  r{  Údictr;   r]  r   ÚDIAS_SEMANA_VALIDOS)r,  r   Úsafe_configrc  s       r?   Úautomacao_getr’  )	  s—   € ô (Ó)€FÜ$Ó&€Fä�v“,€KØ
�*‰*�UÓ
Ò
!˜r€Cà—w‘w˜}¨bÓ1Ø—w‘w˜}¨bÓ1Ø—G‘G˜J¨Ó+Ü˜CŸG™G GÓ,Ó-ñ	€K�Ñô ØØØÜ2ñ	ó ð rA   z/automacao/statusc                  ó  — 	 t         j                  «       st        dddœ«      S t        j                  t         j                  d¬«      «      } t        d| dœ«      S # t        $ r#}t        dt        |«      dœ«      dfcY d}~S d}~ww xY w)	zURetorna o progresso da rodada em andamento (arquivo escrito pelo prospeccao_auto.py).TN)rØ  rQ  rd  re  Frø  r4  )ÚAUTOMACAO_PROGRESS_PATHrÙ   r   r¥   r  r  rx   rm   )r¼   r   s     r?   Úautomacao_statusr•  @	  sy   € ð;Ü&×-Ñ-Ô/Ü $°TÑ:Ó;Ð;Ü�z‰zÔ1×;Ñ;ÀWÐ;ÓMÓNˆÜ˜d°Ñ6Ó7Ð7øÜò ;Ü˜e¬S°«VÑ4Ó5°sÐ:Õ:ûð;ús"   ‚!A ¤6A Á	BÁ$BÁ<BÂBc                  ó€  — t        j                  «       xs i } | j                  d«      xs | j                  d«      xs g }| j                  d«      xs g }t        | j                  d«      xs d«      }| j                  d«      xs dj	                  «       }| j                  d«      xs g }t        | j                  d	d
«      «      }| j                  d«      xs dj	                  «       j                  «       }t        | j                  dd
«      «      }t        | j                  dd
«      «      }	|D �
cg c]5  }
t        |
«      j	                  «       sŒt        |
«      j	                  «       ‘Œ7 }}
|D �
cg c]5  }
t        |
«      j	                  «       sŒt        |
«      j	                  «       ‘Œ7 }}
|D �cg c]  }|t        v sŒ|‘Œ }}|dvrd}t        j                  d|«      st        d
ddœ«      dfS |dk  s|dkD  rt        d
ddœ«      dfS | j                  d«      xs i }i }|j                  d«      rÈ|j                  d«      r·t        |j                  d«      «      j	                  «       t        |j                  d«      «      j	                  «       t        |j                  d«      xs d«      j	                  «       t        |j                  d«      xs d«      j	                  «       t        j                  dœ}nxt        j                  }|rf	 t        |«      xs i }|j                  d«      rE|j                  d«      r4|d   |d   |j                  d«      xs d|j                  d«      xs d|dœ}||||||||||	|dœ}	 t!        |«       t#        |«      }|j                  dd«      |j                  dd«      |j                  dd«      t        |j                  d«      «      d!œ|d<   t        d"|d#œ«      S c c}
w c c}
w c c}w # t        $ r Y ŒŸw xY w# t        $ r}t        d
d|› �dœ«      dfcY d }~S d }~ww xY w)$z3Salva nova config. NAO altera estado do timer aqui.r]  r^  r_  r\  r  r`  rY  ra  rÒ  Fr  rZ  rb  r  )rZ  r$  z^\d{2}:\d{2}$zHorario invalido. Use HH:MMrø  rñ   rÇ   r4  zLimite deve estar entre 1 e 500rc  r‘   rÄ   r�   r6   rü   )r‘   rÄ   r�   rü   rz   r[  zFalha ao salvar: NrŒ  T)rØ  r,  )r
   r  r;   ru   r=   r]  Úupperrm   r�  r¾   rj  r   r   rz   r   rx   rp  r�  )r¼   Úpalavrasr_  r  r`  ÚdiasrÒ  r  rb  r  r6  ÚdÚcrm_inÚ	crm_blockrz   Ú	cfg_contar,  r   r‘  s                      r?   Úautomacao_saverž  M	  sÙ  € ô ×ÑÓÒ# €Dð �x‰xÐ(Ó)ÒE¨T¯X©X°hÓ-?ÒEÀ2€HØ�h‰h�yÓ!Ò' R€GÜ�—‘Ð,Ó-Ò3°Ó4€FØ�x‰x˜	Ó"Ò- g×4Ñ4Ó6€GØ�8‰8�MÓ"Ò( b€DÜ�—‘˜' 5Ó)Ó*€EØ�H‰H�VÓÒ$ ×+Ñ+Ó-×3Ñ3Ó5€DÜ�d—h‘h˜|¨UÓ3Ó4€JÜ˜4Ÿ8™8Ð$5°uÓ=Ó>€Oð )1ÖC 1´C¸³F·L±LµN”�A“—‘•ÐC€HÐCØ'.ÖA !´#°a³&·,±,µ.Œs�1‹v�|‰|�~ÐA€GÐAØÖ8�!˜qÔ$7Ò7ŠAÐ8€DÐ8à�<ÑØˆô �8‰8Ð$ gÔ.Ü˜eÐ-JÑKÓLÈcÐQÐQà�‚z�V˜c’\Ü˜eÐ-NÑOÓPÐRUÐUÐUð �X‰X�e‹_Ò" €FØ€IØ‡z�z�'Ô˜vŸz™z¨-Ô8ä˜Ÿ™ GÓ,Ó-×3Ñ3Ó5Ü˜vŸz™z¨-Ó8Ó9×?Ñ?ÓAÜ˜vŸz™z¨-Ó8Ò>¸BÓ?×EÑEÓGÜ˜FŸJ™J zÓ2Ò8°bÓ9×?Ñ?ÓAÜ$×-Ñ-ñ
‰	ô  ×(Ñ(ˆÙðÜ*¨8Ó4Ò:¸�	Ø—=‘= Ô)¨i¯m©m¸MÔ.Jà!*¨7Ñ!3Ø'0°Ñ'?Ø'0§}¡}°]Ó'CÒ'IÀrØ$-§M¡M°*Ó$=Ò$CÀØ$,ñ!�Ið Ø"Ø"ØØØØØØ Ø*Øñ€FðLÜ  Ô(ô
 �v“,€Kà —}‘} ]°BÓ7Ø —}‘} ]°BÓ7Ø—M‘M *¨bÓ1Ü˜IŸM™M¨'Ó2Ó3ñ	€K�Ñô ˜$¨+Ñ6Ó7Ð7ùòK DùÚAùÚ8øôJ ò Ùðûô& ò LÜ˜eÐ/@ÀÀÐ-DÑEÓFÈÐKÕKûðLúsU   Ä2O9ÅO9Å2O>ÆO>Æ2PÇ PÌA%P ÎP Ð	PÐPÐ	P=Ð P8Ð2P=Ð8P=z/automacao/togglec                  óf  — t        j                  «       xs i } t        | j                  dd«      «      }t	        «       }||d<   	 t        |«       |rt        «       \  }}nt        «       \  }}t        «       }t        ||s|nd||dœ«      S # t        $ r}t        dd|› �dœ«      dfcY d}~S d}~ww xY w)	zKLiga/desliga a automacao. Atualiza campo `ativo` no JSON e o timer systemd.ÚativarFrÒ  zFalha ao salvar config: rø  r4  N)rØ  r  r,  r�  )r
   r  r]  r;   rj  rp  rx   r   r†  rŠ  r{  )r¼   r   r,  r   rØ  rÄ  r   s          r?   Úautomacao_toggler¡  §	  sÃ   € ô ×ÑÓÒ# €DÜ�$—(‘(˜8 UÓ+Ó,€Fä'Ó)€FØ€Fˆ7�OðSÜ  Ô(ñ Ü(Ó*‰ˆ‰Cä+Ó-‰ˆˆCä$Ó&€FÜØÙ‘ 4ØØñ	ó ð øô ò SÜ˜eÐ/GÈÀsÐ-KÑLÓMÈsÐRÕRûðSús   ÁB
 Â
	B0ÂB+Â%B0Â+B0z/automacao/rodar-agorac                  ól  — t         j                  «       st        dddœ«      dfS t        «       } | j	                  d«      s| j	                  d«      r| j	                  d«      st        dddœ«      d	fS | j	                  d
«      xs i j	                  d«      st        dddœ«      d	fS 	 t
        j                  t        j                  dt        j                  «       j                  «       dt        | j	                  dg «      «      t        | j	                  d«      xs | j	                  d«      xs g «      z  dddddg d| j	                  dd«      g dœdd¬«      d¬«       	 t        j                  j!                  dd¬«       t#        t        dd¬«      }dt%        t         «      g}| j	                  d«      xs | j	                  d«      xs g D ]	  }|d|gz  }Œ | j	                  dg «      D ]	  }|d|gz  }Œ |dt%        | j	                  d«      xs d«      gz  }t'        | j	                  d d«      «      r|d!gz  }t)        j*                  |t%        t         j                  «      ||d¬"«       t        dd#d$œ«      S # t        $ r Y �Œ&w xY w# t        $ r#}t        dt%        |«      dœ«      dfcY d}~S d}~ww xY w)%zFExecuta a prospeccao imediatamente em background, sem alterar o timer.Fz(Script prospeccao_auto.py nao encontradorø  r4  r]  r^  r_  z2Configure palavras-chave e cidades antes de rodar.rñ   rc  r‘   u(   CRM nÃ£o configurado para a automaÃ§Ã£o.Ú	iniciandoNr   r  rZ  )r   ÚinicioÚfimÚcombinacoes_totalÚcombinacoes_feitasÚcombinacao_atualÚencontradosrÓ  Ú
duplicadosrR  r  r  Úlog_tailrB  rl  rd  re  T©Úparentsrý  r?  z/usr/bin/python3z	--palavraz--cidadez--limiter\  r  r  z--filtro-sem-site)Úcwdrz  r„  Ústart_new_sessionz"Prospeccao disparada em background)rØ  Úmensagem)ÚAUTOMACAO_SCRIPT_PATHrÙ   r   rj  r;   r”  r  r¥   r  r   rˆ   r‰   rS   rx   ÚAUTOMACAO_LOG_PATHÚparentÚmkdirrÚ   rm   r]  rx  ÚPopen)r,  Úlog_fpÚcli_argsr”  rÒ   r   s         r?   Úautomacao_rodar_agorar¸  Ä	  s³  € ô !×'Ñ'Ô)Ü˜eÐ-WÑXÓYÐ[^Ð^Ð^ô (Ó)€FØ�J‰JÐ'Ô(¨F¯J©J°xÔ,@ÈÏÉÐT]ÔI^Ü˜eÐ-aÑbÓcÐehÐhÐhØ�J‰J�uÓÒ# ×(Ñ(¨Ô1Ü˜eÐ-WÑXÓYÐ[^Ð^Ð^ðÜ×*Ñ*¬4¯:©:Ø!Ü—l‘l“n×.Ñ.Ó0ØÜ!$ V§Z¡Z°	¸2Ó%>Ó!?Ä#Ø—
‘
Ð+Ó,ÒJ°·
±
¸8Ó0DÒJÈóCñ "ð #$Ø $ØØØØØØ—J‘J˜v tÓ,Øñ7
ð   aô!,)ð  4;ð! 	+ô 	<ð(;ä×!Ñ!×'Ñ'°¸tÐ'ÔDÜÔ(¨#¸Ô@ˆð '¬Ô,AÓ(BÐCˆØ—*‘*Ð-Ó.ÒL°&·*±*¸XÓ2FÒLÈ"ò 	)ˆAØ˜ aÐ(Ñ(‰Hð	)à—‘˜I rÓ*ò 	(ˆAØ˜ Q˜Ñ'‰Hð	(à�Z¤ V§Z¡ZÐ0BÓ%CÒ%IÀrÓ!JÐKÑKˆÜ�—
‘
Ð,¨eÓ4Ô5ØÐ,Ð-Ñ-ˆHä×ÑØÜÔ)×0Ñ0Ó1Ø &Ø"õ		
ô ˜$Ð,PÑQÓRÐRøô= ò Úðûô6 ò ;Ü˜e¬S°«VÑ4Ó5°sÐ:Õ:ûð;ús2   Â'B6I7 ÅDJ É7	JÊJÊ	J3ÊJ.Ê(J3Ê.J3z/geocodec                  óÞ  — t         j                  j                  d«      xs dj                  «       } | st	        dddœ«      dfS 	 ddlm} |st	        dd
dœ«      dfS 	 t        j                  d| |ddœd¬«      }|j                  «       }|j                  d«      dk7  s|j                  d«      s t	        dd|j                  d«      dœ«      dfS |d   d   d   d   }|d   d   j                  d| «      }t	        d|d   |d    |d!œ«      S # t        $ r# t        j                  j                  d	d«      }Y Œëw xY w# t        $ r)}t	        ddt        |«      dd › �dœ«      dfcY d}~S d}~ww xY w)"uÙ   Converte nome de cidade/endereÃ§o em lat/lng via Google Geocoding API.

    Usa a mesma chave GOOGLE_PLACES_KEY jÃ¡ configurada (a chave do Google Cloud
    normalmente cobre Places + Geocoding no mesmo projeto).
    r5  r6   Fzq obrigatorio©rØ  ra   rñ   r   r*  r+  z!GOOGLE_PLACES_KEY nao configuradar4  z1https://maps.googleapis.com/maps/api/geocode/jsonzpt-BR)Úaddressrñ  ÚlanguagerC   )rÌ   rj   zfalha ao chamar geocoding: Nrª   iö  r   ÚOKrŸ  znao encontrado©rØ  ra   r   r*  Úgeometryrý  Úformatted_addressTr  r   )rØ  r  r   rŒ   )r
   r:   r;   r=   r   r,  r+  r-  r×   Úenvironr¬   r¥   rx   rm   )r5  r1  r~   r¼   r   ÚlocrŒ   s          r?   ÚgeocoderÃ  
  sˆ  € ô 
�‰×	Ñ	˜#Ó	Ò	$ "×+Ñ+Ó-€AÙÜ˜e¨oÑ>Ó?ÀÐDÐDð:Ý7ñ Ü˜eÐ.QÑRÓSÐUXÐXÐXðbÜ�L‰LØ?Ø ¨¸gÑFØô
ˆð
 �v‰v‹xˆð ‡x�x�Ó˜TÒ!¨¯©°)Ô)<Ü˜eÐ.>È$Ï(É(ÐS[ÓJ\Ñ]Ó^Ð`cÐcÐcà
ˆy‰/˜!Ñ
˜ZÑ
(¨Ñ
4€CØ�	‰?˜1Ñ×!Ñ!Ð"5°qÓ9€DÜ˜$ s¨5¡z¸#¸e¹*ÈdÑSÓTÐTøô) ò :Ü—*‘*—.‘.Ð!4°bÓ9Šð:ûô ò bÜ˜eÐ0KÌCÐPQËFÐSWÐTWÈLÈ>Ð.ZÑ[Ó\Ð^aÐaÕaûðbús0   ÁD Á,D: Ä)D7Ä6D7Ä:	E,ÅE'Å!E,Å'E,z/prospectarc                  ó"  — t         j                  st        ddi«      dfS t        j                  «       } | j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       }t        | j                  d«      xs d«      }| j                  d	«      xs d
j                  «       j                  «       }| j                  d«      xs dj                  «       }|r|st        ddi«      dfS 	 | j                  d«      }| j                  d«      }| j                  d«      }|dvrt        |«      nd }	|dvrt        |«      nd }
|dvrt        |«      nd}|r|dk  rd}|r|dkD  rd}| j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       j                  «       }t        | j                  dd«      «      }t        | j                  dd«      «      }d}d}d}|r+|st        ddi«      dfS |d
k(  r|r|r|st        ddi«      dfS t        dt        d |«      «      }t         j                   }|r:	 t#        |«       t%        |«      }|d!   |d   k\  rt        dd"|d   › d#�d$œ«      d fS 	 t)        |||«      }|t*        |   d%<   	 t        t         j,                  «      t*        |   d&<   	 t/        t*        |   «       t3        j4                  t6        |||||||||||||||||f|	|
|d)œd*¬+«      }|j9                  «        t        |d,|› d-�d.œ«      S # t        t        f$ r
 d }	d }
d}Y �ŒVw xY w# t&        $ r Y ŒËw xY w# t&        $ r d t*        |   d&<   Y Œ©w xY w# t&        $ r}t1        d'|› d(|› �«       Y d }~Œ¹d }~ww xY w)/Nr  rÎ  r  rä   r6   rƒ   r  r  r  rõ  r‘   zNicho e cidade sao obrigatoriosrñ   r  r   r!  )Nr6   Únullr   r4  rÄ   r�   rü   rœ   r  rZ  r  Fr  zCredenciais do CRM incompletas.zDCredenciais do CRM incompletas. Configure o CRM antes de prospectar.rÏ   r§   rÁ  zQuota mensal atingida. Limite: u    leads/mÃªs.rø  rz   rc   ú-[jobs_historico] erro ao vincular conta/user rq   )r  r   r!  T©Útargetr:   ÚkwargsÚdaemonúJob z	 iniciado©r…   r°  )r   rÒ  r   r
   r  r;   r=   ru   r�   r  Ú	TypeErrorÚ
ValueErrorr—  r]  Úmaxr  rz   r%   r#   rx   rü  rÆ  r½   r&   ry   Ú	threadingÚThreadrÞ  r�  )r¼   rä   rƒ   r  r  r‘   Úlat_rawÚlng_rawÚraio_rawÚlat_valÚlng_valÚraio_km_valrÄ   r�   rü   rœ   r  r  r  r  r  r  rz   rÜ  r…   r   rV   s                              r?   Ú
prospectarrØ  ,
  s?  € ô ×ÒÜ˜Ð VÐWÓXÐZ]Ð]Ð]Ü×ÑÓ€DØ�X‰X�gÓÒ$ "×+Ñ+Ó-€EØ�h‰h�xÓ Ò& B×-Ñ-Ó/€FÜ�—‘˜(Ó#Ò) rÓ*€FØ—‘˜Ó$Ò-¨×4Ñ4Ó6×<Ñ<Ó>€HØ�X‰X�gÓÒ$ "×+Ñ+Ó-€Eá™Ü˜Ð AÐBÓCÀSÐHÐHð
Ø—(‘(˜5“/ˆØ—(‘(˜5“/ˆØ—8‘8˜IÓ&ˆØ$+Ð3EÑ$E”%˜”.È4ˆØ$+Ð3EÑ$E”%˜”.È4ˆØ'/Ð7IÑ'I”c˜(”mÈqˆñ �{ Q’ØˆÙ�{ SÒ(Øˆð —8‘8˜MÓ*Ò0¨b×7Ñ7Ó9€KØ—8‘8˜MÓ*Ò0¨b×7Ñ7Ó9€KØ—‘˜Ó$Ò*¨×1Ñ1Ó3€HØ—X‘X˜oÓ.Ò4°"×;Ñ;Ó=€Mà�H‰H�VÓÒ$ ×+Ñ+Ó-×3Ñ3Ó5€Dô ˜tŸx™xÐ(=¸uÓEÓFÐÜ˜4Ÿ8™8Ð$5°uÓ=Ó>€Oð €KØ€OØ€Lñ ÙÜ˜FÐ$EÐFÓGÈÐLÐLØ�uÒ¡k±kÁhÜ˜FÐ$jÐkÓlÐnqÐqÐqä�”C˜˜VÓ$Ó%€Fô ×$Ñ$€HÙð		Ü% hÔ/Ü˜hÓ'ˆEØ�X‰ %¨¡/Ò1ÜØØ=¸eÀH¹oÐ=NÈlÐ[ñ ó ð ðð ð 2ô �u˜f fÓ-€FØ'„Dˆ�L�Ñð'Ü"%¤l§o¡oÓ"6ŒˆV‰�YÑðMÜœT &™\Ô*ô 	×ÑÜØ�e˜V V¨U°KÀÈhØ˜ tÐ-@À(ÈOØ˜?¨Lð:ð  w¸;ÑGØô	€Að ‡G�G„Iä˜f°D¸¸À	Ð2JÑKÓLÐLøôS ”zÐ"ò ØˆØˆØ‹ðûôb ò 	Ùð	ûô ò 'Ø"&ŒˆV‰�YÓð'ûô ò MÜÐ=¸f¸XÀRÈÀsÐK×LÑLûðMúsO   Ä A&N$ Ë7O  Ì#O Ì>O* Î$N=Î<N=Ï 	OÏOÏO'Ï&O'Ï*	PÏ3P	Ð	Pz/status/<job_id>c                 óŽ  ‡ — t         j                  ‰ «      }|rIt        j                  s9|j                  d«      }|�&|t        j                  k7  rt        dddg g dœ«      dfS |sst        d¬«      }t        ˆ fd	„|D «       d «      }|r=t        |d
   |d   dk7  r|d   nd|d   |d   |d   dk(  rdnd|d   dgd|d   g dœ
«      S t        dddg g dœ«      dfS d}|d   dkD  rt        |d   |d   z  dz  «      }|d   dk(  rd}t        |d
   |d   |d   |d   ||d   |d   dd  |d   |d   |d   |j                  dd«      dœ«      S )Nrz   r  úJob nao encontrador   )r   r  ÚpctrR  r'  r*  rÎ   ©rÊ   c              3   ó4   •K  — | ]  }|d    ‰k(  sŒ|–— Œ y­w©r½   Nr™   ©r¼  Újr…   s     €r?   r½  zstatus.<locals>.<genexpr>œ
  s   øè ø€ ÒC˜q°°4±¸FÓ1BœÑCùó   ƒ‘r½   r   ré  rQ  r@  r¨  r  r¸  uv   Job recuperado do histÃ³rico â€” dados em memÃ³ria foram perdidos (limite de jobs atingido). RefaÃ§a o enriquecimento.uB   Dados do job foram perdidos da memÃ³ria. RefaÃ§a o enriquecimento.r©  )
r½   r   rQ  r@  rÛ  r¸  r'  r  r©  rR  r'  iöÿÿÿrR  Úcrm_enviadoF)r½   r   rQ  r@  rÛ  r¸  r'  r  r©  rR  râ  )	rÆ  r;   r   rÜ  rz   r   r'   ÚnextÚround)r…   rm  ÚdonoÚ	historicoÚjob_histrÛ  s   `     r?   r   r   �
  sÂ  ø€ ô �(‰(�6Ó
€Cá
”<×.Ò.Ø�w‰w�zÓ"ˆØÐ ¬×(=Ñ(=Ò =Ü fÐ6JÐSTÐ_aÐkmÑnÓoÐqtÐtÐtÙä)°Ô3ˆ	ÜÓC IÔCÀTÓJˆÙÜØ˜t‘nØ08¸Ñ0BÀlÒ0R˜( 8Ò,ÐX^Ø% kÑ2Ø! 'Ñ*Ø& xÑ0°KÒ?‘sÀQØ"*Ð+;Ñ"<ð Rð  SØ\Ø (¨Ñ 8Øñó ð ô  &Ð2FÈqÐ[]ÐgiÑjÓkÐmpÐpÐpà
€CØ
ˆ7�|�aÒÜ�S˜Ñ%¨¨G©Ñ4¸Ñ;Ó<ˆØ
ˆ8�}˜Ò#ØˆäØ�$‰iØ�h‘-Ø˜Ñ%Ø�W‘ØØÐ.Ñ/Ø�F‘˜C˜DÐ!Ø�F‘Ø˜NÑ+Ø�W‘Ø—w‘w˜}¨eÓ4ñó ð rA   z/jobsc                  ór  — t         j                  r&t        j                  «       D � ci c]  } | d   | “Œ
 }} nXt        j                  «       D � ci c];  } | j	                  d«      �"| j	                  d«      t         j
                  k(  r| d   | “Œ= }} t         j                  st         j
                  nd }	 t        |d¬«      }i }|D ]
  }|||d   <   Œ |j                  «       D ]{  \  }}|d   |j	                  dd«      |j	                  dd	«      |j	                  d
d	«      |j	                  d|j	                  dd«      «      |d   |d   |d   |d   |d   |d   dœ||<   Œ} t        |j                  «       d„ d¬«      d d }	t        |	«      S c c} w c c} w # t        $ r}t        d|› �«       g }Y d }~Œòd }~ww xY w)Nr½   rz   r  )rz   rÊ   z![jobs_historico] erro ao listar: rç  rè  rä   rÀ  rƒ   r  r@  r   r   rQ  r¸  rê  r©  )r½   rç  rä   rƒ   r  r   rQ  r@  r¸  rê  r©  c                 ó,   — | j                  d«      xs dS )Nrê  r6   r»  )rà  s    r?   rx  zlistar_jobs.<locals>.<lambda>è
  s   € °!·%±%¸Ó2DÒ2JÈ€ rA   T)rñ  ÚreverserC   )r   rÜ  rÆ  Úvaluesr;   rz   r'   rx   ry   rÀ   rö  r   )
rà  Ú
em_memoriarz   Úhistorico_dbr   ÚmergedÚrowÚjidrm  Úlistas
             r?   Úlistar_jobsrò  Á
  sÉ  € ô ×"Ò"Ü*.¯+©+«-Ö8 Q�a˜‘g˜q‘jÐ8ˆ
Ñ8ô !%§¡£ö
ØØ�u‰u�ZÓ Ð(¨A¯E©E°*Ó,=Ä×AVÑAVÒ,Vð ˆd‰G�Q‰Jð
ˆ
ð 
ô -9×,GÒ,GŒ|×$Ò$ÈT€HðÜ,°hÀbÔIˆð €FØò  ˆØˆˆs�4‰yÒð à×$Ñ$Ó&ò 
‰ˆˆSà�d‘)Ø—G‘G˜F LÓ1Ø—W‘W˜W eÓ,Ø—g‘g˜h¨Ó.Ø—g‘g˜h¨¯©°¸Ó(;Ó<Ø˜(‘mØ˜[Ñ)Ø˜‘\Ø!Ð"2Ñ3Ø˜[Ñ)Ø Ñ/ñ
ˆˆsŠð
ô �6—=‘=“?Ñ(JÐTXÔYÐZ]Ð[]Ð^€EÜ�5‹>ÐùòG 9ùò
øô ò ÜÐ1°!°Ð5Ô6Ø�ûðús$   §F	ÁA FÂ2F Æ	F6ÆF1Æ1F6z/cancelar/<job_id>c                 ó´   — t         j                  | «      }|st        ddi«      dfS |d   dvrt        dd|d   › d�i«      dfS d	|d<   t        d
d| › d�i«      S )Nr  rÚ  r*  r   ©ré  r#  úJob ja esta em status 'ú'rñ   r4  r°  rË  z marcado para cancelamento©rÆ  r;   r   ©r…   rm  s     r?   Úcancelarrù  ì
  s~   € ô �(‰(�6Ó
€CÙÜ˜Ð 4Ð5Ó6¸Ð;Ð;Ø
ˆ8�}Ð:Ñ:Ü˜Ð"9¸#¸h¹-¸ÈÐ JÐKÓLÈcÐQÐQØ€Cˆ�MÜ�J $ v hÐ.HÐ IÐJÓKÐKrA   z/pausar/<job_id>c                 ó´   — t         j                  | «      }|st        ddi«      dfS |d   dvrt        dd|d   › d�i«      dfS d	|d<   t        d
d| › d�i«      S )Nr  rÚ  r*  r   rô  rõ  rö  rñ   r5  r°  rË  z* pausado - enviando leads coletados ao CRMr÷  rø  s     r?   Úpausarrû  ø
  s~   € ô �(‰(�6Ó
€CÙÜ˜Ð 4Ð5Ó6¸Ð;Ð;Ø
ˆ8�}Ð:Ñ:Ü˜Ð"9¸#¸h¹-¸ÈÐ JÐKÓLÈcÐQÐQØ€Cˆ�MÜ�J $ v hÐ.XÐ YÐZÓ[Ð[rA   z/enviar-todos-crmc                  ó,  — t        j                  «       xs i } | j                  d«      }t        j                  |«      }| j                  d«      xs g }|r"|D �cg c]  }|j                  d«      rŒ|‘Œ }}nC|r2|j                  dg «      D �cg c]  }|j                  d«      rŒ|‘Œ }}nt	        ddi«      dfS | j                  d«      xs dj                  «       j                  «       }| j                  d	«      xs d
j                  «       }| j                  d«      xs d
j                  «       }| j                  d«      xs d
j                  «       }	| j                  d«      xs d
j                  «       }
| j                  d«      xs d
j                  «       }|st	        ddi«      dfS |dk(  r|r|	r|
st	        ddi«      dfS d}d}g }|D �]R  }|j                  d«      rŒ	 |dk(  r„t        ||d|j                  dd
«      |j                  dd
«      g|¬«      \  }}|r,t        ||||	xs d|
xs d|d   ¬«       d|d<   ||d<   |dz  }n¿|dz  }|j                  |d   |xs dd œ«       nžt        |||t        |«      xs d!¬"«      \  }}|r^t        |||||	|
«      \  }}}|xr d#|j                  «       v }|s|rd|d<   ||d<   |dz  }n?|dz  }|j                  |d   d$|› �d œ«       n|dz  }|j                  |d   d%|› �d œ«       t        j                  d&«       �ŒU |rˆ|rn|D �ch c]  }|j                  d«      sŒ|d   ’Œ }}|j                  dg «      D ]  }|d   |v sŒd|d<   Œ t#        d(„ |j                  dg «      D «       «      |d)<   n|j                  d)d«      |z   |d)<   t	        d|||d*œ«      S c c}w c c}w # t        $ r=}|dz  }|j                  |j                  dd'«      t!        |«      d œ«       Y d!}~�Œ;d!}~ww xY wc c}w )+u=  Envia todos os leads nÃ£o enviados de um job ao CRM configurado.

    Aceita duas formas de fornecer os leads:
    1. job_id: busca o job em memÃ³ria (comportamento padrÃ£o)
    2. leads: lista de leads enviados diretamente no body (fallback quando o
       job em memÃ³ria foi perdido - ex: servidor reiniciado)
    r…   rR  rN  r  z(Job nao encontrado e nenhum lead enviador*  r  rõ  r‘   r6   rÄ   r�   rü   rœ   zToken do CRM ausenterñ   zCredenciais GHL incompletasr   r³  r¹   rä   rƒ   r´  rµ  r¶  rŒ   r·  Tr›   rÇ   zsem contact_id)rŒ   r  N)rá   rò   zoportunidade: z	contato: g333333Ó?rr  c              3   óD   K  — | ]  }|j                  d «      sŒd–— Œ y­w)rN  rÇ   Nr»  )r¼  rÐ  s     r?   r½  z#enviar_todos_crm.<locals>.<genexpr>a  s   è ø€ Ò'`¨aÈ1Ï5É5ÐQ^ÕK_¬Ñ'`ùs   ‚ ™ r¸  )rØ  rÓ  ÚfalhasÚerros)r
   r  r;   rÆ  r   r=   r�   rÃ   r³   rZ   rû   rß   r  rO   r_  rx   rm   Úsum)r¼   r…   rm  Ú	leads_rawrÐ  Úleads_para_enviarr  r‘   rÄ   r�   rü   rœ   rÓ  rþ  Úerros_detalhesr´   r›   rÄ  rØ  r  Úerr_oppÚis_dupÚexcÚenviados_nomesÚjls                            r?   Úenviar_todos_crmr	    s_  € ô ×ÑÓÒ# €DØ�X‰X�hÓ€FÜ
�(‰(�6Ó
€Cð —‘˜Ó!Ò' R€IÙØ(1ÖN 1¸¿¹¸}Õ9MšQÐNÐÑNÙ	Ø(+¯©°¸Ó(<ÖY 1ÀAÇEÁEÈ-ÕDXšQÐYÐÑYä˜Ð JÐKÓLÈcÐQÐQà—‘˜Ó$Ò-¨×4Ñ4Ó6×<Ñ<Ó>€HØ�X‰X�gÓÒ$ "×+Ñ+Ó-€EØ—8‘8˜MÓ*Ò0¨b×7Ñ7Ó9€KØ—8‘8˜MÓ*Ò0¨b×7Ñ7Ó9€KØ—‘˜Ó$Ò*¨×1Ñ1Ó3€HØ—X‘X˜oÓ.Ò4°"×;Ñ;Ó=€MáÜ˜Ð 6Ð7Ó8¸#Ð=Ð=Ø�5Ò¡+±+Á(Ü˜Ð =Ð>Ó?ÀÐDÐDà€HØ€FØ€NØ!ó -UˆØ�8‰8�MÔ"Øð*	UØ˜:Ò%Ü"8Ø˜%Ð"4°d·h±h¸wÈÓ6KÈTÏXÉXÐV^Ð`bÓMcÐ!dØ"/ô#‘�
˜Cñ Ü/Ø" E¨=Ø$/Ò$IÐ3IØ"*Ò"DÐ.DØ&*¨6¡lõ	ð +/�D˜Ñ'Ø)3�D˜Ñ&Ø ‘M‘Hà˜a‘K�FØ"×)Ñ)°4¸±<ÈÒI`ÐP`Ñ*aÕbä"3Ø˜% Ü&:¸;Ó&GÒ&OÈ4ô#‘�
˜Cñ Ü*@Ø˜j¨%°¸kÈ8ó+Ñ'�B˜ ð %ÒG¨¸¿¹»Ð)G�FÙ™VØ.2˜˜]Ñ+Ø-7˜˜\Ñ*Ø  A™™à !™˜Ø&×-Ñ-°t¸F±|È~Ð^eÐ]fÐMgÑ.hÕià˜a‘K�FØ"×)Ñ)°4¸±<È9ÐUXÐTYÐIZÑ*[Ô\Ü�J‰J�sŽOðU-Uñ^ áØ1BÖ[¨AÀaÇeÁeÈMÕFZ˜a ›iÐ[ˆNÐ[Ø—g‘g˜g rÓ*ò -�Ø�f‘: Ò/Ø(,�B�}Ò%ð-ô %(Ñ'`°3·7±7¸7ÀBÓ3GÔ'`Ó$`ˆCÐ Ò!à$'§G¡GÐ,<¸aÓ$@À8Ñ$KˆCÐ Ñ!Ü˜$¨HÀÐQ_Ñ`ÓaÐaùò] OùâYøô| ò 	UØ�a‰KˆFØ×!Ñ!¨4¯8©8°F¸CÓ+@Ì#ÈcË(Ñ"S×TÒTûð	Uüò \s=   ÁN>Á1N>ÂOÂ%OÇ%D<OÌ,PÍPÏ	PÏ2P	Ð	Pz/enriquecerc            	      óN  — d} d}d}d}g }t         j                  r´t        j                  «       }|j                  d«      xs dj	                  «       } |j                  d«      xs dj	                  «       }|j                  d«      xs dj	                  «       }|j                  d«      xs dj	                  «       }|j                  dg «      }�nt         j
                  j                  d«      xs dj	                  «       } t         j
                  j                  d«      xs dj	                  «       }t         j
                  j                  d«      xs dj	                  «       }t         j
                  j                  d«      xs dj	                  «       }dt         j                  v rÁt         j                  d   }|j                  «       j                  dd	¬
«      }t        j                  t        j                  |«      «      }|D ]`  }	|	sŒ|	d   j	                  «       sŒ|	d   j	                  «       j                  «       dk7  sŒ?|j                  |	d   j	                  «       «       Œb t         j
                  j                  d«      xs dj	                  «       }
|
r;|s9|
j                  «       D ]&  }|j	                  «       }|sŒ|j                  |«       Œ( |st!        ddi«      dfS | r|st!        ddi«      dfS |dd }t#        |«      }| t$        |   d<   |t$        |   d<   |t$        |   d<   |t$        |   d<   dt$        |   d<   t&        j(                  t$        |   d<   	 t+        t&        j,                  «      t$        |   d<   	 t1        t$        |   «       t5        j6                  t8        ||| |||fddid¬ «      }|j;                  «        t!        |d!t=        |«      › d"�d#œ«      S # t.        $ r dt$        |   d<   Y Œzw xY w# t.        $ r}t3        d|› d|› �«       Y d}~ŒŠd}~ww xY w)$zIRecebe CSV com nomes de empresas ou lista JSON, enriquece e envia ao CRM.r6   r‘   rÄ   r�   rü   r	  Úarquivord  Úignore)Úerrorsr   r‚   Úlista_textor  zNenhuma empresa na listarñ   õ!   Token e Location ID obrigatÃ³riosNr  Ú	crm_tokenÚcrm_location_idÚcrm_pipeline_idÚcrm_stage_idFrâ  rz   rc   rÆ  rq   r¶  TrÇ  zEnriquecendo z	 empresasrÌ  )r
   r  r  r;   r=   rÑ  ÚfilesÚreadÚdecodeÚcsvÚreaderÚioÚStringIOr�   rZ   Ú
splitlinesr   r  rÆ  r   rz   ru   r½   rx   r&   ry   rÐ  rÑ  rÆ  r�  rS   )r‘   rÄ   r�   rü   r	  r¼   rÞ   Úcontentr  rï  r  ÚlinharŒ   r…   r   rV   s                   r?   rb  rb  g  s©  € ð €EØ€KØ€KØ€HØ€Hä‡‚Ü×ÑÓ!ˆØ—‘˜'Ó"Ò( b×/Ñ/Ó1ˆØ—x‘x Ó.Ò4°"×;Ñ;Ó=ˆØ—x‘x Ó.Ò4°"×;Ñ;Ó=ˆØ—H‘H˜ZÓ(Ò.¨B×5Ñ5Ó7ˆØ—8‘8˜J¨Ó+Šä—‘×!Ñ! 'Ó*Ò0¨b×7Ñ7Ó9ˆÜ—|‘|×'Ñ'¨Ó6Ò<¸"×CÑCÓEˆÜ—|‘|×'Ñ'¨Ó6Ò<¸"×CÑCÓEˆÜ—L‘L×$Ñ$ ZÓ0Ò6°B×=Ñ=Ó?ˆð œŸ™Ñ%Ü—‘˜iÑ(ˆAØ—f‘f“h—o‘o g°h�oÓ?ˆGÜ—Z‘Z¤§¡¨GÓ 4Ó5ˆFØò 4�Ú˜3˜q™6Ÿ<™<�>¨c°!©f¯l©l«n×.BÑ.BÓ.DÈ	Ó.QØ—O‘O C¨¡F§L¡L£NÕ3ð4ô
 —|‘|×'Ñ'¨Ó6Ò<¸"×CÑCÓEˆÙ™xØ$×/Ñ/Ó1ò *�Ø—{‘{“}�ÚØ—O‘O DÕ)ð*ñ
 Ü˜Ð :Ð;Ó<¸cÐAÐAÙ™Ü˜Ð CÐDÓEÀsÐJÐJà˜˜ˆ~€HÜ˜XÓ&€Fð !&„Dˆ�L�ÑØ&1„Dˆ�LÐ"Ñ#Ø&1„Dˆ�LÐ"Ñ#Ø#+„Dˆ�L�Ñ Ø"'„Dˆ�L�ÑÜ+×4Ñ4„Dˆ�L�Ñð'Ü"%¤l§o¡oÓ"6ŒˆV‰�YÑðMÜœT &™\Ô*ô 	×ÑÜØ�h  {°KÀÐJØ˜eÐ$Øô		€Að ‡G�G„Iä˜f°MÄ#ÀhÃ-ÀÐPYÐ2ZÑ[Ó\Ð\øô ò 'Ø"&ŒˆV‰�YÓð'ûô ò MÜÐ=¸f¸XÀRÈÀsÐK×LÑLûðMús*   Í#O% ÎP  Ï%O=Ï<O=Ð 	P$Ð	PÐP$z/enriquecer/exportar-csvc            	      ó–  — t         j                  j                  d«      } t        j                  | «      }|xs i j                  d«      xs t	        | xs d«      }|st        ddi«      dfS g d¢}t        j                  «       }t        j                  ||d¬	«      }|j                  «        |D ]p  }|D �ci c]  }||j                  |d«      “Œ }}t        |j                  d
«      t        «      rdj                  d„ |d
   D «       «      |d
<   |j                  |«       Œr ddlm}	  |	|j#                  «       ddd| › d�i¬«      S c c}w )zµExporta os leads enriquecidos de um job como arquivo CSV.

    Uso: GET /enriquecer/exportar-csv?job_id=XXX
    Retorna um CSV com as colunas principais dos leads enriquecidos.
    r…   rR  r6   r  u   Nenhum lead disponÃ­velr*  )rŒ   r„   r¸   rå   ræ   r«  r¬  r­  r®  r¯  r°  rì   r  )Ú
fieldnamesÚextrasactionrì   rí   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrN   )rm   )r¼  rÞ   s     r?   r½  z*enriquecer_exportar_csv.<locals>.<genexpr>Ë  s   è ø€ Ò%D°¤c¨!§fÑ%Dùs   ‚r   )ÚResponseztext/csvzContent-Dispositionz'attachment;filename=leads_enriquecidos_z.csv)Úmimetyper<   )r
   r:   r;   rÆ  r  r   r  r  r  Ú
DictWriterÚwriteheaderrÜ   rÇ  ró   ÚwriterowrD  r"  Úgetvalue)
r…   rm  rR  ÚcamposÚoutputÚwriterr´   rÁ   rï  r"  s
             r?   Úenriquecer_exportar_csvr+  ²  s7  € ô �\‰\×Ñ˜hÓ'€FÜ
�(‰(�6Ó
€CØŠY�B�O‰O˜GÓ$ÒKÔ(=¸fºlÈÓ(K€EÙÜ˜Ð 9Ð:Ó;¸SÐ@Ð@ò€Fô
 �[‰[‹]€FÜ�^‰^˜F¨vÀHÔM€FØ
×ÑÔØò ˆØ+1Ö2 aˆq�$—(‘(˜1˜b“/Ñ!Ð2ˆÐ2Ü�c—g‘g˜hÓ'¬Ô.Ø ŸI™IÑ%D°c¸(±mÔ%DÓDˆC�‰MØ�‰˜Õð	õ ÙØ�‰ÓØà!Ð%LÈVÈHÐTXÐ#Yð
ôð ùò 3s   Â5Ez/enriquecer/excluir-arquivoc                  ó¦  — ddl } d}	 t        j                  r>t        j                  d¬«      xs i }|j	                  d«      xs dj                  «       }n1t        j                  j	                  d«      xs dj                  «       }g }	 | j                  j                  | j                  j                  | j                  j                  t        «      «      d«      }| j                  j                  |«      rœt        t        j	                  d«      xs d«      j                  «       }| j!                  |«      D ]X  }|r|j#                  |› d	�«      sŒ| j                  j                  ||«      }	 | j%                  |«       |j'                  |«       ŒZ t+        dd
||dœ«      S # t        $ r d}Y �Œ*w xY w# t(        $ r Y Œˆw xY w# t        $ r Y Œ<w xY w)u[  Remove o arquivo de enriquecimento carregado.

    O upload no fluxo atual Ã© processado em memÃ³ria (nÃ£o Ã© salvo em disco),
    entÃ£o esta rota Ã© idempotente: ela apenas confirma a limpeza e remove
    qualquer arquivo temporÃ¡rio associado ao usuÃ¡rio, se existir. A UI usa
    esta rota para resetar o estado do formulÃ¡rio no cliente.
    r   Nr6   Tr  rŒ   Úuploadsrc   rÅ  zArquivo removido)rØ  r°  rŒ   Ú	removidos)r×   r
   r  r  r;   r=   rÑ  rx   rØ   ró   ÚdirnameÚabspathÚ__file__Úisdirrm   rA  Úlistdirr”  ÚremoverZ   ÚOSErrorr   )Ú_osrŒ   r¼   r.  Ú
upload_dirrc   ÚfnameÚcaminhos           r?   Úenriquecer_excluir_arquivor:  Ø  s™  € ó à€DðÜ�?Š?Ü×#Ñ#¨4Ô0Ò6°BˆDØ—H‘H˜VÓ$Ò*¨×1Ñ1Ó3‰Dä—L‘L×$Ñ$ VÓ,Ò2°×9Ñ9Ó;ˆDð
 €IðØ—X‘X—]‘] 3§8¡8×#3Ñ#3°C·H±H×4DÑ4DÄXÓ4NÓ#OÐQZÓ[ˆ
Ø�8‰8�>‰>˜*Ô%Üœ'Ÿ+™+ iÓ0Ò6°BÓ7×=Ñ=Ó?ˆGØŸ™ ZÓ0ò �Ù 5×#3Ñ#3°w°i¸q°MÔ#BØØŸ(™(Ÿ-™-¨
°EÓ:�ðØ—J‘J˜wÔ'Ø×$Ñ$ UÕ+ðô ØØ&ØØñ	ó ð øô+ ò Ø‹ðûô  ò Ùðûäò ÙðúsI   ˆA?F# Â
C$G Å/"F5ÆG Æ#F2Æ1F2Æ5	GÆ>G Ç GÇG Ç	GÇGz/planilha/abasc                  ó  — ddl } t        j                  j                  d«      }|st	        ddi«      dfS 	 | j                  |dd¬«      }g }|j                  D ]`  }||   }d}|j                  d
d¬«      D ]-  }|r|d   nd}	|	€Œt        |	«      j                  «       sŒ)|d
z  }Œ/ |j                  ||dœ«       Œb |j                  «        t	        d|dœ«      S # t        $ r}t	        dd	|› �i«      dfcY d}~S d}~ww xY w)uH   Recebe .xlsx e retorna lista de abas com contagem de linhas nÃ£o-vazias.r   Nr  r  õ   Arquivo nÃ£o enviadorñ   T©Ú	read_onlyÚ	data_onlyúFalha ao ler planilha: rÇ   ©Úmin_rowÚvalues_only)rŒ   r@  )rØ  Úabas)Úopenpyxlr
   r  r;   r   Úload_workbookrx   Ú
sheetnamesÚ	iter_rowsrm   r=   rZ   rw   )
rE  rÞ   Úwbr   rD  Únome_abaÚwsr@  rï  Úvals
             r?   Úplanilha_abasrM  
  s  € ó Ü�‰×Ñ˜)Ó$€AÙÜ˜Ð 6Ð7Ó8¸#Ð=Ð=ðEØ×#Ñ# A°ÀÐ#ÓFˆð €DØ—M‘Mò 8ˆØ�‰\ˆØˆØ—<‘<¨°t�<Ó<ò 	ˆCÙ�#�a’& TˆCØ‰¤3 s£8§>¡>Õ#3Ø˜‘
‘ð	ð 	�‰˜X°Ñ6Õ7ð8ð ‡H�H„JÜ˜$¨Ñ-Ó.Ð.øô ò EÜ˜Ð"9¸!¸Ð =Ð>Ó?ÀÐDÕDûðEús   ¶C Ã	C>Ã"C9Ã3C>Ã9C>z/planilha/carregarc                  ó   — ddl } ddl}t        j                  j	                  d«      }|st        ddi«      dfS 	 |j                  t        j                  j	                  dd«      «      }|st        dd	i«      dfS 	 | j                  |d
d
¬«      }h d£}g }|j                  D ]s  }||vrŒ||   }	|	j                  dd
¬«      D ]Q  }
|
r|
d   nd}|€Œt        |«      j                  «       }|sŒ+|j                  «       |v rŒ>|j                  ||dœ«       ŒS Œu |j!                  «        |D �cg c]  }|d   ‘Œ	 }}t        d
||t#        |«      dœ«      S # t        $ r g }Y Œöw xY w# t        $ r}t        dd|› �i«      dfcY d}~S d}~ww xY wc c}w )zERecebe .xlsx + abas selecionadas, retorna lista consolidada de nomes.r   Nr  r  r<  rñ   Úabas_selecionadasz[]zNenhuma aba selecionadaTr=  r@  >   õ   razÃ£o socialúrazao socialr´   rŒ   ÚclienteÚcompanyr‚   rÇ   rA  )rŒ   ÚabarŒ   )rØ  ÚitensÚnomesr@  )rE  r¥   r
   r  r;   r   r  rÑ  rx   rF  rG  rH  rm   r=   r�   rZ   rw   rS   )rE  Ú_jsonrÞ   Úabas_selrI  r   ÚHEADERSrU  rJ  rK  rï  rL  r  r˜  rV  s                  r?   Úplanilha_carregarrZ  $  sµ  € ó ÛÜ�‰×Ñ˜)Ó$€AÙÜ˜Ð 6Ð7Ó8¸#Ð=Ð=ðØ—;‘;œwŸ|™|×/Ñ/Ð0CÀTÓJÓKˆñ Ü˜Ð 9Ð:Ó;¸SÐ@Ð@ðEØ×#Ñ# A°ÀÐ#ÓFˆò a€GØ€EØ—M‘Mò 7ˆØ˜8Ñ#ØØ�‰\ˆØ—<‘<¨°t�<Ó<ò 		7ˆCÙ�#�a’& TˆCØˆ{ØÜ�C“—‘Ó ˆAÙØØ�w‰w‹y˜GÑ#ØØ�L‰L !¨HÑ5Õ6ñ		7ð	7ð ‡H�H„Jà %Ö&˜1ˆQˆv‹YÐ&€EÐ&Ü˜$¨¸ÌÈUËÑTÓUÐUøô; ò ØŠðûô ò EÜ˜Ð"9¸!¸Ð =Ð>Ó?ÀÐDÕDûðEüò* 's5   º/E Á;E# Ä+FÅE ÅE Å#	FÅ,FÅ=FÆFz/planilha/enriquecerc            	      óþ  — t        j                  d¬«      xs i } | j                  dg «      }|st        ddi«      dfS |D �cg c]5  }t	        |«      j                  «       sŒt	        |«      j                  «       ‘Œ7 }}|dd }t        |«      }d	t        |   d
<   t        j                  t        |   d<   	 t        t        j                  «      t        |   d<   	 t        t        |   «       t        j                   t"        ||ddddfddid¬«      }|j%                  «        t        d|t'        |«      dœ«      S c c}w # t        $ r dt        |   d<   Y Œ|w xY w# t        $ r}t        d|› d|› �«       Y d}~ŒŒd}~ww xY w)zIEnriquece lista SEM enviar ao CRM. Envio manual via /planilha/enviar-crm.T©Úforcer	  r  zLista vaziarñ   Nr§   Úplanilharx  rz   rc   rÆ  rq   r6   r¶  FrÇ  )rØ  r…   r@  )r
   r  r;   r   rm   r=   r  rÆ  r   rz   ru   r½   rx   r&   ry   rÐ  rÑ  rÆ  r�  rS   )r¼   r	  r   r…   rV   s        r?   Úplanilha_enriquecerr_  O  sq  € ô ×Ñ $Ô'Ò-¨2€DØ�x‰x˜
 BÓ'€HÙÜ˜ Ð.Ó/°Ð4Ð4Ø(0ÖC 1´C¸³F·L±LµN”�A“—‘•ÐC€HÐCØ˜˜ˆ~€HÜ˜XÓ&€FØ'„Dˆ�L�ÑÜ+×4Ñ4„Dˆ�L�Ñð'Ü"%¤l§o¡oÓ"6ŒˆV‰�YÑðMÜœT &™\Ô*ô 	×ÑÜØ�h  B¨¨BÐ/Ø˜eÐ$Øô		€Að ‡G�G„IÜ˜$¨&¼3¸x»=ÑIÓJÐJùò+ Døô ò 'Ø"&ŒˆV‰�YÓð'ûô ò MÜÐ=¸f¸XÀRÈÀsÐK×LÑLûðMús6   ÁD8Á!D8Â5#D= ÃE Ä=EÅEÅ	E<Å!E7Å7E<z/planilha/enviar-crmc                  óÎ  ‡‡‡‡‡‡— t        j                  d¬«      xs i } | j                  d«      }| j                  d«      xs dj                  «       Š| j                  d«      xs dj                  «       Š| j                  d«      xs dj                  «       Š| j                  d«      xs dj                  «       Š|r|t        vrt        d	d
i«      dfS t        |   Š‰s‰j                  dd«      Š‰s‰j                  dd«      Š‰s‰j                  dd«      Š‰s‰j                  dd«      Š‰r‰st        d	di«      dfS t        ‰j                  dg «      «      Š‰st        d	di«      dfS ‰j                  «       j                  d«      r‰dd j                  «       Šˆˆˆˆˆˆfd„}t        j                  |d¬«      j                  «        t        dt        ‰«      dœ«      S )u5   Pega leads jÃ¡ enriquecidos de um job e envia ao CRM.Tr\  r…   r‘   r6   rÄ   r�   rü   r  u   Job nÃ£o encontrador*  r  r  r  r  r  rñ   rR  z!Nenhum lead enriquecido neste jobrö  r÷  Nc                  ó˜  •— d} d}‰d   j                  dt        «       › dt        ‰«      › d�«       ‰D �]  }|j                  dd«      }‰j                  d«      d	k(  rd
nd}|dg}|j                  d«      r|j                  d«       |j                  d«      r|j                  d«       |j                  d«      xs ||j                  dd«      |j                  dd«      ||j                  dd«      |j                  dd«      ||j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  d«      xs g dœ}	 t	        |‰‰dt        ‰«      xs d ¬«      \  }}|rUd }	‰r‰rt        ||‰‰‰‰d¬«      \  }
}	}t        |‰‰||	¬«       | dz  } ‰d   j                  dt        «       › d |› d!�«       n*|dz  }‰d   j                  dt        «       › d"|› d#|› �«       t        j                  d%«       �Œ | ‰d&<   |‰d'<   d(‰d)<   ‰d   j                  dt        «       › d*| › d+t        ‰«      › d,�|rd-|› d.�z   «       y dz   «       y # t        $ r4}|dz  }‰d   j                  dt        «       › d"|› d$|› �«       Y d }~Œ¡d }~ww xY w)/Nr   r'  r(  z] Iniciando envio ao CRM: z leadsrŒ   r6   rx  r^  zlista-planilhar¸  Úenriquecidor®  rº  r«  r»  r¬  r„   r¸   ræ   rå   r­  r¯  r°  rì   )rŒ   r„   r¸   r‚   ræ   rå   rµ   r«  r¬  r­  r®  r¯  r°  rì   ÚPlanilhar½  r¾  r¾  rÇ   r¿  u    â†’ CRM (contato criado)rÂ  rÃ  u    â†’ exceÃ§Ã£o: rÀ  r¸  Ú	crm_errosTrâ  u   ] Envio ao CRM concluÃ­do: r±  z contatos criadosrÂ  z
 com erro))rZ   r\  rS   r;   rû   rß   r  rË  rx   rO   r_  )rÓ  rÿ  rÒ  r  Ú
origem_tagrµ   r´   r›   rÄ  r¿  rØ  rÅ  r   rm  Úleads_enriquecidosrÄ   r�   rü   r‘   s                €€€€€€r?   Ú_enviarz$planilha_enviar_crm.<locals>._enviar’  s  ø€ ØˆØˆØˆF‰×Ñ˜Qœs›u˜gÐ%?ÄÐDVÓ@WÐ?XÐX^Ð_Ô`Ø'ó -	ˆEØ Ÿ9™9 V¨RÓ0ˆLØ-0¯W©W°XÓ->À*Ò-LÑ)ÐReˆJØ Ð.ˆDØ�y‰y˜Ô(Ø—‘Ð1Ô2Ø�y‰y˜Ô Ø—‘Ð-Ô.àŸ	™	 .Ó1ÒA°\Ø!ŸI™I j°"Ó5ØŸ™ 7¨BÓ/Ø'Ø!ŸI™I j°"Ó5ØŸ	™	 &¨"Ó-ØàŸ	™	 &¨"Ó-Ø %§	¡	¨.¸"Ó =Ø!&§¡¨?¸BÓ!?Ø %§	¡	¨.¸"Ó =Ø"ŸY™Y {°BÓ7Ø!ŸI™I j°"Ó5ØŸ)™) HÓ-Ò3°ñˆDð"WÜ"3Ø˜% °ZÜ&:¸;Ó&GÒ&OÈ4ô#‘�
˜Cñ Ø%)�NÙ"¡xÜ0FØ  *¨e°[À+ÈxÐ`jô1Ñ-˜˜N¨Aô (¨
°E¸;ÈÐ^lÕmØ ‘M�HØ˜‘K×&Ñ&¨¬3«5¨'°¸°~ÐE^Ð'_Õ`à˜Q‘J�EØ˜‘K×&Ñ&¨¬3«5¨'°¸°~À_ÐUXÐTYÐ'ZÔ[ô �J‰J�sŽOð[-	ð^ !)ˆÐÑØ ˆˆKÑØ!ˆˆMÑØˆF‰×ÑØ”“ˆwÐ1°(°¸1¼SÐASÓ=TÐ<UÐUfÐgÙ).��E�7˜*Ð%ñ8õ	
à46ñ8õ	
øô ò WØ˜‘
�Ø�F‘×"Ñ" Q¤s£u g¨V°L°>ÐAQÐRSÐQTÐ#U×VÑVûðWús   ÆB!JÊ	K	Ê*KËK	)rÈ  rÊ  )rØ  r@  )r
   r  r;   r=   rÆ  r   rÇ  r�   r”  rÐ  rÑ  r�  rS   )	r¼   r…   rg  rm  rf  rÄ   r�   rü   r‘   s	      @@@@@@r?   Úplanilha_enviar_crmrh  o  s»  ý€ ô ×Ñ $Ô'Ò-¨2€DØ�X‰X�hÓ€FØ�X‰X�gÓÒ$ "×+Ñ+Ó-€EØ—8‘8˜MÓ*Ò0¨b×7Ñ7Ó9€KØ—8‘8˜MÓ*Ò0¨b×7Ñ7Ó9€KØ—‘˜Ó$Ò*¨×1Ñ1Ó3€Há�V¤4Ñ'Ü˜Ð 5Ð6Ó7¸Ð<Ð<ä
ˆv‰,€CáØ—‘˜ RÓ(ˆÙØ—g‘gÐ/°Ó4ˆÙØ—g‘gÐ/°Ó4ˆÙØ—7‘7˜>¨2Ó.ˆá™Ü˜Ð CÐDÓEÀsÐJÐJä˜cŸg™g g¨rÓ2Ó3ÐÙÜ˜Ð CÐDÓEÀsÐJÐJà‡{�{ƒ}×Ñ 	Ô*Ø�a�b�	—‘Ó!ˆ÷9
ñ 9
ôv ×Ñ˜G¨DÔ1×7Ñ7Ô9Ü˜$¬Ð-?Ó)@ÑAÓBÐBrA   z3/opt/mia/workspace/prospeccao_ativa/ghl_campos.jsonr¥  ÚTEXTz00.000.000/0001-00)rº   ÚdataTypeÚplaceholderr§  zhttps://linkedin.com/in/...r¨  u   Nome do sÃ³cio/decisorr©  u   Ex: SÃ³cio-Administradorrª  zhttps://empresa.com.brr«  zhttps://instagram.com/empresar¬  zhttps://facebook.com/empresar¦  zemail@empresa.comzOwner / CEO / FounderzEx: Owner, CEO, Managerzhttps://company.comzhttps://instagram.com/companyzhttps://facebook.com/companyc                  ó    — 	 t         j                  «       r't        j                  t         j	                  «       «      S 	 i S # t
        $ r Y i S w xY w)z;Retorna mapeamento nome_campo -> field_id salvo localmente.)ÚCAMPOS_PATHrÙ   r¥   r  r  rx   r™   rA   r?   r±  r±  ì  sP   € ðÜ×ÑÔÜ—:‘:œk×3Ñ3Ó5Ó6Ð6ð  ð €Iøô ò ØØ€Iðús   ‚:A  Á 	AÁAr(  c                 ót   — 	 t         j                  t        j                  | «      «       y # t        $ r Y y w xY wrN   )rm  r  r¥   r  rx   )r(  s    r?   Ú_salvar_campos_ghlro  ö  s0   € ðÜ×ÑœtŸz™z¨&Ó1Õ2øÜò Ùðús   ‚(+ «	7¶7z/api/configurar-campos-ghlc            
      óH  — t        j                  d¬«      xs i } | j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       }|r|st	        ddi«      dfS |j                  «       j                  d	«      r|d
d j                  «       }| j                  d«      xs dj                  «       j                  «       }|dk(  rt        nt        }t        «       }g }g }g }	 t        j                  t        › d|› d�t        |«      d¬«      }	i }
|	j                  dk(  rW|	j                  «       j                  dg «      D ]4  }|j                  d«      |
|j                  dd«      j                  «       <   Œ6 |D �]›  }|d   }||
v r|
|   ||<   |j#                  |«       Œ'd}ddiddii fD �]  }	 ||d   ddœ}|j%                  |«       t        j&                  t        › d|› d�t        |«      |d¬«      }|j                  dv rÀ|j                  «       }|j                  d «      xs i j                  d«      xs |j                  d«      }|j                  d «      xs i j                  d«      xs |j                  dd!«      }|r=|||<   d"t)        |«      j                  «       v rd#nd$}|j#                  |› d%|› d&�«       d} n�Œ |r�ŒR||vs�ŒX	 j                  «       j                  d)|j*                  dd* «      }|j#                  |› d'|› �«       �Œž t-        |«       t	        ||||d,œ«      S # t         $ r i }
Y �ŒÊw xY w# t         $ r-}|j#                  |› d't)        |«      dd( › �«       Y d}~ Œ¯d}~ww xY w# t         $ r d+}Y ŒŒw xY w)-z<Cria campos personalizados no CRM e salva os IDs localmente.Tr\  r‘   r6   rÄ   r  r  rñ   rö  r÷  Nr  rZ  r$  rü  z/customFieldsrC   r   r§   rï   r½   rº   FÚmodelr  Ú	objectKeyrj  r   )rº   rj  Úpositionr¤   r¦   ÚcustomFieldrð   ÚopportunÚoportunidadeÚcontatoz (tipo: rf   rq   é<   r©   r~  zsem resposta)ÚcriadosÚja_existiamrÿ  r(  )r
   r  r;   r=   r   r�   r”  r—  ÚCAMPOS_ENRIQUECIMENTO_USÚCAMPOS_ENRIQUECIMENTO_BRr±  r¬   rÑ   rš   r¯   r¥   rx   rZ   Úupdater­   rm   r°   ro  )r¼   r‘   rÄ   r  Úcampos_a_criarÚcampos_salvosry  rz  rÿ  Úr_listÚ
existentesrÞ   rø   rŒ   ÚcriadoÚ
body_extrarg  r~   r  rù   Úobj_keyrç  r   r²   s                           r?   Úconfigurar_campos_ghlr…  ý  sÀ  € ô ×Ñ $Ô'Ò-¨2€DØ�X‰X�gÓÒ$ "×+Ñ+Ó-€EØ—8‘8˜MÓ*Ò0¨b×7Ñ7Ó9€Ká™Ü˜Ð CÐDÓEÀsÐJÐJð ‡{�{ƒ}×Ñ 	Ô*Ø�a�b�	—‘Ó!ˆà�H‰H�VÓÒ$ ×+Ñ+Ó-×3Ñ3Ó5€DØ15¸²Õ-ÔC[€Nä(Ó*€MØ€GØ€KØ€EðÜ—‘Üˆj˜ K =°Ð>Ü  Ó'Øô
ˆð
 ˆ
Ø×Ñ Ò$Ø—[‘[“]×&Ñ& ~°rÓ:ò D�Ø89¿¹¸d»�
˜1Ÿ5™5 ¨Ó,×2Ñ2Ó4Ò5ðDð
  ó %+ˆØ�V‰}ˆà�:ÑØ",¨TÑ"2ˆM˜$ÑØ×Ñ˜tÔ$ØàˆØ# ]Ð3°kÀ=Ð5QÐSUÐVó 	ˆJðØ $°%¸
Ñ2CÐQRÑS�Ø—‘˜JÔ'Ü—M‘MÜ�j ¨K¨=¸ÐFÜ(¨Ó/ØØô	�ð —=‘= JÑ.ØŸ6™6›8�DØ $§¡¨Ó 7Ò =¸2×BÑBÀ4ÓHÒZÈDÏHÉHÐUYËN�HØ#Ÿx™x¨Ó6Ò<¸"×AÑAÀ+ÓNÒrÐRV×RZÑRZÐ[fÐhqÓRr�GÙØ.6˜ dÑ+Ø1;¼sÀ7»|×?QÑ?QÓ?SÑ1S™~ÐYb˜ØŸ™¨$¨¨x¸°v¸QÐ'?Ô@Ø!%˜Ùñ /ð	ó. ˜$ mÓ3ð%Ø—f‘f“h—l‘l 9¨a¯f©f°S°b¨kÓ:�ð �L‰L˜D˜6  C 5Ð)Ö*ðK%+ôN �}Ô%äØØ"ØØñ	ó ð øôY ò Ø‹
ðûô@ ò Ø—‘ ˜v R¬¨A«¨s°¨ }Ð5Ô6Ýûðûô ò %Ø$’ð%ús>   Ã9BM ÇDMË'-NÍMÍMÍ	NÍ#"NÎNÎN!Î N!z/api/campos-ghlc                  ó(   — t        t        «       «      S )z$Retorna os campos salvos localmente.)r   r±  r™   rA   r?   Úlistar_campos_ghlr‡  S  s   € ô Ô'Ó)Ó*Ð*rA   Údinastia_webhookz"/opt/mia/workspace/clientes/px3lab)Ú	PX3_TOKENÚPX3_LOCATION_IDz"Falha ao importar config_ghl PX3: z"https://dinastiapi.agentesclimb.uszC/opt/mia/workspace/clientes/px3lab/dinastia_webhook/instancias.jsonc                 óô   — 	 t        t        «      5 }t        j                  |«      }ddd«       j	                  | «      S # 1 sw Y   ŒxY w# t
        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)uL   LÃª config da instÃ¢ncia pelo nome. Retorna dict ou None se nÃ£o encontrada.Nu   Erro ao carregar instÃ¢ncias: )rÚ   Ú_DINASTIA_INSTANCIAS_PATHr¥   rÛ   r;   rx   Ú_dinastia_logra   )rŒ   rÞ   Ú
instanciasr   s       r?   Ú_dinastia_carregar_instanciar�  n  sm   € ðÜÔ+Ó,ð 	&°ÜŸ™ 1›ˆJ÷	&à�~‰~˜dÓ#Ð#÷	&ð 	&ûô ò Ü×ÑÐ<¸Q¸CÐ@ÔAÜûðús-   ‚A ‘A §A Á A	ÁA Á	A7ÁA2Á2A7Ú	ghl_tokenc                 ó   — d| › �ddddœS )Nr“   r•   r”   )r–   r˜   r—   ÚAcceptr™   )r�  s    r?   rš   rš   y  s   € à" 9 +Ð.ØØ*Ø$ñ	ð rA   c                  ó,  — t         j                  j                  dd«      } | sT	 t        d«      5 }|D ]8  }|j	                  d«      sŒ|j                  «       j                  dd«      d   }  n d d d «       | S | S # 1 sw Y   | S xY w# t        $ r Y | S w xY w)NÚOPENAI_API_KEYr6   ú/opt/mia-bot/.envzOPENAI_API_KEY=ú=rÇ   )r×   rÁ  r;   rÚ   r”  r=   rH   rx   )rñ  Ú_fÚ_lines      r?   Ú_get_openai_keyr™  ‚  s¢   € Ü
�*‰*�.‰.Ð)¨2Ó
.€CÙð	ÜÐ)Ó*ð ¨bØò �EØ×'Ñ'Ð(9Õ:Ø#Ÿk™k›m×1Ñ1°#°qÓ9¸!Ñ<˜Ùð÷ð €Jˆ3€J÷ð €Jûô ò 	ØØ€Jð	ús4   ¤B ¯A9Á&A9Á-B Á9BÁ>B ÂB Â	BÂBr±   c                 ób  — t        | t        «      sy| j                  d«      xs i }t        |t        «      r|j                  d«      nd}t        |t        «      rd|v r|j                  d«      S t        |t        «      rd|v r|j                  d«      S d| v rt        | d   t        «      r| d   S y)u‡   Normaliza o payload da Dinastia. O envelope real vem como data.data.event,
    mas aceita tambÃ©m data.event para retrocompatibilidade.Nr¼   Úevent)rÜ   r�  r;   )r±   r¼   Úinners      r?   Ú_dinastia_extrair_eventor�  �  s    € ô �gœtÔ$Øà�;‰;�vÓÒ$ "€DÜ *¨4´Ô 6ˆD�H‰H�VÔ¸D€EÜ�%œÔ 7¨eÑ#3Ø�y‰y˜Ó!Ð!ä�$œÔ '¨T¡/Ø�x‰x˜Ó Ð à�'Ñœj¨°Ñ)9¼4Ô@Ø�wÑÐØrA   r©   c                 ó^  — t        | t        «      syt        | j                  d«      t        «      r&| d   j	                  «       r| d   j	                  «       S | j                  d«      xs i }t        |t        «      r2t        |j                  d«      t        «      r|d   j	                  «       S y)z0Extrai texto da mensagem em diferentes formatos.r6   ÚconversationÚextendedTextMessager°   )rÜ   r�  r;   rm   r=   )r©   Úexts     r?   Ú_dinastia_extrair_textor¢  £  s‹   € ä�gœtÔ$Øä�'—+‘+˜nÓ-¬sÔ3¸ÀÑ8O×8UÑ8UÔ8WØ�~Ñ&×,Ñ,Ó.Ð.à
�+‰+Ð+Ó
,Ò
2°€CÜ�#”tÔ¤¨C¯G©G°F«O¼SÔ!AØ�6‰{× Ñ Ó"Ð"ØrA   Úchatc                 ó¸   — t        | t        «      r| sy| j                  dd«      d   }|j                  d«      d   }t        j                  dd|«      }|syd|z   S )zfRecebe '5511999999999@s.whatsapp.net' ou '5511999999999:70@s.whatsapp.net' e devolve '+5511999999999'.r6   ú@rÇ   r   ú:ú\Drq  )rÜ   rm   rH   r¾   r¿   )r£  Úfones     r?   Ú_dinastia_normalizar_telefoner©  ±  sZ   € ä�dœCÔ ©Øà�:‰:�c˜1Ó˜aÑ €Dà�:‰:�c‹?˜1Ñ€DÜ�6‰6�%˜˜TÓ"€DÙØØ�‰:ÐrA   ÚendpointÚmsg_objÚdinastia_tokenc           
      óø  — 	 |j                  d«      xs |j                  d«      xs d|j                  d«      xs |j                  d«      xs d|j                  d«      xs |j                  d«      xs d|j                  d«      xs |j                  d	«      xs d|j                  d
«      xs |j                  d«      xs d|j                  d«      xs |j                  d«      xs d|j                  d«      xs |j                  d«      xs ddœ}t        j                  t        › d| j	                  d«      › �|ddœ|d¬«      }|j
                  dk7  r6t        j                  d| › d|j
                  › d|j                  dd › �«       y|j                  j                  dd«      }d|v r‚|j                  «       }|j                  d«      xs7 |j                  d«      xs$ |j                  d«      xs |j                  d «      }|r%t        |t        «      rddl}|j                  |«      S y|j                  r|j                  S dS # t         $ r%}	t        j#                  d!| › d|	› �«       Y d}	~	yd}	~	ww xY w)"uB   Baixa mÃ­dia (audio/image) da Dinastia API. Devolve bytes ou None.r7  ÚUrlr6   Ú
directPathÚ
DirectPathÚmediaKeyÚMediaKeyr#  ÚMimetypeÚfileEncSha256ÚFileEncSHA256Ú
fileSha256Ú
FileSHA256Ú
fileLengthÚ
FileLengthr   )r®  r°  r²  r³  rµ  r·  r¹  r±  r”   ©r‘   r—   r  r¤   r§   z	Dinastia rã   rq   Nr—   r¼   ÚfileÚaudioÚimageu   Erro baixar mÃ­dia )r;   r¬   r­   Ú_DINASTIA_BASEÚlstripr¯   r�  Úwarningr°   r<   r¥   rÜ   rm   Úbase64Ú	b64decoder  rx   ra   )
rª  r«  r¬  rg  r~   Úctr¼   Úb64rÁ  r   s
             r?   Ú_dinastia_baixar_midiarÅ  ¿  s,  € ð à—;‘;˜uÓ%ÒA¨¯©°UÓ);ÒA¸rØ!Ÿ+™+ lÓ3ÒV°w·{±{À<Ó7PÒVÐTVØŸ™ JÓ/ÒP°7·;±;¸zÓ3JÒPÈbØŸ™ JÓ/ÒP°7·;±;¸zÓ3JÒPÈbØ$Ÿ[™[¨Ó9Ò_¸W¿[¹[ÈÓ=YÒ_Ð]_Ø!Ÿ+™+ lÓ3ÒV°w·{±{À<Ó7PÒVÐTVØ!Ÿ+™+ lÓ3ÒU°w·{±{À<Ó7PÒUÐTUñ
ˆô �M‰MÜÐ˜a §¡°Ó 4Ð5Ð6Ø,Ð>PÑQØØô	
ˆð �=‰=˜CÒÜ×!Ñ! I¨h¨Z°q¸¿¹¸ÀrÈ!Ï&É&ÐQUÐRUÈ,ÈÐ"XÔYØà�Y‰Y�]‰]˜>¨2Ó.ˆØ Ñ#Ø—6‘6“8ˆDà—(‘(˜6Ó"Ò` d§h¡h¨vÓ&6Ò`¸$¿(¹(À7Ó:KÒ`ÈtÏxÉxÐX_ÓO`ˆCÙ”z #¤sÔ+ÛØ×'Ñ'¨Ó,Ð,ØØŸIšIˆq�y‰yÐ/¨4Ð/øÜò Ü×ÑÐ1°(°¸2¸a¸SÐAÔBÜûðús+   ‚FI ÆB I È1I É	I É	I9ÉI4É4I9Úaudio_bytesr#  c                 ó`  — ddl }d}|rd|v sd|v rd}nd|v rd}nd	|v rd
}nd|v rd}	 ddlm}  |t        «       ¬«      }|j	                  |d¬«      5 }|j                  | «       |j                  }ddd«       t        d«      5 }|j                  j                  j                  d|¬«      }	ddd«       	 t        j                  |«       	j                  xs dS # 1 sw Y   ŒkxY w# 1 sw Y   Œ;xY w# t        $ r Y Œ3w xY w# t        $ r"}
t        j!                  d|
› �«       Y d}
~
yd}
~
ww xY w)uD   Transcreve Ã¡udio com OpenAI Whisper. Devolve texto ou string vazia.r   Nz.oggÚmp4Úmpegz.mp4Úwavz.wavÚwebmz.webmÚogg)ÚOpenAI©r1  F)r™  ÚdeleteÚrbz	whisper-1)rq  r»  r6   zErro Whisper: )ÚtempfileÚopenairÍ  r™  ÚNamedTemporaryFileÚwriterº   rÚ   r¼  ÚtranscriptionsÚcreater×   Úunlinkrx   r°   r�  ra   )rÆ  r#  rÑ  r¡  rÍ  Úclientro  Útmp_pathÚ
audio_fileÚresultr   s              r?   Ú_dinastia_transcrever_audiorÜ  ä  sA  € ãØ
€CÙØ�HÑ ¨(Ñ 2Ø‰CØ�hÑØ‰CØ�xÑØ‰CØ�hÑØˆCðÝ!Ù¤Ó 1Ô2ˆØ×(Ñ(°¸EÐ(ÓBð 	 ÀcØ�I‰I�kÔ"Ø—x‘xˆH÷	 ô �(˜DÓ!ð 	\ ZØ—\‘\×0Ñ0×7Ñ7¸kÐPZÐ7Ó[ˆF÷	\ð	Ü�I‰I�hÔð �{‰{Ò ˜bÐ ÷	 ð 	 ú÷	\ð 	\ûô ò 	Ùð	ûô ò Ü×Ñ˜n¨Q¨CÐ0Ô1Üûðúsk   ©*D ÁCÁ1D Â(C'Â-D Â6C3 ÃD ÃC$Ã D Ã'C0Ã,D Ã3	C?Ã<D Ã>C?Ã?D Ä	D-ÄD(Ä(D-Úghl_locationc                 óÚ  — 	 t         › d�}|| dœ}t        j                  |t        |«      |d¬«      }|j                  dk7  r3t
        j                  d|j                  › d|j                  dd › �«       y|j                  r|j                  «       ni }|j                  d	«      xs g }|r|d
   j                  d«      S dS # t        $ r"}t
        j                  d|› �«       Y d}~yd}~ww xY w)zCProcura contato no Linkia pelo telefone. Retorna contactId ou None.rÆ   )rÈ   rÉ   rC   rË   r§   z
GHL busca rq   NrÍ   r   r½   zErro buscar contato GHL: )Ú	_GHL_BASEr¬   r;   rš   r¯   r�  rÀ  r°   r  r¥   rx   ra   )	r„   r�  rÝ  r7  rÌ   r~   rg  Úcontatosr   s	            r?   Ú_ghl_buscar_contatorá    sØ   € ðÜ�˜:Ð&ˆØ ,°xÑ@ˆÜ�L‰L˜¤l°9Ó&=ÀfÐVXÔYˆØ�=‰=˜CÒÜ×!Ñ! J¨q¯}©}¨o¸RÀÇÁÀtÈÀ¸~Ð"NÔOØØŸ9š9ˆq�v‰vŒx¨"ˆØ—8‘8˜JÓ'Ò-¨2ˆÙ(0ˆx˜‰{�‰˜tÓ$Ð:°dÐ:øÜò Ü×ÑÐ7¸°sÐ;Ô<Üûðús%   ‚A1B? Á4AB? Â=B? Â?	C*ÃC%Ã%C*c                 ó¨  — 	 t         › d�}| |ddœ}t        j                  |t        |«      |d¬«      }|j                  dv rZ|j
                  r|j                  «       ni }|j                  d«      xs |}t        |t        «      r|j                  d«      nd	}|r|S |j                  d
k(  r:	 |j                  «       j                  d«      xs i }	|	j                  d«      }|r|S 	 t        j                  d|j                  › d|j                  d	d › �«       y	# t        $ r Y Œ>w xY w# t        $ r"}
t        j                  d|
› �«       Y d	}
~
y	d	}
~
ww xY w)zACria contato no Linkia com o telefone. Retorna contactId ou None.rÆ   zWhatsApp Dinastia)r»   rÈ   rà   rC   r¤   r¦   rð   r½   Nrñ   Úmetar  z
GHL criar rq   r§   zErro criar contato GHL: )rß  r¬   r­   rš   r¯   r  r¥   r;   rÜ   r�  rx   r�  rÀ  r°   ra   )r„   r�  rÝ  r7  rg  r~   r¼   rw  r;  rã  r   s              r?   Ú_ghl_criar_contatorä    s>  € ðÜ�˜:Ð&ˆØ!°ÐI\Ñ]ˆÜ�M‰M˜#¤|°IÓ'>ÀTÐSUÔVˆØ�=‰=˜JÑ&Ø Ÿyšy�1—6‘6”8¨bˆDØ—h‘h˜yÓ)Ò1¨TˆGÜ'1°'¼4Ô'@�'—+‘+˜dÔ#ÀdˆCÙØ�
à�=‰=˜CÒðØ—v‘v“x—|‘| FÓ+Ò1¨r�Ø—h‘h˜{Ó+�ÙØ�Jð ô 	×Ñ 
¨1¯=©=¨/¸¸A¿F¹FÀ4ÀC¸L¸>ÐJÔKØøô ò Ùðûô ò Ü×ÑÐ6°q°cÐ:Ô;ÜûðúsB   ‚BD& ÂD& Â+7D Ã#3D& Ä	D#Ä D& Ä"D#Ä#D& Ä&	EÄ/EÅErh  c                 óP  — 	 t         › d| › d�}d|› �ddœ}t        j                  |t        |«      |d¬«      }|j                  dv ry	t
        j                  d
|j                  › d|j                  dd › �«       y# t        $ r"}t
        j                  d|› �«       Y d}~yd}~ww xY w)zAdiciona nota no contato.rÆ   r®  u   ðŸ“± WhatsApp: r6   r¯  rC   r¤   r¦   Tz	GHL nota rq   Nr§   FzErro nota GHL: ©
rß  r¬   r­   rš   r¯   r�  rÀ  r°   rx   ra   )r›   rh  r�  r7  rg  r~   r   s          r?   Ú_ghl_adicionar_notarç  0  s§   € ð
Ü�˜: j \°Ð8ˆØ)¨%¨Ð1¸RÑ@ˆÜ�M‰M˜#¤|°IÓ'>ÀTÐSUÔVˆØ�=‰=˜JÑ&ØÜ×Ñ 	¨!¯-©-¨¸¸1¿6¹6À$À3¸<¸.ÐIÔJØøÜò Ü×Ñ˜o¨a¨SÐ1Ô2Üûðús   ‚AA: Á2A: Á:	B%ÂB Â B%c                 óþ  — 	 t         › d�}|| dœ}t        j                  |t        |«      |d¬«      }|j                  dk(  rI|j
                  r|j                  «       ni }|j                  d«      xs g }|r|d   j                  d«      S t         › d	�}| |d
œ}t        j                  |t        |«      |d¬«      }|j                  dv rV|j
                  r|j                  «       ni }|j                  d«      xs |}	t        |	t        «      r|	j                  d«      S dS t        j                  d|j                  › d|j                  dd › �«       y# t        $ r"}
t        j                  d|
› �«       Y d}
~
yd}
~
ww xY w)zEBusca ou cria conversa no GHL para o contato. Retorna conversationId.ú/conversations/search)rÈ   r  rC   rË   r§   Úconversationsr   r½   ú/conversations/)r  rÈ   r¤   r¦   rŸ  NzGHL conversa rq   zErro conversa GHL: )rß  r¬   r;   rš   r¯   r  r¥   r­   rÜ   r�  r�  rÀ  r°   rx   ra   )r›   r�  rÝ  r7  rÌ   r~   rg  Úconvsr¼   Úconvr   s              r?   Ú_ghl_buscar_ou_criar_conversarî  ?  sS  € ðä�Ð0Ð1ˆØ ,¸:ÑFˆÜ�L‰L˜¤l°9Ó&=ÀfÐVXÔYˆØ�=‰=˜CÒØ Ÿyšy�1—6‘6”8¨bˆDØ—H‘H˜_Ó-Ò3°ˆEÙØ˜Q‘x—|‘| DÓ)Ð)ä�˜?Ð+ˆØ'°|ÑDˆÜ�M‰M˜#¤|°IÓ'>ÀTÐSUÔVˆØ�=‰=˜JÑ&Ø Ÿyšy�1—6‘6”8¨bˆDØ—8‘8˜NÓ+Ò3¨tˆDÜ%/°´dÔ%;�4—8‘8˜D“>ÐEÀÐEÜ×Ñ ¨a¯m©m¨_¸B¸q¿v¹vÀdÀs¸|¸nÐMÔNØøÜò Ü×ÑÐ1°!°Ð5Ô6Üûðús+   ‚BE Â
BE ÄE Ä2E Å	E<ÅE7Å7E<Úconversation_idÚ	instanciac                 ó0  — 	 t         › d�}d| ||dœ}t        j                  |t        |«      |d¬«      }|j                  dv ryt
        j                  d|j                  › d	|j                  d
d › �«       t         › d�}d| ||ddœ}	t        j                  |t        |«      |	d¬«      }
|
j                  dv ryt
        j                  d|
j                  › d	|
j                  d
d › �«       y# t        $ r"}t
        j                  d|› �«       Y d
}~yd
}~ww xY w)zKPosta mensagem numa conversa do GHL como inbound (lado esquerdo no Linkia).z/conversations/messages/inboundÚWhatsApp©r
  ÚconversationIdr  r©   rC   r¤   r¦   TzGHL msg inbound status=rq   Nr§   ú/conversations/messagesÚinbound)r
  rô  r  r©   Ú	directionzGHL msg fallback status=FzErro postar mensagem GHL: ræ  )rï  r›   rh  rð  r�  r7  rg  r~   Úurl_fallbackÚbody_fallbackÚr2r   s               r?   Ú_ghl_postar_mensagem_conversarû  Z  s"  € ðä�Ð:Ð;ˆàØ-Ø#Øñ	
ˆô �M‰M˜#¤|°IÓ'>ÀTÐSUÔVˆØ�=‰=˜JÑ&ØÜ×ÑÐ 7¸¿¹°ÀbÈÏÉÐPTÐQTÈÈÐWÔXä#˜Ð$;Ð<ˆØ!+¸Ø&0¸UÐQZñ\ˆä�]‰]˜<´¸iÓ1HÈ}ÐfhÔiˆØ�>‰>˜ZÑ'ØÜ×ÑÐ 8¸¿¹Ð8HÈÈ2Ï7É7ÐSWÐTWÈ=È/ÐZÔ[ØøÜò Ü×ÑÐ8¸¸Ð<Ô=Üûðús%   ‚A C* ÁA3C* Â72C* Ã*	DÃ3DÄDc                 óN  — 	 t         › d| › �}d|› �}t        j                  |t        |«      d|gid¬«      }|j                  dvr3t
        j                  d|j                  › d|j                  d	d
 › �«       y	y	# t        $ r"}t
        j                  d|› �«       Y d	}~y	d	}~ww xY w)z*Adiciona tag 'via-<instancia>' ao contato.rÆ   úvia-rµ   rC   r¤   r¦   zGHL tag rq   Nr  zErro tag GHL: ©
rß  r¬   r²  rš   r¯   r�  rÀ  r°   rx   ra   )r›   rð  r�  r7  Útagr~   r   s          r?   Ú_ghl_adicionar_tag_instanciar   w  s¥   € ð2Ü�˜: j \Ð2ˆØ�Y�KÐ ˆÜ�L‰L˜¤l°9Ó&=ÀVÈcÈUÀOÐ]_Ô`ˆØ�=‰= 
Ñ*Ü×!Ñ! H¨Q¯]©]¨O¸2¸a¿f¹fÀTÀc¸l¸^Ð"LÕMð +øäò 2Ü×Ñ˜n¨Q¨CÐ0×1Ñ1ûð2ús   ‚A5A9 Á9	B$ÂBÂB$Únome_instanciac                 ó  ‡&— ddd| dœ}	 t        | «      }|s1t        j                  d| › �«       d| › �|d<   t        dd	i|¥«      d
fS |j	                  d«      xs t
        }|j	                  d«      xs t        }|j	                  d«      xs d}t        j                  d	d	¬«      xs i }|j	                  d«      xs |j	                  d«      xs d}t        j                  d| › d|› dt        |«      dd
 › �«       t        d| › d�«      }|j                  j                  d	d	¬«       t        |d«      5 }	|	j                  t!        j"                  t%        j&                  «       j)                  «       ||dœ«      dz   «       ddd«       t+        |«      }
t-        |
t.        «      sd|d<   t        d	|dœ|¥«      d
fS |
j	                  d«      xs i }|
j	                  d«      xs i }|j	                  d«      d	u rd |d<   t        d	|dœ|¥«      d
fS |j	                  d!«      d	u rd"|d<   t        d	|dœ|¥«      d
fS |j	                  d#«      xs dj1                  «       }|d$vrd%|› �|d<   t        d	|dœ|¥«      d
fS |j	                  d&«      xs d}|j3                  d'«      r|j	                  d(«      xs |}t5        |«      }|sd)|d<   t        d	|dœ|¥«      d
fS |j	                  d*«      xs g }t7        j8                  d+d|«      Š&t;        ˆ&fd,„|D «       «      r5d-|› �|d<   t        j                  d| › d.|› �«       t        d	|dœ|¥«      d
fS d}|d/k(  r$t=        |«      }|sõd0|d<   t        d	|dœ|¥«      d
fS |d1k(  rx|j	                  d2«      xs( |j	                  d3«      xs |j	                  d4«      xs i }|j	                  d5«      xs d6}t?        d7||«      }|rtA        ||«      }|rd8|› �nd9}ndd:}na|d;k(  r\|j	                  d<«      xs |j	                  d=«      xs i }|j	                  d>«      xs |j	                  d?«      xs d}d@|rdA|› �ndz   }tC        |||«      }|stE        |||«      }|sdB|d<   t        d	|dœ|¥«      d
fS g }tG        «       jI                  «       D ]=  }||j	                  dC«      xs g D �cg c]  }t7        j8                  d+d|«      ‘Œ c}z  }Œ? t7        j8                  d+d|«      }||v }|stK        || |«       tM        |||«      }d}d} |r'tO        |dD| jQ                  «       › dE|› �|«      } dF|d<   nD|r5dG| jQ                  «       › dH|› �}!tS        |||!| |«      }|stO        |||«      } ntO        |||«      } |jU                  d	|||| ||dIœ«       t        j                  d| › dJ|› dK|› dL|› dM|› dN|› �«       |j	                  dO«      xs djW                  «       }"|"rn|sl	 |||||dPdQ|dR| › �dSœ	}#tY        jZ                  |"|#dT¬U«      }$t        j                  d| › dV|$j\                  › dA|$j^                  ddW › �«       |$j\                  |dX<   t        d	|dœ|¥«      d
fS # 1 sw Y   �ŒôxY wc c}w # t`        $ r3}%t        jc                  d| › dY|%› �«       t        |%«      |dZ<   Y d}%~%Œ[d}%~%ww xY w# t`        $ r>}%t        jc                  d| › d[|%› �«       t        dt        |%«      d\œ«      d
fcY d}%~%S d}%~%ww xY w)]uH   LÃ³gica principal do webhook â€” usada por todas as rotas de instÃ¢ncia.Fr6   N)Ú	processedÚreasonr›   rð  u   InstÃ¢ncia desconhecida: zinstancia_nao_configurada:r  rØ  Tr§   r�  rÝ  r¬  ©r]  r  r›  r
  Úunknownr(  z
] Evento: rU  z</opt/mia/workspace/clientes/px3lab/dinastia_webhook/eventos_z.jsonlr¬  r?  )Útsr›  r¼   rt  Ú	sem_event)rØ  ÚreceivedÚInfoÚMessageÚIsFromMeÚignorado_is_from_meÚIsGroupÚignorado_grupoÚType)r°   r¼  r½  Úignorado_tipo_ÚChatz@lidÚ	SenderAltÚsem_telefoneÚnumeros_ignoradosr§  c              3   óR   •K  — | ]  }t        j                  d d|«      ‰k(  –— Œ  y­w)r§  r6   N)r¾   r¿   )r¼  r  Ú
fone_limpos     €r?   r½  z._webhook_dinastia_processar.<locals>.<genexpr>¼  s#   øè ø€ ÒM°aŒr�v‰v�e˜R Ó# zÕ1ÑMùs   ƒ$'zignorado_numero_pessoal:u   ] NÃºmero ignorado: r°   Ú	sem_textor¼  ÚaudioMessageÚ
pttMessageÚAudioMessager#  z	audio/oggzchat/downloadaudiou   ðŸŽ¤ Ã�udio (transcriÃ§Ã£o): u2   ðŸŽ¤ Ã�udio recebido (transcriÃ§Ã£o indisponÃ­vel)u&   ðŸŽ¤ Ã�udio recebido (download falhou)r½  ÚimageMessageÚImageMessageÚcaptionÚCaptionu   ðŸ–¼ï¸� Imagem recebidarq   Úfalha_contato_ghlÚnumeros_equipeu   ðŸ’¬ [CHAT INTERNO via z]: Úchat_interno_notaõ   ðŸ“© [u    â†� LEAD]: )r  r›   rï  Úmsg_okÚnota_okr„   rç  z] Sincronizado | tipo=z | tel=z | contact=z | conv=z
 | msg_ok=Úsdr_webhook_urlrö  rò  z	dinastia:)	r›   rï  r»   r©   rg  r÷  r
  rÄ   rà   rC   )r¥   rj   z] SDR webhook direto rª   Úsdr_webhook_statusz] Erro SDR webhook direto: Úsdr_webhook_errorz] Erro webhook: rø  )2r�  r�  rÀ  r   r;   Ú_PX3_GHL_TOKENÚ_PX3_GHL_LOCATIONr
   r  Úinform   r   r³  r´  rÚ   rÔ  r¥   r  r   rˆ   r‰   r�  rÜ   r�  r�   Úendswithr©  r¾   r¿   rÊ  r¢  rÅ  rÜ  rá  rä  Ú_dinastia_carregar_instanciasrë  r   rî  rç  r—  rû  r}  r=   r¬   r­   r¯   r°   rx   rß  )'r  r   rà  r�  rÝ  r¬  r±   Ú
event_typeÚlog_pathrÞ   Úeventor+  r©   Úmsg_typeÚchat_rawr„   r  Ú
nota_textoÚ	audio_objr#  rÆ  ÚtranscricaoÚimg_objr  r›   r!  Úinst_cfgr  Úfone_limpo_senderÚis_chat_internorï  Úok_msgÚok_notaÚmsg_para_conversaÚsdr_urlÚsdr_payloadr~   r   r  s'                                         @r?   Ú_webhook_dinastia_processarr?  ƒ  s  ø€ à ¨B¸dÐQ_Ñ`€Fð`;ä*¨>Ó:ˆÙÜ×!Ñ!Ð$=¸nÐ=MÐ"NÔOØ!;¸NÐ;KÐLˆF�8ÑÜ˜D $Ð1¨&Ð1Ó2°CÐ7Ð7à—G‘G˜KÓ(Ò:¬Nˆ	Ø—w‘w˜~Ó.ÒCÔ2CˆØŸ™Ð!1Ó2Ò8°bˆä×"Ñ"¨°dÔ;ÒA¸rˆØ—[‘[ Ó)ÒM¨W¯[©[¸Ó-@ÒMÀIˆ
Ü×Ñ˜Q˜~Ð.¨j¸¸ÀCÌÈGËÐUYÐVYÐHZÐG[Ð\Ô]ô ÐVÐWeÐVfÐflÐmÓnˆØ�‰×Ñ d°TÐÔ:Ü�(˜CÓ ð 	q AØ�G‰G”D—J‘J¤h§l¡l£n×&>Ñ&>Ó&@È:Ð_fÑgÓhÐkoÑoÔp÷	qô *¨'Ó2ˆÜ˜&¤$Ô'Ø*ˆF�8ÑÜ $°JÑIÀ&ÐIÓJÈCÐOÐOà�z‰z˜&Ó!Ò' RˆØ—*‘*˜YÓ'Ò-¨2ˆà�8‰8�JÓ 4Ñ'Ø4ˆF�8ÑÜ $°JÑIÀ&ÐIÓJÈCÐOÐOØ�8‰8�IÓ $Ñ&Ø/ˆF�8ÑÜ $°JÑIÀ&ÐIÓJÈCÐOÐOØ—H‘H˜VÓ$Ò*¨×1Ñ1Ó3ˆØÐ5Ñ5Ø!/°¨zÐ:ˆF�8ÑÜ $°JÑIÀ&ÐIÓJÈCÐOÐOð —8‘8˜FÓ#Ò) rˆØ×Ñ˜VÔ$Ø—x‘x Ó,Ò8°ˆHÜ0°Ó:ˆáØ-ˆF�8ÑÜ $°JÑIÀ&ÐIÓJÈCÐOÐOð  ŸG™GÐ$7Ó8Ò>¸BÐÜ—V‘V˜E 2 xÓ0ˆ
ÜÓMÐ;LÔMÔMØ!9¸(¸ÐDˆF�8ÑÜ×Ñ  >Ð"2Ð2FÀxÀjÐQÔRÜ $°JÑIÀ&ÐIÓJÈCÐOÐOð ˆ
Ø�vÒÜ0°Ó9ˆJÙØ#.��xÑ Ü d¸
ÑMÀfÐMÓNÐPSÐSÐSà˜Ò Ø Ÿ™ ^Ó4ò >¸¿¹ÀLÓ8Qò >Ø#ŸK™K¨Ó7ò>Ø;=ð à —}‘} ZÓ0Ò?°KˆHÜ0Ð1EÀyÐR`ÓaˆKÙÜ9¸+ÀxÓP�ÙNYÐ<¸[¸MÑJð  `T‘
àE‘
à˜Ò Ø—k‘k .Ó1ÒV°W·[±[ÀÓ5PÒVÐTVˆGØ—k‘k )Ó,ÒL°·±¸IÓ0FÒLÈ"ˆGØ2É¸¸7¸)±nÐUWÑXˆJô )¨°9¸lÓKˆ
ÙÜ+¨H°iÀÓNˆJÙØ2ˆF�8ÑÜ $°JÑIÀ&ÐIÓJÈCÐOÐOð ˆÜ5Ó7×>Ñ>Ó@ò 	eˆHØ¸h¿l¹lÐK[Ó>\Ò>bÐ`bÖd¸œrŸv™v e¨R°Õ3ÒdÑd‰Nð	eäŸF™F 5¨"¨hÓ7ÐØ+¨~Ð=ˆñ Ü(¨°^ÀYÔOô 8¸
ÀIÈ|Ó\ˆàˆØˆÙä)¨*Ð8OÐP^×PdÑPdÓPfÐOgÐgjÐkuÐjvÐ6wð  zCó  DˆGØ2ˆF�8ÒÙØ"(¨×)=Ñ)=Ó)?Ð(@ÀÈZÈLÐ YÐÜ2°?ÀJÐPaÐcqÐs|Ó}ˆFÙÜ-¨j¸*ÀiÓP‘ä)¨*°jÀ)ÓLˆGà�‰ØØ$Ø.ØØØ Øñ
ô 	ô 	×Ñ˜Q˜~Ð.Ð.DÀXÀJÈgÐV^ÐU_Ð_jÐkuÐjvÐv~ð  @Oð  Pð  PZð  [að  Zbð  cô  	dð
 —7‘7Ð,Ó-Ò3°×:Ñ:Ó<ˆÙ™?ð5à",Ø'6Ø%Ø)Ø&Ø!*Ø&Ø#/Ø )¨.Ð)9Ð:ñ
�ô —M‘M '°ÀRÔH�Ü×"Ñ"Ø˜Ð'Ð'<¸Q¿]¹]¸OÈ2ÈaÏfÉfÐUYÐVYÈlÈ^Ð\ôð 01¯}©}�Ð+Ñ,ô
 ˜d°
ÑE¸fÐEÓFÈÐKÐK÷S	qñ 	qüòV eøôt ò 5Ü×'Ñ'¨!¨NÐ+;Ð;VÐWXÐVYÐ(ZÔ[Ü.1°!«f�Ð*Ö+ûð5ûô ò ;Ü×Ñ ! NÐ#3Ð3CÀAÀ3Ð GÔHÜ˜e¬S°«VÑ4Ó5°sÐ:Õ:ûð;úsª   Š=[ ÁC,[ Ä4AY2Æ 9[ Æ:A[ È)[ È8A [ É9A[ ËA4[ Í*[ Í8D[ Ò5[ Ó Y?ÓD[ ×5A+Z Ù [ Ù2Y<Ù7[ Ú	[ Ú)Z;Ú6[ Ú;[ Û [ Û	\
Û3\Û?\
Ü\
z/webhook/dinastia/<nome>c                 óL   — t        «       st        dddœ«      dfS t        | «      S )u?   Webhook multi-instÃ¢ncia â€” /webhook/dinastia/<nome_instancia>Fúnao autorizadorø  é‘  ©r@   r   r?  r8  s    r?   Úwebhook_dinastia_instanciarD  )  s+   € ô Ô Ü˜eÐ-=Ñ>Ó?ÀÐDÐDÜ& tÓ,Ð,rA   z/webhook/dinastiac                  óL   — t        «       st        dddœ«      dfS t        d«      S )u3   Alias legado â€” redireciona para instÃ¢ncia 'px3'.FrA  rø  rB  Úpx3rC  r™   rA   r?   Úwebhook_dinastiarG  1  s+   € ô Ô Ü˜eÐ-=Ñ>Ó?ÀÐDÐDÜ& uÓ-Ð-rA   c                  óà   — 	 t        t        «      5 } t        j                  | «      xs i cddd«       S # 1 sw Y   yxY w# t        $ r$}t
        j                  d|› �«       i cY d}~S d}~ww xY w)u/   Retorna o dict completo de instÃ¢ncias do JSON.Nu$   Erro ao carregar instÃ¢ncias (all): )rÚ   rŒ  r¥   rÛ   rx   r�  ra   )rÞ   r   s     r?   r-  r-  ;  sa   € ðÜÔ+Ó,ð 	&°Ü—9‘9˜Q“<Ò% 2÷	&÷ 	&ò 	&ûäò Ü×ÑÐBÀ1À#ÐFÔGØ�	ûðús4   ‚A  ‘4ª	A  ´=¹A  ½A  Á 	A-Á	A(Á"A-Á(A-r°  c                 ó  — 	 t         › d�}|ddœ}| |ddœ}t        j                  |||d¬«      }|j                  dv rZ	 |j	                  «       }t        |t        «      r8|j                  d	«      d
u r%t        j                  dt        |«      dd › �«       y
yt        j                  d|j                  › d|j                  dd › �«       y
# t        $ r Y yw xY w# t        $ r"}t        j                  d|› �«       Y d}~y
d}~ww xY w)uó   Envia mensagem de texto via Dinastia API.

    Header de auth Ã© `token: <dinastia_token>` (nÃ£o Bearer).
    Endpoint observado: POST {_DINASTIA_BASE}/chat/send/text
    Body esperado: {"Phone": "...", "Body": "...", "NumberCheck": true}
    z/chat/send/textr”   rº  T)ÚPhoneÚBodyÚNumberCheckr  r¤   r¦   ræ  FzDinastia envio success=false: Nr§   zDinastia envio status=rq   zErro envio Dinastia: )r¾  r¬   r­   r¯   r¥   rÜ   r�  r;   r�  rÀ  rm   rx   r°   ra   )	r„   r°  r¬  r7  r<   rg  r~   r¼   r   s	            r?   Ú_dinastia_enviar_mensagemrM  E  s  € ðÜÐ  Ð0ˆØ*Ð<NÑOˆØ!¨8ÀDÑIˆÜ�M‰M˜# w°TÀ2ÔFˆØ�=‰=˜JÑ&ðØ—v‘v“x�Ü˜d¤DÔ)¨d¯h©h°yÓ.AÀUÑ.JÜ!×)Ñ)Ð,JÌ3ÈtË9ÐUYÐVYÈ?ÐJ[Ð*\Ô]Ø ð Ü×ÑÐ 6°q·}±}°oÀRÈÏÉÈtÐPSÈÀ~ÐVÔWØøô	 ò ØØðûô
 ò Ü×ÑÐ3°A°3Ð7Ô8Üûðús;   ‚;C ¾AC
 Â2C Ã
	CÃC ÃCÃC Ã	DÃ"C?Ã?Dz/webhook/ghl-custom-providerc                  ó    — t        ddi«      dfS )uK   Endpoint de verificaÃ§Ã£o/healthcheck do Custom Provider GHL (papiWebhook).r   rØ  r§   )r   r™   rA   r?   Úwebhook_ghl_custom_providerrO  a  s   € ô �H˜dÐ#Ó$ cÐ)Ð)rA   z/webhook/ghl-outboundc            
      ó   — t        «       st        dddœ«      dfS 	 t        j                  dd¬«      xs i } t        j                  dt        | «      dd	 › �«       | j                  d
«      xs d}| j                  d«      xs d}| j                  d«      xs d}|r|st        dddœ«      dfS t        }t        › d|› �}t        j                  |t        |«      d¬«      }|j                  dk7  rOt        j                  d|j                  › d|j                  dd › �«       t        dd|j                  › �dœ«      dfS |j                  «       xs i }|j                  d«      xs |}|j                  d«      xs d}	|j                  d«      xs g }
|	st        dddœ«      dfS d}|
D ]U  }t!        |t        «      sŒ|j#                  d«      sŒ&|j%                  ddd«      j'                  «       j)                  «       } n t+        «       }|j                  |«      xs |j                  d«      xs i }|j                  d«      xs d}|s+t        j                  d|› �«       t        dd |› �dœ«      dfS t-        j.                  d!d|	«      }t1        |||«      }t        j                  d"|› d#|	› d$|› d%|› �«       t        |||	d&œ«      dfS # t2        $ r;}t        j5                  d'|› �«       t        dt        |«      dœ«      dfcY d}~S d}~ww xY w)(u¢   Recebe resposta do atendente no Linkia (GHL Custom Provider outgoingWebhook)
    e envia via Dinastia API pela instÃ¢ncia correta (identificada pela tag via-XXX).FrA  rø  rB  Tr  z[GHL-OUTBOUND] payload: Nr4  r  r6   r©   rô  zcontactId ou message ausenterñ   rÆ   rC   r   r§   u'   [GHL-OUTBOUND] contato nÃ£o encontrado rq   u   contato nÃ£o encontrado: rð   r»   rµ   zcontato sem telefonerF  rý  rÇ   r¬  z([GHL-OUTBOUND] sem token para instancia=u   sem token para instÃ¢ncia r§  z[GHL-OUTBOUND] instancia=ú tel=ú conv=ú ok=)rØ  rð  r„   z[GHL-OUTBOUND] erro: )r@   r   r
   r  r�  r+  rm   r;   r)  rß  r¬   rš   r¯   rÀ  r°   r¥   rÜ   r”  rv  r=   r�   r-  r¾   r¿   rM  rx   rß  )r±   r›   r©   rï  r�  r7  r~   r¼   rw  r„   rµ   rð  rÿ  rŽ  rà  r¬  r  rØ  r   s                      r?   Úwebhook_ghl_outboundrT  g  s  € ô Ô Ü˜eÐ-=Ñ>Ó?ÀÐDÐDð5;Ü×"Ñ"¨°dÔ;ÒA¸rˆÜ×ÑÐ5´c¸'³lÀ4ÀCÐ6HÐ5IÐJÔKà—[‘[ Ó-Ò3°ˆ
Ø—+‘+˜iÓ(Ò.¨BˆØ!Ÿ+™+Ð&6Ó7Ò=¸2ˆá¡Ü %Ð1OÑPÓQÐSVÐVÐVä"ˆ	ô �˜: j \Ð2ˆÜ�L‰L˜¤l°9Ó&=ÀrÔJˆØ�=‰=˜CÒÜ×!Ñ!Ð$KÈAÏMÉMÈ?ÐZ\Ð]^×]cÑ]cÐdhÐehÐ]iÐ\jÐ"kÔlÜ %Ð3LÈQÏ]É]ÈOÐ1\Ñ]Ó^Ð`cÐcÐcà�v‰v‹xŠ~˜2ˆØ—(‘(˜9Ó%Ò-¨ˆØ—;‘;˜wÓ'Ò-¨2ˆØ�{‰{˜6Ó"Ò( bˆáÜ %Ð1GÑHÓIÈ3ÐNÐNð ˆ	Øò 	ˆCÜ˜#œsÕ#¨¯©°vÕ(>ØŸK™K¨°°AÓ6×<Ñ<Ó>×DÑDÓF�	Ùð	ô 3Ó4ˆ
Ø�n‰n˜YÓ'ÒF¨:¯>©>¸%Ó+@ÒFÀBˆØŸ™Ð!1Ó2Ò8°bˆáÜ×!Ñ!Ð$LÈYÈKÐ"XÔYÜ %Ð3MÈiÈ[Ð1YÑZÓ[Ð]`Ð`Ð`ô —V‘V˜E 2 xÓ0ˆ
Ü& z°7¸NÓKˆä×ÑÐ6°y°kÀÀxÀjÐPVÐWfÐVgÐgkÐlnÐkoÐpÔqÜ˜b¨yÀhÑOÓPÐRUÐUÐUøäò ;Ü×ÑÐ"7¸°sÐ ;Ô<Ü˜e¬S°«VÑ4Ó5°sÐ:Õ:ûð;úsF   œBK	 Â.BK	 Ä>A$K	 Æ#K	 Æ;K	 ÇB%K	 É3AK	 Ë		LË0LÌLÌLz(pit-51341ae4-f642-4dc8-a8a8-d89613dde205Ú_linkia_processed_idsÚmsg_idc                 óR  — | sy	 t        «       }|j                  «       }|j                  d|rt        |«      nd| t	        j
                  «       j                  «       f«       |j                  «        |j                  «        y# t        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w)z4Persiste um message_id como processado. Idempotente.Nz[INSERT OR IGNORE INTO linkia_processed (conta_id, message_id, processado_em) VALUES (?,?,?)z)[linkia_processed] erro ao gravar msg_id=rq   r‡   )rV  rz   r{   r|   r   s        r?   Ú_linkia_marcar_processadorX  ¬  s�   € áØð
IÜÓˆØ�k‰k‹mˆØ�‰ØiÙ&ŒS�Œ]¨D°&¼(¿,¹,».×:RÑ:RÓ:TÐUô	
ð 	�‰ŒØ�
‰
�øÜò IÜÐ9¸&¸ÀÀAÀ3ÐG×HÑHûðIús   …A<B Â	B&ÂB!Â!B&c                  ó"  — 	 t        «       } | j                  «       }|j                  d«      j                  «       }| j	                  «        |D �ch c]  }|d   ’Œ	 c}S c c}w # t
        $ r"}t        d|› �«       t        «       cY d}~S d}~ww xY w)uT   Carrega TODOS os IDs processados (loop Ã© global â€” SDR Maria roda pro Linkia PX3).z'SELECT message_id FROM linkia_processedr   z%[linkia_processed] erro ao carregar: N)ro   rs   rt   rv   rw   rx   ry   rr   )r{   r|   r}   r~   r   s        r?   Ú_linkia_carregar_processadosrZ  ½  sz   € ðÜÓˆØ�k‰k‹mˆØ�{‰{ÐDÓE×NÑNÓPˆØ�
‰
ŒØ"Ö#˜��!“Ò#Ð#ùÒ#øÜò ÜÐ5°a°SÐ9Ô:Ü‹u�ûðús0   ‚AA# ÁAÁA# ÁA# Á#	BÁ,B	ÂBÂ	Bc                 óú   — 	 t        «       }|j                  «       }|j                  dt        | «      f«       |j	                  «        |j                  «        y# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)uL   MantÃ©m apenas os Ãºltimos `limite` IDs (equivalente ao TTL do JSON antigo).zgDELETE FROM linkia_processed WHERE id NOT IN (SELECT id FROM linkia_processed ORDER BY id DESC LIMIT ?)z'[linkia_processed] erro ao rotacionar: N)ro   rs   rt   ru   rŠ   rw   rx   ry   )r  r{   r|   r   s       r?   Ú_linkia_rotacionarr\  Ê  sl   € ð=ÜÓˆØ�k‰k‹mˆØ�‰ðIä�‹[ˆNô	
ð
 	�‰ŒØ�
‰
�øÜò =ÜÐ7¸°sÐ;×<Ñ<ûð=ús   ‚AA Á	A:Á"A5Á5A:c                  óÒ	  — t         } t        }t        t        j                  t
        j                  «      t        d¬«      z
  j                  «       dz  «      }	 t        j                  t        › d�t        |«      | ddddœd	¬
«      }|j                  dk7  ry|j                  «       j                  dg «      }|D �]•  }|j                  d«      xs d|k  rŒ|j                  d«      xs d}|j                  d«      xs d}|r|sŒL	 t        j                  t        › d|› d�t        |«      ddid¬
«      }	|	j                  dk7  rŒ‹|	j                  «       j                  di «      }
t%        |
t&        «      r|
j                  dg «      n|
xs g }|D �]½  }|j                  d«      xs d}|r|t(        v rŒ$|j                  d«      xs d}|j                  d«      xs d}|j                  d«      xs dj+                  «       }|j                  d«      xs d}t(        j-                  |«       t/        |«       |dk7  s|dk7  rŒ±|j1                  d«      rŒÃ|sŒÆ	 t        j2                  |j5                  dd«      «      }t        j                  t
        j                  «      |z
  j7                  «       d kD  r�Œ%	 	 t        j                  t        › d!|› �t        t8        «      d¬"«      }|j                  dk7  r�Œf|j                  «       j                  d#«      xs |j                  «       }|j                  d$«      xs d}|j                  d%«      xs g }|s�ŒÅd&}|D ]G  }t%        |t:        «      sŒ|j1                  d'«      sŒ&|j5                  d'dd(«      j=                  «       } n t?        «       }|j                  |«      xs |j                  d&«      xs i }|j                  d)«      xs d}|st         jA                  d*|› �«       �ŒvtC        jD                  d+d|«      }tG        |||«      }t         jI                  d,|› d-|› d.|› d/|dd0 › �«       �ŒÀ �Œ˜ tK        t(        «      d1kD  r'tM        tO        t(        «      d2d «      atQ        d3«       yy# t        $ r"}t         j#                  d|› �«       Y d}~yd}~ww xY w# t        $ r Y �Œw xY w# t        $ r Y �ŒHw xY w# t        $ r Y �ŒXw xY w)4zWVerifica conversas recentes no Linkia e encaminha respostas de vendedores via Dinastia.rB  )Úminutesrs  ré  ÚTYPE_WHATSAPPÚoutboundrÎ   )rÈ   ÚlastMessageTypeÚlastMessageDirectionrÊ   rh   rË   r§   Nrê  z([LINKIA-POLL] erro ao buscar conversas: ÚlastMessageDater   r½   r6   r  rë  ú	/messagesrÊ   rC   Úmessagesr÷  ÚmessageTyperg  Ú	dateAddedr#  ÚZz+00:00rª   rÆ   r   rð   r»   rµ   rF  rý  rÇ   r¬  z'[LINKIA-POLL] sem token para instancia=r§  z[LINKIA-POLL] repassado via=rQ  rS  ú msg=rx  i'  ixìÿÿéˆ  ))r*  Ú_LINKIA_PIT_TOKENru   r   rˆ   r   Úutcr   Ú	timestampr¬   r;   rß  rš   r¯   r¥   rx   r�  ra   rÜ   r�  rU  r=   r^  rX  r”  Úfromisoformatrv  Útotal_secondsr)  rm   r�   r-  rÀ  r¾   r¿   rM  r+  rS   rr   rÇ  r\  )rÝ  r‘   Úsince_msr~   rì  r   rí  Úconv_idr›   ÚmrÚrawÚmsgsr²   rV  r÷  r1  rg  Ú
date_addedÚmsg_dtÚcrrw  r„   rµ   rð  rÿ  rŽ  rà  r¬  r  rØ  s                                 r?   Ú_linkia_poll_oncerx  Ú  s©  € ô %€LÜ€EÜ”H—L‘L¤§¡Ó.´À1Ô1EÑE×PÑPÓRÐUYÑYÓZ€HðÜ�L‰LÜˆkÐ.Ð/Ü  Ó'Ø".À?Ø,6ÀñEàô
ˆð �=‰=˜CÒØØ—‘“—‘˜_¨bÓ1ˆð
 ó WˆØ�H‰HÐ&Ó'Ò,¨1°Ò8ØØ—(‘(˜4“.Ò& BˆØ—X‘X˜kÓ*Ò0¨bˆ
Ù™jØð	Ü—‘Ü�+˜_¨W¨I°YÐ?Ü$ UÓ+Ø �}Øô	ˆBð �~‰~ Ò$ØØ—'‘'“)—-‘- 
¨BÓ/ˆCÜ.8¸¼dÔ.C�3—7‘7˜: rÔ*È#Ê)ÐQSˆDð ó A	ˆCØ—W‘W˜T“]Ò( bˆFÙ˜VÔ'<Ñ<ØàŸ™ Ó,Ò2°ˆIØ—w‘w˜}Ó-Ò3°ˆHØ—G‘G˜F“OÒ) r×0Ñ0Ó2ˆDØŸ™ Ó-Ò3°ˆJä!×%Ñ% fÔ-Ü% fÔ-ð ˜JÒ&¨(°oÒ*EØØ�‰˜xÔ(ØÙØðÜ!×/Ñ/°
×0BÑ0BÀ3ÈÓ0QÓR�Ü—L‘L¤§¡Ó.°Ñ7×FÑFÓHÈ3ÒNÙð OðÜ—\‘\Ü �k ¨J¨<Ð8Ü(¬Ó8Øô�ð
 —>‘> SÒ(ÙØŸ'™'›)Ÿ-™-¨	Ó2Ò?°b·g±g³i�Ø"Ÿ;™; wÓ/Ò5°2�Ø—{‘{ 6Ó*Ò0¨b�ñ Ùð ˆIØò �Ü˜c¤3Õ'¨C¯N©N¸6Õ,BØ #§¡¨F°B¸Ó :× @Ñ @Ó B�IÙðô
 7Ó8ˆJØ—.‘. Ó+ÒJ¨z¯~©~¸eÓ/DÒJÈˆCØ ŸW™WÐ%5Ó6Ò<¸"ˆNÙ!Ü×%Ñ%Ð(OÐPYÈ{Ð&[Ô\ÙäŸ™  r¨8Ó4ˆJÜ*¨:°t¸^ÓLˆBÜ×ÑØ.¨y¨k¸¸z¸lÈ$ÈrÈdÐRWÐX\Ð]`Ð^`ÐXaÐWbÐcöòA	ð-Wôt Ô Ó! EÒ)Ü #¤DÔ)>Ó$?ÀÀÐ$GÓ HÐÜ˜4Õ ð *øô} ò Ü×ÑÐFÀqÀcÐJÔKÜûðûô. ò 	Úð	ûô: ò Úðûô ò Úðúsc   Á=R Â R Ä=R9ÅAR9ÉAS	Ê4=SË3ASÒ	R6ÒR1Ò1R6Ò9	SÓSÓ		SÓSÓ	S&Ó%S&c                  ó°  — t         j                  d«       	 t        j                  t	        «       «       t         j                  dt        t        «      › d�«       	 	 t        «        t        j                  d«       Œ!# t        $ r"} t         j                  d| › �«       Y d} ~ ŒHd} ~ ww xY w# t        $ r"} t         j                  d| › �«       Y d} ~ Œjd} ~ ww xY w)z;Thread daemon: roda _linkia_poll_once() a cada 30 segundos.z.[LINKIA-POLL] Thread iniciada (intervalo 30s).z[LINKIA-POLL] Hidratado do DB: z IDs.z%[LINKIA-POLL] erro hidratando cache: Nz[LINKIA-POLL] erro no ciclo: r  )r�  r+  rU  r}  rZ  rS   rx   ra   rx  rO   r_  r…  s    r?   Ú_linkia_poll_looprz  O  sÅ   € ä×ÑÐGÔHðIÜ×$Ñ$Ô%AÓ%CÔDÜ×ÑÐ<¼SÔAVÓ=WÐ<XÐX]Ð^Ô_ð ð	EÜÔô 	�
‰
�2Œð øô ò IÜ×ÑÐCÀAÀ3ÐG×HÑHûðIûô
 ò 	EÜ×ÑÐ"?À¸sÐ C×DÑDûð	Eús0   —AA< Á
B* Á<	B'ÂB"Â"B'Â*	CÂ3CÃCz</opt/mia/workspace/clientes/px3lab/sdr_alma_cloud_photorf.mdÚiV13JEVbMgfcad9Xw6gzz$d06d8954-e19d-4962-9b86-c25da4278de7z$1efeab5b-8f4f-46ef-be3d-29ec42366833z$d189c3e2-b321-4288-8ba7-011acabf62e9z$bfca2016-a09c-42e5-86ef-a78836b67b48z$70733ae5-a5d0-4ec5-8235-97859b8ef10fz$8f95ea16-18d5-45b3-8575-c965e0e583cfz$faf155d0-a694-435c-9015-ccc974f72167z$1dddadaa-6c50-423d-a2fa-f2487e0a6baaz$72587990-1a07-4196-9582-117deebf2ae3z$07ab9b2a-e5d4-4313-9c69-6a593fb7b193)
Únovo_contatoÚem_conversaÚqualificandoÚqualificadoÚem_negociacaoré  ÚencaminhadoÚdemo_agendadaÚganhamosÚperdemos)r  Ú	loaded_atÚ_sdr_maria_bufferg      @c                 ó�  — | r|sy	 t         › d| › �}dddœ}t        j                  |t        |«      |d¬«      }|j                  dv ry|j                  d	vr2t
        j                  d
|j                  › d|j                  dd › �«       	 t         › d�}d| ddœ}t        j                  |t        |«      |d¬«      }|j                  dv ryt
        j                  d|j                  › �«       y# t        $ r"}t
        j                  d|› �«       Y d}~ŒŠd}~ww xY w# t        $ r"}t
        j                  d|› �«       Y d}~yd}~ww xY w)u  Envia typing indicator ao GHL para o lead ver 'digitando...' no WhatsApp.
    Tenta primeiro o endpoint PUT em /conversations/{id}; se nÃ£o suportado,
    tenta POST em /conversations/messages com type=ACTIVITY. Nunca bloqueia
    o fluxo â€” se falhar, apenas loga e segue.Nrë  TrÏ   )ÚtypingÚtyping_timeoutræ  r¤   )r§   r¨   éÌ   )r*  i•  z[SDR-MARIA] typing PUT status=rq   r§   z[SDR-MARIA] typing PUT erro: rõ  ÚACTIVITYrˆ  )r
  rô  rg  u*   [SDR-MARIA] typing nÃ£o suportado: status=z"[SDR-MARIA] typing ACTIVITY erro: )rß  r¬   r²  rš   r¯   r�  r+  r°   rx   rÀ  r­   )rï  r�  r7  rg  r~   r   s         r?   Ú_sdr_maria_enviar_typingrŒ  †  sT  € ñ
 ¡)Øð	CÜ�˜?¨?Ð*;Ð<ˆØ°!Ñ4ˆÜ�L‰L˜¤l°9Ó&=ÀDÐRSÔTˆØ�=‰=˜OÑ+ØØ�=‰= 
Ñ*Ü×ÑÐ!?ÀÇÁ¸ÈbÐQR×QWÑQWÐX\ÐY\ÐQ]ÐP^Ð_Ô`ð
HÜ�Ð2Ð3ˆàØ-Øñ
ˆô
 �M‰M˜#¤|°IÓ'>ÀTÐSTÔUˆØ�=‰=˜OÑ+ØÜ×ÑÐGÈÏÉÀÐWÕXøô ò CÜ×ÑÐ =¸a¸SÐA×BÑBûðCûô ò HÜ×ÑÐ BÀ1À#ÐF×GÑGûðHús=   ‡A C, ÁA C, Â	?D Ã	"D Ã,	DÃ5DÄDÄ	EÄ#E Å Ec                 óP  — 	 t         5  t        j                  | d«      }ddd«       st        j	                  d| › �«       y|j                  d«      xs g }|j                  d«      xs d}|j                  d«      xs d}|st        j	                  d| › �«       yt        |«      dk(  r|d	   }nd
j                  d„ |D «       «      }t        j	                  d| › dt        |«      › d|dd › �«       |st        j                  d| › �«       y|st        | |t        «      xs d}|rt        ||d¬«      ng }|rt        ||«       t        ||«      }|st        j                  d| › �«       yd}|rt        || ||«      }t!        |«      }	d}
|	d   rt#        | |«      }|rt%        ||	d   |«      }
|	d   rt'        | |	d   |«       t        j	                  d| › d|› d|› d|
› d|	d   › �
«       y# 1 sw Y   �ŒÍxY w# t(        $ r%}t        j+                  d| › d|› �«       Y d}~yd}~ww xY w)uç   Processa mensagens acumuladas no buffer para um contact_id.
    Roda em thread separada (chamado por threading.Timer), fora do contexto Flask.
    Faz: concatena mensagens -> busca histÃ³rico -> typing -> Claude -> post -> aÃ§Ãµes.Nz/[SDR-MARIA-BUFFER] nada no buffer para contact=rt  rq  r6   r�  z&[SDR-MARIA-BUFFER] msgs vazio contact=rÇ   r   z / c              3   ód   K  — | ](  }|sŒ|j                  «       sŒ|j                  «       –— Œ* y ­wrN   rŽ  )r¼  r¤  s     r?   r½  z._sdr_maria_processar_buffer.<locals>.<genexpr>Á  s    è ø€ Ò!M°ºQÀ1Ç7Á7Å9 !§'¡'§)Ñ!Mùs   ‚0Š0›0z'[SDR-MARIA-BUFFER] processando contact=z msgs=z concatenado=r§   z)[SDR-MARIA-BUFFER] sem ghl_token contact=r  )r  z1[SDR-MARIA-BUFFER] Claude retornou vazio contact=FÚstagerµ   z[SDR-MARIA-BUFFER] ok contact=rR  z posted=z stage_moved=z tags=z [SDR-MARIA-BUFFER] erro contact=rq   )Ú_sdr_maria_buffer_lockr†  r^   r�  r+  r;   rS   ró   ra   rî  r*  Ú_sdr_maria_buscar_historicorŒ  Ú_sdr_maria_gerar_respostarÀ  Ú_sdr_maria_postar_outboundÚ_sdr_maria_detectar_acoesÚ_sdr_maria_buscar_opportunityÚ_sdr_maria_mover_stageÚ_sdr_maria_adicionar_tagsrx   rß  )r›   rÒ  rt  rï  r�  r°  ræ  ÚrespostaÚpostedÚacoesÚstage_movedr  r   s                r?   Ú_sdr_maria_processar_bufferrœ  ©  st  € ðAVä#ñ 	<Ü%×)Ñ)¨*°dÓ;ˆE÷	<áÜ×ÑÐ!PÐQ[ÐP\Ð]Ô^Øà�y‰y˜Ó Ò& BˆØŸ)™) IÓ.Ò4°"ˆØ—I‘I˜kÓ*Ò0¨bˆ	áÜ×ÑÐ!GÈ
À|ÐTÔUØô ˆt‹9˜Š>Ø˜A‘w‰Hà—z‘zÑ!M°TÔ!MÓMˆHä×ÑÐDÀZÀLð Q#Ü#& t£9 +¨]¸8ÀDÀS¸>Ð:JðLô 	Mñ Ü×ÑÐ"KÈJÈ<Ð XÔYØñ Ü;¸JÈ	ÔSdÓeÒkÐikˆOñ [jÔ/°ÀÐSUÕVÐoqˆ	ñ Ü$ _°iÔ@ô -¨Y¸ÓAˆÙÜ×!Ñ!Ð$UÐV`ÐUaÐ"bÔcØð ˆÙÜ/°ÀÈXÐW`ÓaˆFô *¨(Ó3ˆØˆØ�Š>Ü2°:¸yÓIˆFÙÜ4°V¸UÀ7¹^ÈYÓW�Ø�Š=Ü% j°%¸±-ÀÔKä×ÑÐ;¸J¸<ÀvÈoÐM^ð _%Ø%+ H¨M¸+¸ÀfÈUÐSYÉ]ÈOð]õ 	^÷w	<ñ 	<ûô| ò VÜ×ÑÐ"BÀ:À,ÈbÐQRÐPSÐ T×UÑUûðVúsI   ‚G7 ˆG*Ÿ"G7 ÁAG7 ÂA0G7 ÄAG7 Å+A>G7 Ç*G4Ç/G7 Ç7	H%È H È H%c                  ó`  — t        j                   «       } t        d   r| t        d   z
  dk  r	t        d   S 	 t        t        dd¬«      5 }|j	                  «       }ddd«       t        d<   | t        d<   |S # 1 sw Y   ŒxY w# t
        $ r"}t        j                  d|› �«       Y d}~y	d}~ww xY w)
z9Carrega o prompt da Maria em cache (reload a cada 5 min).r  r…  é,  r~   rd  re  Nz[SDR-MARIA] erro lendo prompt: r6   )rO   Ú_sdr_maria_system_prompt_cacherÚ   Ú_SDR_MARIA_PROMPT_PATHr  rx   r�  ra   )rˆ   rÞ   r  r   s       r?   Ú_sdr_maria_system_promptr¡  ñ  s­   € ä
�)‰)‹+€CÜ% iÒ0°cÔ<ZÐ[fÑ<gÑ6gÐjmÒ6mÜ-¨iÑ8Ð8ðÜÔ(¨#¸Ô@ð 	ÀAØ—f‘f“hˆG÷	à4;Ô& yÑ1Ø69Ô& {Ñ3Øˆ÷		ð 	ûô
 ò Ü×ÑÐ=¸a¸SÐAÔBÜûðús/   ·B Á	A6ÁB Á6A?Á;B Â	B-ÂB(Â(B-c                 ó   — | sg S 	 t         › d| › d�}d|i}t        j                  |t        |«      |d¬«      }|j                  dk7  r4t
        j                  d|j                  › d|j                  d	d › �«       g S |j                  «       xs i }|j                  d
«      }t        |t        «      r|j                  d
«      xs g }nt        |t        «      r|}ng }t        t        |«      «      }g }	|D ]{  }
|
j                  d«      xs |
j                  d«      xs dj                  «       }|sŒ<|
j                  d«      xs dj                  «       }|dk(  rdnd}|	j                  ||dœ«       Œ} g }|	D ]:  }|r%|d   d   |d   k(  r|d   dxx   d|d   z   z  cc<   Œ*|j                  |«       Œ< |r*|d   d   dk7  r|j!                  d«       |r|d   d   dk7  rŒ|S # t"        $ r$}t
        j%                  d|› �«       g cY d	}~S d	}~ww xY w)uR   Busca as Ãºltimas N mensagens da conversa no GHL. Retorna lista [{role, content}].rë  rd  rÊ   rC   rË   r§   u   [SDR-MARIA] histÃ³rico status=rq   Nre  rg  r©   r6   r÷  rö  rÓ  Ú	assistant©Úroler  éÿÿÿÿr¥  r  rt  r   u   [SDR-MARIA] erro histÃ³rico: )rß  r¬   r;   rš   r¯   r�  rÀ  r°   r¥   rÜ   r�  rÇ  Úreversedr=   r�   rZ   r^   rx   ra   )rï  r�  r  r7  rÌ   r~   r¼   Úmsgs_rawrt  ræ  r¤  rg  r÷  r¥  ÚconsolidadoÚitemr   s                    r?   r‘  r‘    s(  € áØˆ	ð-Ü�˜?¨?Ð*;¸9ÐEˆØ˜6Ð"ˆÜ�L‰L˜¤l°9Ó&=ÀfÐVXÔYˆØ�=‰=˜CÒÜ×!Ñ!Ð$BÀ1Ç=Á=À/ÐQSÐTU×TZÑTZÐ[_Ð\_ÐT`ÐSaÐ"bÔcØˆIØ�v‰v‹xŠ~˜2ˆà—8‘8˜JÓ'ˆÜ�h¤Ô%Ø—<‘< 
Ó+Ò1¨r‰DÜ˜¤$Ô'Ø‰DàˆDô ”H˜T“NÓ#ˆàˆ	Øò 	>ˆAØ—E‘E˜&“MÒ; Q§U¡U¨9Ó%5Ò;¸×BÑBÓDˆDÙØØŸ™˜{Ó+Ò1¨r×8Ñ8Ó:ˆIà&¨)Ò3‘6¸ˆDØ×Ñ d°tÑ<Õ=ð	>ð ˆØò 	)ˆDÙ˜{¨2™¨vÑ6¸$¸v¹,ÒFØ˜B‘ 	Ó*¨d°T¸)±_Ñ.DÑDÔ*à×"Ñ" 4Õ(ð		)ñ ˜k¨!™n¨VÑ4¸Ò>Ø�O‰O˜AÔñ ˜k¨!™n¨VÑ4¸Ó>ð ÐøÜò Ü×ÑÐ;¸A¸3Ð?Ô@Ø�	ûðús+   †A4G  Á;E"G  ÇG  Ç 	HÇ)HÈHÈHræ  Úmensagem_atualc                 óà  — 	 ddl }t        j
                  j                  dd«      }|sŒdD ]‡  }	 t        |d«      5 }|D ]f  }|j                  «       }|j                  d«      sŒ%|j                  d	d
«      d
   j                  «       j                  d«      j                  d«      } n ddd«       |r nŒ‰ |st        j                  d«       yt        «       }|syt        | «      }|r1|d   j                  d«      dk7  s||d   j                  d«      xs dvrA|r+|d   j                  d«      dk(  r|d   dxx   d|z   z  cc<   n|j                  d|dœ«       |r*|d   d   dk7  r|j                  d«       |r|d   d   dk7  rŒ|sd|dœg}	 |j!                  |¬«      }	|	j"                  j%                  dd||¬«      }
d}|
j&                  D ]"  }t)        |dd«      dk(  sŒ||j*                  z  }Œ$ |j                  «       S # t        $ r t        j                  d«       Y yw xY w# 1 sw Y   �Œ�xY w# t        $ r Y �Œw xY w# t        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)z-Chama Claude API e retorna resposta da Maria.r   Nu(   [SDR-MARIA] anthropic SDK nÃ£o instalador6   ÚANTHROPIC_API_KEY)r•  z/opt/mia/.envr~   zANTHROPIC_API_KEY=r–  rÇ   r,  rö  z%[SDR-MARIA] ANTHROPIC_API_KEY ausenter¦  r¥  rÓ  r  rt  r¤  rÎ  zclaude-opus-4-7i   )rq  Ú
max_tokensÚsystemre  r
  r°   z[SDR-MARIA] erro Claude: )Ú	anthropicr-  r�  ra   r×   rÁ  r;   rÚ   r=   r”  rH   rx   r¡  rÇ  rZ   r^   Ú	Anthropicre  rÖ  r  Úgetattrr°   )ræ  r«  r°  r1  Úenv_pathrÞ   r˜  Úsystem_promptre  rØ  Úresponserh  Úblockr   s                 r?   r’  r’  5  s¢  € ðÛô
 �j‰j�n‰nÐ0°"Ó5€GÙà>ò 	ˆHð
Ü˜( CÓ(ð "¨AØ!"ò "˜Ø %§¡£˜Ø ×+Ñ+Ð,@ÕAØ&+§k¡k°#°qÓ&9¸!Ñ&<×&BÑ&BÓ&D×&JÑ&JÈ3Ó&O×&UÑ&UÐVYÓ&Z˜GÙ!ð	"÷"ñ Ùð ð	ñ Ü×ÑÐCÔDØä,Ó.€MÙØô �I‹€HÙ�x ‘|×'Ñ'¨Ó/°6Ò9¸^ÐT\Ð]_ÑT`×TdÑTdÐenÓToÒTuÐsuÑ=vÙ˜ ™×(Ñ(¨Ó0°FÒ:Ø�R‰L˜Ó# t¨nÑ'<Ñ<Ô#à�O‰O V¸ÑGÔHñ �x ‘{ 6Ñ*¨fÒ4Ø�‰�QŒñ �x ‘{ 6Ñ*¨fÓ4ñ Ø#°Ñ?Ð@ˆðØ×$Ñ$¨WÐ$Ó5ˆØ—?‘?×)Ñ)Ø#ØØ Øð	 *ó 
ˆð ˆØ×%Ñ%ò 	$ˆEÜ�u˜f dÓ+¨vÓ5Ø˜Ÿ™Ñ#‘ð	$ð �{‰{‹}Ðøôm ò Ü×ÑÐFÔGÙðú÷"ñ "ûô ò ÚðûôL ò Ü×ÑÐ7¸°sÐ;Ô<Üûðús_   ‚H ®H2º'H%Á"AH%Â&
H2ÆAI Ç  I ÈH"È!H"È%H/	È*H2È2	H?È>H?É	I-ÉI(É(I-c                 óH  — 	 t         › d�}d| ||dœ}t        j                  |t        |«      |d¬«      }|j                  dv ryt
        j                  d|j                  › d	|j                  d
d › �«       y# t        $ r"}t
        j                  d|› �«       Y d
}~yd
}~ww xY w)uL   Posta mensagem como outbound (lado direito no Linkia â€” resposta da Maria).rõ  rò  ró  rh   r¤   r¦   Tz![SDR-MARIA] post outbound status=rq   Nrž  Fz [SDR-MARIA] erro post outbound: ræ  )rï  r›   rh  r�  r7  rg  r~   r   s           r?   r“  r“  u  s°   € ðÜ�Ð2Ð3ˆàØ-Ø#Øñ	
ˆô �M‰M˜#¤|°IÓ'>ÀTÐSUÔVˆØ�=‰=˜JÑ&ØÜ×ÑÐ AÀ!Ç-Á-ÀÐPRÐST×SYÑSYÐZ^Ð[^ÐS_ÐR`ÐaÔbØøÜò Ü×ÑÐ>¸q¸cÐBÔCÜûðús   ‚A A6 Á2A6 Á6	B!Á?BÂB!c                 ór  — 	 t         › d�}t        | t        dœ}t        j                  |t        |«      |d¬«      }|j                  dk7  ry|j                  «       xs i }|j	                  d«      xs g }|r|d   j	                  d	«      S y# t        $ r"}t        j                  d
|› �«       Y d}~yd}~ww xY w)z9Busca opportunity ativa do contato no pipeline SDR Maria.z/opportunities/search)rÄ   r›   r�   rC   rË   r§   NÚopportunitiesr   r½   z[SDR-MARIA] erro busca opp: )rß  r*  Ú_SDR_MARIA_PIPELINE_IDr¬   r;   rš   r¯   r¥   rx   r�  ra   )r›   r�  r7  rÌ   r~   r¼   Úoppsr   s           r?   r•  r•  ‰  s³   € ðÜ�Ð0Ð1ˆä,Ø$Ü1ñ
ˆô
 �L‰L˜¤l°9Ó&=ÀfÐVXÔYˆØ�=‰=˜CÒØØ�v‰v‹xŠ~˜2ˆØ�x‰x˜Ó(Ò.¨BˆÙØ˜‘7—;‘;˜tÓ$Ð$ØøÜò Ü×ÑÐ:¸1¸#Ð>Ô?Üûðús   ‚AB Á>B Â	B6ÂB1Â1B6c                 óP  — | r|sy	 t         › d| › �}d|i}t        j                  |t        |«      |d¬«      }|j                  dv ryt
        j                  d|j                  › d	|j                  d
d › �«       y# t        $ r"}t
        j                  d|› �«       Y d
}~yd
}~ww xY w)z$Move a opportunity para outro stage.Fr  rÿ   rC   r¤   r¦   Tz[SDR-MARIA] mover stage status=rq   Nr§   z[SDR-MARIA] erro mover stage: rþ  )r¿  rü   r�  r7  rg  r~   r   s          r?   r–  r–  Ÿ  s°   € á¡Øð
Ü�˜?¨>Ð*:Ð;ˆØ! 8Ð,ˆÜ�L‰L˜¤l°9Ó&=ÀDÐRTÔUˆØ�=‰=˜JÑ&ØÜ×ÑÐ ?ÀÇÁ¸ÈbÐQR×QWÑQWÐX\ÐY\ÐQ]ÐP^Ð_Ô`ØøÜò Ü×ÑÐ<¸Q¸CÐ@ÔAÜûðús   ‡?A: Á2A: Á:	B%ÂB Â B%c                 óN  — | r|sy	 t         › d| › d�}t        j                  |t        |«      d|id¬«      }|j                  dvr3t
        j                  d|j                  › d	|j                  dd
 › �«       yy# t        $ r"}t
        j                  d|› �«       Y d}~yd}~ww xY w)uJ   Adiciona tags ao contato (mantÃ©m as existentes via endpoint especÃ­fico).NrÆ   z/tagsrµ   rC   r¤   r¦   z[SDR-MARIA] add tags status=rq   r§   z[SDR-MARIA] erro add tags: ræ  )r›   rµ   r�  r7  r~   r   s         r?   r—  r—  °  sª   € á™TØð?Ü�˜: j \°Ð7ˆÜ�M‰M˜#¤|°IÓ'>ÀfÈdÀ^Ð]_Ô`ˆØ�=‰= 
Ñ*Ü×!Ñ!Ð$@ÀÇÁÀÈrÐRS×RXÑRXÐY]ÐZ]ÐR^ÐQ_Ð"`Õað +øäò ?Ü×ÑÐ9¸!¸Ð=×>Ñ>ûð?ús   ‡A0A9 Á9	B$ÂBÂB$)#ÚbloquearÚbloqueiaÚ	bloqueadoÚ	bloqueadaÚpararzpara dezpare deu   nÃ£o quero maisznao quero maiszme tirez	me removaÚremoverztirar da listau   nÃ£o me mandeznao me mandeu   nÃ£o me envieznao me envieu   nÃ£o me contacteznao me contacteu   nÃ£o me contateznao me contateÚchegau   obrigado nÃ£ozobrigado naou   obrigado mas nÃ£ozobrigado mas naoÚdescadastrarrù  u   nÃ£o tenho interesseznao tenho interessez	vai tomarzme deixa em pazÚsomeu   nÃ£o perturbeznao perturbec                 óZ   ‡— | sy| j                  «       Št        ˆfd„t        D «       «      S )uJ   Retorna True se a mensagem do lead indicar intenÃ§Ã£o de bloqueio/opt-out.Fc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrN   r™   ©r¼  rÁ   Útxts     €r?   r½  z-_sdr_maria_detectar_optout.<locals>.<genexpr>Î  s   øè ø€ Ò<˜Aˆq�CŒxÑ<ùr8  )r�   rÊ  Ú_SDR_MARIA_OPTOUT_KEYWORDS)r°  rÊ  s    @r?   Ú_sdr_maria_detectar_optoutrÌ  É  s'   ø€ áØØ
�.‰.Ó
€CÜÓ<Ô!;Ô<Ó<Ð<rA   r˜  c                 ó–  ‡— | xs dj                  «       Šdg dœ}t        ˆfd„dD «       «      r"t        d   |d<   |d   j                  d	«       |S t        ˆfd
„dD «       «      r"t        d   |d<   |d   j                  d«       |S t        ˆfd„dD «       «      rt        d   |d<   |S t        ˆfd„dD «       «      rt        d   |d<   |S )uP   Detecta indicaÃ§Ãµes na resposta da Maria para mover stage/tags automaticamente.r6   N)r�  rµ   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrN   r™   rÉ  s     €r?   r½  z,_sdr_maria_detectar_acoes.<locals>.<genexpr>Ö  s   øè ø€ ò G˜ˆ1�Œ8ñ Gùr8  )ÚcalendlyÚagendeizagendamento confirmadozdemo agendadazagendada parau   reservei o horÃ¡rior‚  r�  rµ   zdemo-agendadac              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrN   r™   rÉ  s     €r?   r½  z,_sdr_maria_detectar_acoes.<locals>.<genexpr>Ú  s   øè ø€ ò U˜!ˆQ�#ŒXñ Uùr8  )zencaminhei parazvou passar para o consultorzconsultor especializadozmonique vai te chamarr�  zencaminhado-consultorc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrN   r™   rÉ  s     €r?   r½  z,_sdr_maria_detectar_acoes.<locals>.<genexpr>Þ  s   øè ø€ ò 6˜!ˆQ�#ŒXñ 6ùr8  )zlink de pagamentoÚ	pagamentozvou te enviar a propostazenviar a propostar€  c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrN   r™   rÉ  s     €r?   r½  z,_sdr_maria_detectar_acoes.<locals>.<genexpr>á  s   øè ø€ ÒI˜!ˆQ�#ŒXÑIùr8  )r  u   faz sentido pra vocÃªsr  )r�   rÊ  Ú_SDR_MARIA_STAGESrZ   )r˜  rš  rÊ  s     @r?   r”  r”  Ñ  sø   ø€ àŠ>�r×
 Ñ
 Ó
"€CØ BÑ'€Eä
ó Gð Fô Gô Gä*¨?Ñ;ˆˆg‰Øˆf‰×Ñ˜_Ô-ð €Lô 
ó Uð  Tô Uô 
Uä*¨=Ñ9ˆˆg‰Øˆf‰×ÑÐ4Ô5ð €Lô 
ó 6ð  5ô 6ô 
6ä*¨?Ñ;ˆˆg‰ð €Lô 
ÓIÐHÔIÔ	IÜ*¨=Ñ9ˆˆg‰à€LrA   z/webhook/ghl-sdr-mariac            	      ó  — t        «       st        dddœ«      dfS t        j                  dd¬«      xs i } t        j                  dt        | «      dd	 › �«       	 | j                  d
«      xs i }| j                  d«      xs i }| j                  d«      xs i }|j                  d«      xs( | j                  d«      xs | j                  d«      xs d}|j                  d«      xs( | j                  d«      xs | j                  d«      xs d}|j                  d«      xs; | j                  d«      xs( | j                  d«      xs | j                  d«      xs d}|r|s4t        j                  d|› dt        |«      › �«       t        dddœ«      dfS t        }|s%t        j                  d«       t        dddœ«      dfS t        |«      r²t        j                  d|› d|dd › �«       t        5  t        j                  |d«      }|r%|j                  d «      r	 |d    j!                  «        ddd«       t%        |d!d"g|«       t'        ||«      }	d}
|	rt)        |	t*        d#   |«      }
t        ddd|
d!d"gd$œ«      dfS t        5  t        j                  |«      }|€g |||dd%œ}|t        |<   n|j                  d&«      s|r||d&<   ||d'<   |d(   j-                  |«       |j                  d «      }|�	 |j!                  «        t/        j0                  t2        t4        |g¬)«      }d|_        ||d <   t9        |d(   «      }ddd«       j;                  «        t        j                  d*|› d+› d,t2        › d-�«       t        dd|d.œ«      dfS # t"        $ r Y �Œhw xY w# 1 sw Y   �ŒnxY w# t"        $ r Y Œ¯w xY w# 1 sw Y   ŒyxY w# t"        $ r;}t        j=                  d/|› �«       t        dt        |«      dœ«      dfcY d}~S d}~ww xY w)0u  Recebe webhook do GHL quando lead responde no WhatsApp.
    Bufferiza as mensagens por BUFFER_DELAY segundos e delega o processamento
    (Claude + post + aÃ§Ãµes) para _sdr_maria_processar_buffer em thread separada.
    Opt-out Ã© tratado imediatamente, sem passar pelo buffer.FrA  rø  rB  Tr  z[SDR-MARIA] payload: NiX  rð   rŸ  r©   r½   r  r›   r6   rô  rï  rg  Úmessage_bodyr°   z+[SDR-MARIA] payload incompleto: contact_id=ri  Úpayload_incompleto)rØ  Úskipr§   z"[SDR-MARIA] _PX3_GHL_TOKEN ausenteÚ	sem_tokenz([SDR-MARIA] OPT-OUT detectado | contact=z | msg=rÎ   r�  Úperdidozopt-outr„  )rØ  Úoptoutr™  r›  Ú
tags_added)rt  rq  r›   r�  r�  rq  r�  rt  )r:   z'[SDR-MARIA-BUFFER] bufferizado contact=z total_msgs=z delay=r9   )rØ  ÚbufferedÚqueued_msgsz[SDR-MARIA] erro: )r@   r   r
   r  r�  r+  rm   r;   rÀ  r]  r)  ra   rÌ  r�  r†  r^   Úcancelrx   r—  r•  r–  rÕ  rZ   rÐ  ÚTimerÚBUFFER_DELAYrœ  rÊ  rS   r�  rß  )r±   rð   rŸ  r©   r›   rï  r°  r�  Úpendr  r›  ÚslotÚ	old_timerÚ	new_timerÚ
total_msgsr   s                   r?   Úwebhook_ghl_sdr_mariarè  ç  sc  € ô Ô Ü˜eÐ-=Ñ>Ó?ÀÐDÐDÜ×Ñ T°$Ô7Ò=¸2€GÜ×ÑÐ.¬s°7«|¸D¸SÐ/AÐ.BÐCÔDð\:à—+‘+˜iÓ(Ò.¨BˆØ—{‘{ >Ó2Ò8°bˆØ—+‘+˜iÓ(Ò.¨Bˆà—k‘k $Ó'ò 6¨7¯;©;°{Ó+Cò 6Ø—k‘k ,Ó/ò6Ø35ð 	à'×+Ñ+¨DÓ1ò @°W·[±[ÐAQÓ5Rò @Ø"Ÿ;™;Ð'8Ó9ò@Ø=?ð 	à—K‘K Ó'ò E¨7¯;©;°~Ó+Fò EØ—K‘K Ó'òEØ+2¯;©;°vÓ+>òEØBDð 	ñ ¡Ü×!Ñ!Ð$OÐPZÈ|Ð[`ÔaeÐfnÓaoÐ`pÐ"qÔrÜ $Ð0DÑEÓFÈÐKÐKä"ˆ	ÙÜ×ÑÐ DÔEÜ $°Ñ<Ó=¸sÐBÐBô & hÔ/Ü×ÑÐ!IÈ*ÈÐU\Ð]eÐfiÐgiÐ]jÐ\kÐlÔmä'ñ Ü(×,Ñ,¨Z¸Ó>�Ù˜DŸH™H WÔ-ðØ˜W™×,Ñ,Ô.÷	ô & j°9¸iÐ2HÈ)ÔTÜ2°:¸yÓIˆFØˆKÙÜ4°VÔ=NÈzÑ=ZÐ\eÓf�ÜØØØØ*Ø(¨)Ð4ñó ð ðð ô $ñ  	+Ü$×(Ñ(¨Ó4ˆDØˆ|àØ.Ø",Ø!*Ø!ñ�ð 15Ô! *Ò-ð —x‘x 	Ô*©Ø&5�D˜‘Oà$-��[Ñ!à�‰L×Ñ Ô)ð Ÿ™ Ó)ˆIØÐ$ðØ×$Ñ$Ô&ô
 "Ÿ™¬Ô6QÐYcÐXdÔeˆIØ#ˆIÔØ%ˆD�‰MÜ˜T &™\Ó*ˆJ÷A 	+ðD 	�‰Ôä×ÑÐDÀZÀLð Q)Ø)3¨°G¼L¸>ÈðLô 	Mô ˜d°ÀZÑPÓQÐSVÐVÐVøôo %ò Úðú÷ñ ûô\ !ò Ùðú÷3 	+ð  	+ûôR ò :Ü×ÑÐ"4°Q°CÐ 8Ô9ä˜d¬C°«FÑ3Ó4°cÐ9Õ9ûð:ús¦   ÁD:O Æ,O Ç/O Ç2*NÈNÈ0AO Ê O ÊA.N8Ë5N)Ì;N8Í AO Î	NÎNÎNÎNÎN&Î!O Î)	N5Î2N8Î4N5Î5N8Î8OÎ=O Ï	PÏ0PÏ=PÐPzlinkia-poll)rÈ  rÊ  rº   )Ú	send_filer  c                  ó
  — t         j                  st        dddœ«      dfS t        t         dd«      dk(  ry	 t	        t        t         d	d
«      xs d
«      } | t        v ryt        dddœ«      dfS # t
        t        f$ r d
} Y Œ,w xY w)u³   Retorna response 403 se o usuÃ¡rio logado nÃ£o puder acessar o Analisador de Leads.

    Libera para: super_admin OU usuÃ¡rios pertencentes Ã s contas em _CONTAS_COM_ANALISE.
    Fu   nÃ£o autenticadorø  rB  rä  r6   Úsuper_adminNrz   r   zacesso restritor  )r   rã  r   r²  ru   rÍ  rÎ  Ú_CONTAS_COM_ANALISErB  s    r?   Ú_bloqueia_sem_acesso_analiserí  d  s“   € ô
 ×(Ò(Ü˜eÐ-?Ñ@ÓAÀ3ÐFÐFÜŒ|˜W bÓ)¨]Ò:ØðÜ”wœ|¨Z¸Ó;Ò@¸qÓAˆð Ô&Ñ&ØÜ˜%Ð):Ñ;Ó<¸cÐAÐAøô	 ”zÐ"ò ØŠðús   ·A. Á.BÂBz/analisar-leadc                  ó(  — t        «       } | �| S t        j                  d¬«      xs i }|j                  d«      xs dj	                  «       }|st        dddœ«      dfS ||j                  d	«      xs dj	                  «       |j                  d
«      xs dj	                  «       |j                  d«      xs dj	                  «       |j                  d«      xs dj	                  «       |j                  d«      xs |j                  d«      xs dj	                  «       dœ}t        j                  |t        t        j                  «      «      }t        j                  t        j                  ||fdd|› �¬«      j                  «        t        d|dœ«      S )NTr  rŒ   r6   Fõ   nome obrigatÃ³riorø  rñ   r„   rƒ   r  r¯  Ú
site_atualrå   ©rŒ   r„   rƒ   r  r¯  rð  zanalise-©rÈ  r:   rÊ  rº   ©rØ  Ú
analise_id)rí  r
   r  r;   r=   r   Ú_analisadorÚcriar_analiseru   r   r½   rÐ  rÑ  Úrun_analise_leadr�  )Úblkr¼   rŒ   Ú	lead_dataÚaids        r?   Úanalisar_leadrû  v  s^  € ô 'Ó
(€CØ
€Øˆ
Ü×Ñ 4Ô(Ò.¨B€DØ�H‰H�VÓÒ" ×)Ñ)Ó+€DÙÜ˜eÐ-@ÑAÓBÀCÐGÐGð Ø—X‘X˜jÓ)Ò/¨R×6Ñ6Ó8Ø—8‘8˜HÓ%Ò+¨×2Ñ2Ó4Ø—h‘h˜{Ó+Ò1¨r×8Ñ8Ó:Ø—h‘h˜{Ó+Ò1¨r×8Ñ8Ó:Ø—x‘x Ó-ÒG°·±¸&Ó1AÒGÀR×NÑNÓPñ€Iô ×
#Ñ
# I¬s´<·?±?Ó/CÓ
D€Cä×ÑÜ×+Ñ+Ø�9ÐØØ˜�uÐô	÷
 �e„gä˜$¨cÑ2Ó3Ð3rA   z/analisar-lead/<int:aid>/statusc                 ó  — t        «       }|�|S t        j                  | «      }|st        dddœ«      dfS |j	                  d«      t        t        j                  «      k7  r#t        j                  dk7  rt        dddœ«      dfS t        d	|d
   |d   |j	                  d«      t        |j	                  d«      «      |j	                  d«      |j	                  d«      |j	                  d«      |j	                  d«      dœ	«      S )NFu   anÃ¡lise nÃ£o encontradarø  r*  rc   rë  zacesso negador  Tr½   r   r—  Úpdf_pathr  rê  r©  Ú	lead_nome)	rØ  r½   r   r—  Úpdf_disponivelr  rê  r©  rþ  )
rí  rõ  Úget_analiser   r;   ru   r   r½   rä  r]  )rú  rø  rï  s      r?   Úanalisar_lead_statusr  •  sê   € ô 'Ó
(€CØ
€Øˆ
Ü
×
!Ñ
! #Ó
&€CÙÜ˜eÐ-GÑHÓIÈ3ÐNÐNà
‡w�wˆyÓœS¤§¡Ó1Ò1´l×6HÑ6HÈMÒ6YÜ˜e¨_Ñ=Ó>ÀÐCÐCÜØØ�$‰iØ�h‘-Ø—G‘G˜JÓ'Ü˜sŸw™w zÓ2Ó3Ø—‘˜“Ø—W‘W˜[Ó)ØŸ™ Ó/Ø—W‘W˜[Ó)ñ
ó 
ð 
rA   z/analisar-lead/<int:aid>/pdfc                 ól  — t        «       }|�|S t        j                  | «      }|r|j                  d«      st	        dddœ«      dfS t        |d   «      }|j                  «       st	        dddœ«      dfS d|j                  d«      xs d	j                  d
d«      › d�}t        t        |«      d|d¬«      S )Nrý  Fu   PDF indisponÃ­velrø  r*  u   arquivo nÃ£o existeÚdossie_rþ  r´   rã   rÅ  ú.pdfTúapplication/pdf©Úas_attachmentÚdownload_namer#  )
rí  rõ  r   r;   r   r   rÙ   rv  ré  rm   )rú  rø  rï  ÚpdfÚnome_arqs        r?   Úanalisar_lead_pdfr  ®  s·   € ô 'Ó
(€CØ
€Øˆ
Ü
×
!Ñ
! #Ó
&€CÙ�c—g‘g˜jÔ)Ü˜eÐ-@ÑAÓBÀCÐGÐGÜ
ˆs�:‰Ó
€CØ�:‰:Œ<Ü˜eÐ-BÑCÓDÀcÐIÐIØ˜#Ÿ'™' +Ó.Ò8°&×AÑAÀ#ÀcÓJÐKÈ4ÐP€HÜ”S˜“X¨TÀÐTeÔfÐfrA   z	/analisesc                  ót  — t        «       } | �| S t        j                  t        t        j
                  «      «      }t        d|D �cg c]b  }|d   |d   |d   |d   |d   |j                  d«      t        |j                  d«      «      |j                  d	«      |j                  d
«      dœ	‘Œd c}dœ«      S c c}w )NTr½   rþ  Úlead_cidadeÚlead_categoriar   r—  rý  rê  r©  )	r½   rþ  r  r  r   r—  rÿ  rê  r©  )rØ  Úanalises)	rí  rõ  Úlistar_analisesru   r   r½   r   r;   r]  )rø  r}   r~   s      r?   Úlistar_analises_rotar  ¾  sÀ   € ô 'Ó
(€CØ
€Øˆ
Ü×&Ñ&¤s¬<¯?©?Ó';Ó<€DÜØð ö
ð ð ˜‘gØ˜{™^Ø  Ñ/Ø"#Ð$4Ñ"5Ø˜H™+ØŸE™E *Ó-Ü"& q§u¡u¨ZÓ'8Ó"9ØŸU™U ;Ó/Ø !§¡ nÓ 5ó
ò
ñó ð ùò
s   ÁA'B5
z"[api] Falha em init_db no import: Ú_rate_limitsr  c                 ó(  — t        j                  «       }t        5  t        |    D �cg c]  }||z
  dk  sŒ|‘Œ }}t	        |«      t
        k\  r|t        | <   	 ddd«       y|j                  |«       |t        | <   ddd«       yc c}w # 1 sw Y   yxY w)z3Retorna True se dentro do limite, False se excedeu.rx  NFT)Ú	_time_apirO   Ú_rate_limits_lockr  rS   Ú_RATE_LIMIT_PER_MINUTErZ   )r‘   rˆ   rV   Ú
timestampss       r?   Ú_check_rate_limitr  î  s‘   € ä
�.‰.Ó
€CÜ	ñ )Ü!-¨eÑ!4ÖE˜A¸¸a¹À"»’aÐEˆ
ÐEÜˆz‹?Ô4Ò4Ø",ŒL˜ÑØ÷	)ð )ð
 	×Ñ˜#ÔØ(Œ�UÑ÷)ð ùò F÷)ð ús&   ›B§BµB¹BÁ BÂBÂBc                  óÞ  — t         j                  j                  dd«      } | j                  d«      sy| dd j	                  «       }t        |«      }|syt        |dd«      }|rv	 t        j                  |«      }t         j                  j                  d«      xs t         j                  xs dj                  d	«      d
   j	                  «       }|r||vry||fS ||fS # t        $ r Y ||fS w xY w)u‘   Retorna (User, token_str) autenticado pelo header Authorization: Bearer <token>,
    ou (None, None). TambÃ©m valida IP whitelist se configurada.r–   r6   r“   râ  r÷  NÚapi_allowed_ipsrE   rF   r   )r
   r<   r;   r”  r=   r.   r²  Ú	_json_apir  rI   rH   rx   )Úauthr‘   rÓ  Úallowed_rawÚallowedÚ	client_ips         r?   Ú_auth_tokenr   û  sñ   € ô �?‰?×Ñ˜°Ó3€DØ�?‰?˜9Ô%ØØ��ˆH�N‰NÓ€EÜ˜EÓ"€DÙØä˜$Ð 1°4Ó8€KÙð	Ü—o‘o kÓ2ˆGÜ Ÿ™×,Ñ,Ð->Ó?Ò\Ä7×CVÑCVÒ\ÐZ\×cÑcÐdgÓhÐijÑk×qÑqÓsˆIÙ˜9¨GÑ3Ø!ð �ˆ;Ðˆ4�ˆ;Ðøô ò 	ØØ�ˆ;Ðð	ús   Á$A0C Ã	C,Ã+C,c                 ó.   ‡ — t        ‰ «      ˆ fd„«       }|S )uO   Decorator para endpoints da API programÃ¡tica. Injeta 'user' como primeiro arg.c                  ó�   •— t        «       \  }}|st        dddœ«      dfS t        |«      st        dddœ«      dfS  ‰|g| ¢­i |¤ŽS )NFÚunauthorizedrº  rB  Úrate_limit_exceededrÌ  )r   r   r  )r:   rÉ  rÓ  r‘   rÞ   s       €r?   Ú	decoratedz require_token.<locals>.decorated  sY   ø€ ä!“m‰ˆˆeÙÜ %°.ÑAÓBÀCÐGÐGÜ  Ô'Ü %Ð2GÑHÓIÈ3ÐNÐNÙ�Ð'˜Ò' Ñ'Ð'rA   r2   )rÞ   r%  s   ` r?   Úrequire_tokenr&    s!   ø€ ä
ˆ1ƒXó(ó ð(ð ÐrA   c                 ój   — |syt        | dd«      ry|j                  d«      }|€y|| j                  k(  S )uP   Isolamento por conta: user sÃ³ vÃª job da prÃ³pria conta (super_admin vÃª tudo).FrÜ  Trz   )r²  r;   rz   )rÓ  rm  rå  s      r?   Ú_job_visivel_parar(    s=   € áØÜˆtÐ% uÔ-ØØ�7‰7�:Ó€DØ€|ØØ�4—=‘=Ñ Ð rA   z/api/v1/prospectarc                 ó^  — t        j                  d¬«      xs i }|j                  d«      xs dj                  «       }|j                  d«      xs dj                  «       }t	        |j                  d«      xs d«      }|j                  d«      xs d	j                  «       j                  «       }|r|st        d
ddœ«      dfS | j                  st        d
ddœ«      dfS t        dt        d|«      «      }| j                  }|r:	 t        |«       t        |«      }|d   |d   k\  rt        d
d|d   › d�dœ«      dfS 	 t        t        j                   «       «      d d }i d|“dd“d|“d|“d|“d|“dt	        | j"                  «      “dd“dd“d|“d d“d!g “d"g “d#d “d$t%        j&                  «       j)                  «       “d%d “t*        |<   t-        t*        «      t.        kD  r6t1        t*        j3                  «       d&„ ¬'«      }	|	d t.          D ]	  }
t*        |
= Œ 	 t5        t*        |   «       t9        j:                  t<        ||||ddddd*d|d
|d
dddfdd+|› �¬,«      }|j?                  «        t        d|d-œ«      S # t        $ r Y �ŒFw xY w# t        $ r}t7        d(|› d)|› �«       Y d }~Œ~d }~ww xY w).NTr  rä   r6   rƒ   r  rC   r  rZ  Fznicho e cidade sao obrigatoriosrº  rñ   zusuario inativor  rÇ   r§   rÁ  zquota mensal atingida (z leads/mes)ræ  r½   rç  rè  rz   rc   r   ré  rQ  r   r@  r¸  rR  r'  r  rê  r©  c                 ó   — t         |    d   S rì  rí  rî  s    r?   rx  z#api_v1_prospectar.<locals>.<lambda>`  rï  rA   rð  u$   [api_v1_prospectar] erro histÃ³rico rq   rõ  zapi-prospec-rò  )rØ  r…   ) r
   r  r;   r=   ru   r—  r   rÒ  rÏ  r  rz   r%   r#   rx   rm   ró  rô  r½   r   rˆ   r‰   rÆ  rS   rõ  rö  r÷  r&   ry   rÐ  rÑ  rÞ  r�  )rÓ  r¼   rä   rƒ   r  r  rz   rÜ  r…   rú  rû  r   rV   s                r?   Úapi_v1_prospectarr+  ,  sB  € ô ×Ñ 4Ô(Ò.¨B€DØ�X‰X�gÓÒ$ "×+Ñ+Ó-€EØ�h‰h�xÓ Ò& B×-Ñ-Ó/€FÜ�—‘˜(Ó#Ò) rÓ*€FØ�H‰H�VÓÒ$ ×+Ñ+Ó-×3Ñ3Ó5€Dá™Ü˜eÐ.OÑPÓQÐSVÐVÐVØ�:Š:Ü˜eÐ.?Ñ@ÓAÀ3ÐFÐFä�”C˜˜VÓ$Ó%€Fð �}‰}€HÙð		Ü% hÔ/Ü˜hÓ'ˆEØ�X‰ %¨¡/Ò1ÜØØ6°u¸X±Ð6GÀ{ÐSñ ó ð ðð ð 2ô ”—‘“Ó˜r Ð"€FðØˆfðà�ðð 	�ðð 	�&ð	ð
 	�&ðð 	�Hðð 	”3�t—w‘w“<ðð 	�,ðð 	�Qðð 	�ðð 	˜!ðð 	�ðð 	�ðð 	�ðð 	”X—\‘\“^×-Ñ-Ó/ðð  	˜ð!„Dˆ�Lô$ Œ4ƒyÔ#Ò#ÜœtŸy™y›{Ñ0NÔOˆØ#Ð$6Ô&6Ð%6Ð7ò 	ˆFÜ�V‘ð	ðDÜœT &™\Ô*ô
 	×ÑÜØ�e˜V VØØ�"�bØØØØØØØ�"�að

ð Ø˜F˜8Ð$ô	€Að  ‡G�G„Iä˜$¨&Ñ1Ó2Ð2øôi ò 	Úð	ûô< ò DÜÐ4°V°H¸B¸q¸cÐB×CÑCûðDús*   Ä7I8 ÈJ É8	JÊJÊ	J,ÊJ'Ê'J,z/api/v1/jobs/<job_id>/statusc                 ó�  ‡— t         j                  ‰«      }|s°	 t        d¬«      }t        ˆfd„|D «       d «      }|st        dddœ«      dfS | j                  s/|j                  d«      d | j                  fvrt        dddœ«      dfS t        d	|d
   |d   |d   |d   |d   |j                  d«      |j                  d«      dœ«      S t        | |«      st        dddœ«      dfS t        d	|d
   |d   |d   |d   |d   |j                  d«      |j                  d«      |j                  d«      dœ	«      S # t        $ r d }Y �Œ	w xY w)NrÎ   rÜ  c              3   ó4   •K  — | ]  }|d    ‰k(  sŒ|–— Œ y­wrÞ  r™   rß  s     €r?   r½  z$api_v1_job_status.<locals>.<genexpr>‡  s   øè ø€ ÒG 1°Q°t±WÀÓ5FœQÑGùrá  FÚjob_not_foundrº  r*  rz   Tr½   r   rQ  r@  r¸  rê  r©  )rØ  r…   r   rQ  r@  r¸  rê  r©  r  )	rØ  r…   r   rQ  r@  r¸  r  rê  r©  )	rÆ  r;   r'   rã  rx   r   rÜ  rz   r(  )rÓ  r…   rm  ræ  rç  s    `   r?   Úapi_v1_job_statusr/    sr  ø€ ô �(‰(�6Ó
€CÙð	Ü-°BÔ7ˆIÜÓG¨	ÔGÈÓNˆHñ Ü %°/ÑBÓCÀSÐHÐHà×"Ò" x§|¡|°JÓ'?ÈÈdÏmÉmÐG\Ñ'\Ü %°/ÑBÓCÀSÐHÐHÜØØ˜t‘nØ˜xÑ(Ø! +Ñ.Ø˜gÑ&Ø&Ð'7Ñ8Ø!Ÿ™ kÓ2Ø$ŸL™L¨Ó8ñ	
ó 	ð 		ô ˜T 3Ô'Ü˜e¨oÑ>Ó?ÀÐDÐDÜØØ�d‘)Ø�h‘-Ø˜Ñ%Ø�W‘ØÐ.Ñ/Ø—‘˜“Ø—W‘W˜[Ó)ØŸ™ Ó/ñ
ó 
ð 
øô' ò 	Ø‹Hð	ús   š!D6 Ä6EÅEz/api/v1/jobs/<job_id>/leadsc           
      óZ  — t         j                  |«      }|st        dddœ«      dfS t        | |«      st        dddœ«      dfS |d   dvrt        dd|d   |d   |d	   d
œ«      dfS t        d|d   |d   t	        |j                  d«      xs g «      |j                  d«      xs g dœ«      S )NFr.  rº  r*  r   )r¨  r5  r4  r  Újob_not_finishedrQ  r@  )rØ  ra   r   rQ  r@  é™  Tr½   rR  )rØ  r…   r   r@  rR  )rÆ  r;   r   r(  rS   )rÓ  r…   rm  s      r?   Úapi_v1_job_leadsr3  ©  sÚ   € ô �(‰(�6Ó
€CÙÜ˜e¨oÑ>Ó?ÀÐDÐDÜ˜T 3Ô'Ü˜e¨oÑ>Ó?ÀÐDÐDØ
ˆ8�}ÐIÑIÜØØ'Ø˜(‘mØ˜[Ñ)Ø˜‘\ñ
ó ð ðð 	ô ØØ�d‘)Ø�h‘-Ü�S—W‘W˜WÓ%Ò+¨Ó,Ø—‘˜Ó!Ò' Rñó ð rA   z/api/v1/analisarc                 ó  — t        j                  d¬«      xs i }|j                  d«      xs dj                  «       }|st	        dddœ«      dfS ||j                  d	«      xs dj                  «       |j                  d
«      xs dj                  «       |j                  d«      xs dj                  «       |j                  d«      xs dj                  «       |j                  d«      xs |j                  d«      xs dj                  «       dœ}t        j                  |t        | j                  «      «      }t        j                  t
        j                  ||fdd|› �¬«      j                  «        t	        d|dœ«      S )NTr  rŒ   r6   Frï  rº  rñ   r„   rƒ   r  r¯  rð  rå   rñ  zapi-analise-rò  ró  )r
   r  r;   r=   r   rõ  rö  ru   r½   rÐ  rÑ  r÷  r�  )rÓ  r¼   rŒ   rù  rú  s        r?   Úapi_v1_analisarr5  Ã  sK  € ô ×Ñ 4Ô(Ò.¨B€DØ�H‰H�VÓÒ" ×)Ñ)Ó+€DÙÜ˜eÐ.AÑBÓCÀSÐHÐHð Ø—X‘X˜jÓ)Ò/¨R×6Ñ6Ó8Ø—8‘8˜HÓ%Ò+¨×2Ñ2Ó4Ø—h‘h˜{Ó+Ò1¨r×8Ñ8Ó:Ø—h‘h˜{Ó+Ò1¨r×8Ñ8Ó:Ø—x‘x Ó-ÒG°·±¸&Ó1AÒGÀR×NÑNÓPñ€Iô ×
#Ñ
# I¬s°4·7±7«|Ó
<€Cä×ÑÜ×+Ñ+Ø�9ÐØØ˜C˜5Ð!ô	÷
 �e„gä˜$¨cÑ2Ó3Ð3rA   z!/api/v1/analises/<int:aid>/statusc                 óò  — t        j                  |«      }|st        dddœ«      dfS |j                  d«      t	        | j
                  «      k7  r| j                  st        dddœ«      dfS t        d|d   |d   |j                  d«      |j                  d	«      |j                  d
«      t        |j                  d«      «      |j                  d«      |j                  d«      |j                  d«      dœ
«      S )NFÚanalise_not_foundrº  r*  rc   Tr½   r   rþ  r—  rý  r  rê  r©  )
rØ  rô  r   Úetaparþ  r—  rÿ  r  rê  r©  )rõ  r   r   r;   ru   r½   rÜ  r]  )rÓ  rú  rï  s      r?   Úapi_v1_analise_statusr9  á  sß   € ô ×
!Ñ
! #Ó
&€CÙÜ˜eÐ.AÑBÓCÀSÐHÐHà
‡w�wˆyÓœS §¡›\Ò)°$×2EÒ2EÜ˜eÐ.AÑBÓCÀSÐHÐHÜØØ˜$‘iØ�h‘-Ø—‘˜Ó"Ø—W‘W˜[Ó)Ø—G‘G˜JÓ'Ü˜sŸw™w zÓ2Ó3Ø—‘˜“Ø—W‘W˜[Ó)ØŸ™ Ó/ñó ð rA   z$/api/v1/analises/<int:aid>/resultadoc                 óÔ  — t        j                  |«      }|st        dddœ«      dfS |j                  d«      t	        | j
                  «      k7  r| j                  st        dddœ«      dfS |j                  d«      dk7  r t        dd|j                  d«      d	œ«      d
fS d }|j                  d«      rd|› d�}t        d|d   |j                  d«      |j                  d«      |dœ«      S )NFr7  rº  r*  rc   r   r¨  Úanalise_not_finishedr¾  r2  rý  z/api/v1/analises/z/pdfTr½   rþ  r—  )rØ  rô  rþ  Úlp_urlÚpdf_url)rõ  r   r   r;   ru   r½   rÜ  )rÓ  rú  rï  r=  s       r?   Úapi_v1_analise_resultador>  ù  sû   € ô ×
!Ñ
! #Ó
&€CÙÜ˜eÐ.AÑBÓCÀSÐHÐHØ
‡w�wˆyÓœS §¡›\Ò)°$×2EÒ2EÜ˜eÐ.AÑBÓCÀSÐHÐHØ
‡w�wˆxÓ˜KÒ'ÜØØ+Ø—g‘g˜hÓ'ñ
ó ð ð	ð 	ð €GØ
‡w�wˆzÔØ% c U¨$Ð/ˆÜØØ˜$‘iØ—W‘W˜[Ó)Ø—'‘'˜*Ó%Øñó ð rA   z/api/v1/analises/<int:aid>/pdfc                 óö  — t        j                  |«      }|st        dddœ«      dfS |j                  d«      t	        | j
                  «      k7  r| j                  st        dddœ«      dfS |j                  d«      st        dddœ«      dfS t        |d   «      }|j                  «       st        dddœ«      dfS d	|j                  d
«      xs dj                  dd«      › d�}t        t        |«      d|d¬«      S )NFr7  rº  r*  rc   rý  Úpdf_unavailableÚpdf_file_missingr  rþ  r´   rã   rÅ  r  Tr  r  )rõ  r   r   r;   ru   r½   rÜ  r   rÙ   rv  ré  rm   )rÓ  rú  rï  r	  r
  s        r?   Úapi_v1_analise_pdfrB    só   € ô ×
!Ñ
! #Ó
&€CÙÜ˜eÐ.AÑBÓCÀSÐHÐHØ
‡w�wˆyÓœS §¡›\Ò)°$×2EÒ2EÜ˜eÐ.AÑBÓCÀSÐHÐHØ�7‰7�:ÔÜ˜eÐ.?Ñ@ÓAÀ3ÐFÐFÜ
ˆs�:‰Ó
€CØ�:‰:Œ<Ü˜eÐ.@ÑAÓBÀCÐGÐGØ˜#Ÿ'™' +Ó.Ò8°&×AÑAÀ#ÀsÓKÐLÈDÐQ€HÜ”S˜“X¨TÀÐTeÔfÐfrA   Ú__main__z[migracao] z4 perfil(is) de CRM criado(s) a partir de ghl_config.z5[migracao] Falha ao migrar ghl_config -> crm_perfis: z)Iniciando Prospeccao Web na porta 5050...z0.0.0.0iº  )ÚhostÚportÚdebug)r6   r6   r6   N)r6   )úGoogle MapsN)rG  )rõ  r6   rZ  FNFr6   r6   r   NNr   )r6   r6   rN   )T)rj  )r  (+  Ú__doc__Úsysr×   Úpathlibr   Ú_PathrØ   Úinsertrm   r1  Úresolver³  ró  rO   rÐ  r¬   r¾   r¥   r  r  r   r   r   rD  r   r   r	   r
   r   r   r   Úflask_loginr   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   rÛ  r1   Ú	functoolsr3   r  Ú__name__rÝ  rÁ  r;   Ú
secret_keyr=   r5   r]  r@   ÚcollectionsrB   Ú_threading_rlrÇ  rQ   ÚLockrP   rT   rR   rK   rX   r\   r_   Úlogin_managerÚ
login_viewÚlogin_messageÚlogin_message_categoryÚuser_loaderrd   Úclimbleads_signupre   rx   Ú_e_clry   rÆ  rõ  rn   ro   rr   r€   r‹   r�   rÑ   r®   r�  rš   Útupler³   rÃ   rÓ   rß   rû   r  ru   r  r  rÞ  r\  rä  rü  r  r´  r  r  r  rÉ  rÈ  rË  rÆ  Úrouter`   rÕ  râ  rç  rë  rî  rð  rË  r  r  r  r  r  r"  r&  r-  r0  r6  r9  r<  r>  rF  rI  rx  rh  r±  r²  r”  ÚDIAS_SEMANA_MAPr÷  r�  rj  rp  r{  r†  rŠ  r’  r•  rž  r¡  r¸  rÃ  rØ  r   rò  rù  rû  r	  rb  r+  r:  rM  rZ  r_  rh  rm  r|  r{  ÚCAMPOS_ENRIQUECIMENTOr±  ro  r…  r‡  ÚloggingÚ	getLoggerr�  Ú
config_ghlr‰  r)  rŠ  r*  rá  ra   rß  r¾  rŒ  r�  r™  r�  r¢  r©  ÚbytesrÅ  rÜ  rá  rä  rç  rî  rû  r   r?  rD  rG  r-  rM  rO  rT  rk  rU  Ú__annotations__rX  rZ  r\  rx  rz  r   rº  rÕ  rŸ  r†  r�  râ  rŒ  rœ  r¡  r‘  r’  r“  r•  r–  r—  rË  rÌ  r”  rè  rÑ  r�  ré  Ú
analisadorrõ  Úensure_tablerì  rí  rû  r  r  r  Ú_defaultdict_apir  Ú_threading_apir  r  r  r  r   r&  r(  r+  r/  r3  r5  r9  r>  rB  ry  r   ry  r™   rA   r?   ú<module>ri     s  ðòó
 Û 	õ "Ø ‡�‡��‘3‘u˜X“×.Ñ.Ó0×7Ñ7Ó8Ô 9ã Û Û Û Û 	Û Û 
Û 	ß 2Ñ 2Ý ß T× TÑ Tß [Õ [÷G÷ G÷ G÷ G÷ G÷ G÷ G÷ Gõ 0Ý Û áˆHƒo€ð —‘—‘Ð 2Ó3ÒUÐ7U€„ð
 —‘—‘Ð 0°"Ó5×;Ñ;Ó=€ð'˜Tó 'õ $Û !á˜4Ó €Ø&�M×&Ñ&Ó(Ð ØÐ ØÐ ð:�3ó :ð
1˜ð 1 ó 1ð-˜só -ð
#�có #ñ ˜SÓ!€Ø"€Ô ØF€Ô Ø'.€Ô $à×Ññó ððCÝ<Ù˜sÔ#ð
 
€ØÐ ñ
 �h“×'Ñ'Ó)×0Ñ0°:Ñ=€ò<ð
 Có ð$ MOØ7;òY cð Y°Cð YÀcð YØ"ðYØ14óYð(>˜ð > cð >¨có >ð 2€Ø)€ð˜ð  ó ð¨Cð ¸ð ÈCð Ø-0ðØ=@ðØQTðØY^óò6 ð ¨cð ¸ð Ècð Ð[`ó ð@(¨3ð (°cð (À#ð (ÐTWð (Ð\_ÐbfÑ\fó (ðV cð ¨dó ò"=6˜Dð =6¨ð =6¸3ð =6Èð =6Ðptð =6ð  AFó =6ðB KXò8 ð 8°3ð 8¸sð 8ÐQTð 8Ø(+ð8Ø7:ð8ØDGð8Ø\aó8ð:˜Tð  có ðD @BØAFØAFØACØ'(ØHIò[Q˜3ð [Q sð [Q°Cð [QÀð [QØð[QØ,/ð[QØ>Að[QØMPð[Qà ð[Qà9<ð[Qð ð[Qð ;?ð[Qð !ð	[Qð ;?ð	[Qð
 !$ð[Qð
 <?ð[Qð "%ð[Qð ð[Qð ,1ð[Qð CFó[Qò|/òòñ@ ÐHÓI€Ø × Ò ˜tÐ Ô $ð[ 3ð [¨tó [ð #ð ¨$ó ð˜dð  só ð@x Sð x¨Tó xòv	\¨ð \°cð \Èð \ÐUYó \ò~5 Cð 5°ð 5À#ð 5Èdð 5Ðdgó 5ðt )-òjQ˜Sð jQ¨Dð jQ¸ð jQØ"%ðjQØ47ðjQØCFðjQà!%ójQð^ ‡‚ˆ8˜e V˜_€Ó-ñ)ó .ð)ð0 ‡‚ˆ9ÓØñ&ó ó ð&ð
 ‡‚ˆ8ÓØñó ó ðð2 ‡‚Ð!¨F¨8€Ó4Øñ&ó ó 5ð&ð$ ‡‚Ð+°f°X€Ó>Øñ&ó ó ?ð&ð ‡‚Ð,°v°h€Ó?Øñ&ó ó @ð&ð ‡‚Ð-¸°x€Ó@Øñ&ó ó Að&ð ‡‚ˆ3ƒØñGó ó ðGð ‡‚ˆ? V H€Ó-ØñG;ó ó .ðG;ðT ‡‚Ð u g€Ó.Øñó ó /ðð( ‡‚Ð¨%¨€Ó1Øñ9;ó ó 2ð9;ðx ‡‚Ð v h€Ó/Øñ!ó ó 0ð!ò<
/ð ‡‚Ð u g€Ó.ØñIó ó /ðIð" ‡‚Ð v h€Ó/Øñ3ó ó 0ð3ðD ‡‚Ð,°u°g€Ó>Øñ7ó ó ?ð7ðD ‡‚Ð,°x°j€ÓAØñ!ó ó Bð!ð& ‡‚ˆ< % €Ó)Øñ;ó ó *ð;ð4 ‡‚Ð¨&¨€Ó2Øñ	&ó ó 3ð	&ð ‡‚Ð+°f°X€Ó>Øñ&ó ó ?ð&ð ‡‚Ð,°v°h€Ó?Øñ&ó ó @ð&ð ‡‚Ð/Ó0Øñ
&ó ó 1ð
&ð ‡‚Ð%Ó&Øñ&ó ó 'ð&ó áÐ[Ó\Ð ÙÐUÓVÐ ÙÐ=Ó>Ð ÙÐbÓcÐ ð ØØØØØØñ€ñ ˜?×/Ò/Ó1Ó2Ð ð Dó ð:' Tð '¨dó 'ð2 ó 2ð&#  d¨C iÑ 0ó #ð"# 5¨¨s¨Ñ#3ó #ð  ‡‚ˆ< % €Ó)Øñó ó *ðð* ‡‚Ð¨¨€Ó0Øñ;ó ó 1ð;ð ‡‚ˆ< & €Ó*ØñU8ó ó +ðU8ðp ‡‚Ð¨¨€Ó1Øñó ó 2ðð6 ‡‚Ð#¨f¨X€Ó6Øñ>Só ó 7ð>SðB ‡‚ˆ:ÓØñ Uó ó ð UðF ‡‚ˆ= 6 (€Ó+Øñ_Mó ó ,ð_MðD ‡‚ÐÓØñ,ó ó ð,ð^ ‡‚ˆ7ÓØñ&ó ó ð&ðR ‡‚Ð¨&¨€Ó2ØñLó ó 3ðLð ‡‚Ð¨ x€Ó0Øñ\ó ó 1ð\ð ‡‚Ð¨¨€Ó1Øñ^bó ó 2ð^bðB ‡‚ˆ= 6 (€Ó+ØñF]ó ó ,ðF]ðR ‡‚Ð%Ó&Øñ!ó ó 'ð!ðH ‡‚Ð(°6°(€Ó;Øñ+ó ó <ð+ð` ‡‚Ð f X€Ó.Øñ/ó ó /ð/ð0 ‡‚Ð¨&¨€Ó2Øñ&Vó ó 3ð&VðR ‡‚Ð!¨F¨8€Ó4ØñKó ó 5ðKð< ‡‚Ð!¨F¨8€Ó4Øñ]Có ó 5ð]CñB ÐHÓI€ð ¨FÐCWÑXØ¨FÐC`ÑaØ¨FÐC[Ñ\Ø¨FÐC]Ñ^Ø¨FÐC[Ñ\Ø¨FÐCbÑcØ¨FÐCaÑbðÐ ð ¨FÐCVÑWØ¨FÐC`ÑaØ¨FÐCZÑ[Ø¨FÐC\Ñ]Ø¨FÐCXÑYØ¨FÐCbÑcØ¨FÐCaÑbðÐ ð 1Ð ð˜dó ð˜tó ð ‡‚Ð'°&°€Ó:ØñQó ó ;ðQðh ‡‚ÐÓØñ+ó ó ð+ó Ø!�×!Ò!Ð"4Ó5€ð ‡�‡��Ð7Ô 8ðß\ð 3€	à5€Ù Ð!fÓgÐ ð sð ¨t°d©{ó ð˜Cð  Dó ð˜ó ð dð ¨t°d©{ó ð& Tð ¨có ð¨ð °ó ò" Sð "°4ð "Èð "ÐV[Ð^bÑVbó "ðJ¨Uð ¸cð Àcó ð> #ð °#ð ÀSð ÈSÐSWÉZô ð" ð °ð ÀCð ÈCÐRVÉJô ð8 Cñ °ð Àð Èô ð¨cð ¸cð ÐQTð ÐY\Ð_cÑYcô ñ6°3ð ÀCñ ÐPSñ Ð`cð Ðpsð Ðx|ô ð:	2¨Sñ 	2¸Sð 	2ÈSð 	2ÐUYô 	2ñc;°ô c;ðL ‡‚Ñ%°¨x€Ó8ò-ó 9ð-ð ‡‚Ñ¨¨€Ó1ò.ó 2ð.ð tô ð¨ñ °sð ÈCð ÐTXô ð8 ‡‚Ñ)°E¸6°?€ÓCò*ó Dð*ð
 ‡‚Ñ"¨V¨H€Ó5ò:;ó 6ð:;ñ| ?Ð ñ !›UÐ �sÔ "óI cô Ið"
 cô 
ò=˜sô =ó r!ójñ8 Ñ\Ó]Ð Ù/Ð á?Ù?Ù?Ù?Ù?Ù?Ù?Ù?Ù?Ù?òÐ ð .0¸aÒ!@Ð ð Ð �4Ô Ø'˜Ÿ™Ó)Ð Ù€ñ H¨cð  H¸cð  HÀdô  HðFEV¨Cð EV°Dô EVðP #õ ó 1°ð 1Àð 1Ècð 1Ð[_Ð`dÑ[eõ 1ñh=¨¨d©ñ =ÀSð =ÈSõ =ñ@°ð Àñ ÈSð Ð]`ð Ðeiõ ð(¨cð ¸cð ÀcÈDÁjõ ð,¨3ð ¸#ð È#ð ÐRVõ ð"
?¨#ð 
?°T¸#±Yð 
?È3ð 
?ÐSWõ 
?ñ	Ñ ñ=¨ð =°õ =ñ¨ð °õ ð, ‡‚Ñ#¨f¨X€Ó6òf:ó 7ñf:ðT €	× Ò Ð)°$¹]Õ K× QÒ QÔ S÷ Ð Ý  à �× Ò Ô ñ
 �cÑ ôBð$ ‡‚Ñ f X€Ó.Øò4ó ó /ñ4ð: ‡‚Ñ,Ó-Øòó ó .ñð. ‡‚Ñ)Ó*Øògó ó +ñgð ‡‚‰;ÓØòó ó ñð<5Ù„Iö 8Ü Ü "â% dÓ+�ˆdÔ +Ø'‘N×'Ñ'Ó)Ñ ÙÑ ð
˜Sð 
 Tõ 
ôô.
ð	! Dõ 	!ð ‡‚Ñ¨&¨€Ó2ÙòM3ó ó 3ñM3ðb ‡‚Ñ)°E°7€Ó;Ùò$ó ó <ñ$ðP ‡‚Ñ(°5°'€Ó:Ùòó ó ;ñð0 ‡‚Ñ¨ x€Ó0Ùò4ó ó 1ñ4ð8 ‡‚Ñ.¸¸€Ó@Ùòó ó Añð, ‡‚Ñ1¸E¸7€ÓCÙòó ó Dñð6 ‡‚Ñ+°e°W€Ó=Ùògó ó >ñgð ‰zÒÙ„IðKÙ/Ó1‰ÚÙ‘K¡˜yÑ(\Ð]Ô^ñ 
Ñ
5Ô6Ø‡G‚G‘¡¨U�GÕ3ð øðw] ò CÙ	Ð8¸¸¸qÐ
A×BÒBûðCûðng ò Ø×ÒÐ<¸R¸DÐAÔBØ€NØÖûðûðz+ ò 5Ù	Ñ.¨r¨dÐ
3×4Ò4ûð5ûð^
 ó KÙÑEÁaÀSÐI×JÓJýðKús`   Æ?z  æ z ó{ ù{* ú zúzúzú{ú${û{û{'û{"û"{'û*|û0|ü|