--- /dev/null
+#
+# Copyright 2013 Thadeu Lima de Souza Cascardo <cascardo@cascardo.info>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# -*- mode: python; encoding: utf-8; -*-
+import xml.dom.minidom
+
+class Contribuinte:
+ def __init__(self, cpf):
+ self.cpf = self._minimize_cpf(cpf)
+ if not self._validate_cpf(self.cpf):
+ raise RuntimeError("Invalid CPF")
+ self.declaracao = self._find_id()
+ self.dados = xml.dom.minidom.parse("aplicacao/dados/%s/%s.xml" % (self.cpf, self.cpf))
+ def _find_id(self):
+ cpf = self._normalize_cpf(self.cpf)
+ self.declaracoes = xml.dom.minidom.parse("aplicacao/dados/iddeclaracoes.xml")
+ for i in self.declaracoes.childNodes[0].childNodes:
+ if "cpf" in i.attributes.keys():
+ if i.attributes["cpf"].nodeValue == cpf:
+ return i
+ return None
+ # CPF normalizado se parece com 000.000.000-00
+ def _normalize_cpf(self, cpf):
+ ncpf = ""
+ for i in cpf:
+ if len(ncpf) == 3 or len(ncpf) == 7:
+ ncpf += '.'
+ if len(ncpf) == 11:
+ ncpf += '-'
+ if len(ncpf) == 14:
+ break
+ if ord(i) >= ord('0') and ord(i) <= ord('9'):
+ ncpf += i
+ if len(ncpf) != 14:
+ raise RuntimeError("Invalid CPF")
+ return ncpf
+ # 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)
+ 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
+ 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"))
+ def get_nome(self):
+ if "nome" in self.declaracao.attributes.keys():
+ return self.declaracao.attributes["nome"].nodeValue
+ return None
+ def set_nome(self, nome):
+ self.declaracao.attributes["nome"].nodeValue = nome
+
+if __name__ == '__main__':
+ import sys
+ contribuinte = Contribuinte(sys.argv[1])
+ print contribuinte._normalize_cpf(sys.argv[1])
+ print contribuinte._minimize_cpf(sys.argv[1])
+ print contribuinte._validate_cpf(sys.argv[1])
+ contribuinte.set_nome(sys.argv[2])
+ print contribuinte.get_nome()
+ contribuinte.save()