cancel
Showing results for 
Search instead for 
Did you mean: 

NFe - Erro B2B Outbound - PI 7.31

0 Kudos

Bom dia Pessoal,

    estamos configurando o B2B de saída para o PI 7.31.

Fizemos os seguintes passos:

-> Implementamos a BADI -> /XNFE/EMAIL_B2B_OUT método "GET_EMAIL";

->Fizemos o Java Mapping com a nossa classe herdando da "AbstractTransformation"(Nova API).

->Modificamos o Operation Mapping para usar o xsd Mail(ver imagem abaixo) e marcamos a opção "Read Attchaments"

No Java Mapping conseguimos pegar os e-mail com sucesso do arquivo texto(Communication Parameter), porém não estamos conseguimos elimina-lo e o resultado é que ele acaba indo como anexo no e-mail recebido pelo cliente junto como o xml da nota.

Abaixo temos alguns trechos do Java Mapping:

public void transform(TransformationInput input, TransformationOutput output)

throws StreamTransformationException {

.....

.....

OutputAttachments outAtt = output.getOutputAttachments();

output.getOutputAttachments().removeAttachment(attachId);

outAtt.removeAttachment(attachId);

Ao testar o cenário NTB2B, recebemos com sucesso o xml da nota, porém o arquivo texto que contém os e-mail(Communication Parameter) não é eliminado e vem junto com o e-mail....

Alguma ideia do que pode ser?.....

Grato

Ortiz

Accepted Solutions (1)

Accepted Solutions (1)

former_member182503
Active Contributor
0 Kudos

Bom dia Ortiz,

verifique se a nota 1641548 é relevante para você. Ela corrige um bug do método removeAttachments da interface OutputAttachments.

[]'s

JN

0 Kudos

Bom dia Jose Nunes,

   irei repassar a nota para a equipe de Basis para fazer a atualização dos support packages.

Obrigado

Answers (1)

Answers (1)

Former Member
0 Kudos

Ortiz, bom dia.

Está linha não é necessária: output.getOutputAttachments().removeAttachment(attachId);


Como você está populando os campos <Content_Type> e <Content> do Mail ?

Abs,

André Canalles

0 Kudos

Boa tarde André,

  retirei a linha: output.getOutputAttachments().removeAttachment(attachId);

porém o erro continua.

Segue o trecho do código de como populo as tags CONTENT_TYPE e CONTENT

//Cria elemento Content Type

Element contentType = docout.createElement("Content_Type");

root.appendChild(contentType);

Text contentTypeText = docout.createTextNode("application/xml"); //Cria valor campo

contentType.appendChild(contentTypeText);

//Cria elemento Content Type

Element content = docout.createElement("Content");

root.appendChild(content);

Text contentText = docout.createTextNode(inptxml.replaceAll("<nm:", "<").replaceAll("</nm:", "</")); //Cria valor campo

content.appendChild(contentText);

Segue também em anexo o código inteiro do JavaMapping.

Att,,

Ortiz

Former Member
0 Kudos

Ortiz, bom dia.

O problema está na montagem do seu <Content>. Tente utilizar o código Java abaixo:


import sun.misc.BASE64Encoder;

// Field Content Type

Element contentType = docout.createElement("Content_Type");

root.appendChild(contentType);

Text contentTypeText = docout.createTextNode("multipart/mixed; boundary=\"--AaZz\"");

contentType.appendChild(contentTypeText);

// Field Content

Element content = docout.createElement("Content");

root.appendChild(content);

Text contentText = docout.createTextNode(getContent(StreamTOString(in)));

content.appendChild(contentText);

public String StreamTOString(InputStream Stream)

        throws UnsupportedEncodingException {

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    String payload = new String("");

    int c;

    try {

        while ((c = Stream.read()) != -1)

            baos.write(c);

        payload = baos.toString("UTF-8");

    } catch (Exception e) {

        getTrace().addWarning(e.getMessage());

    }

    return payload;

}

public String getContent(String xml) throws UnsupportedEncodingException {

    String CRLF = System.getProperty("line.separator");

    String boundary = new String("--AaZz");

    String filename = new String("Nome_Anexo.xml");

    String body = new String("Corpo_Email");

    String payload = new String("");

    xml = xml.replaceAll("<nm:", "<").replaceAll("</nm:", "</");

    // String to BASE64

    BASE64Encoder encoder = new BASE64Encoder();

    xml = encoder.encode(xml.getBytes("UTF-8"));

    payload = "--" + boundary + CRLF

            + "Content-Type: text/html; charset=UTF-8" + CRLF

            + "Content-Disposition: inline" + CRLF + CRLF + body + CRLF

            + "--" + boundary + CRLF

            + "Content-Type: application/xml; charset=UTF-8 ; name="

            + filename + CRLF

            + "Content-Disposition: attachment; filename=" + filename

            + CRLF + "Content-Transfer-Encoding: base64" + CRLF + CRLF

            + xml + CRLF;

    return payload;

}

Não utilize os campos <Content_Description> e <Content_Disposition>.


Abs,

André Canalles

0 Kudos

Bom dia André,

  substitui o trecho que monta as tags "CONTENT_TYPE"  e "CONTENT" pelo seu código porém o erro continua....

O  "Communication Parameter" que contém o e-mail do cliente não foi eliminado e o xml veio em branco(sem conteudo).

Veja o print da estrutura do e-mail:

Alguma outra sugestão?....

Att,,

Ortiz

Former Member
0 Kudos

Ortiz,

Verifique seu código, o base64 do XML não está contido no <Content>.

Não há necessidade de eliminar o anexo "Communication Parameter".

Att.,

André Canalles

0 Kudos

Boa tarde André,

    verifiquei o código do java mapping e estou passando o xml para o content(veja trecho abaixo):

InputStream in = null;

in = input.getInputPayload().getInputStream();

......

......

Element content = docout.createElement("Content"); 

root.appendChild(content); 

Text contentText = docout.createTextNode(getContent(streamTOString(in)));

content.appendChild(contentText);

Segue em anexo o código inteiro do Java mapping, caso queira dar uma olhada.

Uma pergunta: Se não há necessidade de eliminar o "Comunication Parameter", como faço para que ele não saia no e-mail enviado ao cliente?.... devo no comunication channel desmarcar a opção "Keep Attchaments"?.....

Obrigado pela ajuda.

Att,,

Ortiz

Former Member
0 Kudos

Ortiz, bom dia.

Verifique que você está fazendo a chamada do método(streamTOString) duas vezes para o mesmo IOStream(in).

Poderia ficar desta forma: (Contexto)

String inptxml = this.streamTOString(in);

Text contentText = docout.createTextNode(getContent(inptxml));


Mail Receiver:

Att.,

André Canalles