Cálculo do dígito verificador

O dígito verificador é usado para verificar e validar a autenticidade de um valor numérico. A Inscrição Estadual possui o formato NNNNNNNN-DD, com dígito verificador duplo.

O dígito verificador das Inscrições Estaduais do Estado do Paraná é calculado da seguinte maneira:

  • Cálculo do primeiro dígito: módulo 11 com pesos de 2 a 7, aplicados da direita para esquerda, sobre as 8 primeiras posições.
  • Cálculo do segundo dígito: módulo 11 com pesos de 2 a 7, aplicados da direita para esquerda, sobre as 9 primeiras posições (inclui o primeiro dígito).
 
Passo a passo do cálculo

1º Passo: 

Multiplicar, da direita para esquerda, cada algarismo por pesos de 2 a 7, respectivamente, somar os resultados, calcular o módulo 11 e subtrair de 11. Se resto for 1 u 0, veja observação abaixo.

  • 1 2 3 4 5 6 7 8 (CAD)
  • 3 2 7 6 5 4 3 2 (pesos)
  • => 8x2 + 7x3 + 6x4 + 5x5 + 4x6 + 3x7 + 2x2 + 1x3
  • => 16+ 21 + 24 + 25 + 24 + 21 + 4 + 3 = 138
  • Cálculo de módulo 11 (resto da divisão por 11)
  • 138 / 11 = 12 => resto 6 (módulo11)
  • 11 - 6 = 5 (1º dígito verificador)

2º Passo: 

Acrescentar o 1º dígito calculado ao CAD.

  • 123.45678-5

3º Passo: 

Repetir 2º passo ao CAD do 3º passo.

  • 1 2 3 4 5 6 7 8 5 (CAD)
  • 4 3 2 7 6 5 4 3 2 (pesos)
  • => 5x2 + 8x3 + 7x4 + 6x5 + 5x6 + 4x7 + 3x2 + 2x3 1x4
  • => 10 + 24 + 28 + 30 + 30 + 28 + 6 + 6 + 4 = 166
  • Cálculo de módulo 11 (resto da divisão por 11)
  • 166 / 11 = 15 => resto 1 (módulo 11)
  • 11 - 1 =  10

Obs: como cada dígito significa um algarismo, no caso do resto ser 1 ou 0, gerando "dígitos" 10 e 11, definimos o dígito como sendo 0.

4º Passo: 

Resultado final

  • CAD 123.45678-50
 
Exemplo do algoritmo em Access Visual Basic

Public Function verifica_CAD_PR(CAD As Variant) As Boolean
 
Dim Cad1 As String, CAD2 As String
Dim Soma As Integer, Digito As Integer
Dim i As Integer, j As Integer
Dim Controle As String , Mult As String

'Identifica as 2 partes do CAD
CAD = Format (CAD,"0000000000")
CAD1 = Left$ (CAD, 8)
CAD2 = Right$ (CAD,2

'Inicializa a variável Controle
Controle = ""

' Multiplicadores que fazem parte do algoritmo de checagem
Mult = "32765432"

'Loop de verificação
For j = 1 To 2
  Soma = 0
  For i = 1 To 8 
    Soma = Soma + (Val(Mid$(CAD1,i,1)) *   (Val(Mid$(Mult,i,1)))
  Next i
  If (j  = 2) Then Soma = Soma + (2 * Digito)
    Digito = 11 - (Soma Mod 11)
  If (Digito = 10 Or Digito = 11) Then Digito = 0
    Controle = Controle + Trim$(Str$(Digito))
  'Sequência de multiplicadores para Cálculo do segundo dígito
  Mult = "43276543"
Next j
 
'Compara dígitos calculados (Controle) com dígitos informados (CAD2)
If (Controle <> CAD2) Then 
  verifica_CAd_Pr = False
 Else 
  verifica_CAD_PR = True
 End If

End Function