Ë
    Q§jûH  ã                  óî  — U 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mZm	Z	m
Z
 ddlmZ ddlmZ  ed«      Z ed«      Z ed	«      Z ej$                  d
«      Z ej(                  «       Zg ddddœZded<   dZ ej2                  d«      Zd d„Zd!d„Zd"d„Zd#d„Zd$d„Zd%d„Z d&d„Z!	 	 d'	 	 	 	 	 	 	 	 	 	 	 d(d„Z"d)d„Z#d*d„Z$d+d,d„Z%	 d-	 	 	 	 	 	 	 d.d„Z&d/d„Z'd0d„Z(	 	 	 d1	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d2d„Z)y)3aÕ  
Modulo de VENDAS REAIS (CAPI PX3).

Parseia /opt/mia/logs/track_capi_px3.log procurando eventos Purchase enviados
ao Facebook. Retorna agregacoes por periodo, produto, vendedor e curva diaria.

- Live vs Backfill: eventos com event_id comecando por "backfill-vra-" sao
  considerados historicos (importacoes retroativas) e ficam SEPARADOS da
  contagem viva. O front escolhe se soma ou nao.
- Test mode: eventos com test_mode=true nao entram nas metricas de producao.
é    )ÚannotationsN)ÚdatetimeÚ	timedeltaÚtimezone)ÚPath)ÚZoneInfoz /opt/mia/logs/track_capi_px3.logzAmerica/Sao_PauloÚUTCzCAPI\s+(\{.*\})\s*$ç        )Ú	purchasesÚlog_sizeÚ	log_mtimeÚtsÚdictÚ_CACHEéx   Úvendasc                óö   — | j                  «       } | rd| vry t        j                  | «      }|sy 	 t        j                  |j                  d«      «      }|j                  d«      dk7  ry |S # t        $ r Y y w xY w)NÚPurchaseé   Úevent)ÚstripÚ_CAPI_LINE_REÚsearchÚjsonÚloadsÚgroupÚ	ExceptionÚget)ÚlineÚmÚds      ú6/opt/mia/workspace/clientes/px3lab/dashboard/vendas.pyÚ_parse_liner#   0   sy   € Ø�:‰:‹<€DÙ�: TÑ)ØÜ×Ñ˜TÓ"€AÙØðÜ�J‰J�q—w‘w˜q“zÓ"ˆð 	‡u�uˆWƒ~˜Ò#ØØ€Høô	 ò Ùðús   ±$A, Á,	A8Á7A8c                 ó®  — t         5  	 t        j                  «       } t        j
                  «       }| j                  t        d   k(  xr+ | j                  t        d   k(  xr |t        d   z
  t        k  }|rt        d   rt        d   cddd«       S g }	 t        j                  dd	d
¬«      5 }|D ]!  }t        |«      }|sŒ|j                  |«       Œ# 	 ddd«       |t        d<   | j                  t        d<   | j                  t        d<   |t        d<   |cddd«       S # t        $ rD g t        d<   dt        d<   dt        d<   t        j
                  «       t        d<   g cY cddd«       S w xY w# 1 sw Y   ŒœxY w# t        $ rD}t        j                  d|› �«       t        j                  d«      xs g cY d}~cddd«       S d}~ww xY w# 1 sw Y   yxY w)zƒLe o log inteiro e retorna todos os Purchase encontrados.
    Cache invalidado se o arquivo cresceu ou mtime mudou (piso de 2 min).r   r   r   r
   r   r   NÚrzutf-8Úreplace)ÚencodingÚerrorszFalha lendo CAPI log: )Ú_CACHE_LOCKÚCAPI_LOGÚstatÚFileNotFoundErrorr   ÚtimeÚst_sizeÚst_mtimeÚ_TTLÚopenr#   Úappendr   ÚlogÚwarningr   )ÚstÚnowÚcache_validor   Úfr   r!   Úes           r"   Ú_load_purchasesr:   @   sÂ  € ô 
