Ë
    «�‘jPi  ã            
       ó  — d 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Zddl	Z	ddl
mZ ddlmZmZ ddlmZ ddlZ ed«      Zedz  Zedz  Zed	z  Zed
z  Zedz  Z ed«      ZdZdZdZdZddddœZdZdZdZ ej@                  ejB                  d ejD                  ed¬«       ejF                  ejH                  «      g¬«        ejJ                  e&«      Z'dede(fd„Z)de*dejV                  fd „Z,d!ejV                  d"e*d#e*fd$„Z-g d%d&d'g d(¢f‘d)d*d+g f‘d,d-d.g f‘d/d*d0g f‘d1d2d3g f‘d4d2d5g f‘d6d7d8g f‘d9d*d:g f‘d;d*d<g f‘d=d*d>g f‘d?d*d@g f‘dAd*dBg f‘dCdDdEg f‘dFd2dGg f‘dHd*dIg f‘dJd2dKg f‘dLd*dMg f‘dNd-dOg f‘dPd*dQg f‘dRd-dSg f‘dTd-dUg f‘dVd*dWg f‘dXd*dYg f‘dZd*d[g f‘d\d*d]g f‘d^d*d_g f‘d`d*dag f‘dbd*dcg f‘ddd*deg f‘dfd*dgg f‘dhd*dig f‘djd*dkg f‘Z.d!ejV                  dle*de(fdm„Z/de*fdn„Z0doe*fdp„Z1dqe*dre*dse*de*fdt„Z2due*de*fdv„Z3due*fdw„Z4due*fdx„Z5dye(de6fdz„Z7dye(d{e(de6fd|„Z8dye(d{e(dle*de(fd}„Z9d!ejV                  dle*d~e*de*dz  fd„Z:d!ejV                  dle*d€e(d�e*dz  de;f
d‚„Z<de(fdƒ„Z=d„e(fd…„Z>d†efd‡„Z?dˆ„ Z@e&d‰k(  r e@«        yy)Ša  
Importacao RD Station -> CRM Linkia (GoHighLevel white-label)
Sub-account: Francisco Borrello
Volume: 25.426 leads
Data: 2026-08-28

Regras:
  - Cria custom fields na location antes de importar
  - Cria SOMENTE contatos (zero oportunidade, zero pipeline)
  - Tag global: rd-import-2026-08-28
  - Tag por estagio: rd-lead | rd-cliente | rd-lead-qualificado
  - Dedupe por email (CREATE se novo, UPDATE se existe)
  - Checkpoint: resume de onde parou se interrompido
  - Backoff exponencial em 429
  - Log a cada 500 processados com ETA
é    N)Údefaultdict)ÚdatetimeÚtimezone)ÚPathz;/opt/mia/workspace/clientes/borrello/importacao_rd_20260828zrd_export.csvz
import.logzcheckpoint.jsonzerros.jsonlzresumo_final.jsonz#/opt/mia/config/linkia_borrello.envz$https://services.leadconnectorhq.comz
2021-07-28zeMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36zrd-import-2026-08-28zrd-leadz
rd-clientezrd-lead-qualificado)ÚleadÚclientezlead qualificadoiô  g¸…ëQ¸¾?é<   z'%(asctime)s [%(levelname)s] %(message)súutf-8©Úencoding)ÚlevelÚformatÚhandlersÚpathÚreturnc                 ó  — i }t        | «      5 }|D ]a  }|j                  «       }|r|j                  d«      rŒ'd|v sŒ,|j                  dd«      \  }}|j                  «       ||j                  «       <   Œc 	 d d d «       |S # 1 sw Y   |S xY w)Nú#Ú=é   )ÚopenÚstripÚ
startswithÚsplit)r   ÚenvÚfÚlineÚkÚvs         úQ/opt/mia/workspace/clientes/borrello/importacao_rd_20260828/importar_rd_linkia.pyÚload_envr    Q   s‰   € Ø
€CÜ	ˆd‹ð +�qØò 	+ˆDØ—:‘:“<ˆDÙ˜4Ÿ?™?¨3Ô/ØØ�dŠ{Ø—z‘z # qÓ)‘��1Ø!"§¡£��A—G‘G“I’ñ	+÷+ð €J÷+ð €Jús   Ž.B ½8B Â B
Útokenc                 ó†   — t        j                  «       }|j                  j                  d| › �t        dt
        ddœ«       |S )NzBearer zapplication/json)ÚAuthorizationÚVersionzContent-Typez
User-AgentÚAccept)ÚrequestsÚSessionÚheadersÚupdateÚAPI_VERSIONÚ
USER_AGENT)r!   Úss     r   Úmake_sessionr-   a   sD   € Ü×ÑÓ€AØ‡I�I×ÑØ" 5 'Ð*ÜØ*Ü Ø$ñô ð €Hó    ÚsessionÚmethodÚurlc           	      óH  — d}t        d«      D ]ƒ  }	  | j                  ||fddi|¤Ž}|j                  dk(  rXt        |t        «      }t
        j                  d|› d|dz   › d�«       t        j                  |«       t        |d	z  t        «      }Œ�|c S  t        d|› d|› �«      ‚# t        j                  j                  $ r_}t        |t        «      }t
        j                  d
|› d|› d�«       t        j                  |«       t        |d	z  t        «      }Y d }~�Œd }~ww xY w)Nr   é
   Útimeouté   i­  z429 rate-limit - aguardando zs (tentativa ú)é   zErro de rede: z - aguardando r,   zFalhou apos 10 tentativas: Ú )ÚrangeÚrequestÚstatus_codeÚminÚMAX_BACKOFFÚlogÚwarningÚtimeÚsleepr&   Ú
exceptionsÚRequestExceptionÚRuntimeError)	r/   r0   r1   ÚkwargsÚbackoffÚattemptÚrespÚwaitÚes	            r   Úapi_requestrK   p   s  € Ø€GÜ˜“9ò 4ˆð	4Ø"�7—?‘? 6¨3ÑE¸ÐE¸fÑEˆDØ×Ñ 3Ò&Ü˜7¤KÓ0�Ü—‘Ð:¸4¸&ÀÈgÐVWÉiÈ[ÐXYÐZÔ[Ü—
‘
˜4Ô Ü˜g¨™k¬;Ó7�ØØŠKð4ô Ð4°V°H¸A¸c¸UÐCÓ
DÐDøô ×"Ñ"×3Ñ3ò 	4Ü�w¤Ó,ˆDÜ�K‰K˜.¨¨¨>¸$¸¸qÐAÔBÜ�J‰J�tÔÜ˜' A™+¤{Ó3ŽGûð		4ús   ’A<B%ÂB%Â%D!ÃADÄD!Úrd_estagio_funilÚDROPDOWNzEstagio no Funil (RD))ÚLeadÚClientezLead QualificadoÚrd_cargoÚTEXTz
Cargo (RD)Úrd_biografiaÚ
LARGE_TEXTzBiografia (RD)Úrd_dono_leadzDono do Lead (RD)Úrd_data_ultima_oportunidadeÚDATEzData Ultima Oportunidade (RD)Úrd_data_ultima_vendazData Ultima Venda (RD)Úrd_valor_ultima_vendaÚMONETARYzValor Ultima Venda (RD)Úrd_lead_scoring_perfilzLead Scoring Perfil (RD)Úrd_lead_scoring_interessezLead Scoring Interesse (RD)Úrd_status_comunicacao_emailzStatus Comunicacao Email (RD)Úrd_url_publicazURL Publica (RD)Úrd_base_legal_comunicacaozBase Legal Comunicacao (RD)Úrd_total_conversoesÚ	NUMERICALzTotal de Conversoes (RD)Úrd_data_primeira_conversaozData Primeira Conversao (RD)Úrd_origem_primeira_conversaozOrigem Primeira Conversao (RD)Úrd_data_ultima_conversaozData Ultima Conversao (RD)Úrd_origem_ultima_conversaozOrigem Ultima Conversao (RD)Úrd_eventos_ultimos_100zEventos Ultimos 100 (RD)Úrd_dddzDDD (RD)Úrd_areas_perdeu_oportunidadez"Areas que Perdeu Oportunidade (RD)Úrd_escolha_recebimentozEscolha Recebimento (RD)Úrd_link_codigo_barraszLink Codigo de Barras (RD)Úrd_curso_interessezCurso de Interesse (RD)Úrd_utm_campaignzUTM Campaign (RD)Úrd_utm_contentzUTM Content (RD)Úrd_utm_mediumzUTM Medium (RD)Úrd_utm_sourcezUTM Source (RD)Úrd_utm_termzUTM Term (RD)Úrd_confirma_participacao_eventoz!Confirma Participacao Evento (RD)Úrd_facebookzFacebook (RD)Ú
rd_twitterzTwitter (RD)Úrd_linkedinzLinkedIn (RD)Úlocation_idc                 ó|  — t         j                  d«       t        | dt        › d|› d�«      }|j                  s(t        d|j                  › d|j                  dd › �«      ‚i }|j                  «       }t        |t        «      r|n|j                  d	g «      }|D ].  }|j                  d
d«      }|j                  dd«      }|d   ||<   Œ0 t         j                  dt        |«      › �«       i }	t        D �]@  \  }
}}}|
|v r(||
   |	|
<   t         j                  d|
› d||
   › d�«       Œ5||dœ}|r$|D �cg c]  }||j                  «       dœ‘Œ c}|d<   t         j                  d|
› d|› d�«       t        | dt        › d|› d�|¬«      }t!        j"                  d«       |j                  rV|j                  «       }|j                  d|«      }|j                  dd«      }||	|
<   t         j                  d|
› d|› �«       �Œt         j%                  d|
› d|j                  › d|j                  dd  › �«       �ŒC |	S c c}w )!zf
    Garante que todos os custom fields existam na location.
    Retorna dict {rd_key: field_id}.
    z2Carregando custom fields existentes na location...ÚGETz/locations/z/customFieldszErro ao listar custom fields: r8   Ni,  ÚcustomFieldsÚfieldKeyÚ zcontact.ÚidzCustom fields ja existentes: z  [ok] z ja existe (r6   )ÚnameÚdataType)ÚlabelÚvalueÚoptionsz  Criando custom field: z (z)...ÚPOST©Újsongš™™™™™Ù?ÚcustomFieldz  [criado] z -> z	  [ERRO] ú: éÈ   )r>   ÚinforK   ÚAPI_BASEÚokrD   r;   Útextr‚   Ú
isinstanceÚlistÚgetÚreplaceÚlenÚCUSTOM_FIELDS_SPECÚlowerr@   rA   Úerror)r/   rt   rH   ÚexistingÚdataÚfields_listr   ÚkeyÚ	short_keyÚfield_id_mapÚrd_keyÚ	data_typer}   r   ÚpayloadÚoÚcreatedÚcfÚfids                      r   Úensure_custom_fieldsrŸ   ¬   sW  € ô
 ‡H�HÐAÔBÜ�w Ü"˜ ;¨{¨m¸=ÐIóK€Dà�7Š7ÜØ,¨T×-=Ñ-=Ð,>¸aÀÇ	Á	È$È3ÀÐ?PÐQó
ð 	
ð €HØ�9‰9‹;€DÜ$ T¬4Ô0‘$°d·h±h¸~ÈrÓ6R€KØò &ˆØ�e‰e�J Ó#ˆà—K‘K 
¨BÓ/ˆ	Ø ™gˆ�Òð	&ô ‡H�HÐ,¬S°«]¨OÐ<Ô=à€LÜ/Aó RÑ+ˆ�˜E 7Ø�XÑØ#+¨FÑ#3ˆL˜Ñ Ü�H‰H�w˜v˜h l°8¸FÑ3CÐ2DÀAÐFÔGØð Ø!ñ
ˆñ ØLSÖ!TÀq¨A¸¿¹»	Ó"BÒ!TˆG�IÑä�‰Ð+¨F¨8°2°i°[ÀÐEÔFÜØ�VÜˆj˜ K =°Ð>Øô
ˆô
 	�
‰
�3Œà�7Š7Ø—i‘i“kˆGØ—‘˜]¨GÓ4ˆBØ—&‘&˜˜rÓ"ˆCØ#&ˆL˜Ñ Ü�H‰H�{ 6 (¨$¨s¨eÐ4Ö5ä�I‰I˜	 & ¨¨D×,<Ñ,<Ð+=¸Q¸t¿y¹yÈÈ#¸Ð>OÐPÖQð9Rð> Ðùò) "Us   Ä3H9c                 ó    — | syt        | «      j                  «       j                  d«      j                  «       }|j                  «       dvr|S dS )Nry   ú")ry   z""Únone)Ústrr   r�   ©Úvalr   s     r   Úcleanr¦   ë   sE   € ÙØÜˆC‹�‰Ó×Ñ˜sÓ#×)Ñ)Ó+€AØ—‘“	Ð!3Ñ3ˆ1Ð;¸Ð;r.   Únomec                 ó|   — t        | «      j                  dd«      }|r|d   nd}t        |«      dkD  r|d   nd}||fS )Nr8   r   r   ry   )r¦   r   rŽ   )r§   ÚpartsÚfirstÚlasts       r   Ú
parse_namer¬   ò   sD   € Ü�$‹K×Ñ˜c 1Ó%€EÙˆE�!ŠH 2€EÜ˜5“z A’~ˆ5�Š8¨2€DØ�$ˆ;Ðr.   ÚcelularÚtelefoneÚwhatsappc                 ó:   — | ||fD ]  }t        |«      }|sŒ|c S  y©Nry   )r¦   )r­   r®   r¯   r¥   r   s        r   Úparse_phoner²   ù   s.   € Ø˜ 8Ð,ò ˆÜ�#‹JˆÚØŠHðð r.   r¥   c                 óf   — t        | «      }|sy	 |j                  d«      d   S # t        $ r Y yw xY w)z4Converte '2026-08-23 19:04:20 -0300' -> 'YYYY-MM-DD'ry   r8   r   )r¦   r   Ú	Exceptionr¤   s     r   Ú
parse_daterµ     s:   € äˆc‹
€AÙØðØ�w‰w�s‹|˜A‰ÐøÜò Ùðúó   �$ ¤	0¯0c                 óÔ   — t        | «      }|r|j                  «       dv ry 	 t        |j                  dd«      j                  dd«      j	                  «       «      S # t
        $ r Y y w xY w)N)ÚdÚ0ry   Ú,ú.zR$ry   )r¦   r�   Úfloatr�   r   r´   r¤   s     r   Úparse_monetaryr½     sa   € Üˆc‹
€AÙ�—‘“	˜^Ñ+ØðÜ�Q—Y‘Y˜s CÓ(×0Ñ0°°rÓ:×@Ñ@ÓBÓCÐCøÜò Ùðús   ¢8A Á	A'Á&A'c                 óf   — t        | «      }|sy 	 t        t        |«      «      S # t        $ r Y y w xY w©N)r¦   Úintr¼   r´   r¤   s     r   Ú	parse_intrÁ     s6   € Üˆc‹
€AÙØðÜ”5˜“8‹}ÐøÜò Ùðúr¶   Úrowc           	      ó,  — t         g}t        | j                  d| j                  dd«      «      «      j                  «       }t        j                  |«      }|r|j                  |«       t        | j                  dd«      «      }|rr|j                  d«      D ]^  }|j                  «       }|sŒ|j                  «       j                  dd«      }dt        |«      cxk  rd	k  sŒKn ŒN|j                  |«       Œ` t        t        j                  |«      «      S )
NzEstagio no funilõ   EstÃ¡gio no funilry   ÚTagsrº   r8   Ú-r   éd   )Ú
TAG_GLOBALr¦   rŒ   r�   ÚTAG_ESTAGIOÚappendr   r   r�   rŽ   r‹   ÚdictÚfromkeys)rÂ   ÚtagsÚestagioÚtag_eÚrd_tags_rawÚtÚt_cleans          r   Ú
build_tagsrÓ      sÜ   € Üˆ<€Dä�C—G‘GÐ.°·±Ð8KÈRÓ0PÓQÓR×XÑXÓZ€GÜ�O‰O˜GÓ$€EÙØ�‰�EÔä˜Ÿ™ ¨Ó+Ó,€KÙØ×"Ñ" 3Ó'ò 	)ˆAØ—‘“	ˆAÚØŸ'™'›)×+Ñ+¨C°Ó5�à”s˜7“|Ô* sÖ*Ø—K‘K Õ(ð	)ô ”—‘˜dÓ#Ó$Ð$r.   r—   c                 ó¼  ‡ — ˆ fd„}g dt         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘dt         |d	«      «      f‘d
t         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘dt         |d«      «      f‘d t         |d!«      «      f‘d"t         |d#«      «      f‘d$t         |d%«      «      d&d' f‘d(t         |d)«      «      f‘d*t         |d+«      «      d&d' f‘d,t         |d-«      «      d&d. f‘d/t         |d0«      «      f‘d1t         |d2«      «      f‘d3t         |d4«      «      f‘d5t         |d6«      «      f‘d7t         |d8«      «      f‘d9t         |d:«      «      f‘d;t         |d<«      «      f‘d=t         |d>«      «      f‘d?t         |d@«      «      f‘dAt         |dB«      «      f‘dCt         |dD«      «      f‘}g }|D ]c  \  }}|j	                  |«      }|sŒ|�|dEk(  rŒ"t        |t        «      r|j                  ||dFœ«       ŒG|j                  |t        |«      dFœ«       Œe |S )GzCMonta lista de {id, value} para customFields no payload do contato.c                 ó(   •— ‰j                  | d«      S r±   )rŒ   )r{   rÂ   s    €r   Úcolz build_custom_values.<locals>.col9  s   ø€ à�w‰w�t˜RÓ Ð r.   rL   rÄ   rP   ÚCargorR   Ú	BiografiarT   zDono do LeadrU   u   Data da Ãºltima oportunidaderW   u   Data da Ãºltima vendarX   u   Valor da Ãºltima vendarZ   zLead Scoring - Perfilr[   zLead Scoring - Interesser\   u#   Status para comunicaÃ§Ã£o por emailr]   u   URL pÃºblicar^   u   Base legal para comunicaÃ§Ã£or_   u   Total de conversÃµesra   u   Data da primeira conversÃ£orb   u   Origem da primeira conversÃ£orc   u   Data da Ãºltima conversÃ£ord   u   Origem da Ãºltima conversÃ£ore   u   Eventos (Ãšltimos 100)Ni   rf   ÚDDDrg   u/   Em que Ã¡reas vocÃª perdeu alguma oportunidade?rh   uC   Escolha o que vocÃª quer receber (pode marcar mais que uma opÃ§Ã£o)iÐ  ri   u   Link CÃ³digo de Barrasrj   zQual curso de interesserk   Úutm_campaignrl   Úutm_contentrm   Ú
utm_mediumrn   Ú
utm_sourcero   Úutm_termrp   u,   VocÃª confirma sua participaÃ§Ã£o no evento?rq   ÚFacebookrr   ÚTwitterrs   ÚLinkedinry   )rz   r~   )	r¦   rµ   r½   rÁ   rŒ   rŠ   r¼   rÊ   r£   )rÂ   r—   rÖ   ÚmappingÚresultr•   r~   rž   s   `       r   Úbuild_custom_valuesrä   5  sk  ø€ ô!ðAØ	Ü	‰sÐ&Ó'Ó	(ð	*ðAð 
Ü	‰s�7‹|Ó	ð	ðAð
 
Ü	‰s�;ÓÓ	 ð	"ðAð 
Ü	‰s�>Ó"Ó	#ð	%ðAð 
'Ü	‘CÐ6Ó7Ó	8ð	:ðAð 
 Ü	‘CÐ/Ó0Ó	1ð	3ðAð 
!Ü	™Ð4Ó5Ó	6ð	8ðAð 
"Ü	‰sÐ*Ó+Ó	,ð	.ðAð" 
%Ü	‰sÐ-Ó.Ó	/ð	1ð#Að& 
'Ü	‰sÐ8Ó9Ó	:ð	<ð'Að* 
Ü	‰s�>Ó"Ó	#ð	%ð+Að. 
%Ü	‰sÐ2Ó3Ó	4ð	6ð/Að2 
Ü	‘3Ð-Ó.Ó	/ð	1ð3Að6 
&Ü	‘CÐ5Ó6Ó	7ð	9ð7Að: 
(Ü	‰sÐ2Ó3Ó	4ð	6ð;Að> 
$Ü	‘CÐ4Ó5Ó	6ð	8ð?AðB 
&Ü	‰sÐ1Ó2Ó	3ð	5ðCAðF 
"Ü	‰sÐ+Ó,Ó	-¨e¨tÐ	4ð	6ðGAðJ 
Ü	‰s�5‹zÓ	ð	ðKAðN 
(Ü	‰sÐDÓEÓ	FÀuÈÐ	Mð	OðOAðR 
"Ü	‰sÐXÓYÓ	ZÐ[`Ð\`Ð	að	cðSAðV 
!Ü	‰sÐ+Ó,Ó	-ð	/ðWAðZ 
Ü	‰sÐ,Ó-Ó	.ð	0ð[Að^ 
Ü	‰s�>Ó"Ó	#ð	%ð_Aðb 
Ü	‰s�=Ó!Ó	"ð	$ðcAðf 
Ü	‰s�<Ó Ó	!ð	#ðgAðj 
Ü	‰s�<Ó Ó	!ð	#ðkAðn 
Ü	‰s�:‹Ó	ð	!ðoAðr 
+Ü	‰sÐAÓBÓ	Cð	EðsAðv 
Ü	‰s�:‹Ó	ð	!ðwAðz 
Ü	‰s�9‹~Ó	ð	 ð{Að~ 
Ü	‰s�:‹Ó	ð	!ðA€GðF €FØò 
<‰
ˆˆUØ×Ñ˜sÓ#ˆÙØØˆ=˜E RšKØä�eœUÔ#Ø�M‰M ¨uÑ5Õ6à�M‰M ¬s°5«zÑ:Õ;ð
<ð €Mr.   c           	      ó  — t        | j                  dd«      «      \  }}t        | j                  dd«      | j                  dd«      | j                  dd«      «      }t        | «      }t	        | |«      }|||t        | j                  dd«      «      ||dœ}|r||d<   t        | j                  d	| j                  d
d«      «      «      }	|	r|	|d<   t        | j                  dd«      «      }
|
r|
|d<   t        | j                  dd«      «      }|r||d<   t        | j                  d| j                  dd«      «      «      }|r||d<   t        | j                  dd«      «      }|r||d<   t        | j                  dd«      «      }|r||d<   |S )NÚNomery   ÚCelularÚTelefoneÚWhatsappÚEmail)Ú
locationIdÚ	firstNameÚlastNameÚemailrÍ   rw   Úphoneu   PaÃ­sÚPaisÚcountryÚEstadoÚstateÚCidadeÚcityu   Data de aniversÃ¡riozData de aniversarioÚdateOfBirthÚWebsiteÚwebsiteÚEmpresaÚcompanyName)r¬   rŒ   r²   rÓ   rä   r¦   rµ   )rÂ   r—   rt   rª   r«   rï   rÍ   Úcustom_valuesrš   rñ   ró   rõ   Údobrø   Úcompanys                  r   Úbuild_contact_payloadrþ   �  s‰  € Ü˜SŸW™W V¨RÓ0Ó1�K€Eˆ4ÜØ�‰�	˜2ÓØ�‰�
˜BÓØ�‰�
˜BÓó€Eô
 �c‹?€DÜ'¨¨\Ó:€Mð "ØØÜ�s—w‘w˜w¨Ó+Ó,ØØ%ñ€Gñ Ø ˆ�Ñä�C—G‘G˜G S§W¡W¨V°RÓ%8Ó9Ó:€GÙØ$ˆ�	Ñä�#—'‘'˜( BÓ'Ó(€EÙØ ˆ�Ñä�—‘˜ 2Ó&Ó'€DÙØˆ�‰ä
�S—W‘WÐ3°S·W±WÐ=RÐTVÓ5WÓXÓ
Y€CÙ
Ø!$ˆ�Ñä�C—G‘G˜I rÓ*Ó+€GÙØ$ˆ�	Ñä�C—G‘G˜I rÓ*Ó+€GÙØ!(ˆ�Ñà€Nr.   rî   c           	      ó  — t        | dt        › d�||ddœ¬«      }|j                  sy |j                  «       }|j	                  dg «      }|D ]:  }|j	                  dd«      j                  «       |j                  «       k(  sŒ5|d	   c S  y )
Nrv   ú
/contacts/é   )rë   ÚqueryÚlimit©ÚparamsÚcontactsrî   ry   rz   )rK   r‡   rˆ   r‚   rŒ   r�   )r/   rt   rî   rH   r“   r  Úcs          r   Úfind_contact_by_emailr  Å  s�   € ô Ø�Üˆ*�JÐØ)°EÀAÑFô€Dð
 �7Š7ØØ�9‰9‹;€DØ�x‰x˜
 BÓ'€HØò ˆØ�5‰5�˜"Ó×#Ñ#Ó%¨¯©«Ó6Ø�T‘7ŠNðð r.   rš   Úexisting_idc                 ó®  — |rIt        | dt        › d|› �|¬«      }|j                  r|dfS |d|j                  › d|j                  dd › �fS t        | d	t        › d�|¬«      }|j                  r6|j                  «       }|j                  d
|«      }|j                  dd«      dfS |j                  dk(  rt	 |j                  «       }|j                  d«      xs |j                  dd«      }|r(t        | dt        › d|› �|¬«      }	|	j                  r|dfS dd|j                  dd › �fS dd|j                  › d|j                  dd › �fS # t        $ r Y Œ@w xY w)zLReturns (contact_id, action) where action in 'created'|'updated'|'error:...'ÚPUTr   r�   Úupdatedzerror:ú:Nr…   r€   Úcontactrz   ry   rœ   i�  Ú	contactIdz
error:400:)rK   r‡   rˆ   r;   r‰   r‚   rŒ   r´   )
r/   rt   rš   r	  rH   r“   r  Úerr_dataÚcidÚresp2s
             r   Úupsert_contactr  Ú  sŠ  € ñ ÜØ�UÜˆj˜
 ; -Ð0Øô
ˆð
 �7Š7Ø 	Ð)Ð)à &¨×)9Ñ)9Ð(:¸!¸D¿I¹IÀdÀs¸OÐ;LÐ MÐMÐMäØ�VÜˆj˜
Ð#Øô
ˆð
 �7Š7Ø—9‘9“;ˆDØ—h‘h˜y¨$Ó/ˆGØ—;‘;˜t RÓ(¨)Ð3Ð3Ø×Ñ Ò$ðØŸ9™9›;�Ø—l‘l ;Ó/ÒI°8·<±<ÀÀbÓ3I�ÙÜ'Ø Ü#˜* J¨s¨eÐ4Ø$ô�Eð
 —x’xØ" I˜~Ð-ð ˜ D§I¡I¨d¨s OÐ#4Ð5Ð5Ð5à˜ × 0Ñ 0Ð1°°4·9±9¸T¸c°?Ð2CÐDÐDÐDøô	 ò Ùðús   Â4AE Å	EÅEc                  óÆ   — t         j                  «       r/	 t        t         «      5 } t        j                  | «      cd d d «       S i S # 1 sw Y   i S xY w# t
        $ r Y i S w xY wr¿   )ÚCHECKPOINT_PATHÚexistsr   r‚   Úloadr´   )r   s    r   Úload_checkpointr    sc   € Ü×ÑÔð	Ü”oÓ&ð $¨!Ü—y‘y “|÷$ñ $ð €I÷	$ð €Iûô ò 	ØØ€Ið	ús-   –A ¥Aº	A ÁAÁA ÁA Á	A ÁA Úckptc                 óÊ   — t        t        «      dz   }t        |d«      5 }t        j                  | |«       d d d «       t        j                  |t        «       y # 1 sw Y   Œ$xY w)Nz.tmpÚw)r£   r  r   r‚   ÚdumpÚosr�   )r  Útmpr   s      r   Úsave_checkpointr    sM   € Ü
ŒoÓ
 Ñ
'€CÜ	ˆc�3‹ð ˜1Ü�	‰	�$˜Ô÷ä‡J�Jˆs”OÕ$÷ð ús   ŸAÁA"Úcsv_pathc           
   #   óü   K  — t        j                  dddddt        | «      gd¬«      }|j                  j	                  dd	¬
«      }t        j                  t        j                  |«      d¬«      }|D ]  }|–— Œ y ­w)NÚiconvz-fzUTF-16z-tzUTF-8T)Úcapture_outputr
   r�   )Úerrorsú	)Ú	delimiter)	Ú
subprocessÚrunr£   ÚstdoutÚdecodeÚcsvÚ
DictReaderÚioÚStringIO)r   ÚprocÚcontentÚreaderrÂ   s        r   Ú	iter_rowsr2     ss   è ø€ Ü�>‰>Ø	�$˜ $¨´°X³Ð?Øô€Dð �k‰k× Ñ  °Ð Ó;€GÜ�^‰^œBŸK™K¨Ó0¸DÔA€FØò ˆØ‹	ñùs   ‚A:A<c                  ó8  — t        j                   «       } t        j                  d«       t        j                  d«       t        j                  dt        › �«       t        j                  dt	        j
                  t        j                  «      j                  «       › �«       t        j                  d«       t        t        «      }|d   }|d   }t        j                  d|› �«       t        |«      }t        j                  d«       t        ||«      }t        j                  d	t        |«      › �«       t        «       }t        |j!                  «       «      }t        j                  d
t        |«      › d�«       d}d}	d}
d}d}t#        t$        «      }t'        t(        dd¬«      }t        j                  d«       	 t+        t        «      D �])  }t-        |j/                  dd«      «      j1                  «       }|s |dz  }|dk  rt        j3                  d«       ŒO||v r|dz  }ŒY|dz  }t5        |||«      }t        j6                  t8        «       	 t;        |||«      }t-        |j/                  dd«      «      j1                  «       }tJ        j/                  |«      }|r||xx   dz  cc<   |tL        xx   dz  cc<   tO        ||||«      \  }}t        j6                  t8        «       d|v rU|dz  }|jA                  tC        jD                  ||dœd¬«      dz   «       d ||<   t        j?                  d!|› d"|› d|› �«       n|d#k(  r|	dz  }	|||<   n|d$k(  r
|
dz  }
|||<   |d%z  dk(  rtI        |«       |tP        z  dk(  s�Œ³t        j                   «       | z
  }|t        |«      z   }d&}tS        d||z
  «      }|dkD  r||z  nd}|dkD  r||z  d'z  nd}t        j                  d(|› d)|	› d*|
› d+|› d,|d-›d.�«       �Œ, 	 tI        |«       |jU                  «        t        j                  d/«       t        j                  d0«       t        j6                  d1«       d }tW        |d2tX        › d3�|dd4œ¬5«      }|jZ                  rI|jC                  «       j/                  d6i «      } | j/                  d7«      }t        j                  d8|› �«       g }!|j]                  «       D ��"cg c]  \  }}"|"d9vrt        |"«      dkD  r||"f‘Œ }#}}"t_        j`                  |#tc        d:t        |#«      «      «      }$|$D �]&  \  }%}tW        |d2tX        › d3|› �«      }|jZ                  rå|jC                  «       j/                  d;|jC                  «       «      }&|!je                  |&j/                  d<«      |&j/                  d=«      |&j/                  d>«      |&j/                  d?g «      d d t        |&j/                  d@g «      «      |&j/                  d@g «      xs g d dA D �'ci c]%  }'|'j/                  dBd«      |'j/                  dCd«      “Œ' c}'dDœ«       t        j6                  t8        «       �Œ) t        j                   «       | z
  }(|t        |«      z   })t	        j
                  t        j                  «      j                  «       tg        |(d'z  d«      |)|	|
|||t        |«      tL        tJ        ti        |«      |!dEœ}*t'        tj        dFd¬«      5 }+tC        jl                  |*|+ddG¬H«       d d d «       t        j                  d«       t        j                  dI«       t        j                  dJ|)› �«       t        j                  dK|	› �«       t        j                  dL|
› �«       t        j                  dM|› �«       t        j                  dN|› �«       t        j                  dO|› �«       t        j                  dP|(d'z  dQ›dR�«       t        j                  dStj        › �«       t        j                  d«       to        dT«       to        tC        jD                  |*ddG¬H«      «       to        dU«       |*S # t<        $ r‰}t        j?                  d|› d|› �«       |jA                  tC        jD                  |tG        |«      dœd¬«      dz   «       |dz  }d||<   tI        |«       t        j6                  t8        «       Y d }~�Œd }~ww xY w# tI        |«       |jU                  «        w xY wc c}"}w c c}'w # 1 sw Y   �ŒxY w)VNzF======================================================================z0Iniciando importacao RD -> CRM Linkia (Borrello)zCSV: zInicio: ÚLINKIA_BORRELLO_LOCATION_IDÚLINKIA_BORRELLO_TOKENzLocation ID: z--- ETAPA 1: Custom Fields ---zCustom fields prontos: zCheckpoint carregado: z emails ja processadosr   Úar
   r   z'--- ETAPA 2: Importacao de contatos ---rê   ry   r   r3   zLinha sem email ignoradazErro payload r„   )rî   r‘   F)Úensure_asciiÚ
ÚERROR_PAYLOADrÄ   r‘   )rî   ÚactionÚERRORzERRO [z] rœ   r  rÇ   iRc  r	   zprocessados=z
, criados=z
, updated=z, erros=z, ETA=z.0fr<   z--- ETAPA 3: Validacao ---z$Aguardando 30s para indexacao GHL...r5   rv   r   )rë   r  r  ÚmetaÚtotalz"Total contatos na location (GHL): )r;  r9  r  r  rî   rì   rí   rÍ   rw   é   rx   r~   )rî   rì   rí   rÍ   ÚcustomFields_countÚcustomFields_sample)Ú	timestampÚduracao_minutosÚtotal_processadosÚcriadosÚatualizadosÚerrosÚignorados_sem_emailÚtotal_ghl_locationÚcustom_fields_prontosÚ
tag_globalÚtags_estagioÚtag_distribuicaoÚamostrasr  r7   )r7  ÚindentzIMPORTACAO CONCLUIDAzProcessados:   zCriados:       zAtualizados:   zErros:         zSem email:     zTotal GHL:     zTempo total:   z.1fz minzResumo salvo:  z
===RESULTADO_IMPORTACAO===z
===FIM===
)8r@   r>   r†   ÚCSV_PATHr   Únowr   ÚutcÚ	isoformatr    ÚENV_PATHr-   rŸ   rŽ   r  ÚsetÚkeysr   rÀ   r   ÚERRORS_PATHr2  r¦   rŒ   r�   r?   r  rA   ÚDELAY_BETWEEN_REQSrþ   r´   r‘   Úwriter‚   Údumpsr£   r  rÉ   rÈ   r  ÚLOG_INTERVALÚmaxÚcloserK   r‡   rˆ   ÚitemsÚrandomÚsampler<   rÊ   ÚroundrË   ÚSUMMARY_PATHr  Úprint),Ú
start_timer   rt   r!   r/   r—   Ú
checkpointÚalready_doneÚn_processedÚ	n_createdÚ	n_updatedÚn_errorsÚ	n_skippedÚ
tag_countsÚ
erros_filerÂ   rî   r	  rš   rJ   rÎ   rÏ   Ú
contact_idr:  ÚelapsedÚ
total_doneÚtotal_estimateÚ	remainingÚrateÚeta_minÚ	total_ghlrH   r<  Úsamplesr  Ú
valid_ckptÚsample_pairsÚsample_emailr  r�   Úelapsed_totalÚtotal_done_finalÚsummaryr   s,                                               r   Úmainr|  .  sH  € Ü—‘“€Jä‡H�HˆXÔÜ‡H�HÐ?Ô@Ü‡H�Hˆu”X�JÐÔ Ü‡H�HˆxœŸ™¤X§\¡\Ó2×<Ñ<Ó>Ð?Ð@ÔAÜ‡H�HˆXÔä
”8Ó
€CØÐ3Ñ4€KØÐ'Ñ(€EÜ‡H�Hˆ}˜[˜MÐ*Ô+ä˜5Ó!€Gô ‡H�HÐ-Ô.Ü'¨°Ó=€LÜ‡H�HÐ&¤s¨<Ó'8Ð&9Ð:Ô;ô !Ó"€JÜ�z—‘Ó(Ó)€LÜ‡H�HÐ%¤c¨,Ó&7Ð%8Ð8NÐOÔPð €KØ€IØ€IØ€HØ€IÜœSÓ!€Jä”k 3°Ô9€Jä‡H�HÐ6Ô7ðTÜœXÓ&ó O	ˆCÜ˜#Ÿ'™' '¨2Ó.Ó/×5Ñ5Ó7ˆEáØ˜Q‘�	Ø ’?Ü—K‘KÐ :Ô;Øà˜Ñ$Ø˜Q‘�	Øà˜1ÑˆKô 0°¸ÀeÓLˆKÜ�J‰JÔ)Ô*ðÜ/°°\À;ÓO�ô Ø—‘Ð+¨RÓ0óç‰e‹gð ô  —O‘O GÓ,ˆEÙØ˜5Ó! QÑ&Ó!Ø”zÓ" aÑ'Ó"ô "0Ø˜ g¨{ó"ÑˆJ˜ô �J‰JÔ)Ô*à˜&Ñ Ø˜A‘�Ø× Ñ Ü—J‘JØ!&Ø"(ñ ð %*ô+ð .2ñ2ôð %,�
˜5Ñ!Ü—	‘	˜F ; -¨r°%°¸¸6¸(ÐCÕDØ˜9Ò$Ø˜Q‘�	Ø$.�
˜5Ò!Ø˜9Ò$Ø˜Q‘�	Ø$.�
˜5Ñ!à˜SÑ  AÒ%Ü 
Ô+àœ\Ñ)¨QÔ.ÜŸ)™)›+¨
Ñ2�Ø(¬3¨|Ó+<Ñ<�
Ø!&�Ü  >°JÑ#>Ó?�	Ø07¸!²�{ WÒ,À�Ø59¸A²X˜9 tÑ+¨bÒ0À1�Ü—‘Ø" : ,¨j¸¸ð DØ(˜k¨°(°ð <Ø" 3˜- sð,öñWO	ôd 	˜
Ô#Ø×ÑÔô
 ‡H�HÐ)Ô*Ü‡H�HÐ3Ô4Ü‡J�Jˆr„Nà€IÜØ�Üˆ*�JÐØ)°AÑ6ô€Dð
 ‡w‚wØ�y‰y‹{�‰˜v rÓ*ˆØ—H‘H˜WÓ%ˆ	Ü�‰Ð5°i°[ÐAÔBð €Gà)×/Ñ/Ó1÷Ù�Q˜ØÐ0Ñ0´S¸³XÀ²]ð 
