NFeWizard-io: A Jornada até uma lib Node.js para comunicação com a SEFAZ
Criei uma Lib Node.js Open-Source Para Facilitar Comunicação com Webservices da SEFAZ
Introdução
A lib NFeWizard-io foi criada com o objetivo de simplificar a interação com os webservices da SEFAZ utilizando Node.js. A ideia era proporcionar uma solução robusta para automação de processos relacionados à Nota Fiscal Eletrônica (NF-e). Neste artigo, compartilho a minha experiência e os motivos que me levaram a desenvolver essa biblioteca. Espero que gostem!
Motivação
Trabalho em uma empresa proprietária de um software ERP WEB voltado principalmente ao setor supermercadista. Essa empresa faz parte de um grupo que tem como seu software principal um outro ERP que teve seu desenvolvimento iniciado a pelo menos 19 anos atrás, em deplhi. Nosso trabalho é desenvolver o novo ERP com técnologias WEB, como Node.js e React.
Até ai estava tudo um sonho. Um bom emprego home office, bons desafios, excelentes colegas e ambiente de trabalho. Então chegou o fatidico momento de criarmos nossos microsserviços para integração com o webservice da SEFAZ.
Como já possuíamos o código para integração utilizando a biblioteca open source ACBR e precisavamos encurtar o tempo de desenvolvimento, foi decidido migrar esse código (aplicando melhorias) a partir do delphi.
Nesse momento, meus amigos, é que os problemas de verdade começaram.
Problemas com a Biblioteca ACBR
Compatibilidade com Versões Antigas do Node.js
Após inumeros testes e erros não muito descritivos descobrimos que o ACBR só funcionava com versões antigas do Node.js (vide testes desde a versão 12 até 20), o que causava muita instabilidade sempre que algumas das bibliotecas da node_modules
eram atualizadas. Isso incluía não apenas as libs que utilizávamos diretamente, mas também as dependências dessas libs.
Integração Complexa com DLL ou SO
Quem já precisou sabe que o Node.js não é tão facilmente integrado a DLL ou SO, sendo necessário - no nosso caso - utilizar as bibliotecas 'ref-napi' e 'ffi-napi' (sim, poderíamos utilizar N-API para uma solução mais nativa, mas o tempo era curto). Ainda assim, frequentemente enfrentávamos erros de memória, como segmentation fault
(esse erro foi constante até utilizarmos versões mais antigas do Node). Isso tornava a manutenção e a confiabilidade do sistema um grande desafio.
Dependência do OpenSSL 1.1.1
Outro ponto de dificuldade foi que, conforme a documentação do ACBR, para utilizarmos sua lib precisamos do OpenSSL 1.1.1. Para rodar essa intergação em uma função lambda da AWS utilizando o framework serverless, tivemos que criar uma build com Docker usando o node:14.21.3-buster
como builder. Assim, instalávamos manualmente a versão correta do OpenSSL pelo Dockerfile, além de outras libs necessárias no sistema.
Básicamente, para testes locais com sls invoke local
precisamos utilizar a versão 16 do Node.js já que o serverless v3 não funciona na versão 14 (que é a versão mais recente onde os erros de memória não ocorrem). Sendo assim estamos propensos a vez ou outra nos depararmos com um segmentation fault
localmente. Para evitar esse problema na função lambda adicionamos ao Dockerfile a build do ambiente com a versão 14.21.3-buster do Node.js. Para deploy também é necessário estarmos pelo menos na versão 16 e instalarmos diversas libs no ubuntu (como libx11
, libgdk
, libxml2
, dentre outras).
ADENDO
A Lib ACBR não é, de forma alguma, ruim. É uma lib extremamente completa e que se integra bem com diversas linguagem.
Apenas não foi a melhor opção -NO NOSSO CASO- para Node.js.
Desenvolvimento do NFeWizard-io
Após muito tempo lutando contra o império, decidi que era hora de atacar a estrela da morte. No meu caso a estrela da morte era a dificil e morosa manutenção dos microsserviços utilizado ACBR. Então decidi criar a NFeWizard-io. Minha intenção era desenvolver uma biblioteca nativa para Node.js que resolvesse esses problemas e proporcionasse uma automação completa dos processos fiscais, de forma moderna e estável.
Funcionalidades Principais
Abaixo podem ver as atuais funcionalidades contidas na lib.
Autorização (Emissão de NFe)
Permite a submissão de notas fiscais eletrônicas para autorização junto à SEFAZ, garantindo que as NF-e sejam emitidas de forma correta e dentro dos padrões estabelecidos.
Distribuição DFe
Facilita a consulta e o download de documentos fiscais eletrônicos (DF-e), proporcionando acesso rápido e fácil a documentos fiscais importantes para a empresa.
Consulta de Protocolo
Verifica a situação atual da NF-e na base de dados do portal da Secretaria de Fazenda Estadual.
Inutilização de NFe
Facilita o processo de inutilização de números de NF-e que não serão utilizados, ajudando a manter a conformidade fiscal e evitando problemas futuros.
Consulta de Status do Serviço
Retorna o status atual dos serviços da SEFAZ, facilitando a consulta de disponibilidade.
Recepção de Eventos
Facilita o manifesto de diversos tipos de eventos relacionados à NFe, incluindo:
- Cancelamento de NFe
- Carta de Correção
- Ciência da Operação
- Confirmação da Operação
- Desconhecimento da Operação
- EPEC (Evento Prévio de Emissão em Contingência)
- Operação Não Realizada
Geração de DANFE
Geração do Documento Auxiliar da Nota Fiscal Eletrônica (DANFE), que é um resumo impresso da NF-e, facilitando o acompanhamento e conferência das notas fiscais emitidas.
Conclusão
Criar o NFeWizard-io foi uma jornada desafiadora, mas extremamente recompensadora. Foram meses de trabalho com um tempo reduzido por conta do meu emprego, faculdade e pela chegado do meu lindo filho, agora com 5 meses! Mas agora, temos uma solução robusta, moderna e estável para automação de processos fiscais. Essa biblioteca resolve os problemas que enfrentávamos com a ACBR e proporciona uma experiência muito mais confiável e eficiente -novamente, para o nosso caso-.
Caso queiram dar uma olhada, segue a página do projeto:
NFeWizard-io - GitHub
NFeWizard-io - Documentação
Se gostar deixe sua estrela!
OPEN SOURCE
NFeWizard-io é uma lib Open Source
, qualquer contribuição seja monetária, por código, documentação ou testes é extremamente bem vinda! Você pode encontrar mais informações sobre como contribuir na documentação do projeto.
Espero que minha experiência inspire outros desenvolvedores a buscar soluções inovadoras e eficazes para os desafios que enfrentam em seus projetos.