ñ "ð	Ü—‘“ˆBô �i‰i‹kˆà�J‰Jœ& Ñ,Ñ,ò ,Ø—‘œv kÑ2Ñ2ò,à”v˜d‘|Ñ#¤tÑ+ð 	ñ
 œF ;Ò/Ü˜+Ñ&÷#"ñ "ð& !#ˆ	ð	1Ü—‘˜s¨W¸Y�ÓGð ,È1Øò ,�DÜ# DÓ)�AÚØ!×(Ñ(¨Õ+ñ,÷,ð (Œˆ{ÑØŸZ™ZŒˆzÑØ Ÿk™kŒˆ{ÑØŒˆt‰Ø÷E"ñ "øô !ò 	Ø"$ŒF�;ÑØ!"ŒF�:ÑØ"%ŒF�;ÑÜŸ9™9›;ŒF�4‰LØ‰I÷"ñ "ð	ú÷$,ð ,ûô
 ò 	1Ü�K‰KÐ0°°Ð4Ô5Ü—:‘:˜kÓ*Ò0¨bÔ0÷9"ñ "ûð4	1ú÷5"ð "úsƒ   ‡G‰D�A*GÂGÂE;Â,E/Ã E/ÃE;Ã9GÄAE,Å GÅ+E,Å,GÅ/E8	Å4E;Å;	GÆ0GÆ4GÆ5GÇGÇGÇGc                óº   — | sy 	 t        j                  | j                  dd«      «      }|j                  €|j                  t        ¬«      }|S # t
        $ r Y y w xY w)NÚZz+00:00)Útzinfo)r   Úfromisoformatr&   r=   ÚTZ_UTCr   )r   Údts     r"   Ú	_parse_tsrA   k   sY   € ÙØðÜ×#Ñ# B§J¡J¨s°HÓ$=Ó>ˆØ�9‰9ÐØ—‘¤6�Ó*ˆBØˆ	øÜò Ùðús   …AA Á	AÁAc                óz   — | xs dj                  «       j                  «       }|sy|j                  dd«      dv ry|S )zSNormaliza content_name variantes (FOTODRIVE/FOTO DRIVE/PHOTO DRIVE -> PHOTO DRIVE).Ú zSEM PRODUTOÚ )Ú	FOTODRIVEÚ
PHOTODRIVEúPHOTO DRIVE)r   Úupperr&   )Úcontent_nameÚns     r"   Ú_norm_produtorK   w   s@   € à	Ò	˜×"Ñ"Ó$×*Ñ*Ó,€AÙØà‡y�y��bÓÐ8Ñ8ØØ€Hó    c                ó
  — | xs dj                  «       j                  «       }|sy|j                  d«      ry|j                  d«      r;|j                  d«      }t	        |«      dk\  r|d   }|j                  «       rd	|› �S |S y)
zù
    event_id observado:
      backfill-vra-r39-20260527
      vra-paulo-prod-1787593107
      vra-9483
      vra-public-1787593154
      vra-integracao-test-1787593825

    Extrai a "tag" logo apos "vra-" (paulo, public, integracao, 9483 etc.)
    rC   Údesconhecidoúbackfill-vraÚbackfillzvra-Ú-é   r   z	execucao )r   ÚlowerÚ
startswithÚsplitÚlenÚisdigit)Úevent_idÚeidÚpartsÚtags       r"   Ú_extrair_vendedorr\   ‚   s   € ð Š>�r×
 Ñ
 Ó
