sistemas:suap:almoxarifado:atualizaestoque

Atualização de estoque real do almoxarifado (Resolução de problema com transferência de material entre uos)

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);

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;
  • sistemas/suap/almoxarifado/atualizaestoque.txt
  • Última modificação: 2021/08/25 10:33
  • (edição externa)