Mudanças entre as edições de "Custo Médio"

De TotaliWiki
Ir para: navegação, pesquisa
 
(64 revisões intermediárias por 6 usuários não estão sendo mostradas)
Linha 1: Linha 1:
O Totall 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.
+
{{Tags|Totall Backoffice}}
Estas funções são utilizadas por exemplo nos forms de Inventário, Sintegra e Histórico de Produtos.
+
{{MenuLateral|[[Totall Commerce]]|[[Totall Backoffice]]|[[Produtos]]}}
 +
O Totall 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.
 
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.
  
1. 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 (TT_COM) de um determinado produto.
+
  
Não leva em conta lançamentos avulsos do produto(TT_LAN).
+
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.
A formula utilizada é a seguinte:
+
ÿ feito um select com todas as vendas e compras, ordenadas por data, de um determinado produto.
+
Para cada linha se calcula:
+
  
Qtd em Estoque = Qtd em Estoque Anterior + Qtd Movimentada
+
Não leva em conta lançamentos avulsos do produto (TT_LAN).
Se for uma compra
+
 
Valor do Estoque = Valor do Estoque Anterior  + Valor Movimentado;
+
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:
Custo Médio := Valor Estoque / Qtd Estoque  
+
 
Se for uma venda
+
'''Qtd em Estoque''': Qtd em Estoque Anterior + Qtd Movimentada → ''Se for uma compra/importação''
Valor do Estoque = Valor do Estoque Anterior  + (Qtd Movimentada pela venda * Custo Médio)
+
 
 +
'''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:'''
 
'''Observações:'''
  
 
a) A cada nova linha são utilizados para o cálculo a Quantidade e Valor de Estoque da linha anterior.
 
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 calculo das linhas subseqüente ficará inconsistente.
 
c) Note pela fórmula que o valor de venda do produto em nada interfere no custo médio.
 
  
 +
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:
 
Exemplo de cálculo:
Ver planilha Custo Médio.xls
+
Ver planilha [svn://ttpg9/totalldocumentos/base_conhecimento/backoffice/produtos/custo%20médio/Custo%20Medio.xls 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.
  
2. Representação física no banco
+
== Fórmula do Custo Médio Fiscal ==
TT_ICO
+
* Compras/Nota Complementar
QTD_CM  - Guarda a quantidade movimentada a ser utilizada no cálculo
+
  cm_uni_calculado = Valor_item -- Valor do Item
VLR_CM  - Guarda o valor movimentado a ser utilizada no cálculo
+
      + custo_frete -- Valor Frete
ORD_CM  - Ordenação utilizada no cálculo do custo médio (somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem)
+
      + 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
  
TT_IVE
+
== Fórmula do Custo Médio Gerencial ==
QTD_CM - Idem ao TT_ICO
+
* Compras/Nota Complementar
VLR_CM - Idem ao TT_ICO
+
    cmg_uni_calculado =    Valor_item -- Valor do Item
ORD_CM  - Idem ao TT_ICO
+
    + 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
  
TR_MOV
+
== Sub Formulas utilizadas ==
SAL_CM ? Guarda o saldo (Qtd) de estoque após a última movimentação do dia
+
* Compras/Nota Complementar
VLR_CM ? Guarda o valor de estoque após a última movimentação do dia
+
  Valor_item = ((valor_liquido_compra-valor_sub_compra)*(total_item+valor_ipi)/Nvlz(valor_bruto_compra, 1))-valor_ipi
Obs.: Não é guardado o custo médio, mas para obtê-lo basta dividir o valor pela quantidade
+
  
TT_SAL
+
  Se tipo_icms = 'Tributado' AND tributacao_na_venda = 'Substituído' AND retem_substituicao = 'T'
CAL_CM  - Data até a qual já foi calculado o custo médio, 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)
+
    Valor_ICMS_calculado = Valor_retencao
INI_CM ? Data inicial para se calcular o custo médio
+
  Senão
VLR_CM ? Valor em estoque na data de início do custo médio
+
  Valor_ICMS_calculado = substituicao_item
QTD_CM ? Quantidade em estoque na data de início do custo médio
+
    + Valor_retencao
 +
    - Se tributacao_na_venda <> 'Substituído' então VLRICM senão 0  
  
Obs.: Os 3 últimos campos 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.
+
  Se substituido_federal='F' e isento_pis='F' então
