
    PtjH                        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d      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j4                   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)
monthrangez,/opt/mia/workspace/prospeccao_ativa/users.dbg~jt?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     6/opt/mia/workspace/prospeccao_ativa/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%    ??3w<(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
ZCs1v{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_mesr/   4   s;    <<>Dtyy$**5MAzq*txx'((r   c                 R    t        dt        j                         j                        S r%   )r*   r   r'   r+   r   r   r   _dias_ja_passados_no_mesr1   :   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   	_semaforor9   >   s!    
Rx
 Rx
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_usadosd   g        idnome)rankconta_idr@   usadoslimiter8   )r    fetchall	enumerater   roundappend)r   rowstopirrD   rC   r8   s           r   _top5_contasrM   P   s    <<  	 
 	 C$a( 1Q~&+!,Q~&+!,39A:eVf_+Q/3

$fI
 		 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      r6   uM   Atenção. Aproximando do limite. Se o ritmo continuar, overflow custará R$ z.2fu    este mês.r7   u?   Crítico. Free tier praticamente esgotado. Overflow projetado: z leads (~R$ z).g      Y@)total_usadorD   free_tier_limitr8   
pct_capped	restantescor_semaforotexto_semaforomedia_diariadias_passadosdias_restantesprojecao_mesoverflow_projetadocusto_overflow_brltop5)r   r   r#   rM   closer*   r   rG   r9   r1   r/   USD_POR_LEAD_OVERFLOWCAMBIO_USD_BRLmin)rQ   r   rP   r\   rD   r8   rS   cortextorW   rX   rV   rY   rZ   r[   s                  r   get_dashboard_sauderc   j   s    .0;D/5D!

C()F
v%,a
0CAv+,I3JC -.M+-N}4a8L{l^&CDELQv 5614IINZ\]^ i.2$$6s#;;H 	 

	M!",/A#.FbJ 	 #!%o$&($00 9 	

s   D D.__main__rO   F)indentensure_ascii)returnr   )r8   floatrg   ztuple[str, str])rg   z
list[dict]r   )rQ   z
int | Nonerg   dict)__doc__
__future__r   r   r   r   r   pathlibr   calendarr   r   r^   r_   r   r   r#   r/   r1   r9   rM   rc   __name__json_jsonprintdumpsr   r   r   <module>rs      s    # 	  (  
=
>  
)&$4@F z	+%++)+AE
JK r   