No vídeo de hoje, vamos demonstrar em como calcular os impostos de um pedido de compras com as MaFis***.
A dúvida de hoje, nos perguntaram, em como poderíamos efetuar os cálculos de impostos dentro de um pedido de compras (conforme TES, Produto, Fornecedor, entre outros).
Pensando nisso, montamos esse exemplo, onde vamos demonstrar a utilização das funções MaFis*** calculando conforme os campos do cadastro de pedido de compras da SC7.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zVid0142 Função para demonstrar o cálculo de impostos no Pedido de Compras @type Function @author Atilio @since 03/04/2024 /*/ User Function zVid0142() Local aArea := FWGetArea() Local aPergs := {} Local cPedido := Space(TamSX3("C7_NUM")[01]) //Adiciona os parâmetros que serão exibidos na tela do ParamBox aAdd(aPergs, {1, "Número Pedido", cPedido, "", "ExistCPO('SC7')", "SC7", ".T.", 60, .T.}) //Se a pergunta for confirmada If ParamBox(aPergs, "Informe os parâmetros", /*aRet*/, /*bOk*/, /*aButtons*/, /*lCentered*/, /*nPosx*/, /*nPosy*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.) Processa({|| fCalcula()}) EndIf FWRestArea(aArea) Return Static Function fCalcula() Local aArea := FWGetArea() Local cNumPed := MV_PAR01 Local cMsgLog := "" Local nItem := 0 Local aCampos := {} Local aValids := {} Local nCampoAtu := 0 Local cCampoAtu := "" Local cValidAtu := "" Local nPosInici := 0 Local nPosFinal := 0 Local cReferenc := "" Local cMascara := "@E 999,999,999.99" //Primeiro passo, vamos posicionar no Pedido de Compras DbSelectArea("SC7") SC7->(DbSetOrder(1)) // C7_FILIAL + C7_NUM + C7_ITEM + C7_SEQUEN If SC7->(MsSeek(FWxFilial("SC7") + cNumPed)) //Define o tamanho da régua como 0 para ficar de um lado para outro ProcRegua(0) //Busca todos os campos da SC7 e em seguida, todos os valids, que tenham "MAFISREF" aCampos := SC7->(DbStruct()) For nCampoAtu := 1 To Len(aCampos) cCampoAtu := aCampos[nCampoAtu][1] cValidAtu := Alltrim(Upper( GetSX3Cache(cCampoAtu, "X3_VALID") )) //Se tiver o MAFISREF na validação, vamos adicionar num segundo array If "MAFISREF" $ cValidAtu aAdd(aValids, {cCampoAtu, cValidAtu}) EndIf Next //Encerra o cálculo fiscal caso tenha algum em memória MaFisEnd() //Inicializa o cálculo fiscal MaFisIni(SC7->C7_FORNECE, SC7->C7_LOJA, "F", "N", "R", {}) //Agora percorre todos os itens do pedido de compras While ! SC7->(EoF()) .And. SC7->C7_FILIAL + SC7->C7_NUM == FWxFilial("SC7") + cNumPed //Inicia o carregamento do item do pedido nItem++ MaFisIniLoad(nItem) //Incrementa a régua do Processa IncProc("Analisando item " + cValToChar(nItem)) //Percorre os valids de campo For nCampoAtu := 1 To Len(aValids) cCampoAtu := aValids[nCampoAtu][1] cValidAtu := aValids[nCampoAtu][2] //Busca as posições inicias e finais dentro do MAFISREF nPosInici := At('MAFISREF("', cValidAtu) + 10 nPosFinal := At('","MT120",', cValidAtu) //Pega apenas o conteúdo entre a posição inicial e final cReferenc := SubStr(cValidAtu, nPosInici, nPosFinal - nPosInici) //Carrega a informação da SC7 para o cálculo fiscal MaFisLoad(cReferenc, &("SC7->"+ cCampoAtu), nItem) Next //Encerra o carregamento do item do pedido MaFisEndLoad(nItem, 2) SC7->(DbSkip()) EndDo //Agora vamos montar a mensagem que será exibida com os valores dos impostos cMsgLog := "Pedido '" + cNumPed + "': " + CRLF + CRLF cMsgLog += "-> IPI: " + Transform(MaFisRet(, 'NF_VALIPI') , cMascara) + CRLF cMsgLog += "-> ICMS: " + Transform(MaFisRet(, 'NF_VALICM') , cMascara) + CRLF cMsgLog += "-> Despesas: " + Transform(MaFisRet(, 'NF_DESPESA') , cMascara) + CRLF cMsgLog += "-> Frete: " + Transform(MaFisRet(, 'NF_FRETE') , cMascara) + CRLF cMsgLog += "-> Seguro: " + Transform(MaFisRet(, 'NF_SEGURO') , cMascara) + CRLF cMsgLog += "-> Vlr.Tot.: " + Transform(MaFisRet(, 'NF_TOTAL') , cMascara) + CRLF //Senão encontrar, apenas define uma mensagem Else cMsgLog := "Pedido '" + cNumPed + "' não encontrado!" EndIf //Exibe a mensagem com o resultado ShowLog(cMsgLog) FWRestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Olá Atílio, tudo bem?
Muito bom!!!
Caso seja um pedido Suframa, tem algo a mais que seja necessário incluir?
Abraços.
Bom dia Damião, tudo joia graças a Deus e você?
Nesse exemplo, ele se baseia nos valids dos campos da SC7 (onde tiver o MAFISREF, ele vai usar como referência).
Não sei dizer, se para Suframa, precisa ajustar algo, eu vou tentar fazer algumas simulações numa base de testes. Chegou a dar alguma mensagem de erro?
Fico no aguardo.
Tenha uma ótima e abençoada quarta feira.
Um forte abraço.
Opa, tudo bem também.
Algum tempo atrás eu tentei trazer e cheguei praticamente no mesmo resultado que no seu exemplo, porém, salvo engano, alguns impostos que contemplam no Suframa ele não mostrava.
Até cheguei abrir um chamado na Totvs, mas disseram que eram alguns cálculos internos que eles não podiam passar. rsrs.
Mas agradeço seu retorno.
Abraços irmão.
Bom dia Damião, opa que bom que está tudo bem.
Ah entendi. Infelizmente para SUFRAMA não cheguei a pegar algum caso para calcular. Se surgir algum cliente nosso com um cenário parecido e eu conseguir fazer as simulações, ai atualizo aqui o artigo.
Tenha uma ótima e abençoada quinta feira.
Um forte abraço.