[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