====== Atualização de estoque real do almoxarifado (Resolução de problema com transferência de material entre uos) ======
===== Function de atualização de estoque =====
Devido a solicitação do ticket #107064 de 31/08/2016 e do kanboard almoxarifado 270 foi necessário um ajuste no sistema de solicitação e histórico de materiais do almoxarifado
Este bug sobrescrevia os valores das quantidades dos materiais em estoque. Com isto os valores que já foram movimentados devem ser novamente revisados devidos aos antigos valores terem sido erroneamente inseridos.
A função do Postgresql abaixo recebe como parâmetro os materiais (código) e a uo, com isto, a função analisa o histórico de movimentação de entrada e de saída, e faz um comparativo para verificar o que há no estoque atualmente na uo que foi passada como parâmetro. Este procedimento é necessário ser realizado apenas uma vez, para ajustar os valores, com a alteração realizada recentemente, o sistema irá preencher corretamente o estoque
CREATE OR REPLACE FUNCTION atualiza_estoque(
material integer,
uo integer)
RETURNS integer AS
$BODY$
DECLARE
total_entrada integer;
total_saida integer;
estoque_real integer;
BEGIN
total_entrada = 0;
total_saida = 0;
estoque_real = 0;
select sum(qtd) as estoque_entrada
from movimentoalmoxentrada
where material_id = $1
and uo_id = $2 into total_entrada;
select sum(qtd) as estoque_entrada
from movimentoalmoxsaida
where material_id = $1
and uo_id = $2 into total_saida;
update almoxarifado_materialestoque
set quantidade = total_entrada - total_saida
where material_id = $1
and uo_id = $2;
-- se tudo deu certo, retornar o valor do estoque real
select quantidade
from almoxarifado_materialestoque
where material_id = $1
and uo_id = $2 into estoque_real;
return estoque_real;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Para usar (por exemplo, atualizar o estoque do material 13951 (BOBINA) que está no campus Cedro.
select atualiza_estoque(13951,26);
===== Function de consulta de estoque =====
Segue uma function para verificar, pelo id do material, se o cálculo do movimento de entradas e saídas do histórico está de acordo com o valor da tabela de estoque (almoxarifado_materialestoque)
CREATE OR REPLACE FUNCTION ver_estoque_material(mat integer)
RETURNS TABLE (
id_uo INT,
id_material INT,
material_nome text,
uo_nome VARCHAR(255),
entradas_somatorio bigint,
saidas_somatorio bigint,
estoque_calculo bigint,
estoque_no_banco INT
)
AS $$
BEGIN
RETURN QUERY
select
am.uo_id,
am.material_id,
mc.nome,
uo.nome,
mov_e.somatorio_entradas,
mov_s.somatorio_saidas,
coalesce(mov_e.somatorio_entradas,null,0) - coalesce(mov_s.somatorio_saidas,null,0) as estoque_calculado,
am.quantidade as estoque_tabela
from almoxarifado_materialestoque am left join (select sum(qtd) as somatorio_entradas, uo_id
from movimentoalmoxentrada
where material_id = $1
group by uo_id) as mov_e
ON am.uo_id = mov_e.uo_id
left join (select sum(qtd) somatorio_saidas, uo_id
from movimentoalmoxsaida
where material_id = $1
group by uo_id) mov_s
ON am.uo_id = mov_s.uo_id,
materialconsumo mc,
unidadeorganizacional uo
where am.material_id = mc.id
and am.uo_id = uo.id
and am.material_id = $1
group by am.material_id,
am.uo_id,
mc.nome,
uo.nome ,
mov_e.somatorio_entradas,
mov_s.somatorio_saidas,
am.quantidade
order by am.uo_id;
END;
$$
LANGUAGE plpgsql VOLATILE
COST 100;
Uso:
select * from ver_estoque_material(13951);
Para consulta de estoque de um único bem
Consultar o estoque de um material
select * from almoxarifado_materialestoque am where am.material_id = 20623;