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.
| Coluna | Precisão | Null | Default | Descrição |
|---|---|---|---|---|
| REGRA_CLSABC | NUMBER(1) | NOT NULL | 0 | Regra para Classificação ABC (Regra ABC) |
| REGRA_CLSXYZ | NUMBER(1) | NOT NULL | 0 | Regra para Classificação XYZ (Regra XYZ) |
Domínios:
| Coluna | Valor | Descrição |
|---|---|---|
| REGRA_CLSABC | 0 | Não Usa |
| REGRA_CLSABC | 1 | Custo x Quantidade |
| REGRA_CLSABC | 2 | Número de Vendas |
| REGRA_CLSXYZ | 0 | Não Usa |
| REGRA_CLSXYZ | 1 | Custo x Quantidade |
| REGRA_CLSXYZ | 2 | Nú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.
| Coluna | Precisão | Null | Default | Descrição |
|---|---|---|---|---|
| PER_A | NUMBER(4,2) | NOT NULL | 10 | Participação de A na Classificação ABC (% A no ABC) |
| PER_B | NUMBER(4,2) | NOT NULL | 20 | Participação de B na Classificação ABC (% B no ABC) |
| PER_C | NUMBER(4,2) | NOT NULL | 70 | Participação de C na Classificação ABC (% C no ABC) |
| PER_X | NUMBER(4,2) | NOT NULL | 10 | Participação de X na Classificação XYZ (% X no ABC) |
| PER_Y | NUMBER(4,2) | NOT NULL | 20 | Participação de Y na Classificação XYZ (% Y no ABC) |
| PER_Z | NUMBER(4,2) | NOT NULL | 70 | Participaçã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.
| Coluna | Precisão | Null | Default | Descrição |
|---|---|---|---|---|
| DIAS_ABC_XYZ | NUMBER(3) | NOT NULL | 30 | Nú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.
| Coluna | Precisão | Null | Default | Descrição |
|---|---|---|---|---|
| DIAS_NUMVEN | DATE | NULL | -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.
| Coluna | Precisão | Null | Default | Descrição |
|---|---|---|---|---|
| CLSABC | NUMBER(5) | NOT NULL | 1 | ABC |
Domínios:
| Coluna | Valor | Descrição |
|---|---|---|
| CLSABC | 0 | A |
| CLSABC | 1 | B |
| CLSABC | 2 | C |
Na TT_GRA, criar coluna conforme especificado na tabela abaixo.
| Coluna | Precisão | Null | Default | Descrição |
|---|---|---|---|---|
| GRAABC | VARCHAR(1) | NULL | -X- | ABC Calculado |
| GRAXYZ | VARCHAR(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.
| Coluna | Precisão | Null | Default | Descrição |
|---|---|---|---|---|
| NUMVEN | NUMBER(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.
| Coluna | Precisão | Null | Default | Descrição |
|---|---|---|---|---|
| ULTNUMVEN | DATE | NULL | -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.