Neste caso o sistema começará o cálculo a partir desta data e levando em conta estes valores iniciais.
+
      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 ==
  
'''Funções de Banco Envolvidas:'''
+
{{LinkInterno|\\ttadm\Docs\publico\Base de Conhecimento\backoffice\produtos\custo médio\Detalhamento_Custo_Medio.sql}}
  
CalculaCustoMedio(pCODFIL,pFILMAT,pCODMAT,pCODCOR,pCODTAM)
+
== Dicionário de Dados ==
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(pCODFIL)
+
=== TT_ACM ===
Calcula o custo médio de toda uma filial.
+
{| class="wikitable"
Utiliza os mesmos processos da CalculaCustoMedio
+
|-
 +
! Coluna !! Tipo e Precisão !! Descrição
 +
|-
 +
| ORD_CM || NUMBER(10) || Ordem para Cálculo
 +
|-
 +
| VLRAJU || NUMBER(16,4) || Valor do Ajuste (fiscal igual ao gerencial)
 +
|-
 +
| SAL_CM || NUMBER(16,4) || Quantidade em estoque do produto no instante do lançamento
 +
|-
 +
| TOT_CM || NUMBER(16,4) || Valor total de custo médio do produto no instante do lançamento
 +
|-
 +
| TOTCMG || NUMBER(16,4) || Valor total de custo gerencial do produto no instante do lançamento
 +
|}
  
CustoMedio (p_CodFil, p_FilMat, p_CodMat , p_CodCor, p_CodTam, p_Tipo, p_DatRef)
+
:''ORD_CM serve somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem.''
Retorna informaçoes de custo médio de um produto em determinada data e acordo com o tipo passado:
+
:''VLRAJU são os valores que afetarão o custo médio daquele dia. É equivalente às colunas VLR_CM e VLRCMG da TT_ICO.''
Se Tipo=1 -> Retorna Quantidade em estoque
+
:''QTD_CM está fixo 0 na rotina de cálculo.''
Se Tipo=2 -> Valor Total do Estoque (Padrão)
+
:''O ajuste de CM é considerado no início do dia, antes dos demais movimentos.''
Se Tipo=3 -> Custo Médio do Produto
+
Se não for passada uma data calcula até a data atual.
+
  
----------------------------------------------------------------------
+
=== TT_ICO ===
 +
{| class="wikitable"
 +
|-
 +
! Coluna !! Tipo e Precisão !! Descrição
 +
|-
 +
| ORD_CM || NUMBER(10) || Ordem para Cálculo
 +
|-
 +
| QTD_CM || NUMBER(12,4) || Quantidade movimentada
 +
|-
 +
| VLR_CM || NUMBER(16,4) || Custo fiscal do item da compra
 +
|-
 +
| VLRCMG || NUMBER(16,4) || Custo gerencial do item da compra
 +
|-
 +
| SAL_CM || NUMBER(16,4) || Quantidade em estoque do produto no instante da compra
 +
|-
 +
| TOT_CM || NUMBER(16,4) || Valor total de custo médio do produto no instante da compra
 +
|-
 +
| TOTCMG || NUMBER(16,4) || Valor total de custo gerencial do produto no instante da compra
 +
|}
  
O Totall 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.
+
:''ORD_CM serve somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem.''
Estas funções são utilizadas por exemplo nos forms de Inventário, Sintegra e Histórico de Produtos.
+
:''QTD_CM é obtido pelo QTDMOV na trigger''.
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.
+
:''VLR_CM, VLRCMG e QTD_CM são os custos da compra/nota complementar que serão considerados nos cálculos.''
  
1. Cálculo do Custo Médio:
+
=== TT_LAN ===
O cálculo do custo médio é baseado nas vendas(TT_VEN) e compras (TT_COM) de um determinado produto.
+
{| class="wikitable"
Não leva em conta lançamentos avulsos do produto(TT_LAN).
+
|-
A formula utilizada é a seguinte:
+
! Coluna !! Tipo e Precisão !! Descrição
ÿ feito um select com todas as vendas e compras, ordenadas por data, de um determinado produto.
+
|-
Para cada linha se calcula:
+
| ORD_CM || NUMBER(10) || Ordem para Cálculo
 +
|-
 +
| QTD_CM || NUMBER(12,4) || Quantidade movimentada
 +
|-
 +
| SAL_CM || NUMBER(16,4) || Quantidade em estoque do produto no instante do lançamento
 +
|-
 +
| TOT_CM || NUMBER(16,4) || Valor total de custo médio do produto no instante do lançamento
 +
|-
 +
| TOTCMG || NUMBER(16,4) || Valor total de custo gerencial do produto no instante do lançamento
 +
|}
  
