
    aj                        d Z ddlZddlZej                  j	                  dd       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 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'  ee(      Z)d	e)_*         ee)      Z+d
e+_,        de+_-        de+_.        e+j^                  d        Z0i Z1dZ2 ed      Z3de4fdZ5de4fdZ6de7de7de7fdZ8dZ9dZ:de7de;fdZ<de7de7de7de7de7de7de=fd Z>dud!e;de7d"e?de7de=f
d#Z@d$e7de7de7d%e7de7dz  f
d&ZAdvd!e;de7d%e7d'e7de7dz  f
d(ZB	 dvd!e;de7de7d%e7de7d)e7d'e7de=fd*ZC	 	 dwd,e7d-e7de7d.eDde7d%e7de7d)e7d/e7de7d0e7d1eEfd2ZFd3 ZGd4 ZHd5e?de7fd6ZId7e7de;fd8ZJdxd7e7d9e7de7de;fd:ZKdyde7de7d%e7d;e;d<e7f
d=ZLd,e7d5e?de7d%e7de7d)e7fd>ZMe)j                  d?d@dAgB      dC        ZOe)j                  dD      edE               ZPe)j                  dF      edG               ZQe)j                  dHdAgB      edI               ZRe)j                  dJdAgB      edK               ZSe)j                  dLdAgB      edM               ZTe)j                  dN      edO               ZUe)j                  dPdAgB      edQ               ZVe)j                  dRdAgB      edS               ZWe)j                  dT      edU               ZXe)j                  dV      edW               ZYe)j                  dXdAgB      edY               ZZe)j                  dZdAgB      ed[               Z[e)j                  d\dAgB      ed]               Z\ ed^      Z]d_d`dadbdcd`dddbded`dfdbdgd`dhdbgZ^de;fdiZ_dje;fdkZ`e)j                  dldAgB      edm               Zae)j                  dn      edo               Zbe(dpk(  r$ e         ecdq       e)j                  drdsd+t       yy)zuT   
Interface Web - Prospecção Ativa via Google Maps
Flask app rodando na porta 5050
    Nz#/opt/mia/workspace/prospeccao_ativa)datetime)Path)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Userzprospeccao-climb-2026-secretloginu&   Faça login para acessar a ferramenta.errorc                 ,    t        j                  |       S N)r   get)user_ids    */opt/mia/workspace/prospeccao_ativa/app.py	load_userr!   !   s    88G    
   z5/opt/mia/workspace/prospeccao_ativa/prospectados.jsonreturnc                      	 t         j                         r0t        t        j                  t         j                                     S 	 t               S # t        $ r Y t               S w xY wr   )REGISTRO_PATHexistssetjsonloads	read_text	Exception r"   r    _carregar_registror.   ,   sY    !tzz-"9"9";<== " 5L  5Ls   AA 	A&%A&registroc                     	 t         j                  t        j                  t	        |                    y # t
        $ r Y y w xY wr   )r&   
write_textr)   dumpslistr,   )r/   s    r    _salvar_registror4   4   s4      DN!;< s   14 	A A nomecidadec                     | j                         j                          d|j                         j                          S )N|)lowerstrip)r5   r6   s     r    _chave_empresar;   :   s3    jjl  "#1V\\^%9%9%;$<==r"   z$https://services.leadconnectorhq.comzhttps://unnichat.com.brtokenc                     d|  dddS )NBearer application/jsonz
2021-07-28)AuthorizationContent-TypeVersionr-   )r<   s    r    _ghl_headersrC   A   s    "5'** r"   
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@   rA   x-connection-id)crm_idrG   rH   z/api/contact/z/crm   headersr)   timeout      )TNmessageNx   FHTTP : )	requestspostUNNICHAT_BASEstatus_coder)   r   textr,   str)rD   r<   rE   rF   rG   rH   rO   payloadrmsges              r    unnichat_adicionar_pipelinerb   K   s     #*% 1CUVG%2!"&G
MMo]:,d;'2
 ==J&	&&(,,y)9QVVDS\C amm_Bse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+] telefoner5   Nemailprospeccao-ativa)namephoneri   rd   r>   r?   rJ   rK   z/api/contactrM   rN   rQ   dataidrT   rU   rV   rW   )resubr   itemsrX   rY   rZ   r[   r)   r\   r,   r]   )rc   r<   rd   rE   rh   r^   kvrO   r_   rm   r`   ra   s                r    unnichat_criar_contatort   f   s   vviTXXj"%=>HV!T'"*d,+,	G !(A11=q!tAGA")% 1CUVG%2!"MMo\*	
 ==J&668<<+D88D>4''	&&(,,y)9QVVDS\C uQ]]O2cU333% B   	&&#,C	  SV|sO   !
