Pular para o conteúdo

7 min de leitura

A chave da NF-e tem 44 dígitos, e o último é uma conta que você refaz à mão.

A SEFAZ recusa e não diz onde está o erro. São 43 dígitos entrando num módulo 11, e três enganos respondem por quase toda recusa.

O sintoma: recusa sem endereço

A nota sai do seu sistema, chega à SEFAZ e volta recusada. A mensagem fala em chave de acesso, e é só o que ela fala. Nenhum campo é apontado, nenhuma posição é citada, e o arquivo que você mandou tem 44 dígitos corridos onde qualquer um deles pode ser o errado.

A parte boa dessa história é que a chave de acesso é o único pedaço do processo inteiro que não depende de ninguém do outro lado. Certificado digital, assinatura, protocolo de autorização — tudo isso é conversa com um servidor. A chave, não: ela é aritmética sobre dados que você já tem na mão, e dá para conferir inteira antes de tentar transmitir de novo.

É por isso que este texto começa pelo layout e termina numa conta. Quem entende os 44 dígitos para de mandar nota para descobrir se ela está certa.

Os 44 dígitos, campo por campo

A chave é a concatenação de oito campos de tamanho fixo, mais o dígito verificador. Tamanho fixo é a expressão que importa: não há separador, e um campo que venha com um dígito a menos empurra todos os outros para o lado sem que nada acuse nada.

Os dois primeiros dígitos são o código do IBGE da unidade da federação de quem emitiu — 35 é São Paulo, 33 é o Rio de Janeiro, 31 é Minas. É por eles que a mensagem chega à SEFAZ certa. Depois vêm quatro dígitos de ano e mês da emissão, nessa ordem, e só isso: o dia não entra na chave.

Os catorze seguintes são o CNPJ do emitente por extenso, dentro da própria chave. Depois, dois dígitos de modelo — "55" é a NF-e, "65" é a NFC-e, a de consumidor —, três de série e nove do número da nota. A série existe para separar numerações que correm em paralelo, por filial ou por ponto de venda; o número é o que aparece grande no DANFE.

Falta um dígito de tipo de emissão, em que "1" é emissão normal e os outros valores contam alguma forma de contingência, e oito dígitos de código numérico. Somados, dão 43. O quadragésimo quarto é o verificador.

Os oito do código numérico merecem um parágrafo próprio, porque quase todo mundo os trata como enfeite. Eles são sorteados na emissão, e é exatamente isso que impede alguém de adivinhar a chave da sua próxima nota a partir da anterior. Um sistema que os preenche com o número da nota, ou com zeros, torna previsível uma coisa que existe para não ser.

O dígito verificador: módulo 11, pesos de 2 a 9

A conta é a mesma família do dígito do CNPJ e da linha digitável do boleto, e muda em detalhes que são justamente onde se erra. Percorra os 43 dígitos da direita para a esquerda, multiplicando cada um por um peso que começa em 2 e sobe de um em um. Ao passar de 9, o peso volta a 2 e recomeça. Some tudo e tire o resto da divisão por 11.

Se o resto for 0 ou 1, o dígito é zero. Nos outros casos, o dígito é 11 menos o resto. A regra do zero não é arbitrariedade: com resto 1, o complemento seria 10, que não cabe numa casa decimal, e com resto 0 seria 11. Não existe dígito de dois algarismos, então a especificação resolve mandando escrever zero nos dois casos.

Escrito assim parece impossível errar. Na prática, três enganos respondem por quase toda recusa, e os três são silenciosos: o número sai plausível, a tela mostra 44 dígitos, e só a SEFAZ discorda.

Os três erros

O primeiro é percorrer da esquerda para a direita. Como a sequência de pesos é cíclica, inverter o sentido não dá erro nenhum — dá outro número. Você obtém um dígito entre 0 e 9, ele parece um dígito verificador, e é o de outra chave qualquer. Este é o mais comum e o mais difícil de ver, porque o resultado nunca tem cara de defeito.

O segundo é tratar o resto 0 ou 1 como se fosse um caso normal e escrever 11 menos o resto. Isso produz 11 ou 10, que não cabem, e o que costuma acontecer em seguida é pior do que um erro: a linguagem converte, trunca ou concatena, e a chave sai com 45 dígitos ou com o dígito errado. Como o caso só aparece em uma chave a cada onze, ele passa por todos os testes feitos com um exemplo só.

O terceiro é deixar entrar na conta o que não é dígito. CNPJ colado com ponto e barra, chave copiada do DANFE com os espaços de quatro em quatro, um traço que veio junto do PDF. Cada caractere desses ou entra na soma como zero, ou desloca todo o resto. Por isso tanto a implementação em PHP quanto a que roda no navegador começam removendo tudo o que não é algarismo, antes de qualquer outra coisa.

Há um quarto, menos frequente e mais caro: preencher um campo com menos dígitos do que ele tem. O número da nota ocupa nove posições, e uma nota de número 1234 precisa dos cinco zeros à esquerda. Sem eles a chave inteira desanda a partir dali, e o dígito verificador — que é calculado sobre o que existe — fecha certinho sobre a base errada.

O que a chave não prova

Uma chave que fecha diz uma coisa só: que aqueles 44 dígitos foram montados segundo a regra. Ela não diz que a nota existe, não diz que foi autorizada e não autoriza documento nenhum.

Quem prova a existência é o protocolo de autorização, que a SEFAZ devolve — e ele só vem depois de certificado digital e assinatura, que são conversa com o outro lado, não aritmética deste. Confundir as duas coisas é o erro conceitual mais comum de quem está começando a integrar: monta-se uma chave válida e acredita-se ter emitido alguma coisa.

A demonstração deste site calcula chaves de verdade, com a conta acima, e não emite nota nenhuma. As duas afirmações cabem juntas, e é justamente essa distinção que o parágrafo anterior descreve.

Como conferir sem depender da SEFAZ

Comece pelo algoritmo, e não pela sua chave. Pegue uma chave que você sabe que está autorizada — qualquer XML antigo serve —, remova o último dígito, rode a sua conta sobre os 43 que sobraram e compare. Se bater, o seu módulo 11 está certo e o problema está na montagem dos campos. Se não bater, pare aqui: não adianta conferir campo enquanto a conta estiver errada.

Depois confira a montagem, campo a campo, contando os dígitos de cada um. É tedioso e é onde o defeito costuma estar, porque montagem errada não dá exceção: dá outro número.

Se preferir não escrever nada, a página sobre nota fiscal eletrônica deste site tem o validador rodando no navegador: cola-se a chave e ela sai partida em campos, com o dígito recalculado ao lado do que veio. Nada é enviado para lugar nenhum — a conta acontece na sua máquina, o que também resolve a parte incômoda de colar um documento fiscal num site qualquer.

Uma observação para quem vai implementar dos dois lados. Este repositório tem a mesma conta em PHP e em TypeScript, de propósito: o navegador precisa responder enquanto a pessoa digita, e o servidor não pode confiar no navegador. O risco dessa duplicação não é o trabalho dobrado, é as duas metades divergirem — e divergência de módulo 11 não aparece, porque as duas devolvem um dígito plausível. Por isso existe um teste que roda cem casos de semente fixa nos dois lados e compara dígito a dígito. Se você duplicar o algoritmo, duplique também esse teste.