omnichannel-deploy/database/migrations/002_area.sql

64 lines
2.8 KiB
SQL

-- ============================================================
-- Migration 002: Modulo de Areas
-- Tabelas: areas e relacionamento usuarios_areas
-- ============================================================
-- ------------------------------------------------------------
-- Tabela: areas
-- Representa as areas operacionais do atendimento
-- Ex: Suporte, Financeiro, Comercial
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS areas (
id SERIAL PRIMARY KEY,
nome VARCHAR(120) NOT NULL UNIQUE,
descricao TEXT,
responsavel_usuario_id INTEGER REFERENCES usuarios (id) ON DELETE SET NULL,
ativo BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_areas_nome ON areas (nome);
CREATE INDEX IF NOT EXISTS idx_areas_responsavel ON areas (responsavel_usuario_id);
CREATE INDEX IF NOT EXISTS idx_areas_ativo ON areas (ativo);
-- ------------------------------------------------------------
-- Tabela: usuarios_areas
-- Relacionamento muitos-para-muitos entre usuarios e areas
-- Um usuario pode atuar em mais de uma area e uma area pode ter
-- varios usuarios.
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS usuarios_areas (
id SERIAL PRIMARY KEY,
usuario_id INTEGER NOT NULL REFERENCES usuarios (id) ON DELETE CASCADE,
area_id INTEGER NOT NULL REFERENCES areas (id) ON DELETE CASCADE,
funcao VARCHAR(80),
principal BOOLEAN NOT NULL DEFAULT FALSE,
ativo BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
CONSTRAINT uq_usuario_area UNIQUE (usuario_id, area_id)
);
CREATE INDEX IF NOT EXISTS idx_usuarios_areas_usuario ON usuarios_areas (usuario_id);
CREATE INDEX IF NOT EXISTS idx_usuarios_areas_area ON usuarios_areas (area_id);
CREATE INDEX IF NOT EXISTS idx_usuarios_areas_ativo ON usuarios_areas (ativo);
-- Garante que cada usuario tenha no maximo uma area principal.
CREATE UNIQUE INDEX IF NOT EXISTS uq_usuario_area_principal
ON usuarios_areas (usuario_id)
WHERE principal = TRUE;
-- ------------------------------------------------------------
-- Dados iniciais: areas padrao para o MVP
-- ------------------------------------------------------------
INSERT INTO areas (nome, descricao) VALUES
('Suporte', 'Atendimento operacional e resolucao de duvidas tecnicas'),
('Financeiro', 'Atendimento relacionado a cobrancas, pagamentos e notas'),
('Comercial', 'Atendimento de vendas, propostas e relacionamento comercial')
ON CONFLICT (nome) DO NOTHING;