visma-scripts/findUniques2.py

154 lines
4.6 KiB
Python

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)