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!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software