"×
(Ñ
(Ó
*€CÙØØ
‡~�~�nÔ%ØØ
‡~�~�fÔØ—	‘	˜#“ˆÜˆu‹:˜Š?Ø˜‘(ˆCà�{‰{Œ}Ø" 3 %Ð(Ð(ØˆJØrL   c                óH   — | xs dj                  «       j                  d«      S )NrC   rO   )rS   rT   )rX   s    r"   Ú_is_backfillr^   �   s    € ØŠN˜×!Ñ!Ó#×.Ñ.¨~Ó>Ð>rL   c                ó6   — t        | j                  d«      «      S )NÚ	test_mode)Úboolr   )Úpurchases    r"   Ú_is_testrc   ¡   s   € Ü�—‘˜[Ó)Ó*Ð*rL   c                óê   — g }| D ]k  }t        |j                  dd«      «      }|sŒ!||cxk  r|k  sn Œ/|st        |j                  dd«      «      rŒM|st        |«      rŒ[|j	                  |«       Œm |S )Nr   rC   rX   )rA   r   r^   rc   r2   )r   Ú
inicio_utcÚfim_utcÚincluir_backfillÚincluir_testÚoutÚpr@   s           r"   Úfiltrar_periodork   ¨   sx   € ð €CØò 
ˆÜ�q—u‘u˜T 2“Ó'ˆÙØØ˜bÔ+ GÔ+ØÙ¤L°·±°zÀ2Ó1FÔ$GØÙ¤¨¤ØØ�
‰
�1�ð
ð €JrL   c                óÆ   — 	 t        | xs d«      }|d›}|j                  dd«      j                  dd«      j                  dd«      }d|› �S # t        t        f$ r d}Y ŒNw xY w)Nr   r
   z,.2fÚ,ú@ú.zR$ )ÚfloatÚ	TypeErrorÚ
ValueErrorr&   )ÚvalueÚvÚss      r"   Ú_fmt_brlrv   ¾   sq   € ðÜ�%’*˜1Óˆð ˆTˆ(€AØ	�	‰	�#�sÓ×#Ñ# C¨Ó-×5Ñ5°c¸3Ó?€AØ��ˆ9Ðøô	 ”zÐ"ò ØŠðús   ‚A ÁA ÁA c                ó˜  — t        | «      }d}i }i }i }| D �]$  }d}	 t        |j                  d«      xs d«      }||z  }t        |j                  dd«      «      }||vrdddœ||<   ||   dxx   dz  cc<   ||   d	xx   |z  cc<   t        |j                  d
d«      «      }	|	rP|	j                  t        «      j                  d«      }
|
|vrdddœ||
<   ||
   dxx   dz  cc<   ||
   d	xx   |z  cc<   t        |j                  dd«      «      }||vrdddœ||<   ||   dxx   dz  cc<   ||   d	xx   |z  cc<   �Œ' |r||z  nd}|j                  «       D ��cg c](  \  }}||d   t        |d	   d«      t        |d	   «      dœ‘Œ* }}}|j                  d„ ¬«       g }t        |j!                  «       «      D ]S  }||   }	 t#        j$                  |d«      j                  d«      }|j)                  |||d   t        |d	   d«      dœ«       ŒU |j                  «       D ��cg c](  \  }}||d   t        |d	   d«      t        |d	   «      dœ‘Œ* }}}|j                  d„ ¬«       |t        |d«      t        |«      t        |d«      t        |«      dœ|||dœS # t        t        f$ r d}Y �Œpw xY wc c}}w # t&        $ r |}Y ŒÜw xY wc c}}w )z0Agrega KPIs, produtos, curva diaria, vendedores.r
   rs   r   rI   rC   )r   Úreceitar   r   rx   r   z%Y-%m-%drX   rR   )Úprodutor   rx   Úreceita_fmtc                ó   — | d    S ©Nrx   © ©Úxs    r"   ú<lambda>z agregar_vendas.<locals>.<lambda>ô   s   €  q¨¡| m€ rL   ©Úkeyz%d/%m)ÚdataÚdata_isor   rx   )Úvendedorr   rx   rz   c                ó   — | d    S r|   r}   r~   s    r"   r€   z agregar_vendas.<locals>.<lambda>	  s   € ¨¨9©¨€ rL   )Útotal_vendasÚreceita_totalÚreceita_total_fmtÚticket_medioÚticket_medio_fmt)ÚkpisÚpor_produtoÚcurva_diariaÚ