D*,D*A E &0D0 E 0EE 
EE 	E.E)#E.)E.rh   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limitr#   rO   paramsrP   rR   contactsr   rn   N2      companyNamerg   )rC   rX   r   GHL_BASEr[   r)   r,   r9   )rh   r5   r<   ru   rO   r_   r~   cs           r    buscar_contato_existente_ghlr      sX   5!G 	*J'&1HqQ	A }}#668<<
B7#A;??400
LLj
#"-Sb	AN	
 ==Cvvx||J3H 'EE-(.B5574::<G55;&' {t,, /  		(  s1   A(D4 9BE 	E E 4	E ?E 	EEsourcec                    | 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]  \  }}|	|| }
}}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)!zQCria contato no CRM e retorna o contact ID. Se duplicado, retorna o ID existente.r5    rx   r   rg   rf   rh   rd   rj   nichor6   empresaNri   siteendereco)
ry   	firstNamelastNamer   rl   ri   websiteaddress1rd   r   rw   rM   rN   rQ   contactrn   rT   r`   rR     	duplicaterV   rW   rU   )Nu&   Duplicado mas não encontrado na busca)splitlenro   rp   r   rq   rX   rY   r   rC   r[   r)   r,   r\   r9   r   )rc   r<   ru   r   
nome_splitprimeiro	sobrenomerh   rd   tr^   rr   rs   r_   r`   rD   s                   r    criar_contato_ghlr      sJ   f##C+J!}H!$Z1!4
1"IvviTXXj"%=>H88Fb 2DHHWb4I488T\^`KabD!!qA!D! "xx	*:d6l!T'"*d88F#+tHHZ(0DG !(A11=q!tAGA*JU#		A 	}}
"vvx||Ir*..t4d::ffhll9%Be)<B 	}}syy{ :1(DL%Q\]
t##>>5r#ds)555M " B  ffTcls+   H%H%
H*H*AH0 0I
I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   r5   open)
pipelineIdry   rk   pipelineStageIdstatus	contactIdr   /opportunities/rM   rN   rQ   opportunityrn   TNrT   r`   rU   FrV   rW   )
r   rX   rY   r   rC   r[   r)   r]   r,   r\   )rc   rD   r<   ru   rF   r   r   r^   r_   opp_iderros              r    criar_oportunidade_ghlr      s&    "!#3tF|#G 	*O$U#		A 	}}
"mR044T:Paffhll4>PVT!!vvx||I&N!&&(,,u*=NQVVX $%b777  vvds|s   .AD D98D9Fjob_idr   limitecrm_typepaisenriquecimento_autoc                   
 t         |    dd<   
d<   
dk(  rdnd}d   j                  dt                d	 d
| d
 d d       	 g }
