Files

11 KiB

LeadRadar - Especificação Técnica e Funcional de Arquitetura (specs.md)


1. Visão Geral do Produto

O LeadRadar é uma plataforma de automação para prospecção ativa de clientes (B2B/B2C) e gestão de funil comercial (Mini-CRM). A aplicação automatiza a busca de estabelecimentos comerciais no Google Maps a partir da triangulação de CEP e ramo de atividade, enriquecendo e organizando leads em um pipeline de vendas interativo.

O sistema é construído sobre uma arquitetura híbrida e desacoplada:

  • Backend API & Core Engine: Python / Flask (REST API, persistência, controle de acesso e regras de negócio).
  • Frontend & Dashboard Operacional: Streamlit com componentes customizados em CSS/HTML para proporcionar uma interface responsiva, com identidade visual sóbria, moderna (dark slate / deep tech) e de usabilidade fluida.
  • Integração Externa: Endpoints e Webhooks preparados para orquestração assíncrona via n8n (para futuros fluxos de envio e recepção de mensagens).
  • Containerização: Docker & Docker Compose com isolamento de rede e persistência por volumes.

2. Arquitetura do Sistema e Stack Tecnológica

2.1 Componentes Principais

 ┌─────────────────────────────────────────────────────────────┐
 │                      LeadRadar UI                           │
 │        (Streamlit - Frontend Moderno / Responsivo)          │
 └──────────────────────────────┬──────────────────────────────┘
                                │ HTTP / REST (JWT Bearer)
 ┌──────────────────────────────▼──────────────────────────────┐
 │                      LeadRadar Core                         │
 │              (Flask Application Service)                    │
 │  ┌─────────────────┬───────────────────┬─────────────────┐  │
 │  │ Auth & RBAC     │ Maps Scraper      │ Webhook API     │  │
 │  │ (Flask-JWT-Ext) │ (Playwright Core) │ (Para n8n)      │  │
 │  └────────┬────────┴─────────┬─────────┴────────┬────────┘  │
 └───────────┼──────────────────┼──────────────────┼───────────┘
             │                  │                  │
    ┌────────▼────────┐ ┌───────▼────────┐ ┌───────▼────────┐
    │  SQLite / PG    │ │  ViaCEP &      │ │  Fluxo n8n     │
    │  (SQLAlchemy)   │ │  OSM Nominatim │ │  (Mensageria)  │
    └─────────────────┘ └────────────────┘ └────────────────┘

2.2 Tecnologias Utilizadas

  • Linguagem: Python 3.11+
  • Backend Framework: Flask 3.x, Flask-SQLAlchemy, Flask-Bcrypt, Flask-JWT-Extended, Pydantic (validação).
  • Frontend Framework: Streamlit 1.35+ (com st_shadcn_ui / CSS Injection para tema dark tech sóbrio).
  • Scraping & Geocoding: Playwright (Chromium headless), httpx / requests, APIs de geocodificação (ViaCEP + OpenStreetMap Nominatim).
  • Banco de Dados: PostgreSQL 16 (produção em Docker) / SQLite com WAL mode (desenvolvimento/testes).
  • Testes & Qualidade: Pytest, Pytest-Flask, Pytest-Playwright, Coverage, Black, Flake8, Bandit (SAST).
  • Containerização: Docker (Multi-stage build) & Docker Compose.

3. Controle de Acesso e Autenticação (RBAC)

3.1 Perfis de Acesso

Funcionalidade / Permissão Perfil admin Perfil user
Executar busca de leads no Maps (CEP + Ramo) Sim Sim
Visualizar e movimentar leads no Kanban Sim Sim
Editar notas, etiquetas e contatos de leads Sim Sim
Exportar leads em CSV / JSON Sim Sim
Alterar a própria senha Sim Sim
Criar novos usuários Sim Não
Excluir ou bloquear usuários Sim Não
Resetar senha de terceiros Sim Não
Limpeza / Expurgar banco de dados e logs Sim Não
Configurar webhooks e credenciais de integração Sim Não

3.2 Segurança de Autenticação

  • Armazenamento de senhas utilizando hash seguro via Bcrypt com fator de custo (rounds) \ge 12.
  • Sessões autenticadas via JWT (JSON Web Tokens) trafegados no cabeçalho Authorization: Bearer <token> ou cookies HTTP-Only seguros com tempo de expiração (access_token: 8 horas, refresh_token: 7 dias).

4. Modelagem de Dados

4.1 Entidade users

  • id (UUID / Integer PK)
  • nome (VARCHAR(120), Not Null)
  • email (VARCHAR(180), Unique, Indexed, Not Null)
  • password_hash (VARCHAR(255), Not Null)
  • role (ENUM: 'admin', 'user', Default: 'user')
  • ativo (BOOLEAN, Default: True)
  • criado_em (DATETIME, Default: UTC Now)
  • atualizado_em (DATETIME, On Update: UTC Now)

