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:
| Dia | Qtd Comprada | Qtd Vendida | Saldo Anterior | Dias do Saldo | Saldo Total | Soma Saldo Dias Anteriores |
| 30/set | 60 | 0 | 0 | 0 | 0 | Não |
| 01/out | 0 | 5 | 60 | 1 | 60 | Não |
| 02/out | 0 | 10 | 55 | 1 | 55 | Não |
| 03/out | 0 | 0 | 45 | 1 | 45 | Não |
| 04/out | 0 | 15 | 45 | 1 | 45 | Não |
| 07/out | 0 | 5 | 30 | 3 | 90 | Sim |
| 08/out | 0 | 10 | 25 | 1 | 25 | Não |
| 09/out | 0 | 5 | 15 | 1 | 15 | Não |
| 10/out | 0 | 10 | 10 | 1 | 10 | Não |
| 11/out | 0 | 0 | 0 | 1 | 0 | Nã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.

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.

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