Files
tracksteel_app/supabase/migrations/20261007_create_revisoes.sql
T

89 lines
3.4 KiB
PL/PgSQL

-- ---------------------------------------------------------
-- TRACKSTEEL ERP: TABELA DE REVISÕES DE PEÇAS POR OF
-- ---------------------------------------------------------
CREATE TABLE IF NOT EXISTS public.revisoes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
of_number TEXT NOT NULL,
peca_id UUID NOT NULL REFERENCES public.pecas(id) ON DELETE CASCADE,
numero_revisao TEXT NOT NULL,
tipo_revisao TEXT NOT NULL CHECK (tipo_revisao IN ('simples', 'critica')),
descricao_motivo TEXT,
observacoes TEXT,
usuario_id TEXT,
usuario_nome TEXT,
usuario_email TEXT,
data_revisao TIMESTAMPTZ NOT NULL DEFAULT now(),
dados_anteriores JSONB NOT NULL DEFAULT '{}'::jsonb,
dados_novos JSONB NOT NULL DEFAULT '{}'::jsonb,
campos_alterados TEXT[] NOT NULL DEFAULT '{}',
afeta_apontamentos BOOLEAN NOT NULL DEFAULT false,
impacto_processos JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- Índices
CREATE INDEX IF NOT EXISTS idx_revisoes_of_number ON public.revisoes(of_number);
CREATE INDEX IF NOT EXISTS idx_revisoes_peca_id ON public.revisoes(peca_id);
CREATE INDEX IF NOT EXISTS idx_revisoes_data ON public.revisoes(data_revisao DESC);
CREATE INDEX IF NOT EXISTS idx_revisoes_tipo ON public.revisoes(tipo_revisao);
-- Colunas auxiliares na tabela pecas
ALTER TABLE public.pecas
ADD COLUMN IF NOT EXISTS revisao_atual TEXT DEFAULT 'Rev 00',
ADD COLUMN IF NOT EXISTS tem_revisao BOOLEAN DEFAULT false,
ADD COLUMN IF NOT EXISTS qtd_revisoes INTEGER DEFAULT 0;
-- Trigger para sincronizar campos de revisão na tabela pecas
CREATE OR REPLACE FUNCTION public.fn_sync_peca_revisoes()
RETURNS TRIGGER AS $$
DECLARE
v_peca_id UUID;
v_count INTEGER;
v_last_rev TEXT;
BEGIN
IF TG_OP = 'DELETE' THEN
v_peca_id := OLD.peca_id;
ELSE
v_peca_id := NEW.peca_id;
END IF;
SELECT count(*), COALESCE((SELECT numero_revisao FROM public.revisoes WHERE peca_id = v_peca_id ORDER BY data_revisao DESC, created_at DESC LIMIT 1), 'Rev 00')
INTO v_count, v_last_rev
FROM public.revisoes
WHERE peca_id = v_peca_id;
UPDATE public.pecas
SET tem_revisao = (v_count > 0),
qtd_revisoes = v_count,
revisao_atual = v_last_rev,
updated_at = now()
WHERE id = v_peca_id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_sync_peca_revisoes ON public.revisoes;
CREATE TRIGGER trg_sync_peca_revisoes
AFTER INSERT OR UPDATE OR DELETE ON public.revisoes
FOR EACH ROW EXECUTE FUNCTION public.fn_sync_peca_revisoes();
-- Políticas RLS
ALTER TABLE public.revisoes ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS "revisoes_select_policy" ON public.revisoes;
CREATE POLICY "revisoes_select_policy" ON public.revisoes FOR SELECT USING (true);
DROP POLICY IF EXISTS "revisoes_insert_policy" ON public.revisoes;
CREATE POLICY "revisoes_insert_policy" ON public.revisoes FOR INSERT WITH CHECK (true);
DROP POLICY IF EXISTS "revisoes_update_policy" ON public.revisoes;
CREATE POLICY "revisoes_update_policy" ON public.revisoes FOR UPDATE USING (true) WITH CHECK (true);
DROP POLICY IF EXISTS "revisoes_delete_policy" ON public.revisoes;
CREATE POLICY "revisoes_delete_policy" ON public.revisoes FOR DELETE USING (true);
GRANT ALL ON TABLE public.revisoes TO postgres, anon, authenticated, service_role;