Ë
    RŠŒj?~  ã                  ó  — d Z ddlm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mZmZ ddlmZ ddlmZ ddlmZ ddlZ ee«      j/                  «       j0                  Zej0                  ZdZd	Ze	j:                  j=                  d ee«      «       	 dd
l m!Z!m"Z"  ed«      Z(dZ)dZ*e(jW                  «       rªe(jY                  d¬«      j[                  «       D ]‡  Z.e.j_                  «       Z0e0re0jc                  d«      sde0vrŒ+e0je                  dd«      \  Z3Z4e3j_                  «       dk(  re4j_                  «       Z)Œde3j_                  «       dk(  sŒxe4j_                  «       Z*Œ‰ dZ5ddddddœZ6dZ7dZ8dZ9 ed «      Z:e:j0                  jw                  d!d!¬"«        ejx                  d#«      Z= ee:d$d%d¬&«      Z>e>j                  e=«        ej€                  e	j‚                  «      ZBeBj                  e=«        ej†                  ejˆ                  e>eBg¬'«        ejŠ                  d(«      ZFdQd)„ZGdRd*„ZHdSd+„ZIdTd,„ZJdUd-„ZKdVdWd.„ZL G d/„ d0«      ZMdXd1„ZNg d2¢d3d4gg d5¢g d6¢g d7¢g d8¢d9d:gd;d<gd=d>gg d?¢g d@¢g dA¢dBdCgg dD¢dEœZOdYdF„ZPdZdG„ZQd[dH„ZRd\d]dI„ZSd^d_dJ„ZTd`dK„ZUdadL„ZVdbdM„ZWdcdddN„ZXdedO„ZYeZdPk(  r e	jN                   eY«       «       yy# e#$ r4Z$ e%de$› �e	jL                  ¬«        e	jN                  d«       Y dZ$[$�ŒZdZ$[$ww xY w)fuµ  
backfill_purchases.py â€” Retroativo de Purchases PX3 Lab
=======================================================

Reprocessa compradores historicos:
  1. Aplica tag comprou-<produto> no contato Linkia (upsert por email)
  2. Envia Purchase pro CAPI PX3 (/purchase) - dedupe garantido por event_id

Fontes suportadas (--source):
  csv          -> Le CSV exportado da planilha VENDAS (Google Sheets)
                  Header esperado: PESSOA, CNPJ, RAZAO_SOCIAL, CEP, RUA, ...,
                  EMAIL_REP, TELEFONE_REP, DATA E HORA, SOFTWARE,
                  TOTAL DE CRÃ‰DITO, TIPO DE CRÃ‰DITO, VENDEDOR, PREÃ‡O,
                  CIDADE_REP, ESTADO_REP, CEP_REP, NOME_COMPLETO_REP
                  (mesmas colunas do node "Append row in sheet1" do workflow VRA)
  n8n_replay   -> Puxa execucoes historicas do workflow VRA (id fixo) via
                  N8N API e reprocessa. Cobre so ate onde N8N retem
                  executions (tipicamente 30-90 dias).

Uso:
  # Dry-run (default: 90 dias atras ate hoje)
  python3 backfill_purchases.py --source csv --csv-path /tmp/vendas.csv --dry-run

  # Testar 5 registros com test-event-code do Meta
  python3 backfill_purchases.py --source csv --csv-path /tmp/vendas.csv \
      --limit 5 --test-code TEST_BACKFILL_2026

  # Producao completa (batch de 10 com pause 500ms)
  python3 backfill_purchases.py --source csv --csv-path /tmp/vendas.csv \
      --batch-size 10

  # So aplicar tag, sem enviar CAPI
  python3 backfill_purchases.py --source csv --csv-path /tmp/vendas.csv \
      --only-tag

  # Reprocessar so os ultimos 30 dias via N8N replay
  python3 backfill_purchases.py --source n8n_replay --start 2026-07-25

Autor: Paulo (agencia climb) - 2026-08-24
é    )ÚannotationsN)ÚdatetimeÚ	timedeltaÚtimezone)ÚRotatingFileHandler)ÚPath)ÚAnyz/https://track-capi-px3.agentesclimb.us/purchasez4https://services.leadconnectorhq.com/contacts/upsert)Ú	PX3_TOKENÚPX3_LOCATION_IDz-[FATAL] Nao consegui importar config_ghl.py: )Úfileé   z/opt/mia/config/n8n_px3.envÚ zutf-8)Úencodingú#ú=ÚN8N_PX3_URLÚN8N_PX3_TOKENÚQcJuvqhV98vIYtA6zcomprou-claud-photorfzcomprou-fast-albumzcomprou-photo-drivezcomprou-e-photorfzcomprou-checkout-photorf)zCLOUD PHOTORFÚ	FASTALBUMzPHOTO DRIVEz	E-PHOTORFzCHECKOUT PHOTORFu   PERÃ�ODO DE TESTEu   REPOSIÃ‡ÃƒOÚREGULARz(/opt/mia/logs/backfill_purchases_px3.logT)ÚparentsÚexist_okz'%(asctime)s [%(levelname)s] %(message)si    é   )ÚmaxBytesÚbackupCountr   )ÚlevelÚhandlersÚbackfill_px3c                ó&  — | €yt        | «      j                  «       }|syt        j                  dd|«      }d|v r'd|v r#|j	                  dd«      j	                  dd«      }nd|v r|j	                  dd«      }	 t        |«      S # t        $ r Y yw xY w)z3Converte '0,065' ou '0.065' ou 'R$ 0,065' em float.ç        z
[^\d,\.\-]r   ú,ú.)ÚstrÚstripÚreÚsubÚreplaceÚfloatÚ
ValueError©ÚrawÚss     úF/opt/mia/workspace/clientes/px3lab/capi_pageview/backfill_purchases.pyÚparse_price_brr.   ~   s“   € à
€{ØÜˆC‹�‰Ó€AÙØÜ
�‰ˆ}˜b !Ó$€Aà
ˆa�x�C˜1‘HØ�I‰I�c˜2Ó×&Ñ& s¨CÓ0‰Ø	�‰Ø�I‰I�c˜3ÓˆðÜ�Q‹xˆøÜò Ùðús   Á9
B Â	BÂBc                ó†   — | €yt        j                  ddt        | «      «      }	 |rt        |«      S dS # t        $ r Y yw xY w)Nr   z[^\d\-]r   )r%   r&   r#   Úintr)   r*   s     r-   Ú	parse_intr1   ‘   sH   € Ø
€{ØÜ
�‰ˆz˜2œs 3›xÓ(€AðÙŒs�1‹vÐ! Ð!øÜò Ùðús   ¥4 ²4 ´	A ¿A c                óž   — | syt        | «      j                  «       } dD ]  }	 t        j                  | dd |«      c S  y# t        $ r Y Œ,w xY w)z4Aceita 'dd/mm/yyyy HH:MM:SS' ou 'dd/mm/yyyy' ou ISO.N)z%d/%m/%Y %H:%M:%Sz%d/%m/%Y %H:%Mú%d/%m/%Yú%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%H:%M:%SZz%Y-%m-%d %H:%M:%Sú%Y-%m-%dé   )r#   r$   r   Ústrptimer)   )r+   Úfmts     r-   Úparse_date_brr9   ›   s`   € áØÜ
ˆc‹(�.‰.Ó
€Cðò ˆð	Ü×$Ñ$ S¨¨" X¨sÓ3Ò3ðð øô ò 	Ùð	ús   £A Á 	AÁAc                ó¨   — | xs dj                  «       j                  «       }|syt        |«      dk(  r|d   dfS |d   dj                  |dd  «      fS )Nr   )r   r   r   r   ú )r$   ÚsplitÚlenÚjoin)ÚnomeÚpartss     r-   Ú
split_namerA   °   sZ   € ØŠZ�R×ÑÓ ×&Ñ&Ó(€EÙØÜ
ˆ5ƒz�Q‚Ø�Q‰x˜ˆ|ÐØ�‰8�S—X‘X˜e A B˜iÓ(Ð(Ð(ó    c                ó    — t        j                  ddt        | xs d«      «      }|syt        |«      dk(  rd|z   S t        |«      dk(  rd|z   S |S )z6Retorna telefone so com digitos, com prefixo 55 se BR.z\Dr   é   Ú55é
   )r%   r&   r#   r=   )r+   Úds     r-   Únormalize_phone_brrH   ¹   sO   € ä
�‰ˆu�bœ#˜cši R›.Ó)€AÙØÜ
ˆ1ƒv�‚|Ø�a‰xˆÜ
ˆ1ƒv�‚|Ø�a‰xˆØ€HrB   c                ón   — | syt        | «      }t        |«      |dz   k  rd|dd  z   S |d d dz   || d  z   S )Nr   é   z***éþÿÿÿ)r#   r=   )ÚvÚkeepr,   s      r-   ÚmaskrN   Å   sN   € ÙØÜˆA‹€AÜ
ˆ1ƒv�˜‘ÒØ�q˜˜�v‰~ÐØˆRˆaˆ5�5‰=˜1˜d˜U˜V˜9Ñ$Ð$rB   c                  ó  — e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Zedd„«       Zedd„«       Zedd„«       Z	edd„«       Z
edd	„«       Zedd
„«       Zedd„«       Zddd„Zy)ÚSale)Ú
row_numberÚdateÚsoftwareÚtipo_creditoÚemailÚphoneÚ
first_nameÚ	last_nameÚcityÚstateÚzip_codeÚ
unit_priceÚnum_creditsÚvalueÚrazao_socialÚvendedorÚvalue_from_csvÚ
raw_sourceÚparse_errorsNc                ó¨  — || _         || _        |r|j                  «       j                  «       nd| _        |xs dj                  «       j                  «       | _        |xs dj                  «       | _        t        |«      | _        || _	        || _
        |	xs dj                  «       | _        |
