Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.


CONTEÚDO

  1. Visão Geral
  2. Pontos de Entrada - ADVPL
  3. Exemplo do processo
  4. ConsideraçõesPontos de Entrada - Procedure


01. VISÃO GERAL

Foi criado o tratamento de entrada do CTe substituto pelo modulo de compras, que permite a entrada de uma nota de conhecimento de frete que

...

substitui uma nota de conhecimento de frete inserida anteriormente, onde basicamente o CTe anterior passa a ser ignorado e o novo CTe passa a valer substituindo o CTe anterior.

Dentro desta necessidade, o modulo de estoque custos passa a ter duas notas do mesmo objetivo CTe, e deve estar preparado para estornar o valor do CTe original que

...

foi inserido no sistema e agregar o custo do novo CTe no custo do produto.

Para fazer este tratamento, o modulo de estoque custos utiliza as informações gravadas

...

das amarrações de notas de entradas e conhecimentos de frete geradas no processo de compras e ao ser dada a entrada do CTe substituto, é disparado os tratamentos para o modulo de estoque custos, buscando o CTe original para estornar o seu valor no custo do produto

...

na tabela

...

de saldos fisicos/financeiro e gerando uma movimentação interna na tabela

...

de movimentações que irá apoiar para demonstrar a operação nos

...

relatórios e consultas, e

...

agrega o novo valor do CTe substituto no custo do produto na tabela

...

Nota
titleAtenção

O parâmetro MV_A330SB2 estará disponível para os releases 12.1.33 e 12.1.2210; a partir da 12.1.2310, o parâmetro passará a ser obsoleto, pois a funcionalidade estará sempre ativa.

Informações
titleTabela TR2

A tabela TR2XXSP é uma tabela auxiliar para processamento do recálculo e, por isso, não faz parte do dicionário de dados

Nota
titleAtenção

A tabela TR2 é de uso EXCLUSIVO da rotina Recálculo do Custo Médio (MATA330) e de suas procedures.

*O saldo final é aquele gravado nos campos abaixo:

...

B2_QFIM      

...

B2_VFIM1      

...

1 O Custo médio unitário é atualizado somente para produtos do tipo Mão de Obra (MOD), por compatibilidade com o parâmetro desabilitado.

Quando o parâmetro MV_A330GRV estiver com o conteúdo .F. (ou seja, o recálculo do custo médio não processa produtos obsoletos), a tabela TR2 será gravada somente com os produtos/locais que possuem saldo ou movimentação no período, minimizando o volume de gravações no banco de dados. Caso seja necessário, os pontos de entrada da rotina deverão ser avaliados, caso estejam tentando acessar produtos não gravados na TR2.

02. Parâmetro

...

Aviso
titleUso de Procedures

Para correta execução do recálculo, sempre que o conteúdo do parâmetro MV_A330SB2 for alterado, é necessário reinstalar o pacote de procedures 19 - Custo médio através do configurador, para assegurar que as procedures instaladas acessem a tabela TR2XXSP e não a SB2XX0.

03. Pontos de Entrada - ADVPL

Abaixo estão listados os pontos de entrada que podem ser impactados ao habilitar o parâmetro MV_A330SB2.

A ativação do parâmetro MV_A330SB2 altera o Alias SB2, passando a apontar para a tabela TR2XXSP e deixa de ler a tabela SB2XX0 durante a execução dos pontos de entrada abaixo, entretanto, como somente os campos de quantidade, valor e custo médio finais são gravados na SB2, é necessário avaliar se outros campos da SB2 estão sendo lidos ou gravados, e realizar ajustes de acordo com a necessidade. Da mesma forma, caso sejam feitas consultas utilizando queries na SB2, com a função RetSqlName, será necessário compatibilizar para ler da tabela TR2XXSP.

...

Aviso
titleAtenção!

Caso o ambiente do cliente possua algum dos pontos de entrada acima e, nestes programas, realize algum acesso à tabela SB2 para leitura ou gravação, deverá ser avaliado a necessidade de compatibilização do ponto de entrada.

Abaixo, é apresentado um exemplo hipotético de regra de negócio em ponto de entrada que pode ser impactado e os ajustes necessários para corrigir.

Bloco de código
languagevb
themeMidnight
titleMA330AL
linenumberstrue
#INCLUDE 'totvs.ch'

User Function MA330AL()
    Local aArea := GetArea()
    Local cArmazem := "20" // Armazém que NÃO deseja recalcular custo médio
    Local lRet := .T.
 
    If SB2->B2_LOCAL == cArmazem
        lRet := .F.
    Endif
 
    RestArea(aArea)
