X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=src%2Fcontribuinte.py;h=a9e055b6ab6846a3228e4dd9e77a268630f6543e;hb=72f3ae69f786a45d35089345e54560ba956a7a6f;hp=ad10a21a0e3d6ec05d98ffcab7c5c30fe9a92317;hpb=d5711ec17637a1c815e8a62c45bf5582830ddf54;p=cascardo%2Firpf-gui.git diff --git a/src/contribuinte.py b/src/contribuinte.py index ad10a21..a9e055b 100644 --- a/src/contribuinte.py +++ b/src/contribuinte.py @@ -1,3 +1,4 @@ +# coding=utf-8 # # Copyright 2013 Thadeu Lima de Souza Cascardo # @@ -15,19 +16,34 @@ # along with this program. If not, see . # -*- mode: python; encoding: utf-8; -*- import xml.dom.minidom +import dirs +import os class Contribuinte: def __init__(self, cpf): + irpf_dir = dirs.get_default_irpf_dir() self.cpf = self._minimize_cpf(cpf) + if not self._validate_cpf(self.cpf): raise RuntimeError("Invalid CPF: " + self.cpf) + + if not os.path.exists(irpf_dir.get_resource_dir()): + raise RuntimeError("O caminho para o resource não existe: " + \ + irpf_dir.get_resource_dir()) + + if not os.path.exists(irpf_dir.get_userdata_dir()): + raise RuntimeError("O caminho para os dados não existe: " + \ + irpf_dir.get_userdata_dir()) + + self.cpf_file = irpf_dir.get_userdata_file("%s/%s.xml" % (self.cpf, self.cpf)) + self.iddecl_file = irpf_dir.get_userdata_file("iddeclaracoes.xml") self.declaracao = self._find_id() - self.dados = xml.dom.minidom.parse("aplicacao/dados/%s/%s.xml" % (self.cpf, self.cpf)) + self.dados = xml.dom.minidom.parse(self.cpf_file) self.contribuinte = self.dados.getElementsByTagName("contribuinte")[0] def _find_id(self): cpf = self._normalize_cpf(self.cpf) - self.declaracoes = xml.dom.minidom.parse("aplicacao/dados/iddeclaracoes.xml") + self.declaracoes = xml.dom.minidom.parse(self.iddecl_file) for i in self.declaracoes.childNodes[0].childNodes: if "cpf" in i.attributes.keys(): if i.attributes["cpf"].nodeValue == cpf: @@ -52,31 +68,48 @@ 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: + if len(cpf) != 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("aplicacao/dados/%s/%s.xml" % (self.cpf, self.cpf), "w")) - self.declaracoes.writexml(open("aplicacao/dados/iddeclaracoes.xml", "w")) + 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 @@ -102,10 +135,11 @@ class Contribuinte: return self.get_nome() return self._get_attr(self.contribuinte, attr) - def set_contribuinte(self, attr, val): + def set_campo_contribuinte(self, attr, val): if attr == "nome": self.set_nome(val) - self._set_attr(self.contribuinte, attr, val) + else: + self._set_attr(self.contribuinte, attr, val) contribuinte_attributes = [ "nome", @@ -158,7 +192,7 @@ if __name__ == '__main__': if len(sys.argv) == 4: print "Valor anterior: " + contribuinte.get_campo_contribuinte(sys.argv[2]) - contribuinte.set_contribuinte(sys.argv[2], sys.argv[3]) + contribuinte.set_campo_contribuinte(sys.argv[2], sys.argv[3]) print "Valor atual: " + contribuinte.get_campo_contribuinte(sys.argv[2]) print "Salvando..." contribuinte.save()