vendedores)rV   rp   r   rq   rr   rK   rA   Ú
astimezoneÚTZ_BRÚstrftimer\   ÚitemsÚroundrv   ÚsortÚsortedÚkeysr   Ústrptimer   r2   )r   Útotalrx   r�   Úpor_diaÚpor_vendedorrj   ÚvalÚprodr@   Údata_brÚvendrŠ   Úkrt   Úprodutos_listaÚ
dias_listar!   ÚinfoÚlabelÚvendedores_listas                        r"   Úagregar_vendasr¦   È   sJ  € ä�‹K€EØ€GØ#%€KØ!€GØ$&€Làó -ˆØˆð	Ü˜Ÿ™˜g›Ò+¨!Ó,ˆCð 	�3‰ˆä˜QŸU™U >°2Ó6Ó7ˆØ�{Ñ"Ø+,¸Ñ =ˆK˜ÑØ�DÑ˜(Ó# qÑ(Ó#Ø�DÑ˜)Ó$¨Ñ+Ó$ä�q—u‘u˜T 2“Ó'ˆÙØ—m‘m¤EÓ*×3Ñ3°JÓ?ˆGØ˜gÑ%Ø./¸CÑ#@�˜Ñ Ø�GÑ˜XÓ&¨!Ñ+Ó&Ø�GÑ˜YÓ'¨3Ñ.Ó'ä  §¡ z°2Ó!6Ó7ˆØ�|Ñ#Ø,-¸#Ñ!>ˆL˜ÑØ�TÑ˜8Ó$¨Ñ)Ó$Ø�TÑ˜9Ó%¨Ñ,Õ%ð5-ñ8 ).�G˜e’O°3€Lð  ×%Ñ%Ó'÷ñ ˆAˆqð   8¡¼¸qÀ¹|ÈQÓ9OÜ   9¡Ó.ó	0ð€Nñ ð
 ×ÑÑ3ÐÔ4à€JÜ�G—L‘L“NÓ#ò ˆØ�q‰zˆð	Ü×%Ñ% a¨Ó4×=Ñ=¸gÓFˆEð 	×ÑØØØ˜8‘nÜ˜T )™_¨aÓ0ñ	
õ 	ðð  !×&Ñ&Ó(÷ñ ˆAˆqð  ! H¡+¼%ÀÀ)ÁÈaÓ:PÜ   9¡Ó.ó	0ðÐñ ð
 ×ÑÑ5ÐÔ6ð "Ü" 7¨AÓ.Ü!)¨'Ó!2Ü! ,°Ó2Ü (¨Ó 6ñ
ð &Ø"Ø&ñð øôo œ:Ð&ò 	Ø‹Cð	üó6øô ò 	ØŠEð	üós/   �JÅ-J/Ç%J5È!-KÊJ,Ê+J,Ê5KËKc                óú  — t        j                  t        «      }|j                  dddd¬«      }|j                  dddd¬«      }|t	        d¬«      z
  }|j                  dddd¬«      t	        |dz
  ¬«      z
  }t        | |j                  t        «      |j                  t        «      «      }t        | |j                  t        «      |j                  t        «      «      }t        |«      }	t        |«      }
|r|
d   d	   |z  nd
}|
d   d   }d
}|dkD  r|	d   d	   |z
  |z  dz  }d
}|dkD  r|	d   d   |z
  |z  dz  }|	d   |t        |d«      t        |d«      t        |«      dœt        |d«      t        |d«      dœdœS )zkCompara vendas de HOJE vs media dos ultimos `janela_dias` dias anteriores.
    Ignora backfill e test.
    r   )ÚhourÚminuteÚsecondÚmicrosecondé   é;   r   )Úseconds)ÚdaysrŒ   r‡   r
   rŠ   éd   rR   )ÚdiasÚ
