cancel
Showing results for 
Search instead for 
Did you mean: 

Problemas estrutura XML - Namespace e tagcode.

former_member187533
Participant
0 Kudos

Boa tarde senhores,

Estou com um problema nos XMLs de CTe.

Estou enviando o b2b do XML, porem ele nao esta sendo aceito na automacao de entrada da empresa que estou enviando.

O problema: Meu XML esta saindo com o namespace e com as tags inapropriadas:

XML com problema:

<?xml version="1.0" encoding="UTF-8"?>

-<nm:cteProc xmlns:prx="urn:sap.com:proxy:GP1:/1SAI/TASF3F52BA39A66FDCAADA0:702" xmlns:nm="http://www.portalfiscal.inf.br/cte" versao="">

-<n0:CTe xmlns="http://www.portalfiscal.inf.br/cte" xmlns:asx="http://www.sap.com/abapxml" xmlns:n0="http://www.portalfiscal.inf.br/cte" asx:root=":CTe">

-<infCte versao="1.04" Id="CTeXXXXX">

XML correto (da sefaz):

<?xml version="1.0"?>

-<cteProc xmlns="http://www.portalfiscal.inf.br/cte" versao="1.04">

-<CTe xmlns="http://www.portalfiscal.inf.br/cte">

-<infCte versao="1.04" Id="CTeXXXXXX">

Minha solucao esta baseada no UDF no mapping.

Obrigaaado!

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Boa noite Lucas,

Isto acontece apenas com uma empresa?

Verifique no operation mapping do B2B se voce esta executando o java mapping ProxyNamespaceCleaner antes do seu mapping ou java mapping.

Espero que ajude.

Abs

João

former_member187533
Participant
0 Kudos

Joao,

Minha duvida esta exatamente nisso, utilizo o ProxyNamespaceCleaner, tanto que os XMLs de NFe estao corretos, apenas os de CTe.

Java Classsap/com/xi/nfe/map/ProxyNamespaceCleaner
Java Classb2b/XML2String
Message Mappingmm_mtB2B_NFe_to_MailPackage_cte

Abraco!

Former Member
0 Kudos

Lucas,

Voce ja monitorou na SXI_MONITOR em que passo ele "suja" as tags?

Verifique no pipeline o Receiver Grouping como esta o payload..

Alguma alteração foi feita na interface pra isso começar a ocorrer?

Tente limpar os caches.

Abs

João

Message was edited by: João Cataldi

former_member187533
Participant
0 Kudos

Joao,

Seguinte, por se tratar de um CTe, utilizei sap/com/xi/cte/map/CTB2B_CTeProxyNamespaceCleaner, entao nao esta mais vindo as tags que "sujavam o CTe.

Porem agora algumas tags estao quebrando tabulacao. A TAG <UF>, esta quebrando no fechamento da tag fica </UF em uma linha e o > em outra. Ocorrendo erro.

Muito estranho!

Abraco!

Former Member
0 Kudos

Boa tarde Lucas,

Verifique no mapeamento ou no canal de comunicação está com o content-econding = BASE64.

Isso pode ter sido setado via dynamic configuration dentro do JavaMapping ou dentro de uma UDF no seu mapping.

Eu vi aqui que voce tem o proxyNamespaceCleaner e depois mais dois mapeamentos, teste esse mapping mm_mtB2B_NFe_to_MailPackage_cte e veja se não é ele que esta quebrando a tabulação.

Abs

João

former_member187533
Participant
0 Kudos

Joao,

Quando vou no CC e marco a opcao Content Encoding para base64, o anexo passa a ser um .bit.

Testo o mapping, e nao existe quebra de tabulacao. Muito estranho meu amigo.

Abraco!

Former Member
0 Kudos

Bom dia Lucas,

No seu canal de comunicação esta marco Keep Attachments?

Se não estiver marque e coloque o content-ecoding base64 para vermos como sai.

Neste canal tem algum adapter module?

Primeiro eu tentaria ver onde isto ocorre,

olhe na SXI_MONITOR a mensagem da CTe e veja pelo pipeline onde ele perde a formatação,

verifique estes payloads:

De uma olhada no canal pra ver se já chega desformatado nele pelo RWB.

Abs

João.

former_member187533
Participant
0 Kudos

Joao,

Muito obrigado pela ajuda!

Entao o keep attachment esta flegado sim.

