Skip to content

Tag-icone-mini.png Totali Backoffice

  1. Totali Commerce
  2. Totali Backoffice
  3. Produtos

O Totali Backoffice possui em sua base funções para cálculo e apresentação de custo médio que são utilizadas pelos módulos do sistema para exibir o mesmo. Estas funções são utilizadas por exemplo nos forms de Inventário, SPED, Sintegra e Histórico de Produtos. Este documento descreve de forma resumida como estas informações estão guardadas no banco de dados, bem como as operações matemáticas para o cálculo do custo médio.

Cálculo do Custo Médio ​

O cálculo do custo médio é baseado nas vendas (TT_VEN) e compras/nota complementar/importação (TT_COM + TT_VEN->TD_NAT.TIPNAT = 'I') de um determinado produto.

Não leva em conta lançamentos avulsos do produto (TT_LAN).

A fórmula utilizada está descrito abaixo. É feito um select com todas as vendas e compras/nota complementar/importação, ordenadas por data, de um determinado produto. E para cada linha se calcula:

Qtd em Estoque: Qtd em Estoque Anterior + Qtd Movimentada → Se for uma compra/importação

Valor do Estoque: Valor do Estoque Anterior + Valor Movimentado;

Custo Médio: Valor Estoque / Qtd Estoque → (Se for uma venda)

Valor do Estoque: Valor do Estoque Anterior + (Qtd Movimentada pela venda * Custo Médio)

Observações:

a) A cada nova linha são utilizados para o cálculo a Quantidade e Valor de Estoque da linha anterior.

b) O Custo Médio nunca pode ficar negativo visto que não é possível se ter um estoque negativo, caso em qualquer momento isto aconteça, o cálculo das linhas subsequentes ficará inconsistente.

c) Note pela fórmula que o valor de venda do produto em nada interfere no custo médio.

Exemplo de cálculo: Ver planilha Custo Médio.xls

d) Nota Complementar altera apenas o valor do custo médio a quantidade se mantém.

Select para validar Custo Médio ​

  • Custos relativos a notas de entradas será utilizado a fórmula para compra/nota complementar.
  • Custos relativos a notas de importação será utilizado a fórmula para importação.

Fórmula do Custo Médio Fiscal ​

  • Compras/Nota Complementar

cm_uni_calculado = Valor_item -- Valor do Item + custo_frete -- Valor Frete + valor_ipi + --Valor IPI + Valor_ICMS_calculado - valor_pis - valor_cofins

  • Importação

cm_uni_calculado = valor_item -- Valor Total NF + valor_ipi + Valor IPI + valor_seguro -- Valor do Seguro + valor_frete -- Valor do Frete + valor_II -- Valor II + valor_pis -- Valor PIS + valor_cofins -- Valor COFINS + valor_ant -- Anti Dumping + valor_adu -- Despesas Aduaneiras Tributáveis + valor_icms -- Valor de ICMS - valor_pis_cre -- Valor PIS Creditável - valor_cof_cre -- Valor COFINS Creditável

Fórmula do Custo Médio Gerencial ​

  • Compras/Nota Complementar

cmg_uni_calculado = Valor_item -- Valor do Item + custo_frete -- Valor Frete + valor_ipi -- Valor IPI + substituicao_item + Valor_retencao

  • Importação

cmg_uni_calculado = valor_item -- Valor Total NF + valor_ipi + Valor IPI + valor_seguro -- Valor do Seguro + valor_frete -- Valor do Frete + valor_II -- Valor II + valor_ant -- Anti Dumping + valor_adu -- Despesas Aduaneiras Tributáveis + valor_icms -- Valor de ICMS

Sub Formulas utilizadas ​

  • Compras/Nota Complementar

Valor_item = ((valor_liquido_compra-valor_sub_compra)*(total_item+valor_ipi)/Nvlz(valor_bruto_compra, 1))-valor_ipi

Se tipo_icms = 'Tributado' AND tributacao_na_venda = 'Substituído' AND retem_substituicao = 'T' Valor_ICMS_calculado = Valor_retencao Senão Valor_ICMS_calculado = substituicao_item + Valor_retencao - Se tributacao_na_venda <> 'Substituído' então VLRICM senão 0

Se substituido_federal='F' e isento_pis='F' então Se piscofins_no_ipi = 'T' valor_pis = ((pis/100)*(Valor_item+valor_ipi)) -- Valor PIS Senão
valor_pis = ((pis/100)*(Valor_item)) -- Valor PIS Senão valor_pis = 0

