
| Current Path : /usr/local/lib/python3.8/dist-packages/konto/parser/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : //usr/local/lib/python3.8/dist-packages/konto/parser/beitrag.py |
# coding: utf8
import os,sys,re,glob,time
try:
from konto_custom import config
except:
from konto.base import config
#*********************************************************************************
class Beitrag (object):
def __init__ (self,dir="."):
self.dir = dir
self.kk_meldung = config.KTO_KK_MELDUNG
self.kk_bnachweis = config.KTO_BEITRAGSNACHWEISE
self.krankenkasse = config.KTO_KRANKENKASSEN
self.kkmap = re.sub(r"\s","",config.MAP_KRANKENKASSEN,99999999).split(",")
#*********************************************************************************
def mark (self,remark=""):
t = time.perf_counter()
if 't0' in vars(self):
print ( ("%9.2f" % ((t-self.t0)*1000)) + " ms for: " + remark )
self.t0 = t
#********************************************************************************
def parse_beitragsnachweise (self):
kkdatum = {}
self.betriebsnr_kk = {}
ktofile = glob.glob("*.kto") + glob.glob("*.kto.html")
if not len(ktofile) == 1:
print("Ktofile ambiguous.")
return()
buchungen = []
for zeile in open(ktofile[0]).read().split("\n"):
if not re.search('^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.*-meld(ung|ZUS).*-meld(ung|ZUS)', zeile):
buchungen.append(zeile)
beitragsnachweise = glob.glob(self.dir+"/*.pdf") + glob.glob(self.dir+"/*.manuell") + glob.glob(self.dir+"/*.lexware")
beitragsnachweise.sort()
for beitragsnachweis in beitragsnachweise:
if "_orig." in beitragsnachweis:
continue
buchungen1 = []
text = ""
if "pdf" in beitragsnachweis.lower():
os.system("pdftotext -layout " + beitragsnachweis + " __xx.txt")
text = open("__xx.txt").read()
print(beitragsnachweis)
if len(text) < 10:
text = open(beitragsnachweis).read()
text = self.normalize_text(text)
m = re.search('Einzu.sstelle.*Betriebsnummer\:? +(\d+)(.*?)(Name|\:) +([^\n ]+)', text, re.DOTALL)
if not m:
continue
kknr = m.group(1)
remark = m.group(4) + ' ' + m.group(1)
remark = re.sub('[\\n-]/', ' ', remark, 9999, re.DOTALL)
remark = re.sub('^(.*?) +(.*?) .*? (\d+)$', '\\1 \\2 \\3', remark)
ind = self.kkmap.index(kknr)
kkid = self.kkmap[ind+1]
kkname = self.kkmap[ind+2]
print("Beitragsnachweis",beitragsnachweis)
m = re.search('(TAN|Transaktionsnummer\:) +(\d\d\d\d\d\d\d\d\d+)\D', text)
if not m:
m = re.search('TAN\*', text)
if not m:
continue
tan = "999999999"
else:
tan = m.group(2)
tan = re.sub("00000000","",tan)
m = re.search('Betriebsnummer\:? +(\d\d\d\d\d\d\d\d)\D', text)
if not m:
continue
betriebsnummer = m.group(1)
m = re.search('(Erstellungsdatum|Sendedatum)\\:? +(\d\d)\.(\d\d)\.(\d\d)(\d\d)\D', text)
if not m:
sendedatum = "999999"
else:
sendedatum = m.group(5) + m.group(3) + m.group(2)
text = re.sub('(.*) +ohne +Sozialausgleich(.*)', '', text, 9999) # wegen doppelt eingetragener Betraege
print("123")
m = re.search('(Beginn\:?|Zeitraum +von) +(\d+)\.(\d+)\.(\d+).*?(Ende\:?|Zeitraum +bis) +(\d+)\.(\d+)\.(\d+)', text, re.DOTALL)
if not m:
continue
if not m.group(3) == m.group(7):
continue
if not m.group(4) == m.group(8):
continue
jahr = m.group(4)
monat = m.group(3)
newname = kkid + '_' + kknr + '__' + jahr + '_' + monat + '__' + sendedatum + "_" + betriebsnummer + "_" + tan
text = re.sub('(\d)\.(\d+\,\d\d)', '\\1\\2', text, 9999)
o = kknr + ',' + jahr + monat
if o in kkdatum:
kkdatum[o] = kkdatum[o] + 1
else:
kkdatum[o] = 20
datum = jahr + monat + '%02u' % kkdatum[o]
new_addtext = False
stornofaktor = 1.0
remarkadd = ""
add_mode = ""
if "Storno " in text or "S: Stornier" in text or "S: Stornier" in text or "S:Stornier" in text :
stornofaktor = -1.0
remarkadd = "manuell storniert - "
if re.search(r"Stornierung +(JA|Ja|ja)",text):
stornofaktor = -1.0
# add_mode = "POSITIV"
# print("STS",jahr+monat,st)
remarkadd = "Stornierung - "
while (0 == 0):
m = re.search('^(.*\n)(.*?Pausch\S*|Storno|Beitrae?\"?ge? [a-z]\S*|Zusatzb\S*|Umlage\S*) ([^\n]*?) *(\-?\d+)\,(\d\d)', text, re.IGNORECASE + re.DOTALL)
if not m:
break
text = m.group(1)
remark1 = remark + ', ' + m.group(2) + ' ' + m.group(3)
remark1 = re.sub('\n', ' ', remark1, 9999, re.DOTALL)
ktob = "-" + kkid + '-meldung-' + datum[6:8]
if 'Storno' in remark1:
continue
elif re.search(', Beitr.*Krankenvers.*allgem', remark1):
ktoa = '-KV-meldung'
elif re.search(', Zusatzbeitr.*Krankenvers', remark1):
ktoa = '-KV-meldZUS'
elif re.search(', Beitr.*Krankenvers.*geringf', remark1):
ktoa = '-KV-meldung'
elif re.search(', Pauschal.*Krankenvers', remark1):
ktoa = '-KV-meldung'
elif re.search(', Beitr.*Krankenvers.*erm', remark1):
ktoa = '-EV-meldung'
elif ' Arbeitsfoerderung' in remark1 or 'Arbeitslosen' in remark1:
if "halb" in remark1 or "pauschal" in remark1.lower():
ktoa = '-BV-meldung'
else:
ktoa = '-AV-meldung'
elif ' Rentenversicherung' in remark1:
if "halb" in remark1 or "pauschal" in remark1.lower():
ktoa = '-XV-meldung'
else:
ktoa = '-RV-meldung'
elif ' Pflegeversicherung' in remark1:
ktoa = '-PV-meldung'
elif ' Krankheitsaufwendungen' in remark1:
ktoa = '-U1-meldung'
elif ' Mutterschaftsaufwendungen' in remark1:
ktoa = '-U2-meldung'
elif ' Insolvenzgeldversicherung' in remark1:
ktoa = '-U3-meldung'
elif re.search('inheitliche *P', remark1):
ktoa = '-ST-meldung'
elif ' UST' in remark1:
ktoa = '-xxUSTxx-meldung'
elif ' einzubehaltene' in remark1:
ktoa = '-LS-meldung'
elif ' pauschal' in remark1:
ktoa = '-PL-meldung'
elif ' Solidarit' in remark1:
ktoa = '-SZ-meldung'
elif ' Kirchensteuer roem' in remark1:
ktoa = '-KR-meldung'
elif ' Kirchensteuer evan' in remark1:
ktoa = '-KE-meldung'
elif ' Kirchensteuer altk' in remark1:
ktoa = '-KA-meldung'
elif ' Kirchensteuer isra' in remark1:
ktoa = '-KB-meldung'
elif re.search(' Sae?umn| Mahn|gebuehr', remark1):
ktoa = '-saeumn'
elif re.search(' Beitrae?g| Betriebspr', remark1):
ktoa = '-beitrag'
elif re.search(' Umbuchung +Leistung+ U1', remark1):
ktoa = '-umbuchung'
else:
continue
betrag1 = float(m.group(4) + '.' + m.group(5))
betrag1 = (-betrag1) * stornofaktor
if "POSITIV" in (beitragsnachweis+add_mode):
betrag1 = - ( float(m.group(4) + '.' + m.group(5)) )
if abs(betrag1) > 0.0001:
buchungen.append(datum + " " + '%3.2f' % betrag1 + " " + self.kk_meldung + ktob + " " + self.kk_bnachweis + "-" + kkid + ktoa + " 0.00 " + remarkadd + remark1)
# print(buchungen[-1])
# print(buchungen1)
buchungen = buchungen + buchungen1
if "POSITIV" in (beitragsnachweis+add_mode):
newname = newname + "__POSITIV"
newname = re.sub("__NEGATIV","",newname,99)
m = re.search('^(.*)\.(.*?)$',beitragsnachweis) # renaming the original files
filename = m.group(1)
# print("xxxx26",filename,newname)
if not filename == newname:
# print('rename file ' + beitragsnachweis + ' to ' + newname + "." + m.group(2))
os.rename(beitragsnachweis, newname + '.' + m.group(2))
zeilen = []
for buchung in buchungen:
# print(buchung)
zeilen.append(' '.join(buchung))
# print(zeilen[-1])
ktotext = '\n'.join(buchungen) + '\n'
open(ktofile[0],"w").write(ktotext)
#************************************************************************************************************
def normalize_text (self,text,extended=""):
text = re.sub(r"ä", "ae",text,99999999)
text = re.sub(r"ö", "oe",text,99999999)
text = re.sub(r"ü", "ue",text,99999999)
text = re.sub(r"Ä", "Ae",text,99999999)
text = re.sub(r"Ö", "Oe",text,99999999)
text = re.sub(r"Ü", "Ue",text,99999999)
text = re.sub(r"ß", "ss",text,99999999)
text = re.sub(r"a\"", "ae",text,99999999)
text = re.sub(r"o\"", "oe",text,99999999)
text = re.sub(r"u\"", "ue",text,99999999)
text = re.sub(r"A\"", "Ae",text,99999999)
text = re.sub(r"O\"", "Oe",text,99999999)
text = re.sub(r"U\"", "Ue",text,99999999)
text = re.sub(r"s\"", "ss",text,99999999)
text = re.sub(r"&", "u", text,99999999)
text = re.sub(r"\t", " ",text,99999999)
text = re.sub(chr(13),"", text,99999999)
if not extended == "":
text = re.sub(r"[\+\-\. \;\:\,\(\)\[\]\\\/]","_", text,99999999)
text = re.sub(r" ", "_", text,99999999)
return(text)
#******************************************************************************
if __name__ == "__main__":
Beitrag().parse_beitragsnachweise()