Passo a Passo para Você Calcular o Dígito Verificador da Chave de Acesso em seus Documentos.
Um Documento Fiscal Eletrônico (DFe) é identificado a partir da sua chave de acesso, que é gerada com base em dados extraídos do conteúdo do próprio DFe e possui um Dígito Verificador.
Atualmente, documentos como a Nota Fiscal Eletrônica (NFe), Nota Fiscal de Consumidor Eletrônica (NFCe), Conhecimento de Transporte Eletrônico (CTe), Conhecimento de Transporte Eletrônico para Outros Serviços (CTe OS) e Manifesto de Documento Fiscal Eletrônico (MDFe) possuem a mesma estrutura de composição da chave de acesso, a qual veremos mais adiante.
No entanto, geralmente a dúvida que surge é quanto a geração do último componente da chave: o Dígito Verificador (DV), visto que é preciso realizar um cálculo para encontrá-lo.
Neste artigo, você vai aprender sobre como calcular o dígito verificador da chave de acesso do seu Documento Fiscal Eletrônico.
LÓGICA DO CÁLCULO
Para nosso exemplo, vamos tomar como base a geração do DV da chave de acesso da Nota Fiscal Eletrônica (NFe). Entretanto, o mesmo procedimento é válido para os outros DFes citados no início do artigo. A chave de uma NFe é composta por campos retirados do próprio XML do documento. São eles: Código da UF + Data da emissão + CNPJ do Emitente + Modelo + Série + Número da NFe + tipo de emissão + Código Numérico + Dígito Verificador.
De uma forma mais visual: 43–1712–07.364.617/0001–35–55–000–000.012.014–1-00012014–6. Para calcular o DV de uma nota, vamos utilizar todos os outros 43 primeiros caracteres, ou seja, usaremos os campos: Código da UF + Data da emissão + CNPJ do Emitente + Modelo + Série + Número da NFe + tipo de emissão + Código Numérico, ficando da seguinte forma: 4317120736461700013555000000012014100012014.
Conforme o Manual de Orientações do Contribuinte v 6.00, página 143, o cálculo do DV é feito através do módulo 11 destes 43 primeiros algarismos da chave. A partir daí, você deve multiplicar cada algarismo (da direita para a esquerda) pelos multiplicadores 2,3,4,5,6,7,8,9. Depois, realize a soma de todos os resultados e divida o total por 11.
O Dígito Verificador será o resultado da diferença entre 11 e o resultado da divisão (11 – resto).
NA PRÁTICA, O QUE ISSO SIGNIFICA?
Aplicando a teoria explicada acima em nossa chave anterior, utilizada como exemplo, teremos:
Somando cada resultado do produto entre o algarismo da chave e o multiplicador correspondente, temos:
16 + 9 + 2 + 63 + 8 + 14 + 0 + 35 + 12 + 18 + 8 + 54 + 8 + 49 + 0 + 0 + 0 + 3 + 6 + 45 + 40 + 35 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 7 + 12 + 0 + 4 + 12 + 2 + 0 + 0 + 0 + 6 + 10 + 0 + 3 + 8 = 489.
Dividindo: 489 / 11 = 44, tendo 5 como resto. Então, aplica-se na fórmula de 11 – resto: 11 – 5 = 6. O Dígito Verificador de nossa chave de acesso é o número 6.
Abaixo, confira um exemplo de cálculo feito em Visual Basic 6 (VB6), onde é necessário passar uma chave com 43 dígitos e a função retorna o dígito verificador para a chave passada:
Calcula DV
Public Function CalculaDV(chave43 As String ) Dim indice, multiplicador As Integer Dim soma, resto, digito_verificador As Integer 'Zera a soma soma = 0 'Multiplicador inicia com 9 multiplicador = 2 'Multiplica do 43° até o 1° caractere da chave For indice = Len(chave43) To 1 Step -1 'Multiplica cada digito da chave pelo multiplicador correspondente e soma soma = soma + (Mid(chave43, indice, 1) * multiplicador) multiplicador = multiplicador + 1 'Se multiplicador chegou a 2, volta para 9 If (multiplicador > 9) Then multiplicador = 2 Next indice 'Pega o resto da divisão através da função mod resto = soma Mod 11 'Dígito verificador é o resultado da subtração 11 - resto digito_verificador = 11 - resto 'Testa se o DV é maior = 10 If (digito_verificador >= 10) Then digito_verificador = 0 'Retorna o DV CalculaDV = Abs(digito_verificador) End Function |
E então? Com esse exemplo ficou muito mais simples calcular o dígito verificador da chave de acesso, não é mesmo? Compartilhe com a sua equipe!
Consulta e Download Pela Chave de Acesso não é mais permitida
O CONFAZ proibiu a consulta e download dos xmls de Documentos Fiscais Eletrônicos informando apenas a chave de acesso. Agora para realizar estes procedimentos será necessário utilizar o Certificado Digital do emitente:
Não deixe de nos seguir nas Redes Sociais!
Gostou do Post? Caso você não conheça nossa API entre em contato conosco!
Boa explicação. Só faltou informar o que acontece quando o resto da divisão é 0 ou 1, o que é um problema já que o cálculo retorna um número de 2 algarismos ao invés de 1. Nesses casos se não me engano o se considera o dígito verificador = 0;
No código VB vocês fazem essa verificação, porém está incorreto testar se o digito_verificador é igual 1, o correto seria testar se o resto da divisão é igual a 1, mas mesmo assim seria desnecessário já que o (digito_verificador >= 10) pega todos os casos.
E não deveria ser calculado o dígito verificador depois ao invés de dentro do “for” ?
Olá Maurício!! Muito obrigada pela tua observação. Com isso alteramos nosso post.
Dê uma olhada!
Grande abraço!!
Fabi Silva
Perfeito Fabi!
Abraço!
Muito bacana!!
Ajudou bastante
Olá Walery, tudo bem?
Ficamos mega felizes com seu comentário. É sempre uma alegria saber que nossos conteúdos contribuíram com alguém.
Um grande abraço!
eI , então… Na verdade não funcionou não. O validador gerado com a formula não estava correto.
Muito obrigado pela aula
Onde encontro o “Código Numérico” ?
Olá Sérgio, tudo bem?
O código numérico (cNF) é um campo que pode ser gerado pelo próprio software que emite a nota, ele pode ser um número aleatório de 8 dígitos que vai informado no campo 2 da linha B.
Caso não tenha sido gerado um código numérico aleatório, o cNF vai ser o mesmo numero da nota (nNF.)Temos este post que fala sobre o código numérico https://blog.nstecnologia.com.br/projeta-sua-nfe/
Espero ter ajudado.
Grande abraço!
Quem diria que em 2019 eu precisaria de uma rotina pra validar o DV da chave de acesso em VB6 e a encontraria no primeiro link retornado do google mesmo sem pesquisar por VB6 tendo certeza que acharia apenas em outra linguagem…
Valeu!
Esse comentário seu nos alegrou aqui em nossa tarde!! Achamos ele maravilhoso! (Alguém que ama VB6 soltou foguetes) hehe
Abraço!
Fabi Silva
Show!!!! Parabéns pelo post! muito bem explicado.
Show!!!! Parabéns pelo post! muito bem explicado.
Excelente explicação! Obrigado.
Muito obrigada, ajudou demais!!!
A fórmula caiu como uma luva para minhas necessidades!!!
A Fórmula ainda está correta? O Código numérico pode ter apenas 8 caracteres, mas no exemplo esta mostrando 9, acredito que deva estar faltando o tipo de emissão;
A Fórmula ainda está correta? O Código numérico pode ter apenas 8 caracteres, mas no exemplo esta mostrando 9, acredito que deva estar faltando o tipo de emissão;
Oii Rafael!
Obrigada por tua resposta, pois foi através dela que vimos que estava faltando ali o tipo de emissão mesmo. Já atualizamos o post.
Agora está certinho!
Valeuu!
Fabi Silva
Olá;
Muito obrigado pela explicação. Foi mto bacana!
Como meu ERP é em Php, teria como adaptar esse cálculo de uma forma bacana?
Grande abraço!
Opa Diego beleza?
Bom, hoje não temos algo pronto que possamos te passar pois nossa API já faz isso,
mas pode ser feito uma função para calcular o cDV onde vai ser passado a chave com 43 numeros
(no caso sem o cDV) e pode ser feito uma soma ponderada para passar esses valores.
Nossa API faz esse calculo automáticamente, criando a chave e já calculando o cDV e com isso
já entregando a chave completa e autorizada do documento fiscal.
Espero que tenha ajudado! Não deixa de entrar em contato para entender mais nossa API, Tu vai adorar!