fd} |       }d   dk(  r!d   j                  dt                d       yd   dk(  r,d   j                  dt                dt        |       d       |s&dd<   d   j                  dt                d       yd   j                  dt                dt        |       d       |rd   j                  dt                d
 d       t	        |      D ]P  \  }}	 
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                  d"d      |d"<   |j                  d#      r|d#   |d#<   d$j                  |j                  d%g             }d   j                  dt                d&|d'z    d(t        |       d)|d    d*|xs d+ d,       S d   j                  dt                d/       d0}dd<   t	        |      D ]H  \  }}d   dk(  r n:|d1k(  rt        ||d2|j                  d3d      |j                  d4d      g|	5      \  }}|ryt        |||	|xs d6|xs d7|d   8      \  }}d9|d:<   ||d;<   |d'z  }|d<<   |rd=nd>| d}d   j                  dt                d?|d'z    d(t        |       d)|d    d@| 
       nQd   j                  dt                dA|d    dB|        n't        |||      \  }}|rt        ||||||      \  }}}|rMd9|d:<   ||d;<   |d'z  }|d<<   d   j                  dt                dC|d'z    d(t        |       d)|d    dD	       n|r_dE|j                         v rMd9|d:<   ||d;<   |d'z  }|d<<   d   j                  dt                dC|d'z    d(t        |       d)|d    dF	       nQd   j                  dt                dG|d    dB|        n(d   j                  dt                dH|d    dB|        t        d         dIkD  rd   dJd d<   t        j                   dK       K |d<<   dd<   d   j                  dt                dL| d(t        |       dM       t#        j$                         j'                         dN<   y# t        $ r3}d   j                  dt                d-|d    d.|        Y d}~hd}~ww xY w# t        $ rH}dOd<   t)        |      dO<   d   j                  dt                dPt)        |              Y d}~yd}~ww xY w)Qz@Executa o scraper em thread separada com callbacks de progresso.em_andamentor   r   USinemlogs[z] Iniciando busca: r   z
 (limite: )c                  .   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 d   dk(  r|j                          |cd d d        S |j                  d      j#                         }t        t%        |            }|d<   d   j                  dt                d| d       t'               }d}t)        |d        D ]  \  }}d   dv r n	 i }	 |j+                  dd       xs d!}|r&|j-                         j/                  d"      d   |d#<   n5|j1                  d       j-                         j/                  d"      d   |d#<   |d#   rt%        |d#         d$k  rt3        |d#         }||v r|d%z  }|j5                          |j                  d&       	 |j                  d'      j                  }|j+                  d(d&       |d)<   |d)   j                  d*d!      j-                         |d)<   	 |j                  d+      j                  }|j+                  d,d&       xs d!|d-<   	 |j                  d.      j                  }|j1                  d&       j-                         |d/<   	 |j                  d0      j                  }|j1                  d       j-                         |d1<   |d2<   |d3<   d4|d5<   d |d6<   |j7                  d#      r|j9                  |       t;        |       |j                  |       t%        |      d7<   d8   j                  |       d   j                  dt                d9|d%z    d:| d;|d#    d<|d)   xs d= 
       t%        d         d>kD  rd   d?d  d<    |dkD  r#d   j                  dt                d| dC       |j                          d d d        |S # t         $ r Y  w xY w# t         $ r Y w xY w# t         $ r	 d!|d)<   Y w xY w# t         $ r	 d!|d-<   Y w xY w# t         $ r	 d!|d/<   Y w xY w# t         $ r	 d!|d1<   Y ~w xY w# t         $ r?}d   j                  dt                d@|d%z    dAt=        |      d dB         Y d }~d }~ww xY w# 1 sw Y   |S xY w)DNr   )sync_playwrightr   r   r   r   zhl=en&gl=uszhl=pt-BR&gl=brT)headlessr   r   z] Buscando: z#https://www.google.com/maps/search/+?i  r   	cancelador      zdiv[role="feed"]zel => el.scrollTop += 1500i  za[href*="/maps/place/"]total] z+ resultados encontrados, coletando dados...)r   pausadoz
aria-labeli  )rP   rg   
r5      rx   i  z[data-item-id^="phone"]zdata-item-idrh   z
phone:tel:z[data-item-id="authority"]hrefr   z[data-item-id^="address"]r   zspan[aria-hidden="true"]	avaliacaor   r6   Fenviado_crmrD   	progressoleadsz] Coletado (/):  | zsem telr   z] Aviso: erro ao coletar card rW   P   u,    empresa(s) puladas (já prospectadas antes))playwright.sync_apir   chromiumlaunchnew_pageappend_tsgotoreplacewait_for_timeoutcloseminrangelocatorfirstevaluater,   allr   r.   	enumerateget_attributer:   r   
inner_textr;   clickr   addr4   r]   )r   r   preposicao_qrz   
lang_parampbrowserpagescrollsipanelcardstotal_cardsr/   puladosidxcardrc   ariachavetel_elsite_eladdr_el	rating_elra   r6   jobr   r   r   s                            r    scrape_com_progressoz,run_prospector.<locals>.scrape_com_progresso  s   ;E#'4<4TLgQ|nAfX6E*.$,<LJ " q a**++T+:'')F""Qsug\%#AB		?cSV@W?XXYZdYefg%%d+x=K/MMO q  q  fk2.w A8}3 $-? @ F F'CD--d3 x=K/MMO 5q  q 8 %>?CCE!#e*f5*GF""QsugR}<g#hi-/!*5&>!: H!IC8}(@@D!!%#'#5#5lD#5#Q#WUWD#/3zz|/A/A$/G/JV/3t/L/R/R/T/Z/Z[_/`ab/cV  $F|s4</@1/D$ !/tF|V D H,#qLG$

--d32%)\\2K%L%R%RF/5/C/CN\`/C/aD,/3J/?/G/GVX/Y/_/_/aD,.&*ll3O&P&V&VG+2+@+@QU+@+V+\Z\DL2&*ll3N&O&U&UG/6/A/A$/A/O/U/U/WD,3(,5O(P(V(VI090D0DT0D0R0X0X0ZD- ).W)/X.3]+-1\*88F+$LL/,X6!LL./25zC,L//5K.."#CE7,s1ugQ{m3tTZ|n\_`deo`p`}t}_~   #3v;/"4.1&k#$.?FIH!T Q;K&&35'G9<h'ijcq f L} % 8  ) %$%&  ) 2/1D,2  ) .+-DL.  ) 2/1D,2  ) 302D-3( % !F**Qsug5STWXYTYSZZ\]`ab]cdgeg]h\i+jk !Uq f Ls*  B V
'V
?=S
<V
!BV
)T?,A4S T?6V
7T?V
!T?2AS+
5T  >T?>T*=CT?;V

	SV
