Ë
    æíÈjþP  ã                  ó†  — d Z ddlmZ ddlZddlZddlmZmZ ddlmZ ddl	m
Z
 ddlZ ed«      Z ed«      Zd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZ	 	 	 d$	 	 	 	 	 	 	 	 	 	 	 	 	 d%d„Zd&d'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„Z$	 	 	 	 d0	 	 	 	 	 	 	 	 	 	 	 	 	 d1d „Z%d2d!„Z&d2d"„Z'	 	 	 d3	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d4d#„Z(y)5a’  
Modulo "Funil WhatsApp PX3".

Puxa conversas WhatsApp do Linkia PX3 (GHL) e monta o funil:
chegou -> conversou -> reuniao marcada -> venda -> perdido.

Classificacao em 2 camadas (SEM IA na v1):
  1) opportunity + pipeline stage do GHL (dado explicito da vendedora).
  2) heuristica de palavras-chave nas ultimas mensagens.

Expoe:
  - buscar_conversas_whatsapp(headers_conv, location_id, since_ms, until_ms)
  - buscar_mensagens(conv_id, headers_conv)
  - classificar_conversa(conv, pipelines_meta, msgs_cache=None, headers_conv=None)
  - montar_funil(conversas, pipelines_meta, inicio_br, fim_br, enriquecer_msgs=True,
                 headers_conv=None)
é    )ÚannotationsN)ÚdatetimeÚ	timedelta)ÚZoneInfo)ÚIterablezAmerica/Sao_PauloÚUTCz$https://services.leadconnectorhq.com)
ÚganhamosÚganhoÚganhaÚcomprouÚvendaÚvendidoÚfechadÚpagoÚclienteÚganhou)ÚperdidÚperdemosÚperdaÚdesqualificÚinvalidznao vaiznao responderamzsem resposta)Úreuniaozreuniao diagnosticoÚdiagnosticoÚagendadÚagendouÚagendamentozdemo agendadaÚcallÚmeetingÚqualificadoÚqualificacaoÚpropostaÚnegociazcom consultor)zem conversaÚconversandozrespondeu mensagemÚ	contatado)z	novo leadzrecebeu a mensagemzrecebeu mensagemznovo contatoÚnovoÚleadÚwonÚlostÚ	abandonedÚopen)ÚagendeiÚ	agendamosÚmarqueiÚmarcamosÚagendadoÚmarcadoz	amanha aszhoje asÚzoomzgoogle meetzmeet.googlezreuniao marcadazpodemos marcarzvamos marcarzte chamo asz
te ligo asz
ligamos as)Úpagueizpagamento feitozpaguei agoraÚcomprovantez	fiz o pixz	pix feitoÚassineiÚfecheiÚcompreizsou clientezassinatura oké   c           
     ó  — g }t        «       }d}	d}
t        d|dz
  «      }|
|k  �r�|
dz  }
||ddddœ}|	r|	|d	<   	 t        j                  t        › d
�| |d¬«      }	 |j                  «       }|j                  dk(  r)|r|j                  d«       t        j                  d«       Œ„|j                  dk7  r5|r0|j                  d|j                  › d|› dt        |«      dd › �«       	 |S 	 |j                  d«      xs g }|s	 |S d}|D ]d  }|j                  d«      }|r||v rŒ|j                  |«       |j                  |«       t        |j                  d«      xs d«      }|�||k  sŒc|}Œf |d   }|j                  d«      xs g }|r|d   nd}|r||	k(  r	 |S |}	|r||k  r	 |S t        j                  d«       |
|k  r�Œ�|S # t        $ r i }Y �Œgw xY w# t        $ r!}|r|j                  d|› �«       Y d}~|S d}~ww xY w)añ  
    Pagina /conversations/search com lastMessageType=TYPE_WHATSAPP, ordenado
    por last_message_date desc. Pega SO as conversas cujo `dateAdded`
    (criacao da conversa / chegada do lead) esta dentro de [since_ms, until_ms].

    Como o sort e por last_message_date, a gente para quando `lastMessageDate`
    cair abaixo de since_ms E ao mesmo tempo `dateAdded` tambem (margem de
    seguranca: paginamos ate `lastMessageDate < since_ms - 90d` ou acabar).

    Dedupe por conversation id.
    Nr   l    Xø é   ÚTYPE_WHATSAPPÚlast_message_dateÚdesc)Ú
