77 lines
4.0 KiB
Python
77 lines
4.0 KiB
Python
import pandas as pd
|
|
import streamlit as st
|
|
from api_client import APIClient
|
|
|
|
def render_radar_busca_view(api_client: APIClient):
|
|
st.title("📡 Radar de Busca & Prospecção Geolocalizada")
|
|
st.caption("Consulte estabelecimentos comerciais no Google Maps a partir da triangulação de CEP e ramo de atividade.")
|
|
|
|
c1, c2 = st.columns([1, 2])
|
|
|
|
with c1:
|
|
with st.container(border=True):
|
|
st.subheader("🔍 Parâmetros de Varredura")
|
|
|
|
cep = st.text_input("CEP Alvo", value="01310-100", help="Digite o CEP com ou sem hífen (ex: 01310-100)")
|
|
|
|
ramo_sugestoes = [
|
|
"Clínica Odontológica", "Padaria", "Restaurante", "Academia",
|
|
"Escritório de Contabilidade", "Oficina Mecânica", "Farmácia", "Salão de Beleza"
|
|
]
|
|
ramo = st.selectbox("Ramo de Atividade", options=ramo_sugestoes, index=0)
|
|
custom_ramo = st.text_input("Ou digite um ramo personalizado:", value="", placeholder="Ex: Petshop 24h")
|
|
|
|
ramo_final = custom_ramo.strip() if custom_ramo.strip() else ramo
|
|
max_results = st.slider("Quantidade máxima de leads", min_value=5, max_value=50, value=15, step=5)
|
|
|
|
if st.button("🛰️ Disparar Prospecção Ativa", type="primary", use_container_width=True):
|
|
if not cep:
|
|
st.error("Informe um CEP válido.")
|
|
else:
|
|
progress_bar = st.progress(0, text="Iniciando triangulação de CEP via ViaCEP...")
|
|
|
|
with st.spinner("Extraindo estabelecimentos no Google Maps via Playwright Scraper..."):
|
|
progress_bar.progress(30, text="Bairro e Município resolvidos. Abrindo Playwright Chromium...")
|
|
success, data = api_client.search_maps(cep, ramo_final, max_results)
|
|
progress_bar.progress(80, text="Deduplicando e persistindo leads no banco de dados...")
|
|
|
|
if success:
|
|
progress_bar.progress(100, text="Varredura concluída!")
|
|
st.session_state['last_search_data'] = data
|
|
st.success("Busca executada e leads atualizados no banco de dados!")
|
|
else:
|
|
progress_bar.empty()
|
|
st.error(data.get('error', 'Falha ao executar prospecção.'))
|
|
|
|
with c2:
|
|
search_data = st.session_state.get('last_search_data')
|
|
if search_data:
|
|
summary = search_data.get('summary', {})
|
|
loc = summary.get('location', {})
|
|
leads = summary.get('leads', [])
|
|
|
|
st.subheader("📊 Resultado da Varredura")
|
|
|
|
mc1, mc2, mc3 = st.columns(3)
|
|
mc1.metric("Localização", f"{loc.get('bairro', 'Bairro')}, {loc.get('cidade', 'Cidade')}-{loc.get('uf', '')}")
|
|
mc2.metric("Novos Leads", summary.get('created_count', 0))
|
|
mc3.metric("Reencontrados/Atualizados", summary.get('updated_count', 0))
|
|
|
|
if leads:
|
|
st.markdown("### 📋 Preview dos Leads Obtidos")
|
|
df_data = []
|
|
for l in leads:
|
|
df_data.append({
|
|
'Empresa': l.get('nome_empresa'),
|
|
'Ramo': l.get('ramo_atividade'),
|
|
'Telefone': l.get('telefone'),
|
|
'Avaliação': f"⭐ {l.get('google_rating')} ({l.get('total_avaliacoes')})",
|
|
'Bairro/Cidade': f"{l.get('bairro', '')} / {l.get('cidade', '')}",
|
|
'Status': l.get('status_funil')
|
|
})
|
|
df = pd.DataFrame(df_data)
|
|
st.dataframe(df, use_container_width=True)
|
|
st.info("💡 Acesse o menu **Funil CRM (Kanban)** para gerenciar estes leads!")
|
|
else:
|
|
st.info("👈 Preencha os parâmetros no painel ao lado e clique em **Disparar Prospecção Ativa** para iniciar.")
|