
    <uj7I                     4   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ZdZdZdZdZd	e d
ddZi 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'd(d!d)d*d+d%d*d%d!ddd%d,dd-d!d.
Zd/d0d/d0d/d/d0d0d1Zh d2Zdhd3Zd4 Zd5 Zd6 Zd7 Zd8 Zd9 Zd: Zd; Zed<k(  r e d=d>?        e d@d>?        e d=d>?        e       \  Z!Z"e!s e dAd>?        ejF                  d        e dBe! dCe" d>?        e       Z$ ee$e!      \  Z%Z& ee&e!      Z'e%dD   e%dE   z   e%dF   z   Z(e!e"e%e(e'e&dGZ) e*edH      5 Z+ ejX                  e)e+dIdJK       ddd        e dLd>?        e dMd>?        e d=d>?        e dNe! d>?        e dOe" d>?        e  d>?        e dPe%dD    d>?        e dQe%dE    d>?        e dRe%dF    d>?        e dSe( d>?        e  d>?        e dTe%dU    d>?        e dVe%dW    d>?        e dXe%dY    d>?        e dZe%d[    d>?        e d\e%d]    d>?        e  d>?        e d^d>?       e'D ]%  Z- e d_e-d`    dae-db   rdcndd dae-de   ddf  d>?       '  e dge d>?       yy# 1 sw Y   0xY w)iu  
Script: Importar campo CNPJ nos contatos Santa Fe — CRM Linkia PX3
Executa em 2026-08-07 após reset do rate limit diário (~08:15 UTC)

Estratégia:
  1. Criar custom field CNPJ (se não existir)
  2. Para cada linha do CSV:
     a. Se contactId já conhecido (duplicados de ontem): atualiza direto
     b. Se contato criado ontem: busca por email/telefone
     c. Se foi 429 ontem: tenta criar agora
     d. Se foi linha vazia/tel quebrado: pula
  3. Valida 3 amostras aleatórias

Histórico de ontem (2026-08-06):
  - 82 contatos criados
  - 27 duplicados com contactId conhecido
  - 12 erros irrecuperáveis (linhas vazias, telefone inválido)
    N)StringIOz(pit-25f78b4f-4cc8-48f2-b8dc-73a98f851eafW7PGxpfbsFaEEUoQOtUbz$https://services.leadconnectorhq.comz8/opt/mia/workspace/clientes/px3lab/santa_fe_planilha.csvz:/opt/mia/workspace/clientes/px3lab/cnpj_import_result.jsonzBearer z
2021-07-28zapplication/json)AuthorizationVersionzContent-Type   G4dZHiJc6fWMjDCtV3kl   qxD5D1uL3D9j9sZGQL5r   6uxZWUqCLqWr4oSHOHNV)   cKhxgF5LQdMXYfMgzAJF2   Gv6AsR1hkHppcaaBcz7w5   Aehqhys8zyK7B8jrQ3PF8   1B1YzDzorjINpvGVwivt@   yXkKdATOQejnW3ouyYtYA   C   H6ATpajUlL8iPiUCtdwHD   2Hfh5eH6yjrD8UhkKOgzE   76dmu3Z7eYCzNxbL2rLbH   qBSOuvhrOEvw0G3BB82lK   5RWyaTgXWmcgbBaKNcpKR   \   htNDbE2wVuFZTvWolOys]   h0XTgKwVAZJlsfhEd7xfPv9woHDbEmxZdBj2bZ8A)
b   c   g   h   j   k   o   s   v   x   linha_vaziatelefone_longo)       #   6   =   T   U   n   >   ^   _   `   a   c                    t         |z   }|r#t        j                  |      j                         nd }t        j
                  j                  ||t        |       }t        |      D ]R  }	 t        j
                  j                  |d      5 }t        j                  |j                               cd d d        c S  ddiS # 1 sw Y   nxY wf# t        j                  j                  $ r}	|	j                         j                         }
|	j                  dk(  r<d|dz   z  }t!        d| d|dz    d| d	d
       t#        j$                  |       Y d }	~	t!        d|	j                   d| d|
d d  d
       |	j                  |
dcY d }	~	c S d }	~	wt&        $ r0}t!        d| d
       t#        j$                  d       Y d }~\d }~ww xY w)N)dataheadersmethod   )timeouti  r   z  [RATE LIMIT] aguardando zs... (tentativa /)Tflushz  [HTTP ] z =>    )errormessagez  [ERR]    rL   max_retries)BASE_URLjsondumpsencodeurllibrequestRequestHEADERSrangeurlopenloadsreadrL   	HTTPErrordecodecodeprinttimesleep	Exception)rC   pathbodyretriesurlrA   reqattemptrespe	resp_bodywaitexs                :/opt/mia/workspace/clientes/px3lab/cnpj_import_santa_fe.pyapiro   a   s   
