Como adicionar mensagem complementar na DANFE através de uma User Function

Hoje vou mostrar um modo fácil de adicionar uma mensagem complementar na DANFE usando uma User Function, e sem alterar o fonte danfeii.prw.

Antigamente quando montei esse artigo, montei apenas com o exemplo utilizando as fórmulas na SM4, mas atualizei agora em Janeiro de 2023 para demonstrar também com o ponto de entrada PE01NFESEFAZ. Então abaixo iremos detalhar as duas formas.

Forma 1: Utilizando o cadastro de fórmulas na SM4 e no campo C5_MENPAD (ou A1_MENSAGE ou F4_FORMULA)

Primeiramente será necessário criar uma função de usuário, iremos criar com o nome de zComplMsg.

Após criar, iremos criar uma Fórmula no sistema (tabela SM4 – Cadastro de Fórmulas), sendo que ela será “u_zComplMsg()” (sem as aspas). Depois, iremos vincular essa fórmula no campo C5_MENPAD (pode ser colocado no Ini. Padrão do campo).

Agora, dentro da sua customização, basta você informar os textos necessários, lembrando que, a maioria das tabelas do faturamento estarão posicionadas nesse momento.

No exemplo abaixo, é colocado uma frase para acessar o Terminal. Note que existe uma constante, que deve ser do mesmo tamanho da existente dentro do arquivo danfeii.prw.

#Include "Protheus.ch"
#Include "TopConn.ch" 
  
#DEFINE MAXMENLIN 080 // Máximo de caracteres por linha de dados adicionais - deixar igual o do fonte danfeii.prw
  
//1 - Criar uma Fórmula (SM4), com u_zComplMsg()
//2 - Colocar o código dessa fórmula no campo C5_MENPAD
  
User Function zComplMsg()
    Local aArea       := GetArea()
    Local aAreaSD2 := SD2->(GetArea())
    Local aAreaSF2 := SF2->(GetArea())
    Local aAreaSC5 := SC5->(GetArea())
    Local aAreaSC6 := SC6->(GetArea())
    Local aAreaSA1 := SA1->(GetArea())
    Local aAreaSB1 := SB1->(GetArea())
    Local aAreaSA3 := SA3->(GetArea())
    Local aAreaSF4 := SF4->(GetArea())
    Local cMens    := ""
    Local cAux     := ""
  
    cAux := "Beluguinha, Belugão... Acesse Terminal de Informação (https://terminaldeinformacao.com)"
    cMens += fLinhaDanfe(cAux)
  
    RestArea(aAreaSD2)
    RestArea(aAreaSF2)
    RestArea(aAreaSC5)
    RestArea(aAreaSC6)
    RestArea(aAreaSA1)
    RestArea(aAreaSB1)
    RestArea(aAreaSA3)
    RestArea(aAreaSF4)
    RestArea(aArea)
Return cMens
  
Static Function fLinhaDanfe(cLinhaTexto)
    Local cLinhaTrans:=""
  
    //Se houver texto
    If !Empty(cLinhaTexto)
        //Enquanto o tamnho for maior que o máximo da linha, vai quebrando
        While Len(cLinhaTexto) > MAXMENLIN
            cLinhaTrans += Substr(cLinhaTexto, 1, MAXMENLIN)
            cLinhaTexto := Substr(cLinhaTexto, MAXMENLIN + 1, Len(cLinhaTexto) - MAXMENLIN)
        EndDo
  
        //Se restou texto, incrementa
        If cLinhaText != ""
            cLinhaTrans += PadR(cLinhaTexto, MAXMENLIN)
        EndIf
    EndIf
  
Return cLinhaTrans

Automaticamente agora ao faturar uma nota e transmitir, ele irá buscar a fórmula do C5_MENPAD, executar a função, e retornar esse texto customizado.

Forma 2: Utilizando o ponto de entrada PE01NFESEFAZ

Nesse caso aqui, esse ponto de entrada é disponibilizado para editar informações que serão transmitidas no XML (e consequentemente impressas na DANFE).

As posições 2 e 3 do Array são os textos da mensagem complementar, então basta que manipulemos a posição 2.

Por exemplo, supondo que se a transportadora for Redespacho, sair uma observação, ficará da seguinte forma:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function PE01NFESEFAZ
Ponto de entrada antes da montagem dos dados da transmissão da NFE
@type  Function
@author Atilio
@since 10/01/2023
@see https://centraldeatendimento.totvs.com/hc/pt-br/articles/4404432005655--Cross-Segmentos-Backoffice-Protheus-Doc-Eletr%C3%B4nicos-Ponto-de-entrada-no-NFESEFAZ-PE01NFESEFAZ
@obs Posições do Array:
    [01] = aProd
    [02] = cMensCli
    [03] = cMensFis
    [04] = aDest
    [05] = aNota
    [06] = aInfoItem
    [07] = aDupl
    [08] = aTransp
    [09] = aEntrega
    [10] = aRetirada
    [11] = aVeiculo
    [12] = aReboque
    [13] = aNfVincRur
    [14] = aEspVol
    [15] = aNfVinc
    [16] = aDetPag
    [17] = aObsCont
    [18] = aProcRef
    [19] = aMed
    [20] = aLote
/*/

User Function PE01NFESEFAZ()
    Local aArea    := FWGetArea()
    Local aAreaSA4 := SA4->(FWGetArea())
    Local aDados   := PARAMIXB
    Local cMsgAux  := ""

    //Se houver redespacho
    If ! Empty(SF2->F2_REDESP)
        
        //Se conseguir posicionar na transportadora de redespacho
        DbSelectArea("SA4")
        DbSetOrder(1)
        If SA4->(MsSeek(FWxFilial("SA4") + SF2->F2_REDESP))

            //Monta a mensagem
            cMsgAux += "REDESPACHO PELA TRANSPORTADORA " + Alltrim(SA4->A4_NOME)

            //Incrementa na mensagem que irá para o xml e danfe
            aDados[02] += cMsgAux
        EndIf
    EndIf

    FWRestArea(aAreaSA4)
    FWRestArea(aArea)
Return aDados

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.

Deixe uma resposta

Terminal de Informação