SV
	S($T?%V
'S((T?+S=9T?<S==T? TT?TT?T'#T?&T''T?*T<8T?;T<<T??	V4V<V
VV

Vr   z] Job cancelado pelo usuarioNr   z"] Pausado pelo usuario - enviando z leads coletados ao CRM...	concluidoz] Nenhum lead encontrador   z$ leads coletados. Enviando ao CRM...z] Enriquecendo leads (z) antes de enviar ao CRM...r5   r   rg   )r   r6   rh   ri   cnpjdecisor_nomedecisor_cargolinkedin_url, fontesz	] Enriq (rx   r   r   z [zsem dados extras]z] Enriq erro para rW   u/   ] Enriquecimento concluído. Enviando ao CRM...r   unnichatrj   r   r6   )rE   8TgKxh0VK37bGNkbN8yOHThNTr24Yy2fN0vmeLm2)rF   rG   rH   Tr   rD   leads_enviadosz
+ pipelinez(pipeline: z] Unnichat (z	 enviado z] Unnichat: falhou para r   z] CRM (z enviador   u    já existe no pipelinez ] CRM: oportunidade falhou para z] CRM: contato falhou para r   r         ?z] Concluido: z leads enviados ao CRMconcluido_emr   ] ERRO: )jobsr   r   r   r   enriquecer_empresa_usr   enriquecer_empresajoinr,   rt   rb   r   r   r9   timesleepr   now	isoformatr]   )r   r   r6   r   r<   ru   rF   r   r   rE   r   r   
preposicaoleads_coletadosr   r   rc   dadosr   ra   enviadosrD   err_contatopip_okpip_err
status_pipok_	err_oportr   s    ```      `                  @r    run_prospectorr     s1   
 v,C"CMCK4JK35'!4UG1ZL&Q[\b[ccdef}8{	 {	z /0x=K'K35')EFGx=I%K35')KCP_L`Kaa{|}'CMK35')ABCFQsugRO(<'==abc K35')?vE`ab$_5 Y4Yt| 5 L$(HHVR$8#)! !34< @yy,TXXj5I+0+<Z(yy)$((72C(-gWyy(',V}Vyy0/4^/D^,05		/20N_-yy0/4^/D^,!YYuyy2'>?FK&&35'1Q3%q_AU@VVYZ^_eZfYggijp  kG  uG  jH  HI  (J  K/Y4 K35')XYZ&H 1 @	GAt8}+:%*@%"4dhhw6KTXXV^`bMc!d"/+'
K &A"E=$/$I3I"*"D.D&*6l	'OFG +/D')3D&MH,4C()17{7)ST=UJK&&CE7,qse1S5I4J#dSYl^[deodpq K&&CE7":4<.K=Y
 +<D%*U'
K'=dJPUWbdoqy'z$B9.2]+-7\* A08,-F**wgacU!C4H3ITRX\NZbc %	8I)I26D/1;D.$MH4<C 01K.."#CE7'!A#aO8L7MSQUV\Q]P^^u v  K.."#CE7*J4PV<.X[\e[f g K&&CE7"=d6l^3{m\ 3v;"$!&k#$/FJJsOA@	D !)#HFwmH:Qs?/C.DDZ[	
 'lln668N[ ! YK&&35'1CDL>QSTUSV'WXXY^  8H!fFFQsugXc!fX6778sR   :V3 
AV3 &A$V3 E	U4KV3 4	V0=(V+%V3 +V00V3 3	X<>W??Xc                  H    t        j                         j                  d      S )Nz%H:%M:%S)r   r  strftimer-   r"   r    r   r   
  s    <<>"":..r"   c                 N   t        t        j                               d d }|d| ||dd|dg g d t        j                         j                         d dt        |<   t        t              t        kD  r6t        t        j                         d       }|d t          D ]	  }t        |=  |S )N   
prospeccao
aguardandor   )rn   tipor   r6   r   r   r   r   r   r   r   r   	criado_emr   c                     t         |    d   S Nr  r  rr   s    r    <lambda>z_novo_job.<locals>.<lambda>!      $q'+:N r"   key)r]   uuiduuid4r   r  r	  r  r   MAX_JOBS_HISTORYsortedkeys)r   r6   r   r   ids_ordenadosold_ids         r    	_novo_jobr-    s    r"F\\^--/DL  4y##tyy{0NO#$6&6%67 	FV	Mr"   empresasc                 \   t        t        j                               d d }|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        |=  |S )Nr  enriquecimentor  r   )rn   r  r.  r   r   r   r   r   r   r   r  r   c                     t         |    d   S r  r   r!  s    r    r"  z!_novo_job_enriq.<locals>.<lambda>8  r#  r"   r$  )r]   r&  r'  r   r   r  r	  r  r(  r)  r*  )r.  r   r+  r,  s       r    _novo_job_enriqr2  '  s    r"F X\\^--/DL 4y##tyy{0NO#$6&6%67 	FV	Mr"   nome_empresac                    ddl m} | 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       |rt        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	                  d.d      j!                         |d/<   |d0   j%                  d1       t        j                  d       	  |       5 }t        |j                  d2|  d3dd            }d	d	d	       D ]E  }|j	                  dd      }d4|v s|j'                  d5      d   |d6<   |d0   j%                  d7        n t        j                  d       |S # 1 sw Y   Ox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 |S w xY w)8u   
    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   DDGSrg   )r5   r   rh   whatsappri   r   r   r   r   r   r   z CNPJr   zbr-ptmax_resultsregionNbodyr   r   titlez$\d{2}\.?\d{3}\.?\d{3}\/?\d{4}-?\d{2}z[^\d]      rx   z!https://receitaws.com.br/v1/cnpj/
User-AgentzMozilla/5.0   rO   rP   rR   r   ERRORrh   r7  ri   
logradouronumerobairro	municipioufr   r   r   .r  r   -r   qsar5   r   qualr   r   receita_federalsite:linkedin.com/in ""linkedin.com/in/r   r   linkedin)ddgsr6  r3   r\   r   ro   findallrp   r   r(   r  r  r,   rX   r[   r)   r:   r  r   r   )r3  r6  r  cnpj_rawrQ  
resultadosr_   textomatchesmatchlimpo
cnpj_limpor_apiapi_datatelr   partesr   rJ  
li_resultsurls                        r    r  r  @  s5     E HV 	`tdii<.(>AV]i^_J	` 		AEE&"%+aeeFB.??#EgWYHZZEjj!H%PG  xU3u:#CJ!(;$H	
 		 	

1
 VVHb(3
z?b " 7
|D)=9
 $$+$zz|H||H-8&ll:r:@@B03E*-03E*-*2,,w*C*Ir)P)P)Rg %LLr:$LL26$LL26$LLb9$LLr2. "   #$ "  "  -1IIf,=j)&+,Ra5'1Qq6(!AaF81QqWIQqQSTVxj(Yf&ll5"547FJJvr4J4P4P4RE.158VZZ5K5Q5Q5SE/2h../@A

1
V 	tdii(a8 (  J	  	A%%#C!S((+		#q(9n%h&&z2	 	

1 LU	` 	`  ," $  
	 	  Ls   N !N BN N $N ,N .C>N/ ,N*7CN/ ;O
 "N>$#O
 AO
 NN 	N'&N'*N/ /	N;:N;>OO
 
	OO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   r5  )BeautifulSouprg   )
r5   r   rh   ri   r   r   r   r   r   r   zUMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120 Safari/537.36zen-US,en;q=0.9)r?  zAccept-Languagehttpzhttps://)z/contactz/contact-usz/aboutz	/about-usz/teamr   N   r  T)rO   rP   allow_redirectsrR   zhtml.parserr   )r:   z0[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}c              3   B   K   | ]  }|j                         v   y wr   r9   .0xr   s     r    	<genexpr>z(enriquecer_empresa_us.<locals>.<genexpr>  s     "{q1
?"{   )example	youremailtestnoreplyz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)rx   r   r   r   ri   r   website_scrapingrh   r   rN  z" z owner OR CEO OR founderr   zus-enr8  r;  r<  uV   ([A-Z][a-z]+ [A-Z][a-z]+)\s*[,\-–]?\s*(owner|CEO|founder|president|director|manager)
duckduckgorM  z" owner OR CEO OR founderr>  r   rO  r   r   rP  z^([A-Z][a-z]+ [A-Z][a-z]+)z email contactc              3   B   K   | ]  }|j                         v   y wr   rf  rg  s     r    rj  z(enriquecer_empresa_us.<locals>.<genexpr>9  s     Y1qBHHJYrk  )rl  rm  rn  duckduckgo_email)rQ  r6  bs4ra  r:   
startswithr   rstriprX   r   r[   r\   get_textro   rR  anysearchgroupr  r  r,   r3   
IGNORECASEr<  r   rW  )!r3  r   r6   r6  ra  r  headers_reqsite_urlpages_to_trysuffixfound_emailfound_phonefound_personpage_urlrespsoupr\   emailsphonesrW  rz   rQ  resultsr_   snippetmli_queryr^  r_  r<  eq
eq_resultsr   s!                                   @r    r  r    s    ! 2E n+K #*w}}rH++F3( zQ 	?F 4v =>	? $Ra( (	H'||Hk1^bc##s*$TYY>}}S}5 #ZZ([]abF$ """{<z"{{*,K!" '6&,Qi #ZZ([]abF&,Qi $IIhE
 ',{{1~';';'=16Q1E1E1Go.;

3K(	T (E'N(O""#56uyy4 +E*!x8h&&'9:$0E.!  	~Rx/GHNNPE P4tyyAgyNOP 
%%+c1AEE'24FFIImR]] ,-GGAJ,<,<,>E.)-.WWQZ-=-=-?-E-E-GE/*(O**<8
 JJqM
+L>9RSV 	RtdiiaiPQJ	R 	A%%#C!S((+		#q(9n%U8_4(O**:6^,EE'2.E!>FA01
n-	 	

1
 >	\N"VHN;AACB P4!$))BAg)"NO
P 	uuVR(3.w1CC$WY]^  BY8XYY)+gh../AB	
 >	 JJqM L5LY  "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  opportunity_idc           	         t               }g }|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    d|j                  d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   rg   r   r   r   )CNPJLinkedInDecisorCargo do Decisor)rn   valuer   customFieldsr#   rN   zCNPJ: z	Decisor: z (r   z
LinkedIn: r   u   Endereço: ri   z
Email RF: rw   z/notesr   )r;  userIdN)_carregar_campos_ghlr   rq   r   rX   putr   rC   r,   rY   r  )rD   r<   ru   r  r  
campos_idscustom_fieldsmapa
nome_campovalorfield_idlinhass               r    _adicionar_nota_ghlr  F  s    &'JM!IIfb1!IInb9!IInb9!IIor:	D "ZZ\ C
E>>*-  5!ABC 	LL*ON+;<$U+$m4	 Fyy&--&v0H"Iyy &--)E.<Q;RRTUZU^U^_nprUsTttu0v"wyy &--*U>=R<S0T"Uyy&--+eJ>O=P0Q"Ryy&--*U7^<L0M"N	MM*Jzl&9$U+"ii/;G	   		&  		s$   -G* *>G: *	G76G7:	HHc                    t         |    }d|d<   t        |      |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      d}
ddg}|	j                  d      r|j                  d       |	j                  d      r|j                  d       ||
d<   t        |
||d      \  }}|rd}|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&	       n%|d   j                  dt	                d'| d(|        |dz   |d)<   |d*   j                  |	       t        j                  d        d+|d<   t        j                         j                         |d,<   |d   j                  dt	                d-|d    d	t        |       d.       y# t        $ rH}d/|d<   t!        |      |d/<   |d   j                  dt	                d0t!        |              Y d}~yd}~ww xY w)1z3Enriquece lista de empresas e cria contatos no CRM.r   r   r   r   r   r   z] Enriquecendo (rx   r   r   d   iNr   rh   rg   ri   r   r   )r5   rh   ri   r   r   r   zlista-enriquecidaenriquecedorr   zlinkedin-encontrador   zcnpj-encontradord   Enriquecimento)r   )r  r   u   ] ✓ u    → CRM (fone:    —z | LinkedIn: simu   nãor   u   ] ✗ u    → erro CRM: r   r   r   r   u   ] Concluído: z enviados ao CRMr   r  )r  r   r   r   r   r  r   r   r   r  r  r  r   r  r	  r,   r]   )r   r.  r<   ru   rF   r   r   r   r3  r  rc   rd   rD   errr  r  r  ra   s                     r    run_enriquecedorr  w  s    v,C"CMx=CL:8(2 .	OA|8}+K35')9!A#aHcR^Q_`a3v;#%!&k$%0F&|4E 		.1A\!IIj"57B/'!IIj"5		&"-D (8Dyy(12yy -.DL/e[QabOJ!%8,Bj%k8\l-)B $J{EZhi$%*%F""wf\N 3#ii
3<u= >!*/))N*C PPQS F""QsugVL>QTPU#VW 1uCL&JJqM].	` $H&lln668NFwnS)9%:$;1S]OK[\	
  8H!fFFQsugXc!fX6778s   I3J 	K#>KK#z/loginGETPOST)methodsc                  t   t         j                  rt        t        d            S t        j
                  dk(  rt        j                  j                  d      xs dj                         j                         } t        j                  j                  d      xs dj                         }t        |       }|rnt        ||      rb|j                  st        dd       t        d      S t        |d	
       t!        t#        |j$                               t        t        d            S t        dd       t        d      S )Nindexr  ri   rg   senha4Conta inativa. Entre em contato com o administrador.r   z
