Como calcular impostos de um Pedido de Compras | Ti Responde 0142

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Damião Duxe disse:

    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.

      • Damião Duxe disse:

        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.

Deixe uma resposta

Terminal de Informação