vendas_diarŠ   r‹   )Ú
vendas_pctÚ
ticket_pct)ÚhojeÚmedia_janelaÚdiff)r   r6   r‘   r&   r   rk   r�   r?   r¦   r”   rv   )r   Újanela_diasÚnow_brÚhoje_iniÚhoje_fimÚ
janela_fimÚ
janela_inirµ   ÚjanelaÚagg_hojeÚ
agg_janelaÚmedia_vendasÚmedia_ticketÚdiff_vendas_pctÚdiff_ticket_pcts                  r"   Úcomparar_hoje_mediarÅ     s©  € ô �\‰\œ%Ó €FØ�~‰~ 1¨Q°qÀaˆ~ÓH€HØ�~‰~ 2¨b¸Èˆ~ÓK€HàœI¨aÔ0Ñ0€JØ×#Ñ#¨°1¸QÈAÐ#ÓNÔQZÐ`kÐnoÑ`oÔQpÑp€Jä˜9 h×&9Ñ&9¼&Ó&AÀ8×CVÑCVÔW]ÓC^Ó_€DÜ˜Y¨
×(=Ñ(=¼fÓ(EÀz×G\ÑG\Ô]cÓGdÓe€Fä˜dÓ#€HÜ Ó'€JáIT�J˜vÑ& ~Ñ6¸ÒDÐZ]€LØ˜fÑ% nÑ5€Là€OØ�aÒØ$ VÑ,¨^Ñ<¸|ÑKÈ|Ñ[Ð^aÑaˆà€OØ�aÒØ$ VÑ,¨^Ñ<¸|ÑKÈ|Ñ[Ð^aÑaˆð ˜Ñ àÜ ¨aÓ0Ü! ,°Ó2Ü (¨Ó 6ñ	
ô   °Ó3Ü °Ó3ñ
ñð rL   c           
     ó  — t        «       }t        || ||¬«      }t        |«      }|D �cg c]a  }t        |j	                  dd«      «      rDt        |j	                  dd«      «      r)| t        |j	                  dd«      «      cxk  r|k  rn n|‘Œc }}t        |«      }t        |d¬«      }	|d   |d   |d	   |d
   |d   d   |d   d   |d   d   dœ|	t        |«      t        j                  t        «      j                  d¬«      dœS c c}w )ztPonto de entrada usado pelo app.py.
    Retorna dict pronto com KPIs + curva + produtos + vendedores + alertas.
    )rg   rX   rC   r   é   )r¸   rŒ   r�   rŽ   r�   r‡   rˆ   r‰   )r‡   rˆ   r‰   r®   )Útimespec)rŒ   r�   rŽ   r�   Úhistorico_backfillÚalertaÚtotal_no_logÚ	gerado_em)r:   rk   r¦   r^   r   rA   rÅ   rV   r   r6   r?   Ú	isoformat)
re   rf   rg   r   ÚliveÚaggrj   Úhistorico_puroÚagg_historicorÊ   s
             r"   Úcoletar_vendasrÒ   D  s5  € ô  Ó!€IÜ˜9 j°'ÐL\Ô]€DÜ
˜Ó
€Cð
 öØÜ˜Ÿ™˜j¨"Ó-Ô.´9¸Q¿U¹UÀ4È»_Ô3MÐR\Ô`iÐjk×joÑjoÐptÐvxÓjyÓ`zô  SFð  Fõ  SFò 	
ð€Nð ô # >Ó2€Mä  ¸Ô:€Fð �F‘Ø˜=Ñ)Ø˜NÑ+Ø˜,Ñ'à)¨&Ñ1°.ÑAØ*¨6Ñ2°?ÑCØ!.¨vÑ!6Ð7JÑ!Kñ
ð
 Ü˜I›Ü—\‘\¤&Ó)×3Ñ3¸YÐ3ÓGñð ùòs   ©A&Dc                óD   — ddl m} | j                  d«      } |||¬«      S )zFReusa a mesma logica do tracking mas escolhe entre first e last touch.r   )Ú_classificar_canalÚattributions)Úmodo)ÚtrackingrÔ   r   )ÚcontatorÖ   rÔ   rÕ   s       r"   Ú_classificar_contato_por_modorÙ   m  s"   € õ ,Ø—;‘;˜~Ó.€LÙ˜l°Ô6Ð6rL   c                ó  — ddddddœ}| j                  di «      xs i }i }|j                  «       D ]U  \  }}|j                  «       D ]=  \  }}|sŒ	|j                  «       |j                  «       v sŒ*|||j                  «       <    ŒU ŒW |S )a�  
    Tenta montar um mapa {tag_compra: valor_padrao_produto} a partir do
    tags_cfg (arquivo /tmp/px3_tags_linkia.json). Se nao houver valor,
    retorna dict vazio (o cruzamento cai no fallback proporcional).

    Suporta duas fontes:
    - tags_cfg['compra_produtos'][tag] = 'nome_produto' -> usa mapa produto->valor abaixo
    - hardcoded fallback pra produtos PX3 conhecidos
    g     �r@g     à…@g     Ðx@)rG   zCLOUD PHOTORFz	E-PHOTORFzCHECKOUT PHOTORFz
