diff --git a/findUniques2.py b/findUniques2.py index 8c66f1c..da38a44 100644 --- a/findUniques2.py +++ b/findUniques2.py @@ -1,4 +1,15 @@ import csv + +import re + +def float2(value, default=0.0): + if value is None: + return default + try: + return float(value) + except ValueError: + return default + print("Detta program rapporterar skillnader mellan verifikat som refererar till varandra genom beskrivningen av verifikatet. Den utgår från krediter och hittar matchande debeter") lines = [] @@ -29,41 +40,114 @@ with open("konto.csv", "w") as file: krediter = {} debeter = {} +verfs = {} +sums = {} header = result.pop(0) for line in result: if not line['"Verifikation"']: continue - if line['"Kredit"'] and float(line['"Kredit"'].replace(",",".").replace(" ","")) > 0: - krediter[line['"Verifikation"'].replace(" ","")] = line - elif line['"Debet"'] and float(line['"Debet"'].replace(",",".").replace(" ","")) > 0: - debeter[line['"Verifikation"'].replace(" ","")] = line - + 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(" ","")) + else: + verfs[verf]['"Kredit"'] += float2(line['"Kredit"'].replace(",",".").replace(" ","")) + verfs[verf]['"Debet"'] += float2(line['"Debet"'].replace(",",".").replace(" ","")) -sums = {} +## ELIMINATE CORRECTIONS +verfs = dict(reversed(sorted(verfs.items(), key = lambda x: int(x[0][1:])))) + +print(f"All verfs {len(verfs)}") + +corrections = [] +for verf, line in verfs.items(): + if "Korrigering" in line['"Beskrivning"']: + corrections.append(verf) +toDelete = [] +missingVerfs = [] +for verf, line in verfs.items(): + if verf in list(map(lambda x: x[0], 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)) + +print(f"VARNING! {missingVerfs} saknas i verifikat listan men refereras till av korrektioner!") + +print(f"Tar bort {len(toDelete)} korrigeringspar...") +for v, k in toDelete: + print(v, k) + del verfs[v] + 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: + krediter[verf] = line + elif line['"Debet"'] > 0: + debeter[verf] = line + +# FIND DIFFS AND LOG INTO DATA STRUCTURE for kVerf, kLine in krediter.items(): - sums[kVerf] = {"value": -float(kLine['"Kredit"'].replace(",",".").replace(" ","")), "debets": []} - toDel = [] - for dVerf, dLine in debeter.items(): - if kVerf + " " in dLine['"Beskrivning"'] or dLine['"Beskrivning"'].endswith(kVerf): - sums[kVerf]["value"] = sums[kVerf]["value"] + float(dLine['"Debet"'].replace(",",".").replace(" ","")) - sums[kVerf]["debets"] = sums[kVerf]["debets"] + [dVerf] + sums[kVerf] = {"value": -kLine['"Kredit"'], "debets": [], "date": kLine['"Datum"']} +print(sums) +toDel = [] +for dVerf, dLine in debeter.items(): + debetVal = dLine['"Debet"'] + 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") + continue + sumVal = sums[kVerf]["value"] + if abs(sumVal + debetVal) < 0.0001: + sums[kVerf]["value"] = 0 + debetVal = 0 toDel.append(dVerf) - for dVerf in toDel: - del debeter[dVerf] + elif sumVal + debetVal < 0: + sums[kVerf]["value"] = sumVal + debetVal + debetVal = 0 + toDel.append(dVerf) + else: + sums[kVerf]["value"] = sumVal + debetVal + 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 + for verf, a in sums.items(): if abs(a["value"]) > 0.0001: + total += a["value"] print(verf, ": ", a) - -#seen = {} -# -#for verf in content: -# if verf[1] not in seen.keys(): -# seen[verf[1]] = verf[0] -# else: -# seen.pop(verf[1]) -# -#for kr, verf in seen.items(): -# print(verf, kr) + else: + print(f"oki, paid verf {verf}: {a}") +print("Här kommer omatchade debeter") +for debet, debetLine in debeter.items(): + print(debet + ": " + debetLine['"Beskrivning"'] + " -- ", debetLine['"Debet"']) + total += debetLine['"Debet"'] +print(total)