Ë
    Ìÿ}j©  ã                  ót  — 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
  eej                  j                  d«      xs#  ee«      j                  «       j                  dz  «      Zd	Zd
Zdd„Zd„ Zdd„Zdd„Zdd„Zdd„Zdd„Zddd„Zedk(  r%ddlZ e ej>                   e«       dd¬«      «       yy)u~  
dashboard_saude.py â€” Dashboard de saÃºde do consumo de leads/API do Google Places
para o painel /admin da ferramenta de prospecÃ§Ã£o.

Regras:
 - Free tier realista Google Places API ~= 10.500 leads/mÃªs (US$200 grÃ¡tis)
 - Overflow: cada lead extra custa ~US$ 0,019 (chamadas de Details/Search). CÃ¢mbio 5,5.
 - ConfigurÃ¡vel via env PROSPECCAO_FREE_TIER_LIMIT (default 10500).
é    )ÚannotationsN)ÚdatetimeÚ	timedelta)ÚPath)Ú
monthrangeÚUSERS_DB_PATHzusers.dbgÛù~j¼t“?g      @c                 ó€   — 	 t        t        j                  j                  dd«      «      S # t        t
        f$ r Y yw xY w)NÚPROSPECCAO_FREE_TIER_LIMITÚ10500i)  )ÚintÚosÚenvironÚgetÚ	TypeErrorÚ
ValueError© ó    ú>/opt/mia/workspace/prospeccao_ativa-staging/dashboard_saude.pyÚ_get_free_tier_limitr      s9   € ðÜ”2—:‘:—>‘>Ð">ÀÓHÓIÐIøÜ”zÐ"ò Ùðús   ‚(+ «=¼=c                 ót   — t        j                  t        t        «      «      } t         j                  | _        | S ©N)Úsqlite3ÚconnectÚstrÚDB_PATHÚRowÚrow_factory)Úconns    r   Ú	_get_connr   "   s%   € Ü�?‰?œ3œw›<Ó(€DÜ—{‘{€DÔØ€Kr   c                ód   — | j                  d«      j                  «       }t        |d   xs d«      S )uP  
    Soma leads_usados de todas as contas.

    Regra: leads_usados representa o consumo desde o Ãºltimo reset da conta
    (quota_reset_em). Quando o cron mensal roda, zera-se leads_usados e
    atualiza-se quota_reset_em. Portanto, a SOMA atual de leads_usados
    reflete o consumo do mÃªs corrente (do Ãºltimo reset atÃ© hoje).
    z5SELECT COALESCE(SUM(leads_usados), 0) FROM ghl_configr   )ÚexecuteÚfetchoner   )r   Úrows     r   Ú_somar_leads_do_mes_atualr$   (   s/   € ð �,‰,ÐNÓ
O×
XÑ
XÓ
Z€CÜˆs�1‰vŠ{˜ÓÐr   c                 ó¢   — t        j                  «       } t        | j                  | j                  «      \  }}t        d|| j                  z
  «      S ©Né   )r   Únowr   ÚyearÚmonthÚmaxÚday)ÚhojeÚ_Ú
