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
| Entidade | Descrição | Relacionamentos |
| cliente | Cadastro central de cada empresa/tenant. | Base para contrato, configurações, leads e usuários. |
| produto / plano / status_contrato / contrato | Define ofertas, planos e contratos ativos. | contrato referencia cliente, plano, produto e status_contrato. |
| sdr_cliente_config | Guarda tokens, contas WhatsApp e integrações. | FKs para cliente e crm; histórico em sdr_cliente_config_historico. |
| sdr_leads | Representa o pipeline de prospecção. | Depende de cliente, canal, sdr_situacao_interna, crm e sdr_produtos. |
| sdr_mensagens | Mensagens enviadas/recebidas. | Relaciona-se a um lead e ao tipo_mensagem; rastreia cliente e WhatsApp. |
| sdr_produtos & sdr_imagem_produto | Material comercial personalizado por cliente. | sdr_imagem_produto referencia um produto e serve de base para recomendações. |
| blocked_list / follow_up / whatsapp_account_update / usuario | Entidades de suporte à operação e segurança. | Sempre rastreadas ao cliente responsável. |
Auditoria Automática (Histórico)
| Tabela | Histórico | Motivo |
| sdr_contexto_cliente | sdr_contexto_cliente_historico | Contextos da IA |
| sdr_leads | sdr_leads_historico | Status/dados |
| sdr_cliente_config | sdr_cliente_config_historico | Flags/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();