alfac 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- alfac-0.1.0/LICENSE +0 -0
- alfac-0.1.0/PKG-INFO +16 -0
- alfac-0.1.0/README.md +0 -0
- alfac-0.1.0/alfac/__init__.py +0 -0
- alfac-0.1.0/alfac/validator.py +61 -0
- alfac-0.1.0/pyproject.toml +27 -0
alfac-0.1.0/LICENSE
ADDED
|
File without changes
|
alfac-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: alfac
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Validador de CNPJ Alfanumérico conforme novas normas do Governo (2024).
|
|
5
|
+
License: MIT
|
|
6
|
+
Keywords: cnpj,alfanumerico,validador,governo,brasil
|
|
7
|
+
Author: kleitomberg
|
|
8
|
+
Author-email: kss@cin.ufpe.br
|
|
9
|
+
Requires-Python: >=3.12,<4.0
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
|
|
16
|
+
|
alfac-0.1.0/README.md
ADDED
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from math import ceil
|
|
3
|
+
|
|
4
|
+
class DigitoVerificador:
|
|
5
|
+
"""Classe responsável pelo cálculo matemático do Módulo 11 alfanumérico."""
|
|
6
|
+
def __init__(self, conteudo: str):
|
|
7
|
+
self.conteudo = conteudo.upper()
|
|
8
|
+
self.pesos = []
|
|
9
|
+
|
|
10
|
+
def _calcula_ascii(self, char: str) -> int:
|
|
11
|
+
# Regra oficial: Valor ASCII - 48
|
|
12
|
+
return ord(char) - 48
|
|
13
|
+
|
|
14
|
+
def _gerar_pesos(self):
|
|
15
|
+
tamanho = len(self.conteudo)
|
|
16
|
+
# Repetições de 2 a 9
|
|
17
|
+
num_repeticoes = ceil(tamanho / 8)
|
|
18
|
+
for _ in range(num_repeticoes):
|
|
19
|
+
self.pesos.extend(range(2, 10))
|
|
20
|
+
self.pesos = self.pesos[:tamanho]
|
|
21
|
+
self.pesos.reverse()
|
|
22
|
+
|
|
23
|
+
def calcula(self) -> int:
|
|
24
|
+
self._gerar_pesos()
|
|
25
|
+
# Soma ponderada dos valores convertidos pelos pesos
|
|
26
|
+
soma = sum(a * b for a, b in zip(map(self._calcula_ascii, self.conteudo), self.pesos))
|
|
27
|
+
resto = soma % 11
|
|
28
|
+
return 0 if resto < 2 else 11 - resto
|
|
29
|
+
|
|
30
|
+
class CNPJ:
|
|
31
|
+
"""Classe de negócio para tratar a estrutura do CNPJ."""
|
|
32
|
+
def __init__(self, cnpj_input: str):
|
|
33
|
+
# Remove caracteres de pontuação comuns
|
|
34
|
+
self.limpo = "".join(filter(str.isalnum, str(cnpj_input))).upper()
|
|
35
|
+
|
|
36
|
+
def e_valido(self) -> bool:
|
|
37
|
+
# 1. Validação de tamanho e formato (Regex oficial do Serpro)
|
|
38
|
+
if not re.match(r'^([A-Z]|\d){12}\d{2}$', self.limpo):
|
|
39
|
+
return False
|
|
40
|
+
|
|
41
|
+
# 2. Bloqueio de letras proibidas pela norma (I, O, Q)
|
|
42
|
+
if any(c in self.limpo for c in "IOQ"):
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
# 3. Bloqueio de valores zerados (comum em testes de fumaça)
|
|
46
|
+
if self.limpo == "0" * 14:
|
|
47
|
+
return False
|
|
48
|
+
|
|
49
|
+
base = self.limpo[:12]
|
|
50
|
+
dv_informado = self.limpo[12:]
|
|
51
|
+
|
|
52
|
+
# Cálculo do DV1
|
|
53
|
+
dv1 = DigitoVerificador(base).calcula()
|
|
54
|
+
# Cálculo do DV2 (base + dv1)
|
|
55
|
+
dv2 = DigitoVerificador(base + str(dv1)).calcula()
|
|
56
|
+
|
|
57
|
+
return f"{dv1}{dv2}" == dv_informado
|
|
58
|
+
|
|
59
|
+
def validar_cnpj(cnpj: str) -> bool:
|
|
60
|
+
"""Interface simplificada para uso externo."""
|
|
61
|
+
return CNPJ(cnpj).e_valido()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
[tool.poetry]
|
|
2
|
+
name = "alfac"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Validador de CNPJ Alfanumérico conforme novas normas do Governo (2024)."
|
|
5
|
+
authors = ["kleitomberg <kss@cin.ufpe.br>"]
|
|
6
|
+
readme = "README.md"
|
|
7
|
+
|
|
8
|
+
keywords = ["cnpj", "alfanumerico", "validador", "governo", "brasil"]
|
|
9
|
+
license = "MIT"
|
|
10
|
+
|
|
11
|
+
# Mova os classifiers para cá
|
|
12
|
+
classifiers = [
|
|
13
|
+
"Programming Language :: Python :: 3",
|
|
14
|
+
"License :: OSI Approved :: MIT License",
|
|
15
|
+
"Operating System :: OS Independent",
|
|
16
|
+
"Topic :: Software Development :: Libraries :: Python Modules"
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
[tool.poetry.dependencies]
|
|
20
|
+
python = "^3.12"
|
|
21
|
+
|
|
22
|
+
[tool.poetry.group.dev.dependencies]
|
|
23
|
+
pytest = "^8.0.0"
|
|
24
|
+
|
|
25
|
+
[build-system]
|
|
26
|
+
requires = ["poetry-core"]
|
|
27
|
+
build-backend = "poetry.core.masonry.api"
|