Skip to content

Commit dc14ab8

Browse files
fix: calcula o dígito verificador do processo jurídico com 98 (Res. CNJ 65/2008) (#785)
* fix: calcula o dígito verificador do processo jurídico com 98 (Res. CNJ 65/2008) * docs: aponta a entrada do CHANGELOG para o PR #785 * docs: usa anos aceitos por generate nos exemplos do processo jurídico 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=. --------- Co-authored-by: Nilton Pimentel <63605485+niltonpimentel02@users.noreply.github.com>
1 parent f32825f commit dc14ab8

5 files changed

Lines changed: 51 additions & 28 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- 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)
13+
1014
## [2.5.0] - 2026-06-30
1115

1216
### Added

‎README.md‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,9 +1017,9 @@ Examplo:
10171017

10181018
```python
10191019
>>> from brutils import is_valid_legal_process
1020-
>>> is_valid_legal_process('10188748220234018200')
1020+
>>> is_valid_legal_process('10188748320234018200')
10211021
True
1022-
>>> is_valid_legal_process('45532346920234025107')
1022+
>>> is_valid_legal_process('45532347020234025107')
10231023
True
10241024
>>> is_valid_legal_process('00000000000000000000')
10251025
False
@@ -1101,13 +1101,13 @@ Exemplo:
11011101
```python
11021102
>>> from brutils import generate_legal_process
11031103
>>> generate_legal_process()
1104-
"45676401020238170592"
1105-
>>> generate_legal_process(ano=2025)
1106-
"32110268020258121130"
1104+
"84285857720267050401"
1105+
>>> generate_legal_process(year=2027)
1106+
"46214128120273030000"
11071107
>>> generate_legal_process(orgao=5)
1108-
"37573041520235090313"
1109-
>>> generate_legal_process(ano=2024, orgao=4)
1110-
"33158248820244017105"
1108+
"42643452820265130129"
1109+
>>> generate_legal_process(year=2027, orgao=4)
1110+
"09392462020274013701"
11111111
```
11121112

11131113
## Titulo Eleitoral

‎README_EN.md‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,9 +1017,9 @@ Example:
10171017

10181018
```python
10191019
>>> from brutils import is_valid_legal_process
1020-
>>> is_valid_legal_process('10188748220234018200')
1020+
>>> is_valid_legal_process('10188748320234018200')
10211021
True
1022-
>>> is_valid_legal_process('45532346920234025107')
1022+
>>> is_valid_legal_process('45532347020234025107')
10231023
True
10241024
>>> is_valid_legal_process('00000000000000000000')
10251025
False
@@ -1102,13 +1102,13 @@ Example:
11021102
```python
11031103
>>> from brutils import generate_legal_process
11041104
>>> generate_legal_process()
1105-
"45676401020238170592"
1106-
>>> generate_legal_process(year=2025)
1107-
"32110268020258121130"
1105+
"84285857720267050401"
1106+
>>> generate_legal_process(year=2027)
1107+
"46214128120273030000"
11081108
>>> generate_legal_process(orgao=5)
1109-
"37573041520235090313"
1110-
>>> generate_legal_process(year=2024, orgao=4)
1111-
"33158248820244017105"
1109+
"42643452820265130129"
1110+
>>> generate_legal_process(year=2027, orgao=4)
1111+
"09392462020274013701"
11121112
```
11131113

11141114
## Voter ID

‎brutils/legal_process.py‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ def is_valid(legal_process_id: str) -> bool:
8484
bool: True if the legal process ID is valid, False otherwise.
8585
8686
Example:
87-
>>> is_valid("68476506020233030000")
87+
>>> is_valid("68476506120233030000")
8888
True
89-
>>> is_valid("51808233620233030000")
89+
>>> is_valid("51808233720233030000")
9090
True
9191
>>> is_valid("123")
9292
False
@@ -131,10 +131,10 @@ def generate(
131131
None if one of the arguments is invalid.
132132
133133
Example:
134-
>>> generate(2023, 5)
135-
'51659517020235080562'
134+
>>> generate(2027, 5)
135+
'66026995620275040282'
136136
>>> generate()
137-
'88031888120233030000'
137+
'97551944720262020000'
138138
>>> generate(2022, 10)
139139
None
140140
"""
@@ -169,9 +169,9 @@ def _checksum(basenum: int) -> str:
169169
170170
Example:
171171
>>> _checksum(1234567)
172-
'50'
172+
'51'
173173
>>> _checksum(9876543)
174-
'88'
174+
'89'
175175
"""
176176

177-
return str(97 - ((int(basenum) * 100) % 97)).zfill(2)
177+
return str(98 - ((int(basenum) * 100) % 97)).zfill(2)

‎tests/test_legal_process.py‎

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,33 @@ def test_generate(self):
6060
self.assertIsNone(generate(year=1000, orgao=4))
6161
self.assertIsNone(generate(orgao=0))
6262

63+
def test_generate_returns_valid_check_digits(self):
64+
# CNJ Resolution 65/2008: moving DD to the end, a valid number is
65+
# congruent to 1 modulo 97 (ISO 7064 MOD 97-10)
66+
for orgao in range(1, 10):
67+
legal_process_id = generate(orgao=orgao)
68+
reordered = legal_process_id[:7] + legal_process_id[9:]
69+
reordered += legal_process_id[7:9]
70+
self.assertEqual(int(reordered) % 97, 1)
71+
self.assertIs(is_valid(legal_process_id), True)
72+
6373
def test_check_sum(self):
64-
self.assertEqual(_checksum(546611720238150014), "77")
65-
self.assertEqual(_checksum(403818720238230498), "50")
74+
self.assertEqual(_checksum(546611720238150014), "78")
75+
self.assertEqual(_checksum(403818720238230498), "51")
76+
# Real legal process IDs
77+
self.assertEqual(_checksum(504651220164047000), "94")
78+
self.assertEqual(_checksum(6975820154013400), "61")
6679
self.assertIsInstance(_checksum(403818720238230498), str)
6780

6881
def test_is_valid(self):
69-
self.assertIs(is_valid("10188748220234018200"), True)
70-
self.assertIs(is_valid("45532346920234025107"), True)
82+
self.assertIs(is_valid("10188748320234018200"), True)
83+
self.assertIs(is_valid("45532347020234025107"), True)
84+
# Real legal process IDs
85+
self.assertIs(is_valid("5046512-94.2016.4.04.7000"), True)
86+
self.assertIs(is_valid("0069758-61.2015.4.01.3400"), True)
87+
# Check digits off by one
88+
self.assertIs(is_valid("5046512-93.2016.4.04.7000"), False)
89+
self.assertIs(is_valid("10188748220234018200"), False)
7190
self.assertIs(is_valid("10188748220239918200"), False)
7291
self.assertIs(is_valid("00000000000000000000"), False)
7392
self.assertIs(is_valid("455323469202340251"), False)

0 commit comments

Comments
 (0)