Refatoracao geral: limpeza de logs, correcoes de fim de linha, animacoes framer-motion e automacao de deploy no package.json
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
-- Script para adicionar coluna categoria_id na tabela configuracoes_pastas
|
||||
-- Execute este script no SQL Editor do Supabase
|
||||
|
||||
-- Adicionar coluna categoria_id
|
||||
ALTER TABLE configuracoes_pastas
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
|
||||
-- Criar índice para melhor performance
|
||||
CREATE INDEX IF NOT EXISTS idx_pastas_categoria ON configuracoes_pastas(categoria_id);
|
||||
|
||||
-- Verificar se a coluna foi adicionada
|
||||
SELECT column_name, data_type
|
||||
FROM information_schema.columns
|
||||
WHERE table_name = 'configuracoes_pastas'
|
||||
AND column_name = 'categoria_id';
|
||||
-- Script para adicionar coluna categoria_id na tabela configuracoes_pastas
|
||||
-- Execute este script no SQL Editor do Supabase
|
||||
|
||||
-- Adicionar coluna categoria_id
|
||||
ALTER TABLE configuracoes_pastas
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
|
||||
-- Criar índice para melhor performance
|
||||
CREATE INDEX IF NOT EXISTS idx_pastas_categoria ON configuracoes_pastas(categoria_id);
|
||||
|
||||
-- Verificar se a coluna foi adicionada
|
||||
SELECT column_name, data_type
|
||||
FROM information_schema.columns
|
||||
WHERE table_name = 'configuracoes_pastas'
|
||||
AND column_name = 'categoria_id';
|
||||
|
||||
@@ -1,340 +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);
|
||||
-- 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);
|
||||
|
||||
@@ -1,105 +1,105 @@
|
||||
-- Fix RLS policies to allow INSERT, UPDATE, DELETE operations
|
||||
|
||||
-- Templates policies
|
||||
DROP POLICY IF EXISTS "Templates podem ser vistos por todos" ON templates_customizados;
|
||||
|
||||
CREATE POLICY "Templates - SELECT para todos" ON templates_customizados
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Templates - INSERT para usuários autenticados" ON templates_customizados
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Templates - UPDATE para usuários autenticados" ON templates_customizados
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Templates - DELETE para usuários autenticados" ON templates_customizados
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Clientes policies
|
||||
DROP POLICY IF EXISTS "Clientes podem ser vistos por todos" ON clientes;
|
||||
|
||||
CREATE POLICY "Clientes - SELECT para todos" ON clientes
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Clientes - INSERT para usuários autenticados" ON clientes
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Clientes - UPDATE para usuários autenticados" ON clientes
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Clientes - DELETE para usuários autenticados" ON clientes
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Projetos policies
|
||||
DROP POLICY IF EXISTS "Projetos podem ser vistos por todos" ON projetos;
|
||||
|
||||
CREATE POLICY "Projetos - SELECT para todos" ON projetos
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Projetos - INSERT para usuários autenticados" ON projetos
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Projetos - UPDATE para usuários autenticados" ON projetos
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Projetos - DELETE para usuários autenticados" ON projetos
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Databooks policies
|
||||
CREATE POLICY "Databooks - SELECT para todos" ON databooks_mestres
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Databooks - INSERT para usuários autenticados" ON databooks_mestres
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Databooks - UPDATE para usuários autenticados" ON databooks_mestres
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Databooks - DELETE para usuários autenticados" ON databooks_mestres
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Secoes policies
|
||||
CREATE POLICY "Secoes - SELECT para todos" ON secoes_databook
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Secoes - INSERT para usuários autenticados" ON secoes_databook
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Secoes - UPDATE para usuários autenticados" ON secoes_databook
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Secoes - DELETE para usuários autenticados" ON secoes_databook
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Configuracoes_pastas policies
|
||||
CREATE POLICY "Pastas - SELECT para todos" ON configuracoes_pastas
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Pastas - INSERT para usuários autenticados" ON configuracoes_pastas
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Pastas - UPDATE para usuários autenticados" ON configuracoes_pastas
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Pastas - DELETE para usuários autenticados" ON configuracoes_pastas
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Documentos_auto_indexados policies
|
||||
CREATE POLICY "Documentos - SELECT para todos" ON documentos_auto_indexados
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Documentos - INSERT para usuários autenticados" ON documentos_auto_indexados
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Documentos - UPDATE para usuários autenticados" ON documentos_auto_indexados
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Documentos - DELETE para usuários autenticados" ON documentos_auto_indexados
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
-- Fix RLS policies to allow INSERT, UPDATE, DELETE operations
|
||||
|
||||
-- Templates policies
|
||||
DROP POLICY IF EXISTS "Templates podem ser vistos por todos" ON templates_customizados;
|
||||
|
||||
CREATE POLICY "Templates - SELECT para todos" ON templates_customizados
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Templates - INSERT para usuários autenticados" ON templates_customizados
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Templates - UPDATE para usuários autenticados" ON templates_customizados
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Templates - DELETE para usuários autenticados" ON templates_customizados
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Clientes policies
|
||||
DROP POLICY IF EXISTS "Clientes podem ser vistos por todos" ON clientes;
|
||||
|
||||
CREATE POLICY "Clientes - SELECT para todos" ON clientes
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Clientes - INSERT para usuários autenticados" ON clientes
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Clientes - UPDATE para usuários autenticados" ON clientes
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Clientes - DELETE para usuários autenticados" ON clientes
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Projetos policies
|
||||
DROP POLICY IF EXISTS "Projetos podem ser vistos por todos" ON projetos;
|
||||
|
||||
CREATE POLICY "Projetos - SELECT para todos" ON projetos
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Projetos - INSERT para usuários autenticados" ON projetos
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Projetos - UPDATE para usuários autenticados" ON projetos
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Projetos - DELETE para usuários autenticados" ON projetos
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Databooks policies
|
||||
CREATE POLICY "Databooks - SELECT para todos" ON databooks_mestres
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Databooks - INSERT para usuários autenticados" ON databooks_mestres
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Databooks - UPDATE para usuários autenticados" ON databooks_mestres
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Databooks - DELETE para usuários autenticados" ON databooks_mestres
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Secoes policies
|
||||
CREATE POLICY "Secoes - SELECT para todos" ON secoes_databook
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Secoes - INSERT para usuários autenticados" ON secoes_databook
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Secoes - UPDATE para usuários autenticados" ON secoes_databook
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Secoes - DELETE para usuários autenticados" ON secoes_databook
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Configuracoes_pastas policies
|
||||
CREATE POLICY "Pastas - SELECT para todos" ON configuracoes_pastas
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Pastas - INSERT para usuários autenticados" ON configuracoes_pastas
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Pastas - UPDATE para usuários autenticados" ON configuracoes_pastas
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Pastas - DELETE para usuários autenticados" ON configuracoes_pastas
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
-- Documentos_auto_indexados policies
|
||||
CREATE POLICY "Documentos - SELECT para todos" ON documentos_auto_indexados
|
||||
FOR SELECT USING (true);
|
||||
|
||||
CREATE POLICY "Documentos - INSERT para usuários autenticados" ON documentos_auto_indexados
|
||||
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Documentos - UPDATE para usuários autenticados" ON documentos_auto_indexados
|
||||
FOR UPDATE USING (auth.role() = 'authenticated')
|
||||
WITH CHECK (auth.role() = 'authenticated');
|
||||
|
||||
CREATE POLICY "Documentos - DELETE para usuários autenticados" ON documentos_auto_indexados
|
||||
FOR DELETE USING (auth.role() = 'authenticated');
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
-- Adicionar tipo 'padrao' aos templates
|
||||
ALTER TABLE templates_customizados
|
||||
DROP CONSTRAINT IF EXISTS templates_customizados_tipo_check;
|
||||
|
||||
ALTER TABLE templates_customizados
|
||||
ADD CONSTRAINT templates_customizados_tipo_check
|
||||
CHECK (tipo IN ('novo', 'derivado', 'padrao'));
|
||||
-- Adicionar tipo 'padrao' aos templates
|
||||
ALTER TABLE templates_customizados
|
||||
DROP CONSTRAINT IF EXISTS templates_customizados_tipo_check;
|
||||
|
||||
ALTER TABLE templates_customizados
|
||||
ADD CONSTRAINT templates_customizados_tipo_check
|
||||
CHECK (tipo IN ('novo', 'derivado', 'padrao'));
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
-- Alterar coluna arquivo_url para TEXT para suportar base64
|
||||
ALTER TABLE documentos_auto_indexados
|
||||
ALTER COLUMN arquivo_url TYPE TEXT;
|
||||
-- Alterar coluna arquivo_url para TEXT para suportar base64
|
||||
ALTER TABLE documentos_auto_indexados
|
||||
ALTER COLUMN arquivo_url TYPE TEXT;
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
-- Criar tabela de categorias
|
||||
CREATE TABLE IF NOT EXISTS categorias (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
nome VARCHAR(100) NOT NULL UNIQUE,
|
||||
descricao TEXT,
|
||||
cor VARCHAR(7) DEFAULT '#3B82F6',
|
||||
icone VARCHAR(50),
|
||||
ativo BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Desabilitar RLS para desenvolvimento
|
||||
ALTER TABLE categorias DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Inserir categorias padrão
|
||||
INSERT INTO categorias (nome, descricao, cor) VALUES
|
||||
('Certificados', 'Certificados de qualificação e conformidade', '#10B981'),
|
||||
('Desenhos', 'Desenhos técnicos e de fabricação', '#3B82F6'),
|
||||
('Relatórios', 'Relatórios de inspeção e testes', '#F59E0B'),
|
||||
('Procedimentos', 'Procedimentos e instruções', '#8B5CF6'),
|
||||
('Normas', 'Normas e especificações técnicas', '#EF4444')
|
||||
ON CONFLICT (nome) DO NOTHING;
|
||||
|
||||
-- Adicionar coluna categoria_id nas tabelas existentes
|
||||
ALTER TABLE templates_topicos
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
|
||||
ALTER TABLE configuracoes_pastas
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
-- Criar tabela de categorias
|
||||
CREATE TABLE IF NOT EXISTS categorias (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
nome VARCHAR(100) NOT NULL UNIQUE,
|
||||
descricao TEXT,
|
||||
cor VARCHAR(7) DEFAULT '#3B82F6',
|
||||
icone VARCHAR(50),
|
||||
ativo BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Desabilitar RLS para desenvolvimento
|
||||
ALTER TABLE categorias DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Inserir categorias padrão
|
||||
INSERT INTO categorias (nome, descricao, cor) VALUES
|
||||
('Certificados', 'Certificados de qualificação e conformidade', '#10B981'),
|
||||
('Desenhos', 'Desenhos técnicos e de fabricação', '#3B82F6'),
|
||||
('Relatórios', 'Relatórios de inspeção e testes', '#F59E0B'),
|
||||
('Procedimentos', 'Procedimentos e instruções', '#8B5CF6'),
|
||||
('Normas', 'Normas e especificações técnicas', '#EF4444')
|
||||
ON CONFLICT (nome) DO NOTHING;
|
||||
|
||||
-- Adicionar coluna categoria_id nas tabelas existentes
|
||||
ALTER TABLE templates_topicos
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
|
||||
ALTER TABLE configuracoes_pastas
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
|
||||
@@ -1,162 +1,162 @@
|
||||
-- Criar tabela de templates de design
|
||||
CREATE TABLE IF NOT EXISTS design_templates (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
nome VARCHAR(255) NOT NULL,
|
||||
descricao TEXT,
|
||||
tipo VARCHAR(50) NOT NULL CHECK (tipo IN ('capa', 'indice', 'divisora', 'cabecalho', 'rodape', 'guia_estilo')),
|
||||
config JSONB NOT NULL DEFAULT '{}',
|
||||
ativo BOOLEAN DEFAULT TRUE,
|
||||
criado_por UUID REFERENCES auth.users(id) ON DELETE SET NULL,
|
||||
criado_em TIMESTAMP DEFAULT NOW(),
|
||||
atualizado_em TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE(nome)
|
||||
);
|
||||
|
||||
-- Criar índices
|
||||
CREATE INDEX idx_design_templates_tipo ON design_templates(tipo);
|
||||
CREATE INDEX idx_design_templates_ativo ON design_templates(ativo);
|
||||
CREATE INDEX idx_design_templates_criado_por ON design_templates(criado_por);
|
||||
|
||||
-- Desabilitar RLS para desenvolvimento
|
||||
ALTER TABLE design_templates DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Inserir templates padrão
|
||||
INSERT INTO design_templates (nome, descricao, tipo, config) VALUES
|
||||
(
|
||||
'Capa Padrão',
|
||||
'Template padrão para capa frontal do databook',
|
||||
'capa',
|
||||
'{
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"titulo": "BUZIOS 7 PRODUCTION SYSTEM DEVELOPMENT",
|
||||
"subtitulo": "AR HEAD FABRICATION LONG",
|
||||
"cliente": "SAIPEM",
|
||||
"numeroDocumento": "DB-B97-01_S1_VENDOR_DATABOOK",
|
||||
"contrato": "OC 1472739",
|
||||
"fornecedor": "ENGEMETAL"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Índice Bilíngue',
|
||||
'Template de índice com suporte a português e inglês',
|
||||
'indice',
|
||||
'{
|
||||
"corTitulo": "#1a365d",
|
||||
"corLinha": "#2b6cb0",
|
||||
"bilingue": true,
|
||||
"titulo": "ÍNDICE / TABLE OF CONTENTS"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Divisora Minimalista',
|
||||
'Template minimalista para divisoras de seção',
|
||||
'divisora',
|
||||
'{
|
||||
"estilo": "minimalista",
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"bilingue": true,
|
||||
"icone": "📑"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Divisora Lateral',
|
||||
'Template com barra lateral para divisoras',
|
||||
'divisora',
|
||||
'{
|
||||
"estilo": "lateral",
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"bilingue": true,
|
||||
"icone": "📑"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Divisora Corporativa',
|
||||
'Template corporativo para divisoras',
|
||||
'divisora',
|
||||
'{
|
||||
"estilo": "corporativa",
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"bilingue": true,
|
||||
"icone": "📑"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Cabeçalho Padrão',
|
||||
'Template padrão para cabeçalho de página',
|
||||
'cabecalho',
|
||||
'{
|
||||
"corBorda": "#2b6cb0",
|
||||
"altura": 60,
|
||||
"estilo": "simples"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Rodapé Padrão',
|
||||
'Template padrão para rodapé de página',
|
||||
'rodape',
|
||||
'{
|
||||
"corBorda": "#cbd5e0",
|
||||
"altura": 40,
|
||||
"estilo": "simples",
|
||||
"mostrarPagina": true
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Guia de Estilo Padrão',
|
||||
'Template de guia de estilo completo',
|
||||
'guia_estilo',
|
||||
'{
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"corDestaque": "#4299e1",
|
||||
"fontePrincipal": "Roboto",
|
||||
"fonteSecundaria": "Open Sans",
|
||||
"incluirPaleta": true,
|
||||
"incluirTipografia": true
|
||||
}'
|
||||
)
|
||||
ON CONFLICT (nome) DO NOTHING;
|
||||
|
||||
-- Criar tabela de aplicação de templates a databooks
|
||||
CREATE TABLE IF NOT EXISTS databook_design_aplicacoes (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
databook_id UUID NOT NULL REFERENCES projetos(id) ON DELETE CASCADE,
|
||||
template_capa_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_indice_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_divisora_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_cabecalho_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_rodape_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_guia_estilo_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
aplicado_em TIMESTAMP DEFAULT NOW(),
|
||||
atualizado_em TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE(databook_id)
|
||||
);
|
||||
|
||||
-- Criar índices
|
||||
CREATE INDEX idx_databook_design_aplicacoes_databook ON databook_design_aplicacoes(databook_id);
|
||||
|
||||
-- Desabilitar RLS
|
||||
ALTER TABLE databook_design_aplicacoes DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Criar trigger para atualizar atualizado_em
|
||||
CREATE OR REPLACE FUNCTION update_design_templates_updated_at()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.atualizado_em = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER update_design_templates_updated_at_trigger
|
||||
BEFORE UPDATE ON design_templates
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_design_templates_updated_at();
|
||||
|
||||
CREATE TRIGGER update_databook_design_aplicacoes_updated_at_trigger
|
||||
BEFORE UPDATE ON databook_design_aplicacoes
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_design_templates_updated_at();
|
||||
-- Criar tabela de templates de design
|
||||
CREATE TABLE IF NOT EXISTS design_templates (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
nome VARCHAR(255) NOT NULL,
|
||||
descricao TEXT,
|
||||
tipo VARCHAR(50) NOT NULL CHECK (tipo IN ('capa', 'indice', 'divisora', 'cabecalho', 'rodape', 'guia_estilo')),
|
||||
config JSONB NOT NULL DEFAULT '{}',
|
||||
ativo BOOLEAN DEFAULT TRUE,
|
||||
criado_por UUID REFERENCES auth.users(id) ON DELETE SET NULL,
|
||||
criado_em TIMESTAMP DEFAULT NOW(),
|
||||
atualizado_em TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE(nome)
|
||||
);
|
||||
|
||||
-- Criar índices
|
||||
CREATE INDEX idx_design_templates_tipo ON design_templates(tipo);
|
||||
CREATE INDEX idx_design_templates_ativo ON design_templates(ativo);
|
||||
CREATE INDEX idx_design_templates_criado_por ON design_templates(criado_por);
|
||||
|
||||
-- Desabilitar RLS para desenvolvimento
|
||||
ALTER TABLE design_templates DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Inserir templates padrão
|
||||
INSERT INTO design_templates (nome, descricao, tipo, config) VALUES
|
||||
(
|
||||
'Capa Padrão',
|
||||
'Template padrão para capa frontal do databook',
|
||||
'capa',
|
||||
'{
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"titulo": "BUZIOS 7 PRODUCTION SYSTEM DEVELOPMENT",
|
||||
"subtitulo": "AR HEAD FABRICATION LONG",
|
||||
"cliente": "SAIPEM",
|
||||
"numeroDocumento": "DB-B97-01_S1_VENDOR_DATABOOK",
|
||||
"contrato": "OC 1472739",
|
||||
"fornecedor": "ENGEMETAL"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Índice Bilíngue',
|
||||
'Template de índice com suporte a português e inglês',
|
||||
'indice',
|
||||
'{
|
||||
"corTitulo": "#1a365d",
|
||||
"corLinha": "#2b6cb0",
|
||||
"bilingue": true,
|
||||
"titulo": "ÍNDICE / TABLE OF CONTENTS"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Divisora Minimalista',
|
||||
'Template minimalista para divisoras de seção',
|
||||
'divisora',
|
||||
'{
|
||||
"estilo": "minimalista",
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"bilingue": true,
|
||||
"icone": "📑"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Divisora Lateral',
|
||||
'Template com barra lateral para divisoras',
|
||||
'divisora',
|
||||
'{
|
||||
"estilo": "lateral",
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"bilingue": true,
|
||||
"icone": "📑"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Divisora Corporativa',
|
||||
'Template corporativo para divisoras',
|
||||
'divisora',
|
||||
'{
|
||||
"estilo": "corporativa",
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"bilingue": true,
|
||||
"icone": "📑"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Cabeçalho Padrão',
|
||||
'Template padrão para cabeçalho de página',
|
||||
'cabecalho',
|
||||
'{
|
||||
"corBorda": "#2b6cb0",
|
||||
"altura": 60,
|
||||
"estilo": "simples"
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Rodapé Padrão',
|
||||
'Template padrão para rodapé de página',
|
||||
'rodape',
|
||||
'{
|
||||
"corBorda": "#cbd5e0",
|
||||
"altura": 40,
|
||||
"estilo": "simples",
|
||||
"mostrarPagina": true
|
||||
}'
|
||||
),
|
||||
(
|
||||
'Guia de Estilo Padrão',
|
||||
'Template de guia de estilo completo',
|
||||
'guia_estilo',
|
||||
'{
|
||||
"corPrimaria": "#1a365d",
|
||||
"corSecundaria": "#2b6cb0",
|
||||
"corDestaque": "#4299e1",
|
||||
"fontePrincipal": "Roboto",
|
||||
"fonteSecundaria": "Open Sans",
|
||||
"incluirPaleta": true,
|
||||
"incluirTipografia": true
|
||||
}'
|
||||
)
|
||||
ON CONFLICT (nome) DO NOTHING;
|
||||
|
||||
-- Criar tabela de aplicação de templates a databooks
|
||||
CREATE TABLE IF NOT EXISTS databook_design_aplicacoes (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
databook_id UUID NOT NULL REFERENCES projetos(id) ON DELETE CASCADE,
|
||||
template_capa_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_indice_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_divisora_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_cabecalho_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_rodape_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
template_guia_estilo_id UUID REFERENCES design_templates(id) ON DELETE SET NULL,
|
||||
aplicado_em TIMESTAMP DEFAULT NOW(),
|
||||
atualizado_em TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE(databook_id)
|
||||
);
|
||||
|
||||
-- Criar índices
|
||||
CREATE INDEX idx_databook_design_aplicacoes_databook ON databook_design_aplicacoes(databook_id);
|
||||
|
||||
-- Desabilitar RLS
|
||||
ALTER TABLE databook_design_aplicacoes DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Criar trigger para atualizar atualizado_em
|
||||
CREATE OR REPLACE FUNCTION update_design_templates_updated_at()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.atualizado_em = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER update_design_templates_updated_at_trigger
|
||||
BEFORE UPDATE ON design_templates
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_design_templates_updated_at();
|
||||
|
||||
CREATE TRIGGER update_databook_design_aplicacoes_updated_at_trigger
|
||||
BEFORE UPDATE ON databook_design_aplicacoes
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_design_templates_updated_at();
|
||||
|
||||
@@ -1,58 +1,58 @@
|
||||
-- Adicionar status 'arquivado' aos projetos
|
||||
ALTER TABLE projetos DROP CONSTRAINT IF EXISTS projetos_status_check;
|
||||
ALTER TABLE projetos ADD CONSTRAINT projetos_status_check
|
||||
CHECK (status IN ('rascunho', 'em_andamento', 'revisao', 'finalizado', 'cancelado', 'arquivado'));
|
||||
|
||||
-- Adicionar campo 'ativo' à tabela templates_topicos (soft delete)
|
||||
ALTER TABLE templates_topicos ADD COLUMN IF NOT EXISTS ativo BOOLEAN DEFAULT TRUE;
|
||||
CREATE INDEX IF NOT EXISTS idx_topicos_ativo ON templates_topicos(ativo);
|
||||
|
||||
-- Adicionar campo 'inativado_em' para rastreamento
|
||||
ALTER TABLE templates_topicos ADD COLUMN IF NOT EXISTS inativado_em TIMESTAMP;
|
||||
ALTER TABLE templates_customizados ADD COLUMN IF NOT EXISTS inativado_em TIMESTAMP;
|
||||
|
||||
-- Comentários explicativos
|
||||
COMMENT ON COLUMN templates_topicos.ativo IS 'Soft delete: FALSE oculta o tópico de novas criações mas mantém em databooks existentes';
|
||||
COMMENT ON COLUMN templates_customizados.ativo IS 'Soft delete: FALSE oculta o template de novas criações mas mantém em databooks existentes';
|
||||
|
||||
-- Criar função para "soft delete" de templates
|
||||
CREATE OR REPLACE FUNCTION soft_delete_template()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
-- Ao invés de deletar, marca como inativo
|
||||
UPDATE templates_customizados
|
||||
SET ativo = FALSE, inativado_em = NOW()
|
||||
WHERE id = OLD.id;
|
||||
|
||||
-- Impede a exclusão física
|
||||
RETURN NULL;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Criar trigger para soft delete de templates
|
||||
DROP TRIGGER IF EXISTS prevent_template_hard_delete ON templates_customizados;
|
||||
CREATE TRIGGER prevent_template_hard_delete
|
||||
BEFORE DELETE ON templates_customizados
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION soft_delete_template();
|
||||
|
||||
-- Criar função para "soft delete" de tópicos
|
||||
CREATE OR REPLACE FUNCTION soft_delete_topico()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
-- Ao invés de deletar, marca como inativo
|
||||
UPDATE templates_topicos
|
||||
SET ativo = FALSE, inativado_em = NOW()
|
||||
WHERE id = OLD.id;
|
||||
|
||||
-- Impede a exclusão física
|
||||
RETURN NULL;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Criar trigger para soft delete de tópicos
|
||||
DROP TRIGGER IF EXISTS prevent_topico_hard_delete ON templates_topicos;
|
||||
CREATE TRIGGER prevent_topico_hard_delete
|
||||
BEFORE DELETE ON templates_topicos
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION soft_delete_topico();
|
||||
-- Adicionar status 'arquivado' aos projetos
|
||||
ALTER TABLE projetos DROP CONSTRAINT IF EXISTS projetos_status_check;
|
||||
ALTER TABLE projetos ADD CONSTRAINT projetos_status_check
|
||||
CHECK (status IN ('rascunho', 'em_andamento', 'revisao', 'finalizado', 'cancelado', 'arquivado'));
|
||||
|
||||
-- Adicionar campo 'ativo' à tabela templates_topicos (soft delete)
|
||||
ALTER TABLE templates_topicos ADD COLUMN IF NOT EXISTS ativo BOOLEAN DEFAULT TRUE;
|
||||
CREATE INDEX IF NOT EXISTS idx_topicos_ativo ON templates_topicos(ativo);
|
||||
|
||||
-- Adicionar campo 'inativado_em' para rastreamento
|
||||
ALTER TABLE templates_topicos ADD COLUMN IF NOT EXISTS inativado_em TIMESTAMP;
|
||||
ALTER TABLE templates_customizados ADD COLUMN IF NOT EXISTS inativado_em TIMESTAMP;
|
||||
|
||||
-- Comentários explicativos
|
||||
COMMENT ON COLUMN templates_topicos.ativo IS 'Soft delete: FALSE oculta o tópico de novas criações mas mantém em databooks existentes';
|
||||
COMMENT ON COLUMN templates_customizados.ativo IS 'Soft delete: FALSE oculta o template de novas criações mas mantém em databooks existentes';
|
||||
|
||||
-- Criar função para "soft delete" de templates
|
||||
CREATE OR REPLACE FUNCTION soft_delete_template()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
-- Ao invés de deletar, marca como inativo
|
||||
UPDATE templates_customizados
|
||||
SET ativo = FALSE, inativado_em = NOW()
|
||||
WHERE id = OLD.id;
|
||||
|
||||
-- Impede a exclusão física
|
||||
RETURN NULL;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Criar trigger para soft delete de templates
|
||||
DROP TRIGGER IF EXISTS prevent_template_hard_delete ON templates_customizados;
|
||||
CREATE TRIGGER prevent_template_hard_delete
|
||||
BEFORE DELETE ON templates_customizados
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION soft_delete_template();
|
||||
|
||||
-- Criar função para "soft delete" de tópicos
|
||||
CREATE OR REPLACE FUNCTION soft_delete_topico()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
-- Ao invés de deletar, marca como inativo
|
||||
UPDATE templates_topicos
|
||||
SET ativo = FALSE, inativado_em = NOW()
|
||||
WHERE id = OLD.id;
|
||||
|
||||
-- Impede a exclusão física
|
||||
RETURN NULL;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Criar trigger para soft delete de tópicos
|
||||
DROP TRIGGER IF EXISTS prevent_topico_hard_delete ON templates_topicos;
|
||||
CREATE TRIGGER prevent_topico_hard_delete
|
||||
BEFORE DELETE ON templates_topicos
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION soft_delete_topico();
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
-- Adicionar campos de metadados aos documentos
|
||||
ALTER TABLE documentos_auto_indexados
|
||||
ADD COLUMN IF NOT EXISTS arquivo_tamanho BIGINT,
|
||||
ADD COLUMN IF NOT EXISTS num_paginas INTEGER DEFAULT 1,
|
||||
ADD COLUMN IF NOT EXISTS formato_pagina VARCHAR(20) DEFAULT 'A4',
|
||||
ADD COLUMN IF NOT EXISTS orientacao VARCHAR(20) DEFAULT 'retrato';
|
||||
|
||||
-- Comentários explicativos
|
||||
COMMENT ON COLUMN documentos_auto_indexados.arquivo_tamanho IS 'Tamanho do arquivo em bytes';
|
||||
COMMENT ON COLUMN documentos_auto_indexados.num_paginas IS 'Número de páginas do documento';
|
||||
COMMENT ON COLUMN documentos_auto_indexados.formato_pagina IS 'Formato da página: A4, A3, A2, A1, etc';
|
||||
COMMENT ON COLUMN documentos_auto_indexados.orientacao IS 'Orientação: retrato ou paisagem';
|
||||
|
||||
-- Atualizar documentos existentes com valores padrão
|
||||
UPDATE documentos_auto_indexados
|
||||
SET
|
||||
num_paginas = 1,
|
||||
formato_pagina = 'A4',
|
||||
orientacao = 'retrato'
|
||||
WHERE num_paginas IS NULL;
|
||||
-- Adicionar campos de metadados aos documentos
|
||||
ALTER TABLE documentos_auto_indexados
|
||||
ADD COLUMN IF NOT EXISTS arquivo_tamanho BIGINT,
|
||||
ADD COLUMN IF NOT EXISTS num_paginas INTEGER DEFAULT 1,
|
||||
ADD COLUMN IF NOT EXISTS formato_pagina VARCHAR(20) DEFAULT 'A4',
|
||||
ADD COLUMN IF NOT EXISTS orientacao VARCHAR(20) DEFAULT 'retrato';
|
||||
|
||||
-- Comentários explicativos
|
||||
COMMENT ON COLUMN documentos_auto_indexados.arquivo_tamanho IS 'Tamanho do arquivo em bytes';
|
||||
COMMENT ON COLUMN documentos_auto_indexados.num_paginas IS 'Número de páginas do documento';
|
||||
COMMENT ON COLUMN documentos_auto_indexados.formato_pagina IS 'Formato da página: A4, A3, A2, A1, etc';
|
||||
COMMENT ON COLUMN documentos_auto_indexados.orientacao IS 'Orientação: retrato ou paisagem';
|
||||
|
||||
-- Atualizar documentos existentes com valores padrão
|
||||
UPDATE documentos_auto_indexados
|
||||
SET
|
||||
num_paginas = 1,
|
||||
formato_pagina = 'A4',
|
||||
orientacao = 'retrato'
|
||||
WHERE num_paginas IS NULL;
|
||||
|
||||
@@ -1,55 +1,55 @@
|
||||
-- ============================================
|
||||
-- SEED DATA - DADOS INICIAIS
|
||||
-- ============================================
|
||||
|
||||
-- Inserir tópicos padrão (28 seções)
|
||||
INSERT INTO templates_topicos (numero_topico, titulo, obrigatorio, ordem, categoria) VALUES
|
||||
('1', 'Atestado de Conformidade', true, 1, 'atestado'),
|
||||
('2.1', 'Desenhos de Fabricação', true, 2, 'engenharia'),
|
||||
('2.2', 'Mapeamento de Soldas', false, 3, 'engenharia'),
|
||||
('3.1', 'PIT (Plano de Inspeção e Testes)', true, 4, 'qualidade'),
|
||||
('3.2', 'Procedimentos de Inspeção', false, 5, 'qualidade'),
|
||||
('4.1', 'Procedimento de Soldagem (EPS/WPS)', true, 6, 'soldagem'),
|
||||
('4.2', 'Qualificação de Procedimento (RQPS/PQR)', true, 7, 'soldagem'),
|
||||
('5.1', 'Certificados de Metais de Base', true, 8, 'certificados'),
|
||||
('5.2.1', 'Certificados de Consumíveis - Solda', true, 9, 'certificados'),
|
||||
('5.2.2', 'Certificados de Consumíveis - Pintura', false, 10, 'certificados'),
|
||||
('5.3', 'Certificados de Parafusos', false, 11, 'certificados'),
|
||||
('5.4', 'Certificados de Eletrodos de Solda', false, 12, 'certificados'),
|
||||
('5.5', 'Certificados de Gases', false, 13, 'certificados'),
|
||||
('5.6', 'Certificados de Equipamentos', false, 14, 'certificados'),
|
||||
('5.7', 'Certificados de Qualificação de Soldadores', true, 15, 'certificados'),
|
||||
('5.8', 'Certificados de Qualificação de Inspetores', true, 16, 'certificados'),
|
||||
('6.1', 'Relatórios de Inspeção Visual', true, 17, 'inspecao'),
|
||||
('6.2', 'Relatórios de Partícula Magnética', false, 18, 'inspecao'),
|
||||
('6.3', 'Relatórios de Líquido Penetrante', false, 19, 'inspecao'),
|
||||
('6.4', 'Relatórios de Ultrassom', false, 20, 'inspecao'),
|
||||
('6.5', 'Relatórios de Radiografia', false, 21, 'inspecao'),
|
||||
('7.1', 'Relatórios Dimensionais', false, 22, 'dimensional'),
|
||||
('7.2', 'Relatórios de Teste de Carga', false, 23, 'dimensional'),
|
||||
('8.1', 'Procedimento de Pintura', false, 24, 'pintura'),
|
||||
('8.2', 'Relatórios de Inspeção de Pintura', false, 25, 'pintura'),
|
||||
('8.3', 'Certificados de Tinta', false, 26, 'pintura'),
|
||||
('9.1', 'Fotos de Fabricação', false, 27, 'documentacao'),
|
||||
('9.2', 'Registros de Rastreabilidade', false, 28, 'documentacao');
|
||||
|
||||
-- Inserir templates pré-definidos
|
||||
INSERT INTO templates_customizados (nome, tipo, topicos_selecionados, total_topicos, total_obrigatorios, descricao, ativo) VALUES
|
||||
('Completo', 'novo',
|
||||
(SELECT array_agg(id) FROM templates_topicos),
|
||||
28, 9,
|
||||
'Template completo com todas as 28 seções',
|
||||
true),
|
||||
('Mínimo', 'novo',
|
||||
(SELECT array_agg(id) FROM templates_topicos WHERE obrigatorio = true),
|
||||
9, 9,
|
||||
'Template mínimo com apenas seções obrigatórias',
|
||||
true);
|
||||
|
||||
-- Inserir cliente exemplo
|
||||
INSERT INTO clientes (nome, contato, email, telefone) VALUES
|
||||
('Equinor Brasil', 'João Silva', 'joao.silva@equinor.com', '+55 21 99999-9999'),
|
||||
('Petrobras', 'Maria Santos', 'maria.santos@petrobras.com.br', '+55 21 88888-8888');
|
||||
|
||||
-- Mensagem de sucesso
|
||||
SELECT 'Seed data inserido com sucesso!' as message;
|
||||
-- ============================================
|
||||
-- SEED DATA - DADOS INICIAIS
|
||||
-- ============================================
|
||||
|
||||
-- Inserir tópicos padrão (28 seções)
|
||||
INSERT INTO templates_topicos (numero_topico, titulo, obrigatorio, ordem, categoria) VALUES
|
||||
('1', 'Atestado de Conformidade', true, 1, 'atestado'),
|
||||
('2.1', 'Desenhos de Fabricação', true, 2, 'engenharia'),
|
||||
('2.2', 'Mapeamento de Soldas', false, 3, 'engenharia'),
|
||||
('3.1', 'PIT (Plano de Inspeção e Testes)', true, 4, 'qualidade'),
|
||||
('3.2', 'Procedimentos de Inspeção', false, 5, 'qualidade'),
|
||||
('4.1', 'Procedimento de Soldagem (EPS/WPS)', true, 6, 'soldagem'),
|
||||
('4.2', 'Qualificação de Procedimento (RQPS/PQR)', true, 7, 'soldagem'),
|
||||
('5.1', 'Certificados de Metais de Base', true, 8, 'certificados'),
|
||||
('5.2.1', 'Certificados de Consumíveis - Solda', true, 9, 'certificados'),
|
||||
('5.2.2', 'Certificados de Consumíveis - Pintura', false, 10, 'certificados'),
|
||||
('5.3', 'Certificados de Parafusos', false, 11, 'certificados'),
|
||||
('5.4', 'Certificados de Eletrodos de Solda', false, 12, 'certificados'),
|
||||
('5.5', 'Certificados de Gases', false, 13, 'certificados'),
|
||||
('5.6', 'Certificados de Equipamentos', false, 14, 'certificados'),
|
||||
('5.7', 'Certificados de Qualificação de Soldadores', true, 15, 'certificados'),
|
||||
('5.8', 'Certificados de Qualificação de Inspetores', true, 16, 'certificados'),
|
||||
('6.1', 'Relatórios de Inspeção Visual', true, 17, 'inspecao'),
|
||||
('6.2', 'Relatórios de Partícula Magnética', false, 18, 'inspecao'),
|
||||
('6.3', 'Relatórios de Líquido Penetrante', false, 19, 'inspecao'),
|
||||
('6.4', 'Relatórios de Ultrassom', false, 20, 'inspecao'),
|
||||
('6.5', 'Relatórios de Radiografia', false, 21, 'inspecao'),
|
||||
('7.1', 'Relatórios Dimensionais', false, 22, 'dimensional'),
|
||||
('7.2', 'Relatórios de Teste de Carga', false, 23, 'dimensional'),
|
||||
('8.1', 'Procedimento de Pintura', false, 24, 'pintura'),
|
||||
('8.2', 'Relatórios de Inspeção de Pintura', false, 25, 'pintura'),
|
||||
('8.3', 'Certificados de Tinta', false, 26, 'pintura'),
|
||||
('9.1', 'Fotos de Fabricação', false, 27, 'documentacao'),
|
||||
('9.2', 'Registros de Rastreabilidade', false, 28, 'documentacao');
|
||||
|
||||
-- Inserir templates pré-definidos
|
||||
INSERT INTO templates_customizados (nome, tipo, topicos_selecionados, total_topicos, total_obrigatorios, descricao, ativo) VALUES
|
||||
('Completo', 'novo',
|
||||
(SELECT array_agg(id) FROM templates_topicos),
|
||||
28, 9,
|
||||
'Template completo com todas as 28 seções',
|
||||
true),
|
||||
('Mínimo', 'novo',
|
||||
(SELECT array_agg(id) FROM templates_topicos WHERE obrigatorio = true),
|
||||
9, 9,
|
||||
'Template mínimo com apenas seções obrigatórias',
|
||||
true);
|
||||
|
||||
-- Inserir cliente exemplo
|
||||
INSERT INTO clientes (nome, contato, email, telefone) VALUES
|
||||
('Equinor Brasil', 'João Silva', 'joao.silva@equinor.com', '+55 21 99999-9999'),
|
||||
('Petrobras', 'Maria Santos', 'maria.santos@petrobras.com.br', '+55 21 88888-8888');
|
||||
|
||||
-- Mensagem de sucesso
|
||||
SELECT 'Seed data inserido com sucesso!' as message;
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
-- Inserir templates padrão iniciais
|
||||
INSERT INTO templates_customizados (nome, tipo, topicos_selecionados, total_topicos, total_obrigatorios, descricao, ativo)
|
||||
VALUES
|
||||
(
|
||||
'Completo',
|
||||
'padrao',
|
||||
ARRAY['1', '2.1', '2.2', '3.1', '3.2', '4.1', '4.2', '5.1', '5.2.1', '5.2.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '6.1', '6.2', '6.3', '6.4', '6.5', '7.1', '7.2', '8.1', '8.2', '8.3', '9.1', '9.2'],
|
||||
28,
|
||||
9,
|
||||
'Todas as 28 seções do databook',
|
||||
true
|
||||
),
|
||||
(
|
||||
'Mínimo',
|
||||
'padrao',
|
||||
ARRAY['1', '2.1', '3.1', '4.1', '4.2', '5.1', '5.2.1', '5.7', '5.8', '6.1'],
|
||||
10,
|
||||
9,
|
||||
'Apenas seções obrigatórias',
|
||||
true
|
||||
),
|
||||
(
|
||||
'Offshore',
|
||||
'padrao',
|
||||
ARRAY['1', '2.1', '2.2', '3.1', '3.2', '4.1', '4.2', '5.1', '5.2.1', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '6.1', '6.2', '6.3', '6.4', '6.5', '7.1', '7.2', '8.1', '8.2', '8.3', '9.1'],
|
||||
26,
|
||||
9,
|
||||
'Padrão para estruturas offshore',
|
||||
true
|
||||
)
|
||||
ON CONFLICT DO NOTHING;
|
||||
-- Inserir templates padrão iniciais
|
||||
INSERT INTO templates_customizados (nome, tipo, topicos_selecionados, total_topicos, total_obrigatorios, descricao, ativo)
|
||||
VALUES
|
||||
(
|
||||
'Completo',
|
||||
'padrao',
|
||||
ARRAY['1', '2.1', '2.2', '3.1', '3.2', '4.1', '4.2', '5.1', '5.2.1', '5.2.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '6.1', '6.2', '6.3', '6.4', '6.5', '7.1', '7.2', '8.1', '8.2', '8.3', '9.1', '9.2'],
|
||||
28,
|
||||
9,
|
||||
'Todas as 28 seções do databook',
|
||||
true
|
||||
),
|
||||
(
|
||||
'Mínimo',
|
||||
'padrao',
|
||||
ARRAY['1', '2.1', '3.1', '4.1', '4.2', '5.1', '5.2.1', '5.7', '5.8', '6.1'],
|
||||
10,
|
||||
9,
|
||||
'Apenas seções obrigatórias',
|
||||
true
|
||||
),
|
||||
(
|
||||
'Offshore',
|
||||
'padrao',
|
||||
ARRAY['1', '2.1', '2.2', '3.1', '3.2', '4.1', '4.2', '5.1', '5.2.1', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '6.1', '6.2', '6.3', '6.4', '6.5', '7.1', '7.2', '8.1', '8.2', '8.3', '9.1'],
|
||||
26,
|
||||
9,
|
||||
'Padrão para estruturas offshore',
|
||||
true
|
||||
)
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
@@ -1,37 +1,37 @@
|
||||
-- Script para criar tabela de categorias
|
||||
-- Execute este script no SQL Editor do Supabase
|
||||
|
||||
-- Criar tabela de categorias
|
||||
CREATE TABLE IF NOT EXISTS categorias (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
nome VARCHAR(100) NOT NULL UNIQUE,
|
||||
descricao TEXT,
|
||||
cor VARCHAR(7) DEFAULT '#3B82F6',
|
||||
icone VARCHAR(50),
|
||||
ativo BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Desabilitar RLS para desenvolvimento
|
||||
ALTER TABLE categorias DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Inserir categorias padrão
|
||||
INSERT INTO categorias (nome, descricao, cor) VALUES
|
||||
('Certificados', 'Certificados de qualificação e conformidade', '#10B981'),
|
||||
('Desenhos', 'Desenhos técnicos e de fabricação', '#3B82F6'),
|
||||
('Relatórios', 'Relatórios de inspeção e testes', '#F59E0B'),
|
||||
('Procedimentos', 'Procedimentos e instruções', '#8B5CF6'),
|
||||
('Normas', 'Normas e especificações técnicas', '#EF4444')
|
||||
ON CONFLICT (nome) DO NOTHING;
|
||||
|
||||
-- Adicionar coluna categoria_id nas tabelas existentes (se necessário)
|
||||
ALTER TABLE templates_topicos
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
|
||||
ALTER TABLE configuracoes_pastas
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
|
||||
-- Verificar se a tabela foi criada
|
||||
SELECT 'Tabela categorias criada com sucesso!' as status;
|
||||
SELECT * FROM categorias;
|
||||
-- Script para criar tabela de categorias
|
||||
-- Execute este script no SQL Editor do Supabase
|
||||
|
||||
-- Criar tabela de categorias
|
||||
CREATE TABLE IF NOT EXISTS categorias (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
nome VARCHAR(100) NOT NULL UNIQUE,
|
||||
descricao TEXT,
|
||||
cor VARCHAR(7) DEFAULT '#3B82F6',
|
||||
icone VARCHAR(50),
|
||||
ativo BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Desabilitar RLS para desenvolvimento
|
||||
ALTER TABLE categorias DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Inserir categorias padrão
|
||||
INSERT INTO categorias (nome, descricao, cor) VALUES
|
||||
('Certificados', 'Certificados de qualificação e conformidade', '#10B981'),
|
||||
('Desenhos', 'Desenhos técnicos e de fabricação', '#3B82F6'),
|
||||
('Relatórios', 'Relatórios de inspeção e testes', '#F59E0B'),
|
||||
('Procedimentos', 'Procedimentos e instruções', '#8B5CF6'),
|
||||
('Normas', 'Normas e especificações técnicas', '#EF4444')
|
||||
ON CONFLICT (nome) DO NOTHING;
|
||||
|
||||
-- Adicionar coluna categoria_id nas tabelas existentes (se necessário)
|
||||
ALTER TABLE templates_topicos
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
|
||||
ALTER TABLE configuracoes_pastas
|
||||
ADD COLUMN IF NOT EXISTS categoria_id UUID REFERENCES categorias(id) ON DELETE SET NULL;
|
||||
|
||||
-- Verificar se a tabela foi criada
|
||||
SELECT 'Tabela categorias criada com sucesso!' as status;
|
||||
SELECT * FROM categorias;
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
-- SQL para configurar todas as tabelas de configurações
|
||||
|
||||
-- Desabilitar RLS temporariamente para desenvolvimento
|
||||
ALTER TABLE configuracoes_pastas DISABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE integracao_ia DISABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE log_processamento_ia DISABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE permissoes_usuario_detalhadas DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Inserir dados de exemplo para pastas
|
||||
INSERT INTO configuracoes_pastas (tipo_documento, caminho_local, habilitado, frequencia_atualizacao, formatos_aceitos)
|
||||
VALUES
|
||||
('Certificados de Soldagem', 'C:\Documentos\Certificados\Soldagem', true, 'manual', ARRAY['pdf', 'jpg']),
|
||||
('Desenhos de Fabricação', 'C:\Documentos\Desenhos', true, 'ao_criar', ARRAY['pdf', 'dwg']),
|
||||
('Relatórios de Inspeção', 'C:\Documentos\Relatorios', true, 'diario', ARRAY['pdf', 'doc', 'docx'])
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
-- Inserir configuração de IA de exemplo
|
||||
INSERT INTO integracao_ia (provider, api_key_encriptada, modelo_padrao, ativo)
|
||||
VALUES
|
||||
('openai', 'sk-...', 'gpt-4', false),
|
||||
('claude', 'sk-ant-...', 'claude-3-opus', false)
|
||||
ON CONFLICT DO NOTHING;
|
||||
-- SQL para configurar todas as tabelas de configurações
|
||||
|
||||
-- Desabilitar RLS temporariamente para desenvolvimento
|
||||
ALTER TABLE configuracoes_pastas DISABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE integracao_ia DISABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE log_processamento_ia DISABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE permissoes_usuario_detalhadas DISABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Inserir dados de exemplo para pastas
|
||||
INSERT INTO configuracoes_pastas (tipo_documento, caminho_local, habilitado, frequencia_atualizacao, formatos_aceitos)
|
||||
VALUES
|
||||
('Certificados de Soldagem', 'C:\Documentos\Certificados\Soldagem', true, 'manual', ARRAY['pdf', 'jpg']),
|
||||
('Desenhos de Fabricação', 'C:\Documentos\Desenhos', true, 'ao_criar', ARRAY['pdf', 'dwg']),
|
||||
('Relatórios de Inspeção', 'C:\Documentos\Relatorios', true, 'diario', ARRAY['pdf', 'doc', 'docx'])
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
-- Inserir configuração de IA de exemplo
|
||||
INSERT INTO integracao_ia (provider, api_key_encriptada, modelo_padrao, ativo)
|
||||
VALUES
|
||||
('openai', 'sk-...', 'gpt-4', false),
|
||||
('claude', 'sk-ant-...', 'claude-3-opus', false)
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
-- Criar bucket para documentos
|
||||
INSERT INTO storage.buckets (id, name, public)
|
||||
VALUES ('documentos', 'documentos', true)
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- Permitir upload de arquivos (política pública para desenvolvimento)
|
||||
CREATE POLICY "Permitir upload público" ON storage.objects
|
||||
FOR INSERT WITH CHECK (bucket_id = 'documentos');
|
||||
|
||||
CREATE POLICY "Permitir leitura pública" ON storage.objects
|
||||
FOR SELECT USING (bucket_id = 'documentos');
|
||||
|
||||
CREATE POLICY "Permitir delete público" ON storage.objects
|
||||
FOR DELETE USING (bucket_id = 'documentos');
|
||||
|
||||
CREATE POLICY "Permitir update público" ON storage.objects
|
||||
FOR UPDATE USING (bucket_id = 'documentos');
|
||||
-- Criar bucket para documentos
|
||||
INSERT INTO storage.buckets (id, name, public)
|
||||
VALUES ('documentos', 'documentos', true)
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- Permitir upload de arquivos (política pública para desenvolvimento)
|
||||
CREATE POLICY "Permitir upload público" ON storage.objects
|
||||
FOR INSERT WITH CHECK (bucket_id = 'documentos');
|
||||
|
||||
CREATE POLICY "Permitir leitura pública" ON storage.objects
|
||||
FOR SELECT USING (bucket_id = 'documentos');
|
||||
|
||||
CREATE POLICY "Permitir delete público" ON storage.objects
|
||||
FOR DELETE USING (bucket_id = 'documentos');
|
||||
|
||||
CREATE POLICY "Permitir update público" ON storage.objects
|
||||
FOR UPDATE USING (bucket_id = 'documentos');
|
||||
|
||||
Reference in New Issue
Block a user