[PATCH] Validador genérico

Thadeu Lima de Souza Cascardo cascardo en cascardo.info
Mar Jul 16 11:31:29 UTC 2013


On Mon, Jul 08, 2013 at 07:55:16AM -0300, camponez en gmail.com wrote:
> From: Eduardo Elias Camponez <camponez en gmail.com>
> 
> Validador genérico para:
> - CPF
> - CNPJ
> - Recibo IRPF
> ---
>  src/contribuinte.py | 53 ++++++++++++++++++++++++++++++++++-------------------
>  1 file changed, 34 insertions(+), 19 deletions(-)
> 
> diff --git a/src/contribuinte.py b/src/contribuinte.py
> index 46d2a7b..f9de41f 100644
> --- a/src/contribuinte.py
> +++ b/src/contribuinte.py
> @@ -68,31 +68,46 @@ class Contribuinte:
>  
>      # CPF minimizado se parece com 01234567890
>      def _minimize_cpf(self, cpf):
> -        ncpf = bytearray(self._normalize_cpf(cpf))
> -        del ncpf[11]
> -        del ncpf[7]
> -        del ncpf[3]
> -        return str(ncpf)
> +        return self._minimize_valor(cpf)
> +
> +    def _minimize_valor(self, valor):
> +        nvalor = ''.join(e for e in valor if e.isalnum())
> +        return str(nvalor)
>  
>      def _validate_cpf(self, cpf):
> -        ncpf = self._minimize_cpf(cpf)
> -        if len(ncpf) != 11:
> -            return False
> -        v = (11 - sum(map(lambda x: x[0]*x[1], zip(range(10, 1, -1), map(lambda x: ord(x) - ord('0'), ncpf[0:9]))))) % 11
> -        if v >= 10:
> -            v = 0
> -        if v != ord(ncpf[9]) - ord('0'):
> -            return False
> -        v = (11 - sum(map(lambda x: x[0]*x[1], zip(range(11, 1, -1), map(lambda x: ord(x) - ord('0'), ncpf[0:10]))))) % 11
> -        if v >= 10:
> -            v = 0
> -        if v != ord(ncpf[10]) - ord('0'):
> -            return False
> -        return True
> +        return self._validate_generico(cpf)
> +
> +    def _validate_generico(self, valor):
> +        def calcula_digito_verificador(numero):
> +            n = len(numero) + 1
> +
> +            soma = 0
> +            for i in range(n):
> +                if i > len(numero) - 1:
> +                    break
> +                soma = soma + int(numero[i]) * ( n - i)
> +
> +            dv =  soma % 11
> +
> +            if dv < 2:
> +                dv = 0
> +            else:
> +                dv = 11 - dv
> +
> +            return numero + str(dv)
> +
> +        mcpf = self._minimize_valor(valor)
> +        cpf_sem_dv = mcpf[:-2]
> +
> +        primeiro_dv = str(calcula_digito_verificador(cpf_sem_dv))
> +        segundo_dv = calcula_digito_verificador(primeiro_dv)
> +
> +        return segundo_dv == mcpf
>  
>      def save(self):
>          self.dados.writexml(open(self.cpf_file, "w"))
>          self.declaracoes.writexml(open(self.iddecl_file, "w"))
> +
>      def _get_attr(self, el, attr):
>          if attr in el.attributes.keys():
>              return el.attributes[attr].nodeValue
> -- 
> 1.8.1.2
> 
> _______________________________________________
> Softwares-impostos mailing list
> Softwares-impostos en fsfla.org
> http://www.fsfla.org/cgi-bin/mailman/listinfo/softwares-impostos


Muito bom! Apliquei com uma pequena mudança. Pra validar o CPF, exige
que fossem 11 dígitos. Antes do patch, mais dígitos eram aceitos, mas
dígitos a mais eram ignorados. Com o seu patch, os dígitos extras eram
utilizados. Com a minha mudança, dígitos extras também invalidam o CPF.

Abraços.
Cascardo.


Más información sobre la lista de distribución Softwares-impostos