Initial commit DBMaker - Oficiais e Funcionando
This commit is contained in:
340
supabase/migrations/001_initial_schema.sql
Normal file
340
supabase/migrations/001_initial_schema.sql
Normal file
@@ -0,0 +1,340 @@
|
||||
-- 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);
|
||||
Reference in New Issue
Block a user