Qtd em Estoque = Qtd em Estoque Anterior + Qtd Movimentada
+
:''ORD_CM serve somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem.''
Se for uma compra
+
:''QTD_CM é obtido pelo QTDMOV na trigger''.
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:
+
=== TT_IVE ===
a) A cada nova linha são utilizados para o cálculo a Quantidade e Valor de Estoque da linha anterior.
+
{| class="wikitable"
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 calculo das linhas subseqüente ficará inconsistente.
+
|-
c) Note pela fórmula que o valor de venda do produto em nada interfere no custo médio.
+
! Coluna !! Tipo e Precisão !! Descrição
 +
|-
 +
| ORD_CM || NUMBER(10) || Ordem para Cálculo
 +
|-
 +
| QTD_CM || NUMBER(12,4) || Quantidade movimentada
 +
|-
 +
| VLR_CM || NUMBER(16,4) || Custo fiscal do item na compra "importação"
 +
|-
 +
| VLRCMG || NUMBER(16,4) || Custo gerencial do item da compra "importação"
 +
|-
 +
| SAL_CM || NUMBER(16,4) || Quantidade em estoque do produto no instante da venda
 +
|-
 +
| TOT_CM || NUMBER(16,4) || Valor total de custo médio do produto no instante da venda
 +
|-
 +
| TOTCMG || NUMBER(16,4) || Valor total de custo gerencial do produto no instante da venda
 +
|}
  
Exemplo de cálculo:
+
:''ORD_CM serve somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem.''
Ver planilha Custo Médio.xls
+
:''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 ===
 +
{| class="wikitable"
 +
|-
 +
! Coluna !! Tipo e Precisão !! Descrição
 +
|-
 +
| SAL_CM || NUMBER(16,4) || Quantidade em estoque no fim do dia
 +
|-
 +
| VLR_CM || NUMBER(16,4) || Valor do estoque fiscal no fim do dia
 +
|-
 +
| VLRCMG || NUMBER(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.''
  
2. Representação física no banco
+
=== TT_SAL ===
TT_ICO
+
{| class="wikitable"
QTD_CM  - Guarda a quantidade movimentada a ser utilizada no cálculo
+
|-
VLR_CM  - Guarda o valor movimentado a ser utilizada no cálculo
+
! Coluna !! Tipo e Precisão !! Descrição
ORD_CM  - Ordenação utilizada no cálculo do custo médio (somente para garantir que ao se verificar os itens em um mesmo dia sempre fiquem na mesma ordem)
+
|-
 +
| CAL_CM || DATE || Até quando custo médio está calculado
 +
|-
 +
| ATU_CM || VARCHAR(1) || Indica se existe ou não necessidade do cálculo ["T" ou "F"]
 +
|-
 +
| INI_CM || DATE || Data inicial para cálculo do custo médio (data anterior a primeira compra)
 +
|-
 +
| QTD_CM || NUMBER(14,2) || Quantidade em estoque inicial
 +
|-
 +
| VLR_CM || NUMBER(16,4) || Valor do estoque fiscal inicial
 +
|-
 +
| VLRCMG || NUMBER(16,4) || Valor do estoque gerencial inicial
 +
|-
 +
| EST_CM || NUMBER(14,2) || Quantidade em estoque atual
 +
|-
 +
| TOT_CM || NUMBER(16,4) || Valor do estoque fiscal atual
 +
|-
 +
| TOTCMG || NUMBER(16,4) || Valor do estoque gerencial atual
 +
|}
  
TT_IVE
+
:''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.''
QTD_CM - Idem ao TT_ICO
+
:''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.''
VLR_CM - Idem ao TT_ICO
+
:''Neste caso o sistema começará o cálculo a partir desta data e levando em conta estes valores iniciais.''
ORD_CM  - Idem ao TT_ICO
+
  
TR_MOV
+
== Funções de Banco Envolvidas ==
SAL_CM ? Guarda o saldo (Qtd) de estoque após a última movimentação do dia
+
VLR_CM ? Guarda o valor de estoque após a última movimentação do dia
+
Obs.: Não é guardado o custo médio, mas para obtê-lo basta dividir o valor pela quantidade
+
  
TT_SAL
+
'''CalculaCustoMedio:'''
CAL_CM  - Data até a qual já foi calculado o custo médio, 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)
+
<syntaxhighlight lang="SQL">
INI_CM ? Data inicial para se calcular o custo médio
+
CalculaCustoMedio(pCODFIL, pFILMAT, pCODMAT, pCODCOR, pCODTAM)
VLR_CM ? Valor em estoque na data de início do custo médio
+
</syntaxhighlight>
QTD_CM ? Quantidade em estoque na data de início do custo médio
+
Obs.:  Os 3 últimos campos 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(pCODFIL,pFILMAT,pCODMAT,pCODCOR,pCODTAM)
 
 
Calcula o custo médio de um determinado produto.
 
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).
 
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).
Linha 137: Linha 244:
 
