Skip to content

Tag-icone-mini.png Análise

Análise
Projeto 1221
Data da Análise: 06/01/2014

Projeto ​

Nesse requisito do projeto de aderência da Casa Carneiro, o cliente espera ter os seguintes requisitos atendidos:

  • Criar configuração para definir giro por dias úteis em estoque.
  • Ter opção na sugestão para considerar ou não dias em promoção.
  • Calcular giro de estoque da sugestão de acordo com os 2 novos parâmetros (giro por dia úteis em estoque e excluir dias em promoção).

Especificação Técnica ​

Cálculo do Giro de Estoque Atual ​

Nesta seção vamos explicar como funciona o cálculo do giro de estoque estudando a função GiroEstoque e uma tabela com exemplo de cálculo.

Função GiroEstoque ​

O cálculo é feito através da função GiroEstoque. Ela é utilizada no select do form, e para ela são passados os parâmetros de data inicial e final, grade e filial.

%%<BEGINFUNCTION('GiroEstoque','number', ['p_DatIni','p_DatFim','p_FilMat','p_CodMat','p_CodCor','p_CodTam','p_CodFil'], ['Date','Date','TT_GRA.FILMAT%TYPE','TT_GRA.CODMAT%TYPE','TT_GRA.CODCOR%TYPE','TT_GRA.CODTAM%TYPE','TT_GRA.FILMAT%TYPE'], '')>%%

Select da TR_MOV é um UNION ALL com três selects. Ele é carregado em um cursor chamado "CR_MOVIMENTOS".

No primeiro, ele trás um registro vazio da TR_MOV com a data inicial do filtro somente se essa data não corresponder a nenhuma TR_MOV. Ele faz isso para poder contar o intervalo de dias.

SELECT p_DatIni AS DATMOV, NULL AS SALANT, NULL AS QTDVEN FROM DUAL WHERE p_DatIni < (SELECT MIN(DATMOV) FROM TR_MOV WHERE CODFIL = COALESCE(P_CODFIL,CODFIL) AND FILMAT = p_FilMat AND CODMAT = p_CodMat AND CODCOR = p_CodCor AND CODTAM = p_CodTam AND DATMOV BETWEEN p_DatIni AND p_DatFim)

No segundo, ele trás os registros da TR_MOV propriamente ditos.

SELECT DATMOV, COALESCE(SALANT,0) AS SALANT, COALESCE(QTDVEN,0) AS QTDVEN
FROM TR_MOV WHERE CODFIL = COALESCE(P_CODFIL,CODFIL) AND FILMAT = p_FilMat AND CODMAT = p_CodMat AND CODCOR = p_CodCor AND CODTAM = p_CodTam AND DATMOV BETWEEN p_DatIni AND p_DatFim

No terceiro, ele trás um registro fictício da TR_MOV com data 1 dia maior que a data final do filtro. Para esse registro, o select utiliza os dados do último registro e subtrai a quantidade vendida para ter o saldo no final do dia.

SELECT ADD_DAY(p_DatFim,1) AS DATMOV, COALESCE(MOV.SALANT,0)- COALESCE(MOV.VENFIS,0)- COALESCE(MOV.QTDVEN,0)+ COALESCE(MOV.QTDCOM,0)+ COALESCE(MOV.QTDOUT,0) AS SALANT, 0 AS QTDVEN FROM TR_MOV MOV, (SELECT MAX(DATMOV) AS DATMOV FROM TR_MOV WHERE CODFIL = COALESCE(P_CODFIL,CODFIL) AND FILMAT = p_FilMat AND CODMAT = p_CodMat AND CODCOR = p_CodCor AND CODTAM = p_CodTam AND DATMOV BETWEEN p_DatIni AND p_DatFim) DAT WHERE MOV.CODFIL = COALESCE(P_CODFIL,CODFIL) AND MOV.FILMAT = p_FilMat AND MOV.CODMAT = p_CodMat AND MOV.CODCOR = p_CodCor AND MOV.CODTAM = p_CodTam AND MOV.DATMOV = DAT.DATMOV

Depois a função começa a percorrer os registros do cursor. Para cada dia ele calcula o saldo do dia e a quantidade vendida total. Ele multiplica o saldo pelo intervalo de dia porque no caso de mais de um dia sem movimento, o giro deve considerar que a empresa tinha aquele estoque e não houve vendas no dia.

Por exemplo, se tem registro na TR_MOV de sexta e segunda, no da segunda ele vai multiplicar por 3. Por causa de sábado e domingo.