ultimo_dias      r   Ú_dias_restantes_no_mesr0   5   s;   € Ü�<‰<‹>€DÜ˜tŸy™y¨$¯*©*Ó5�M€A€zÜˆq�*˜tŸx™xÑ'Ó(Ð(r   c                 óR   — t        dt        j                  «       j                  «      S r&   )r+   r   r(   r,   r   r   r   Ú_dias_ja_passados_no_mesr2   ;   s   € Üˆq”(—,‘,“.×$Ñ$Ó%Ð%r   c                ó   — | dk  ry| dk  ryy)z,Retorna (cor, texto) baseado no % consumido.éK   )Úverdeu>   SaudÃ¡vel. Dentro do free tier do Google, custo API = R$ 0,00.é_   )Úamarelou5   AtenÃ§Ã£o. Aproximando do limite mensal do free tier.)ÚvermelhouN   CrÃ­tico. Free tier praticamente esgotado. Cada lead extra custa R$ 0,10-0,15.r   )Úpcts    r   Ú	_semaforor:   ?   s!   € à
ˆR‚xð
ð ˆR‚xð
ðr   c           
     ó(  — | j                  d«      j                  «       }g }t        |d¬«      D ]`  \  }}t        |d   xs d«      }t        |d   xs d«      }|dkD  rt	        ||z  dz  d«      nd}|j                  ||d	   |d
   |||dœ«       Œb |S )z&Retorna top 5 contas por leads_usados.zÁ
        SELECT c.id, c.nome, g.leads_usados, g.leads_limite
          FROM contas c
          JOIN ghl_config g ON g.conta_id = c.id
         ORDER BY g.leads_usados DESC
         LIMIT 5
    r'   )ÚstartÚleads_limiter   Úleads_usadoséd   g        ÚidÚnome)ÚrankÚconta_idrA   ÚusadosÚlimiter9   )r!   ÚfetchallÚ	enumerater   ÚroundÚappend)r   ÚrowsÚtopÚiÚrrE   rD   r9   s           r   Ú_top5_contasrN   Q   s¹   € à�<‰<ð ó 	÷ 
‰‹ð 	ð €CÜ˜$ aÔ(ò ‰ˆˆ1Ü�Q�~Ñ&Ò+¨!Ó,ˆÜ�Q�~Ñ&Ò+¨!Ó,ˆØ39¸A²:Œe�V˜f‘_¨Ñ+¨QÔ/À3ˆØ�
‰
ØØ˜$™Ø�f‘IØØØñ
õ 	ð	ð €Jr   c                ób  — | €
t        «       } t        «       }	 t        |«      }t        |«      }|j	                  «        t        dt        | «      «      }t        ||z  dz  d«      }t        d||z
  «      }t        |«      \  }}t        «       }	t        «       }
t        ||	z  d«      }t        |||
z  z   «      }t        d||z
  «      }t        |t        z  t        z  d«      }|dk(  r|dkD  rd|d›d�}n|d	k(  r
d
|› d|d›d�}||||t        d|«      |||||	|
||||dœS # |j	                  «        w xY w)u-  
    Retorna o dict com o estado atual do dashboard de saÃºde.

    Campos:
      total_usado, limite, pct, restantes
      cor_semaforo, texto_semaforo
      media_diaria, dias_restantes, projecao_mes
      overflow_projetado, custo_overflow_brl
      top5 (lista de dicts)
      free_tier_limit
    r'   r?   r   é   r7   uM   AtenÃ§Ã£o. Aproximando do limite. Se o ritmo continuar, overflow custarÃ¡ R$ z.2fu    este mÃªs.r8   u?   CrÃ­tico. Free tier praticamente esgotado. Overflow projetado: z leads (~R$ z).g      Y@)Útotal_usadorE   Úfree_tier_limitr9   Ú
pct_cappedÚ	restantesÚcor_semaforoÚtexto_semaforoÚmedia_diariaÚdias_passadosÚdias_restantesÚprojecao_mesÚoverflow_projetadoÚcusto_overflow_brlÚtop5)r   r   r$   rN   Úcloser+   r   rH   r:   r2   r0   ÚUSD_POR_LEAD_OVERFLOWÚCAMBIO_USD_BRLÚmin)rR   r   rQ   r]   rE   r9   rT   ÚcorÚtextorX   rY   rW   rZ   r[   r\   s                  r   Úget_dashboard_sauderd   k   s…  € ð ÐÜ.Ó0ˆä‹;€DðÜ/°Ó5ˆÜ˜DÓ!ˆà�
‰
Œä�”C˜Ó(Ó)€FÜ
�˜vÑ%¨Ñ,¨aÓ
0€CÜ�A�v Ñ+Ó,€Iä˜3“�J€Cˆô -Ó.€MÜ+Ó-€NÜ˜ }Ñ4°aÓ8€LÜ�{ l°^Ñ&CÑDÓE€LÜ˜Q ¨vÑ 5Ó6ÐÜÐ1Ô4IÑIÌNÑZÐ\]Ó^Ðð ˆiÒÐ.°Ò2ð$Ø$6°sÐ#;¸;ðHñ 	ð 
�
Ò	àMØ!Ð" ,Ð/AÀ#Ð.FÀbðJð 	ð #ØØ!ØÜ˜% “oØØØØ$Ø&Ø(Ø$Ø0Ø0Øñð øð9 	�
‰
�ús   ˜D ÄD.Ú__main__rP   F)ÚindentÚensure_ascii)Úreturnr   )r9   Úfloatrh   ztuple[str, str])rh   z
list[dict]r   )rR   z
int | Nonerh   Údict) Ú__doc__Ú
__future__r   r   r   r   r   Úpathlibr   Úcalendarr   r   r   Ú__file__ÚresolveÚparentr   r_   r`   r   r   r$   r0   r2   r:   rN   rd   Ú__name__ÚjsonÚ_jsonÚprintÚdumpsr   r   r   ú<module>rw      s¹   ðñõ #ã 	Û ß (Ý Ý ñ ˆr�z‰z�~‰~˜oÓ.Ò`±4¸³>×3IÑ3IÓ3K×3RÑ3RÐU_Ñ3_Ó
a€ð Ð Ø€óòó
ó)ó&óó$ô4@ðF ˆzÒÛÙ	ˆ+ˆ%�+‰+Ñ)Ó+°AÀEÔ
JÕKð r   