Executando verificação de segurança...
28

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.

Carregando publicação patrocinada...
4

Nossa que felicidade foi ter encontrado o teu post.

Estava quebrando a cabeça para implementar uma solução junto a ACBR, sei que ela é bem completa mas as integrações deles parecem ter parado no tempo.

Ainda não testei mas já receba os meus sinceros agradecimentos.

Uma dúvida, é possível utilizar para emição de NFC-e?

Abraço.

2

Bom dia, Felipe!

Eu não cheguei a testar a emissão com NFC-e ainda (os próximos passos para a lib serão testar o NFC-e e gerar a DANFE com QR Code para ele), porém a estrutura se assemelha muito a da NF-e (podendo chamar o mesmo método NFE_Autorizacao().

Mudando o ide.mod para 65 já implica estar emitindo uma NFC-e. Caso faça o teste me conte como foi, pode ajudar no meu processo de desenvolvimento!

1

Boa tarde, Felipe!

Passando para te avisar que acabei de finalizar uns testes internos para emissão de NFC-e e funcionou perfeitamente.

Logo menos libero uma nova release com a NFC-e homologada.

4
1
2

uso o spedNFE faz uns 6 anos, é uma biblioteca muito madura e muito bem mantida pela comunidade, pode usar com segurança, mas lembre-se que é PHP, você pode querer transformar em um micro serviço caso queira fazer o restante do seu sistema em outra linguagem (foi o que eu fiz, montagem de XML, Danfe, transmissão, cancelamento, etc estão disponíveis via API que chamo usando NodeJS).

1

Realmente, no nosso caso temos microsserviços usando uma imagem docker com ACBR.
O problema é o tempo de execução em uma função lambda e os problemas de versão das libs.

O NFewizard-io ainda está nos primeiros passos, mas já tenho muitas outras features que pretendo adiconar 🚀

2

Há tempos atrás procurei muito algo feito em Node. Cheguei a pensar em começar um projeto mas pelo falta de tempo acabei desistindo. Lida com NFe não é uma tarefa das mais corriqueiras e o ACBR apesar de completo é chato para manter. Parabéns pela inciativa!

3

Cara, que massa seu projeto. Parabéns pela iniciativa.

Já bati muita cabeça com Nfe, realmente é um desafio imenso. Já deixei a estrela no seu repositório para ajudar.

O mais surpreendente é ter feito esse projeto com 2 filhos rsrs. Eu tenho 2 filhos também e ultimamente mal tenho dado conta das minhas tarefas do trabalho.

Mas uma vez, parabéns!

2

Meus parabéns, isso é sensacional!

Você acabou de abrir portas pra um mundo que só quem trabalha ou já trabalhou com emissão de NFs sabe como é.

Espero que o projeto ganhe força

1

Muito obrigado, thayto!

Realmente, quem já trabalhou com NFe sabe o trabalho que pode dar. Espero que esse projeto ajude todos que necessitarem!

2
1

Muito obrigado, Marcos!

Realmente, foram meses com o tempo curto para conseguir chegar nesse resultado satisfatório. É muito recompensador poder ler comentários como o seu!

2

Caramba cara! Que projeto da hora!
Meus sinceros parabéns por isso. Adicionei uma estrela aqui no seu repositório.
Uma baita solução que permite um mar de novas possibilidades. Você desbloqueou um mundo!
Já trabalhei em uma empresa que possuía integração com a SEFAZ através de uma biblioteca privada, isso que você fez é absolutamente incrível!

1

Muito obrigado, dizzysch!

Obrigado pela estrela e pelo comentário! Realmente, existem bibliotecas e serviços privados para isso, mas nem todos tem a condição de pagar. A intenção é que essa lib possa ajudar o máximo de devs possível!

2
2

Boa noite, BiitBurguer!

Tem como me explicar melhor que problema está enfrentando?
Essa lib é um pacote para Node.js, para instalar basta rodar o comando npm install nfewizard-io.

Além disso para utilizar a lib é necessário ter um certificado digital A1 - Requisito para comunicação com os webservices da SEFAZ.

Qualquer coisa me manda uma mensagem no linkedin:
https://www.linkedin.com/in/maurelima/

0