T/C(,4::d""$$D
..
 
 4
 
PC> 	''R'8 /Dzz$))+./ /  ]##/ / /||%% 	;)Ivv}Wq[)24&8HQRSTU\T]]^_gkl

4 HQVVHBtfD4C0AB$OVV	:: 	HRD/.JJqMM	sI   '!C	#B<+	C	<C	C		G&A$F1F GG%F??Gc                     t        j                  dd|       }|sy t        |      dk(  r|j                  d      r|dd  }t        |      dv rd|z   }t        |      dk\  rd	|z   S y )
N\D    0r   )
   rs   55r4   +)resublen
startswith)phonedigitss     rn   normalize_phoner~   w   sl    VVE2u%F
6{bV..s3
6{h
6{bV|    c                     | r| j                         sy t        j                  dd| j                               }t        |      dk(  r|d d  d|dd  d|dd  d|dd	  d
|d	d   	S | j                         S )Nrq   rr         .rN      rF   r4   -)striprx   ry   rz   )cnpj_rawr}   s     rn   normalize_cnpjr      s    8>>+VVE2x~~/0F
6{b!*Qva{m1VAa[M6!B<.&QSQT+WW>>r   c                  D   t        dd       t        ddt         d      } | j                  d      rt        d|  d       y	| j                  d
g       }|D ]  }|j                  dd      j	                         }|j                  dd      j	                         }d|v sd|v sLt        d|d    d|j                  d       d|j                  d       d       |d   |j                  d      fc S  t        dd       dddd}t        ddt         d|      }|j                  d      xs |}|j                  d      r;t        d|d    d|j                  d       d       |d   |j                  d      fS t        dt        j                  |       d       y	)Nz#
=== PASSO 1: Custom Field CNPJ ===TrH   GETz/locations/z/customFieldsrL   z  ERRO ao listar campos: )NNcustomFieldsnamerr   fieldKeycnpjz  Campo CNPJ JA EXISTE: id=id key=z name=u(     Campo CNPJ não encontrado. Criando...CNPJTEXTcontact)r   dataTypemodelPOSTrd   customFieldz  CRIADO: id=z  ERRO ao criar campo: )r_   ro   LOCATION_IDgetlowerrQ   rR   )ri   fieldsfr   keypayloadresultfields           rn   get_or_create_cnpj_fieldr      s   	
0=uK=>?Dxx)$0=XXnb)F .uuVR &&(eeJ#))+T>Vs]/$yaeeJ>O=PPVWXW\W\]cWdVefnrsT7AEE*---. 

4DA6IFG;{m=APFJJ}%/EyyeDk]%		*0E/FGtTT{EIIj111	#DJJv$6#7
8Er   c                     t        dd       t        t        d      5 } | j                         }d d d        t	        j
                  t                    }t        |      }t        dt        |       d       |S # 1 sw Y   MxY w)Nz
=== PASSO 2: Lendo CSV ===TrH   zutf-8)encodingz  Total de linhas: )	r_   openCSV_PATHr[   csv
DictReaderr   listrz   )r   contentreaderrowss       rn   load_csvr      sp    	
(5	h	) Q&&(^^HW-.F<D	D	{
+48K s   A<<Bc           
          | r| j                         sy t        ddt         dt        j                  j                  | j                                d      }|j                  dg       }|r|d   d   S d S )Nr   z/contacts/search?locationId=z&query=z&limit=5contactsr   r   )r   ro   r   rT   parsequoter   )queryri   r   s      rn   find_contact_by_queryr      sm    u4[MI[I[\a\g\g\iIjHkkstuDxx
B'H (8A;t2d2r   c           	      
   | j                  d| j                  dd            j                         }| j                  dd      j                         }| j                  dd      j                         }| j                  dd      j                         }t        |      xs t        |      }t        j                  dd|      j                         }|j                         }	|	r|	d   j                         n|}
