From f68b2f2b5e9419735202b2d84ddc66b5cc20047b Mon Sep 17 00:00:00 2001 From: Joao Pedro Date: Tue, 22 Sep 2026 22:49:32 -0300 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20calcula=20o=20d=C3=ADgito=20verifica?= =?UTF-8?q?dor=20do=20processo=20jur=C3=ADdico=20com=2098=20(Res.=20CNJ=20?= =?UTF-8?q?65/2008)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++++ README.md | 12 ++++++------ README_EN.md | 12 ++++++------ brutils/legal_process.py | 14 +++++++------- tests/test_legal_process.py | 27 +++++++++++++++++++++++---- 5 files changed, 46 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e97d4fd2..4d1d28c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Cálculo do dígito verificador em `is_valid_legal_process` e `generate_legal_process`, que rejeitava números de processo reais e gerava números inválidos [#784](https://github.com/brazilian-utils/python/issues/784) + ## [2.5.0] - 2026-06-30 ### Added diff --git a/README.md b/README.md index 86dad487..ac1b1e24 100644 --- a/README.md +++ b/README.md @@ -1017,9 +1017,9 @@ Examplo: ```python >>> from brutils import is_valid_legal_process ->>> is_valid_legal_process('10188748220234018200') +>>> is_valid_legal_process('10188748320234018200') True ->>> is_valid_legal_process('45532346920234025107') +>>> is_valid_legal_process('45532347020234025107') True >>> is_valid_legal_process('00000000000000000000') False @@ -1101,13 +1101,13 @@ Exemplo: ```python >>> from brutils import generate_legal_process >>> generate_legal_process() -"45676401020238170592" +"45676401120238170592" >>> generate_legal_process(ano=2025) -"32110268020258121130" +"32110268120258121130" >>> generate_legal_process(orgao=5) -"37573041520235090313" +"37573041620235090313" >>> generate_legal_process(ano=2024, orgao=4) -"33158248820244017105" +"33158248920244017105" ``` ## Titulo Eleitoral diff --git a/README_EN.md b/README_EN.md index 0df33c5e..e5e8eeaf 100644 --- a/README_EN.md +++ b/README_EN.md @@ -1017,9 +1017,9 @@ Example: ```python >>> from brutils import is_valid_legal_process ->>> is_valid_legal_process('10188748220234018200') +>>> is_valid_legal_process('10188748320234018200') True ->>> is_valid_legal_process('45532346920234025107') +>>> is_valid_legal_process('45532347020234025107') True >>> is_valid_legal_process('00000000000000000000') False @@ -1102,13 +1102,13 @@ Example: ```python >>> from brutils import generate_legal_process >>> generate_legal_process() -"45676401020238170592" +"45676401120238170592" >>> generate_legal_process(year=2025) -"32110268020258121130" +"32110268120258121130" >>> generate_legal_process(orgao=5) -"37573041520235090313" +"37573041620235090313" >>> generate_legal_process(year=2024, orgao=4) -"33158248820244017105" +"33158248920244017105" ``` ## Voter ID diff --git a/brutils/legal_process.py b/brutils/legal_process.py index 53fdc006..a901459e 100644 --- a/brutils/legal_process.py +++ b/brutils/legal_process.py @@ -84,9 +84,9 @@ def is_valid(legal_process_id: str) -> bool: bool: True if the legal process ID is valid, False otherwise. Example: - >>> is_valid("68476506020233030000") + >>> is_valid("68476506120233030000") True - >>> is_valid("51808233620233030000") + >>> is_valid("51808233720233030000") True >>> is_valid("123") False @@ -132,9 +132,9 @@ def generate( Example: >>> generate(2023, 5) - '51659517020235080562' + '51659517120235080562' >>> generate() - '88031888120233030000' + '88031888220233030000' >>> generate(2022, 10) None """ @@ -169,9 +169,9 @@ def _checksum(basenum: int) -> str: Example: >>> _checksum(1234567) - '50' + '51' >>> _checksum(9876543) - '88' + '89' """ - return str(97 - ((int(basenum) * 100) % 97)).zfill(2) + return str(98 - ((int(basenum) * 100) % 97)).zfill(2) diff --git a/tests/test_legal_process.py b/tests/test_legal_process.py index 164eec5f..7eb8f9c7 100644 --- a/tests/test_legal_process.py +++ b/tests/test_legal_process.py @@ -60,14 +60,33 @@ def test_generate(self): self.assertIsNone(generate(year=1000, orgao=4)) self.assertIsNone(generate(orgao=0)) + def test_generate_returns_valid_check_digits(self): + # CNJ Resolution 65/2008: moving DD to the end, a valid number is + # congruent to 1 modulo 97 (ISO 7064 MOD 97-10) + for orgao in range(1, 10): + legal_process_id = generate(orgao=orgao) + reordered = legal_process_id[:7] + legal_process_id[9:] + reordered += legal_process_id[7:9] + self.assertEqual(int(reordered) % 97, 1) + self.assertIs(is_valid(legal_process_id), True) + def test_check_sum(self): - self.assertEqual(_checksum(546611720238150014), "77") - self.assertEqual(_checksum(403818720238230498), "50") + self.assertEqual(_checksum(546611720238150014), "78") + self.assertEqual(_checksum(403818720238230498), "51") + # Real legal process IDs + self.assertEqual(_checksum(504651220164047000), "94") + self.assertEqual(_checksum(6975820154013400), "61") self.assertIsInstance(_checksum(403818720238230498), str) def test_is_valid(self): - self.assertIs(is_valid("10188748220234018200"), True) - self.assertIs(is_valid("45532346920234025107"), True) + self.assertIs(is_valid("10188748320234018200"), True) + self.assertIs(is_valid("45532347020234025107"), True) + # Real legal process IDs + self.assertIs(is_valid("5046512-94.2016.4.04.7000"), True) + self.assertIs(is_valid("0069758-61.2015.4.01.3400"), True) + # Check digits off by one + self.assertIs(is_valid("5046512-93.2016.4.04.7000"), False) + self.assertIs(is_valid("10188748220234018200"), False) self.assertIs(is_valid("10188748220239918200"), False) self.assertIs(is_valid("00000000000000000000"), False) self.assertIs(is_valid("455323469202340251"), False) From 7c98d82feef11bdcff70b10833b3a0d3ac413ffe Mon Sep 17 00:00:00 2001 From: joao_almeida Date: Tue, 22 Sep 2026 22:51:14 -0300 Subject: [PATCH 2/3] docs: aponta a entrada do CHANGELOG para o PR #785 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d1d28c3..74c1db3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Cálculo do dígito verificador em `is_valid_legal_process` e `generate_legal_process`, que rejeitava números de processo reais e gerava números inválidos [#784](https://github.com/brazilian-utils/python/issues/784) +- Cálculo do dígito verificador em `is_valid_legal_process` e `generate_legal_process`, que rejeitava números de processo reais e gerava números inválidos [#785](https://github.com/brazilian-utils/python/pull/785) ## [2.5.0] - 2026-06-30 From ef1c56d2da51942e2b2a1f722bb8524b1c57d085 Mon Sep 17 00:00:00 2001 From: joao_almeida Date: Wed, 23 Sep 2026 16:00:42 -0300 Subject: [PATCH 3/3] =?UTF-8?q?docs:=20usa=20anos=20aceitos=20por=20genera?= =?UTF-8?q?te=20nos=20exemplos=20do=20processo=20jur=C3=ADdico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit generate() devolve None para anos passados, então os exemplos com 2023, 2024 e 2025 mostravam saídas impossíveis de obter. O README em português também usava o argumento inexistente ano= em vez de year=. --- README.md | 12 ++++++------ README_EN.md | 12 ++++++------ brutils/legal_process.py | 6 +++--- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index ac1b1e24..5ba23fd5 100644 --- a/README.md +++ b/README.md @@ -1101,13 +1101,13 @@ Exemplo: ```python >>> from brutils import generate_legal_process >>> generate_legal_process() -"45676401120238170592" ->>> generate_legal_process(ano=2025) -"32110268120258121130" +"84285857720267050401" +>>> generate_legal_process(year=2027) +"46214128120273030000" >>> generate_legal_process(orgao=5) -"37573041620235090313" ->>> generate_legal_process(ano=2024, orgao=4) -"33158248920244017105" +"42643452820265130129" +>>> generate_legal_process(year=2027, orgao=4) +"09392462020274013701" ``` ## Titulo Eleitoral diff --git a/README_EN.md b/README_EN.md index e5e8eeaf..0b9167a8 100644 --- a/README_EN.md +++ b/README_EN.md @@ -1102,13 +1102,13 @@ Example: ```python >>> from brutils import generate_legal_process >>> generate_legal_process() -"45676401120238170592" ->>> generate_legal_process(year=2025) -"32110268120258121130" +"84285857720267050401" +>>> generate_legal_process(year=2027) +"46214128120273030000" >>> generate_legal_process(orgao=5) -"37573041620235090313" ->>> generate_legal_process(year=2024, orgao=4) -"33158248920244017105" +"42643452820265130129" +>>> generate_legal_process(year=2027, orgao=4) +"09392462020274013701" ``` ## Voter ID diff --git a/brutils/legal_process.py b/brutils/legal_process.py index a901459e..5657bfa0 100644 --- a/brutils/legal_process.py +++ b/brutils/legal_process.py @@ -131,10 +131,10 @@ def generate( None if one of the arguments is invalid. Example: - >>> generate(2023, 5) - '51659517120235080562' + >>> generate(2027, 5) + '66026995620275040282' >>> generate() - '88031888220233030000' + '97551944720262020000' >>> generate(2022, 10) None """