4.2 Entidade leads

  • id (UUID / Integer PK)
  • nome_empresa (VARCHAR(255), Indexed, Not Null)
  • ramo_atividade (VARCHAR(100), Indexed, Not Null)
  • cep_busca (VARCHAR(10), Indexed, Not Null)
  • logradouro (VARCHAR(255))
  • bairro (VARCHAR(100))
  • cidade (VARCHAR(100), Indexed)
  • uf (VARCHAR(2))
  • telefone (VARCHAR(50))
  • telefone_sanitizado (VARCHAR(30), Indexed) # Formato E.164 (ex: 5511999999999)
  • whatsapp_valido (BOOLEAN, Nullable)
  • website (VARCHAR(255))
  • google_rating (FLOAT, Default: 0.0)
  • total_avaliacoes (INTEGER, Default: 0)
  • google_maps_url (TEXT)
  • status_funil (ENUM: 'novo', 'contatado', 'respondeu', 'negociacao', 'ganho', 'perdido')
  • tags (JSON / Array de tags customizadas)
  • notas (TEXT)
  • usuario_responsavel_id (FK -> users.id, Nullable)
  • criado_em (DATETIME, Default: UTC Now)
  • atualizado_em (DATETIME, On Update: UTC Now)

4.3 Entidade lead_interacoes (Histórico & Auditoria)

  • id (UUID / Integer PK)
  • lead_id (FK -> leads.id, On Delete Cascade)
  • usuario_id (FK -> users.id, Nullable)
  • tipo (ENUM: 'status_change', 'nota_adicionada', 'mensagem_enviada', 'webhook_n8n')
  • descricao (TEXT)
  • metadados (JSONB / TEXT)
  • timestamp (DATETIME, Default: UTC Now)

5. Módulo de Automação & Busca de Leads

5.1 Fluxo de Triangulação de CEP

  1. Usuário informa o CEP (ex: 01310-100) e o Ramo de Atuação (ex: Clínica Odontológica, Padaria, Restaurante).
  2. O sistema consome a API do ViaCEP (https://viacep.com.br/ws/{cep}/json/) para obter bairro, município e UF.
  3. Se necessário, resolve a latitude/longitude via Nominatim OpenStreetMap ou monta a string de busca contextualizada: "{ramo} em {bairro}, {municipio} - {uf}".
  4. O scraper do Google Maps (Playwright) abre a busca com rolagem dinâmica e extrai os metadados dos estabelecimentos.

5.2 Regras de Deduplicação

  • Deduplicação automática baseada na combinação de (nome_empresa, telefone_sanitizado, cidade).
  • Se o lead já existir na base, atualiza apenas dados cadastrais se houver novos campos (sem resetar o status_funil).

6. Interface Visual e Experiência do Usuário (UI/UX)

6.1 Diretrizes de Design

  • Paleta de Cores: Fundo escuro grafite/ardósia (#0D1117, #161B22), bordas sutis (#30363D), tipografia com alto contraste e legibilidade (#E6EDF3, #8B949E), e acentos em azul tecnológico (#1F6FEB, #58A6FF).
  • Navegação Modular:
    • Radar de Busca: Formulário limpo com validação de CEP, seleção de ramo e indicador visual de progresso da varredura.
    • Funil CRM (Kanban): Colunas interativas com cards compactos, tags coloridas por ramo, nota do Google e atalho rápido para WhatsApp/edição de status.
    • Tabela Analítica / Exportação: Visualização tabular com filtros avançados, ordenação e exportação em CSV/XLSX.
    • Administração: Painel exclusivo para administradores com criação/exclusão de operadores, logs de auditoria e configurações.
    • Perfil / Segurança: Modal ou tela para alteração segura de senha pelo próprio usuário logado.

7. Conformidade com a LGPD e Segurança da Informação

  1. Princípio da Finalidade e Necessidade (Art. 6º, I e III):
    • Coleta restrita a dados comerciais publicamente disponibilizados pelos próprios estabelecimentos comerciais no Google Maps para fins legítimos de prospecção B2B (Art. 7º, IX - Legítimo Interesse).
  2. Direito de Eliminação / Opt-Out (Art. 18, VI):
    • Mecanismo integrado para marcar leads como "Não Contatar / Excluído", garantindo que novos disparos ou re-importações não reativem o contato.
  3. Auditoria e Rastreabilidade:
    • Log de todas as ações sensíveis (exportações, exclusões de leads, cadastros de usuários) com timestamp e ID do usuário executor.
  4. Segurança de Dados em Trânsito e Repouso:
    • Comunicação interna e externa sob TLS/HTTPS em ambiente de produção; senhas com salt/hashing irreversível.

8. Arquitetura Docker & Deployment

A aplicação deve conter:

  • Dockerfile.backend: Multi-stage build otimizado para a API Flask + Playwright (instalando dependências do Chromium headless).
  • Dockerfile.frontend: Imagem leve para o Streamlit.
  • docker-compose.yml: Orquestração contendo os serviços:
    • leadradar-db (PostgreSQL 16 com volume persistente).
    • leadradar-api (Flask Backend).
    • leadradar-ui (Streamlit Frontend).
  • Arquivo .env.example estruturado com segredos (JWT_SECRET_KEY, POSTGRES_PASSWORD, FLASK_ENV).

9. Plano de Testes e Garantia de Qualidade

  1. Testes Unitários:
    • Validação de funções de formatação/sanitização de telefone e CEP.
    • Hashing e validação de senhas com Bcrypt.
    • Verificação de políticas RBAC (permissões de Admin vs User).
  2. Testes de Integração:
    • Endpoints de autenticação (/api/v1/auth/login, /api/v1/auth/change-password).
    • CRUD de usuários (garantindo que user receba 403 Forbidden ao tentar criar/deletar).
    • Inserção e atualização de leads e interações.
  3. Testes End-to-End (E2E):
    • Mock e execução do crawler de busca geolocalizada via Playwright.
    • Fluxo completo de busca -> salvamento no banco -> movimentação no Kanban.