Skip to content

Tag-icone-mini.png Análise

Análise
Projeto 1221
Data da Análise: 14/04/2014

Projeto ​

Requisito ​

Essa análise é referente ao requisito 7 do projeto de aderência da Casa Carneiro.

Para visualizar o requisito na íntegra acesse o sistema de projetos.

51-Tabela ABC XYZ, regra geral ¿ ABC pelo custo X quantidade vendida no período desejado (igual ao CMV). ¿ XYZ pelo número de vendas no período desejado (não é quantidade vendida, mas sim o número de vezes que o produto foi vendido). Criar permissão, configuração do tipo e cálculo.

Detalhamento ​

Será criado um processo agendado para que sistema tenha duas classificações automáticas de produtos no formato ABC (sumarização por grupos com percentual de participação).
Também será feito melhoramento na classificação manual para que se possa fazer um confronto da classificação manual com a gerada pelo sistema.

Para obter o indicador do número de vendas, precisaremos de um outro processo agendado que faça a contagem das vendas.

Escopo ​

Em PostgreSQL, depende do implantador agendar cron job para que processo rode diariamente.
Como uma das fórmulas depende de custo médio, fica a cargo do implantador colocar a chamada da rotina para depois da atualização do custo médio.

Cenário ​

Poderá ser utilizada por todos os clientes.

Configurar Regras ABC e XYZ ​

Config - Outros >>> Ambiente >>> Produto

Será necessário definir se a empresa usará classificação ABC e qual será a regra do cálculo.
O mesmo vale para classificação XYZ.

Criar Colunas para Regras de Classificação ABC e XYZ ​

Especificação para tarefa(s): 92942

Na TT_CFG, criar novas colunas conforme descrito nas tabelas abaixo.

ColunaPrecisãoNullDefaultDescrição
REGRA_CLSABCNUMBER(1)NOT NULL0Regra para Classificação ABC (Regra ABC)
REGRA_CLSXYZNUMBER(1)NOT NULL0Regra para Classificação XYZ (Regra XYZ)

Domínios:

ColunaValorDescrição
REGRA_CLSABC0Não Usa
REGRA_CLSABC1Custo x Quantidade
REGRA_CLSABC2Número de Vendas
REGRA_CLSXYZ0Não Usa
REGRA_CLSXYZ1Custo x Quantidade
REGRA_CLSXYZ2Número de Vendas

Criar check-constraints para garantir integridade dos domínios.

Criar Interface para Regras de Classificação ABC e XYZ ​

Especificação para tarefa(s): 92943

Criar nova guia "Classificação ABC e XYZ" para conter as configurações relacionadas a classificação ABC e XYZ.
Na guia "Classificação ABC e XYZ" criar interface para as novas colunas.

Configurar Proporções ABC e XYZ ​

Config - Outros >>> Ambiente >>> Produto

Na guia "Classificação ABC e XYZ" serão criadas interfaces para definir percentual de participação de cada grupo das classificações ABC e XYZ.
Ex.: A 10% B 20% C 70%.

Criar Colunas para Proporção ABC e XYZ ​

Especificação para tarefa(s): 92944

Na TT_CFG, criar novas colunas conforme descrito nas tabelas abaixo.

ColunaPrecisãoNullDefaultDescrição
PER_ANUMBER(4,2)NOT NULL10Participação de A na Classificação ABC (% A no ABC)
PER_BNUMBER(4,2)NOT NULL20Participação de B na Classificação ABC (% B no ABC)
PER_CNUMBER(4,2)NOT NULL70Participação de C na Classificação ABC (% C no ABC)
PER_XNUMBER(4,2)NOT NULL10Participação de X na Classificação XYZ (% X no ABC)
PER_YNUMBER(4,2)NOT NULL20Participação de Y na Classificação XYZ (% Y no ABC)
PER_ZNUMBER(4,2)NOT NULL70Participação de Z na Classificação XYZ (% Z no ABC)

Check-constraints:
Para cada coluna, obrigar valor >= 0.

Criar Interface para Regras de Proporção ABC e XYZ ​

Especificação para tarefa(s): 92945

Na guia "Classificação ABC e XYZ" criar interface para as novas colunas.
A soma de cada conjunto (ABC ou XYZ) deve dar sempre 100%.

Configurar Dias para Classificação ABC e XYZ ​

Config - Outros >>> Ambiente >>> Produto

