Files
RDO/migrate_mockups_to_db.sql
2026-02-20 07:25:32 -03:00

441 lines
14 KiB
SQL

-- ============================================================================
-- MIGRAÇÃO DE MOCKUPS PARA DADOS REAIS - BALDON ENGEMETAL
-- ============================================================================
-- 0. Ajustes de Constraints (Enum) para suportar estados do Mockup
-- ============================================================================
-- Adicionar 'pausada' e 'atrasada' ao check constraint de status da tabela tarefas
-- Nota: PostgreSQL não permite alterar constraints CHECK facilmente, precisamos dropar e recriar ou atualizar o tipo se for ENUM.
-- Aqui assumimos que é uma constraint de texto. Vamos tentar ajustar.
DO $$
BEGIN
-- Tenta remover a constraint existente (nome padrão gerado ou explícito se soubermos)
-- O nome costuma ser tarefas_status_check
ALTER TABLE public.tarefas DROP CONSTRAINT IF EXISTS tarefas_status_check;
-- Recria com os novos valores
ALTER TABLE public.tarefas ADD CONSTRAINT tarefas_status_check
CHECK (status IN ('pendente', 'em_andamento', 'pausada', 'concluida', 'cancelada', 'atrasada'));
-- Ajuste para prioridade (adicionar 'critica' se não existir, ou mapear 'critica' -> 'urgente')
-- O banco tem 'urgente'. O frontend usa 'critica'. Vamos permitir ambos para flexibilidade.
ALTER TABLE public.tarefas DROP CONSTRAINT IF EXISTS tarefas_prioridade_check;
ALTER TABLE public.tarefas ADD CONSTRAINT tarefas_prioridade_check
CHECK (prioridade IN ('baixa', 'media', 'alta', 'urgente', 'critica'));
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Não foi possível alterar constraints: %', SQLERRM;
END $$;
-- 0.1 Ajuste da Tabela Obras (Garantir colunas necessárias)
ALTER TABLE public.obras ADD COLUMN IF NOT EXISTS descricao TEXT;
ALTER TABLE public.obras ADD COLUMN IF NOT EXISTS endereco TEXT;
ALTER TABLE public.obras ADD COLUMN IF NOT EXISTS cliente VARCHAR(255);
ALTER TABLE public.obras ADD COLUMN IF NOT EXISTS valor_contrato NUMERIC(15,2);
ALTER TABLE public.obras ADD COLUMN IF NOT EXISTS data_inicio DATE;
ALTER TABLE public.obras ADD COLUMN IF NOT EXISTS data_prevista_fim DATE;
-- Garantir que progresso_geral existe (se não existir)
ALTER TABLE public.obras ADD COLUMN IF NOT EXISTS progresso_geral NUMERIC(5,2) DEFAULT 0;
-- Garantir que responsavel_id existe
ALTER TABLE public.obras ADD COLUMN IF NOT EXISTS responsavel_id UUID REFERENCES public.usuarios(id);
-- 0.2 Ajuste da Tabela Usuários (Garantir colunas para mock)
ALTER TABLE public.usuarios ADD COLUMN IF NOT EXISTS telefone VARCHAR(50);
ALTER TABLE public.usuarios ADD COLUMN IF NOT EXISTS cargo VARCHAR(100);
-- 0.3 Criação das Tabelas Principais (Tarefas e RDOs) se não existirem
CREATE TABLE IF NOT EXISTS public.tarefas (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
organizacao_id UUID REFERENCES public.organizacoes(id),
obra_id UUID REFERENCES public.obras(id) ON DELETE CASCADE,
titulo VARCHAR(255) NOT NULL,
descricao TEXT,
responsavel_id UUID REFERENCES public.usuarios(id),
prioridade VARCHAR(50) CHECK (prioridade IN ('baixa', 'media', 'alta', 'urgente', 'critica')),
status VARCHAR(50) CHECK (status IN ('pendente', 'em_andamento', 'pausada', 'concluida', 'cancelada', 'atrasada')),
data_inicio DATE,
data_fim DATE,
progresso NUMERIC(5,2) DEFAULT 0,
metadados JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS public.rdos (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
organizacao_id UUID REFERENCES public.organizacoes(id),
obra_id UUID REFERENCES public.obras(id) ON DELETE CASCADE,
numero INTEGER,
criado_por UUID REFERENCES public.usuarios(id),
data_relatorio DATE NOT NULL,
status VARCHAR(50) CHECK (status IN ('rascunho', 'enviado', 'aprovado', 'rejeitado')) DEFAULT 'rascunho',
condicoes_climaticas VARCHAR(100),
observacoes_gerais TEXT,
aprovado_por UUID REFERENCES public.usuarios(id),
aprovado_em TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Habilitar RLS para Tarefas e RDOs (Boas Práticas)
ALTER TABLE public.tarefas ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.rdos ENABLE ROW LEVEL SECURITY;
-- Políticas de acesso básicas (exemplo permissivo para garantir funcionamento inicial, ajuste conforme necessidade)
CREATE POLICY "Acesso Total Tarefas" ON public.tarefas FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Acesso Total RDOs" ON public.rdos FOR ALL USING (true) WITH CHECK (true);
-- 0.4 Ajuste da Tabela RDOs (Garantir colunas se tabela já existia)
ALTER TABLE public.rdos ADD COLUMN IF NOT EXISTS numero INTEGER;
ALTER TABLE public.rdos ADD COLUMN IF NOT EXISTS condicoes_climaticas VARCHAR(100);
ALTER TABLE public.rdos ADD COLUMN IF NOT EXISTS observacoes_gerais TEXT;
ALTER TABLE public.rdos ADD COLUMN IF NOT EXISTS aprovado_por UUID REFERENCES public.usuarios(id);
ALTER TABLE public.rdos ADD COLUMN IF NOT EXISTS aprovado_em TIMESTAMP WITH TIME ZONE;
ALTER TABLE public.rdos ADD COLUMN IF NOT EXISTS criado_por UUID REFERENCES public.usuarios(id);
ALTER TABLE public.rdos ADD COLUMN IF NOT EXISTS data_relatorio DATE;
ALTER TABLE public.rdos ADD COLUMN IF NOT EXISTS status VARCHAR(50) DEFAULT 'rascunho';
-- 1. Criação da Tabela de Inventário de Equipamentos (Ativos)
-- Esta tabela armazena os equipamentos físicos (patrimônio), diferente da tabela 'equipamentos' que é apenas para tipos.
CREATE TABLE IF NOT EXISTS public.inventario_equipamentos (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
organizacao_id UUID REFERENCES public.organizacoes(id) ON DELETE CASCADE,
nome VARCHAR(255) NOT NULL,
tipo VARCHAR(100),
modelo VARCHAR(100),
fabricante VARCHAR(100),
ano_fabricacao INTEGER,
numero_serie VARCHAR(100),
status VARCHAR(50) DEFAULT 'disponivel' CHECK (status IN ('disponivel', 'em_uso', 'manutencao', 'inativo')),
obra_atual_id UUID REFERENCES public.obras(id) ON DELETE SET NULL, -- Vincula à obra real
proxima_manutencao DATE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Habilitar RLS para a nova tabela
ALTER TABLE public.inventario_equipamentos ENABLE ROW LEVEL SECURITY;
-- Política de leitura (igual às outras tabelas)
DROP POLICY IF EXISTS "Leitura Inventario" ON public.inventario_equipamentos;
CREATE POLICY "Leitura Inventario" ON public.inventario_equipamentos
FOR SELECT USING (
auth.uid() IS NOT NULL
AND (
organizacao_id IN (SELECT organizacao_id FROM public.usuarios WHERE id = auth.uid())
OR auth.jwt()->>'email' = 'admtracksteel@gmail.com'
)
);
-- Política de escrita
DROP POLICY IF EXISTS "Escrita Inventario" ON public.inventario_equipamentos;
CREATE POLICY "Escrita Inventario" ON public.inventario_equipamentos
FOR ALL USING (
auth.uid() IS NOT NULL
AND (
organizacao_id IN (SELECT organizacao_id FROM public.usuarios WHERE id = auth.uid())
OR auth.jwt()->>'email' = 'admtracksteel@gmail.com'
)
);
-- 2. Bloco Anônimo para Inserção dos Dados
DO $$
DECLARE
v_org_id UUID;
v_user_id UUID;
v_obra_id UUID;
BEGIN
-- a) Obter ID da Organização 'Baldon Engemetal'
SELECT id INTO v_org_id FROM public.organizacoes WHERE slug = 'baldon-engemetal' LIMIT 1;
-- Se não existir, tenta criar (backup) ou pega a primeira disponível
IF v_org_id IS NULL THEN
RAISE NOTICE 'Organização Baldon Engemetal não encontrada. Usando a primeira organização disponível.';
SELECT id INTO v_org_id FROM public.organizacoes LIMIT 1;
END IF;
-- b) Obter um Usuário Real da Organização (ou o primeiro usuário do banco)
-- Tenta pegar um usuário vinculado à organização
SELECT id INTO v_user_id FROM public.usuarios WHERE organizacao_id = v_org_id LIMIT 1;
-- Se não achar, pega qualquer usuário (fallback)
IF v_user_id IS NULL THEN
SELECT id INTO v_user_id FROM auth.users LIMIT 1;
-- Se ainda assim for nulo (banco vazio), não tem como prosseguir com owner
END IF;
-- c) Inserir a Obra "Edifício Residencial Aurora"
INSERT INTO public.obras (
organizacao_id,
nome,
descricao,
endereco,
cliente,
responsavel_id,
data_inicio,
data_prevista_fim,
progresso_geral,
status,
valor_contrato
) VALUES (
v_org_id,
'Edifício Residencial Aurora',
'Edifício residencial de 15 andares com 120 apartamentos',
'Rua das Flores, 123 - Centro',
'Construtora ABC Ltda',
v_user_id, -- Usando usuário real como responsável
'2024-01-01',
'2024-12-31',
45.0,
'em_andamento',
2500000.00
)
RETURNING id INTO v_obra_id;
RAISE NOTICE 'Obra criada com ID: %', v_obra_id;
-- d) Inserir Tarefas (Vinculadas à Obra Aurora e ao Usuário Real)
-- Tarefa 1
INSERT INTO public.tarefas (
organizacao_id,
obra_id,
titulo,
descricao,
responsavel_id, -- Usuário real
prioridade,
status,
data_inicio,
data_fim, -- data_prazo no mock
progresso,
metadados
) VALUES (
v_org_id,
v_obra_id,
'Concretagem da Laje do 2º Pavimento',
'Executar a concretagem da laje do segundo pavimento conforme projeto estrutural',
v_user_id,
'alta',
'em_andamento',
'2024-01-15',
'2024-01-18',
65.0,
jsonb_build_object(
'categoria', 'Estrutura',
'localizacao', '2º Pavimento',
'tempo_estimado', 16,
'tempo_trabalhado', 10.5,
'anexos_count', 3,
'comentarios_count', 2
)
);
-- Tarefa 2
INSERT INTO public.tarefas (
organizacao_id,
obra_id,
titulo,
descricao,
responsavel_id,
prioridade,
status,
data_inicio,
data_fim,
progresso,
metadados
) VALUES (
v_org_id,
v_obra_id,
'Instalação Elétrica - Sala 201',
'Instalação completa do sistema elétrico da sala 201',
v_user_id,
'media',
'pendente',
'2024-01-20',
'2024-01-25',
0.0,
jsonb_build_object(
'categoria', 'Elétrica',
'localizacao', '2º Pavimento - Sala 201',
'tempo_estimado', 12
)
);
-- Tarefa 3
INSERT INTO public.tarefas (
organizacao_id,
obra_id,
titulo,
descricao,
responsavel_id,
prioridade,
status,
data_inicio,
data_fim,
progresso,
metadados
) VALUES (
v_org_id,
v_obra_id,
'Impermeabilização da Cobertura',
'Aplicação de manta asfáltica na cobertura do edifício',
v_user_id,
'critica',
'pausada',
'2024-01-12',
'2024-01-16',
30.0,
jsonb_build_object(
'categoria', 'Impermeabilização',
'localizacao', 'Cobertura',
'tempo_estimado', 24
)
);
-- Tarefa 4
INSERT INTO public.tarefas (
organizacao_id,
obra_id,
titulo,
descricao,
responsavel_id,
prioridade,
status,
data_inicio,
data_fim,
progresso,
metadados
) VALUES (
v_org_id,
v_obra_id,
'Pintura Externa - Fachada Norte',
'Aplicação de tinta acrílica na fachada norte do edifício',
v_user_id,
'baixa',
'pendente',
'2024-01-25',
'2024-02-05',
0.0,
jsonb_build_object(
'categoria', 'Acabamento',
'localizacao', 'Fachada Norte',
'tempo_estimado', 32
)
);
-- e) Inserir Inventário de Equipamentos
-- Betoneira (Em uso na obra Aurora)
INSERT INTO public.inventario_equipamentos (
organizacao_id,
nome,
tipo,
modelo,
fabricante,
ano_fabricacao,
numero_serie,
status,
obra_atual_id,
proxima_manutencao
) VALUES (
v_org_id,
'Betoneira 400L',
'Betoneira',
'BT-400',
'Menegotti',
2022,
'BT400-2022-001',
'em_uso',
v_obra_id, -- Vinculada à obra criada
'2024-03-01'
);
-- Guindaste (Disponível)
INSERT INTO public.inventario_equipamentos (
organizacao_id,
nome,
tipo,
modelo,
fabricante,
ano_fabricacao,
numero_serie,
status,
obra_atual_id,
proxima_manutencao
) VALUES (
v_org_id,
'Guindaste 20T',
'Guindaste',
'GR-20',
'Liebherr',
2021,
'GR20-2021-005',
'disponivel',
NULL, -- Sem obra atual
'2024-02-15'
);
-- f) Inserir RDOs (Histórico)
-- RDO 1 (Aprovado)
INSERT INTO public.rdos (
organizacao_id,
obra_id,
numero,
criado_por,
data_relatorio,
status,
condicoes_climaticas,
observacoes_gerais
) VALUES (
v_org_id,
v_obra_id,
1,
v_user_id,
'2024-01-15',
'aprovado',
'ensolarado',
'Dia produtivo, concretagem iniciada conforme planejado.'
);
-- RDO 2 (Aprovado)
INSERT INTO public.rdos (
organizacao_id,
obra_id,
numero,
criado_por,
data_relatorio,
status,
condicoes_climaticas,
observacoes_gerais
) VALUES (
v_org_id,
v_obra_id,
2,
v_user_id,
'2024-01-14',
'aprovado',
'parcialmente_nublado',
'Preparação para concretagem.'
);
-- RDO 3 (Enviado)
INSERT INTO public.rdos (
organizacao_id,
obra_id,
numero,
criado_por,
data_relatorio,
status,
condicoes_climaticas
) VALUES (
v_org_id,
v_obra_id,
3,
v_user_id,
'2024-01-13',
'enviado',
'chuva_leve'
);
END $$;