
| Current Path : /home/ift/52_procpy/fibu/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : //home/ift/52_procpy/fibu/auswertung.py |
# coding: utf8
import os,sys,re,glob,time,sqlite3,hashlib,time,base64,datetime,fibu
class Auswertung ():
def __init__(self,xxkonto,timea,timeb,buchhaltung):
self.timea = (timea + "0000")[0:8]
self.timeb = (timeb + "9999")[0:8]
self.buchhaltung = buchhaltung
self.gesamtdauer = "20000000_" + self.timeb
self.zeitraum = self.timea + "_" + self.timeb
# print(self.gesamtdauer,self.zeitraum)
try:
self.ap = open( glob.glob(self.gesamtdauer+"/*.kto")[0] ).read()
self.ea = open( glob.glob(self.zeitraum+"/*.kto")[0] ).read()
except:
print("could not read " + self.gesamtdauer)
exit()
self.xxkonten = []
while (0 == 0):
self.xxkonten.append(xxkonto)
m = re.search(r"^(.*)\-(.*)$",xxkonto)
if m:
xxkonto = m.group(1)
else:
break
#*****************************************************************************
def evaluate_kontenrahmen (self):
self.bezeichner = {}
self.ktogrp = {} # Kontogruppen
self.datev = {} # Transformationsmatrix
aktgrp = ""
aktlist = []
for zeile0 in fibu.kontenrahmen.split("\n"):
m = re.search(r"^(.*?) +\<\-\- *$",zeile0)
if m:
zeile = m.group(1)
self.externgrp = zeile
else:
zeile = zeile0
if len(zeile) == 0 or zeile[0] in ("-","="," ","#"):
continue
zeile = re.sub(r"^(.*)\#(.*)$","\\1",zeile)
m = re.search(r"^(\S+?)\:? *$",zeile)
if m:
if len(aktgrp) > 0:
self.ktogrp[aktgrp] = aktlist
aktgrp = m.group(1)
aktlist = []
continue
m = re.search(r"^(.*?) +(.*?) +(.*?) *$",zeile)
if m:
kto = m.group(1)
self.datev[kto] = m.group(2)
bez = m.group(3)
if kto in self.bezeichner:
print(kto,"Fehler")
exit()
self.bezeichner[kto] = bez
for kto1 in aktlist:
if kto[0:len(kto1)] == kto1:
kto = ""
if not kto == "":
aktlist.append(kto)
#*****************************************************************************
def make_journal (self):
csv = []
self.extern = 0.00
for zeile in self.ap.split("\n"):
m = re.search(r"^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +\-(\S+?) +\-(\S+?) +(\-?\d+\.\d\d) +(.*)$",zeile)
if not m:
continue
datum = m.group(1)
betrag = float(m.group(2))
ktoa = m.group(3)
ktob = m.group(4)
remark = m.group(6)
try:
if ktoa[1] == "2" or ktob[1] == "2":
remark = re.sub(r"^(\+\+|\+\-)","",remark)
except:
print(zeile)
if ktoa[0] == self.buchhaltung and ktob[0] == self.buchhaltung:
pass
elif ktoa[0] != self.buchhaltung and ktob[0] == self.buchhaltung:
ktoa = "XX"
self.extern = self.extern + betrag
elif ktoa[0] == self.buchhaltung and ktob[0] != self.buchhaltung:
ktob = "XX"
self.extern = self.extern - betrag
elif ktoa[0] != self.buchhaltung and ktob[0] != self.buchhaltung:
continue
jahr = datum[0:4]
monat = datum[4:6]
tag = datum[6:8]
if int(tag) > 31:
tag = "31"
if int(tag) > 30 and monat in ("04","06","08","10","12"):
tag = "30"
if int(tag) > 28 and monat == "02":
tag = "28"
ktoa = self.transform_kto(ktoa)
ktob = self.transform_kto(ktob)
if "0000" in (ktoa,ktob):
continue
if ktoa[0] == ".":
ktoa = ktoa[1:]
if ktob[0] == ".":
ktox = ktoa
ktoa = ktob[1:]
ktob = ktox
betrag = -betrag
buchungsschluessel = "0"
if remark[0:2] == "++":
buchungsschluessel = "9"
if remark[0:2] == "+-":
buchungsschluessel = "8"
ktoa = [ktoa]
ktob = [ktob]
# ktoa = (ktoa+"----").split("-")
# ktoa = ktoa[0:5]+[ re.sub(r"\-+$","","-".join(ktoa[5:99])) ]
# ktob = (ktob+"----").split("-")
# ktob = ktob[0:5]+[ re.sub(r"\-+$","","-".join(ktob[5:99])) ]
zeile1 = ( [ tag + "." + monat + "." + jahr,
re.sub(r"\.",",",("%3.2f" % betrag))
# , "Konto B:"
] +
ktob +
# [ "Konto A:"] +
ktoa + [ buchungsschluessel ] + [ re.sub(r"\+[\+\-]","",remark) ] )
if not "v.H. " in remark:
csv.append(";".join(zeile1))
return(csv)
#*****************************************************************************
def transform_kto (self,kto0):
kto = kto0
if kto0 == "XX":
kto0 = self.xxkonten[0]
kto = kto0
while (0 == 0):
if kto in self.datev:
return(self.datev[kto])
m = re.search(r"^(.*)\-(.*)$",kto)
if m:
kto = m.group(1)
else:
return("unchanged-" + kto0)
#*****************************************************************************
def xxsalden (self):
self.ktosaldo = {}
self.grpsaldo = {}
self.saldovortrag = {}
for zeile in self.ap.split("\n"): # Bestandskonten
m = re.search(r"^(\S+) +(\-?\d+\.\d\d) *(.*)$",zeile)
if not m:
continue
kto = m.group(1)
betrag = m.group(2)
if not kto[0] == self.buchhaltung:
continue
if kto[1] in ("0","1"):
self.ktosaldo[kto] = float(betrag)
if kto in self.xxkonten:
self.ktosaldo[kto] = self.ktosaldo[kto] + self.extern
for zeile in self.ea.split("\n"): # Bewegungskonten
m = re.search(r"^(\S+) +(\-?\d+\.\d\d) *(.*)$",zeile)
if not m:
continue
kto = m.group(1)
betrag = m.group(2)
if not kto[0] == self.buchhaltung:
continue
if not kto[1] in ("0","1"):
self.ktosaldo[kto] = float(betrag)
self.aktiva = ["AKTIVA,",","]
self.passiva = ["PASSIVA,",","]
self.ertrag = ["ERTRAG,",","]
self.aufwand = ["AUFWAND,",","]
self.gewinn = ["GEWINN,",","]
self.aktiva_gesamt = 0.00
self.passiva_gesamt = 0.00
self.ertrag_gesamt = 0.00
self.aufwand_gesamt = 0.00
self.gewinn_gesamt = 0.00
self.einzelkonten = ["Einzelkonten:"]
ktogrpkeys = list(self.ktogrp)
ktogrpkeys.sort()
groupsaldo = {}
for grp in ktogrpkeys:
if not grp[0] == self.buchhaltung:
continue
if not grp[1] in ("0","1","2","3","4","5","6","7","8","9"):
continue
self.einzelkonten.append(",,")
self.einzelkonten.append(",,")
self.einzelkonten.append(grp+":")
self.einzelkonten.append(",,")
if not grp[0] == self.buchhaltung:
continue
groupsaldo[grp] = 0.00
for kto in self.ktogrp[grp]:
try:
bez = self.bezeichner[kto]
except:
bez = ""
try:
betrag = self.ktosaldo[kto]
except:
betrag = 0.00
self.einzelkonten.append(self.datev[ kto ]+","+bez+","+("%3.2f"%betrag))
if kto[1] in ["0","1"]:
self.saldovortrag[self.datev[ kto ]] = ("%3.2f"%betrag)
if kto in self.ktosaldo:
groupsaldo[grp] = groupsaldo[grp] + self.ktosaldo[kto]
self.einzelkonten.append("Gesamt:,,"+("%3.2f"%groupsaldo[grp]))
if int(grp[1]) == 0:
self.aktiva.append(grp[1:]+","+("%3.2f"%groupsaldo[grp]))
self.aktiva_gesamt = self.aktiva_gesamt + groupsaldo[grp]
if int(grp[1]) == 1:
if grp == self.externgrp:
self.passiva.append(grp[1:]+",---XXX---")
else:
self.passiva.append(grp[1:]+","+("%3.2f"%-groupsaldo[grp]))
self.passiva_gesamt = self.passiva_gesamt - groupsaldo[grp]
if int(grp[1]) == 2:
self.ertrag.append(grp[1:]+","+("%3.2f"%-groupsaldo[grp]))
self.ertrag_gesamt = self.ertrag_gesamt - groupsaldo[grp]
if int(grp[1]) in (3,4,5):
self.aufwand.append(grp[1:]+","+("%3.2f"%groupsaldo[grp]))
self.aufwand_gesamt = self.aufwand_gesamt + groupsaldo[grp]
if int(grp[1]) == 9:
self.gewinn.append(grp[1:]+","+("%3.2f"%groupsaldo[grp]))
self.gewinn_gesamt = self.gewinn_gesamt + groupsaldo[grp]
groupsaldo[self.externgrp] = - self.aktiva_gesamt + self.passiva_gesamt
passiva = []
for zeile in self.passiva:
passiva.append(re.sub(r"---XXX---",("%3.2f"%-groupsaldo[self.externgrp]),zeile))
self.passiva = passiva
# print("----------",self.aktiva_gesamt,self.passiva_gesamt,groupsaldo[self.externgrp])
self.aktiva.append(",")
self.passiva.append(",")
self.ertrag.append(",")
self.aufwand.append(",")
self.gewinn.append(",")
self.gewinn.append("GESAMT," + ("%3.2f" % self.gewinn_gesamt))
self.bilanz = []
zaehler = 0
while (0 == 0):
zeile = ""
is_empty = 0
try:
zeile = zeile + self.aktiva[zaehler] + ","
except:
zeile = zeile + ",,"
is_empty = is_empty + 1
try:
zeile = zeile + self.passiva[zaehler]
except:
zeile = zeile + ","
is_empty = is_empty + 1
self.bilanz.append(zeile)
zaehler = zaehler + 1
if is_empty == 2:
break
self.bilanz.append("GESAMT,"+("%3.2f" % self.aktiva_gesamt)+",GESAMT,"+("%3.2f" % self.aktiva_gesamt))
self.guv = []
zaehler = 0
while (0 == 0):
zeile = ""
is_empty = 0
try:
zeile = zeile + self.ertrag[zaehler] + ","
except:
zeile = zeile + ",,"
is_empty = is_empty + 1
try:
zeile = zeile + self.aufwand[zaehler]
except:
zeile = zeile + ","
is_empty = is_empty + 1
self.guv.append(zeile)
zaehler = zaehler + 1
if is_empty == 2:
break
self.guv.append("GESAMT,"+("%3.2f" % self.ertrag_gesamt)+",GESAMT,"+("%3.2f" % self.aufwand_gesamt))
self.gewinn.append("GESAMT," + ("%3.2f" % self.gewinn_gesamt))
# if (self.buchhaltung + "0-7000") not in self.ktosaldo:
# return()
#
# ktosaldo_ord = []
# for kto in self.ktosaldo:
# m = re.search(r"^(\d)0-7000-[^\-]+$",kto)
# if m:
# if m.group(1) == self.buchhaltung:
# if abs(float(self.ktosaldo[kto])) > 0.99:
# ktosaldo_ord.append([kto,float(self.ktosaldo[kto])])
#
# ktosaldo_ord.sort(key=lambda x: -x[1])
#
# for debitor in ktosaldo_ord:
# self.debitoren.append(debitor[0]+",,"+("%3.2f" % debitor[1]))
# self.debitoren.append(",,")
# self.debitoren.append("GESAMT:,"+("%3.2f" % self.ktosaldo[self.buchhaltung+"0-7000"]))
#*****************************************************************************
def salden (self):
self.grpsaldo = {}
self.saldovortrag = {}
self.korrektur_konto = "10-7000-intern"
self.ktosaldo = { self.korrektur_konto : 0.00 }
ktotype = "bestand"
self.gewinn = 0.00
for zeile in self.ap.split("\n") + ["aufwand"] + self.ea.split("\n"): # Bestands- und Bewegungskonten
if zeile == "aufwand":
ktotype = "aufwand"
continue
m = re.search('^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +(\S+?) +(\S+) +(\-?\d+\.\d\d) +(.*)', zeile)
if m: # keine Buchungszeilen auswerten
continue
m = re.search(r"^(\S+) +(\-?\d+\.\d\d) *(.*)$",zeile)
if not m:
continue
kto = m.group(1)
betrag = m.group(2)
if kto[0] == self.buchhaltung:
if kto[1] in "01" and ktotype == "bestand":
self.ktosaldo[kto] = float(betrag)
if kto[1] in "234" and ktotype == "aufwand":
self.ktosaldo[kto] = float(betrag)
if not "-" in kto: # nur die oberste Stufe der Kontenhierachie beruecksichtigen
if kto[0] == self.buchhaltung and ktotype == "aufwand":
if kto[1] in "23":
self.gewinn = self.gewinn - float(betrag)
if not kto[0] == self.buchhaltung and ktotype == "bestand":
if not kto[0] == self.buchhaltung:
# print(kto,betrag)
self.ktosaldo[self.korrektur_konto] = self.ktosaldo[self.korrektur_konto] + float(betrag)
self.aktiva = ["AKTIVA,",","]
self.passiva = ["PASSIVA,",","]
self.ertrag = ["ERTRAG,",","]
self.aufwand = ["AUFWAND,",","]
self.aktiva_gesamt = 0.00
self.passiva_gesamt = 0.00
self.ertrag_gesamt = 0.00
self.aufwand_gesamt = 0.00
self.einzelkonten = ["Einzelkonten:"]
self.gesamtkonten = []
ktogrpkeys = list(self.ktogrp)
ktogrpkeys.sort()
groupsaldo = {}
for grp in ktogrpkeys:
if not grp[0] == self.buchhaltung:
continue
if not grp[1] in ("0","1","2","3","4","5","6","7","8","9"):
continue
self.einzelkonten.append(",,")
self.einzelkonten.append(",,")
self.einzelkonten.append(grp+":")
self.einzelkonten.append(",,")
if not grp[0] == self.buchhaltung:
continue
groupsaldo[grp] = 0.00
for kto in self.ktogrp[grp]:
try:
bez = self.bezeichner[kto]
except:
bez = ""
try:
betrag = self.ktosaldo[kto]
except:
betrag = 0.00
self.einzelkonten.append(self.datev[ kto ]+","+bez+","+("%3.2f"%betrag))
if kto[1] in ["0","1"]:
self.saldovortrag[self.datev[ kto ]] = ("%3.2f"%betrag)
if kto in self.ktosaldo:
groupsaldo[grp] = groupsaldo[grp] + self.ktosaldo[kto]
self.einzelkonten.append(",,-------")
self.einzelkonten.append("Gesamt:,,"+("%3.2f"%groupsaldo[grp]))
if int(grp[1]) == 0:
self.aktiva.append(grp[1:]+","+("%3.2f"%groupsaldo[grp]))
self.aktiva_gesamt = self.aktiva_gesamt + groupsaldo[grp]
if int(grp[1]) == 1:
self.passiva.append(grp[1:]+","+("%3.2f"%-groupsaldo[grp]))
self.passiva_gesamt = self.passiva_gesamt - groupsaldo[grp]
if int(grp[1]) == 2:
self.ertrag.append(grp[1:]+","+("%3.2f"%-groupsaldo[grp]))
self.ertrag_gesamt = self.ertrag_gesamt - groupsaldo[grp]
if int(grp[1]) in (3,4,5):
self.aufwand.append(grp[1:]+","+("%3.2f"%groupsaldo[grp]))
self.aufwand_gesamt = self.aufwand_gesamt + groupsaldo[grp]
print(self.ktosaldo[self.korrektur_konto],self.aktiva_gesamt,self.passiva_gesamt,self.ertrag_gesamt,self.aufwand_gesamt)
self.aktiva.append(",")
self.passiva.append(",")
self.ertrag.append(",")
self.aufwand.append(",")
self.gesamtkonten = []
for zeile in (self.aktiva [:-1]+[",,-------","GESAMT,,"+("%3.2f"%self.aktiva_gesamt),"",""]+
self.passiva[:-1]+[",,-------","GESAMT,,"+("%3.2f"%self.passiva_gesamt),"",""]+
self.ertrag [:-1]+[",,-------","GESAMT,,"+("%3.2f"%self.ertrag_gesamt),"",""]+
self.aufwand[:-1]+[",,-------","GESAMT,,"+("%3.2f"%self.aufwand_gesamt),"",""]
):
zeile = re.sub(r"^,$","=======",zeile)
zeile = re.sub(r"^([\d\_A-Z]+)\_(.*)$","\\1,\\2",zeile)
zeile = re.sub(r"([^,]),\\1 *$",":",zeile)
self.gesamtkonten.append( zeile )
self.bilanz = []
zaehler = 0
while (0 == 0):
zeile = ""
is_empty = 0
try:
zeile = zeile + self.aktiva[zaehler] + ","
except:
zeile = zeile + ",,"
is_empty = is_empty + 1
try:
zeile = zeile + self.passiva[zaehler]
except:
zeile = zeile + ","
is_empty = is_empty + 1
self.bilanz.append(zeile)
zaehler = zaehler + 1
if is_empty == 2:
break
self.bilanz.append("GESAMT,"+("%3.2f" % self.aktiva_gesamt)+",GESAMT,"+("%3.2f" % self.passiva_gesamt))
self.guv = []
zaehler = 0
while (0 == 0):
zeile = ""
is_empty = 0
try:
zeile = zeile + self.ertrag[zaehler] + ","
except:
zeile = zeile + ",,"
is_empty = is_empty + 1
try:
zeile = zeile + self.aufwand[zaehler]
except:
zeile = zeile + ","
is_empty = is_empty + 1
self.guv.append(zeile)
zaehler = zaehler + 1
if is_empty == 2:
break
self.guv.append("GESAMT,"+("%3.2f" % self.ertrag_gesamt)+",GESAMT,"+("%3.2f" % self.aufwand_gesamt))