OPEN CR_MOVIMENTOS; LOOP FETCH CR_MOVIMENTOS INTO vDATMOV, vSALANT, vQTDVEN; EXIT WHEN %%<NOTFOUND('CR_MOVIMENTOS')>%%;
iINT_DIAS := COALESCE(IntervaloDias(vDATMOV, dDAT_ANTERIOR),0); IF iINT_DIAS > 0 THEN -- a partir do segundo registro do cursor fTOT_SALDIA := fTOT_SALDIA + (vSALANT * iINT_DIAS); fTOT_QTDVEN := fTOT_QTDVEN + vQTDVEN;
END IF; dDAT_ANTERIOR := vDATMOV; END LOOP; CLOSE CR_MOVIMENTOS;

A função termina com a aplicação da fórmula do giro:

QTD_GIRO := COALESCE(fTOT_QTDVEN * iTOT_DIAS / NVLZ(fTOT_SALDIA,NULL),0);

Depois a função termina com tratamentos para não ter valores que não fazem sentido para giro.

Tabela com Exemplo de Cálculo ​

Como exemplo de dados, podemos ter o seguinte:

DiaQtd CompradaQtd VendidaSaldo AnteriorDias do SaldoSaldo TotalSoma Saldo Dias Anteriores
30/set600000Não
01/out0560160Não
02/out01055155Não
03/out0045145Não
04/out01545145Não
07/out0530390Sim
08/out01025125Não
09/out0515115Não
10/out01010110Não
11/out00010Não

Qual o giro do dia 1 ao dia 10?

Total de Vendas: 60 Número de Dias: 10 Total de Estoque: 345

Giro = (Total de Vendas * (Número de Dias / Total de Estoque))

Giro: 1,73913

Configurações Necessárias ​

Configurar Dias Úteis ​

Será necessário configurar o horário de expediente da empresa e os feriados para que o sistema possa saber quais são os dias úteis no cálculo do giro.
Ver mais em Análise para Vendas por Dia Útil por Produto.

Configuração de Giro de Estoque ​

Será criada a nova configuração para definir se o giro de estoque será por dias corridos (modelo atual) ou será por dias úteis e com produto em estoque.

Paleta/Guia: Outros >>> Ambiente >>> Produto >>> Estoque Tabela: TT_CFG Coluna: GIRO_ESTOQUE

Promoção na Tabela de Resumo ​

Será tratado no sistema para quando o produto tiver venda em promoção, as triggers gravarem na TR_MOV que aquele dia foi promocional [TR_MOV.PROMOC="T"].

Tratamento na Função Giro de Estoque ​

Será tratado na função GiroEstoque a configuração que indica se o cálculo é por dia corrido ou por dia útil [TT_CFG.GIRO_ESTOQUE].
Se estiver "C", função vai continuar fazendo o que faz atualmente.
Se estiver com "A", sistema vai considerar os dias úteis com loja aberta e estoque.

Parâmetro do tipo: Essa configuração se será "C" ou "A" deve vir por parâmetro

Obter Dias Úteis: A função continuará baseada na TR_MOV. Isso independe de ser dia corrido ou útil. A diferença deve ficar nos dias que não possuem TR_MOV. Função trata com a função IntervaloDias o número de dias sem TR_MOV. Quando a configuração for "A", então função deve utilizar a função DiasUteis.

Saldo em Estoque: Quando for por loja aberta também deve ser filtrado somente dias com estoque. Obter essa informação somando o saldo anterior com o que foi comprado no próprio dia.

COALESCE(MOV.SALANT,0)+ COALESCE(MOV.QTDCOM,0)+ COALESCE(MOV.QTDOUT,0)

Promoção: Será criado um parâmetro na função para indicar se o giro é completo, fora da promoção ou dentro da promoção.

Excel promocoes.jpg

Variações de Cálculo ​

Desta forma, a função deverá calcular as seguintes formas de giro:

  • Considerando dias corridos.
  • Fora da promoção considerando dias corridos.
  • Considerando dias úteis com estoque.
  • Fora da promoção considerando dias úteis com estoque.

Na planilha em anexo, os casos podem ser melhor visualizados:

\\ttadm\Anexos_PRJ\Casa Carneiro\Projeto Aderencia\Sugestão\Giro na Promoção.xlsx

Tela de Sugestão de Compra ​

Filtro de Giro de Estoque ​

Será criado novo filtro na tela de Sugestão de Compra para indicar se o giro é sobre todos os dias do movimento ou somente dias que não houve promoção. Esse filtro será passado para função de GiroEstoque como parâmetro.

Sugestao-compra-giro-estoque.PNG

Referenciado por: Análise para Vendas por Dia Útil por Produto |