made it work with d6 corrections!

This commit is contained in:
Erik Örtenberg 2025-11-24 01:56:53 +01:00
parent 502e9331e3
commit aef92da909

View File

@ -1,5 +1,5 @@
import csv import csv
from functools import reduce
import re import re
def float2(value, default=0.0): def float2(value, default=0.0):
@ -49,17 +49,18 @@ for line in result:
verf = line['"Verifikation"'].replace(" ","") verf = line['"Verifikation"'].replace(" ","")
if verf not in verfs.keys(): if verf not in verfs.keys():
verfs[verf] = line verfs[verf] = line
verfs[verf]['"Kredit"'] = float2(line['"Kredit"'].replace(",",".").replace(" ","")) verfs[verf]["Corrections"] = []
verfs[verf]['"Debet"'] = float2(line['"Debet"'].replace(",",".").replace(" ","")) verfs[verf]["Value"] = float2(line['"Debet"'].replace(",",".").replace(" ",""))
verfs[verf]["Value"] -= float2(line['"Kredit"'].replace(",",".").replace(" ",""))
else: else:
verfs[verf]['"Kredit"'] += float2(line['"Kredit"'].replace(",",".").replace(" ","")) verfs[verf]["Value"] -= float2(line['"Kredit"'].replace(",",".").replace(" ",""))
verfs[verf]['"Debet"'] += float2(line['"Debet"'].replace(",",".").replace(" ","")) verfs[verf]["Value"] += float2(line['"Debet"'].replace(",",".").replace(" ",""))
## ELIMINATE CORRECTIONS ## ELIMINATE CORRECTIONS
verfs = dict(reversed(sorted(verfs.items(), key = lambda x: int(x[0][1:])))) verfs = dict(reversed(sorted(verfs.items(), key = lambda x: int(x[0][1:]))))
print(f"All verfs {len(verfs)}") newVerfs = dict(verfs)
corrections = [] corrections = []
for verf, line in verfs.items(): for verf, line in verfs.items():
@ -68,51 +69,62 @@ for verf, line in verfs.items():
toDelete = [] toDelete = []
missingVerfs = [] missingVerfs = []
for verf, line in verfs.items(): for verf, line in verfs.items():
if verf in list(map(lambda x: x[0], toDelete)): if verf in reduce(lambda x,y: x + y, list(map(lambda x: [x[0]] + x[1], toDelete)),[]):
continue continue
if "Korrigering" in line['"Beskrivning"']: if "Korrigering" in line['"Beskrivning"']:
toRemove = re.findall("(A\d+)(?:\D){0,1}",line['"Beskrivning"'])[0] toRemove = re.findall("(A\d+)(?:\D){0,1}",line['"Beskrivning"'])[0]
if toRemove not in verfs.keys(): if toRemove not in verfs.keys():
missingVerfs.append(toRemove) missingVerfs.append(toRemove)
else: else:
targetSum = verfs[toRemove]['"Debet"'] - verfs[toRemove]['"Kredit"'] newVerfs[toRemove]["Corrections"].append(verf)
correctionSum = line['"Debet"'] - line['"Kredit"'] newVerfs[toRemove]["Corrections"].extend(newVerfs[verf]["Corrections"])
if abs(targetSum + correctionSum) < 0.0001: newVerfs[toRemove]["Value"] += line["Value"]
#print(f"Deleting {verfs[toRemove]}") ### check if toRemove verf should be removed
#print(f"because of {line}") if abs(newVerfs[toRemove]["Value"]) < 0.0001:
#print("") toDelete.append((toRemove, newVerfs[toRemove]["Corrections"]))
toDelete.append((toRemove, verf)) elif len(line["Corrections"]) > 0:
toDelete.append((verf, [None] + line["Corrections"]))
print(f"VARNING! {missingVerfs} saknas i verifikat listan men refereras till av korrektioner!") verfs = newVerfs
print(f"Tar bort {len(toDelete)} korrigeringspar...") if len(missingVerfs) > 0:
for v, k in toDelete: print("")
print(v, k) print(f"VARNING! {missingVerfs} saknas i verifikat listan men refereras till av korrektioner!")
del verfs[v] print("")
del verfs[k]
if len(toDelete) > 0:
print(f"Tar bort {len(toDelete)} korrigeringspar...")
for v, ks in toDelete:
if ks[0] == None:
print(f" Verifikaten {ks[1:]} delkorrigerar {v}")
ks = ks[1:]
else:
print(f" Verifikaten {ks} korrigerar bort hela {v}")
del verfs[v]
for k in ks:
del verfs[k]
print(f"All verfs {len(verfs)}, All corrections {len(toDelete)*2}")
## FINISH PARSING DATA ## FINISH PARSING DATA
for verf, line in verfs.items(): for verf, line in verfs.items():
if line['"Kredit"'] > 0: if line["Value"] < 0:
krediter[verf] = line krediter[verf] = line
elif line['"Debet"'] > 0: elif line["Value"] > 0:
debeter[verf] = line debeter[verf] = line
# FIND DIFFS AND LOG INTO DATA STRUCTURE # FIND DIFFS AND LOG INTO DATA STRUCTURE
print("Beräknar skillnader mellan utbetalningar och utlägg")
for kVerf, kLine in krediter.items(): for kVerf, kLine in krediter.items():
sums[kVerf] = {"value": -kLine['"Kredit"'], "debets": [], "date": kLine['"Datum"']} sums[kVerf] = {"value": kLine["Value"], "debets": [], "date": kLine['"Datum"']}
print(sums)
toDel = [] toDel = []
for dVerf, dLine in debeter.items(): for dVerf, dLine in debeter.items():
debetVal = dLine['"Debet"'] debetVal = dLine["Value"]
for kVerf in re.findall("(A\d+)(?:\D){0,1}",dLine['"Beskrivning"']): for kVerf in re.findall("(A\d+)(?:\D){0,1}",dLine['"Beskrivning"']):
if debetVal == 0: if debetVal == 0:
continue continue
if kVerf not in sums: if kVerf not in sums:
if kVerf not in corrections: if kVerf not in corrections:
print(f"oopsie, {kVerf} finns inte som kreditverifikat") print(f" I debeterande verifikat {dVerf} berörs {kVerf}, men {kVerf} hittas inte. (saknas kostnadsställe?)")
continue continue
sumVal = sums[kVerf]["value"] sumVal = sums[kVerf]["value"]
if abs(sumVal + debetVal) < 0.0001: if abs(sumVal + debetVal) < 0.0001:
@ -128,26 +140,18 @@ for dVerf, dLine in debeter.items():
debetVal = debetVal - sumVal debetVal = debetVal - sumVal
sums[kVerf]["debets"] = sums[kVerf]["debets"] + [dVerf] sums[kVerf]["debets"] = sums[kVerf]["debets"] + [dVerf]
for dVerf in list(set(toDel)): for dVerf in list(set(toDel)):
#print(dVerf)
del debeter[dVerf] del debeter[dVerf]
print(f"All verfs {len(debeter) + len(krediter)}, All corrections {len(toDelete)*2}, All matched debeter {len(toDel)}")
# PRINT! # PRINT!
total = 0 print("---------------------")
print("Nedan är alla utlägg/kredit verifikat och dess tillhörande betalningar.")
for verf, a in sums.items(): for verf, a in sums.items():
if abs(a["value"]) > 0.0001: if abs(a["value"]) > 0.0001:
total += a["value"] print(" VARNING! Ofullständig matchning i ",verf, ": ", a)
print(verf, ": ", a)
else: else:
print(f"oki, paid verf {verf}: {a}") print(f"{verf}: {a}")
print("")
print("Här kommer omatchade debeter") print("Här kommer omatchade debeter")
for debet, debetLine in debeter.items(): for debet, debetLine in debeter.items():
print(debet + ": " + debetLine['"Beskrivning"'] + " -- ", debetLine['"Debet"']) print(debet + ": " + debetLine['"Beskrivning"'] + " -- ", debetLine["Value"])
total += debetLine['"Debet"']
print(total)