feat: versão 1.5 - CRM Beta com leads, funis, campanhas e portal do cliente
This commit is contained in:
70
postgres/migrations/015_create_crm_leads.sql
Normal file
70
postgres/migrations/015_create_crm_leads.sql
Normal file
@@ -0,0 +1,70 @@
|
||||
-- Tabela de leads do CRM (multi-tenant)
|
||||
CREATE TABLE IF NOT EXISTS crm_leads (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||||
|
||||
-- Dados básicos
|
||||
name VARCHAR(255),
|
||||
email VARCHAR(255),
|
||||
phone VARCHAR(50),
|
||||
|
||||
-- Origem do lead
|
||||
source VARCHAR(50) DEFAULT 'import',
|
||||
source_meta JSONB DEFAULT '{}'::jsonb,
|
||||
|
||||
-- Status
|
||||
status VARCHAR(50) DEFAULT 'novo',
|
||||
|
||||
-- Informações adicionais
|
||||
notes TEXT,
|
||||
tags TEXT[],
|
||||
|
||||
-- Controle
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
created_by UUID REFERENCES users(id),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
-- Constraint: email deve ser único por agência (pode repetir entre agências)
|
||||
CONSTRAINT unique_lead_email_per_tenant UNIQUE (tenant_id, email)
|
||||
);
|
||||
|
||||
-- Relacionamento N:N entre leads e listas
|
||||
CREATE TABLE IF NOT EXISTS crm_lead_lists (
|
||||
lead_id UUID REFERENCES crm_leads(id) ON DELETE CASCADE,
|
||||
list_id UUID REFERENCES crm_lists(id) ON DELETE CASCADE,
|
||||
added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
added_by UUID REFERENCES users(id),
|
||||
PRIMARY KEY (lead_id, list_id)
|
||||
);
|
||||
|
||||
-- Índices para performance
|
||||
CREATE INDEX IF NOT EXISTS idx_crm_leads_tenant_id ON crm_leads(tenant_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_crm_leads_email ON crm_leads(email);
|
||||
CREATE INDEX IF NOT EXISTS idx_crm_leads_phone ON crm_leads(phone);
|
||||
CREATE INDEX IF NOT EXISTS idx_crm_leads_status ON crm_leads(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_crm_leads_is_active ON crm_leads(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_crm_leads_tags ON crm_leads USING GIN(tags);
|
||||
CREATE INDEX IF NOT EXISTS idx_crm_leads_source ON crm_leads(source);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_crm_lead_lists_lead_id ON crm_lead_lists(lead_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_crm_lead_lists_list_id ON crm_lead_lists(list_id);
|
||||
|
||||
-- Trigger para atualizar updated_at (usa a função update_updated_at_column criada em 014_create_crm_tables.sql)
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1
|
||||
FROM pg_proc
|
||||
WHERE proname = 'update_updated_at_column'
|
||||
) THEN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM pg_trigger
|
||||
WHERE tgname = 'update_crm_leads_updated_at'
|
||||
) THEN
|
||||
CREATE TRIGGER update_crm_leads_updated_at BEFORE UPDATE ON crm_leads
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
END IF;
|
||||
END IF;
|
||||
END $$;
|
||||
Reference in New Issue
Block a user