FAST ALBUMÚcompra_produtos)r   r“   rS   )Útags_cfgÚPRECO_APROXÚtag_produtoÚmapar[   ry   ÚchaveÚvalors           r"   Ú_mapa_valor_por_produtorâ   u  sŸ   € ð ØØØ!Øñ€Kð —,‘,Ð0°"Ó5Ò;¸€KØ€DØ#×)Ñ)Ó+ò ‰ˆˆWà'×-Ñ-Ó/ò 	‰LˆE�5Ú˜5Ÿ;™;›=¨G¯M©M«OÒ;Ø$)��S—Y‘Y“[Ñ!Ùñ	ðð €KrL   c                óî  — t        d„ |j                  «       D «       «      }t        d„ | D «       «      }t        | «      }	|}
i }|dk(  �rI|�rF|�rCt        d„ |j	                  dg «      D «       «      }t        |«      }dD �ci c]	  }|dddd	œ“Œ }}|D �ci c]  }|d“Œ }}|D ]¸  }|j	                  d
«      xs g D �cg c]  }t        |«      j                  «       ‘Œ }}|D �cg c]	  }||v sŒ|‘Œ }}|sŒSt        |d«      }||vrd}||   dxx   dz  cc<   |D ]2  }||   dxx   dz  cc<   ||   dxx   |j	                  |d«      z  cc<   Œ4 ||xx   dz  cc<   Œº t        d„ |j                  «       D «       «      }|dkD  r|dkD  r||z  }nd}d}
nd}
g }|j                  «       D �]3  \  }}t        |j	                  dd«      xs d«      }t        |j	                  dd«      xs d«      }|
dk(  rP||v rL||   }t        |d   z  d«      }|d   }|}|t        t        d„ |j                  «       D «       «      d«      z  } n+|dkD  r||z  } nd} t        || z  d«      }t        |	| z  d«      }d}!|dk(  r|}!n|dk(  r|}!|!dkD  r||!z  nd}"|dkD  r|!|z  nd}#|j                  |||t        | dz  d«      ||t        |!d«      t        |"d«      t        |#d«      dœ	«       �Œ6 |j                  d„ ¬«       ||
t        |d«      |	|t        |d«      t        |d«      |dkD  rt        t        d„ |D «       «      |z  d«      nd|dkD  rt        t        d„ |D «       «      |z  d«      nddœdœS c c}w c c}w c c}w c c}w )aó  
    Combina CAPI (receita real) com atribuicao GHL pra calcular ROAS por canal.

    Metodos:
    - "proporcional" (padrao, legado): receita CAPI eh distribuida entre canais
      seguindo a proporcao de compras GHL (share_compras). Simples, sem depender
      de bater 1-to-1.
    - "last_touch": para cada contato GHL que comprou, reclassifica o canal pelo
      last-touch (attribution mais recente) e soma valor aproximado por tag de
      compra (a partir de tags_cfg + precos conhecidos). Fica mais fiel para
      canal, mas o valor TOTAL pode divergir do CAPI (calibra pra CAPI ao final
      via factor de correcao).

    O metodo "last_touch" precisa de `contatos_ghl` e `tags_cfg`. Se nao vier,
    cai automaticamente pro "proporcional".
    c              3  óH   K  — | ]  }|j                  d d«      xs d–— Œ y­w)Úcomprasr   N)r   )Ú.0Údadoss     r"   ú	<genexpr>z(cruzar_com_atribuicao.<locals>.<genexpr>¬  s(   è ø€ ò Ø+0ˆ�‰�9˜aÓ	 Ò	% AÓ	%ñùs   ‚ "c              3  óX   K  — | ]"  }t        |j                  d «      xs d«      –— Œ$ y­w)rs   r   N)rp   r   )ræ   rj   s     r"   rè   z(cruzar_com_atribuicao.<locals>.<genexpr>¯  s"   è ø€ ÒP¸AœU 1§5¡5¨£>Ò#6°Q×7ÑPùs   ‚(*Ú
last_touchc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­w)N)rS   )ræ   Úts     r"   rè   z(cruzar_com_atribuicao.<locals>.<genexpr>¶  s   è ø€ ÒH¨˜!Ÿ'™'Ÿ)ÑHùs   ‚Úcompra)ÚmetaÚgoogleÚwhatsappÚcrmÚdiretor   r
   )Úcompradoresrå   Úreceita_brutaÚtagsrò   ró   r   rå   rô   c              3  ó&   K  — | ]	  }|d    –— Œ y­w)rô   Nr}   ©ræ   rt   s     r"   rè   z(cruzar_com_atribuicao.<locals>.<genexpr>Î  s   è ø€ ÒP°˜˜?Õ+ÑPùó   ‚ÚproporcionalÚleadsrR   c              3  ó&   K  — | ]	  }|d    –— Œ y­w)rå   Nr}   r÷   s     r"   rè   z(cruzar_com_atribuicao.<locals>.<genexpr>ã  s   è ø€ Ò*\¸A¨1¨Y­<Ñ*\ùrø   rî   rï   r°   )	Úcanalrú   Úcompras_ghlÚshare_comprasÚvendas_atribuidasÚreceita_atribuidaÚgastoÚroasÚcpac                ó   — | d    S )Nr   r}   r~   s    r"   r€   z'cruzar_com_atribuicao.<locals>.<lambda>  s   €  1Ð%8Ñ#9Ð"9€ rL   r�   c              3  ó8   K  — | ]  }|d    dk(  sŒ|d   –— Œ y­w)rü   rî   r   Nr}   ©ræ   Úcs     r"   rè   z(cruzar_com_atribuicao.<locals>.<genexpr>  s%   è ø€ Ò#g¸qÐRSÐT[ÑR\Ð`fÓRf AÐ&9Õ$:Ñ#gùó   ‚�
