-- Enable UUID extension CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- ============================================ -- TABELA: USUARIOS -- ============================================ CREATE TABLE usuarios ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), email VARCHAR(255) NOT NULL UNIQUE, nome_completo VARCHAR(255) NOT NULL, perfil VARCHAR(50) CHECK (perfil IN ('admin', 'gerente_qualidade', 'engenheiro', 'cliente')) DEFAULT 'engenheiro', ativo BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_usuarios_email ON usuarios(email); CREATE INDEX idx_usuarios_perfil ON usuarios(perfil); -- ============================================ -- TABELA: CLIENTES -- ============================================ CREATE TABLE clientes ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), nome VARCHAR(255) NOT NULL, contato VARCHAR(255), email VARCHAR(255), telefone VARCHAR(20), ativo BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_clientes_nome ON clientes(nome); -- ============================================ -- TABELA: TEMPLATES_TOPICOS -- ============================================ CREATE TABLE templates_topicos ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), numero_topico VARCHAR(20) NOT NULL, titulo VARCHAR(255) NOT NULL, descricao TEXT, obrigatorio BOOLEAN DEFAULT FALSE, ordem INTEGER, tipo_documentos TEXT[], tags_padrao TEXT[], categoria VARCHAR(100), created_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_topicos_numero ON templates_topicos(numero_topico); CREATE INDEX idx_topicos_categoria ON templates_topicos(categoria); -- ============================================ -- TABELA: TEMPLATES_CUSTOMIZADOS -- ============================================ CREATE TABLE templates_customizados ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), nome VARCHAR(255) NOT NULL UNIQUE, tipo VARCHAR(50) CHECK (tipo IN ('novo', 'derivado')) DEFAULT 'novo', template_pai_id UUID REFERENCES templates_customizados(id) ON DELETE SET NULL, topicos_selecionados TEXT[], total_topicos INTEGER, total_obrigatorios INTEGER, descricao TEXT, ativo BOOLEAN DEFAULT TRUE, criado_por UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_templates_nome ON templates_customizados(nome); CREATE INDEX idx_templates_tipo ON templates_customizados(tipo); -- ============================================ -- TABELA: PROJETOS -- ============================================ CREATE TABLE projetos ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), numero_projeto VARCHAR(100) NOT NULL UNIQUE, nome_projeto VARCHAR(255) NOT NULL, cliente_id UUID REFERENCES clientes(id) ON DELETE CASCADE, template_id UUID REFERENCES templates_customizados(id) ON DELETE SET NULL, status VARCHAR(50) CHECK (status IN ('rascunho', 'em_andamento', 'revisao', 'finalizado', 'cancelado')) DEFAULT 'rascunho', progresso_percentual INTEGER DEFAULT 0, data_inicio DATE, data_entrega_prevista DATE, responsavel_id UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_projetos_numero ON projetos(numero_projeto); CREATE INDEX idx_projetos_status ON projetos(status); CREATE INDEX idx_projetos_cliente ON projetos(cliente_id); -- ============================================ -- TABELA: DATABOOKS_MESTRES -- ============================================ CREATE TABLE databooks_mestres ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), projeto_id UUID NOT NULL REFERENCES projetos(id) ON DELETE CASCADE, cliente_nome VARCHAR(255), cliente_contato VARCHAR(255), cliente_email VARCHAR(255), cliente_telefone VARCHAR(20), produto_nome VARCHAR(255) NOT NULL, produto_tipo VARCHAR(100), produto_descricao TEXT, produto_normas TEXT[], numero_projeto VARCHAR(100), ordem_compra VARCHAR(100), data_inicio DATE, data_entrega_prevista DATE, responsavel_id UUID, revisao_numero VARCHAR(20) DEFAULT 'Rev. 0', revisao_data TIMESTAMP DEFAULT NOW(), revisao_autor_id UUID, revisao_motivo TEXT, logo_empresa_url TEXT, logo_cliente_url TEXT, marca_agua_url TEXT, cor_primaria VARCHAR(7), cor_secundaria VARCHAR(7), titulo_principal VARCHAR(255), subtitulo VARCHAR(255), texto_rodape_capa TEXT, tamanho_pagina VARCHAR(20) CHECK (tamanho_pagina IN ('A4', 'Letter')) DEFAULT 'A4', orientacao VARCHAR(20) CHECK (orientacao IN ('retrato', 'paisagem')) DEFAULT 'retrato', margem_superior_mm NUMERIC(5,2) DEFAULT 20, margem_lateral_mm NUMERIC(5,2) DEFAULT 20, incluir_marca_agua BOOLEAN DEFAULT TRUE, incluir_numero_pagina BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_mestres_projeto ON databooks_mestres(projeto_id); -- ============================================ -- TABELA: SECOES_DATABOOK -- ============================================ CREATE TABLE secoes_databook ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), projeto_id UUID NOT NULL REFERENCES projetos(id) ON DELETE CASCADE, topico_id UUID REFERENCES templates_topicos(id), numero_secao VARCHAR(20) NOT NULL, titulo VARCHAR(255) NOT NULL, ordem INTEGER, status VARCHAR(50) CHECK (status IN ('completo', 'incompleto', 'nao_aplicavel')) DEFAULT 'incompleto', total_documentos INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_secoes_projeto ON secoes_databook(projeto_id); CREATE INDEX idx_secoes_numero ON secoes_databook(numero_secao); -- ============================================ -- TABELA: CONFIGURACOES_PASTAS -- ============================================ CREATE TABLE configuracoes_pastas ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), tipo_documento VARCHAR(100) NOT NULL, caminho_local TEXT NOT NULL, caminho_subtipo VARCHAR(100), caminho_completo TEXT, habilitado BOOLEAN DEFAULT TRUE, frequencia_atualizacao VARCHAR(50) CHECK (frequencia_atualizacao IN ('manual', 'ao_criar', 'diario', 'semanal')) DEFAULT 'ao_criar', ultima_atualizacao TIMESTAMP, incluir_subpastas BOOLEAN DEFAULT TRUE, formatos_aceitos TEXT[], tamanho_maximo_mb INTEGER DEFAULT 50, tags_obrigatorias TEXT[], palavras_chave_filtro TEXT[], palavras_chave_excluir TEXT[], ordem_docs VARCHAR(50) CHECK (ordem_docs IN ('data', 'nome', 'relevancia')) DEFAULT 'data', criado_por UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_pastas_tipo ON configuracoes_pastas(tipo_documento); -- ============================================ -- TABELA: INTEGRACAO_IA -- ============================================ CREATE TABLE integracao_ia ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), provider VARCHAR(50) CHECK (provider IN ('openai', 'claude', 'gemini')) NOT NULL, api_key_encriptada TEXT NOT NULL, modelo_padrao VARCHAR(100), maximo_tokens INTEGER DEFAULT 2000, ativo BOOLEAN DEFAULT FALSE, testado_em TIMESTAMP, teste_status VARCHAR(50), teste_mensagem TEXT, criado_por UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); -- ============================================ -- TABELA: DOCUMENTOS_AUTO_INDEXADOS -- ============================================ CREATE TABLE documentos_auto_indexados ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), databook_id UUID NOT NULL REFERENCES projetos(id) ON DELETE CASCADE, secao_id UUID REFERENCES secoes_databook(id) ON DELETE SET NULL, secao_numero VARCHAR(20), titulo VARCHAR(255) NOT NULL, numero_documento VARCHAR(100), revisao VARCHAR(20), arquivo_url TEXT NOT NULL, arquivo_tipo VARCHAR(50), conteudo_texto TEXT, tags_automaticas TEXT[], tags_usuario TEXT[], relevancia_score NUMERIC(3,2), confianca_classificacao NUMERIC(3,2), ordem_na_secao INTEGER, data_documento DATE, aprovado BOOLEAN DEFAULT FALSE, processado_por_ia VARCHAR(50), processado_em TIMESTAMP, criado_em TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_auto_databook ON documentos_auto_indexados(databook_id); CREATE INDEX idx_auto_secao ON documentos_auto_indexados(secao_numero); -- ============================================ -- TABELA: LOG_PROCESSAMENTO_IA -- ============================================ CREATE TABLE log_processamento_ia ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), databook_id UUID NOT NULL REFERENCES projetos(id) ON DELETE CASCADE, inicio_processamento TIMESTAMP, fim_processamento TIMESTAMP, duracao_segundos INTEGER, total_documentos_encontrados INTEGER, total_documentos_indexados INTEGER, total_erros INTEGER, pastas_varridas TEXT[], provider_ia VARCHAR(50), modelo_usado VARCHAR(100), tokens_utilizados INTEGER, status VARCHAR(50) CHECK (status IN ('sucesso', 'parcial', 'erro')) DEFAULT 'sucesso', mensagem_erro TEXT, iniciado_por UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_log_ia_databook ON log_processamento_ia(databook_id); -- ============================================ -- TABELA: PERMISSOES_USUARIO_DETALHADAS -- ============================================ CREATE TABLE permissoes_usuario_detalhadas ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), usuario_id UUID NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE, pode_criar_template BOOLEAN DEFAULT FALSE, pode_editar_template BOOLEAN DEFAULT FALSE, pode_deletar_template BOOLEAN DEFAULT FALSE, pode_criar_databook BOOLEAN DEFAULT FALSE, pode_editar_databook BOOLEAN DEFAULT FALSE, pode_deletar_databook BOOLEAN DEFAULT FALSE, pode_upload_documentos BOOLEAN DEFAULT FALSE, pode_aprovar_documentos BOOLEAN DEFAULT FALSE, pode_gerar_pdf BOOLEAN DEFAULT FALSE, pode_visualizar_preview BOOLEAN DEFAULT FALSE, pode_acessar_logs BOOLEAN DEFAULT FALSE, pode_configurar_ia BOOLEAN DEFAULT FALSE, pode_configurar_pastas BOOLEAN DEFAULT FALSE, pode_gerenciar_usuarios BOOLEAN DEFAULT FALSE, acesso_apenas_seus_projetos BOOLEAN DEFAULT TRUE, pode_visualizar_precos BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW(), UNIQUE(usuario_id) ); -- ============================================ -- VIEWS -- ============================================ CREATE OR REPLACE VIEW view_projetos_resumo AS SELECT p.id, p.numero_projeto, p.nome_projeto, p.status, p.progresso_percentual, c.nome as cliente_nome, tc.nome as template_nome, COUNT(DISTINCT sd.id) as total_secoes, COUNT(DISTINCT dai.id) as total_documentos, p.created_at FROM projetos p LEFT JOIN clientes c ON p.cliente_id = c.id LEFT JOIN templates_customizados tc ON p.template_id = tc.id LEFT JOIN secoes_databook sd ON p.id = sd.projeto_id LEFT JOIN documentos_auto_indexados dai ON p.id = dai.databook_id GROUP BY p.id, c.nome, tc.nome ORDER BY p.created_at DESC; -- ============================================ -- TRIGGERS -- ============================================ CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ language 'plpgsql'; CREATE TRIGGER update_templates_updated_at BEFORE UPDATE ON templates_customizados FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_projetos_updated_at BEFORE UPDATE ON projetos FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_databooks_mestres_updated_at BEFORE UPDATE ON databooks_mestres FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- ============================================ -- ROW LEVEL SECURITY (RLS) -- ============================================ ALTER TABLE usuarios ENABLE ROW LEVEL SECURITY; ALTER TABLE clientes ENABLE ROW LEVEL SECURITY; ALTER TABLE templates_customizados ENABLE ROW LEVEL SECURITY; ALTER TABLE projetos ENABLE ROW LEVEL SECURITY; ALTER TABLE databooks_mestres ENABLE ROW LEVEL SECURITY; ALTER TABLE secoes_databook ENABLE ROW LEVEL SECURITY; ALTER TABLE configuracoes_pastas ENABLE ROW LEVEL SECURITY; ALTER TABLE documentos_auto_indexados ENABLE ROW LEVEL SECURITY; -- Policies básicas (ajustar conforme necessidade) CREATE POLICY "Usuários podem ver todos os registros" ON usuarios FOR SELECT USING (true); CREATE POLICY "Clientes podem ser vistos por todos" ON clientes FOR SELECT USING (true); CREATE POLICY "Templates podem ser vistos por todos" ON templates_customizados FOR SELECT USING (true); CREATE POLICY "Projetos podem ser vistos por todos" ON projetos FOR SELECT USING (true);