login.htmlT)rememberzE-mail ou senha incorretos.)r   is_authenticatedr	   r
   r   methodformr   r:   r9   r   r   ativor   r   r   r   intrn   )ri   r  users      r    r   r     s    $$())~~!!'*0b779??A!!'*0b779&OD%0::LgV&|44td+S\*GG,--+W5<((r"   z/logoutc                  >    t                t        t        d            S )Nr   )r   r	   r
   r-   r"   r    logoutr    s     MGG$%%r"   z/adminc                  ~    t         j                  dk7  rt        t        d            S t	               } t        d|       S )Nsuper_adminr  z
admin.htmlusuarios)r   planor	   r
   r   r   r  s    r    adminr    s7     ]*()) H<(;;r"   z/admin/criar-usuarioc                  f   t         j                  dk7  r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        | |||      \  }}|rt        d	| d
       nt        d|  dd       t        t        d            S )Nr  r  r5   rg   ri   r  r  betau   Erro ao criar usuário: r   u	   Usuário z criado com sucesso.successr  )
r   r  r	   r
   r   r  r   r:   r   r   )r5   ri   r  r  r  r   s         r    admin_criar_usuarior    s     ]*())LLV$*113D\\g&,"335E\\g&,"335E\\g&0&779EtUE59JD$(/9	$34i@GG$%%r"   z/admin/toggle-usuario/<int:uid>c                     t         j                  dk7  rt        t        d            S t	        j
                  |       }|r|j                  rdnd}t        | |       t        t        d            S )Nr  r  r   rx   )r  r  )r   r  r	   r
   r   r   r  r   )uidr  novo_statuss      r    admin_toggle_usuarior    sY     ]*())88C=D::a1#[1GG$%%r"   z /admin/deletar-usuario/<int:uid>c                     t         j                  dk7  rt        t        d            S t	        |       t         j
                  k7  rt        |        t        t        d            S )Nr  r  r  )r   r  r	   r
   r]   rn   r   )r  s    r    admin_deletar_usuarior    sJ     ]*())
