[NFe 2.0] Solucionando problemas SEFAZ-PR
Bom dia pessoal,
Recentemente entrei em um novo projeto onde foi necessário realizar a comunicação com o SEFAZ-PR (o mais chato diga-se de passagem) para emissão da NF-e. Onde encontramos algumas dificuldades e gostaría de compartilhar com a solução.
O Problema
Quando enviamos o xml para o SEFAZ-PR validar recebemos o código de rejeição 215(Erro de validação no schema), mesmo que ele tenha sido validado contra o schema oficial.
Causa e explicação
De acordo com os comunicados que podem ser lidos aqui e aqui. A SEFAZ-PR explica que o xml está sendo rejeitado devido a falta de declaração do atributo namespace na tag NFe. Por exemplo:
XML enviado ao SEFAZ-PR:
<NFe>
<infNFe Id="NFe41110303126900000259550000000150531000244250" versao="2.00">
<ide>
...
</ide>
</infNFe>
</NFe>
XML esperado pelo SEFAZ-PR:
<NFe xmlns="www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe41110303126900000259550000000150531000244250" versao="2.00">
<ide>
...
</ide>
</infNFe>
</NFe>
O que ocorre é que o WCF com a intenção de melhorar a performance da comunicação, retira as duplicidades do arquivo XML, consequentemente reduzindo o tamanho do arquivo. Sendo assim a namespace da tag NFe é retirada, pois a mesma namespace é declarada na tag enviNFe.
O problema é que somente a SEFAZ-PR faz a validação da namespace na tag NFe, ou seja, não se trata de um bug do AX e sim uma validação extra exclusiva do SEFAZ-PR.
Solução
Para solucionar este problema foi disponibilizada uma DLL para que o AX realize a comunicação com o SEFAZ-PR sem a otimização do XML, disponível para download aqui. Feito o download siga os seguintes passos:
- Copie a dll para pasta bin do client do AX, algo parecido com isso: C:\Program Files (x86)\Microsoft Dynamics AX\50\Client\Bin
- Copie a dll para a pasta bin do server do AX, algo parecido com isso: C:\Program Files\Microsoft Dynamics AX\50\Server\
\Bin - Abra o DAX, e adicione uma nova referência apontando para a dll do client. AOT > References > Botão direito > Add references > Browse.
- Abra o método “createBinding” da classe EFDocMsgTransport_WebServiceV4_BR, classe responsável pela comunicação entre AX x SEFAZ-PR e cole o código abaixo.
- Reinicie a AOS.
private System.ServiceModel.Channels.Binding createBinding()
{
System.ServiceModel.Channels.Binding binding;
System.ServiceModel.Channels.BindingElement[] bindingElementArray;
NFe.CustomTextMessageBindingElement customTextMessageBindingElement;
System.ServiceModel.Channels.HttpsTransportBindingElement transportBinding;
;
if (this.isHttps())
{
// BP Deviation Documented
customTextMessageBindingElement = new NFe.CustomTextMessageBindingElement('utf-8', "application/soap+xml", System.ServiceModel.Channels.MessageVersion::get_Soap12());
// BP Deviation Documented
transportBinding = new System.ServiceModel.Channels.HttpsTransportBindingElement();
transportBinding.set_RequireClientCertificate(true);
// BP Deviation Documented
bindingElementArray = new System.ServiceModel.Channels.BindingElement[2]();
bindingElementArray.SetValue(customTextMessageBindingElement, 0);
bindingElementArray.SetValue(transportBinding, 1);
// BP Deviation Documented
binding = new System.ServiceModel.Channels.CustomBinding(bindingElementArray);
}
else
{
// BP Deviation Documented
binding = new System.ServiceModel.BasicHttpBinding();
}
return binding;
}
Feito isso o AX não irá mais retirar o namespace e o código de rejeição 215 desaparece :D.
Outro erro encontrado, mas já explorado pelo Matiazzo em seu weblog, veja.
Abraços,
Peterson Ferreira


