def transfer_konten(): # Konto.objects.all().delete() buchungen, konten = get_csv_tables(CSV_DATEI) exist_mwst = tuple([i[0] for i in MWST]) dictlist = get_dictlist(konten, used_fieldnames=None) for line in dictlist: # pprint(line) datev_nummer = int(line['Konto']) konto_name = line['Listenname'] mwst = None try: mwst_string = PROZ_RE.findall(konto_name)[0] except IndexError: pass else: mwst = int(mwst_string) if mwst in exist_mwst: print "MwSt: %s%%" % mwst try: konto = Konto.objects.get(datev_nummer=datev_nummer) except Konto.DoesNotExist: konto = Konto( datev_nummer=datev_nummer, name=konto_name, mwst=mwst, ) add_message(konto, "Neues Konto aus MMS import") konto.save() print "Neues Konto erstellt:", konto else: print "Konto besteht schon:", konto must_save = False if konto_name != konto.name: print " *** andere Bezeichnung:" print konto_name, "!=", konto.name print "Setzte neuen Namen" konto.name = konto_name add_message(konto, "Neuer Konto Namen aus MMS import") konto.notizen += "\n neuer Konto namen aus MMS import" must_save = True if mwst != konto.mwst: print " *** andere MwSt.:" print mwst, "!=", konto.mwst print "setzte neue MwSt:" konto.mwst = mwst add_message(konto, "Neue MwSt.Satz aus MMS import") konto.notizen += "\n neue MwSt.Satz aus MMS import" must_save = True if must_save: konto.save() print "-" * 80
def _get_dictlist(filename): # python csv module doesn't work with unicode! So no codecs.open() here! f = file(filename, "rb") data = f.readlines() f.close() dictlist = get_dictlist(data, encoding="latin-1", used_fieldnames=None) return dictlist
def _insert_buchungen(self, buchungen): dictlist = get_dictlist(buchungen, used_fieldnames=None) for line in dictlist: if self.verbosity >= 4: self.stdout.write("_" * 80) self.stdout.write("\n%s\n" % pprint.pformat(line)) date_string = line["Datum"] # print "date_string:", date_string datum = datetime.strptime(date_string, "%d.%m.%Y").date() # datum = date.strptime(date_string, "%d.%m.%Y") raw_summe = line["Betrag"] summe = _get_decimal(raw_summe) konto_nr = int(line["Konto"]) # print "konto_nr:", konto_nr, type(konto_nr) if konto_nr == 9000: # EB-Sachkonten if self.verbosity >= 2: self.stdout.write("Endbestand des Kontos vom Vorjahr: %s\n" % summe) continue try: konto = Konto.objects.get(nummer=konto_nr) except Konto.DoesNotExist, err: print "*" * 79 print "Fehler: Konto unbekannt:", err konto = None ggkto = line["GGKto"] if len(ggkto) > 4: # SteuerSchlüssel drin stsl_nr = int(ggkto[0]) ggkto_nr = int(ggkto[1:]) mwst = STEUER_SCHLUESSEL[stsl_nr] summe_netto = summe / ((mwst / Decimal(100)) + Decimal(1)) if self.verbosity >= 3: self.stdout.write( "Brutto: %s - %s%% (Steuerschlüssel: %i) = %s Netto\n" % (summe, mwst, stsl_nr, summe_netto) ) else: summe_netto = summe ggkto_nr = int(ggkto) mwst = None try: ggkto = Konto.objects.get(nummer=ggkto_nr) except Konto.DoesNotExist, err: print "*" * 79 print "Fehler: Gegenkonto unbekannt:", err ggkto = None
def transfer_buchungen(): # Konto.objects.all().delete() buchungen, konten = get_csv_tables(CSV_DATEI) exist_mwst = tuple([i[0] for i in MWST]) dictlist = get_dictlist(buchungen, used_fieldnames=None) for line in dictlist: kommentar = line["Kommentar"] print "_" * 79 # pprint(line) # print " -"*40 date_string = line["Datum"] # print "date_string:", date_string datum = datetime.strptime(date_string, "%d.%m.%Y").date() # datum = date.strptime(date_string, "%d.%m.%Y") raw_summe = line["Betrag"] summe = _get_decimal(raw_summe) konto_nr = int(line["Konto"]) # print "konto_nr:", konto_nr, type(konto_nr) try: konto = Konto.objects.get(datev_nummer=konto_nr) except Konto.DoesNotExist, err: print "*" * 79 print "Fehler: Konto unbekannt:", err # print "Erstelle neuen Eintrag!" return ggkto = line["GGKto"] if len(ggkto) > 4: # SteuerSchlüssel drin stsl_nr = int(ggkto[0]) stsl = StSl.objects.get(id=stsl_nr) # print u"Steuerschlüssel:", stsl ggkto = ggkto[1:] else: stsl = None Gkonto_nr = int(ggkto) try: ggkto = Konto.objects.get(datev_nummer=Gkonto_nr) except Konto.DoesNotExist, err: print "*" * 79 print "Fehler: GKonto unbekannt:", err return
def _insert_konten(self, konten): dictlist = get_dictlist(konten, used_fieldnames=None) for line in dictlist: if self.verbosity >= 4: self.stdout.write("_" * 80) self.stdout.write("\n") self.stdout.write(pprint.pformat(line)) nummer = int(line["Konto"]) konto_name = line["Listenname"] konto, created = Konto.objects.get_or_create(nummer=nummer, defaults={"name": konto_name}) if created: if self.verbosity: self.stdout.write("Konto erstellt: %s\n" % konto) else: if konto.name != konto_name: self.stdout.write("Konto %i wird von %r auf %r geändert\n" % (nummer, konto.name, konto_name)) konto.name = konto_name konto.save() elif self.verbosity >= 2: self.stdout.write("Vorhandes Konto genutzt: %s\n" % konto)
def handle(self, filepath, **options): if not os.path.isfile(filepath): raise CommandError("Filepath %r doesn't exist." % filepath) self.stdout.write("Import Cronbank Buchungen von %r\n" % filepath) self.verbosity = int(options.get('verbosity', 1)) buchungen = get_buchungen(filepath) # print buchungen for line in get_dictlist(buchungen): if line["art"] == u"H": if self.verbosity >= 3: self.stdout.write(pprint.pformat(line)) self.stdout.write("\n") raw_valuta = line["Valuta"] if not raw_valuta: self.stdout.write("Skip, kein valuta Datum vorhanden.\n") continue valuta = to_datetime_date(raw_valuta) if self.verbosity >= 2: self.stdout.write("Konvertiertes Valuta-Datum: %r\n" % valuta) raw_umsatz = line["Umsatz"].replace(".", "").replace(",", ".") umsatz = Decimal(raw_umsatz) if self.verbosity >= 2: self.stdout.write("Konvertierter Umsatz: %r\n" % umsatz) start_date = valuta - datetime.timedelta(days=40) end_date = valuta rechnungen = Rechnung.objects.filter(datum__range=(start_date, end_date)) if self.verbosity: self.stdout.write("Anzahl der Rechnungen im Zeitraum %s - %s: %i\n" % (start_date, end_date, rechnungen.count())) if self.verbosity >= 3: for no, r in enumerate(rechnungen): self.stdout.write("%i: %s\n" % (no, r)) rechnungen = rechnungen.exclude(valuta__isnull=False) if self.verbosity: self.stdout.write("Anzahl der Rechnungen ohne Valuta-Datum: %i\n" % rechnungen.count()) if self.verbosity >= 3: for no, r in enumerate(rechnungen): self.stdout.write("%i: %s\n" % (no, r)) matched_rechnungen = [] for rechnung in rechnungen: total_brutto = rechnung.get_total_brutto() if umsatz == total_brutto: if self.verbosity: self.stdout.write("Rechnung mit richtigem Umsatz gefunden: %s\n" % rechnung) if str(rechnung.nummer) in line["Vorgang/Verwendungszweck"]: if self.verbosity: self.stdout.write("Rechnungsnummer in Verwendungszweck gefunden.\n") matched_rechnungen.append(rechnung) if len(matched_rechnungen) == 1: rechnung = matched_rechnungen[0] self.stdout.write("Passende Rechnung gefunden: %s - speichere Valuta-Datum.\n" % rechnung) rechnung.valuta = valuta rechnung.save() reversion.revision.comment = "Setzten vom Valuta-Datum auf %s nach cronbank csv Abgleich." % valuta self.stdout.write("-"*79) self.stdout.write("\n")