3x<??"GG$%%r"   r   c                      t        d      S )Nz
index.html)r   r-   r"   r    r  r    s     <((r"   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<   rg   bearer    NFu   Token obrigatório)r  r   r   r   rE   r@   r>   rK   z	/api/tagsr#   rA  rR   TUnnichat)r  r   location_namerE   u   Token inválido (HTTP r   z"Timeout ao conectar com o Unnichatru   z$token e location_id sao obrigatoriosz/opportunities/pipelinesry   r|   zCredenciais invalidas (HTTP 	pipelines/locations/r  locationrk   stagesrn   )rn   rk   )rn   rk   r  )r  r   r  r  zTimeout ao conectar com o CRM)r   get_jsonr   r:   r9   ru  r   rX   rZ   r[   
exceptionsTimeoutr,   r]   r   rC   r)   r   )rm   r   r<   rE   rO   r_   ra   ru   pipelines_rawr  r_locloc_datar  r   sr  s                   r    api_conectarr    s    D$-446<<>HXXg$"++-E{{}	*ab	!e-ABCSHH :/28b??A	?&'%(9:G-:)*i8'SUVA}}#d
U_r   A  B  B%3I!--XY1Z[\^aaa 88M*0b779Ke-STUWZZZ&;LLj01 ' +.	
 ==C%3OPQP]P]^_1`abdggg["5#	LL*K}5$U+E
   C' ::<LLR044V< #||F+#"  	 	[AJK%%PXZ\J]^QQUU4[!%%-@^F^AEE$KvRXYZ	[ ddmnooW ""** 	]%1UVWY\\\ 	?%Q893>>	?B  		
 _
 && Te-LMNPSSS ;eSV45s::;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/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 |st        ddi      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                         }	|d
k(  r|r|r|st        ddi      dfS | j                  d      xs dj                         j                         }
t        | j                  dd            }t        dt        d|            }t        |||      }t        j                  t         ||||||||||	|
|fd      }|j#                          t        |d| dd      S )Nr   r  i  r   rg   r6   r   r   r   r  r<   zNicho e cidade sao obrigatoriosr   zCredenciais do CRM incompletas.ru   rF   r   rE   zDCredenciais do CRM incompletas. Configure o CRM antes de prospectar.r   BRr   Fr   rR   TtargetargsdaemonJob z	 iniciador   mensagem)r   r  r   r   r  r   r:   r  r9   upperboolmaxr   r-  	threadingThreadr  start)rm   r   r6   r   r   r<   ru   rF   r   rE   r   r   r   r   s                 r    
prospectarr  Y  sL     VWXZ]]]DXXg$"++-Ehhx &B--/F(#)r*F$-446<<>HXXg$"++-E ABCSHH ABCSHH 88M*0b779K88M*0b779K$*113HXXo.4";;=M5++( fghjmmmHHV$++-335Dtxx(=uEFCV$%Fuff-FeVVUKhX`boqu  xK  L	A
 GGIfD	2JKLLr"   z/status/<job_id>c                    t         j                  |       }|st        ddi      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   d
      S )Nr   Job nao encontrado  r   r   r   r  r   r   rn   r   r   ir   r   )