locationIdÚlimitÚlastMessageTypeÚsortByÚsortÚstartAfterDatez/conversations/searché   ©ÚheadersÚparamsÚtimeouti­  z"funil_whatsapp: 429, aguardando 2sé   éÈ   zfunil_whatsapp: z params=z data=zfunil_whatsapp: erro request ÚconversationsÚidÚlastMessageDateéÿÿÿÿrA   çš™™™™™¹?)ÚsetÚmaxÚrequestsÚgetÚGHL_BASEÚjsonÚ	ExceptionÚstatus_codeÚwarningÚtimeÚsleepÚstrÚaddÚappendÚint)Úheaders_convÚlocation_idÚsince_msÚuntil_msÚ	max_pagesÚ	page_sizeÚloggerÚconvsÚvistosÚcursorÚpaginasÚsafety_floor_msrF   ÚrÚdataÚeÚ
page_convsÚlast_message_date_minÚcÚcidÚlmdÚ	last_itemÚsort_arrÚ
new_cursors                           ú>/opt/mia/workspace/clientes/px3lab/dashboard/funil_whatsapp.pyÚbuscar_conversas_whatsapprv   ]   s{  € ð( €EÜ“u€FØ€FØ€GÜ˜!˜XÐ(=Ñ=Ó>€Oà
�IÓ
Ø�1‰ˆà%ØØ.Ø)Øñ
ˆñ Ø'-ˆFÐ#Ñ$ð	Ü—‘Ü�*Ð1Ð2Ø$ØØô	ˆAðØ—v‘v“x�ð �}‰} Ò#ÙØ—N‘NÐ#GÔHÜ—
‘
˜1”ØØ�}‰} Ò#ÙØ—N‘NØ*¨1¯=©=¨/¸À&ÀÈÔPSÐTXÓPYÐZ^Ð[^ÐP_ÐO`Ðaôð ðF €LðQ $ð —X‘X˜oÓ.Ò4°"ˆ
ÙØð6 €Lð3 !%ÐØò 	,ˆAØ—%‘%˜“+ˆCÙ˜# ™-ØØ�J‰J�sŒOØ�L‰L˜ŒOÜ�a—e‘eÐ-Ó.Ò3°!Ó4ˆCØ$Ð,°Ð6KÓ0KØ(+Ñ%ð	,ð ˜r‘Nˆ	Ø—=‘= Ó(Ò.¨BˆÙ$,�X˜a’[°$ˆ
Ù˜Z¨6Ò1Øð €Lð ˆñ !Ð%:¸_Ò%LØð €Lô 	�
‰
�3ŒðG �IÔ
ðJ €Løô_ ò Ø“ðûô ò 	ÙØ—‘Ð!>¸q¸cÐBÔCÛð> €LûðE	úsB   » G ÁG Á,7G Â$AG ÇGÇG ÇGÇG Ç	HÇ G<Ç<Hc                óP  — 	 t        j                  t        › d| › d�|d|i|¬«      }	 |j                  «       }|j
                  dk7  rg S 	 |j                  d«      }t        |t        «      r|j                  d«      xs g }|xs g S # t        $ r i }Y Œ[w xY w# t        $ r g cY S w xY w)zc
    GET /conversations/{id}/messages -> ultimas N mensagens.
    Retorna lista ou [] em erro.
    z/conversations/z	/messagesr>   rD   rI   Úmessages)rQ   rR   rS   rT   rU   rV   Ú
isinstanceÚdict)Úconv_idr^   r>   rG   rj   rk   Úmsgss          ru   Úbuscar_mensagensr}   ¿   s½   € ð
Ü�L‰LÜˆj˜¨ y°	Ð:Ø Ø˜UÐ#Øô	
ˆð	Ø—6‘6“8ˆDð �=‰=˜CÒØˆIð  ð
 �8‰8�JÓ€DÜ�$œÔØ�x‰x˜
