O lado técnico da importação automática das NF-es via SEFAZ
Uma das maiores dificuldades das empresas transportadoras é, sem sombra de dúvidas, a captura de XMLs de NF-es emitidas pelos seus clientes. Por conta disso, o layout XML da NF-e possui o Grupo X – Informações do Transporte da NF-e. Nele, o emitente pode inserir o CNPJ da empresa transportadora para que a NF-e seja disponibilizada via SEFAZ. Dessa forma, ao realizar a emissão da nota fiscal, o emitente está indicando à SEFAZ que o transportador com um CNPJ designado, através do seu certificado digital, poderá realizar o download do XML completo da NF-e.
Como Funciona a Disponibilização de Notas Via SEFAZ
A disponibilização de notas via SEFAZ acontece através de um webservice que deve ser consumido, na maioria das vezes, pelo sistema TMS da empresa transportadora. Este webservice irá nos retornar um lote zipado de até 50 XMLs, juntamente com o último NSU do lote e o último NSU disponível para a empresa que estamos consultando. O NSU (Número Sequencial Único) é um número gerado e gerenciado pela SEFAZ que ajuda a identificar se o documento é um XML de uma NF-e, uma carta de correção ou um evento. Portanto, dentro do mesmo lote podem existir XMLs distintos, o que obriga o sistema a ler cada um deles e identificar aqueles que são XMLs completos de NF-es. No geral, o workflow final do cenário completo funciona como o do diagrama a seguir:
Este é um cenário que ocorre em vários sistemas TMS que dependem do cliente para dizer quando ele deve ir à SEFAZ e realizar o download das notas fiscais. Neste caso, o cliente deve realizar a requisição ao sistema manualmente, para que ele utilize o webservice e consulte os últimos NSUs disponibilizados pela SEFAZ. Após aguardar que todos os XMLs tenham sido importados, então o cliente pode dar continuidade no seu processo de emissão de CT-es.
Neste cenário, não estou entrando no mérito do funcionamento em si, visto que este pode funcionar perfeitamente. Porém, é necessário apontar algumas implicações que este cenário pode trazer no ponto de vista técnico de sua implementação. Alguns pontos a serem ponderados são:
Tempo de Disponibilização das NF-es via SEFAZ
A sincronização das notas fiscais entre a SEFAZ estadual e a nacional não acontece de forma síncrona. Normalmente, existe um delay desde a emissão até a disponibilização da NF-e no webservice que o sistema irá consumir, podendo ser maior ou menor, dependendo de uma série de fatores, como a latência de comunicação entre os servidores da SEFAZ, o tamanho da fila de sincronização, o tempo do processamento da nota após o recebimento no servidor nacional, entre outros. Nas minhas experiências, já presenciei tempos de disponibilização discrepantes, coisas como 5 segundos ou 5 horas.
Indisponibilidade da SEFAZ
Os servidores estaduais possuem cronogramas de manutenção distintos e os períodos de instabilidade também podem ser frequentes, acarretando lentidões no sincronismo das notas entre os servidores.
Uso Indevido
Em casos onde há repetidas tentativas de realizar o consumo do webservice sem o devido sucesso da requisição, a SEFAZ pode bloquear o acesso do sistema temporariamente, impedindo o download de novos lotes.
Travamento do Sistema
Em casos onde há vários loops para capturar diversas notas fiscais disponibilizadas em lotes distintos, o sistema pode apresentar travamento devido à demora no tempo de resposta, acarretando uma deficiência na experiência (e na paciência) do usuário.
Tendo em vista todos estes aspectos, eu e meu time de desenvolvimento resolvemos abstrair todo esse processo do cliente, a fim de agilizar a captura de notas fiscais e aumentar a disponibilidade do download das informações da NF-e pelo nosso sistema TMS SIIMP. Com isso, criamos um serviço exclusivamente dedicado, que realiza a sincronização das notas fiscais disponíveis, controla a quantidade de requisições simultâneas via webservice e gerencia os NSUs de forma totalmente automática.
Em vez do usuário realizar a requisição à SEFAZ sempre que quiser baixar novas notas, o nosso serviço automatiza essas requisições realizando o download do XML da NF-e previamente. Assim, quando o usuário requisitar uma nota fiscal, o sistema irá verificar se esse serviço já realizou o download prévio. Em caso positivo, a nota e todas as suas informações são importadas mais rapidamente para o sistema.
Funcionamento da Fila de Requisições
Basicamente, este serviço coloca as requisições de webservice de todos os CNPJs dos nossos clientes em uma fila. O primeiro CNPJ da fila realiza a requisição à SEFAZ e, se houver notas fiscais disponíveis no lote retornado, importa os XMLs e extrai todas as informações, cadastrando em um banco de dados dedicado à este serviço. Assim, quando o usuário solicitar uma chave de uma NF-e, o banco do serviço já terá conhecimento dos dados da nota fiscal.
- Se a requisição sendo executada for bem sucedida, e ao final ainda houverem NSUs para sincronizar em futuros lotes, o serviço recoloca o CNPJ no final da fila.
- Se a requisição sendo executada for bem sucedida, e o último NSU disponível no webservice for igual ao último NSU baixado via webservice, o CNPJ do cliente é removido da fila de execução temporariamente para agilizar a sincronização dos demais.
- Se as requisições da fila acabarem a qualquer momento, o serviço recoloca todos os CNPJs novamente na fila.
- A fila toda é executada entre 5 e 10 minutos, dependendo da quantidade de NSUs disponíveis para cada CNPJ. Por isso, a cada 10 minutos, o serviço recoloca todos os CNPJs na fila (pois novos NSUs podem ter sido disponibilizados). O número de conexões simultâneas ao webservice pode aumentar ou diminuir, dependendo do tempo de execução da fila por completo.
- Se um erro ocorrer durante a sincronização de notas fiscais, o serviço recoloca a requisição no começo da fila, e tenta executá-la novamente. Se o erro persistir por até três vezes, coloca a requisição no fim da fila para dar lugar à próxima requisição.
- Se o cliente pesquisar uma NF-e pela chave, o serviço verifica se ela já foi importada em algum momento. Se não for encontrada, ele realiza uma requisição no mesmo momento para a SEFAZ, solicitando o XML referente àquela chave de acesso. Em caso de sucesso, o serviço retorna os dados da nota fiscal.
Abstraindo este processo de importação de notas fiscais em um serviço dedicado, conseguimos otimizar a captura de dados e aumentar drasticamente a disponibilidade, pois o usuário pode pesquisar a chave da nota fiscal diretamente, sem ter que se preocupar com todo esse lado técnico da sincronização via SEFAZ.
Atualmente, este serviço já conta com funcionalidades estendidas, agregando mais tipos de filas para checagens de notas fiscais em origens diferentes da SEFAZ (como caixas de e-mail, FTPs, armazenamentos externos, entre outros). Com isso, conseguimos abstrair ainda mais essa dificuldade do cliente, tornando a captura de notas fiscais um processo totalmente automatizado, ganhando agilidade no dia-a-dia do cliente e agregando valor ao nosso TMS SIIMP.
Autor: Gustavo Fernandes