64 lines
2.8 KiB
MySQL
64 lines
2.8 KiB
MySQL
|
|
-- ============================================================
|
||
|
|
-- 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;
|