ˆCŠð€Jñ ô —=‘= ¬S°´C¸
³OÓ-DÓE€Là$0ó 'Ñ ˆ�jÜ˜7 E¬h¨Z°zÀ*ÀÐ+NÓOˆØ�7Š7Ø—	‘	“—‘ 	¨4¯9©9«;Ó7ˆAØ�N‰NØŸ™˜w›ØŸU™U ;Ó/ØŸE™E *Ó-ØŸ™˜f bÓ)¨#¨2Ð.Ü&)¨!¯%©%°ÀÓ*CÓ&Dð  !Ÿu™u ^°RÓ8Ò>¸BÀÀÐCö(àð —F‘F˜: rÓ*¨B¯F©F°7¸BÓ,?Ñ?ò(ñ
ô 
ô 	�
‰
Ô%Ö&ð'ô( —I‘I“K *Ñ,€MØ"¤S¨Ó%6Ñ6Ðô —\‘\¤(§,¡,Ó/×9Ñ9Ó;Ü  °Ñ!3°QÓ7Ø-ØØ ØØ(Ø'Ü!$ \Ó!2Ü Ü#Ü  Ó,Øñ€Gô  
Œl˜C¨'Ô	2ð <°aÜ�	‰	�'˜1¨5¸Õ;÷<ô ‡H�HˆXÔÜ‡H�HÐ#Ô$Ü‡H�HˆÐ/Ð0Ð1Ô2Ü‡H�Hˆ˜y˜kÐ*Ô+Ü‡H�Hˆ˜y˜kÐ*Ô+Ü‡H�Hˆ˜x˜jÐ)Ô*Ü‡H�Hˆ˜y˜kÐ*Ô+Ü‡H�Hˆ˜y˜kÐ*Ô+Ü‡H�Hˆ˜}¨RÑ/°Ð4°DÐ9Ô:Ü‡H�Hˆœ|˜nÐ-Ô.Ü‡H�HˆXÔä	Ð
(Ô)Ü	Œ$�*‰*�W¨5¸Ô
;Ô<Ü	ˆ-Ôà€Nøôg ò 	Ü—	‘	˜M¨%¨°°1°#Ð6Ô7Ø× Ñ Ü—J‘J¨¼¸Q»Ñ@ÈuÔUÐX\Ñ\ôð ˜A‘�Ø$3�
˜5Ñ!Ü 
Ô+Ü—
‘
Ô-Ô.Ýûð	ûôx 	˜
Ô#Ø×ÑÕüó,ùò (÷:<ñ <úsX   Æ;Bc$ ÉaÉDc$ Í=A:c$ Ó dØ *d
Û,dá	c!áA>cãc$ ãc!ã!c$ ã$dädÚ__main__)AÚ__doc__r+  r-  r‚   Úloggingr  r^  r'  Úsysr@   Úcollectionsr   r   r   Úpathlibr   r&   ÚBASE_DIRrO  ÚLOG_PATHr  rV  ra  rS  r‡   r*   r+   rÈ   rÉ   rZ  rW  r=   ÚbasicConfigÚINFOÚFileHandlerÚStreamHandlerr)  Ú	getLoggerÚ__name__r>   rË   r    r£   r'   r-   rK   r�   rŸ   r¦   r¬   r²   rµ   r½   rÁ   r‹   rÓ   rä   rþ   r  Útupler  r  r  r2  r|  © r.   r   ú<module>r�     sŒ  ðñó" Û 	Û Û Û 	Û Û Û 
Û Ý #ß 'Ý ã ñ
 ÐMÓN€Ø�oÑ%€Ø�lÑ"€ØÐ.Ñ.€Ø˜Ñ&€ØÐ-Ñ-€ÙÐ5Ó6€à1€Ø€ð9ð ð
 $€
