Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Código duplicando os dois últimos dígitos?

Pessoal, bom dia. Help!

Ao testar o código, removi os dois últimos dígitos do cpf que havia inserido, e por algum motivo, os dois últimos dígitos remanescentes foram duplicados e o cpf validado! Como isso aconteceu? Segue abaixo o arquivo main.py:

from cpf_cnpj import CpfCnpj
from validate_docbr import CNPJ

# cpf_um = Cpf("02942023740")
# print(cpf_um)

exemplo_cnpj = "04422276000119"
exemplo_cpf = "216142000"
# cnpj = CNPJ()
# print(cnpj.validate(exemplo_cnpj))
documento = CpfCnpj(exemplo_cpf, 'cpf')
print(documento)

E segue o cpf_cnpj.py:

from validate_docbr import CPF, CNPJ

class CpfCnpj:
    def __init__(self, documento, tipo_documento):
        self.tipo_documento = tipo_documento
        documento = str(documento)
        if tipo_documento == "cpf":
            if self.cpf_eh_Valido(documento):
                self.cpf = documento
            else:
                raise ValueError("CPF inválido!!")
        elif self.tipo_documento == "cnpj":
            if self.cnpj_eh_valido(documento):
                self.cnpj = documento
            else:
                raise ValueError("CNPJ inválido!!")
        else:
            raise ValueError("Documento inválido!!")

    def cpf_eh_Valido(self, cpf):
        if len(cpf) == 11:
            validador = CPF()
            return validador.validate(cpf)
        else:
            return ValueError("Quantidade de dígitos inválida!!")

    def format_cpf(self):
        mascara = CPF()
        return mascara.mask(self.cpf)

    def format_cnpj(self):
        mascara = CNPJ()
        return mascara.mask(self.cnpj)

    def __str__(self):
        if self.tipo_documento == "cpf":
            return self.format_cpf()
        elif self.tipo_documento == "cnpj":
            return self.format_cnpj()

    def cnpj_eh_valido(self, cnpj):
        if len(cnpj) == 14:
            validate_cnpj = CNPJ() # instanciando a classe
            return validate_cnpj.validate(cnpj)
        else:
            raise ValueError("Quantidade de dígitos inválida!!")

Agradeço desde já pela ajuda!

2 respostas
solução!

Olá, tudo bem?

No código será necessário uma correção no método cpf_eh_Valido, na validação do comprimento do do CPF está acontecendo o retorno (return) do erro e não a elevação (raise) do erro de valor (ValueError), desta forma não ocorre a validação correta do CPF informado, com isso será aceito CPF com uma quantidade diferente de 11 dígitos. O código deverá ficar como apresentado abaixo:

def cpf_eh_Valido(self, cpf):
    if len(cpf) == 11:
        validador = CPF()
        return validador.validate(cpf)
    else:
        raise ValueError("Quantidade de dígitos inválida!!")

Quanto a duplicação dos dois últimos dígitos, é uma implementação interna da biblioteca validate_docbr que caso seja feito o uso do mask em um CPF que possua menos que 11 dígitos, será realizado a duplicação dos dois últimos dígitos informados. Como apresentado abaixo.

from validate_docbr import CPF

exemplo_cpf = "123"

obj_cpf = CPF()
print(obj_cpf.mask(exemplo_cpf))

Resultado

123..-23

Realizando a mudança no método cpf_eh_Valido adicionando o raise, basta executar o código.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Cara, fico até sem jeito de ter cometido esse erro. Pra você ver como falta de atenção pode ocasionar um erro por detalhe. Obrigado mais uma vez, Felippe!