cancel
Showing results for 
Search instead for 
Did you mean: 

Outbound Email NF-e B2B ( XML + Corpo de texto) dinâmico

rhviana
Active Contributor
0 Kudos

Fala pessoALL,

Criei esse wiki depois que tive essa situação no cliente que estou e resolvi compartilhar com vocês.

Envio de e-mail com XML em anexo e corpo de texto.

Com essa solução você não precisa fazer, o que varias pessoas fizeram de utilizar um javamapping para converter o XML aberto para String novamente e utilizar o layout antigo que era CNPJRC - procNFeString, basta adicionar ele no interface mapping. Simples assim

Fiz uma adaptação de algumas wikis do Henrique Pinto e um código disponibilizado pelo Carlos Rodrigo.

Nesse caso o corpo de texto é dinâmico sem module adapter customizado.

http://wiki.sdn.sap.com/wiki/pages/viewpage.action?pageId=315524420

Em breve o link deve estar adicionado as wikis de NF-e.

Abracos.

Ricardo Viana.

Accepted Solutions (0)

Answers (1)

Answers (1)

Former Member
0 Kudos

Show de bola..vou tentar no próximo cliente

Obrigada,

Érica

rhviana
Active Contributor
0 Kudos

Oi Érica,

So um ajuste final, acabei de testar o cancelamento por evento e esse código java não atende enviar XML de nota cancelada por evento e sim apenas processo normal.

Fiz uma singela adaptação e funcionou o envio de CCe - Cancelamento por Evento e NF-e (XML + Email).

Se caso você ou outros for utilizar essa condificação, favor inserir o trecho abaixo:

   if ( inptxml.indexOf("infEvento") > 0){

    cancelEvento = inptxml.substring(inptxml.indexOf("<descEvento>")+12,inptxml.indexOf("</descEvento>"));

    if("Cancelamento".equals(cancelEvento)){

                    this.setPrefixoDocumento(this.getPrefixoDocumento().replaceAll("NFE", "CancNFe"));

                    this.setPrefixoSubject(this.getPrefixoSubject().replaceAll("NFE AUTORIZADA", "NFE CANCELADA COMO EVENTO"));

              }

    else{

    this.setPrefixoDocumento(this.getPrefixoDocumento().replaceAll("NFE", "CCE"));

    this.setPrefixoSubject(this.getPrefixoSubject().replaceAll("NFE AUTORIZADA", "CARTA DE CORREÇÃO ELETRÔNICA"));

    }

   }

Esse código nao é o mais performatico, porém, atende tranquilo.

Atenciosamente,

Viana

rhviana
Active Contributor
0 Kudos

So adicionando mais informação.

Você pode fazer a comparação entre o Cancelamento por Evento e Carta de Correção eletrônica pelo texto que está dentro da tag descEvento, como está no código acima, ou no início da chave de acesso.

Nesse caso o código abaixo é pegando via UDF, pois desenvolvi duas soluções para B2B dinamico utilizando java mapping e UDF + MessageMapping, basta apenas fazer uma adaptação caso você esteja utilizando java mapping:

UDF :

try {
  InputStream in = new ByteArrayInputStream(stringXML.getBytes("UTF-8"));
  DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
  Document doc = builder.parse(in);
  //Pegando a tag InfEvento o valor do attributo Id - Chave de acesso
  Node node = (Node) doc.getElementsByTagName("infEvento").item(0);
  Node id = node.getAttributes().getNamedItem("Id");
  nfeId = id.toString().substring(6,58);
  //trace.addWarning("Chave de acesso completa: "+ nfeId);
  acao = nfeId.substring(0,6);
  //trace.addWarning("Ação " + acao);
  numeroNFe = nfeId.substring(31,40);
  //trace.addWarning("numeroNFe "+ numeroNFe);
  serieNFe = nfeId.substring(26,28);
  //trace.addWarning("Série " + serieNFe);
  dataNFe = nfeId.substring(8,12);
  //trace.addWarning("DataNFe " + dataNFe);

  /*OUTRA SOLUÇÃO PARA BUSCAR O TEXTO INTERNO DA TAG DESCEVENTO
   Pegando a tag descEvento, convertendo para string e depois pegando o valor interno da string.
   Node node2 = (Node) doc.getElementsByTagName("descEvento").item(0);
  cancel = node2.toString().substring(12,29);
   trace.addWarning(cancel);
  */

} catch (Exception e) {
  trace.addWarning("Error parsing XML: using default values...");
}
return "";

No javamapping, basta você buscar :

 

String cancelEvento = inptxml.substring(inptxml.indexOf(

"<descEvento>")+12,inptxml.indexOf("</descEvento>"

));

Ou

 

String idNFe = inptxml.substring(inptxml.indexOf(

"<chNFe>")+7,inptxml.indexOf("</chNFe>"));

String acao = idNFe.substring(0,6);

if ("110110".equals(acao))

"Carta de correcao eletronica"

else

"Cancelamento por evento"

É isso galera, abraços,

Ricardo Viana.

former_member182114
Active Contributor
0 Kudos

Bom dia Ricardo,

Este comentário fica melhor na própria página da Wiki.

Ou que tal uma versão 2.0 🙂

De qualquer forma obrigado pelo feedback ao fórum.

Atenciosamente, Fernando Da Rós

rhviana
Active Contributor
0 Kudos

Fernando,

Vou fazer isso ai.

A outra solução de UDF + MessageMapping + Javamapping é mais chata... quando eu tiver mais tempo tento criar outra wiki.

Valeu,

Abracos

former_member182114
Active Contributor
0 Kudos

Show de bola