(→Cálculo do Custo Médio)  | 
				|||
| (56 revisões intermediárias por 5 usuários não estão sendo mostradas) | |||
| Linha 1: | Linha 1: | ||
| − | {{  | + | {{Tags|Totall Backoffice}}  | 
| − | + | {{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.  | |
| − | O Totall   | + | |
| − | Estas funções são utilizadas por exemplo nos forms de Inventário, 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.  | ||
== 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.  | + | 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).  | + | 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;  | 
| − | '''Valor do Estoque'''   | + | '''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:'''  | ||
| Linha 28: | Linha 25: | ||
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   | + | 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.  | 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.  | |
| − | + | ||
| − | + | == 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 ==  | |
| − | Neste caso o sistema começará o cálculo a partir desta data e levando em conta estes valores iniciais.  | + | * 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 ==  | ||
| + | |||
| + | {{LinkInterno|\\ttadm\Docs\publico\Base de Conhecimento\backoffice\produtos\custo médio\Detalhamento_Custo_Medio.sql}}  | ||
| + | |||
| + | == Dicionário de Dados ==  | ||
| + | |||
| + | === TT_ACM ===  | ||
| + | {| class="wikitable"  | ||
| + | |-  | ||
| + | ! 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 ===  | ||
| + | {| 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  | ||
| + | |}  | ||
| + | |||
| + | :''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 ===  | ||
| + | {| class="wikitable"  | ||
| + | |-  | ||
| + | ! 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 ===  | ||
| + | {| 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 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 ===  | ||
| + | {| 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.''  | ||
| + | |||
| + | === TT_SAL ===  | ||
| + | {| class="wikitable"  | ||
| + | |-  | ||
| + | ! 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 ==  | == Funções de Banco Envolvidas ==  | ||
| − | CalculaCustoMedio(pCODFIL,pFILMAT,pCODMAT,pCODCOR,pCODTAM)  | + | '''CalculaCustoMedio:'''  | 
| + | <syntaxhighlight lang="SQL">  | ||
| + | CalculaCustoMedio(pCODFIL, pFILMAT, pCODMAT, pCODCOR, pCODTAM)  | ||
| + | </syntaxhighlight>  | ||
| + | |||
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 69: | 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 80: | 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;  | ||
| Linha 98: | Linha 284: | ||
  end ProcCalculaCustoMedio;  |   end ProcCalculaCustoMedio;  | ||
  /  |   /  | ||
| − | + | </syntaxhighlight>  | |
| + | <br/>  | ||
| + | <syntaxhighlight lang="SQL">  | ||
  VARIABLE JOBNO NUMBER;  |   VARIABLE JOBNO NUMBER;  | ||
  BEGIN  |   BEGIN  | ||
| Linha 108: | Linha 296: | ||
  END;  |   END;  | ||
  /  |   /  | ||
| + | </syntaxhighlight>  | ||
| + | == 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.  | ||
| + | <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  |   DECLARE  | ||
  vCODFIL TD_FIL.CODFIL%TYPE;  |   vCODFIL TD_FIL.CODFIL%TYPE;  | ||
| Linha 128: | Linha 331: | ||
  end;  |   end;  | ||
  /  |   /  | ||
| − | + | </syntaxhighlight>  | |
| − | + | <br/>  | |
| − | + | <br/>  | |
| − | + | <small>{{Referencias}}</small>  | |
Edição atual tal como às 10h09min de 31 de dezembro de 2018
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; /