t        |	      d	kD  rd
j                  d |	d	d  D              nd}|
||t        dg d||dgd}|r	d|v r||d<   |r||d<   t        dd|      }|j                  d|      }|j                  d      r|d   dfS d d| fS )NRazao Social   Razão Socialrr   E-mailCelularTelefonez^\d{2}\.\d{3}\.\d{3}\s+r   r    c              3   <   K   | ]  }|j                           y w)N)
capitalize).0ps     rn   	<genexpr>z!create_contact.<locals>.<genexpr>   s     6qALLN6s   u   Import planilha Santa Fé)zorigem:import-planilhazevento:santa-fe-ggvzimport:2026-08-06r   value)	firstNamelastNamecompanyName
locationIdsourcetagsr   @emailr|   r   
/contacts/r   r   r   createderror_)r   r   r~   rx   ry   splitr   rz   joinr   ro   )rowr   cnpj_field_idrazaor   celulartelefoner|   r   partsfirstlastr   ri   r   s                  rn   create_contactr      sz   GGNCGGOR$@AGGIEGGHb!'')Eggi$**,Gwwz2&,,.HG$A(AE66,b%8>>@DJJLE%*E!H!E:=e*q.3886E!"I66bD !-V -=>G   v|'2Dhhy$'G{{4t}i''6$  r   c                    t        dt        |        dd       ddddddddg d	}g }t        | d      D ]L  \  }}|j                  d|j                  d	d
            j	                         }|j                  dd
      j	                         }|j                  dd
      j	                         }|j                  dd
      j	                         }	|j                  dd
      j	                         }
|s;|s9|s7t        d|ddd       |dxx   dz  cc<   |d   j                  |dd       |t        v rct        |   }t        d|dd|d d  d| dd       |dk(  r|dxx   dz  cc<   n|dk(  r|dxx   dz  cc<   |d   j                  |||d       _t        |      }|s?t        d|dd|d d  dd       |dxx   dz  cc<   |d   j                  ||dd       t        d|dd|d d   d!| d       |t        v rt        |   }d"||d#gi}t        d$d%| |&      }|j                  d'      s"|j                  d(      s|j                  d)      r5t        d*| d       |d+xx   dz  cc<   |j                  ||d+||d,       nAt        d-| d.| d       |d/xx   dz  cc<   |j                  ||d0||t        |      d1       t        j                  d2       |t        v rt        |||      \  }}|r5t        d3| d       |d4xx   dz  cc<   |j                  ||d5||d,       n>t        d6| d       |d/xx   dz  cc<   |j                  ||d0|d t        |      d1       t        j                  d2       St        |	      xs t        |
      }d }|r$d7|v r t!        |      }t        j                  d8       |s"|r t!        |      }t        j                  d8       |rd"||d#gi}t        d$d%| |&      }|j                  d'      s"|j                  d(      s|j                  d)      r5t        d9| d       |d:xx   dz  cc<   |j                  ||d:||d,       nt        d;| d.| d       |d/xx   dz  cc<   |j                  ||d0||t        |      d1       n|s5|s3t        d<d       |d=xx   dz  cc<   |d   j                  ||d>d       nt        |||      \  }}|r5t        d?| d       |d4xx   dz  cc<   |j                  ||d5||d,       n>t        d6| d       |d/xx   dz  cc<   |j                  ||d0|d t        |      d1       t        j                  d2       O ||fS )@Nz