Quando altero para base64 no CC, ele envia em anexo um .bit com o conteudo do e-mail. Com o texto do email, loucura.

Se eu pego o XML do Payload, ele esta funcionando normalmente. Inclusive valida.

O problema esta na saida. Inclusive no RWB, esta sem quebra de linha.

Abraco!

Former Member
0 Kudos

Boa noite Lucas,

Imagino que se no RWB está OK, deveria chegar ok.

Quando voce recebe no seu email tambem vem invalido?

Como estão abrindo o XML?

Abs

João

Former Member
0 Kudos

Bom dia Lucas, qual versa-o do deu PI?

Isso parece problema nos module adpter, na hora TransformBean

localejbs/AF_Modules/MessageTransformBean ou depende do jeito que usa tem o PayloadSwapBean.

Da uma olhada nessas notas:

SAP Note 748024: Here you can download the XSD structure of the Mail Package.

SAP Note 794943: Description of the module “PayloadSwapBean”

SAP Note 793922: Description of the module “MessageTransfo

abs

rhviana
Active Contributor
0 Kudos

Coloca NONE no adapter brow !

former_member187533
Participant
0 Kudos

Fala gurizada,

Valeu pela ajuda ai!!

Entao, se eu coloco none no adapter, ele a cada x caracteres quebra a linha. (se eu ajusto na mao essas linhas, estoura erro de "Assinatura Invalida")

Se eu coloco base64 vem o .bin dos infernos.

Estou fazendo o teste utilizando os modules citados pelo grande Wesley!

Abraco!!

rhviana
Active Contributor
0 Kudos

Cara,

Tenho solução via javamapping e UDF, ambas funcionam, acredito que você deve ter feito algo errado no parametro Content-type:

No exemplo abaixo estou utilizando multpart/mixed- Anexo + texto

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

No seu voce deve utilizar apenas application/xml, caso voce envie apenas o XML em Anexo.

Da uma olhada no seu mensagem mapping exatamente esse ponto.

Abracos

former_member187533
Participant
0 Kudos

Ricardo,

Agora tu citou um ponto interessante.

Teste meu mapping e a resposta dele fica:

Content_Type         multipart/mixed; boundary=--AaZz

Content                   ----AaZz

<html> <header> </header><body><p><b>

(seguido por todo o texto do email)

Abraco!

rhviana
Active Contributor
0 Kudos

Opa agora sim !

Seguinte, poderia tirar uns prints do seu mapping ?

Você tem XML em anexo + corpo te texto ou apenas XML ?

Você já chegou a ver esse meu javamapping ?

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

Tipo está meio antigo, não tem CTe mais é uma so uma adaptação simples, já resolve.

Att,

VIana.

former_member187533
Participant
0 Kudos

Ricardo,

Valeu a ajuda!!

Entao, eu utilizo o UDF com corpo de email, assim:

Agora que vi, foi exatamente seu codigo que usei! hahahaha

(ajustado para CTe).

Ja te devo umas cervas a horas!

Abraco!

rhviana
Active Contributor
0 Kudos

Opa pera ai meu brother !

Pq o seu Content_disposition está em branco ?!

É nele que voce deve mapear o anexo, ou você tb pode fazer direto no content_type, estou tentando localizar o meu documento mega antigo aqui para te postar, pq B2B parei de usar via MM, vou direto para javamapping.

Como está mapeado o content_type, pode ser ai que está causando o anexo como .bin.

Monstre ai

former_member187533
Participant
0 Kudos

Entao Ricardo, eu mapeio tudo no content_type mesmo, dentro do UDF.

Acha melhor eu jogar isso no content_disposition?

Por que adotou via javamapping? Acha melhor?

Abraco!

rhviana
Active Contributor
0 Kudos

Cara to tentando postar meu documento mais nao aceita DOC.

Cara adotei javamapping, na minha opnião, por ser mais prático, da um trabalho gigante fazer no mensagem mapping ou interface mapping pois você precisa criar várias UDF´s para fazer as devidas extrações etc..

To tentando postar mais está complicado, o segredo está exatamente ai nesse content_type velho, por isso está saindo .bin no seu anexo.

Não precisa jogar no content_disposition, você consegue fazer isso com esse código abaixo:

Imports: com.sap.aii.mapping.api.*;javax.xml.parsers.*;org.w3c.dom.*;

