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.