xs dj                  «       | _        |xs dj                  «       | _        || _        || _        |xs dj                  «       | _        || _        |r|dkD  rt%        |d«      | _        nt%        ||z  d«      | _        || _        || _        |xs g | _        y )Nr   r   rJ   )rQ   rR   r$   ÚupperrS   rT   rU   rH   rV   rW   rX   rY   rZ   r[   r\   r]   r`   ra   Úroundr^   r_   rb   rc   )ÚselfrQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r_   r`   ra   rb   rc   s                      r-   Ú__init__zSale.__init__Ù   s(  € ð* %ˆŒØˆŒ	Ù4<˜Ÿ™Ó(×.Ñ.Ô0À"ˆŒØ)Ò/¨R×6Ñ6Ó8×>Ñ>Ó@ˆÔØ’k˜r×(Ñ(Ó*ˆŒ
Ü'¨Ó.ˆŒ
Ø$ˆŒØ"ˆŒØ’Z˜R×&Ñ&Ó(ˆŒ	Ø’k˜r×(Ñ(Ó*ˆŒ
Ø!š R×.Ñ.Ó0ˆŒØ$ˆŒØ&ˆÔØ!š R×.Ñ.Ó0ˆŒØ,ˆÔá˜n¨qÒ0Ü˜~¨qÓ1ˆD�Jä˜z¨KÑ7¸Ó;ˆDŒJØ(ˆÔØ$ˆŒØ(Ò.¨BˆÕrB   c                ód   — d| j                   v xs! | j                   t        j                  «       k(  S )NÚTESTE)rT   ÚTRIAL_MARKERre   ©rg   s    r-   Úis_trialzSale.is_trial  s,   € à˜$×+Ñ+Ð+ÒX¨t×/@Ñ/@ÄL×DVÑDVÓDXÑ/XÐXrB   c                óP   — t        | j                  «      j                  «       }d|v S )NÚ	REPOSICAO)Ú_strip_accentsrT   re   )rg   Únorms     r-   Úis_reposicaozSale.is_reposicao
  s(   € ô ˜d×/Ñ/Ó0×6Ñ6Ó8ˆØ˜dÐ"Ð"rB   c                ó(   — | j                   t        k(  S ©N)rT   ÚREGULAR_MARKERrl   s    r-   Ú
is_regularzSale.is_regular  s   € à× Ñ ¤NÑ2Ð2rB   c                óL   — t        | j                  xr d| j                  v «      S )Nú@)ÚboolrU   rl   s    r-   Ú	has_emailzSale.has_email  s   € ä�D—J‘JÒ4 3¨$¯*©*Ð#4Ó5Ð5rB   c                óB   — | j                   xr | j                  t        v S )zHCompat: valid = email OK e software conhecido (usado pelo fluxo antigo).)rz   rS   ÚPRODUCT_TAG_MAPrl   s    r-   Úis_validzSale.is_valid  s   € ð �~‰~ÒB $§-¡-´?Ð"BÐBrB   c                ó^   — | j                   xr  | j                  xr | j                  t        v S )zFNova regra pro backfill real: REGULAR + email OK + software conhecido.)rv   rz   rS   r|   rl   s    r-   Úis_processablezSale.is_processable  s%   € ð �‰ÒV 4§>¡>ÒV°d·m±mÄÐ6VÐVrB   c                óÚ   — | j                   sy| j                  ry| j                  ry| j                  sd| j                  xs d› �S | j
                  t        vrd| j
                  xs d› �S y)NÚ	sem_emailÚtrialÚ	reposicaoztipo_credito_desconhecido:ú(vazio)zsoftware_desconhecido:r   )rz   rm   rr   rv   rT   rS   r|   rl   s    r-   Úskip_reasonzSale.skip_reason"  sh   € à�~Š~ØØ�=Š=ØØ×ÒØØ�ŠØ/°×0AÑ0AÒ0NÀYÐ/OÐPÐPØ�=‰=¤Ñ/Ø+¨D¯M©MÒ,F¸YÐ+GÐHÐHØrB   c                óB   — t         j                  | j                  d«      S ©Nr   )r|   ÚgetrS   rl   s    r-   Útag_slugzSale.tag_slug0  s   € ä×"Ñ" 4§=¡=°"Ó5Ð5rB   c                ó|   — | j                   r| j                   j                  d«      nd}|› d| j                  › d|› �S )Nz%Y%m%dÚnodatez-rú-)rR   ÚstrftimerQ   )rg   ÚprefixrG   s      r-   Úevent_idzSale.event_id4  s:   € Ø,0¯IªIˆD�I‰I×Ñ˜xÔ(¸8ˆØ�˜˜DŸO™OÐ,¨A¨a¨SÐ1Ð1rB   )r   r   r    r   N)&rQ   r0   rR   údatetime | NonerS   r#   rT   r#   rU   r#   rV   r#   rW   r#   rX   r#   rY   r#   rZ   r#   r[   r#   r\   r(   r]   r0   r_   r#   r`   r#   ra   r(   rb   r#   rc   zlist[str] | NoneÚreturnÚNone)r‘   ry   )r‘   r#   )zbackfill-vra)rŽ   r#   r‘   r#   )Ú__name__Ú
