-- ============================================================ -- 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;