Histórico da Página
CONTEÚDO
- Visão Geral
- Pontos de Entrada - ADVPL
- Exemplo do processo
- 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 substitue 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 ja já 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 na tabela SF8, onde o modulo de compras grava as amarrações entre a nota do produto, CTe original e CTe Substituto, 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 gravado na tabela SB2, gerando uma movimentação na tabela SD3 com D3_TES = 999 e D3_CF = DEB que irá apoiar para apoiar e demonstrar a operação nos relatorios relatórios e consultas, e finalmente agregar o novo valor do CTe substituto no custo do produto na tabela SB2.
Nota | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
A tabela TR2XXSP é uma tabela auxiliar para processamento do recálculo e, por isso, não faz parte do dicionário de dados |
Nota | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#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 | ||
---|---|---|
| ||
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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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:
...
language | sql |
---|---|
theme | Midnight |
title | MA330AL |
linenumbers | true |
, mantendo assim o custo correto.
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, ocorre a entrada do CTe substituto que terá o custo ajustado e os novos movimentos usarão o ultimo custo. Nestes casos, onde ocorreu um movimento com o custo velho, o recalculo do custo médio 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.
Conhecimento de Frete (Cte original) de valor 20,00
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.
Entrada do CTe substituto valor 10,00
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
No relatorio Kardex Fisico-Financeiro é possivel observar as mesmas movimentações da consulta acima porem com uma previa de custo
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
Recalculo do custo medio
Consulta Kardex Diario
Observe que foi ajustado o custo da movimentação com o custo final de 10,10.
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 destes movimentos anteriores já fechados.
...