Return lRet // Retorno Lógico, sendo .T. para recalcular armazém e .F. para não recalcular

No exemplo acima, embora seja feito acesso à SB2, não é necessário alterar o tratamento, pois com o parâmetro MV_A330SB2 habilitado, o Alias SB2 já aponta para a tabela TR2XXSP corretamente.

Caso a regra acima esteja escrita desta forma:

Bloco de código
languagevb
themeMidnight
titleMA330AL
linenumberstrue
#INCLUDE 'totvs.ch'

User Function MA330AL()
    Local aArea := GetArea()
    Local cArmazem := "20" // Armazém que NÃO deseja recalcular custo médio
	Local cQuery   := ""
	Local cAlTmp   := ""
    Local lRet := .T.

	cQuery := " Select B2_LOCAL From "+RetSqlName("SB2")+" "
	cQuery += "  Where R_E_C_N_O_ = "+cValToChar(SB2->(Recno()))

	cAlTmp := MPSysOpenQuery(cQuery)
 
    If !(cAlTmp)->(EoF()) .And. (cAlTmp)->B2_LOCAL == cArmazem
        lRet := .F.
    Endif
	
	(cAlTmp)->(DbCloseArea())
 
    RestArea(aArea)
Return lRet // Retorno Lógico, sendo .T. para recalcular armazém e .F. para não recalcular

Será necessário corrigir a query, pois o RetSqlName retorna SB2XX0, mas a rotina deve ler os campos da TR2XXSP:

Bloco de código
languagevb
themeMidnight
titleMA330AL
linenumberstrue
#INCLUDE 'totvs.ch'

User Function MA330AL()
    Local aArea := GetArea()
    Local cArmazem := "20" // Armazém que NÃO deseja recalcular custo médio
	Local cQuery   := ""
	Local cAlTmp   := ""
	Local cAlSB2   := RetSqlName("SB2")
    Local lRet := .T.
	Local lA330SB2 := SuperGetMV("MV_A330SB2")

	If  lA330SB2
		cAlSB2 := "TR2"+cEmpAnt+"SP"
	EndIf

	cQuery := " Select B2_LOCAL From "+ cAlSB2 +" "
	cQuery += "  Where R_E_C_N_O_ = "+cValToChar(SB2->(Recno()))

	cAlTmp := MPSysOpenQuery(cQuery)
 
    If !(cAlTmp)->(EoF()) .And. (cAlTmp)->B2_LOCAL == cArmazem
        lRet := .F.
    Endif
	
	(cAlTmp)->(DbCloseArea())
 
    RestArea(aArea)
Return lRet // Retorno Lógico, sendo .T. para recalcular armazém e .F. para não recalcular

Abaixo é apresentado outro exemplo, onde ocorre a gravação de campos na SB2

Bloco de código
languagevb
themeMidnight
titleMA330D1
linenumberstrue
#INCLUDE 'totvs.ch'  User Function MA330D1()
    Local cFornece := '000001' //Dados do fornecedor - pode ser lido de parâmetro
    Local cLoja    := '01'     //ou outra tabela para a customização

    //Fornecedor da nota se enquadra na regra X
    If SD1->D1_FORNECE == cFornece .And. SD1->D1_LOJA == cLoja
        If RecLock('SB2', .F.)
            //Faz com que o valor de custo considerado seja o total da nota e não o custo
            SB2->B2_VFIM1  := B2_VFIM1 - SD1->D1_CUSTO + SD1->D1_TOTAL
            //Acumula o custo total deste fornecedor
            SB2->B2_XCTTOT += SD1->D1_CUSTO
            SB2->B2_CMFIM1 := B2_VFIM1 / B2_QFIM
            SB2->(MsUnlock())
        EndIf
    EndIf

Return

No exemplo acima, a gravação dos campos B2_VFIM1 e B2_CMFIM1 está correta e, ao término do recálculo, será gravada na SB2 conforme esperado, entretanto, o campo B2_XCTTOT, por não fazer parte dos campos de saldo final padrão, não será gravado na SB2, sendo necessário reavaliar o cenário customizado para adequar o ponto de entrada.

04. Pontos de Entrada - Procedure

Durante a execução do recálculo, as procedures são utilizadas para preparar o arquivo TRB e iniciar os dados na SB2, e, por conta disso, é preciso avaliar se as procedures abaixo estão instaladas no banco de dados fazendo algum acesso à tabela SB2XX0. Caso estejam, deve ser alterado para que acesse a tabela TR2XXSP

