Skip to content

Instantly share code, notes, and snippets.

@rafinhacarneiro
Created August 30, 2022 01:29
Show Gist options
  • Save rafinhacarneiro/0db3b4051b0bbc84f9eb64cd6a4a8234 to your computer and use it in GitHub Desktop.
Save rafinhacarneiro/0db3b4051b0bbc84f9eb64cd6a4a8234 to your computer and use it in GitHub Desktop.
Funções para gerar/validar CNPJ em Python
from random import randint
def gerar_dv(digitos: list, first_dv: bool):
digitos = digitos[0:len(digitos) - (2 if first_dv else 1)]
sequencia = list(reversed(range(2, 6 if first_dv else 7)))
sequencia = [ *sequencia, *list(reversed(range(2, 10))) ]
soma = sum([ digito * num for digito, num in zip(digitos, sequencia) ])
dv = 11 - (soma % 11)
return dv if dv < 10 else 0
def validar_cnpj(cnpj: str):
cnpj = cnpj.strip().translate(str.maketrans({ k: "" for k in [".", "-", "/"] }))
digitos = [ int(num) for num in list(cnpj) ]
dv1, dv2 = digitos[-2:]
valida1, valida2 = gerar_dv(digitos, True), gerar_dv(digitos, False)
return dv1 == valida1 and dv2 == valida2
def gerar_cnpj():
inscricao1 = str(randint(1, 99)).zfill(2)
inscricao2 = str(randint(1, 999)).zfill(3)
inscricao3 = str(randint(1, 999)).zfill(3)
filial = str(randint(1, 100)).zfill(4)
digitos = [ int(num) for num in list(f"{inscricao1}{inscricao2}{inscricao3}{filial}") ]
dv1 = gerar_dv(digitos + [0, 0], True) # Adiciona 2 números na lista para manter o tamanho (14)
digitos.append(dv1)
dv2 = gerar_dv(digitos + [0], False) # Adiciona 1 número na lista para manter o tamanho (14)
return f"{inscricao1}.{inscricao2}.{inscricao3}/{filial}-{dv1}{dv2}"
cnpj = '75.055.772/0001-20'
print(cnpj, validar_cnpj(cnpj))
cnpj = gerar_cnpj()
print(cnpj, validar_cnpj(cnpj))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment