Skip to content

Commit ab887c7

Browse files
fix: generate_cnpj
1 parent ec373fd commit ab887c7

6 files changed

Lines changed: 52 additions & 90 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12-
- Utilitário `generate_alphanumeric_cnpj` [#741](https://github.com/brazilian-utils/python/pull/741)
12+
- Utilitário `generate_cnpj` com suporte a CNPJ alfanumérico [#741](https://github.com/brazilian-utils/python/pull/741)
1313

1414
## [2.4.0] - 2026-04-20
1515

README.md

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ False
5252
- [format\_cnpj](#format_cnpj)
5353
- [remove\_symbols\_cnpj](#remove_symbols_cnpj)
5454
- [generate\_cnpj](#generate_cnpj)
55-
- [generate\_alphanumeric\_cnpj](#generate_alphanumeric_cnpj)
5655
- [CEP](#cep)
5756
- [is\_valid\_cep](#is_valid_cep)
5857
- [format\_cep](#format_cep)
@@ -287,12 +286,16 @@ Exemplo:
287286

288287
### generate_cnpj
289288

290-
Gera uma string de dígitos CNPJ válida aleatória. Um número de filial
291-
opcional pode ser fornecido; o padrão é 1.
289+
Gera uma string de CNPJ válida aleatória. Um número de filial opcional pode ser
290+
fornecido; o padrão é 1. Use `alphanumeric=True` para gerar um CNPJ cujas 12
291+
primeiras posições podem conter dígitos e letras maiúsculas.
292292

293293
Argumentos:
294294

295-
- branch (int): Um número de filial opcional a ser incluído no CNPJ.
295+
- branch (int | str): Um número de filial opcional a ser incluído no CNPJ.
296+
Valores de filial alfanuméricos são aceitos apenas com
297+
`alphanumeric=True`.
298+
- alphanumeric (bool): Define se o CNPJ gerado deve ser alfanumérico.
296299

297300
Retorna:
298301

@@ -306,29 +309,10 @@ Exemplo:
306309
'34665388000161'
307310
>>> generate_cnpj(1234)
308311
"01745284123455"
309-
```
310-
311-
### generate_alphanumeric_cnpj
312-
313-
Gera uma string de CNPJ alfanumérico válida aleatória. Um número de filial
314-
opcional pode ser fornecido; o padrão é '1'.
315-
316-
Argumentos:
317-
318-
- branch (str): Um número de filial opcional a ser incluído no CNPJ.
319-
320-
Retorna:
321-
322-
- str: Um CNPJ alfanumérico válido gerado aleatoriamente.
323-
324-
Exemplo:
325-
326-
```python
327-
>>> from brutils import generate_alphanumeric_cnpj
328-
>>> generate_alphanumeric_cnpj()
312+
>>> generate_cnpj(alphanumeric=True)
329313
"9359QAG9000184"
330-
>>> generate_alphanumeric_cnpj('1234')
331-
"NX9K79E2123400"
314+
>>> generate_cnpj(branch="AB12", alphanumeric=True)
315+
"NX9K79E2AB1200"
332316
```
333317

334318
## CEP

README_EN.md

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ False
5151
- [format\_cnpj](#format_cnpj)
5252
- [remove\_symbols\_cnpj](#remove_symbols_cnpj)
5353
- [generate\_cnpj](#generate_cnpj)
54-
- [generate\_alphanumeric\_cnpj](#generate_alphanumeric_cnpj)
5554
- [CEP](#cep)
5655
- [is\_valid\_cep](#is_valid_cep)
5756
- [format\_cep](#format_cep)
@@ -289,12 +288,16 @@ Example:
289288

290289
### generate_cnpj
291290

292-
Generates a random valid CNPJ (Brazilian Company Registration Number) digit
293-
string. An optional branch number parameter can be given; it defaults to 1.
291+
Generates a random valid CNPJ (Brazilian Company Registration Number) string.
292+
An optional branch number parameter can be given; it defaults to 1. Use
293+
`alphanumeric=True` to generate a CNPJ whose first 12 positions may contain
294+
digits and uppercase letters.
294295

295296
Args:
296297

297-
- branch (int): An optional branch number to be included in the CNPJ.
298+
- branch (int | str): An optional branch number to be included in the CNPJ.
299+
Alphanumeric branch values are accepted only with `alphanumeric=True`.
300+
- alphanumeric (bool): Whether the generated CNPJ should be alphanumeric.
298301

299302
Returns:
300303

@@ -308,29 +311,10 @@ Example:
308311
'34665388000161'
309312
>>> generate_cnpj(1234)
310313
"01745284123455"
311-
```
312-
313-
### generate_alphanumeric_cnpj
314-
315-
Generates a random valid alphanumeric CNPJ string. An optional branch number
316-
parameter can be given; it defaults to '1'.
317-
318-
Args:
319-
320-
- branch (str): An optional branch number to be included in the CNPJ.
321-
322-
Returns:
323-
324-
- str: A randomly generated valid alphanumeric CNPJ string.
325-
326-
Example:
327-
328-
```python
329-
>>> from brutils import generate_alphanumeric_cnpj
330-
>>> generate_alphanumeric_cnpj()
314+
>>> generate_cnpj(alphanumeric=True)
331315
"9359QAG9000184"
332-
>>> generate_alphanumeric_cnpj('1234')
333-
"NX9K79E2123400"
316+
>>> generate_cnpj(branch="AB12", alphanumeric=True)
317+
"NX9K79E2AB1200"
334318
```
335319

336320
## CEP

brutils/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
# CNPJ Imports
1515
from brutils.cnpj import format_cnpj
1616
from brutils.cnpj import generate as generate_cnpj
17-
from brutils.cnpj import generate_alphanumeric as generate_alphanumeric_cnpj
1817
from brutils.cnpj import is_valid as is_valid_cnpj
1918
from brutils.cnpj import remove_symbols as remove_symbols_cnpj
2019

@@ -106,7 +105,6 @@
106105
# CNPJ
107106
"format_cnpj",
108107
"generate_cnpj",
109-
"generate_alphanumeric_cnpj",
110108
"is_valid_cnpj",
111109
"remove_symbols_cnpj",
112110
# CPF

brutils/cnpj.py

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -215,13 +215,18 @@ def is_valid(cnpj: str) -> bool:
215215
return isinstance(cnpj, str) and validate(cnpj)
216216

217217

218-
def generate(branch: int = 1) -> str:
218+
def generate(branch: int | str = 1, alphanumeric: bool = False) -> str:
219219
"""
220-
Generates a random valid CNPJ digit string. An optional branch number
221-
parameter can be given; it defaults to 1.
220+
Generates a random valid CNPJ string. An optional branch number parameter
221+
can be given; it defaults to 1. Use alphanumeric=True to generate a CNPJ
222+
whose first 12 characters may contain digits and uppercase letters.
222223
223224
Args:
224-
branch (int): An optional branch number to be included in the CNPJ.
225+
branch (int | str): An optional branch number to be included in the
226+
CNPJ. Alphanumeric branch values are accepted only with
227+
alphanumeric=True.
228+
alphanumeric (bool): Whether the generated CNPJ should be
229+
alphanumeric.
225230
226231
Returns:
227232
str: A randomly generated valid CNPJ string.
@@ -231,8 +236,23 @@ def generate(branch: int = 1) -> str:
231236
"30180536000105"
232237
>>> generate(1234)
233238
"01745284123455"
239+
>>> generate(branch="AB12", alphanumeric=True)
240+
"NX9K79E2AB1200"
234241
"""
235242

243+
if alphanumeric:
244+
branch = str(branch)
245+
branch = branch[:4] if len(branch) >= 4 else branch.zfill(4)
246+
branch = (
247+
"0001"
248+
if branch == "0000" or not _is_alphanumeric(branch)
249+
else branch
250+
)
251+
base = "".join(choices(digits * 3 + ascii_uppercase, k=8)) + branch
252+
253+
return base + _checksum(base)
254+
255+
branch = int(branch)
236256
branch %= 10000
237257
branch += int(branch == 0)
238258
branch = str(branch).zfill(4)
@@ -241,34 +261,6 @@ def generate(branch: int = 1) -> str:
241261
return base + _checksum(base)
242262

243263

244-
def generate_alphanumeric(branch: str = "1") -> str:
245-
"""
246-
Generates a random valid alphanumeric CNPJ digit string. An optional branch
247-
number parameter can be given; it defaults to '1'.
248-
249-
Args:
250-
branch (str): An optional branch number to be included in the CNPJ.
251-
252-
Returns:
253-
str: A randomly generated valid alphanumeric CNPJ string.
254-
255-
Example:
256-
>>> generate_alphanumeric()
257-
"9359QAG9000184"
258-
>>> generate_alphanumeric('1234')
259-
"NX9K79E2123400"
260-
"""
261-
262-
branch = branch[:4] if len(branch) >= 4 else branch.zfill(4)
263-
branch = (
264-
"0001" if branch == "0000" or not _is_alphanumeric(branch) else branch
265-
)
266-
267-
base = "".join(choices(digits * 3 + ascii_uppercase, k=8)) + branch
268-
269-
return base + _checksum(base)
270-
271-
272264
def _hashdigit(cnpj: str, position: int) -> int:
273265
"""
274266
Calculates the checksum digit at the given `position` for the provided

tests/test_cnpj.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
display,
99
format_cnpj,
1010
generate,
11-
generate_alphanumeric,
1211
is_valid,
1312
remove_symbols,
1413
sieve,
@@ -88,10 +87,15 @@ def test_generate(self):
8887

8988
def test_generate_alphanumeric(self):
9089
for _ in range(10_000):
91-
generated = generate_alphanumeric()
90+
generated = generate(alphanumeric=True)
9291
self.assertIs(validate(generated), True)
9392
self.assertIsNotNone(display(generated))
94-
self.assertIs(validate(generate_alphanumeric(branch="1234")), True)
93+
self.assertIs(
94+
validate(generate(branch="1234", alphanumeric=True)), True
95+
)
96+
self.assertIs(
97+
validate(generate(branch="AB12", alphanumeric=True)), True
98+
)
9599

96100
def test__hashdigit(self):
97101
self.assertEqual(_hashdigit("00000000000000", 13), 0)

0 commit comments

Comments
 (0)