=== PASSO 3: Processando z linhas ===TrH   r   )	updated_known_idupdated_foundcreated_newskipped_emptyskipped_no_cnpjskipped_tel_longoskipped_no_identifiererrorsskip_detailsr   r   r   rr   r   r   r   r   z  [03dz] Linha vazia - pulandor   r   r2   )linhamotivorJ   (   z - pulando (rG   r3   r   )r   r   r   z - CNPJ vazio, pulandor   
cnpj_vazio-   z | CNPJ=r   r   PUTr   r   r   r   succededz    -> ATUALIZADO (known_id) r   )r   r   statusr   
contact_idz    -> ERRO (known_id) z: r   rL   )r   r   r   r   r   rL   g?z#    -> CRIADO (rate_limited ontem) r   r   z    -> ERRO ao criar: r   g333333?z    -> ATUALIZADO (found) r   z    -> ERRO (found) u*       -> Sem identificador válido - pulandor   sem_identificadorz    -> CRIADO (nao encontrado) )r_   rz   	enumerater   r   append
SKIP_LINESr   KNOWN_CONTACT_IDSro   strr`   ra   RATE_LIMITED_LINESr   r~   r   )r   r   statsresultsir   r   r   r   r   r   r   r   r   r   ri   actionr|   s                     rn   process_rowsr      s   	'D	{+
>dK !"
E GD!$ p3)DEKKM7762&,,."%++-'')R(..077:r*002 XeC#w56dC/"a'".!((1)NO 
?]FC#wbsLB$O&o&!+&++)*a/*.!((1uPV)WX h'C#wbs,BC4P#$)$.!((1uP\)]^Ac7"U3BZL7tD !!*1-J%}t(L'MNGu
:,7gFDxx	"dhhtn8L5j\B$O()Q.)UFX)-Z I J /
|2dVDDQh1$Ug)-ZRUVZR[ ] ^JJsO ""!/T=!IJ;J<HPTUm$)$Ui)-Z I J .vh7tDh1$Ug)-TCPVK Y ZJJsO  (EOH,E
SE\.u5JJJsOe.u5JJJsO%}t(L'MNGu
:,7gFDxx	"dhhtn8L2:,?tLo&!+&Uo)-Z I J ,ZL4&ANh1$Ug)-ZRUVZR[ ] ^u>tL)*a/*.!((1uPc)de "0T=!IJ7
|DDQm$)$Ui)-Z I J .vh7tDh1$Ug)-TCPVK Y Z 	

3apd '>r   c           	         t        dd       | D cg c]  }|d   dv r|j                  d      r| }}|st        dd       g S t        j                  |t	        dt        |                  }g }|D ]  }|d   }|d	   }t        d
d|       }	|	j                  d|	      }
d }|
j                  dg       D ])  }|j                  d      |k(  s|j                  d      } n ||k(  }|rdnd| d| d}t        d| d|d   d d  d| d       |j                  ||d   |||d       t        j                  d        |S c c}w )Nz$
=== PASSO 4: Validando amostras ===TrH   r   )r   r   r   r   z)  Nenhum contato com sucesso para validar   r   r   r   r   r   r   r   OKzDIVERGENTE (esperado=z, encontrado=rG      | r   r   )r   r   expected_cnpj
found_cnpjokg      ?)
r_   r   randomsampleminrz   ro   r   r`   ra   )r   r   rsuccesssamplesvalidationssr   r   ri   r   r   cfr   
status_strs                  rn   validate_samplesr
  i  s   	
1>! (QH+!QQ55&  (G ( 9F	mmGSCL%9:GK |_
&	5Jzl34((9d+
++nb1 	Bvvd|},VVG_
	 =(T'<]O=YcXdde%f
:,c!G*Sb/!2#j\B$O$wZ*$
 	 	

3)* =(s   !E__main__z<============================================================TrH   u3   IMPORTAÇÃO CNPJ — CRM LINKIA PX3 — 2026-08-07uJ   ERRO FATAL: Não foi possível criar/obter o custom field CNPJ. Abortando.z
  Custom Field CNPJ: id=r   r   r   r   )r   cnpj_field_keyr   total_com_cnpj_preenchidor  r   wr   F)indentensure_asciiz=
============================================================u   RELATÓRIO FINALzCustom Field CNPJ ID:       zCustom Field CNPJ Key:      u   Atualizados (ID já known):  zAtualizados (busca GHL):    zCriados agora:              zTOTAL com CNPJ preenchido:  zIgnorados - linha vazia:    r   zIgnorados - CNPJ vazio:     r   zIgnorados - tel longo:      r   zIgnorados - sem identif.:   r   zErros:                      r   zAmostras validadas:r   r   r   r   r   FALHOUr   r   z
Resultado completo: )N   ).__doc__r   rQ   r`   r   rx   sysurllib.requestrT   urllib.errorurllib.parseior   TOKENr   rP   r   RESULT_PATHrW   r   r   r   ro   r~   r   r   r   r   r   r   r
  __name__r_   r   r  exitr   r   r   r  
total_cnpjoutputr   r   dumpv r   rn   <module>r"     sd  &     	 
    
 	3$1EJ ug&&		 	 		
 	 	 	 	 	 	 	 	 	 	 	  	!" 	#$ 
 									7 @ 
								
 & 
$,
<3!FBN J z	($	
?tL	($$<$>!M>Zbfg	&}oU>:J
KSWX:D!$6NE7"7M:K)*U?-CCeMFZZJ&(%/"F 
k3	 ;1		&!AE:; 
/&	
D)	($	(
8E	((8
9F	#T	)%0B*C)D
ETR	()?(@
AN	(})=(>
?tL	(
5TB	#T	()?(@
AN	(/@)A(B
C4P	(/B)C(D
ETR	(/F)G(H
IQUV	(x(9
:$G	#T	
t, h1\?#3qwtH&ES7TWUWHYZbfgh	";-
0=_ 0; ;s   JJ