2 # Copyright 2013 Thadeu Lima de Souza Cascardo <cascardo@cascardo.info>
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 # -*- mode: python; encoding: utf-8; -*-
17 import xml.dom.minidom
20 def __init__(self, cpf):
21 self.cpf = self._minimize_cpf(cpf)
22 if not self._validate_cpf(self.cpf):
23 raise RuntimeError("Invalid CPF")
24 self.declaracao = self._find_id()
25 self.dados = xml.dom.minidom.parse("aplicacao/dados/%s/%s.xml" % (self.cpf, self.cpf))
27 cpf = self._normalize_cpf(self.cpf)
28 self.declaracoes = xml.dom.minidom.parse("aplicacao/dados/iddeclaracoes.xml")
29 for i in self.declaracoes.childNodes[0].childNodes:
30 if "cpf" in i.attributes.keys():
31 if i.attributes["cpf"].nodeValue == cpf:
34 # CPF normalizado se parece com 000.000.000-00
35 def _normalize_cpf(self, cpf):
38 if len(ncpf) == 3 or len(ncpf) == 7:
44 if ord(i) >= ord('0') and ord(i) <= ord('9'):
47 raise RuntimeError("Invalid CPF")
49 # CPF minimizado se parece com 01234567890
50 def _minimize_cpf(self, cpf):
51 ncpf = bytearray(self._normalize_cpf(cpf))
56 def _validate_cpf(self, cpf):
57 ncpf = self._minimize_cpf(cpf)
60 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
63 if v != ord(ncpf[9]) - ord('0'):
65 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
68 if v != ord(ncpf[10]) - ord('0'):
72 self.dados.writexml(open("aplicacao/dados/%s/%s.xml" % (self.cpf, self.cpf), "w"))
73 self.declaracoes.writexml(open("aplicacao/dados/iddeclaracoes.xml", "w"))
75 if "nome" in self.declaracao.attributes.keys():
76 return self.declaracao.attributes["nome"].nodeValue
78 def set_nome(self, nome):
79 self.declaracao.attributes["nome"].nodeValue = nome
81 if __name__ == '__main__':
83 contribuinte = Contribuinte(sys.argv[1])
84 print contribuinte._normalize_cpf(sys.argv[1])
85 print contribuinte._minimize_cpf(sys.argv[1])
86 print contribuinte._validate_cpf(sys.argv[1])
87 contribuinte.set_nome(sys.argv[2])
88 print contribuinte.get_nome()