From aef92da9091698f0da6eab52a4482a9aead8d429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20=C3=96rtenberg?= Date: Mon, 24 Nov 2025 01:56:53 +0100 Subject: [PATCH] made it work with d6 corrections! --- findUniques2.py | 86 ++++++++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/findUniques2.py b/findUniques2.py index da38a44..e922b8b 100644 --- a/findUniques2.py +++ b/findUniques2.py @@ -1,5 +1,5 @@ import csv - +from functools import reduce import re def float2(value, default=0.0): @@ -49,17 +49,18 @@ for line in result: verf = line['"Verifikation"'].replace(" ","") if verf not in verfs.keys(): verfs[verf] = line - verfs[verf]['"Kredit"'] = float2(line['"Kredit"'].replace(",",".").replace(" ","")) - verfs[verf]['"Debet"'] = float2(line['"Debet"'].replace(",",".").replace(" ","")) + verfs[verf]["Corrections"] = [] + verfs[verf]["Value"] = float2(line['"Debet"'].replace(",",".").replace(" ","")) + verfs[verf]["Value"] -= float2(line['"Kredit"'].replace(",",".").replace(" ","")) else: - verfs[verf]['"Kredit"'] += float2(line['"Kredit"'].replace(",",".").replace(" ","")) - verfs[verf]['"Debet"'] += float2(line['"Debet"'].replace(",",".").replace(" ","")) + verfs[verf]["Value"] -= float2(line['"Kredit"'].replace(",",".").replace(" ","")) + verfs[verf]["Value"] += float2(line['"Debet"'].replace(",",".").replace(" ","")) ## ELIMINATE CORRECTIONS verfs = dict(reversed(sorted(verfs.items(), key = lambda x: int(x[0][1:])))) -print(f"All verfs {len(verfs)}") +newVerfs = dict(verfs) corrections = [] for verf, line in verfs.items(): @@ -68,51 +69,62 @@ for verf, line in verfs.items(): toDelete = [] missingVerfs = [] 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 if "Korrigering" in line['"Beskrivning"']: toRemove = re.findall("(A\d+)(?:\D){0,1}",line['"Beskrivning"'])[0] if toRemove not in verfs.keys(): missingVerfs.append(toRemove) else: - targetSum = verfs[toRemove]['"Debet"'] - verfs[toRemove]['"Kredit"'] - correctionSum = line['"Debet"'] - line['"Kredit"'] - if abs(targetSum + correctionSum) < 0.0001: - #print(f"Deleting {verfs[toRemove]}") - #print(f"because of {line}") - #print("") - toDelete.append((toRemove, verf)) + newVerfs[toRemove]["Corrections"].append(verf) + newVerfs[toRemove]["Corrections"].extend(newVerfs[verf]["Corrections"]) + newVerfs[toRemove]["Value"] += line["Value"] + ### check if toRemove verf should be removed + if abs(newVerfs[toRemove]["Value"]) < 0.0001: + toDelete.append((toRemove, newVerfs[toRemove]["Corrections"])) + 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...") -for v, k in toDelete: - print(v, k) - del verfs[v] - del verfs[k] +if len(missingVerfs) > 0: + print("") + print(f"VARNING! {missingVerfs} saknas i verifikat listan men refereras till av korrektioner!") + print("") + +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 for verf, line in verfs.items(): - if line['"Kredit"'] > 0: + if line["Value"] < 0: krediter[verf] = line - elif line['"Debet"'] > 0: + elif line["Value"] > 0: debeter[verf] = line # FIND DIFFS AND LOG INTO DATA STRUCTURE +print("Beräknar skillnader mellan utbetalningar och utlägg") for kVerf, kLine in krediter.items(): - sums[kVerf] = {"value": -kLine['"Kredit"'], "debets": [], "date": kLine['"Datum"']} -print(sums) + sums[kVerf] = {"value": kLine["Value"], "debets": [], "date": kLine['"Datum"']} toDel = [] for dVerf, dLine in debeter.items(): - debetVal = dLine['"Debet"'] + debetVal = dLine["Value"] for kVerf in re.findall("(A\d+)(?:\D){0,1}",dLine['"Beskrivning"']): if debetVal == 0: continue if kVerf not in sums: 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 sumVal = sums[kVerf]["value"] if abs(sumVal + debetVal) < 0.0001: @@ -128,26 +140,18 @@ for dVerf, dLine in debeter.items(): debetVal = debetVal - sumVal sums[kVerf]["debets"] = sums[kVerf]["debets"] + [dVerf] for dVerf in list(set(toDel)): - #print(dVerf) del debeter[dVerf] - -print(f"All verfs {len(debeter) + len(krediter)}, All corrections {len(toDelete)*2}, All matched debeter {len(toDel)}") - - - # PRINT! -total = 0 - +print("---------------------") +print("Nedan är alla utlägg/kredit verifikat och dess tillhörande betalningar.") for verf, a in sums.items(): if abs(a["value"]) > 0.0001: - total += a["value"] - print(verf, ": ", a) + print(" VARNING! Ofullständig matchning i ",verf, ": ", a) else: - print(f"oki, paid verf {verf}: {a}") + print(f"{verf}: {a}") +print("") print("Här kommer omatchade debeter") for debet, debetLine in debeter.items(): - print(debet + ": " + debetLine['"Beskrivning"'] + " -- ", debetLine['"Debet"']) - total += debetLine['"Debet"'] -print(total) + print(debet + ": " + debetLine['"Beskrivning"'] + " -- ", debetLine["Value"])