441 lines
14 KiB
SQL
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 $$;
|