[PATCH] Validador genérico
camponez en gmail.com
camponez en gmail.com
Lun Jul 8 10:55:16 UTC 2013
From: Eduardo Elias Camponez <camponez em 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
Más información sobre la lista de distribución Softwares-impostos