Files
tracksteel_app/supabase/migrations/20250806114433_c18be927-6c64-456e-b09e-8e449dfa9121.sql

119 lines
3.8 KiB
PL/PgSQL

-- Corrigir lógica de empenhos e relacionamentos entre tabelas
-- Primeiro, corrigir a função trigger para atualizar estoque
CREATE OR REPLACE FUNCTION atualizar_estoque_movimentacao()
RETURNS TRIGGER AS $$
DECLARE
empenho_record RECORD;
new_empenho_id UUID;
BEGIN
-- Para movimentações do tipo empenho
IF NEW.tipo_movimentacao = 'empenho' THEN
-- Atualizar estoque
UPDATE estoque_materiais
SET quantidade_empenhada = quantidade_empenhada + NEW.quantidade,
quantidade_disponivel = quantidade_disponivel - NEW.quantidade
WHERE id = NEW.material_id;
-- Criar registro na tabela empenhos_material DEPOIS da movimentação ser criada
INSERT INTO empenhos_material (
material_id,
of_number,
quantidade_empenhada,
data_empenho,
lote,
observacoes,
created_by,
status,
movimentacao_empenho_id
) VALUES (
NEW.material_id,
NEW.of_vinculada,
NEW.quantidade,
NEW.data_movimentacao,
NEW.lote,
NEW.observacoes,
NEW.created_by,
'Empenhado',
NEW.id
) RETURNING id INTO new_empenho_id;
-- Para movimentações do tipo desempenho
ELSIF NEW.tipo_movimentacao = 'desempenho' THEN
UPDATE estoque_materiais
SET quantidade_empenhada = quantidade_empenhada - NEW.quantidade,
quantidade_disponivel = quantidade_disponivel + NEW.quantidade
WHERE id = NEW.material_id;
-- Buscar empenho mais antigo para atualizar
SELECT * INTO empenho_record
FROM empenhos_material
WHERE material_id = NEW.material_id
AND of_number = NEW.of_vinculada
AND status = 'Empenhado'
ORDER BY created_at ASC
LIMIT 1;
-- Atualizar empenho encontrado
IF FOUND THEN
UPDATE empenhos_material
SET quantidade_utilizada = quantidade_utilizada + NEW.quantidade,
status = CASE
WHEN quantidade_utilizada + NEW.quantidade >= quantidade_empenhada THEN 'Finalizado'
ELSE 'Empenhado'
END
WHERE id = empenho_record.id;
END IF;
-- Para entradas
ELSIF NEW.tipo_movimentacao = 'entrada' THEN
UPDATE estoque_materiais
SET quantidade_total = quantidade_total + NEW.quantidade,
quantidade_disponivel = quantidade_disponivel + NEW.quantidade
WHERE id = NEW.material_id;
-- Para saídas
ELSIF NEW.tipo_movimentacao = 'saida' THEN
UPDATE estoque_materiais
SET quantidade_total = quantidade_total - NEW.quantidade,
quantidade_disponivel = quantidade_disponivel - NEW.quantidade
WHERE id = NEW.material_id;
-- Para ajustes
ELSIF NEW.tipo_movimentacao = 'ajuste' THEN
UPDATE estoque_materiais
SET quantidade_total = quantidade_total + NEW.quantidade,
quantidade_disponivel = quantidade_disponivel + NEW.quantidade
WHERE id = NEW.material_id;
-- Para transferências
ELSIF NEW.tipo_movimentacao = 'transferencia' THEN
-- Apenas registra a movimentação, sem alterar quantidades
NULL;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Remover trigger antigo e criar novo para AFTER INSERT
DROP TRIGGER IF EXISTS trigger_atualizar_estoque_movimentacao ON movimentacoes_estoque;
CREATE TRIGGER trigger_atualizar_estoque_movimentacao
AFTER INSERT ON movimentacoes_estoque
FOR EACH ROW
EXECUTE FUNCTION atualizar_estoque_movimentacao();
-- Recalcular automaticamente quantidade_empenhada baseado na tabela empenhos
UPDATE estoque_materiais
SET quantidade_empenhada = COALESCE(
(SELECT SUM(quantidade_empenhada - quantidade_utilizada)
FROM empenhos_material
WHERE material_id = estoque_materiais.id
AND status IN ('Empenhado')),
0
);
-- Corrigir quantidade_disponivel baseado no total menos empenhado
UPDATE estoque_materiais
SET quantidade_disponivel = quantidade_total - quantidade_empenhada
WHERE quantidade_total >= quantidade_empenhada;