No final do processo é gravado em CAL_CM a data da ultima movimentação calculada.
 
No final do processo é gravado em CAL_CM a data da ultima movimentação calculada.
  
 +
'''CalculaCustoMedioFilial:'''
 +
 +
<syntaxhighlight lang="SQL">
 
CalculaCustoMedioFilial(pCODFIL)
 
CalculaCustoMedioFilial(pCODFIL)
 +
</syntaxhighlight>
 +
 
Calcula o custo médio de toda uma filial.
 
Calcula o custo médio de toda uma filial.
 
Utiliza os mesmos processos da CalculaCustoMedio
 
Utiliza os mesmos processos da CalculaCustoMedio
  
 +
'''CustoMedio:'''
 +
 +
<syntaxhighlight lang="SQL">
 
CustoMedio (p_CodFil, p_FilMat, p_CodMat , p_CodCor, p_CodTam, p_Tipo, p_DatRef)
 
CustoMedio (p_CodFil, p_FilMat, p_CodMat , p_CodCor, p_CodTam, p_Tipo, p_DatRef)
 +
</syntaxhighlight>
 +
 
Retorna informaçoes de custo médio de um produto em determinada data e acordo com o tipo passado:
 
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=1 -> Retorna Quantidade em estoque
Linha 148: Linha 265:
 
Se não for passada uma data calcula até a data atual.
 
Se não for passada uma data calcula até a data atual.
  
'''JOB_Recalcula_Custo_Medio'''
+
'''JOB_Recalcula_Custo_Medio:'''
  
 +
<syntaxhighlight lang="SQL">
 
  CREATE OR REPLACE PROCEDURE ProcCalculaCustoMedio IS
 
  CREATE OR REPLACE PROCEDURE ProcCalculaCustoMedio IS
 
 
  vCODFIL TD_FIL.CODFIL%TYPE;
 
  vCODFIL TD_FIL.CODFIL%TYPE;
 
  cTemp VARCHAR(20);
 
  cTemp VARCHAR(20);
 
 
  CURSOR Filiais IS
 
  CURSOR Filiais IS
 
  SELECT vCODFIL
 
  SELECT vCODFIL
 
   from TD_FIL;
 
   from TD_FIL;
 
 
  BEGIN
 
  BEGIN
 
 
 
   OPEN Filiais;
 
   OPEN Filiais;
 
   LOOP
 
   LOOP
Linha 166: Linha 280:
 
     EXIT WHEN Filiais%NOTFOUND;
 
     EXIT WHEN Filiais%NOTFOUND;
 
     cTemp:=CalculaCustoMedioFilial(vCODFIL);
 
     cTemp:=CalculaCustoMedioFilial(vCODFIL);
   END LOOP;
+
   END LOOP;        
       
+
 
   CLOSE Filiais;
 
   CLOSE Filiais;
 
 
 
  end ProcCalculaCustoMedio;
 
  end ProcCalculaCustoMedio;
 
  /
 
  /
 
+
</syntaxhighlight>
 +
<br/>
 +
<syntaxhighlight lang="SQL">
 
  VARIABLE JOBNO NUMBER;
 
  VARIABLE JOBNO NUMBER;
 
  BEGIN
 
  BEGIN
Linha 182: Linha 296:
 
  END;
 
  END;
 
  /
 
  /
 +
</syntaxhighlight>
  
 +
== Recalcular Custo Médio ==
  
'''Recalcula_Custo_Medio'''
+
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.
  
  DECLARE
+
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.
 +
<syntaxhighlight lang="SQL">
 +
  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)
 +
</syntaxhighlight>
  
 +
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.
 +
