
| 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/iz1 |
#********************************************************************************
def idem_kto (self,ktotext,grenze=0.99):
text = []
buchungen = []
groups = [buchungen]
for zeile in ktotext.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:
text.append(zeile)
else:
datum = m.group(1)
betrag = m.group(2)
ktoa = m.group(3)
ktob = m.group(4)
remark = m.group(6)
m = re.search(r"^(.*)\-(\d\d\d\d\d)$",ktoa)
if m:
buchungen.append([datum,betrag,m.group(1),ktob,remark])
else:
text.append(zeile)
pointer = []
self.mark("")
while (0 == 0):
pointer0 = pointer
pointer = self.next_pointer(pointer,len(buchungen)-1)
if not pointer:
break
if not len(pointer0) == len(pointer):
self.mark(" ... searching " + str(len(pointer)) + "-tuples in " + str(len(buchungen)) + " rows")
if len(buchungen) > { 1:99999999, 2:1000, 3:120, 4:50, 5:30, 6:24, 7:20, 8:18, 9:17, 10:16,
11:15, 12:16, 13:15, 14:15, 15:15 } [len(pointer)]:
print(" ... skip")
break
sum = 0.00
for i in pointer:
sum = sum + float(buchungen[i][1])
if abs(sum) > grenze:
continue
zaehler = 0
group = []
for i in pointer:
group.append(buchungen[i-len(group)])
del buchungen[i-len(group)+1]
pointer[zaehler] = pointer[0] + zaehler
zaehler = zaehler + 1
pointer[-1] = pointer[-1] - 1
groups.append(group)
if len(buchungen) == 0:
groups.remove(buchungen)
groups.sort(key=lambda x: x[0][0] )
zaehler = {}
for group in groups:
if len(group) == 2 and abs(float(group[0][1]) + float(group[1][1])) < grenze:
id = self.ukto_from_betrag(group[0][1])
else:
ll = len(group)
if not ll in zaehler:
zaehler[ll] = 0
zaehler[ll] = zaehler[ll] + 1
id = "0" + str(ll)
id = id + ("%0" + str(5-len(id)) + "u") % zaehler[ll]
for buchung in group:
text.append(buchung[0] + " " + buchung[1] + " " + buchung[2] + "-" + id + " " +
buchung[3] + " 0.00 " + buchung[4])
return( '\n'.join(text) + '\n' )
#********************************************************************************
def next_pointer (self,pointer,maxlen):
if len(pointer) > maxlen: # hier ist nichts mehr zu machen, es gibt keinen hoeheren Index
return(None)
if len(pointer) > 0:
if pointer[-1] < maxlen: # erst sehen, ob der letzte Index problemlos erhoeht werden kann
pointer[-1] = pointer[-1] + 1
return(pointer)
pointer = self.next_pointer(pointer[:-1],maxlen-1) # wenn das nicht geht, das zweithoechste Teilstueck erhoehen
if len(pointer) > 0:
pointer.append(pointer[-1]+1) # dann den letzten Index erhoehen
if not pointer[-1] > maxlen: # wenn der noch passt, fertig
return(pointer)
zaehler = 0 # ansonsten die Gesamtlange des Pointers um 1 erhoehen
for i in (pointer):
pointer[zaehler] = zaehler
zaehler + 1
pointer.append(zaehler)
return(pointer)
#**********************************************************************