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 = [] result = [] with open("konto.csv", "r") as file: lines = file.readlines() startLine = 12 # READING for i, line in enumerate(lines): if "Konto" in line and "Verifikation" in line: startLine = i break with open("konto.csv", "w") as file: file.writelines(lines[startLine:-1]) with open("konto.csv", "r") as file: csvreader = csv.DictReader(file, delimiter=";") for row in csvreader: result.append(row) with open("konto.csv", "w") as file: file.writelines(lines) # FILE RESTORED, PARSE DATA krediter = {} debeter = {} verfs = {} sums = {} header = result.pop(0) for line in result: if not line['"Verifikation"']: continue 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(" ","")) ## 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": -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) 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) 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)