diff --git a/CHANGELOG.md b/CHANGELOG.md index d3c74c57..2f17e3ea 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 + +- `format_voter_id` [#742](https://github.com/brazilian-utils/python/pull/742) + ## [2.4.0] - 2026-04-20 ### Added diff --git a/brutils/voter_id.py b/brutils/voter_id.py index 7a1abd91..543aeb24 100644 --- a/brutils/voter_id.py +++ b/brutils/voter_id.py @@ -285,11 +285,24 @@ def format_voter_id(voter_id: str) -> str | None: '6908 4709 28 28' >>> format_voter_id("163204010922") '1632 0401 09 22' + >>> format_voter_id("3244567800167") + '32445 6780 01 67' """ if not is_valid(voter_id): return None + # The sequential number has 8 digits, except for the SP and MG edge case, + # where it can have 9 digits (making the voter id 13 digits long). The + # federative union and verifying digits are always the last 4 digits. + sequential_number = voter_id[:-4] + federative_union = _get_federative_union(voter_id) + verifying_digits = _get_verifying_digits(voter_id) + + split = len(sequential_number) - 4 return "{} {} {} {}".format( - voter_id[:4], voter_id[4:8], voter_id[8:10], voter_id[10:12] + sequential_number[:split], + sequential_number[split:], + federative_union, + verifying_digits, ) diff --git a/tests/test_voter_id.py b/tests/test_voter_id.py index 738ec77f..791de5a8 100644 --- a/tests/test_voter_id.py +++ b/tests/test_voter_id.py @@ -127,6 +127,16 @@ def test_format_voter_id(self): self.assertIsNone(format_voter_id("000000000000")) self.assertIsNone(format_voter_id("800911840197")) + def test_format_voter_id_special_case(self): + # SP & MG voter ids can have a 9-digit sequential number, making the + # voter id 13 digits long. Formatting must keep every digit and place + # the federative union and verifying digits correctly. + voter_id = "3244567800167" + self.assertIs(is_valid(voter_id), True) + formatted = format_voter_id(voter_id) + self.assertEqual(formatted, "32445 6780 01 67") + self.assertEqual(formatted.replace(" ", ""), voter_id) + if __name__ == "__main__": main()