DER e Estrutura do Banco (PostgreSQL)

Modelo relacional: tabelas, relações, auditoria e snippets prontos.

Esquema SQL Oficial

O script completo do banco está disponível em DB_SDR_VIRTUAL.sql. Ele consolida as instruções de CREATE TABLE e ALTER TABLE, incluindo chaves estrangeiras, auditorias e entidades auxiliares.

  • Importação rápida: psql -f docs/DB_SDR_VIRTUAL.sql (ajuste conforme o dialeto do seu SGBD).
  • Compatibilidade: script pensado para provisionamento inicial em ambientes de homologação e produção.
  • Versionamento: mantenha o arquivo junto da documentação para que qualquer atualização do DER seja rastreável.

Baixar schema SQL

DER Visual

flowchart TB cliente --> contrato cliente --> cliente_configuracao cliente --> sdr_cliente_config cliente --> sdr_contexto_cliente cliente --> sdr_leads cliente --> sdr_produtos cliente --> follow_up cliente --> blocked_list cliente --> whatsapp_account_update cliente --> usuario cliente --> Agente produto --> plano produto --> contrato plano --> contrato status_contrato --> contrato Agente --> produto Agente --> canal crm --> sdr_cliente_config crm --> sdr_leads canal --> sdr_leads sdr_situacao_interna --> sdr_leads sdr_produtos --> sdr_imagem_produto sdr_produtos --> sdr_leads sdr_leads --> sdr_leads_historico sdr_leads --> sdr_mensagens tipo_mensagem --> sdr_mensagens sdr_cliente_config --> sdr_cliente_config_historico sdr_contexto_cliente --> sdr_contexto_cliente_historico

Tabelas Principais

EntidadeDescriçãoRelacionamentos
clienteCadastro central de cada empresa/tenant.Base para contrato, configurações, leads e usuários.
produto / plano / status_contrato / contratoDefine ofertas, planos e contratos ativos.contrato referencia cliente, plano, produto e status_contrato.
sdr_cliente_configGuarda tokens, contas WhatsApp e integrações.FKs para cliente e crm; histórico em sdr_cliente_config_historico.
sdr_leadsRepresenta o pipeline de prospecção.Depende de cliente, canal, sdr_situacao_interna, crm e sdr_produtos.
sdr_mensagensMensagens enviadas/recebidas.Relaciona-se a um lead e ao tipo_mensagem; rastreia cliente e WhatsApp.
sdr_produtos & sdr_imagem_produtoMaterial comercial personalizado por cliente.sdr_imagem_produto referencia um produto e serve de base para recomendações.
blocked_list / follow_up / whatsapp_account_update / usuarioEntidades de suporte à operação e segurança.Sempre rastreadas ao cliente responsável.

Auditoria Automática (Histórico)

TabelaHistóricoMotivo
sdr_contexto_clientesdr_contexto_cliente_historicoContextos da IA
sdr_leadssdr_leads_historicoStatus/dados
sdr_cliente_configsdr_cliente_config_historicoFlags/limites

Snippets SQL

Trigger: data_hora_ultima_alteracao
CREATE OR REPLACE FUNCTION atualizar_data_modificacao()
RETURNS TRIGGER AS $$
BEGIN
  NEW.data_hora_ultima_alteracao = NOW();
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Exemplo:
CREATE TRIGGER trg_update_cliente BEFORE UPDATE ON cliente
FOR EACH ROW EXECUTE FUNCTION atualizar_data_modificacao();
Auditoria: sdr_contexto_cliente
CREATE TABLE IF NOT EXISTS sdr_contexto_cliente_historico (
  id SERIAL PRIMARY KEY,
  id_cliente INT REFERENCES cliente(id),
  id_sdr_contexto_cliente INT REFERENCES sdr_contexto_cliente(id),
  campo VARCHAR(128),
  valor_anterior TEXT,
  valor_novo TEXT,
  alterado_por VARCHAR(128),
  host VARCHAR(128),
  aplicacao VARCHAR(128),
  data_hora_cadastro TIMESTAMP DEFAULT NOW() NOT NULL
);

CREATE OR REPLACE FUNCTION auditar_sdr_contexto()
RETURNS TRIGGER AS $$
DECLARE
  campo TEXT;
  antigo TEXT;
  novo TEXT;
BEGIN
  FOR campo IN SELECT column_name FROM information_schema.columns
               WHERE table_name = 'sdr_contexto_cliente'
  LOOP
    EXECUTE format('SELECT ($1).' || campo || '::text', OLD) INTO antigo;
    EXECUTE format('SELECT ($1).' || campo || '::text', NEW) INTO novo;
    IF antigo IS DISTINCT FROM novo THEN
      INSERT INTO sdr_contexto_cliente_historico
        (id_cliente, id_sdr_contexto_cliente, campo, valor_anterior, valor_novo, alterado_por, host, aplicacao)
      VALUES (OLD.id_cliente, OLD.id, campo, antigo, novo, current_user, inet_client_addr(), 'API / N8N');
    END IF;
  END LOOP;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_audit_contexto
AFTER UPDATE ON sdr_contexto_cliente
FOR EACH ROW EXECUTE FUNCTION auditar_sdr_contexto();