É necessário definir quantos dias para trás sistema deve considerar para classificar os produtos.
Fazer de todo o histórico do cliente poderia ser muito demorado.

Criar Coluna para Configurar Dias para Classificação ABC e XYZ ​

Especificação para tarefa(s): 92946

Na TT_CFG, criar coluna conforme especificado na tabela abaixo.

ColunaPrecisãoNullDefaultDescrição
DIAS_ABC_XYZNUMBER(3)NOT NULL30Número de Dias que Serão Considerados nas Classificações ABC e XYZ (Dias ABC e XYZ)

Check-constraints:
Obrigar valor > 0.

Criar Interface para Dias para Classificação ABC e XYZ ​

Especificação para tarefa(s): 92947

Na guia "Classificação ABC e XYZ" criar interface para a coluna DIAS_ABC_XYZ.
Deve aceitar somente valores positivos.
Obrigar preenchimento quando tiver alguma regra [REGRA_CLSABC/REGRA_CLSXYZ > 0].

Configurar Dias para Número de Vendas ​

Config - Outros >>> Ambiente >>> Operação

É necessário definir a data inicial para começar a contagem do número de vendas.
Caso contrário, executar o processo inicial seria muito demorado.

Criar Coluna para Configurar Dias para Número de Vendas ​

Especificação para tarefa(s): 92948

Na TT_CFG, criar coluna conforme especificado na tabela abaixo.

ColunaPrecisãoNullDefaultDescrição
DIAS_NUMVENDATENULL-X-Número de Dias que Serão Considerados para Número de Vendas (Dias Núm Vendas)

Check-constraints:
Obrigar valor > 0 quando preenchido.

Criar Interface para Dias para Número de Vendas ​

Especificação para tarefa(s): 92949

Na guia "Outros" criar interface para a coluna CFG.DIAS_NUMVEN.
Obrigar preenchimento quando uma das regras de Classificação ABC/XYZ for por Número de Vendas [TT_CFG.REGRA_CLSABC = 2 ou TT_CFG>REGRA_CLSXYZ = 2].

Classificações ABC e XYZ Manuais ​

Backoffice - Menu >>> Produtos >>> Cadastro
Backoffice - Menu >>> Produtos >>> Manutenção

Atualmente já é possível definir a classificação XYZ manualmente na guia Complementos do cadastro de produtos (e também na manutenção).
Teremos também a classificação ABC de forma manual.
O objetivo é o usuário poder ter uma classificação dele para poder confrontar a classificação feita pelo sistema.

Criar Colunas para Classificação ABC e XYZ no Produto e Grade ​

Especificação para tarefa(s): 92950

Na TT_PRO, criar coluna conforme especificado nas tabelas abaixo.

ColunaPrecisãoNullDefaultDescrição
CLSABCNUMBER(5)NOT NULL1ABC

Domínios:

ColunaValorDescrição
CLSABC0A
CLSABC1B
CLSABC2C

Na TT_GRA, criar coluna conforme especificado na tabela abaixo.

ColunaPrecisãoNullDefaultDescrição
GRAABCVARCHAR(1)NULL-X-ABC Calculado
GRAXYZVARCHAR(1)NULL-X-XYZ Calculado

Cadastro da Classificação ABC Manual e Visualização das Classificação ABC e XYZ de Grade ​

Especificação para tarefa(s): 92951

Na guia complementos já existe o campo Classe XYZ. Devemos incluir também Classe ABC.
Será interface para a coluna TT_PRO.CLSABC.
Tratar default 1 "B" da mesma forma que o default da XYZ é "Y".

Incluir coluna também na manutenção de produtos.

Incluir colunas de classificação ABC e XYZ da grade na guia de grade de maneira readonly.
As colunas são TT_GRA.GRAABC e TT_GRA.GRAXYZ.

Mudança de Índice por Filial e Grade ​

Uma questão técnica e interna do sistema, porém necessária para que o processo funcione corretamente, é a mudança do índice i_fk_ive_gra_dathor_codfil que está considerando CODFIL após VEN_DATHOR.
Isso faz com que sistema não leve em consideração filial no índice ao filtrar itens de venda pela grade.

Definição do índice em PostgreSQL: "i_fk_ive_gra_dathor_codfil" btree (filmat, codmat, codcor, codtam, ven_dathor, codfil)