Ó#Ò) rˆØŠ:�2Ðøô ò 	ØŠDð	ûô ò ØŠ	ðús3   ‚%B ¨B ¸B ÂBÂB ÂBÂB ÂB%Â$B%c                ó„   — | syd}| }|D ]  \  }}|j                  ||«      }Œ |j                  «       j                  «       S )NÚ ))õ   Ã¡Úa)õ   Ã£r�   )õ   Ã¢r�   )õ   Ã r�   )õ   Ã©rl   )õ   Ãªrl   )õ   Ã­Úi)õ   Ã³Úo)õ   Ã´rŠ   )õ   ÃµrŠ   )õ   ÃºÚu)õ   Ã§ro   )õ   Ã�r�   )õ   Ãƒr�   )õ   Ã‚r�   )õ   Ã‰rl   )õ   ÃŠrl   )õ   Ã�rˆ   )õ   Ã“rŠ   )õ   Ã”rŠ   )õ   Ã•rŠ   )õ   ÃšrŽ   )õ   Ã‡ro   )ÚreplaceÚlowerÚstrip)ÚsÚreplÚoutr�   Úbs        ru   Ú_normr¢   Ý   sO   € ÙØðD€Dð €CØò  ‰ˆˆ1Ø�k‰k˜!˜QÓ‰ð à�9‰9‹;×ÑÓÐó    c                ó:   — t        | «      }|sy|D ]  }||v sŒ y y)NFT)r¢   )ÚtxtÚtokensÚtÚtoks       ru   Ú
_match_anyr©   ë   s/   € Üˆc‹
€AÙØØò ˆØ�!Š8Ùðð r£   c                óÆ   — | j                  d«      }| j                  d«      }|xs i j                  |«      xs i }|j                  d«      xs i }|j                  |d«      S )zDpipelines_meta = {pipeline_id: {name, stages_map: {stage_id: name}}}Ú
pipelineIdÚpipelineStageIdÚ
stages_mapr   ©rR   )ÚoppÚpipelines_metaÚpidÚsidÚpmÚsmaps         ru   Ú_stage_name_from_opprµ   õ   s]   € à
�'‰'�,Ó
€CØ
�'‰'Ð#Ó
$€CØ
Ò
˜B×	#Ñ	# CÓ	(Ò	.¨B€BØ�6‰6�,ÓÒ% 2€DØ�8‰8�C˜ÓÐr£   c                ó„  — | syd}dddddœ}| D �]"  }t        |t        «      sŒ|j                  d«      xs d	j                  «       }t	        ||«      }t        |«      }|xs i j                  |j                  d
«      «      xs i j                  d«      xs d	}d}	|t        k(  st        |t        «      rd}	nFt        |t        «      rd}	n3|t        t        fv st        |t        «      rd}	nt        |t        «      rd}	|	€Œñ|j                  |	d«      }
|› d|xs d› d|› d�}|�
|
|d   kD  s�Œ|
|	|f}�Œ% |r
|d   |d   fS y)a®  
    Retorna (categoria, motivo) baseado nas opportunities.
    categoria in {venda, perdido, reuniao, conversou, None}
    motivo = string curta (nome do stage + status).

    Regra de prioridade entre MULTIPLAS opps:
      venda > reuniao > perdido > conversou > nada
      (um lead que ja comprou NAO conta como perdido mesmo se tiver outra opp
      perdida; e uma reuniao avanca mais que um "perdido" em outra pipeline).
    ©Nr   Né   é   rH   r9   )r   r   ÚperdidoÚ	conversouÚstatusr   r«   Únamer   r   rº   r»   r   z / ú?z (ú))ry   rz   rR   rœ   rµ   r¢   Ú