Select verificar valores de custo médio detalhados ​

\\ttadm\Docs\publico\Base de Conhecimento\backoffice\produtos\custo médio\Detalhamento_Custo_Medio.sql

Dicionário de Dados ​

TT_ACM ​

ColunaTipo e PrecisãoDescrição
ORD_CMNUMBER(10)Ordem para Cálculo
VLRAJUNUMBER(16,4)Valor do Ajuste (fiscal igual ao gerencial)
SAL_CMNUMBER(16,4)Quantidade em estoque do produto no instante do lançamento
TOT_CMNUMBER(16,4)Valor total de custo médio do produto no instante do lançamento
TOTCMGNUMBER(16,4)Valor total de custo gerencial do produto no instante do lançamento

ORD_CM serve somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem.

VLRAJU são os valores que afetarão o custo médio daquele dia. É equivalente às colunas VLR_CM e VLRCMG da TT_ICO.

QTD_CM está fixo 0 na rotina de cálculo.

O ajuste de CM é considerado no início do dia, antes dos demais movimentos.

TT_ICO ​

ColunaTipo e PrecisãoDescrição
ORD_CMNUMBER(10)Ordem para Cálculo
QTD_CMNUMBER(12,4)Quantidade movimentada
VLR_CMNUMBER(16,4)Custo fiscal do item da compra
VLRCMGNUMBER(16,4)Custo gerencial do item da compra
SAL_CMNUMBER(16,4)Quantidade em estoque do produto no instante da compra
TOT_CMNUMBER(16,4)Valor total de custo médio do produto no instante da compra
TOTCMGNUMBER(16,4)Valor total de custo gerencial do produto no instante da compra

ORD_CM serve somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem.

QTD_CM é obtido pelo QTDMOV na trigger.

VLR_CM, VLRCMG e QTD_CM são os custos da compra/nota complementar que serão considerados nos cálculos.

TT_LAN ​

ColunaTipo e PrecisãoDescrição
ORD_CMNUMBER(10)Ordem para Cálculo
QTD_CMNUMBER(12,4)Quantidade movimentada
SAL_CMNUMBER(16,4)Quantidade em estoque do produto no instante do lançamento
TOT_CMNUMBER(16,4)Valor total de custo médio do produto no instante do lançamento
TOTCMGNUMBER(16,4)Valor total de custo gerencial do produto no instante do lançamento

ORD_CM serve somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem.

QTD_CM é obtido pelo QTDMOV na trigger.

TT_IVE ​

ColunaTipo e PrecisãoDescrição
ORD_CMNUMBER(10)Ordem para Cálculo
QTD_CMNUMBER(12,4)Quantidade movimentada
VLR_CMNUMBER(16,4)Custo fiscal do item na compra "importação"
VLRCMGNUMBER(16,4)Custo gerencial do item da compra "importação"
SAL_CMNUMBER(16,4)Quantidade em estoque do produto no instante da venda
TOT_CMNUMBER(16,4)Valor total de custo médio do produto no instante da venda
TOTCMGNUMBER(16,4)Valor total de custo gerencial do produto no instante da venda

ORD_CM serve somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem.

QTD_CM é obtido pelo QTDMOV na trigger.

VLR_CM, VLRCMG e QTD_CM são os custos da importação que serão considerados nos cálculos.

TR_MOV ​

ColunaTipo e PrecisãoDescrição
SAL_CMNUMBER(16,4)Quantidade em estoque no fim do dia
VLR_CMNUMBER(16,4)Valor do estoque fiscal no fim do dia
VLRCMGNUMBER(16,4)Valor do estoque gerencial no fim do dia

Não é guardado o custo médio unitário, mas para obtê-lo basta dividir o valor pela quantidade.

TT_SAL ​

ColunaTipo e PrecisãoDescrição
CAL_CMDATEAté quando custo médio está calculado
ATU_CMVARCHAR(1)Indica se existe ou não necessidade do cálculo ["T" ou "F"]
INI_CMDATEData inicial para cálculo do custo médio (data anterior a primeira compra)
QTD_CMNUMBER(14,2)Quantidade em estoque inicial
VLR_CMNUMBER(16,4)Valor do estoque fiscal inicial
VLRCMGNUMBER(16,4)Valor do estoque gerencial inicial
EST_CMNUMBER(14,2)Quantidade em estoque atual
TOT_CMNUMBER(16,4)Valor do estoque fiscal atual
TOTCMGNUMBER(16,4)Valor do estoque gerencial atual

