on 09-19-2013 8:17 PM
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!
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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!
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
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.
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!
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
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!!
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
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.
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
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
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.
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
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.
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 =
new
BufferedReader(
new
InputStreamReader(in));
String idNFe =
""
;
idNFe = inptxml.substring(inptxml.indexOf(
"<chNFe>"
)+
7
,inptxml.indexOf(
"</chNFe>"
));"
Abs
João
User | Count |
---|---|
13 | |
2 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.