STATUS_WONr©   ÚSTAGE_TOKENS_VENDAÚSTAGE_TOKENS_REUNIAOÚSTATUS_LOSTÚSTATUS_ABANDONEDÚSTAGE_TOKENS_PERDIDOÚSTAGE_TOKENS_CONVERSANDO)Úoppsr°   ÚmelhorÚRANKr¯   r¼   Ú
stage_nomeÚ
stage_normÚ	pipe_nameÚcatÚrankÚmotivos               ru   Ú_classifica_por_oppsrÐ   þ   sf  € ñ Øà€FØ 1°ÀÑC€Dàó )ˆÜ˜#œtÔ$ØØ—'‘'˜(Ó#Ò) r×0Ñ0Ó2ˆÜ)¨#¨~Ó>ˆ
Ü˜:Ó&ˆ
Ø$Ò*¨×/Ñ/°·±¸Ó0EÓFÒLÈ"×QÑQÐRXÓYÒ_Ð]_ˆ	àˆØ”ZÒ¤:¨jÔ:LÔ#MØ‰CÜ˜
Ô$8Ô9Ø‰CØœÔ%5Ð6Ñ6¼*ÀZÔQeÔ:fØ‰CÜ˜
Ô$<Ô=ØˆCàˆ;Øà�x‰x˜˜QÓˆØ�;˜c *Ò"3°Ð!4°B°v°h¸aÐ@ˆØˆ>˜T F¨1¡IÔ-Ø˜C Ð(ŠFð1)ñ4 Ø�a‰y˜& ™)Ð#Ð#Ør£   c                ó  ‡— | xs g D �cg c]  }t        |t        «      sŒt        |«      ‘Œ  }}|sydj                  |«      Št	        ˆfd„dD «       «      ryt	        ˆfd„dD «       «      ryt	        ˆfd	„d
D «       «      ryyc c}w )Nr·   Ú c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© ©Ú.0r§   Úblobs     €ru   ú	<genexpr>z'_classifica_por_tags.<locals>.<genexpr>3  s   øè ø€ Ò
S˜ˆ1�Œ9Ñ
Sùó   ƒ)r   r   zvenda-feitaÚvenda_feita)r   ztag:cliente/vendidoc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wrÔ   rÕ   rÖ   s     €ru   rÙ   z'_classifica_por_tags.<locals>.<genexpr>5  s   øè ø€ Ò
P˜ˆ1�Œ9Ñ
PùrÚ   )zreuniao-marcadar   Úreuniao_marcada)r   ztag:reuniaoc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wrÔ   rÕ   rÖ   s     €ru   rÙ   z'_classifica_por_tags.<locals>.<genexpr>7  s   øè ø€ Ò
8˜ˆ1�Œ9Ñ
8ùrÚ   )r   r   )rº   ztag:perdido)ry   rZ   r¢   ÚjoinÚany)Útagsr§   ÚtgsrØ   s      @ru   Ú_classifica_por_tagsrã   .  sy   ø€ Ø"šj bÖ
@˜¬Z¸¼3Õ-?Œ5��8Ð
@€CÐ
@ÙØØ�8‰8�C‹=€DÜ
Ó
SÐRÔ
SÔSØ-Ü
Ó
PÐOÔ
PÔPØ'Ü
Ó
8Ð7Ô
8Ô8Ø'Øùò As
   ŠB Bc                ó   — | syg }| dd D ]>  }|j                  d«      xs |j                  d«      xs d}|sŒ.|j                  |«       Œ@ dj                  |«      }t        |t        «      ryt        |t
        «      ry	y)
