diff --git a/CHANGELOG.md b/CHANGELOG.md index e97d4fd..74c1db3 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 [#785](https://github.com/brazilian-utils/python/pull/785) + ## [2.5.0] - 2026-06-30 ### Added diff --git a/README.md b/README.md index 86dad48..5ba23fd 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" ->>> generate_legal_process(ano=2025) -"32110268020258121130" +"84285857720267050401" +>>> generate_legal_process(year=2027) +"46214128120273030000" >>> generate_legal_process(orgao=5) -"37573041520235090313" ->>> generate_legal_process(ano=2024, orgao=4) -"33158248820244017105" +"42643452820265130129" +>>> generate_legal_process(year=2027, orgao=4) +"09392462020274013701" ``` ## Titulo Eleitoral diff --git a/README_EN.md b/README_EN.md index 0df33c5..0b9167a 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" ->>> generate_legal_process(year=2025) -"32110268020258121130" +"84285857720267050401" +>>> generate_legal_process(year=2027) +"46214128120273030000" >>> generate_legal_process(orgao=5) -"37573041520235090313" ->>> generate_legal_process(year=2024, orgao=4) -"33158248820244017105" +"42643452820265130129" +>>> generate_legal_process(year=2027, orgao=4) +"09392462020274013701" ``` ## Voter ID diff --git a/brutils/legal_process.py b/brutils/legal_process.py index 53fdc00..5657bfa 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 @@ -131,10 +131,10 @@ def generate( None if one of the arguments is invalid. Example: - >>> generate(2023, 5) - '51659517020235080562' + >>> generate(2027, 5) + '66026995620275040282' >>> generate() - '88031888120233030000' + '97551944720262020000' >>> 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 164eec5..7eb8f9c 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)