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;