public String getText(String body,String attachment,String filename,String boundary,String ext,Container container){

//write your code here

String CRLF = "\r\n";

          String output = new String("");

          output = "--" + boundary + CRLF

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

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

                    + body + CRLF

                    + "--" + boundary + CRLF

                    + "Content-Type: application/xml; name=" + filename + ext + CRLF

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

                    + attachment + CRLF;

          return output;

Att

rhviana
Active Contributor
0 Kudos

Vamos la vou tentar postar novamente.

Mapeamento do content_type via mensagem/interface mapping:

CONSTANT: multipart/mixed; boundary="TEXTO_ANEXO"

Agora o segredo mortal, no Content você vai utilizar esse MIME: multpart/mixed para separar o que é texto e anexo e mapear o Content_disposition e o Content_Type.

TEXTO_ANEXO - COLOQUEI NA IMAGEM ERRADO NÃO É CONSTANT: TEXTO_CORPO

UDF: DYNAMICNAME

Imports: com.sap.aii.mapping.api.*;javax.xml.parsers.*;org.w3c.dom.*;

public String DynamicName(String xml,Container container){

AbstractTrace trace = container.getTrace();

try {

InputStream in = new ByteArrayInputStream(xml.getBytes("utf-8"));

// Parse the xml

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

Document doc = builder.parse(in);

Node node = (Node) doc.getElementsByTagName("infNFe").item(0);

if (node.hasAttributes() && !node.getAttributes().getNamedItem("Id").equals("")) {

xml = node.getAttributes().getNamedItem("Id").getNodeValue();

} else {

trace.addWarning("Dynamic Subject failed: empty or missing NF-e Id!");

}

} catch (Exception e) {

trace.addWarning("Dynamic Subject failed: " + e);

}

return xml;

UDF BODY

public String Body(String id,Container container){

String text = new String("");

text = "Segue anexo o arquivo XML respectivo a NFe/Cancelamento de NFe de número " + id + " \n\rQualquer dúvida entre em contato pelo endereço eletrônico: <XXXXXX> \n\rOu pelo número: <XXXXXXX> \n\rAtenciosamente,\n\rEMPRESA SUA.";

return text

}

UDF GETTEXT - SEGREDO MAGICO MISTER "M"

Imports: com.sap.aii.mapping.api.*;javax.xml.parsers.*;org.w3c.dom.*;

public String getText(String body,String attachment,String filename,String boundary,String ext,Container container){

//write your code here

String CRLF = "\r\n";

          String output = new String("");

          output = "--" + boundary + CRLF

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

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

                    + body + CRLF

                    + "--" + boundary + CRLF

                    + "Content-Type: application/xml; name=" + filename + ext + CRLF

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

                    + attachment + CRLF;

          return output;

}

Curte a config no adaptador como NONE !

Adapter Mail - Enconding None

Cara com isso acho que você já tem uma mega bússola, abracos,

Ricardo Viana.

former_member187533
Participant
0 Kudos

Ricardo,

Consegui resolver minha duvida anterior, mas surgiu uma nova! haha

Aonde eu devo fazer o RFCLookup para buscar o e-mail?

Pois esta estourando erro de adress mail not found.

Abs!

rhviana
Active Contributor
0 Kudos

Lucas boa tarde,

Cara você está utilizando MM ou JavaMapping ?

Att

former_member187533
Participant
0 Kudos

Ricardo,

Estava fazendo o RFCLookup dentro de um UDF no antigo mapping, utilizando o teu vou ter que fazer diferente.

Abraco!

rhviana
Active Contributor
0 Kudos

Ok.

O que está dando de erro ? Não está acessando ? Você já verificou a runtimeworkbench ?

Abracos

rhviana
Active Contributor
0 Kudos

Cara,

Mais ou menos, o RFClookup é apenas para buscar o e-mail.

Tem várias soluções via MM, eu tenho duas, por isso resolvi partir para javamapping para ficar mais simples.

Mais qual é a sua dúvida, como posso te ajudar ?

former_member187533
Participant
0 Kudos

Entao Ricardo,

O erro que esta dando eh esse:

De acordo com a tua solucao, fiz o MM desta maneira:

E no operation mapping estou usando o sap/com/xi/nfe/map/ProxyNamespaceCleaner seguido pelo MM.

Pergunta eh, aonde encaixo o RFCLookup?

Abracooo!

rhviana
Active Contributor
0 Kudos

O erro está claro, você já percebeu onde ?

Você não está mapeando nada para campo "TO" da estrutura do XML.

O campo content é mapeado para separar o anexo do texto, porém lá não existe o e-mail.

Seguinte no campo TO, voce precisa mapear o RFCLOOKUP com o BS (Business system) e CC mais a RFC tipo essa imagem abaixo:

Cria uma UDFzinha antes para extrair a chave de acesso da procString com o comando abaixo:

BufferedReader inpxml = new BufferedReader(new InputStreamReader(in));

String idNFe = "";

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

Na retrievelMail coloca um campo mais

Imports: com.sap.aii.mapping.api.*;com.sap.aii.mapping.lookup.*;javax.xml.parsers.*;org.w3c.dom.*;

public String retrieveMailAddress(String CHAVEDEACESSO, String busSystem,String comChannel,Container container){

Channel channel = null;

RfcAccessor accessor = null;

//send the NFe to an admin in case the retrieve fails

String email = new String();

AbstractTrace trace = container.getTrace();

try {

// Retreive the communication channel

channel = LookupService.getChannel(busSystem, comChannel);

// Get a RFC accessor for the channel

accessor = LookupService.getRfcAccessor(channel);

// Define the RFC Request Message

String req = "<ns0:SUA RFC AQUI O NOME xmlns:ns0='urn:sap-com:document:sap:rfc:functions'><IC_CNPJ>" + cnpj + "</IC_CNPJ></ns0:SUA RFC AQUI O NOME>";

// Create the xml inputstream

InputStream inputStream = new ByteArrayInputStream(req.getBytes("UTF-8"));

// Create xml payload

XmlPayload payload = LookupService.getXmlPayload(inputStream);

// Execute lookup

XmlPayload result = accessor.call(payload);

// Get the response

InputStream resp = result.getContent();

// Parse the response

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

Document doc = builder.parse(resp);

Node node = (Node) doc.getElementsByTagName("NOME DO CAMPO DE EXPORT (EMAIL)").item(0);

if (node.hasChildNodes() && !node.getFirstChild().getNodeValue().equals("")) {

email = node.getFirstChild().getNodeValue();

}

} catch (Exception e) {

trace.addWarning("RFC Lookup Failed: " + e);

} finally {

// Close the accessor in order to free resources.

if (accessor!=null) {

try {

accessor.close();

} catch (Exception e) {

trace.addWarning("Error while closing accessor: " + e);

}

}

}

return email;

}

Recomendo você criar uma RFC no GRC passando a chavedeacesso na /xnfe/nfehd, para buscar o CNPJ correto e ir buscar na EKKO ou EKPO ou voce criar uma tabela temporaria dentro do GRC com todos CNPJ´s e emals.. pensa na melhor solução ai.

Mais com isso voce já consegue resolver.

Lembrando que esse codigo acima falta o parametro chave, basta você incluir.

Abracos,

Viana.

Message was edited by: Ricardo Viana

former_member187533
Participant
0 Kudos

Fala Ricardo!

A saga continua...

Desenvolvi a RFC conforme falou, porem nao estou conseguindo buscar o email:

Meu mapping, ficou assim:

Esta ok?

Obrigado!!!

Former Member
0 Kudos

Boa tarde Pessoal,

Lucas,

Você está chamando a RFC dentro da UDF?

Você pode chamar um RFC no mapping usando a função de conversão RFC LOOKUP, e não precisa fazer na mão no Java.

Mas como voce já está com a solução encaminhada, repare que você não passa nenhum parâmetro para a que a RFC busque o email, você precisa passar o accesskey.

Abs,

João.

Former Member
0 Kudos

Lucas,

Repare que o Ricardo já até mostrou como fazer acima:

"Cria uma UDFzinha antes para extrair a chave de acesso da procString com o comando abaixo:

BufferedReader inpxml = newBufferedReader(newInputStreamReader(in));

String idNFe = "";

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

Abs

João

rhviana
Active Contributor
0 Kudos

Lucas bom dia,

Conseguiu algo ?

Posso ajudar em alguma coisa ?

Se você ler o início da minha wiki, estou explicando o motivo para buscar via chave de acesso, pois, nos XML´s de evento não tem o CNPJRec então sua solução fica "furada".

Cara estou a disposição,

Att,

R.Viana.

Answers (0)