CAL_CM é utilizado para continuar o cálculo sem necessitar recalcular tudo novamente.Lembrando que o custo médio não é calculado logo após uma compra ou uma venda pois isto iria tornar este processo demorado.

Os campos QTD_CM, VLR_CM e VLRCMG são para registrar um custo médio inicial para clientes que não tem como resgatar o seu estoque desde o inicio de suas atividades.

Neste caso o sistema começará o cálculo a partir desta data e levando em conta estes valores iniciais.

Funções de Banco Envolvidas ​

CalculaCustoMedio:

CalculaCustoMedio(pCODFIL, pFILMAT, pCODMAT, pCODCOR, pCODTAM)

Calcula o custo médio de um determinado produto. O custo médio é calculado a partir da maior date entre CAL_CM (Data até a qual já foi calculado) ou INI_CM (Data inicial para calcular o Custo Médio). Para cada lançamento grava a ordem que o mesmo foi processado(ORD_CM), para reordenação posterior. A cada dia é gravado na TR_MOV o VLR_CM e QTD_CM para futuras consultas do custo médio. No final do processo é gravado em CAL_CM a data da ultima movimentação calculada.

CalculaCustoMedioFilial:

CalculaCustoMedioFilial(pCODFIL)

Calcula o custo médio de toda uma filial. Utiliza os mesmos processos da CalculaCustoMedio

CustoMedio:

CustoMedio (p_CodFil, p_FilMat, p_CodMat , p_CodCor, p_CodTam, p_Tipo, p_DatRef)

Retorna informaçoes de custo médio de um produto em determinada data e acordo com o tipo passado: Se Tipo=1 -> Retorna Quantidade em estoque Se Tipo=2 -> Valor Total do Estoque (Padrão) Se Tipo=3 -> Custo Médio do Produto Se não for passada uma data calcula até a data atual.

JOB_Recalcula_Custo_Medio:

CREATE OR REPLACE PROCEDURE ProcCalculaCustoMedio IS vCODFIL TD_FIL.CODFIL%TYPE; cTemp VARCHAR(20); CURSOR Filiais IS SELECT vCODFIL FROM TD_FIL; BEGIN OPEN Filiais; LOOP FETCH Filiais INTO vCODFIL; EXIT WHEN Filiais%NOTFOUND; cTemp:=CalculaCustoMedioFilial(vCODFIL); END LOOP;
CLOSE Filiais; END ProcCalculaCustoMedio; /

VARIABLE JOBNO NUMBER; BEGIN DBMS_JOB.SUBMIT(:JOBNO ,'ProcCalculaCustoMedio;' ,SYSDATE ,'trunc(SYSDATE) + 23/24' ); END; /

Recalcular Custo Médio ​

O custo médio só é materializado nas tabelas por causa do custo-banco de se calcular o custo progressivamente desde a data inicial até o momento de determinada operação ou resumo. Mas se modificarmos a função, teremos que recalcular os valores que estão materializados para que fiquem condizentes com a mudança da função. Abaixo estão alguns exemplos de como fazer isso.

Para recalcular o custo dos últimos dois meses podemos marcar na tabela de saldo que o custo médio está calculado até 2 meses atrás.

UPDATE tt_sal SET cal_cm = add_day(Trunc(Agora()),-60), atu_cm = 'F' WHERE codmul = 0 AND cal_cm >= add_day(Trunc(Agora()),-60)

Nos clientes, o JOB_CALCULACUSTOMEDIOFILIAL está agendado para rodar todas as noites. Ele fará o recalculo para nós.

Mas se quisermos o resultado na hora, podemos chamar a função CalculaCustoMedioFilial para cada filial.

DECLARE vCODFIL TD_FIL.CODFIL%TYPE; cTemp VARCHAR(20); CURSOR Filiais IS SELECT vCODFIL FROM TD_FIL; BEGIN OPEN Filiais; LOOP FETCH Filiais INTO vCODFIL; EXIT WHEN Filiais%NOTFOUND; cTemp:=CalculaCustoMedioFilial(vCODFIL); END LOOP;
CLOSE Filiais; END; /

Referenciado por: Produtos |