validação de cpf e cnpj

Embora o CPF (Cadastro de Pessoa Física) e o CNPJ (Cadastro Nacional de Pessoa Jurídica) sejam números do Ministério da Fazenda, não é fácil encontrar informações técnicas a seu respeito nos sites do governo – a não ser sobre alíquotas de impostos e taxas. O algoritmo de validação desses números parece um mistério, algo secreto.

Bom, ambos podem ser validados através do DV (Dígito de Verificação) módulo 11. O tal DV módulo 11 é o resto da divisão por 11. Quando o resto é 10, este número é substituído por 0 (zero). Algumas instituições como Banco do Brasil substituem o 10 por X.

Validando CPF

O CPF é composto por 9 dígitos, mais 2 DVs, resultando em um número com 11 casas decimais. Os oito primeiros são chamados de número-base, o nono define a Região Fiscal, o décimo é o DV módulo 11 dos nove anteriores, e o último é o DV módulo 11 dos dez anteriores.

A Região Fiscal especificada no nono dígito guarda informação de onde o CPF foi emitido:

  • 1: DF, GO, MS, MT, TO
  • 2: AC, AM, AP, PA, RO, RR
  • 3: CE, MA, PI
  • 4: AL, PB, PE, RN
  • 5: BA, SE
  • 6: MG
  • 7: ES, RJ
  • 8: SP
  • 9: PR, SC
  • 0: RS

Porém, misteriosamente este dígito pode conter um valor inadequado. Há CPFs válidos, emitidos no DF, com o nono dígito com valor 5 (BA, SE?).

Para validar, por exemplo, o CPF 322.394.402-87, deve-se somar os nove primeiros dígitos, cada um multiplicado pela base iniciando em 9, terminando em 0, decrescente. Assim:

3 2 2 3 9 4 4 0 2 <- CPF
x x x x x x x x x
1 2 3 4 5 6 7 8 9 <- base

O cálculo é o seguinte: 3×1 + 2×2 + 2×3 + 3×4 + 9×5 + 4×6 + 4×7 + 0x8 + 2×9. O resultado é 140, e aplicando o DV, obtendo o resto da divisão por 11, temos o número 8. Agora, ainda é necessário calcular o último dígito.

3 2 2 3 9 4 4 0 2 8 <- CPF + DV1
x x x x x x x x x x
0 1 2 3 4 5 6 7 8 9 <- base

Agora, o resultado é calculado por 3×0 + 2×1 + 2×2… = 183, cujo resto da divisão por 11 é 7. Portanto, temos os dois DVs: 87.

Validando CNPJ

O CNPJ é composto por 8 dígitos de número base, seguidos de 4 dígitos de ordem das filiais da empresa, e 2 DVs – totalizando 14 casas decimais. A base para sequência de somatória e multiplicação inicia em 9, e termina em 2.

Supondo que o CNPJ em questão é 34.703.058/0001-13, temos:

3 4 7 0 3 0 5 8 0 0 0 1 <- CNPJ
x x x x x x x x x x x x
6 7 8 9 2 3 4 5 6 7 8 9 <- base

O resultado, assim como no cálculo do CPF, dá-se por 3×6 + 4×7 + 7×8… = 177, cujo resto da divisão por 11 é 1. Agora, o mesmo procedimento, incluindo o primeiro DV já encontrado.

3 4 7 0 3 0 5 8 0 0 0 1 1 <- CNPJ
x x x x x x x x x x x x x
5 6 7 8 9 2 3 4 5 6 7 8 9 <- base

A somatória da multiplicação resulta em 179, e o resto da divisão por 11 é 3. Assim, temos os DVs com valor 13.

Como não poderia ser perfeito, há aqui um outro mistério. No caso específico do CNPJ, deve-se validar o oitavo dígito pela somatória da múltiplicação dos sete primeiros dígitos, usando como base a sequência 2 1 2 1 2 1 2. Aqui, ao invés de módulo 11, deve-se usar módulo 10. Veja:

3 4 7 0 3 0 5 <- sete primeiros dígitos do CNPJ
x x x x x x x
2 1 2 1 2 1 2 <- base

O resultado será calculado assim: 3×2 + 4×1 + 7×2 + 0x1 + 3×2 + 0x1 + 5×2 = 40. O resto da divisão por 10 é 0 (zero) – neste CNPJ já não funciona. Talvez haja alguma explicação pra isso, mas eu desconheço totalmente.