rn   r   r   r   pctr   r   r   r   r   )r  r   r   round)r   r   r  s      r    r   r     s     ((6
C 456;;
C
7|aS%G4;<
8}#$ih-%W./FCD!FN+W  r"   z/jobsc                  v   g } t        t        j                         d d      d d D ]  }|j                  dd      }| j	                  |d   ||j                  dd	      |j                  d
d	      |j                  d|j                  dd            |d   |d   |d   |d   |d   |d   d        t        |       S )Nc                     | d   S r  r-   )js    r    r"  zlistar_jobs.<locals>.<lambda>  s
    1[> r"   T)r%  reverser#   r  r  rn   r   r  r6   r   r   r   r   r   r   r  r   )rn   r  r   r6   r   r   r   r   r   r  r   )r)  r  valuesr   r   r   )listar   r  s      r    listar_jobsr    s     Edkkm)A4PQTRTU wwv|,d)WWWe,ggh.ggh(;<(m[)\!"23[)/
 	 5>r"   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   r   r  r  z marcado para cancelamentor  r   r   r   r   s     r    cancelarr    s~     ((6
C 456;;
8}::"9#h- JKLcQQCMJ$vh.H IJKKr"   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   r   r  r  z* pausado - enviando leads coletados ao CRMr  r  s     r    pausarr     s~     ((6
C 456;;
8}::"9#h- JKLcQQCMJ$vh.X YZ[[r"   z/enriquecerc            	         d} d}d}d}g }t         j                  rt        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 rt         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%        j&                  t(        ||| |||fd      }|j+                          t!        |dt-        |       dd      S )zIRecebe CSV com nomes de empresas ou lista JSON, enriquece e envia ao CRM.rg   r<   ru   rF   r   r.  arquivozutf-8ignore)errorsr   r   lista_textor   zNenhuma empresa na listar   !   Token e Location ID obrigatóriosNr  Tr  zEnriquecendo z	 empresasr  )r   is_jsonr  r   r:   r  filesreaddecodecsvreaderioStringIOr9   r   
splitlinesr   r2  r  r  r  r  r   )r<   ru   rF   r   r.  rm   fcontentr  rowr  linhar5   r   r   s                  r    
enriquecerr    s    EKKHH!'"(b//1xx.4";;=xx.4";;=HHZ(.B55788J+!!'*0b779||''6<"CCE||''6<"CCELL$$Z06B==? %i(Affhoogho?GZZG 45F 43q6<<>c!flln.B.B.D	.QOOCFLLN34
 ||''6<"CCEx$//1 *{{}OOD)*
  :;<cAA CDEsJJ~HX&Fh{KJ	A
 GGIfM#h-PY2Z[\\r"   z3/opt/mia/workspace/prospeccao_ativa/ghl_campos.jsonr  TEXTz00.000.000/0001-00)rk   dataTypeplaceholderr  zhttps://linkedin.com/in/...r  u   Nome do sócio/decisorr  u   Ex: Sócio-Administradorc                      	 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+   r,   r-   r"   r    r  r    sP    ::k33566   I  Is   :A   	AAcamposc                 t    	 t         j                  t        j                  |              y # t        $ r Y y w xY wr   )r  r1   r)   r2   r,   )r  s    r    _salvar_campos_ghlr    s0    tzz&12 s   (+ 	77z/api/configurar-campos-ghlc            
         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                         }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 t        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.T)forcer<   rg   ru   r   r  r   r  r  Nr  z/customFieldsr#   rA  rR   r  rn   rk   Fmodelr   	objectKeyr  r   )rk   r  positionrN   rQ   customFieldr   opportunoportunidadecontatoz (tipo: r   rW   <   rT   r   zsem resposta)criadosja_existiamerrosr  )r   r  r   r:   r   r9   ru  r  rX   r   rC   r[   r)   r,   CAMPOS_ENRIQUECIMENTOr   updaterY   r]   r\   r  )rm   r<   ru   campos_salvosr'  r(  r)  r_list