c              3  ó8   K  — | ]  }|d    dk(  sŒ|d   –— Œ y­w)rü   rï   r   Nr}   r  s     r"   rè   z(cruzar_com_atribuicao.<locals>.<genexpr>  s%   è ø€ Ò%kÀÐTUÐV]ÑT^ÐbjÓTj aÐ(;Õ&<Ñ%kùr  )Úreceita_capiÚvendas_capirý   Ú
gasto_metaÚgasto_googleÚ	roas_metaÚroas_google)ÚcanaisÚmetodoÚtotais)ÚsumÚvaluesrV   Úsetr   râ   ÚstrrS   rÙ   r“   Úintr”   Úmaxr2   r•   )$Úvendas_periodoÚatribuicao_por_canalr  r  Úcontatos_ghlrÜ   r  Útotal_ghl_comprasÚtotal_receita_capiÚtotal_vendas_capiÚmetodo_efetivoÚcanais_last_touchÚtags_compraÚvalor_por_tagr  Úcontatos_com_compra_por_canalrØ   rì   rõ   Úcompras_do_contatorü   r[   Ú
soma_brutaÚfatorÚ
canais_outrç   Ú	compras_cÚleads_cÚltr   Úcompras_lastrÿ   Úsharer  r  r  s$                                       r"   Úcruzar_com_atribuicaor-  “  sJ  € ô2 ñ Ø4H×4OÑ4OÓ4Qôó Ðô ÑPÀÔPÓPÐÜ˜NÓ+Ðà€NØ Ðà�Ó¢,²8ÜÑH¨X¯\©\¸(ÀBÓ-GÔHÓHˆÜ/°Ó9ˆð Eö
àð ˜q¨QÀÑEÑEð
Ðð 
ð 8IÖ(I°!¨¨A©Ð(IÐ%Ð(IØ#ò 	6ˆGØ-4¯[©[¸Ó-@Ò-FÀBÖH q”C˜“F—L‘L•NÐHˆDÐHØ-1Ö!F¨°Q¸+Ò5E¢!Ð!FÐÐ!FÙ%ØÜ1°'¸<ÓHˆEØÐ-Ñ-Ø �Ø˜eÑ$ ]Ó3°qÑ8Ó3Ø)ò Y�Ø! %Ñ(¨Ó3°qÑ8Ó3à! %Ñ(¨Ó9¸]×=NÑ=NÈsÐTWÓ=XÑXÔ9ðYð *¨%Ó0°AÑ5Ô0ð	6ô  ÑPÐ5F×5MÑ5MÓ5OÔPÓPˆ
Ø˜Š>Ð0°1Ò4Ø&¨Ñ3‰EàˆEØ+‰Nà'ˆà€JØ,×2Ñ2Ó4ó (‰ˆˆuÜ˜Ÿ	™	 )¨QÓ/Ò4°1Ó5ˆ	Ü�e—i‘i ¨Ó+Ò0¨qÓ1ˆà˜\Ò)¨eÐ7HÑ.Hð # 5Ñ)ˆBÜ % b¨Ñ&9¸EÑ&AÀ1Ó EÐØ˜i™=ˆLØ ,ÐØ ¤3¤sÑ*\ÐAR×AYÑAYÓA[Ô*\Ó'\Ð^_Ó#`Ñ`‰Eð ! 1Ò$Ø!Ð$5Ñ5‘à�Ü %Ð&8¸5Ñ&@À!Ó DÐÜ %Ð&7¸%Ñ&?ÀÓ CÐàˆØ�FŠ?Ø‰EØ�hÒØ ˆEà.3°aªiÐ! EÒ)¸SˆØ%.°¢]ˆu�yÒ ¸ˆà×ÑØØØ$Ü" 5¨3¡;°Ó2Ø!2Ø!2Ü˜5 !“_Ü˜$ “NÜ˜˜a“=ñ

ö 
	ð=(ðV ‡O�OÑ9€OÔ:ð Ø ä!Ð"4°aÓ8Ø,Ø,Ü 
¨AÓ.Ü! ,°Ó2ð ~Hð  KLò  ~Lœ¤Ñ#gÀJÔ#gÓ gÐjtÑ tÐwxÔyð  RUð DPð  STò  DTœ5¤#Ñ%kÀjÔ%kÓ"kÐnzÑ"zÐ}~Ôð  Z]ñ
ñð ùòY
ùò )JùâHùÚ!Fs   Á?M#Â
M(Â; M-Ã!	M2Ã+M2)r   r  Úreturnúdict | None)r.  ú
list[dict])r   r  r.  zdatetime | None)rI   r  r.  r  )rX   r  r.  r  )rX   r  r.  ra   )rb   r   r.  ra   )FF)r   r0  re   r   rf   r   rg   ra   rh   ra   r.  r0  )r.  r  )r   r0  r.  r   )rÇ   )r   r0  r¸   r  r.  r   )F)re   r   rf   r   rg   ra   r.  r   )rØ   r   rÖ   r  r.  r  )rÜ   r   r.  r   )NNrù   )r  r0  r  r   r  rp   r  rp   r  zlist[dict] | NonerÜ   r/  r  r  r.  r   )*Ú__doc__Ú
__future__r   r   ÚloggingÚreÚ	threadingr-   r   r   r   Úpathlibr   Úzoneinfor   r*   r‘   r?   Úcompiler   ÚLockr)   r   Ú__annotations__r0   Ú	getLoggerr3   r#   r:   rA   rK   r\   r^   rc   rk   rv   r¦   rÅ   rÒ   rÙ   râ   r-  r}   rL   r"   ú<module>r<     s»  ðò
õ #ã Û Û 	Û Û ß 2Ñ 2Ý Ý áÐ2Ó3€ÙÐ$Ó%€Ù	�%‹€ð �—
‘
Ð1Ó2€ð ˆi�n‰nÓ€àØØØ
ñ	€ˆó ð €ð €g×Ñ˜Ó!€óó %óV	óóó6?ó+ð #ØðØðàðð ðð ð	ð
 ðð óó,óNôb(ð\ #ð#Øð#àð#ð ð#ð 
ó	#óR7óðF '+Ø Ø ð~Øð~àð~ð ð~ð ð	~ð
 $ð~ð ð~ð ð~ð 
ô~rL   