...

Aviso
titleUso de Procedures

Caso o ambiente do cliente possua algum dos pontos de entrada acima e, nestas procedures, realize algum acesso à tabela SB2 para leitura ou gravação, deverá ser avaliado a necessidade de compatibilização do ponto de entrada.

Abaixo é apresentado um exemplo hipotético de regra de negócio em um ponto de entrada escrito em procedure para MSSQL que precisaria ser ajustado:

Bloco de código
languagesql
themeMidnight
titleMA330AL
linenumberstrue
USE [P12127MNTDBEXP]
GO
 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Procedure creation
ALTER PROCEDURE [dbo].[MA330AL_T1] (
    @IN_FILIALCOR Char( 8) ,
    @IN_COD Char( 30) ,
    @IN_LOCAL Char( 2) ,
    @IN_RECNOSB2 Integer ,
    @OUT_RESULTADO Char( 01 )  output ) AS
 
-- Declaration of variables
DECLARE @cB2_LOCAL Char(02)

BEGIN
   SET @OUT_RESULTADO  = '0'

   Select @cB2_LOCAL = ISNULL(B2_LOCAL, '  ')
   From SB2990
   Where R_E_C_N_O_ = @IN_RECNOSB2

   IF @cB2_LOCAL = '20' -- Armazém que NÃO deseja recalcular custo médio
   BEGIN
      SET @OUT_RESULTADO  = '1' -- Retorno em caractere, sendo '0' para recalcular armazém e '1' para não recalcular   
   END
END

Onde é feito o select na SB2990, é necessário trocar para TR299SP:

...

languagesql
themeMidnight
titleMA330AL
linenumberstrue

...

de saldos fisicos/financeiro, mantendo assim o custo atualizado.

Considerando que é possível a movimentação do produto antes da entrada do CTe substituto, este movimento será valorizado com o custo do momento em que ocorre, ou seja, com o custo do CTe original. Posterior a movimentação,  dependendo do caso, pode ocorrer um CTe substituto, e as novas movimentações utilizarão o custo atualizado, porem o que foi movimentado com o custo anterior, serão ajustados pelo recalculo do custo médio, que foi preparado para ajustar o custo daquele movimento que ocorreu com o custo velho.   

        

02. Exemplo do processo

         

Nota de entrada do produto com quantidade 100, valor unitario 10,00 e custo medio 10,00.

Image Added


 Conhecimento de Frete (Cte original) de valor 20,00 

 Image Added


  Movimentação interna requisitando a quantidade 1 e custo atual 10,20. 

  Valor do produto 1.000,00 + Valor do Frete 20,00 = 1.020,00 / quantidade 100 = custo medio 10,20.

  Image Added


  Entrada do CTe substituto valor 10,00 

   Image Added


  Se consultar o Kardex Diario teremos:

  - A nota de entrada NFS054 serie 1 quantidade 100 , custo medio 10,00 , custo total 1000,00

  - A entrada do Conhecimento de frete original 2468 serie 1 de valor 20,00

  - O movimento de requisição de quantidade 1 e custo medio 10,20

  -  A entrada do conhecimento de frete substituto 2469 serie 1 de valor 10,00

  - O movimento de ajuste que estorna o valor do CTe original 2468 e valor 20,00


Image Added

Image AddedImage Added

  


 No relatorio Kardex Fisico-Financeiro é possivel observar as mesmas movimentações da consulta acima porem com uma previa de custo

 Image Added


 Observe acima que o movimento que ocorreu entre os conhecimentos de frete ocorreu com o custo existente de 10,20. A execução do recalculo do custo medio vai ajustar o valor da movimentação com o custo final 


Execução do recalculo do custo medio, etapa incicial da rotina acompanha custos 

Image Added



Consulta Kardex Diario

Observe que o recalculo ajustou o custo da movimentação que foi feita com o custo do Cte original antes 10,20 e agora 10,10.


Image Added

Image Added

Image Added


Image Added


03. Considerações

Legalmente o CTe substituto tem prazo longo para ser reemitido e ser dado a entrada no sistema, e ocorrendo dentro do período em aberto do estoque, o recalculo consegue recalcular as movimentações, porem caso o CTe substituto ocorra no período aberto mas referenciando notas e conhecimentos de períodos anteriores fechados, não será possivel reajustar o custo das movimentações anteriores já fechados.