existentesr  campor5   criado
body_extrar;  r_   r  r  obj_keyr  ra   r`   s                         r    configurar_campos_ghlr3  "  s    $'-2DXXg$"++-E88M*0b779K CDEsJJ {{}	*ab	!(*MGKEjK=> '

 
$[[]&&~r: D89d
155,2245D
 ' %+V}:",T"2M$t$#]3k=5QSUV 	J $%
2CQRSJ'MMjK=F(/	 ==J.668D $ 7 =2BB4HZDHHUYNH#xx6<"AA+NrRVRZRZ[fhqRrG.6d+1;s7|?Q?Q?S1S~Yb$xvQ'?@!% /	. $m3%ffhll9affSbk: LLD6C5)*K%+N }%"	  Y  
@  vRAs}56  %$%s>   7BL
 DL)-M
LL	M%"MMM#"M#z/api/campos-ghlc                  (    t        t                     S )z$Retorna os campos salvos localmente.)r   r  r-   r"   r    listar_campos_ghlr5  u  s     ')**r"   __main__z)Iniciando Prospeccao Web na porta 5050...z0.0.0.0i  )hostportdebug)rg   )zGoogle Maps)r  rg   r  F)rg   rg   r   )e__doc__sysospathinsertr&  r  r  rX   ro   r)   r  r  r   pathlibr   flaskr   r   r   r   r	   r
   r   flask_loginr   r   r   r   r   authr   r   r   r   r   r   r   r   r   __name__app
secret_keylogin_manager
login_viewlogin_messagelogin_message_categoryuser_loaderr!   r  r(  r&   r(   r.   r4   r]   r;   r   rZ   dictrC   tuplerb   r3   rt   r   r   r   r  r  r  r   r-  r2  r  r  r  r  router   r  r  r  r  r  r  r  r  r   r  r  r   r  r  r*  r  r  r3  r5  printrunr-   r"   r    <module>rP     s  
  	 8 9     	  
 	   T T T [ [ X  X  XHo/S!" F '. $  
  LMC s > >c >c > 2)  C  C -0=@QTY^6 c  c [` @(3 (c (# (TW (\_bf\f (V.6D .6 .63 .6 .6`cfj`j .6d KX8 83 8s 8QT 8(+87:8DG8\a8> @BAFH83 H8s H8C H8 H8H8,/H8>AH8MPH8 H89<H8 H8 ;?H8V/2d s 2dS dT dN\ \c \ \UY \~.C . .# .d .dg .bA8S A8D A8 A8"%A847A8CFA8L 8eV_-) .)$ 9&  &
 8<  < !F84&  5& ,vh?&  @& -x@&  A& 3)  ) ?VH-G;  .G;T =6(+%M  ,%MP   2 7  ( &2L  3L x0\  1\ =6(+5]  ,5]r HI FCWXFC`aFC[\FC]^	 d t  '&:N  ;Nb +  +
 zI	
56GGUG3 r"   