Podemos ler ele da seguinte forma: Pega pela Grade -> Pega pela Data e Hora -> Pega da Filial

É praticamente irrelevante fazer distinção por filial após pegar os itens de venda por data e hora.

Esse índice não terá mais filial, então rotinas que filtrem itens de venda e data e hora poderão ser afetadas.
Embora, acreditamos que a mudança não afete o desempenho das rotinas atuais.

Mas o mais impactante será a criação do índice novo que terá a seguinte leitura: Pega pela Filial -> Pega pela Grade -> Pega para Data e Hora.

Esse sim, ao consultar filtrando ou relacionado por filial, grade e data e hora fará diferença.
No que antes ele pegava todas as filiais, passará a pegar apenas a filial do filtro.

Mudar Índice de Consulta dos Itens de Venda ​

Especificação para tarefa(s): 92952

Retirar CODFIL do índice "i_fk_ive_gra_dathor_codfil".
Com isso, seu nome deve ser modificado também.

drop index i_fk_ive_gra_dathor_codfil;

create index i_fk_ive_gra_dathor on TT_IVE (filmat, codmat, codcor, codtam, ven_dathor) tablespace TOTALI_INDEX;

Criar um novo índice que se iniciará pelo CODFIL, conforme exemplo abaixo.

create index i_lc_fil_gra_dathor on TT_IVE (codfil, filmat, codmat, codcor, codtam, ven_dathor) tablespace TOTALI_INDEX;

Contar Número de Vendas ​

Uma das classificações ABC e XYZ será por Número de Vendas. Por isso, sistema precisará começar a guardar essa estatística. E isso será feito através da execução de um processo agendado.
Sistema terá uma configuração de número de dias [CFG.DIAS_NUMVEN] para o processamento inicial, e um possível reprocessamento, não faça a contagem desde os primeiros movimentos da base. Com o processo ocorrendo diariamente, a data do último processamento será armazenada por filial [TD_FIL.ULTNUMVEN].

Sistema somente levará em consideração as vendas e cancelamentos.
Outros tipos de nota como Remessa, Devolução, Bonificação, Transferência não serão consideradas no indicador.

Criar Coluna para Número de Vendas ​

Especificação para tarefa(s): 92953

Na tabela TR_MOV, criar coluna para armazenar o número de vendas de um produto na tabela de resumo diário.
Será utilizada em uma das regras de classificação.

ColunaPrecisãoNullDefaultDescrição
NUMVENNUMBER(9)NULL-X-Número de Documentos Fiscais Emitidos de Saída com o Produto (Número de Vendas)

Criar Coluna para Última Contagem do Número de Vendas ​

Especificação para tarefa(s): 92954

Na TD_FIL, criar coluna para armazenar quando foi o último processo da contagem de número de vendas para aquela filial.

ColunaPrecisãoNullDefaultDescrição
ULTNUMVENDATENULL-X-Data da Última Contagem do Número de Vendas (Último Núm Vendas)

Criar Job para Contar Número de Vendas ​

Especificação para tarefa(s): 92955

Deve-se criar um job de banco para efetuar a contagem das vendas.
Primeiro deve-se descobrir quais são os dias que estão pendentes de processamento.
Função deve considerar os dias a partir do último processamento [TD_FIL.ULTNUMVEN+1].
Caso não tenha um último processamento, deve considerar um número de dias para trás a partir de hoje conforme configuração [TT_CFG.DIAS_NUMVEN].

select trunc(ven_dathor) as data from tt_ive ive where ive.datinc >= to_date('01/02/2014','dd/mm/yyyy') and ive.datinc <= to_date('05/02/2014','dd/mm/yyyy') and ive.sitmov = 'N' union select trunc(ven.dathor) as data from tt_ven ven where ven.atu_em >= to_date('01/02/2014','dd/mm/yyyy') and ven.atu_em <= to_date('05/02/2014','dd/mm/yyyy') and ven.flgest = 'C'

Depois, deve-se fazer o update contando o número de vendas que tiveram o produto.
Atenção para os detalhes no update abaixo que está bem consistente.

