Problemas entre webservices do PR e NF-e do AX – Parte 2

Como disse na parte 1 deste post, encontramos outro problema mesmo conseguindo conectar nos webservices do Paraná.

Quando uma nota fiscal era enviada, tinhamos o seguinte comportamento no histórico da NF-e:

Message Type Mesasge Status Status Description Web Service conectado
NF-e Waiting to send Created    
NF-e Sent Created 103 - Lote Recebido com sucesso NFeRecepcao
NF-e Processed Rejected 299 - XML utiliza codificação diferente de UTF-8 NfeRetRecepcao


Quando verifiquei o histórico, ficou claro para mim que havia um problema com os xmls usados nos outros web services que não o de recepção da NF-e. Ja que a mensagem de envio tinha retornado 103 - Lote Recebido com sucesso.

Como comentei no primeiro post, a SEFAZ/PR não seguiu alguns padrões do XML definidos pela W3C. Os webservices somente aceitam XMLs em que a declaração <?xml version="1.0" encoding="UTF-8"?> aparece explicitamente no xml. Os web services da SEFAZ/SP e SEFAZ/RS aceitam o XML sem essa declaração, por que implicitamente o encoding é UTF-8.

O processo de envio de mensagem usa 5 classes para formatar o XML a ser enviado ao webservice:

Prefixo: EFDocMsgFormat  
WebService Classe NF-e V1.10 Classe NF-e V2.00
NfeRecepcao _XmlSubmit_BR _XmlSubmitV2_BR
NfeRetRecepcao _XmlSubmitReturn_BR _XmlSubmitReturnV2_BR
NfeCancelamento _XmlCancel_BR _XmlCancelV2_BR
NfeInutilizacao _XmlDiscard_BR _XmlDiscardV2_BR
NfeConsulta _XmlInquire_BR _XmlInquireV2_BR


Somente a classe _XMLSubmit_BR (consequentemente a classe V2) explicitamente adiciona a declaração <?xml>.

Ainda precisamos fazer um pequeno ajuste nas outras 4 classes que geram o XML para que tudo funcione normalmente. Não é necessário alterar as classes da versão 2.00 ja que nenhuma delas sobrescreve o método write ou doFormat da classe base.

Para que tudo fucnione normalmente, basta colocar a seguinte chamada:

xmlDoc.insertBefore(
      xmlDoc.createXmlDeclaration('1.0', 'UTF-8', ''), 
      xmlDoc.documentElement());

Entre as seguinte chamadas:

xmlDoc = XmlDocument::newXml(consReciNFeElement.outerXml());

_stream.write(xmlDoc.toString());

No método write das classes: EFDocMsgFormat_XmlSubmitReturn_BR, EFDocMsgFormat_XmlInquire_BR

No método doFormat das classes: EFDocMsgFormat_XmlCancel_BR, EFDocMsgFormat_XmlDiscard_BR

Com os métodos alterados o processamento das NF-e acontece normalmente!

Abs!