<syntaxhighlight lang="SQL">
 +
DECLARE
 
  vCODFIL TD_FIL.CODFIL%TYPE;
 
  vCODFIL TD_FIL.CODFIL%TYPE;
 
  cTemp VARCHAR(20);
 
  cTemp VARCHAR(20);
 
 
  CURSOR Filiais IS
 
  CURSOR Filiais IS
 
  SELECT vCODFIL
 
  SELECT vCODFIL
 
   from TD_FIL;
 
   from TD_FIL;
 
 
  BEGIN
 
  BEGIN
 
 
 
   OPEN Filiais;
 
   OPEN Filiais;
 
   LOOP
 
   LOOP
Linha 202: Linha 327:
 
     EXIT WHEN Filiais%NOTFOUND;
 
     EXIT WHEN Filiais%NOTFOUND;
 
     cTemp:=CalculaCustoMedioFilial(vCODFIL);
 
     cTemp:=CalculaCustoMedioFilial(vCODFIL);
   END LOOP;
+
   END LOOP;      
       
+
 
   CLOSE Filiais;
 
   CLOSE Filiais;
 
 
 
  end;
 
  end;
 
  /
 
  /
 
+
</syntaxhighlight>
 
+
<br/>
[[Categoria: Totall Backoffice]]
+
<br/>
[[Categoria: Funcionalidades]]
+
<small>{{Referencias}}</small>

Edição atual tal como às 10h09min de 31 de dezembro de 2018

Tag-icone-mini.png Totall Backoffice

O Totall 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

Coluna Tipo e Precisão Descrição
ORD_CM NUMBER(10) Ordem para Cálculo
VLRAJU NUMBER(16,4) Valor do Ajuste (fiscal igual ao gerencial)
SAL_CM NUMBER(16,4) Quantidade em estoque do produto no instante do lançamento
TOT_CM NUMBER(16,4) Valor total de custo médio do produto no instante do lançamento
TOTCMG NUMBER(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

Coluna Tipo e Precisão Descrição
ORD_CM NUMBER(10) Ordem para Cálculo
QTD_CM NUMBER(12,4) Quantidade movimentada
VLR_CM NUMBER(16,4) Custo fiscal do item da compra
VLRCMG NUMBER(16,4) Custo gerencial do item da compra
SAL_CM NUMBER(16,4) Quantidade em estoque do produto no instante da compra
TOT_CM NUMBER(16,4) Valor total de custo médio do produto no instante da compra
TOTCMG NUMBER(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

Coluna Tipo e Precisão Descrição
ORD_CM NUMBER(10) Ordem para Cálculo
QTD_CM NUMBER(12,4) Quantidade movimentada
SAL_CM NUMBER(16,4) Quantidade em estoque do produto no instante do lançamento
TOT_CM NUMBER(16,4) Valor total de custo médio do produto no instante do lançamento
TOTCMG NUMBER(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

Coluna Tipo e Precisão Descrição
ORD_CM NUMBER(10) Ordem para Cálculo
QTD_CM NUMBER(12,4) Quantidade movimentada
VLR_CM NUMBER(16,4) Custo fiscal do item na compra "importação"
VLRCMG NUMBER(16,4) Custo gerencial do item da compra "importação"
SAL_CM NUMBER(16,4) Quantidade em estoque do produto no instante da venda
TOT_CM NUMBER(16,4) Valor total de custo médio do produto no instante da venda
TOTCMG NUMBER(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

Coluna Tipo e Precisão Descrição
SAL_CM NUMBER(16,4) Quantidade em estoque no fim do dia
VLR_CM NUMBER(16,4) Valor do estoque fiscal no fim do dia
VLRCMG NUMBER(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

Coluna Tipo e Precisão Descrição
CAL_CM DATE Até quando custo médio está calculado
ATU_CM VARCHAR(1) Indica se existe ou não necessidade do cálculo ["T" ou "F"]
INI_CM DATE Data inicial para cálculo do custo médio (data anterior a primeira compra)
QTD_CM NUMBER(14,2) Quantidade em estoque inicial
VLR_CM NUMBER(16,4) Valor do estoque fiscal inicial
VLRCMG NUMBER(16,4) Valor do estoque gerencial inicial
EST_CM NUMBER(14,2) Quantidade em estoque atual
TOT_CM NUMBER(16,4) Valor do estoque fiscal atual
TOTCMG NUMBER(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 |