115 lines
4.1 KiB
JavaScript
115 lines
4.1 KiB
JavaScript
import pkg from 'pg';
|
|
const { Client } = pkg;
|
|
|
|
const connectionString = 'postgres://supabase_admin:Xz0oyb6ArGYG5uAVTVwcvJxRrMuT7EIJ@10.0.2.6:5432/postgres';
|
|
|
|
async function main() {
|
|
const client = new Client({ connectionString });
|
|
try {
|
|
await client.connect();
|
|
console.log("Connected to Postgres successfully!");
|
|
|
|
// 1. Fix trigger function to have explicit search_path or schema qualification
|
|
const fixTriggerSQL = `
|
|
-- Criar função para verificar disponibilidade de peças no schema TS_ERP com search_path explícito
|
|
CREATE OR REPLACE FUNCTION "TS_ERP".verificar_disponibilidade_peca(
|
|
p_peca_id uuid,
|
|
p_quantidade_adicional numeric,
|
|
p_item_id uuid DEFAULT NULL
|
|
)
|
|
RETURNS boolean
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
SET search_path = 'TS_ERP', 'public'
|
|
AS $$
|
|
DECLARE
|
|
quantidade_total_peca numeric;
|
|
quantidade_ja_priorizada numeric;
|
|
quantidade_disponivel numeric;
|
|
BEGIN
|
|
SELECT quantidade INTO quantidade_total_peca
|
|
FROM "TS_ERP".pecas
|
|
WHERE id = p_peca_id;
|
|
|
|
IF quantidade_total_peca IS NULL THEN
|
|
RAISE EXCEPTION 'Peça não encontrada';
|
|
END IF;
|
|
|
|
SELECT COALESCE(SUM(quantidade_priorizada), 0) INTO quantidade_ja_priorizada
|
|
FROM "TS_ERP".itens_prioridade_fabricacao
|
|
WHERE peca_id = p_peca_id
|
|
AND (p_item_id IS NULL OR id != p_item_id);
|
|
|
|
quantidade_disponivel := quantidade_total_peca - quantidade_ja_priorizada;
|
|
|
|
IF p_quantidade_adicional > quantidade_disponivel THEN
|
|
RAISE EXCEPTION 'Quantidade solicitada (%) excede o disponível (%) para esta peça',
|
|
p_quantidade_adicional, quantidade_disponivel;
|
|
END IF;
|
|
|
|
RETURN true;
|
|
END;
|
|
$$;
|
|
|
|
-- Também criar no schema public por garantia se algum cliente chamar public.verificar_disponibilidade_peca
|
|
CREATE OR REPLACE FUNCTION public.verificar_disponibilidade_peca(
|
|
p_peca_id uuid,
|
|
p_quantidade_adicional numeric,
|
|
p_item_id uuid DEFAULT NULL
|
|
)
|
|
RETURNS boolean
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
SET search_path = 'TS_ERP', 'public'
|
|
AS $$
|
|
BEGIN
|
|
RETURN "TS_ERP".verificar_disponibilidade_peca(p_peca_id, p_quantidade_adicional, p_item_id);
|
|
END;
|
|
$$;
|
|
|
|
-- Atualizar trigger_validar_item_prioridade com SET search_path
|
|
CREATE OR REPLACE FUNCTION "TS_ERP".trigger_validar_item_prioridade()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
SET search_path = 'TS_ERP', 'public'
|
|
AS $$
|
|
BEGIN
|
|
IF TG_OP = 'INSERT' THEN
|
|
PERFORM "TS_ERP".verificar_disponibilidade_peca(NEW.peca_id, NEW.quantidade_priorizada);
|
|
RETURN NEW;
|
|
END IF;
|
|
|
|
IF TG_OP = 'UPDATE' THEN
|
|
PERFORM "TS_ERP".verificar_disponibilidade_peca(NEW.peca_id, NEW.quantidade_priorizada, NEW.id);
|
|
RETURN NEW;
|
|
END IF;
|
|
|
|
RETURN NULL;
|
|
END;
|
|
$$;
|
|
|
|
-- Garantir o trigger na tabela
|
|
DROP TRIGGER IF EXISTS trigger_validar_disponibilidade_item_prioridade ON "TS_ERP".itens_prioridade_fabricacao;
|
|
CREATE TRIGGER trigger_validar_disponibilidade_item_prioridade
|
|
BEFORE INSERT OR UPDATE ON "TS_ERP".itens_prioridade_fabricacao
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION "TS_ERP".trigger_validar_item_prioridade();
|
|
|
|
-- Reconfigurar permissões
|
|
GRANT EXECUTE ON FUNCTION "TS_ERP".verificar_disponibilidade_peca(uuid, numeric, uuid) TO anon, authenticated, service_role;
|
|
GRANT EXECUTE ON FUNCTION public.verificar_disponibilidade_peca(uuid, numeric, uuid) TO anon, authenticated, service_role;
|
|
`;
|
|
|
|
await client.query(fixTriggerSQL);
|
|
console.log("✅ Trigger e funções de verificação atualizadas com sucesso no banco de dados!");
|
|
|
|
} catch (err) {
|
|
console.error("❌ Erro ao conectar/executar no Postgres:", err);
|
|
} finally {
|
|
await client.end();
|
|
}
|
|
}
|
|
|
|
main();
|