zN
    Olha as ultimas ~5 mensagens (as mais recentes vem primeiro no GHL).
    r·   Né   ÚbodyÚcontentr   rÒ   )r   zmsg: palavra de venda)r   zmsg: palavra de reuniao)rR   r\   rß   r©   ÚMSG_TOKENS_VENDAÚMSG_TOKENS_REUNIAO)r|   ÚcorposÚmræ   rØ   s        ru   Ú_classifica_por_mensagensrì   <  s‚   € ñ Øà€FØ�"�1ˆXò  ˆØ�u‰u�V‹}Ò6 §¡ iÓ 0Ò6°BˆÚØ�M‰M˜$Õð ð �8‰8�FÓ€DÜ�$Ô(Ô)Ø/Ü�$Ô*Ô+Ø3Ør£   c                ó˜   — t        | j                  d«      xs d«      }t        | j                  d«      xs d«      }|sy|r	||dz
  k\  ryy)aj  
    'Conversou' = o LEAD respondeu DEPOIS que a conversa foi criada
    (dateAdded). Essa e a leitura correta no GHL de prospeccao ativa.

    GHL mantem `lastInboundWhatsappMessageDate` historico (de qualquer resposta
    passada do contato), por isso NAO basta checar se o campo existe. Precisa
    estar temporalmente dentro desta janela de atendimento.
    ÚlastInboundWhatsappMessageDater   Ú	dateAddedFi`ê  T)r]   rR   )ÚconvÚ
inbound_tsÚ
date_addeds      ru   Ú_has_inboundró   P  sP   € ô �T—X‘XÐ>Ó?ÒDÀ1ÓE€JÜ�T—X‘X˜kÓ*Ò/¨aÓ0€JáØá�j Z°&Ñ%8Ò9ØØr£   c                ó,   — | syt        d|| z
  dz  «      S )Ng    eÍÍAç        g    p™”A)rP   )Úts_msÚagora_mss     ru   Ú_dias_desderø   d  s    € ÙØÜˆs�X Ñ%Ð*:Ñ;Ó<Ð<r£   c                ó¤  — |xs  t        t        j                  «       dz  «      }t        | «      }| j                  d«      xs g }t	        ||«      \  }}	|dv r||	ddœS |dk(  r||	|dœS t        | j                  d«      «      \  }
}|
dv r|
||dœS |rg|re| j                  d	«      }d
}|�
||v r||   }n*t        ||d¬«      }|�|||<   t        j                  d«       t        |xs g «      \  }}|dv r|||dœS t        | j                  d«      xs d«      }|r#t        ||«      t        kD  r|sddt        › d�ddœS |r
d|	xs dddœS d|	xs dddœS )a±  
    Retorna {
      categoria: chegou|conversou|reuniao|venda|perdido,
      motivo: str,
      conversou_flag: bool,
    }

    Regra:
      - Default: 'chegou' (todo lead com conversa WhatsApp conta no topo do funil)
      - Se tem opp: usa classificacao por stage.
      - Se nao tem opp: tenta por tags, depois por mensagens (opcional).
      - Se nao tem opp, nao tem resposta do lead E ultima msg >14d atras -> 'perdido'.
    éè  Úopportunities)r   r   T)Ú	categoriarÏ   Úconversou_flagrº   rá   )r   r   rº   rK   Né
   )r>   rN   rL   r   zsem resposta >ÚdFr»   zlead respondeuÚchegouzdisparo sem resposta)r]   rX   ró   rR   rÐ   rã   r}   rY   rì   rø   ÚDIAS_ABANDONO)rð   r°   Ú
msgs_cacher^   Úenriquecer_msgsr÷   r»   rÇ   rÍ   rÏ   Úcat_tÚmotivo_trp   r|   Úcat_mÚmotivo_mÚlast_msg_mss                    ru   Úclassificar_conversar	  j  sž  € ð* Ò2œ3œtŸy™y›{¨TÑ1Ó2€Hä˜TÓ"€Ið �8‰8�OÓ$Ò*¨€DÜ& t¨^Ó<�K€CˆØ
Ð"Ñ"ð !¨FÀdÑKÐKØ
ˆiÒØ ¨FÀiÑPÐPô +¨4¯8©8°FÓ+;Ó<�O€Eˆ8ØÐ/Ñ/Ø"¨hÈ)ÑTÐTñ ™<Ø�h‰h�t‹nˆØˆØÐ! c¨ZÑ&7Ø˜c‘?‰Dä# C¨¸RÔ@ˆDØÐ%Ø"&�
˜3‘Ü�J‰J�sŒOÜ3°D²J¸BÓ?‰ˆˆxØÐ(Ñ(Ø!&°(ÈiÑXÐXô �d—h‘hÐ0Ó1Ò6°QÓ7€KÙ”{ ;°Ó9¼MÒIáØ!*¸Ä}ÀoÐUVÐ6WÐkpÑqÐqñ Ø(°FÒ4NÐ>NÐbfÑgÐgð "¨VÒ-MÐ7MÐafÑgÐgr£   c                ó˜   — | sy	 t        j                  t        | «      dz  t        ¬«      }|j	                  d«      S # t
        $ r Y yw xY w)Nr   rú   )Útzz%d/%m %H:%M)r   Úfromtimestampr]   ÚTZ_BRÚstrftimerU   )rö   Údts     ru   Ú_fmt_data_brr  ´  sI   € ÙØðÜ×#Ñ#¤C¨£J°Ñ$5¼%Ô@ˆØ�{‰{˜=Ó)Ð)øÜò Ùðús   …7= ½	A	ÁA	c                óx   — | sydj                  d„ t        | «      D «       «      }|syt        |«      dv rd|z   }|S )Nr   c              3  óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­wrÔ   )Úisdigit)r×   Úchs     ru   rÙ   z"_sanitize_phone.<locals>.<genexpr>Á  s   è ø€ Ò;˜B¨b¯j©j­l”RÑ;ùs   ‚˜)rþ   é   Ú55)rß   rZ   Úlen)ÚrawÚdigitss     ru   Ú_sanitize_phoner  ¾  s@   € ÙØØ�W‰WÑ;¤# c£(Ô;Ó;€FÙØÜ
ˆ6ƒ{�hÑØ˜‘ˆØ€Mr£   c                óº  — t        t        j                  «       dz  «      }i }ddddddœ}	i }
g }| xs g D �]�  }t        |j                  d«      xs d«      }|sŒ%||k  s||kD  rŒ0t        ||||||¬«      }|d   }|	dxx   dz  cc<   |d	   s|d
v r|	dxx   dz  cc<   |dk(  r|	dxx   dz  cc<   n%|dk(  r|	dxx   dz  cc<   n|dk(  r|	dxx   dz  cc<   d}|j                  d«      xs g }|rt	        |t
        «      rt        |d   «      }|s|j                  d«      xs d}|xs d}|
j                  ||ddddddœ«      }|dxx   dz  cc<   |d	   s|d
v r|dxx   dz  cc<   |dk(  r|dxx   dz  cc<   n%|dk(  r|dxx   dz  cc<   n|dk(  r|dxx   dz  cc<   |j                  d«      xs dj                  «       xs' |j                  d«      xs dj                  «       xs d}|j                  d«      xs d}t        |«      }d}|r(|j                  d«      rd|› d|j                  d«      › �}|j                  |j                  d«      xs d|j                  d«      xs d||||rd|› �nd|t        |«      t        |j                  d«      xs d«      t        |j                  d«      «      ||d   ||dœ«       �Œ� d „ } ||	d   |	d   «       ||	d   |	d   «       ||	d   |	d   «       ||	d   |	d   «       ||	d   |	d   «      d!œ}t        |
j                  «       d"„ d#¬$«      }|j                  d%„ d#¬$«       |	d   |	d   |	d   |	d   |	d   |||d&œS )'z—
    conversas: lista BRUTA de /conversations/search (filtra aqui por dateAdded no periodo).
    pipelines_meta: {pipeline_id: {name, stages_map}}
    rú   r   )r   r»   r   r   rº   rï   )r  r^   r  r÷   rü   r   r9   rý   )r»   r   r   r»   r   r   rº   r   Ú	followersÚ
assignedToÚsem_atribuicao)Úghl_idr   r»   r   r   rº   ÚcontactNameÚfullNamezSem nomeÚphoneÚ	contactIdz#https://app.linkia.app/v2/location/z/contacts/detail/rK   zhttps://wa.me/rL   rÏ   )r{   Ú
contact_idÚnomeÚ	phone_rawÚphone_digitsÚwa_urlÚdata_entrada_msÚdata_entrada_brÚultima_msg_msÚultima_msg_brÚestagiorÏ   Úvendedora_idÚ
linkia_urlc                ó,   — |syt        d| z  |z  d«      S )Nrõ   g      Y@r9   )Úround)ÚnumÚdens     ru   Ú_pctzmontar_funil.<locals>._pct6  s   € ÙØÜ�U˜S‘[ 3Ñ&¨Ó*Ð*r£   )Úchegou_para_conversouÚconversou_para_reuniaoÚreuniao_para_vendaÚchegou_para_vendaÚpct_perdidoc                ó   — | d   S )Nr   rÕ   )Úvs    ru   ú<lambda>zmontar_funil.<locals>.<lambda>F  s
   € �a˜‘k€ r£   T)ÚkeyÚreversec                ó&   — | j                  dd«      S )Nr)  r   r®   )rj   s    ru   r<  zmontar_funil.<locals>.<lambda>K  s   €  a§e¡eÐ,=¸qÓ&A€ r£   )r   r»   r   r   rº   ÚtaxasÚpor_vendedoraÚleads)r]   rX   rR   r	  ry   ÚlistrZ   Ú
setdefaultr�   r  r\   r  ÚsortedÚvaluesrA   )Ú	conversasr°   Ú	inicio_msÚfim_msr  r^   r_   r÷   r  Úpor_catrA  Úleads_detalhesro   Údt_addedÚclsrÍ   r.  r  r;  r%  r&  r'  r/  r4  r@  Úvendedoras_listas                             ru   Úmontar_funilrO  É  s  € ô ”4—9‘9“; Ñ%Ó&€HØ€Jà¨°qÀ1ÐQRÑS€GØ%'€MØ!#€NàŠ_˜"ó VˆÜ�q—u‘u˜[Ó)Ò.¨QÓ/ˆáØØ�iÒ 8¨fÒ#4Øô #Øˆ~Ø!Ø%Ø+Øô
ˆð �+Ñˆð 	�Ó˜QÑÓàÐÒ  CÐ+LÑ$LØ�KÓ  AÑ%Ó Ø�)ÒØ�IÓ !Ñ#ÔØ�GŠ^Ø�GÓ Ñ!ÔØ�IÒØ�IÓ !Ñ#Óð
 ˆØ—E‘E˜+Ó&Ò,¨"ˆ	Ùœ I¬tÔ4Ü˜y¨™|Ó,ˆLÙØŸ5™5 Ó.Ò4°"ˆLØ#Ò7Ð'7ˆà×$Ñ$ \Ø"Ø a°AÀÈañ4
ó ˆð 	
ˆ(‹�qÑ‹ØÐÒ  CÐ+LÑ$LØˆk‹N˜aÑ‹NØ�)ÒØˆi‹L˜AÑŒLØ�GŠ^Øˆg‹J˜!‰OŒJØ�IÒØˆi‹L˜AÑ‹Lð �U‰U�=Ó!Ò' R×.Ñ.Ó0ò Ø—‘�jÓ!Ò' R×.Ñ.Ó0òàð 	ð
 —E‘E˜'“NÒ( bˆ	Ü& yÓ1ˆàˆ
Ù˜1Ÿ5™5 Ô-à5°k°]ÐBSØ—5‘5˜Ó%Ð&ð(ð ð
 	×ÑØ—u‘u˜T“{Ò( bØŸ%™% Ó,Ò2°ØØ"Ø(Ù9E˜ | nÑ5È2Ø'Ü+¨HÓ5Ü  §¡Ð'8Ó!9Ò!>¸QÓ?Ü)¨!¯%©%Ð0AÓ*BÓCØØ˜(‘mØ(Ø$ñ
ö 	ðOVòr+ñ "& g¨kÑ&:¸GÀHÑ<MÓ!NÙ"& w¨yÑ'9¸7À;Ñ;OÓ"PÙ" 7¨7Ñ#3°W¸YÑ5GÓHÙ! '¨'Ñ"2°G¸HÑ4EÓFÙ˜G IÑ.°¸Ñ0AÓBñ€Eô Ø×ÑÓÙ!ØôÐð ×ÑÑAÈ4ÐÔPð ˜(Ñ#Ø˜[Ñ)Ø˜9Ñ%Ø˜Ñ!Ø˜9Ñ%ØØ)Øñ	ð 	r£   )rC   éd   N)r^   rz   r_   rZ   r`   r]   ra   r]   rb   r]   rc   r]   Úreturnú
list[dict])é   é   )
r{   rZ   r^   rz   r>   r]   rG   r]   rQ  rR  )rž   rZ   rQ  rZ   )r¥   rZ   r¦   zIterable[str]rQ  Úbool)r¯   rz   r°   rz   rQ  rZ   )rÇ   rR  r°   rz   rQ  útuple[str, str])rá   rC  rQ  rV  )r|   rR  rQ  rV  )rð   rz   rQ  rU  )rö   r]   r÷   r]   rQ  Úfloat)NNFN)rð   rz   r°   rz   r  údict | Noner^   rX  r  rU  r÷   z
int | NonerQ  rz   )rQ  rZ   )FNN)rG  rR  r°   rz   rH  r]   rI  r]   r  rU  r^   rX  r_   z
str | NonerQ  rz   ))Ú__doc__Ú
__future__r   ÚrerX   r   r   Úzoneinfor   Útypingr   rQ   r  ÚTZ_UTCrS   rÁ   rÅ   rÂ   rÆ   ÚSTAGE_TOKENS_RECEBEU_SOrÀ   rÃ   rÄ   ÚSTATUS_OPENré   rè   r  rv   r}   r¢   r©   rµ   rÐ   rã   rì   ró   rø   r	  r  r  rO  rÕ   r£   ru   ú<module>ra     sð  ðñõ" #ã 	Û ß (Ý Ý ã ñ 	Ð$Ó%€Ù	�%‹€à1€ðÐ ðÐ ðÐ ðÐ ðÐ ð €
Ø€ØÐ Ø€ðÐ ðÐ ð €ð ØØð_Øð_àð_ð ð_ð ð	_ð
 ð_ð ð_ð ó_ôDó<óóó-ó`óó(ó(=ð #Ø $Ø!ØðDhØ
ðDhàðDhð ðDhð ð	Dhð
 ðDhð ðDhð 
óDhóTóð  "Ø $Ø"ðMØðMàðMð ðMð ð	Mð
 ðMð ðMð ðMð 
ôMr£   