Conclusões

Se ignorarmos o cálculo do oitavo dígito do CNPJ (que aparentemente não serve pra nada), o procedimento para CPF e CNPJ é praticamente o mesmo, diferindo apenas na sequência usada como base: 0-9 no CPF e 2-9 no CNPJ.

Desta maneira, números com 11 dígitos podem ser considerados CPF, e entre 12 e 14 CNPJ? Claro que não, aqui é o Brasil. Há sempre mais uma exceção à regra. O Banco do Brasil, por exemplo, possui um CNPJ 00000191868. Nesse caso, o cálculo irá funcionar perfeitamente, porém, não se pode assumir que é um CPF.

Programa para validar CPF e CNPJ

Claro que depois de tudo isso você certamente irá escrever seu próprio código para validação. Minha lógica para isso é a seguinte:

  1. Se o número tem mais que 11 dígitos, trata como CNPJ – a menos que você force;
  2. Se for CPF a base vai de 9 a 0, caso contrário vai de 9 a 2 – sempre decrescente, claro;
  3. Recebendo o número do registro como string, pode-se guardar os dois últimos dígitos para verificação;
  4. No restante da string, executa o cálculo para gerar os dois últimos DVs;
  5. Compara os DVs gerados com os que foram guardados no item 3.

Neste código em python, chamei a função de is_brId() – se você discorda, pode mudar pro nome que quiser. Ela recebe um número (como string), e um argumento opcional que força o cálculo como CNPJ – pois qualquer número com menos de 12 dígitos é tratado como CPF. A função ignora a quantidade de dígitos na string, portanto, esse trabalho será seu. O retorno é um tuple, informando True ou False para a validação, e o tipo do registro – se é CPF ou CNPJ.

#!/usr/bin/env python
# coding: utf-8
# is_brId.py 20080218 AF
# atualizado 20080429 AF

import sys

def is_brId(value, force_cnpj=False):
    def calcdv(numb):
        result = int()
        seq = reversed(((range(9, id_type[1], -1)*2)[:len(numb)]))
        for digit, base in zip(numb, seq): 
            result += int(digit)*int(base)

        dv = result % 11
        return (dv &lt; 10) and dv or 0

    id_type = (len(value)&gt;11 or force_cnpj) \
        and ['CNPJ', 1] or ['CPF', -1]

    numb, xdv = value[:-2], value[-2:]
    dv1 = calcdv(numb)
    dv2 = calcdv(numb + str(dv1))
    return (('%d%d' % (dv1, dv2) == xdv and True or False), id_type[0])

if __name__ == '__main__':
    try:
        id = sys.argv[1]
    except IndexError:
        print 'use: %s [CPF|CNPJ]' % sys.argv[0]
    else:
        print is_brId(id)

Era isso. :)

Anúncios

