89 lines
3.4 KiB
PL/PgSQL
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;
|