35 lines
978 B
Python
35 lines
978 B
Python
import re
|
|
|
|
|
|
class CNPJ:
|
|
|
|
@staticmethod
|
|
def validate(data: str) -> bool:
|
|
|
|
# Remove caracteres não numéricos
|
|
data = re.sub(r'\D', '', data)
|
|
|
|
# Verifica se tem 14 dígitos
|
|
if len(data) != 14:
|
|
return False
|
|
|
|
# CNPJs com todos os dígitos iguais são inválidos
|
|
if data == data[0] * 14:
|
|
return False
|
|
|
|
# Calcula os dois dígitos verificadores
|
|
def calcular_digito(data, peso):
|
|
soma = sum(int(a) * b for a, b in zip(data, peso))
|
|
resto = soma % 11
|
|
return '0' if resto < 2 else str(11 - resto)
|
|
|
|
# Primeiro dígito verificador
|
|
peso1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
|
|
digito1 = calcular_digito(data[:12], peso1)
|
|
|
|
# Segundo dígito verificador
|
|
peso2 = [6] + peso1
|
|
digito2 = calcular_digito(data[:12] + digito1, peso2)
|
|
|
|
# Verifica se os dígitos batem
|
|
return data[-2:] == digito1 + digito2
|