14 Comentários on “validação de cpf e cnpj”

  1. O cálculo é o seguinte: 3×1 + 2×2 + 2×3 + 3×4 + 9×5 + 4×6 + 4×7 + 0×8 + 2×9. O resultado é 140, e aplicando o DV, obtendo o resto da divisão por 11, temos o número 8. Agora, ainda é necessário calcular o último dígito.

    Tem um erro nessa instração, o valor não é 140, do somatórios das multiplicações, msa sim 148, e para se conseguir a DV dos noves numeros base, o valor 8,

  2. O cálculo é o seguinte: 3×1 + 2×2 + 2×3 + 3×4 + 9×5 + 4×6 + 4×7 + 0×8 + 2×9. O resultado é 140, e aplicando o DV, obtendo o resto da divisão por 11, temos o número 8. Agora, ainda é necessário calcular o último dígito.

    Tem um erro nessa instrução, o valor não é 140, mais sim 148, de deve ser multiplicado por 10 e depois dividido por 11, so assim encontrará o resultado dea DV = 8. caso contrario, não dará 8 de forma alguma. (http://pt.wikipedia.org/wiki/D%C3%ADgito_verificador#M.C3.B3dulo_11)
    confira nessa url, o que eu acabei de afirmar acima!!!,

  3. eu verifiquei melhor o que eu escrevi acima e refiz os calculos, vcs estão certos, eu me equivoquei, desculpa ai galeira

  4. Alexandre Fiori disse:

    Na real foi bom você ter escrito, porque independente do erro inexistente que você mencionou, eu encontrei um pequeno erro no código.
    Agora já resolvi e marquei como atualizado, e está funcionando perfeitamente.

  5. rildo disse:

    Estou lendo essa materia achei interressante, mas gostaria de saaber qual a utilidade pratica desses calculos do numero do CPF, porque a gente ja recebe o cpf com 11 numeros.
    Pergunto : tem como alguem emitir um numero do cpf Falso.?

  6. alef disse:

    A utilidade prática do cálculo é criar programas que informam se um determinado número de CPF ou CNPJ é válido ou não.

  7. Cearense disse:

    Olá,

    Alguém poderia disponibilizar o código corrgido, por favor?

    Grato

    Cearense

  8. alef disse:

    O código está correto, Cearense. ;)

  9. Caio Cunha disse:

    Olá.

    No caso da conferência do oitavo número, existem dois erros:

    1. Sempre que alguma multiplicação tiver 2 dígitos, deve-se somar os dois. (ex.: 7 x 2 = 14, logo 1 + 4 = 5 e não 14.

    2. O que conta não é o resto da divisão por 10, e sim o que falta para completar o próximo múltiplo de 10.
    No exemplo:

    3 4 7 0 3 0 5 <- sete primeiros dígitos do CNPJ
    x x x x x x x
    2 1 2 1 2 1 2 <- base

    6 4 5 0 6 0 1 = 22, para chegar no próximo múltiplo de 10, que seria 30, faltam 8. portanto, neste caso, o oitavo dígito é 8.

    Abraços e obrigado pela matéria, aprendi com ela e procurei a fundo para tentar descobrir o por quê deste problema. Espero ter ajudado assim como me ajudou.

    Até mais,
    CaioToOn!

  10. Caio Cunha disse:

    Mais um detalhe, para achar isso no código, pode fazer o cálculo:

    digito = 10 – total % 10;

    Abraços,
    CaioToOn!

  11. Artus Bolzanni disse:

    Cara, fiz uma nova versão da tua função só que melhorada. Agora o usuário pode inserir caracteres entre os números que ele continua apenas lendo os números.
    Acho até que tem como melhorar ainda mais.

    def is_brId(value, force_cnpj=False):
    “””
    Versão melhorada da função validadora de CPF/CNPJ de Alexandre Fiori (@AlexandreFiori)

    #Testando
    >>> is_brId(“42226624295”)
    True
    >>> is_brId(“12345678910”)
    False
    >>> is_brId(“94151352000191”)
    True
    >>> is_brId(“422.266.242-95”)
    True
    >>> is_brId(“42|||2!266.242-95”)
    True
    >>> is_brId(“9415.1352/0001-91”)
    True
    “””
    def calcdv(numb):
    result = int()
    seq = reversed(((range(9, id_type[1], -1)*2)[:len(numb)]))
    for digit, base in zip(numb, seq):
    result += int(digit)*int(base)

    dv = result % 11
    return (dv 11 or force_cnpj) \
    and [‘CNPJ’, 1] or [‘CPF’, -1]

    numb, xdv = value[:-2], value[-2:]
    dv1 = calcdv(numb)
    dv2 = calcdv(numb + str(dv1))
    return ((‘%d%d’ % (dv1, dv2) == xdv and True or False))

  12. Alejandro disse:

    Complementando… Porque não utilizar o 8º dígito do CNPJ como dígito verificador:

    texto extraido do site CNPJ da RFB
    “[…]Até o ano de 1993, o número básico era composto de sete (7) dígitos que identificavam a empresa e o oitavo (8) dígito era um dígito verificador; como a quantidade de empresas cadastradas superou a unidade de milhão e não se optou por um recadastramento, o oitavo dígito deixou de ser um dígito verificador, o que permitiu um aumento de 90 milhões de números.[…]”
    Por este motivo NÃO se deve utilizar o 8º dígito como dígito verificador do CNPJ básico.

  13. emerson disse:

    so gostaria de saber como faço a validaçao do cpf mais nada , eeeta sat complicadinho esse em

    • Vincent disse:

      Folgado… vai aprender no site do Ministério! Ou então, agradeça ao autor e leia o comentário do Caio Cunha, que já são suficientes para te mostrar como fazer o algorítimo de validação.


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s