àØØ-ñ€ð €àÐ Ø€ð
 €× Ñ Ø
�,‰,Ø4àˆ×Ñ˜H¨wÔ7Øˆ×Ñ˜cŸj™jÓ)ðõð €g×Ñ˜Ó!€ð
�4ð 
˜Dó 
ð 	˜ð 	 × 0Ñ 0ó 	ðE˜×)Ñ)ð E°3ð E¸Só Eð."Ø¨
Ð6MÚ,ð.ð"ð ¨°|ÀRÐHð"ð ¨Ð7GÈÐLð	"ð
 ¨Ð7JÈBÐOð"ð #¨Ð7VÐXZÐ[ð"ð ¨Ð7OÐQSÐTð"ð ¨
Ð7PÐRTÐUð"ð ¨Ð7QÐSUÐVð"ð !¨Ð7TÐVXÐYð"ð #¨Ð7VÐXZÐ[ð"ð ¨Ð7IÈ2ÐNð"ð !¨Ð7TÐVXÐYð"ð ¨Ð7QÐSUÐVð"ð "¨Ð7UÐWYÐZð"ð  $¨Ð7WÐY[Ð\ð!"ð"  ¨Ð7SÐUWÐXð#"ð$ "¨Ð7UÐWYÐZð%"ð& ¨Ð7QÐSUÐVð'"ð( ¨°zÀ2ÐFð)"ð* $¨Ð7[Ð]_Ð`ð+"ð, ¨Ð7QÐSUÐVð-"ð. ¨Ð7SÐUWÐXð/"ð0 ¨Ð7PÐRTÐUð1"ð2 ¨Ð7JÈBÐOð3"ð4 ¨Ð7IÈ2ÐNð5"ð6 ¨Ð7HÈ"ÐMð7"ð8 ¨Ð7HÈ"ÐMð9"ð: ¨°ÈÐKð;"ð< '¨Ð7ZÐ\^Ð_ð="ð> ¨°ÈÐKð?"ð@ ¨°~ÀrÐJðA"ðB ¨°ÈÐKðC"Ð ðJ8 (×"2Ñ"2ð 8Àð 8Èó 8ð~<�#ó <ð�Só ð˜ð ¨ð °sð ¸só ð�Cð ˜Có ð˜ó ð�3ó ð%�Dð %˜Tó %ð*X˜Tð X°ð X¸$ó Xðv.˜tð .°4ð .Àcð .Èdó .ðjØ×ÑðØ,/ðØ8;ðàˆ4�Zóð*,EØ×Ñð,Eàð,Eð ð,Eð �t‘ð	,Eð
 ó,Eðd˜ó ð%˜$ó %ð˜ó òPðf ˆzÒÙ…Fð r.   