Nota Fiscal Eletrônica - A bagunça
By Ricardo
Vamos tratar de algo exclusivamente brasileiro: a NFe, Nota Fiscal Eletrônica. Essencialmente é um XML enviado via uma requisição SOAP, processada por cada SEFAZ (Secretaria da Fazenda). O comportamento desses XMLs e desses Webservices é definido pelo manual da NFe (“Manual de Orientação ao Contribuinte”, ou algo parecido), o qual todos os estados devem seguir. Ou não.
Recentemente eu comecei a dedicar um tempo considerável no meu emprego para lidar com isso. Eu não gosto de XML e muito menos de SOAP, mas é o jeito. Antigamente tínhamos um applet Java (urgh!) que cuidava da leitura de certificados A3 (smartcards, tokens, etc) nas máquinas dos clientes. Hoje, como o Java está essencialmente perdido no Chrome, migramos para um programinha que instalamos na máquina do cliente (que eu que fiz :D). Esse pequeno aplicativo recebe requisições, redireciona tudo para a SEFAZ apropriada, processa o resultado e retorna para a aplicação (Web). Não irei entrar em muitos detalhes técnicos de como isso funciona por ser parte de uma ferramenta comercial, e portanto não estou autorizado (coff…).
Bom, desenvolvido o programa, um cliente no Paraná resolveu testar tudo, e percebeu que não conseguia nem verificar o status do serviço da NFe de seu estado na aplicação. Bateu o pânico: meu deus, aonde foi que eu errei? Acontece que eu não errei: a SEFAZ do Paraná errou!
O problema na realidade está em como o serviço foi especificado no Paraná. Por se tratar de um webservice em SOAP, há um WSDL que descreve o serviço, indicando como devem ser feitas, entre outras coisas, as requisições. Se pegarmos, por exemplo os arquivos WSDL do RS e do PR para o serviço NfeStatusServico
e verificarmos a tag <soap:operation>
e o atributo soapAction
, veremos que são diferentes:
RS:
<soap:operation soapAction="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2/nfeStatusServicoNF2" style="document"/>
PR:
<soap12:operation soapAction="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico3/nfeStatusServicoNF" style="document"/>
A lista dos serviços, btw, está disponível aqui.
Há duas diferenças sutis nos endereços: NfeStatusServico2
vs. NfeStatusServico3
e nfeStatusServicoNF2
vs. nfeStatusServico3
. Essas diferenças são pequenas, mas para o C#, são serviços completamente diferentes. Isso me obriga a adicionar referências à ambos, o que força a minha a minha aplicação ter verificações de com qual estado estamos nos comunicando, e então chamar métodos diferentes que fazem, essencialmente, a mesma coisa.
O mais interessante disso tudo é que há um manual, e que isto está mais ou menos especificado lá. Bom, pelo menos o nome do serviço está. Se o Paraná tivesse seguido a especificação/padrão da coisa, que aparentemente indicava que deveria se manter a URL da versão 2.00 do serviço mesmo na versão 3.10, isto não seria um grande problema. Como disse um colega de trabalho: o Paraná é a Rússia do Brasil 1
Mas o problema não encerra por aí. A Bahia também cometeu gafes nos nomes dos serviços, permanecendo com os nomes da versão 1.00. Considerando novamente a tag <soap:operation>
do WSDL do serviço NfeStatusServico
da Bahia, temos:
<soap:operation soapAction="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico/nfeStatusServicoNF" style="document"/>
Ali temos NfeStatusServico
, que é diferente do NfeStatusServico2
do RS e do NfeStatusServico3
do PR. Sim, mais uma referência de serviço no projeto, mais um if
, mais um método, mais código, mais testes… mais tudo. *sigh*
Seguir uma especificação aparentemente é pedir demais. E aparentemente eu não estou sozinho nesta história de ter de lidar com isso. Sinceramente, eu penso que os serviços de NFe deveriam ser responsabilidade do governo federal e não estadual, e que deveria ter um único endereço para lidar com isto. Evitaria uma série de problemas (e adicionar outros, como single point of failure, mas ninguém se importa com isso… :D) e tornaria a minha vida muito mais simples. E provavelmente a de muita gente também. Ou pelo menos se os estados seguissem a especificação ou o padrão da coisa… mas daí estou pedindo demais já.
Brasil :-(