Created
August 30, 2022 01:29
-
-
Save rafinhacarneiro/0db3b4051b0bbc84f9eb64cd6a4a8234 to your computer and use it in GitHub Desktop.
Funções para gerar/validar CNPJ em Python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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