__module__Ú__qualname__Ú	__slots__rh   Úpropertyrm   rr   rv   rz   r}   r   r…   r‰   r�   © rB   r-   rP   rP   Ñ   s‡  „ ð€Ið, ØØ #ØØ)-ð'+/àð+/ð ð+/ð ð	+/ð
 ð+/ð ð+/ð ð+/ð ð+/ð ð+/ð ð+/ð ð+/ð ð+/ð ð+/ð ð+/ð ð+/ð  ð!+/ð" ð#+/ð$ ð%+/ð& 'ð'+/ð( 
ó)+/ðZ òYó ðYð ò#ó ð#ð
 ò3ó ð3ð ò6ó ð6ð òCó ðCð òWó ðWð òó ðð ò6ó ð6õ2rB   rP   c                ó`   — | sydj                  d„ t        j                  d| «      D «       «      S )Nr   c              3  óP   K  — | ]  }t        j                  |«      d k7  r|–— Œ  y­w)ÚMnN)ÚunicodedataÚcategory)Ú.0Úcs     r-   ú	<genexpr>z!_strip_accents.<locals>.<genexpr><  s+   è ø€ ò ØÜ×Ñ Ó" dÒ*ô 	
ñùs   ‚$&ÚNFD)r>   rœ   Ú	normalize)r,   s    r-   rp   rp   9  s3   € ÙØØ�7‰7ñ Ü×(Ñ(¨°Ó2ôó ð rB   )zDATA E HORAÚDATA_E_HORAÚDATAÚdataÚSOFTWARErS   )u   TIPO DE CRÃ‰DITOzTIPO DE CREDITOÚTIPO_DE_CREDITOÚTIPO_DE_DE_CREDITO)Ú	EMAIL_REPúE-MAILÚEMAILrU   )ÚTELEFONE_REPÚTELEFONErV   )ÚNOME_COMPLETO_REPÚNOME_COMPLETOÚNOMEÚ
CIDADE_REPÚCIDADEÚ
ESTADO_REPÚESTADOÚCEP_REPÚCEP)õ   PREÃ‡OÚPRECOu   PREÃ‡O_UNITARIOÚPRICE)u   TOTAL DE CRÃ‰DITOÚTOTAL_DE_CREDITOzTOTAL DE CREDITO)ÚRAZAO_SOCIALu   RAZÃƒO SOCIALÚEMPRESAÚVENDEDORr`   )ÚVALORÚvalorÚVALOR_TOTAL)rR   rS   rT   rU   rV   r?   rY   rZ   ÚzipÚpriceÚcreditsr_   r`   r¿   c                óX   — t         |   D ]  }|| v sŒ| |   dvsŒt        | |   «      c S  y)Nr‡   r   )ÚCSV_COLUMN_MAPr#   )ÚrowÚ	canonicalÚnames      r-   Ú_pickrÉ   X  s;   € Ü˜yÑ)ò "ˆØ�3Š;˜3˜t™9¨JÒ6Ü�s˜4‘y“>Ò!ð"ð rB   c           
     ó¦  — t        | «      }|j                  «       st        j                  d| «       g S g }|j	                  ddd¬«      5 }t        j                  |«      }t        |d¬«      D �]J  \  }}g }t        |d«      }t        |«      }	|r|	€|j                  d	|›�«       t        |d
«      }
t        |d«      }t        |d«      }t        |d«      }t        |d«      }t        |«      \  }}t        |d«      }t        |d«      }t        |d«      }t        t        |d«      «      }t        t        |d«      «      }t        |d«      }t        |d«      }t        t        |d«      «      }|j                  t        d!i d|“d|	“d
|
“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“dd“d |“Ž«       �ŒM 	 d d d «       |S # 1 sw Y   |S xY w)"NzCSV nao encontrado: %sÚrz	utf-8-sigr   )r   ÚnewlinerJ   )ÚstartrR   zdata_invalida:rS   rT   rU   rV   r?   rY   rZ   rÁ   rÂ   rÃ   r_   r`   r¿   rQ   rW   rX   r[   r\   r]   ra   rb   Úcsvrc   r˜   )r   ÚexistsÚlogÚerrorÚopenrÎ   Ú
DictReaderÚ	enumeraterÉ   r9   ÚappendrA   r.   r1   rP   )ÚpathÚpÚsalesÚfÚreaderÚirÆ   ÚerrorsÚraw_daterR   rS   ÚtiporU   rV   r?   ÚfirstÚlastrY   rZ   Úzip_cr\   ÚnumÚrazaor`   Ú	valor_csvs                            r-   Úload_from_csvrå   _  s;  € ÜˆT‹
€AØ�8‰8Œ:Ü�	‰	Ð*¨DÔ1Øˆ	à€EØ	
�‰�˜k°2ˆÓ	6ð +¸!Ü—‘ Ó"ˆÜ ¨aÔ0ó )	‰FˆAˆsØ "ˆFÜ˜S &Ó)ˆHÜ  Ó*ˆDÙ˜D˜LØ—‘ ¨x¨lÐ;Ô<ä˜S *Ó-ˆHÜ˜˜nÓ-ˆDÜ˜#˜wÓ'ˆEÜ˜#˜wÓ'ˆEÜ˜˜fÓ%ˆDÜ$ TÓ*‰KˆE�4Ü˜˜fÓ%ˆDÜ˜#˜wÓ'ˆEÜ˜#˜uÓ%ˆEÜ'¬¨c°7Ó(;Ó<ˆJÜœE # yÓ1Ó2ˆCÜ˜#˜~Ó.ˆEÜ˜S *Ó-ˆHÜ&¤u¨S°'Ó':Ó;ˆIà�L‰Lœò Ùðáðñ "ðñ "ð	ñ
 ðñ ðñ !ðñ ðñ ðñ ðñ ðñ &ðñ  ðñ #ðñ "ðñ   )ð!ñ" !ð#ñ$ $ð%ö ñ-)	÷+ðX €L÷Y+ðX €Lús   Á
E1GÇGc                óŒ  — t         rt        st        j                  d«       g S g }t	        «       }d}	 t
        ddddœ}|r||d<   t        j                  t         › d�d	t        i|d
¬«      }|j                  dk7  r1t        j                  d|j                  |j                  dd «       	 |S |j                  «       }|j                  dg «      D �]0  }|j                  d«      }	|	|v rŒ|j                  |	«       |j                  dd«      }
	 t        j                  |
dd d«      }|r|| k  s||kD  rŒd	 |d   d   d   }|j                  dg «      }|sŒ…|d   d   d   d   d   d   d   }|j                  di «      xs i j                  dd«      }|j                  di «      xs i j                  dd«      }|j                  di «      xs i j                  dd«      }|j                  di «      xs i j                  dd«      }|j                  d i «      xs i }|j                  d!d«      }t%        |«      \  }}|j                  d"d«      }|j                  d#d«      }|j                  d$d«      }|j                  d%d«      }|j                  d&d«      }|j                  d'i «      xs i j                  d(d«      }|j'                  t)        t+        |	«      ||||||||||t-        |«      t/        |«      |d)|	› �¬*«      «       �Œ3 |j                  d+«      }|s	 |S �Œæ# t        $ r d}Y �Œw xY w# t        t         t"        f$ r Y �Œuw xY w),z9Puxa executions do workflow VRA e extrai body do webhook.zHN8N_PX3_URL/N8N_PX3_TOKEN nao configurado em /opt/mia/config/n8n_px3.envNéú   ÚsuccessÚtrue)Ú
workflowIdÚlimitÚstatusÚincludeDataÚcursorz/api/v1/executionszX-N8N-API-KEYé   )ÚheadersÚparamsÚtimeoutéÈ   zN8N executions error %s: %sr¥   ÚidÚ	startedAtr   r6   r4   Ú
resultDataÚrunDatazPLANILHA DE VENDASr   ÚmainÚjsonÚbodyÚDADOS_VENDAr¦   r¨   r·   rº   ÚREPRESENTANTEr¯   rª   r­   r²   r´   r¶   ÚDADOS_DA_EMPRESAr»   Ú	n8n_exec_)rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r_   rb   Ú
nextCursor)ÚN8N_URLÚ	N8N_TOKENrÐ   rÑ   ÚsetÚVRA_WORKFLOW_IDÚrequestsrˆ   Ústatus_codeÚtextrù   Úaddr   r7   r)   ÚKeyErrorÚ
IndexErrorÚ	TypeErrorrA   rÕ   rP   r0   r.   r1   )rÍ   ÚendrØ   Úseen_idsrî   rñ   rË   r¥   ÚexecuÚeidÚstartedÚdtÚrun_dataÚpv_noderú   rS   rÞ   rÂ   rÃ   Úrepr?   rß   rà   rU   rV   rY   rZ   rá   rã   s                                r-   Úload_from_n8nr  ˜  sn  € å�)Ü�	‰	Ð\Ô]Øˆ	à€EÜ›€HØ€FØ
ä)ØØØ!ñ	
ˆñ Ø%ˆF�8ÑÜ�L‰LÜˆiÐ)Ð*Ø$¤iÐ0ØØô	
ˆð �=‰=˜CÒÜ�I‰IÐ3°Q·]±]ÀAÇFÁFÈ4ÈCÀLÔQØðx €Lðw �v‰v‹xˆØ—X‘X˜f bÓ)ó 5	ˆEØ—)‘)˜D“/ˆCØ�h‰ØØ�L‰L˜ÔØ—i‘i ¨RÓ0ˆGðÜ×&Ñ& w¨s° |Ð5HÓI�ñ �r˜E’z R¨#¢XØðØ  ™=¨Ñ6°yÑA�Ø"Ÿ,™,Ð';¸RÓ@�ÙØØ˜q‘z &Ñ)¨&Ñ1°!Ñ4°QÑ7¸Ñ?ÀÑG�ð Ÿ™ °Ó3Ò9°r×>Ñ>¸zÈ2ÓNˆHØ—H‘H˜]¨BÓ/Ò5°2×:Ñ:Ð;OÐQSÓTˆDØ—X‘X˜m¨RÓ0Ò6°B×;Ñ;¸HÀbÓIˆEØ—x‘x ¨rÓ2Ò8°b×=Ñ=Ð>PÐRTÓUˆGØ—(‘(˜?¨BÓ/Ò5°2ˆCØ—7‘7˜?¨BÓ/ˆDÜ$ TÓ*‰KˆE�4Ø—G‘G˜H bÓ)ˆEØ—G‘G˜J¨Ó+ˆEØ—7‘7˜8 RÓ(ˆDØ—G‘G˜H bÓ)ˆEØ—G‘G˜E 2Ó&ˆEØ—X‘XÐ0°"Ó5Ò;¸×@Ñ@ÀÐQSÓTˆEà�L‰LœÜ˜s›8ØØ!Ø!ØØØ ØØØØÜ)¨%Ó0Ü% gÓ.Ø"Ø& s eÐ,ôö ðK5	ðn —‘˜,Ó'ˆÙØØ€Lñ[ øô6 ò Ø“ðûô œj¬)Ð4ò Úðús*   ÄLÄ2L+ÅL+ÌL(Ì'L(Ì+MÍMc                ó   — |ryt         | j                  | j                  rd| j                  z   nd| j                  | j                  | j
                  gdœ}| j                  r| j                  |d<   	 t        j                  t        dt        › �ddd	œ|d
¬«      }|j                  dv rdd|j                  › �fS dd|j                  › d|j                  d d › �fS # t        j                  $ r}dd|› �fcY d }~S d }~ww xY w)N©TÚDRYú+r   )Ú
locationIdrU   rV   Ú	firstNameÚlastNameÚtagsÚcompanyNamezBearer z
2021-07-28zapplication/json)ÚAuthorizationÚVersionzContent-Typeé   )rð   rù   rò   )ró   éÉ   TzOK FúERR r;   ró   úREQ_ERR )r   rU   rV   rW   rX   r‰   r_   r  ÚpostÚLINKIA_ENDPOINTr
   r  r  ÚRequestException)ÚsaleÚdry_runrú   rË   Úes        r-   Úapply_linkia_tagr*  ô  s  € ÙØä%Ø—‘Ø'+§z¢z�#˜Ÿ
™
Ò"°rØ—_‘_Ø—N‘NØ—‘�ñ€Dð ×ÒØ"×/Ñ/ˆˆ]Ñð%Ü�M‰MÜà#*¬9¨+Ð!6Ø'Ø 2ñð
 Øô	
ˆð �=‰=˜JÑ&Ø˜3˜qŸ}™}˜oÐ.Ð.Ð.Ø˜˜QŸ]™]˜O¨1¨Q¯V©V°D°S¨\¨NÐ;Ð;Ð;øÜ×$Ñ$ò %Ø˜  �nÐ$Õ$ûð%ús%   Á1AC Â8 C ÃC=Ã,C8Ã2C=Ã8C=c                óÆ  — |ry| j                   | j                  | j                  | j                  | j                  | j
                  | j                  d| j                  d| j                  | j                  g| j                  | j                  «       dœ}	 t        j                  t        |d¬«      }|j                  dk(  r]|j                  «       }|j!                  d«      rd	d
| j                  «       › �fS d	d|j!                  d«      › d| j                  «       › �fS dd|j                  › d|j"                  d d › �fS # t        j$                  $ r}dd|› �fcY d }~S d }~ww xY w)Nr  ÚBRÚBRL)rU   rV   rW   rX   rY   rZ   rÁ   Úcountryr^   ÚcurrencyÚcontent_nameÚcontent_idsÚ	num_itemsr�   r   )rù   rò   ró   ÚdedupeTzDEDUPE zOK meta=Úmeta_statusz
 event_id=Fr"  r;   r#  )rU   rV   rW   rX   rY   rZ   r[   r^   rS   r]   r�   r  r$  ÚCAPI_ENDPOINTr  rù   rˆ   r  r&  )r'  Ú	test_coder(  rú   rË   Újr)  s          r-   Úsend_capi_purchaser8    s;  € ÙØð —‘Ø—‘Ø—o‘oØ—^‘^Ø—	‘	Ø—‘Ø�}‰}ØØ—‘ØØŸ™ØŸ™�Ø×%Ñ%Ø—M‘M“Oñ€Dð %ô
 �M‰Mœ-¨d¸BÔ?ˆØ�=‰=˜CÒØ—‘“ˆAØ�u‰u�XŒØ˜w t§}¡}£Ð&7Ð8Ð8Ð8Ø˜8 A§E¡E¨-Ó$8Ð#9¸ÀDÇMÁMÃOÐCTÐUÐUÐUØ˜˜QŸ]™]˜O¨1¨Q¯V©V°D°S¨\¨NÐ;Ð;Ð;øÜ×$Ñ$ò %Ø˜  �nÐ$Õ$ûð%ús+   ÂA D< Ã4&D< Ä D< Ä<E ÅEÅE ÅE c           	     ó¶  — t        | «      }| D �cg c]  }|j                  sŒ|‘Œ }}|D �cg c]  }|j                  rŒ|‘Œ }}i }d}|D ]=  }|j                  |j                  d«      dz   ||j                  <   ||j
                  z  }Œ? |t        |«      |t        |«      z
  t        |«      t        |«      z
  t        |«      t        |d«      |dœS c c}w c c}w )zLRetorna resumo simples (compat com fluxo antigo, usado no --dry-run tambem).r    r   r   rJ   )Ú
total_rowsÚvalidÚinvalidÚtrials_skippedÚpurchases_to_processÚtotal_value_brlÚ
by_product)r=   r}   rm   rˆ   rS   r^   rf   )rØ   Útotalr,   r;  Ú	non_trialr@  Útotal_values          r-   Ú	summarizerD  ;  sÔ   € ä�‹J€EØÖ,�1 §£ŠQÐ,€EÐ,Ø!Ö4�q¨¯«’Ð4€IÐ4Ø!#€JØ€KØò ˆØ!+§¡°·
±
¸AÓ!>ÀÑ!Bˆ
�1—:‘:ÑØ�q—w‘wÑ‰ðð Ü�U“Øœ3˜u›:Ñ%Ü˜e›*¤s¨9£~Ñ5Ü # I£Ü  ¨aÓ0Ø ñð ùò -ùÚ4s   �C¢C¬C¾Cc                ón   — | d›}|j                  dd«      j                  dd«      j                  dd«      S )Nú,.2fr!   ÚXr"   )r'   )rL   r,   s     r-   Ú_fmt_brlrH  P  s6   € àˆTˆ(€AØ�9‰9�S˜#Ó×&Ñ& s¨CÓ0×8Ñ8¸¸cÓBÐBrB   c                ó^  — t        | «      }i }| D ]*  }|j                  xs d}|j                  |d«      dz   ||<   Œ, | D �cg c]  }|j                  sŒ|‘Œ }}| D �cg c]  }|j                  sŒ|‘Œ }}| D �cg c]  }|j
                  sŒ|‘Œ }}| D �cg c](  }|j                  s|j                  s|j
                  s|‘Œ* }	}| D �cg c]  }|j                  sŒ|‘Œ }
}| D �cg c]  }|j                  rŒ|‘Œ }}i }|D ]*  }|j                  xs d}|j                  |d«      dz   ||<   Œ, i }i }|
D ]d  }|j                  |j                  d«      dz   ||j                  <   |j                  |j                  d«      |j                  z   ||j                  <   Œf i }| D ]*  }|j                  xs d}|j                  |d«      dz   ||<   Œ, i }i }|
D ]L  }|j                  xs d}|j                  |d«      dz   ||<   |j                  |d«      |j                  z   ||<   ŒN t        |j                  «       d„ d¬	«      }|
D �cg c]  }|j                  sŒ|j                  ‘Œ }}|rt        |«      nd
}|rt        |«      nd
}t!        d„ |
D «       «      }| D �cg c]  }|j"                  sŒ|‘Œ }}t%        d«       t%        d|› �«       t%        d|› �«       t%        d«       t%        d«       t        |j                  «       d„ d¬	«      D ]  \  }}t%        d|d›d|d›�«       Œ t%        dt        |«      › dt        |«      › dt        |«      › dt        |	«      › �«       t%        d«       t        |j                  «       d„ d¬	«      D ]  \  }}t%        d|d›d|d›�«       Œ t%        d«       t%        dt        |
«      › �«       t%        dt'        |«      › �«       |r2|r0t%        d |j)                  d!«      › d"|j)                  d!«      › �«       nt%        d#«       t%        d$«       t        |j+                  «       «      D ]+  }||   }||   }t%        d|d›d|d›d%t'        |«      › �«       Œ- t%        d&«       |d
d' D ])  \  }}||   }t%        d|d›d|d›d(t'        |«      › �«       Œ+ t%        d)«       t%        dt        |«      › �«       t        |j                  «       d*„ d¬	«      D ]  \  }}t%        d|d+›d|d›�«       Œ t%        d,«       |
d
d' D �]=  }|j,                  dz   |j.                  z   j1                  «       }t%        d-|j2                  d.›d/|j                  r|j                  j)                  d!«      nd0d1›d2|j                  d3›d4|j                  d1›d5|j                  xs d6d
d7 d3›d8t5        |j6                  d9«      d:›d;t5        |j8                  d<«      d3›d=t5        |d>«      d?›d@|j:                  dA›dB|j<                  dC›dDt'        |j                  «      dE›dF|j>                  xs d6d
dG dH›dI|j@                  xs d6d
dJ dK›�«       �Œ@ t%        dL«       d}|D ]Á  }|j,                  dz   |j.                  z   j1                  «       }t%        d-|j2                  d.›dM|j                  d›d2|j                  xs d6d
d7 d3›d4|j                  xs d6d
dN d1›d8|j6                  rt5        |j6                  d9«      nddO›d=|rt5        |d>«      ndd?›�«       |dz  }|d>k\  sŒÁ n |rHt%        dPt        |«      › dQ�«       |d
dN D ]'  }t%        d-|j2                  › dR|j"                  › �«       Œ) nt%        dS«       t%        d«       y
c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Tz9Relatorio completo pro dry-run (formato pedido pela Mia).r„   r   r   Úoutror    z(sem vendedor)c                ó   — | d   S ©Nr   r˜   ©Úxs    r-   ú<lambda>zdryrun_report.<locals>.<lambda>‡  s
   € °Q°q±T€ rB   T)ÚkeyÚreverseNc              3  ó4   K  — | ]  }|j                   –— Œ y ­wrt   )r^   )rž   r,   s     r-   r    z dryrun_report.<locals>.<genexpr>Ž  s   è ø€ Ò3 !�a—g•gÑ3ùs   ‚zG
======================================================================zDRY-RUN BACKFILL PX3 - source: zTotal de linhas: zF======================================================================z#
[DISTRIBUICAO POR TIPO DE CREDITO]c                ó   — | d   S rL  r˜   rM  s    r-   rO  zdryrun_report.<locals>.<lambda>š  s
   € °a¸±d€ rB   z  - Ú30r;   z>4z  Resumo: REGULAR=z  TESTE=z  REPOSICAO=z  outros/vazio=z.
[DISTRIBUICAO POR SOFTWARE - todas as linhas]c                ó   — | d   S rL  r˜   rM  s    r-   rO  zdryrun_report.<locals>.<lambda>   s
   € ¸!¸A¹$€ rB   Ú25z9
[PROCESSAVEIS] (REGULAR + email OK + software conhecido)z	  Total: z  Valor total: R$ z  Periodo: r3   z -> z  Periodo: (sem datas validas)z
[POR SOFTWARE - processaveis]z   R$ z 
[TOP VENDEDORES - processaveis]r   z vendas   R$ z
[SKIPPADOS]c                ó   — | d   S rL  r˜   rM  s    r-   rO  zdryrun_report.<locals>.<lambda>¸  s
   € ¸1¸Q¹4€ rB   Ú40z&
[AMOSTRA - 5 PROCESSAVEIS mascaradas]ú  row=z>3ú date=r’   Ú10ú soft=Ú15ú tipo=z vend=rŒ   r   ú email=é   Ú22ú phone=é   ú nome=é   Ú18z	 credits=z>5z unit=z.3fz val=R$ z>10z loc=é   Ú12ú/rJ   Ú2z#
[AMOSTRA - 3 SKIPPADOS mascarados]z reason=rF   Ú20z
[LINHAS COM ERRO DE PARSE] z linhasz errors=z#
[LINHAS COM ERRO DE PARSE] nenhuma)!r=   rT   rˆ   rv   rm   rr   r   r…   rS   r^   r`   ÚsortedÚitemsrR   ÚminÚmaxÚsumrc   ÚprintrH  r�   ÚkeysrW   rX   r$   rQ   rN   rU   rV   r]   r\   rY   rZ   )rØ   Úsource_labelrA  Úby_tipor,   rP  ÚregularÚtrialsrƒ   ÚoutrosÚprocessableÚskippedÚskip_reasonsrË   Úby_soft_countÚby_soft_valueÚby_soft_allÚby_vendÚby_vend_valueÚvkÚtop_vendÚdatesÚdt_minÚdt_maxrC  Úparse_brokenÚkrL   rŸ   r?   Úshowns                                  r-   Údryrun_reportrˆ  V  s"  € ä�‹J€Eð !€GØò /ˆØ�n‰nÒ) 	ˆØ—{‘{ 3¨Ó*¨QÑ.ˆ�Šð/ð  Ö0�Q 1§<£<ŠqÐ0€GÐ0ØÖ-�A !§*£*ŠaÐ-€FÐ-Ø!Ö4�q Q§^£^’Ð4€IÐ4Øö M�AØ—\’\¨!¯*ª*¸Q¿^º^ò ð M€Fð Mð $Ö8˜ q×'7Ó'7’1Ð8€KÐ8ð  Ö8�Q q×'7Ó'7ŠqÐ8€GÐ8ð $&€LØò 5ˆØ�M‰MÒ$˜WˆØ&×*Ñ*¨1¨aÓ0°1Ñ4ˆ�QŠð5ð
 %'€MØ&(€MØò QˆØ$1×$5Ñ$5°a·j±jÀ!Ó$DÀqÑ$Hˆ�a—j‘jÑ!Ø$1×$5Ñ$5°a·j±jÀ#Ó$FÈÏÉÑ$Pˆ�a—j‘jÒ!ðQð
 #%€KØò 7ˆØ�j‰jÒ%˜IˆØ&Ÿ?™?¨3°Ó2°QÑ6ˆ�CÒð7ð
 !€GØ&(€MØò AˆØ�Z‰ZÒ+Ð+ˆØ—k‘k " aÓ(¨1Ñ,ˆ�‰Ø)×-Ñ-¨b°#Ó6¸¿¹Ñ@ˆ�bÒðAô
 �g—m‘m“o©>À4ÔH€Hð )Ö3˜¨A¯F«FˆQ�V‹VÐ3€EÐ3Ù ŒS�ŒZ d€FÙ ŒS�ŒZ d€FäÑ3 {Ô3Ó3€Kð  %Ö7˜!¨¯«’AÐ7€LÐ7ô 
ˆ/ÔÜ	Ð+¨L¨>Ð
:Ô;Ü	Ð˜e˜WÐ
%Ô&Ü	ˆ(„Oä	Ð
0Ô1Ü�w—}‘}“©NÀDÔIò $‰ˆˆ1Ü��Q�r�F˜!˜A˜b˜6Ð"Õ#ð$ä	Ðœs 7›|˜n¨H´S¸³[°Mð BÜ˜9“~Ð& o´c¸&³k°]ðDô Eô 
Ð
;Ô<Ü�{×(Ñ(Ó*±ÈÔMò $‰ˆˆ1Ü��Q�r�F˜!˜A˜b˜6Ð"Õ#ð$ô 
Ð
FÔGÜ	ˆI”c˜+Ó&Ð'Ð
(Ô)Ü	Ðœx¨Ó4Ð5Ð
6Ô7Ù‘&Ü�˜FŸO™O¨JÓ7Ð8¸¸V¿_¹_ÈZÓ=XÐ<YÐZÕ[äÐ.Ô/ä	Ð
+Ô,Ü�M×&Ñ&Ó(Ó)ò 7ˆØ˜!ÑˆØ˜!ÑˆÜ��Q�r�F˜!˜A˜b˜6 ¬°« }Ð5Õ6ð7ô
 
Ð
-Ô.Ø˜˜!�ò >‰ˆˆ1Ø˜!ÑˆÜ��Q�r�F˜!˜A˜b˜6 ¬x¸«{¨mÐ<Õ=ð>ô 
ˆ/ÔÜ	ˆI”c˜'“l�^Ð
$Ô%Ü�|×)Ñ)Ó+±ÈÔNò $‰ˆˆ1Ü��Q�r�F˜!˜A˜b˜6Ð"Õ#ð$ô 
Ð
3Ô4Ø˜˜!ˆ_ó 
ˆØ—‘˜sÑ" Q§[¡[Ñ0×7Ñ7Ó9ˆÜØ�Q—\‘\ "Ð%ð &Ø34·6²6�A—F‘F—O‘O JÔ/¸vÀbÐIð JØ—J‘J˜r�?ð #Ø—N‘N 2Ð&ð 'Ø—Z‘ZÒ& 3¨¨Ð,¨RÐ0ð 1Ü˜!Ÿ'™' 1Ó% bÐ)ð *Ü˜!Ÿ'™' 1Ó% bÐ)ð *Ü˜˜q“M "Ð%ð &Ø—}‘} RÐ(ð )Ø—L‘L Ð%ð &Ü˜qŸw™wÓ'¨Ð,ð -Ø—F‘F’M˜c 3 BÐ'¨Ð+¨1¨a¯g©gªn¸¸b¸qÐ-AÀ!Ð,DðFö	
ð
ô" 
Ð
0Ô1Ø€EØò ˆØ—‘˜sÑ" Q§[¡[Ñ0×7Ñ7Ó9ˆÜØ�Q—\‘\ "Ð%ð &Ø—m‘m BÐ'ð (Ø—Z‘ZÒ& 3¨¨Ð,¨RÐ0ð 1Ø—^‘^Ò* s¨C¨RÐ0°Ð4ð 5Ø)*¯ª”T˜!Ÿ'™' 1Ô%°iÀÐCð DÙ%)”D˜˜q”M¨y¸Ð<ð>ô	
ð 	�‰
ˆØ�A‹:Ùðñ ÜÐ-¬c°,Ó.?Ð-@ÀÐHÔIØ˜c˜rÐ"ò 	CˆAÜ�F˜1Ÿ<™<˜.¨°·±Ð0@ÐAÕBñ	Cô 	Ð4Ô5ä	ˆ(…OùòK 1ùÚ-ùÚ4ùòMùò 9ùò 9ùò@ 4ùò 8sZ   Á^Á^Á^Á/^Á9^Â^Â-^Ã^Ã^Ã$^ Ã6^ É^%É^%Ê^*Ê)^*c                ó¢  — t        d«       d}| D �]2  }|j                  r|j                  rŒt        d|j                  › d|j                  r|j                  j                  d«      nd› d|j                  d›d	|j                  d
›dt        |j                  d«      d›dt        |j                  d«      d
›dt        |j                  dz   |j                  z   d«      d›d|j                  d›d|j                  › d|j                  › d|j                   d d d
›d|j"                  d d d›�«       |dz  }||k\  s�Œ) t        «        y  t        «        y )Nz
--- Amostra (mascarada) ---r   rY  rZ  r5   r’   r\  Ú16r^  r]  r_  r`  rk  rb  rc  rd  r;   re  z val=R$z>10.2fz (rN  z) city=r   ri  rJ   rj  r   )rq  r}   rm   rQ   rR   r�   rS   rT   rN   rU   rV   rW   rX   r^   r]   r\   rY   rZ   )rØ   Únr‡  r,   s       r-   Úshow_samplerŒ  è  sF  € Ü	Ð
)Ô*Ø€EØó ˆØ�zŠz˜QŸZšZØÜØ�Q—\‘\�N &ÈÏÊ¨¯©¯©¸Ô)DÐTZÐ([ð \Ø—J‘J˜r�? &¨¯©¸Ð(;ð <Ü˜!Ÿ'™' 1Ó% bÐ)¨´°a·g±g¸qÓ1AÀ"Ð0Eð FÜ˜Ÿ™¨Ñ+¨a¯k©kÑ9¸1Ó=¸bÐAð BØ—W‘W˜VÐ$ B q§}¡} o°Q°q·|±|°nð EØ—F‘F˜3˜B�K Ð# 1 Q§W¡W¨R¨a [° Oð5ô	
ð 	�‰
ˆØ�AŒ:ØÜ	…Gðô 
…GrB   c                 ó
  — t        j                  d¬«      } | j                  dddgd¬«       | j                  dd	d
¬«       | j                  dd d¬«       | j                  dd d¬«       | j                  dd¬«       | j                  dt        dd¬«       | j                  ddd¬«       | j                  dt        dd¬«       | j                  ddd¬«       | j                  d dd!¬«       | j	                  «       }|j
                  r"|j                  rt        j                  d"«       y#t        j                  «       }|j                  r!t        j                  |j                  d$«      }n*|j                  r|t        d%¬&«      z
  n|t        d'¬&«      z
  }|j                  r3t        j                  |j                  d$«      j!                  d(d)d)¬*«      }n|t        d+¬&«      z   }t        j#                  d,|j$                  |j'                  «       |j'                  «       |j                  |j(                  |j*                  xs d-|j,                  |j
                  |j                  «
       |j$                  dk(  rJt/        |j0                  «      }|D �cg c])  }|j&                  �||j&                  cxk  r|k  sŒ%n n|‘Œ+ }}nt3        ||«      }|j                  rs|j$                  › d.|j'                  «       › d/|j'                  «       › �}|j$                  dk(  r|d0|j0                  › �z  }t5        ||«       t        j#                  d1«       yt7        |«      }	t9        d2«       t9        d3|j$                  › �«       t9        d4|j'                  «       › d5|j'                  «       › �«       t9        d6|	d7   › �«       t9        d8|	d9   › �«       t9        d:|	d;   › �«       t9        d<|	d=   › �«       t9        d>|	d?   d@›�«       t9        dA«       t;        |	dB   j=                  «       «      D ]  \  }
}t9        dC|
› dD|› �«       Œ t9        dE«       t?        |«       |j*                  rAt@        jB                  jE                  dFd«      }t        jG                  dG|j*                  |«       dx}x}x}x}}d}|D �]V  }|jH                  s|d+z  }Œ|j(                  r||j(                  k\  r �n&|j                  sitK        |dH¬I«      \  }}|r|d+z  }n|d+z  }t        j#                  dJ|jL                  tO        |jP                  dK«      |jR                  |jT                  |«       |j
                  sttW        ||j*                  dH¬L«      \  }}|r|d+z  }n|d+z  }t        j#                  dM|jL                  tO        |jP                  dK«      |jR                  |jX                  |«       |d+z  }||j,                  z  dk(  s�ŒBt[        j\                  dN«       �ŒY t9        d2«       t9        dO«       t9        dP|› �«       t9        dQ|› �«       t9        dR|› dS|› �«       t9        dT|› dS|› �«       t9        dE«       t        j#                  dU||||||«       yc c}w )VNzBackfill Purchases PX3)Údescriptionz--sourcerÎ   Ú
n8n_replayT)ÚchoicesÚrequiredz
--csv-pathz/tmp/vendas.csvz$Caminho do CSV (so pra --source csv))ÚdefaultÚhelpz--startz,Data inicial YYYY-MM-DD (default: 90d atras)z--endz%Data final YYYY-MM-DD (default: hoje)z	--dry-runÚ
store_true)Úactionz--limitr   z"Maximo de eventos (0 = sem limite))Útyper’  r“  z--test-coder   z>test_event_code do Meta - informativo (o CAPI aplica pelo env)z--batch-sizerF   zPausa 500ms a cada Nz
--only-tagz%So aplica tag Linkia (nao envia CAPI))r•  r“  z--only-capizSo envia CAPI (nao aplica tag)z2--only-tag e --only-capi sao mutuamente exclusivosrJ   r5   iB  )ÚdayséZ   é   é;   )ÚhourÚminuteÚsecondr   zmbackfill start | source=%s start=%s end=%s dry_run=%s limit=%s test_code=%s batch=%s only_tag=%s only_capi=%sz(none)z janela=z..z file=z$DRY-RUN concluido. Nada foi enviado.z=
============================================================zSOURCE: zJANELA: z .. zTotal linhas carregadas: r:  z/  invalidas (sem email/software desconhecido): r<  z  trials pulados: r=  z  compras a processar: r>  z  valor total processavel: R$ r?  rF  z  distribuicao por produto:r@  z    - z: z<============================================================ÚMETA_TEST_EVENT_CODEz¦test_code=%s informado. Confirme que META_TEST_EVENT_CODE do CAPI esta ativo. Env atual visto no processo do backfill: %r (informativo, o CAPI usa o seu proprio env).F)r(  z)TAG row=%d email=%s soft=%s slug=%s -> %sr`  )r6  r(  z-CAPI row=%d email=%s soft=%s value=%.2f -> %sg      à?Ú	RESULTADOz  processados: z  pulados (trial/invalido): z  tag ok/err: ri  z  capi ok/err: zQbackfill DONE processed=%d ok_tag=%d err_tag=%d ok_capi=%d err_capi=%d skipped=%d)/ÚargparseÚArgumentParserÚadd_argumentr0   Ú
parse_argsÚonly_tagÚ	only_capirÐ   rÑ   r   ÚnowrÍ   r7   r(  r   r  r'   ÚinfoÚsourcerR   rë   r6  Ú
batch_sizerå   Úcsv_pathr  rˆ  rD  rq  rl  rm  rŒ  ÚosÚenvironrˆ   Úwarningr   r*  rQ   rN   rU   rS   r‰   r8  r^   ÚtimeÚsleep)ÚparserÚargsr¦  rÍ   r  Ú	all_salesr,   rØ   ÚlabelÚstatsr†  rL   ÚcurrÚok_tagÚerr_tagÚok_capiÚerr_capiry  Ú	processedÚokÚmsgs                        r-   rø   rø   ü  sð  € Ü×$Ñ$Ð1IÔJ€FØ
×Ñ˜
¨U°LÐ,AÈDÐÔQØ
×Ñ˜Ð.?ØCð ô Eà
×Ñ˜	¨4ØKð ô Mà
×Ñ˜¨ØDð ô Fà
×Ñ˜¨LÐÔ9Ø
×Ñ˜	¬°QØAð ô Cà
×Ñ˜¨rØ]ð ô _à
×Ñ˜¬S¸"Ø3ð ô 5à
×Ñ˜¨\ØDð ô Fà
×Ñ˜¨lØ=ð ô ?à×ÑÓ€Dà‡}‚}˜ŸšÜ�	‰	ÐFÔGØô �,‰,‹.€CØ‡z‚zÜ×!Ñ! $§*¡*¨jÓ9‰ð 15·²�”y dÔ+Ò+À3ÌÐXZÔI[ÑC[ˆØ‡x‚xÜ×Ñ §¡¨*Ó5×=Ñ=À2ÈbÐY[Ð=Ó\‰à”I 1Ô%Ñ%ˆä‡H�HØwØ�‰�U—Z‘Z“\ 3§8¡8£:¨t¯|©|¸T¿Z¹ZØ�‰Ò"˜( D§O¡O°T·]±]ÀDÇNÁNôð ‡{�{�eÒÜ! $§-¡-Ó0ˆ	à%ÖT�q¨!¯&©&¨.¸EÀQÇVÁVÔ<RÈsÖ<R’ÐTˆÑTä˜e SÓ)ˆà‡|‚|Ø—;‘;�-˜x¨¯
©
« ~°R¸¿¹»
°|ÐDˆØ�;‰;˜%ÒØ�v˜dŸm™m˜_Ð-Ñ-ˆEÜ�e˜UÔ#Ü�‰Ð7Ô8Øä�eÓ€EÜ	ˆ/ÔÜ	ˆH�T—[‘[�MÐ
"Ô#Ü	ˆH�U—Z‘Z“\�N $ s§x¡x£z lÐ
3Ô4Ü	Ð% e¨LÑ&9Ð%:Ð
;Ô<Ü	Ð;¸EÀ)Ñ<LÐ;MÐ
NÔOÜ	Ð˜uÐ%5Ñ6Ð7Ð
8Ô9Ü	Ð# EÐ*@Ñ$AÐ#BÐ
CÔDÜ	Ð*¨5Ð1BÑ+CÀDÐ*IÐ
JÔKÜ	Ð'Ô)Ü�u˜\Ñ*×0Ñ0Ó2Ó3ò !‰ˆˆ1Ü��q�c˜˜A˜3ÐÕ ð!ä	ˆ(„OÜ�Ôà‡~‚~ä�z‰z�~‰~Ð4°bÓ9ˆÜ�‰ðgà�N‰N˜Dô	
ð 78Ð7€FÐ7ˆWÐ7�wÐ7 ¨GØ€IØó ˆØ×ÒØ�q‰LˆGØØ�:Š:˜) t§z¡zÒ1Úð �~Š~Ü& q°%Ô8‰GˆB�ÙØ˜!‘‘à˜1‘�Ü�H‰HÐ@Ø—\‘\¤4¨¯©°Ó#3°Q·Z±ZÀÇÁÈSôRð �}Š}Ü(¨°d·n±nÈeÔT‰GˆB�ÙØ˜1‘‘à˜A‘�Ü�H‰HÐDØ—\‘\¤4¨¯©°Ó#3°Q·Z±ZÀÇÁÈ#ôOð 	�Q‰ˆ	Ø�t—‘Ñ&¨!Ô+Ü�J‰J�sŽOð;ô> 
ˆ/ÔÜ	ˆ+ÔÜ	ˆO˜I˜;Ð
'Ô(Ü	Ð(¨¨	Ð
2Ô3Ü	ˆN˜6˜( ! G 9Ð
-Ô.Ü	ˆO˜G˜9 A h ZÐ
0Ô1Ü	ˆ(„OÜ‡H�HÐ`Ø˜ ¨°(¸GôEàùò_ Us   Ê&Z Ê4Z Ú__main__)r+   r#   r‘   r(   )r+   r#   r‘   r0   )r+   r#   r‘   r�   )r?   r#   r‘   ztuple[str, str])r+   r#   r‘   r#   )rc  )rL   r#   rM   r0   r‘   r#   )r,   r#   r‘   r#   )rÆ   ÚdictrÇ   r#   r‘   r#   )rÖ   r#   r‘   ú
list[Sale])rÍ   r   r  r   r‘   r¿  )F)r'  rP   r(  ry   r‘   útuple[bool, str])r   F)r'  rP   r6  r#   r(  ry   r‘   rÀ  )rØ   r¿  r‘   r¾  )rL   r(   r‘   r#   )rØ   r¿  rs  r#   r‘   r’   )r   )rØ   r¿  r‹  r0   r‘   r’   )r‘   r0   )[Ú__doc__Ú
__future__r   r   rÎ   rù   Úloggingr«  r%   Úsysr®  rœ   r   r   r   Úlogging.handlersr   Úpathlibr   Útypingr	   r  Ú__file__ÚresolveÚparentÚBASE_DIRÚPROJECT_DIRr5  r%  rÖ   Úinsertr#   Ú
config_ghlr
   r   ÚImportErrorr)  rq  ÚstderrÚexitÚN8N_ENVr   r  rÏ   Ú	read_textÚ
splitlinesr+   r$   ÚlineÚ
startswithr<   r†  rL   r  r|   rk   ÚREPOSICAO_MARKERru   ÚLOG_FILEÚmkdirÚ	FormatterÚ_fmtÚ_fhÚsetFormatterÚStreamHandlerÚstdoutÚ_shÚbasicConfigÚINFOÚ	getLoggerrÐ   r.   r1   r9   rA   rH   rN   rP   rp   rÅ   rÉ   rå   r  r*  r8  rD  rH  rˆ  rŒ  rø   r“   r˜   rB   r-   ú<module>rä     s"  ðñ'õR #ã Û 
Û Û Û 	Û 	Û 
Û Û ß 2Ñ 2Ý 0Ý Ý ã ñ
 �‹>×!Ñ!Ó#×*Ñ*€Ø�o‰o€àA€ØH€ð ‡�‡��‘3�{Ó#Ô $ðß5ñ Ð,Ó
-€Ø
€Ø€	Ø
‡>�>ÔØ× Ñ ¨'Ð Ó2×=Ñ=Ó?ò "ˆØ�y‰y‹{ˆÙ�t—‘ sÔ+¨s¸$©ØØ�z‰z˜#˜qÓ!‰ˆˆ1Ø�7‰7‹9˜Ò%Ø—g‘g“i‰GØ�W‰W‹Y˜/Ó)ØŸ™›	‰Ið"ð %€ð 0Ø,Ø-Ø+Ø2ñ€ð #€Ø Ð Ø€ñ
 Ð:Ó;€Ø ‡�× Ñ ˜d¨TÐ Ô 2à€w×ÑÐBÓC€Ù˜(Ð-=È1ÐW^Ô_€Ø × Ñ �Ô Ø€g×Ñ˜CŸJ™JÓ'€Ø × Ñ �Ô Ø €× Ñ ˜'Ÿ,™,°#°s°Õ <Ø€g×Ñ˜Ó'€óó&óó*)ó	ô%÷e2ñ e2óPò DØ  *Ð-ÚeÚ>Ú:ÚCØ" HÐ-Ø" HÐ-Ø Ð'ÚDÚRÚAØ  *Ð-Ú6ñ€ó&ó3órVôx%ô@!%óNó*CóOôdó(ðD ˆzÒØ€C‡H�H‰T‹VÕð øði ò Ù	Ð9¸!¸Ð
=ÀCÇJÁJÕOØ€C‡H�HˆQ‡K‚Kûðús   Â K ËLË)LÌL