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.