
| 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/rules.py |
# coding: utf8
import os,sys,re,glob,time,sqlite3,hashlib,time,base64
import procpy
import procpy.fibu
#******************************************************************************
class Rules (object):
def __init__ (self,dbh):
self.ktofile =
dbh.row_factory = sqlite3.Row
cursor = dbh.cursor()
self.pythoncall = "python3"
cursor.execute("create table if not exists buchungen " +
"(DATUM,BETRAG,KTOA,KTOB,REMARK,ID default '')")
try:
cursor.execute("create index DATUM_IDX on buchungen (DATUM)" )
cursor.execute("create index KTOA_IDX on buchungen (KTOA)" )
cursor.execute("create index KTOB_IDX on buchungen (KTOB)" )
except Exception as e:
pass
self.dbh = dbh
def mark (self,remark=""):
t = time.clock()
if 't0' in vars(self):
print ( ("%9.2f" % ((t-self.t0)*1000)) + " ms for: " + remark )
self.t0 = t
def sync (self,ktodirs):
ktolist = [] # das wird die Liste mit allen Konto-Objekten
number_of_rounds = 0
for dir in ktodirs: # Erste Runde: durch alle angegebenen Konto-Directories gehen
kto = procpy.fibu.kto.Kto() # jeweils ein Konto-Objekt daraus machen
kto.find_ukto_and_interval(dir) # aus dem Pfad die Konto-ID und das Gueltigkeitsintervall herauslesen
ktorule = glob.glob(dir+"/rule.py")
print (ktorule)
if ktorule:
os.system(self.pythoncall + " " + ktorule[0] + " " + str(number_of_rounds) )
ktofile = glob.glob(dir+"/*.kto") # jetzt den jeweiligen Kontotext einlesen
if len(ktofile) == 1: # es darf nur genau ein kto-File im Konto-Verzeichnis geben
ktotext = open(ktofile[0]).read()
kto.parse_ktotext(ktotext) # wenn das so ist, den Kontotext ins Konto-Objekt einlesen
elif len(ktofile) == 0:
continue
else: # im Fehlerfall mit einer Fehlermeldung Funktion beenden
return("ERROR: ktofile in + " + dir + " is ambiguous")
kto.file = ktofile[0]
kto.dir = dir
print (kto.file)
kto.delete_from_db(self.dbh) # Wenn schon was von dem Konto in der Datenbank gestanden war, die
# entsprechenden Buchungen loeschen
kto.import_to_db(self.dbh) # Dann den Konto-Objekt-Inhalt in die Datenbank schreiben
ktolist.append(kto) # Das Konto an die Liste mit den Konto-Objekten anfuegen
number_of_synced_ktos = 0 # Zaehler fuer die Anzahl der schon synchronisierten Konten
actual_konto = 0 # Nummer des aktuellen Kontos in der ktolist
while (0 == 0): # diese Schleife so oft wiederholen, bis fuer alle Konten der Kontotext stabil bleibt
if number_of_synced_ktos == len(ktolist): # alle Konten sind synchronisiert, Schleife beenden
break
if actual_konto == 0:
number_of_rounds = number_of_rounds + 1
print ("ROUND " + str(number_of_rounds))
kto = ktolist[actual_konto]
actual_konto = (actual_konto+1) % len(ktolist)
kto.ktotext0 = kto.ktotext
kto.export_from_db(self.dbh) # Kontoinhalt aus der Datenbank auslesen
kto.write_ktotext(0.00) # Kontotext erzeugen
if kto.ktotext0 == kto.ktotext:
number_of_synced_ktos = number_of_synced_ktos + 1
continue
number_of_synced_ktos = 0
print (" ....process " + kto.ukto)
kto.delete_from_db(self.dbh)
kto.import_to_db(self.dbh)
for kto in ktolist:
open(kto.file + "1","w").write(kto.ktotext)