update tr_mov mov set numven = (select count( distinct ive.sequen ) from tt_ive ive inner join tt_ven ven on ven.codfil = ive.codfil and ven.sequen = ive.sequen where ive.ven_dathor >= mov.datmov and ive.ven_dathor <= Add_day(mov.datmov,1) and ive.codfil = mov.codfil and ive.filmat = mov.filmat and ive.codmat = mov.codmat and ive.codcor = mov.codcor and ive.codtam = mov.codtam and ive.lanest in ('S','R') and ive.sitkit in ('2','3') and ive.sitmov = 'N' and ven.lanven = 'T' and ven.numnot not like '%#%' ) where mov.codfil = <FILIAL> and mov.codmul = 0 and mov.datmov = <DATA> and coalesce(mov.qtdven,0) <> 0

Toda a contagem deve ficar no sub-estoque padrão (mesmo conceito do Custo Médio) [TR_MOV.CODMUL=0].
Só considerar vendas [TT_VEN.LANVEN="T"].
Só considerar notas e faturas [TT_IVE.LANEST in "S","R"].
O count-distinct no select serve para desconsiderar itens repetidos em nota. Ou seja, uma nota com com duas ocorrências do produto deve somar apenas 1 venda.

Função AtualizaMov recria toda a TR_MOV de uma determinada grade.
Ao fazer isso, é necessário recontar as vendas utilizando a configuração do número de dias [TT_CFG.DIAS_NUMVEN].
Reprocessar até a última data processada para cada filial [TD_FIL.ULTNUMVEN], de maneira que não precise atualizar a TD_FIL.
Mas se não houver ULTNUMVEN então será necessário processar até hoje e atualizar.

Recomenda-se que na função AtualizaMov a mesma função que será chamada pelo job seja executada para recalcular o número de vendas.
Porém o update não será o mesmo. Ele precisará de uma modificação no where para ao invés de considerar dia-a-dia ele pegue todas as TR_MOVs de um produto em uma determinada data.

Classificar ABC e XYZ ​

Quando existir uma regra de classificação ABC ou XYZ que seja diferente de "Manual", sistema deve executar seu cálculo através de um processo agendado.

Pela regra Custo x Quantidade, a classificação será a multiplicação do custo médio fiscal pela quantidade vendida. Deve-se priorizar os produtos com menor custo que tenham mais venda.
A = Custo mais alto
B = Custo intermediário
C = Custo mais baixo

A outra regra é pelo Número de Vendas.
X = Mais vendido
Y = Intermediário
Z = Menos vendido

Criar Job para Classificação ABC e XYZ ​

Especificação para tarefa(s): 92964

Deve-se criar um job de banco para classificar os produtos de acordo com as regras de classificação ABC e XYZ.

Função deve levar em consideração:

  • Só classificar produtos ABC se a regra de classificação ABC for diferente de "Não Usa" [TT_CFG.REGRA_CLSABC>0].
  • Só classificar produtos XYZ se a regra de classificação XYZ for diferente de "Não Usa" [TT_CFG.REGRA_CLSXYZ>0].

O cálculo da curva ABC está exemplificado no arquivo em anexo.

\\ttadm\Anexos_PRJ\Casa Carneiro\Projeto Aderencia\004-Fase 4\51-Tabela ABC XYZ, regra geral\ABC.xlsx

De maneira geral, função precisará fazer um SUM para obter o total da regra que será utilizada na classificação.
Depois, deve percorrer todos os itens (os mesmos utilizados para obter o SUM) de maneira ordenada do maior para o menor.
E classificar de acordo com as participações definidas para cada grupo [TT_CFG.PER_A, PER_B, PER_C, PER_X, PER_Y e PER_Z].

A classificação deverá ser gravada por grade nas colunas TT_GRA.GRAABC e TT_GRA.GRAXYZ.

Regra Custo x Quantidade

Sistema deve levar em consideração a configuração de número de dias para classificação ABC e XYZ [TT_CFG.DIAS_ABC_XYZ] para filtrar os registros da TR_MOV.

Custo médio fiscal unitário: CUSTOMEDIO(MOV.CODFIL,MOV.FILMAT,MOV.CODMAT,MOV.CODCOR,MOV.CODTAM,3,MOV.DATMOV) (considerar apenas sub-estoque 0)

Quantidade vendida: TR_MOV.VENFIS (é necessário somar de todos os sub-estoques).

Regra Número de Vendas

Utilizar dado materializado na coluna TR_MOV.NUMVEN.
Na TR_MOV, filtrar apenas CODMUL=0, porque a coluna usa o conceito semelhante ao Custo Médio de não considerar sub-estoque.