Nesse vídeo demonstraremos a utilização das funções MaFisIni, MaFisAdd, MaFisRet e MaFisEnd, que servem para calcular impostos conforme parametrizações do sistema (TES, Produtos, Clientes, Fornecedores, etc).
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas
#Include "Totvs.ch"
/*/{Protheus.doc} User Function zExe336
Cálcula os impostos de um pedido ou documento
@type Function
@author Atilio
@since 12/03/2023
@see https://tdn.totvs.com/pages/releaseview.action?pageId=605868324 e https://tdn.totvs.com/pages/releaseview.action?pageId=605867908
@obs
Função MaFisIni
Parâmetros
01 - Codigo Cliente/Fornecedor
02 - Loja do Cliente/Fornecedor
03 - C:Cliente , F:Fornecedor
04 - Tipo da NF
05 - Tipo do Cliente/Fornecedor
06 - Relacao de Impostos que suportados no arquivo
07 - Tipo de complemento
08 - Permite Incluir Impostos no Rodape .T./.F.
09 - Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
10 - Nome da rotina que esta utilizando a funcao
Retorno
Função não tem retorno
Função MaFisAdd
Parâmetros
01 - Codigo do Produto
02 - Codigo do TES
03 - Quantidade
04 - Preco Unitario
05 - Desconto
06 - Numero da NF Original ( Devolucao/Benef )
07 - Serie da NF Original ( Devolucao/Benef )
08 - RecNo da NF Original no arq SD1/SD2
09 - Valor do Frete do Item
10 - Valor da Despesa do item
11 - Valor do Seguro do item
12 - Valor do Frete Autonomo
13 - Valor da Mercadoria
14 - Valor da Embalagem
15 - RecNo do SB1
16 - RecNo do SF4
Retorno
Função não tem retorno
Função MaFisRet
Parâmetros
Posição do item (ou vazio se for do documento)
Nome do valor a ser buscado
Retorno
Retorna o valor pesquisado
Função MaFisEnd
Parâmetros
Função não tem parâmetros
Retorno
Função não tem retorno
**** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/
User Function zExe336()
Local aArea := FWGetArea()
Local aAreaBkp
Local cPedido := FWInputBox("Digite um número de pedido:")
Local cMensagem := ""
DbSelectArea("SC5")
SC5->(DbSetOrder(1)) // Filial + Pedido
DbSelectArea("SC6")
SC6->(DbSetOrder(1)) // Filial + Pedido + Item + Produto
DbSelectArea("SB1")
SB1->(DbSetOrder(1)) // Filial + Produto
//Posicionar na SC5 com MsSeek antes desse trecho
If SC5->(MsSeek(FWxFilial("SC5") + cPedido))
MaFisIni(;
SC5->C5_CLIENTE,; // 01 - Codigo Cliente/Fornecedor
SC5->C5_LOJACLI,; // 02 - Loja do Cliente/Fornecedor
Iif(SC5->C5_TIPO $ "D;B", "F", "C"),; // 03 - C:Cliente , F:Fornecedor
SC5->C5_TIPO,; // 04 - Tipo da NF
SC5->C5_TIPOCLI,; // 05 - Tipo do Cliente/Fornecedor
MaFisRelImp("MT100", {"SF2", "SD2"}),; // 06 - Relacao de Impostos que suportados no arquivo
,; // 07 - Tipo de complemento
,; // 08 - Permite Incluir Impostos no Rodape .T./.F.
"SB1",; // 09 - Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
"MATA461"; // 10 - Nome da rotina que esta utilizando a funcao
)
//Enquanto houver itens
SC6->(MsSeek(FWxFilial('SC6') + SC5->C5_NUM))
aAreaBkp := SC6->(FWGetArea())
nItAtu := 0
While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM
nItAtu++
//Adiciona o item nos tratamentos de impostos
SB1->(MsSeek(FWxFilial("SB1")+SC6->C6_PRODUTO))
nQtdPeso := SB1->B1_PESO
MaFisAdd(;
SC6->C6_PRODUTO,; // 01 - Codigo do Produto ( Obrigatorio )
SC6->C6_TES,; // 02 - Codigo do TES ( Opcional )
SC6->C6_QTDVEN,; // 03 - Quantidade ( Obrigatorio )
SC6->C6_PRCVEN,; // 04 - Preco Unitario ( Obrigatorio )
SC6->C6_VALDESC,; // 05 - Desconto
SC6->C6_NFORI,; // 06 - Numero da NF Original ( Devolucao/Benef )
SC6->C6_SERIORI,; // 07 - Serie da NF Original ( Devolucao/Benef )
0,; // 08 - RecNo da NF Original no arq SD1/SD2
0,; // 09 - Valor do Frete do Item ( Opcional )
0,; // 10 - Valor da Despesa do item ( Opcional )
0,; // 11 - Valor do Seguro do item ( Opcional )
0,; // 12 - Valor do Frete Autonomo ( Opcional )
SC6->C6_VALOR,; // 13 - Valor da Mercadoria ( Obrigatorio )
0,; // 14 - Valor da Embalagem ( Opcional )
SB1->(RecNo()),; // 15 - RecNo do SB1
0; // 16 - RecNo do SF4
)
MaFisLoad("IT_VALMERC", SC6->C6_VALOR, nItAtu)
MaFisAlt("IT_PESO", nQtdPeso, nItAtu)
SC6->(DbSkip())
EndDo
//Altera dados do cabeçalho
MaFisAlt("NF_FRETE", SC5->C5_FRETE)
MaFisAlt("NF_SEGURO", SC5->C5_SEGURO)
MaFisAlt("NF_DESPESA", SC5->C5_DESPESA)
MaFisAlt("NF_AUTONOMO", SC5->C5_FRETAUT)
If SC5->C5_DESCONT > 0
MaFisAlt("NF_DESCONTO", Min(MaFisRet(, "NF_VALMERC")-0.01, SC5->C5_DESCONT+MaFisRet(, "NF_DESCONTO")) )
EndIf
If SC5->C5_PDESCAB > 0
MaFisAlt("NF_DESCONTO", A410Arred(MaFisRet(, "NF_VALMERC")*SC5->C5_PDESCAB/100, "C6_VALOR") + MaFisRet(, "NF_DESCONTO"))
EndIf
//Agora reposiciona nos itens para poder pegar os dados
FWRestArea(aAreaBkp)
nItAtu := 0
nTotalST := 0
nTotIPI := 0
nValorTot := 0
While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM
nItAtu++
//Pega os valores
nBasICM := MaFisRet(nItAtu, "IT_BASEICM")
nValICM := MaFisRet(nItAtu, "IT_VALICM")
nValIPI := MaFisRet(nItAtu, "IT_VALIPI")
nAlqICM := MaFisRet(nItAtu, "IT_ALIQICM")
nAlqIPI := MaFisRet(nItAtu, "IT_ALIQIPI")
nValSol := (MaFisRet(nItAtu, "IT_VALSOL") / SC6->C6_QTDVEN)
nBasSol := MaFisRet(nItAtu, "IT_BASESOL")
nPrcUniSol := SC6->C6_PRCVEN + nValSol
nTotSol := nPrcUniSol * SC6->C6_QTDVEN
nTotalST += MaFisRet(nItAtu, "IT_VALSOL")
nTotIPI += nValIPI
nValorTot += SC6->C6_VALOR
SC6->(DbSkip())
EndDo
nTotFrete := MaFisRet(, "NF_FRETE")
nTotVal := MaFisRet(, "NF_TOTAL")
MaFisEnd()
//Monta a mensagem e exibe
cMensagem := "Pedido " + SC5->C5_NUM + CRLF + CRLF
cMensagem += "Total ST: " + cValToChar(nTotalST) + CRLF
cMensagem += "Total IPI: " + cValToChar(nTotIPI) + CRLF
cMensagem += "Total Frete: " + cValToChar(nTotFrete) + CRLF
cMensagem += "Total Valor: " + cValToChar(nTotVal) + CRLF
ShowLog(cMensagem)
EndIf
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Como faria para usar o MaFisAdd junto com a TES Inteligente?
Bom dia Arthur, tudo joia?
Infelizmente nunca precisei fazer uso das MaFis* junto de TES inteligente, então vou ficar devendo um exemplo pronto desse cenário.
Mas de antemão, se os dados já estiverem gravados na SC6, a TES inteligente já foi acionada (caso do nosso exemplo, que estamos usando SC6->C6_TES).
Agora caso você queira simular sem os dados estarem gravados, ai o que você poderia fazer é tentar simular o gatilho 1 do campo C6_OPER que usa a função MaTesInt para encontrar a TES Inteligente.
Com isso, você joga o conteúdo em uma variável, tipo cTes e usa ela no lugar da SC6->C6_TES.
Um grande abraço.
Boa tarde, e quanto ao cálculo do DIFAL, teria algum exemplo de como faria ele utilizando o MafisRet?
Utilizamos o IT_DIFAL porém não bateu com o valor que queríamos.
Bom dia Gabriel, tudo joia?
Infelizmente nunca precisei buscar o DIFAL usando as MaFis*. Pesquisando aqui em exemplos de clientes que já atendi, vi referências para IT_DIFAL e NF_PPDIFAL.
Se eu conseguir um tempo, tentarei fazer alguns testes de estresse na rotina para simular um DIFAL ai eu atualizo o artigo.
Tenha uma ótima e abençoada quarta feira.
Um grande abraço.
Boa tarde Atilio.
Seria dificil voce disponibilizar um codigo de exemplo, porque agora temos uma API da Totvs especifica para retornar os impostos sobre os pedidos de venda gravados(GET)
/api/fat/v1/SalesTaxes
Que ajudaria muito para calcular impostos corretamente em uma rotina de impressao de pedido ja com os valores de impostos apurados por essa rotina. A impressao do pedido é o de menos o melhor é fazer a consulta via API via GET(pedidos gravados) para trazer os impostos em array. Obrigado
Bom dia Mauricio, tudo joia?
Opa, adicionamos aqui na lista de sugestões, e num futuro tentaremos preparar algum conteúdo relacionado.
Tenha uma ótima e abençoada terça feira.
Um forte abraço.