-- --------------------------------------------------------- -- 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;