87 lines
3.0 KiB
PL/PgSQL
87 lines
3.0 KiB
PL/PgSQL
-- Tabela de clientes do CRM (multi-tenant)
|
|
CREATE TABLE IF NOT EXISTS crm_customers (
|
|
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) NOT NULL,
|
|
email VARCHAR(255),
|
|
phone VARCHAR(50),
|
|
company VARCHAR(255),
|
|
position VARCHAR(100),
|
|
|
|
-- Endereço
|
|
address VARCHAR(255),
|
|
city VARCHAR(100),
|
|
state VARCHAR(50),
|
|
zip_code VARCHAR(20),
|
|
country VARCHAR(100) DEFAULT 'Brasil',
|
|
|
|
-- Informações adicionais
|
|
notes TEXT,
|
|
tags TEXT[], -- Array de tags para filtros rápidos
|
|
|
|
-- 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_email_per_tenant UNIQUE (tenant_id, email)
|
|
);
|
|
|
|
-- Tabela de listas para organizar clientes
|
|
CREATE TABLE IF NOT EXISTS crm_lists (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
|
|
|
name VARCHAR(100) NOT NULL,
|
|
description TEXT,
|
|
color VARCHAR(7) DEFAULT '#3b82f6', -- Hex color
|
|
|
|
created_by UUID REFERENCES users(id),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
-- Lista deve ter nome único por agência
|
|
CONSTRAINT unique_list_per_tenant UNIQUE (tenant_id, name)
|
|
);
|
|
|
|
-- Relacionamento N:N entre clientes e listas
|
|
CREATE TABLE IF NOT EXISTS crm_customer_lists (
|
|
customer_id UUID REFERENCES crm_customers(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 (customer_id, list_id)
|
|
);
|
|
|
|
-- Índices para performance
|
|
CREATE INDEX idx_crm_customers_tenant_id ON crm_customers(tenant_id);
|
|
CREATE INDEX idx_crm_customers_email ON crm_customers(email);
|
|
CREATE INDEX idx_crm_customers_name ON crm_customers(name);
|
|
CREATE INDEX idx_crm_customers_is_active ON crm_customers(is_active);
|
|
CREATE INDEX idx_crm_customers_tags ON crm_customers USING GIN(tags);
|
|
|
|
CREATE INDEX idx_crm_lists_tenant_id ON crm_lists(tenant_id);
|
|
CREATE INDEX idx_crm_lists_name ON crm_lists(name);
|
|
|
|
CREATE INDEX idx_crm_customer_lists_customer_id ON crm_customer_lists(customer_id);
|
|
CREATE INDEX idx_crm_customer_lists_list_id ON crm_customer_lists(list_id);
|
|
|
|
-- Trigger para atualizar updated_at
|
|
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = CURRENT_TIMESTAMP;
|
|
RETURN NEW;
|
|
END;
|
|
$$ language 'plpgsql';
|
|
|
|
CREATE TRIGGER update_crm_customers_updated_at BEFORE UPDATE ON crm_customers
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
CREATE TRIGGER update_crm_lists_updated_at BEFORE UPDATE ON crm_lists
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|