From c37e8941b6896d811e52ac23d537cc2bbec91674 Mon Sep 17 00:00:00 2001 From: Rodrigo Prado de Jesus Date: Fri, 1 May 2020 22:25:48 -0300 Subject: [PATCH] adicionado validador para PIS/PASEP/NIS --- README.md | 1 + tests/test_all.py | 2 ++ tests/test_pis.py | 34 ++++++++++++++++++++++++ validate_docbr/PIS.py | 54 ++++++++++++++++++++++++++++++++++++++ validate_docbr/__init__.py | 1 + 5 files changed, 92 insertions(+) create mode 100644 tests/test_pis.py create mode 100644 validate_docbr/PIS.py diff --git a/README.md b/README.md index dd4a0de..215ca85 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ Documentos que estão no pacote: - [CNH](#): Carteira Nacional de Habilitação; - [CNPJ](https://github.com/alvarofpp/validate-docbr/wiki/CNPJ): Cadastro Nacional da Pessoa Jurídica; - [CNS](https://github.com/alvarofpp/validate-docbr/wiki/CNS): Cartão Nacional de Saúde; +- [PIS](#): PIS/NIS/PASEP/NIT; - [Título eleitoral](#): Cadastro que permite cidadãos brasileiros votar. Para entender melhor os documentos e suas respectivas classes, basta acessar a Wiki do projeto. diff --git a/tests/test_all.py b/tests/test_all.py index ab242ba..969d5d8 100644 --- a/tests/test_all.py +++ b/tests/test_all.py @@ -4,6 +4,7 @@ import tests.test_cnh import tests.test_cns import tests.test_cnpj +import tests.test_pis import tests.test_titulo_eleitor @@ -15,6 +16,7 @@ def suite(): test_suite.addTests(loader.loadTestsFromModule(tests.test_cnh)) test_suite.addTests(loader.loadTestsFromModule(tests.test_cns)) test_suite.addTests(loader.loadTestsFromModule(tests.test_cnpj)) + test_suite.addTests(loader.loadTestsFromModule(tests.test_pis)) test_suite.addTests(loader.loadTestsFromModule(tests.test_titulo_eleitor)) return test_suite diff --git a/tests/test_pis.py b/tests/test_pis.py new file mode 100644 index 0000000..3acfb4a --- /dev/null +++ b/tests/test_pis.py @@ -0,0 +1,34 @@ +import unittest +import validate_docbr as docbr + + +class TestPis(unittest.TestCase): + """Testar a classe PIS/NIS/PASEP/NIT.""" + + def setUp(self): + """Inicia novo objeto em todo os testes.""" + self.pis = docbr.PIS() + + def test_generate_validate(self): + """Verifica os métodos de geração e validação de documento.""" + # generate_list + piss = self.pis.generate_list(5000)\ + + self.pis.generate_list(5000, mask=True)\ + + self.pis.generate_list(5000, mask=True, repeat=True) + self.assertIsInstance(piss, list) + self.assertTrue(len(piss) == 15000) + + # validate_list + piss_validates = self.pis.validate_list(piss) + self.assertTrue(sum(piss_validates) == 15000) + + def test_mask(self): + """Verifica se o método mask funciona corretamente.""" + masked_pis = self.pis.mask('23992734770') + self.assertEqual(masked_pis, '239.92734.77-0') + + masked_pis = self.pis.mask('93999998770') + self.assertEqual(masked_pis, '939.99998.77-0') + + masked_pis = self.pis.mask('03953333770') + self.assertEqual(masked_pis, '039.53333.77-0') diff --git a/validate_docbr/PIS.py b/validate_docbr/PIS.py new file mode 100644 index 0000000..ea25658 --- /dev/null +++ b/validate_docbr/PIS.py @@ -0,0 +1,54 @@ +from .BaseDoc import BaseDoc +from random import sample +from typing import Union + + +class PIS(BaseDoc): + """Classe referente ao PIS/NIS/PASEP/NIT.""" + + def __init__(self): + self.digits = list(range(10)) + + def validate(self, doc: str = '') -> bool: + """Validar PIS/NIS/PASEP/NIT.""" + doc = self._only_digits(doc) + + if len(doc) != 11 or self._is_repeated_digits(doc): + return False + + digit = self._generate_digit(doc) + + return digit == doc[10] + + def generate(self, mask: bool = False) -> str: + """Gerar PIS/NIS/PASEP/NIT.""" + pis = [str(sample(self.digits, 1)[0]) for i in range(10)] + pis.append(self._generate_digit(pis)) + + pis = ''.join(pis) + return self.mask(pis) if mask else pis + + def mask(self, doc: str = '') -> str: + """Coloca a máscara de PIS/NIS/PASEP/NIT na variável doc.""" + return "{}.{}.{}-{}".format(doc[:3], doc[3:8], doc[8:10], doc[10:]) + + def _generate_digit(self, doc: Union[str, list]) -> str: + """Gerar o dígito verificador do PIS/NIS/PASEP/NIT.""" + multipliers = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] + summation = 0 + + for position in range(0, 10): + summation += int(doc[position]) * multipliers[position] + + module = summation % 11 + digit = 0 + + if module >= 2: + digit = 11 - module + + return str(digit) + + def _is_repeated_digits(self, doc: str) -> bool: + """Verifica se o PIS/NIS/PASEP/NIT contém com números repetidos. + Exemplo: 11111111111""" + return len(set(doc)) == 1 diff --git a/validate_docbr/__init__.py b/validate_docbr/__init__.py index f19b7ba..a9c4995 100644 --- a/validate_docbr/__init__.py +++ b/validate_docbr/__init__.py @@ -3,4 +3,5 @@ from .CNPJ import CNPJ from .CNH import CNH from .CNS import CNS +from .PIS import PIS from .TituloEleitoral import TituloEleitoral