
| Current Path : /home/ift/52_procpy/fibu/ |
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 : //home/ift/52_procpy/fibu/account3_add_comments.py |
# coding: utf-8
import os,sys,re,codecs,glob
class Sozvers (object):
def __init__ (self,fibu):
self.fibu = fibu
self.betriebsnr_kk = {}
#******************************************************
def monatnr (self,text):
text = re.sub(r"Januar", "01",text,9999)
text = re.sub(r"Februar", "02",text,9999)
text = re.sub(r"M..?rz", "03",text,9999)
text = re.sub(r"April", "04",text,9999)
text = re.sub(r"Mai", "05",text,9999)
text = re.sub(r"Juni", "06",text,9999)
text = re.sub(r"Juli", "07",text,9999)
text = re.sub(r"August", "08",text,9999)
text = re.sub(r"September", "09",text,9999)
text = re.sub(r"Oktober", "10",text,9999)
text = re.sub(r"November", "11",text,9999)
text = re.sub(r"Dezember", "12",text,9999)
text = re.sub(r"alenderjahr","13",text,9999)
return(text)
#******************************************************
def parse_beitragsnachweise (self,ktodata):
kkdatum = {}
self.betriebsnr_kk = {}
files = ( glob.glob(ktodata['KTODIR']+"/*.ocr") +
glob.glob(ktodata['KTODIR']+"/*.manuell") +
glob.glob(ktodata['KTODIR']+"/*.lexware") )
if len(files) == 0:
return()
text = []
for zeile in ktodata['CONTENT'].split("\n"):
if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* -meldung",zeile):
text.append(zeile)
ktodata['CONTENT'] = "\n".join(text) + "\n"
files.sort()
for file in files:
print (file)
buchungen = []
text = open(file).read()
text = self.fibu.normalize_text(text)
m = re.search("TAN +(\d\d\d\d\d\d\d\d\d)\D",text)
if not m:
continue
newname = m.group(1)
m = re.search("Betriebsnummer +(\d\d\d\d\d\d\d\d)\D",text)
if not m:
continue
newname = newname + "_" + m.group(1)
m = re.search("Sendedatum\:? +(\d\d)\.(\d\d)\.(\d\d)(\d\d)\D",text)
if not m:
continue
newname = newname + "_" + m.group(4) + m.group(2) + m.group(1)
text = re.sub(r"Techniker Krankenkasse","TKK", text,9999)
text = re.sub(r"Minijob.*Zentrale","Knappschaft",text,9999)
text = re.sub(r"\-?Rechtskreis +(West|Ost)"," RK\\1",text,9999)
text = re.sub(r" BKK +"," BKK", text,9999)
text = re.sub(r" DAK-"," DAK ", text,9999)
text = re.sub(r"(.*) +ohne +Sozialausgleich(.*)","", text,9999) # wegen doppelt eingetragener Betraege
m = re.search("Einzugs+telle.*?Name +([a-zA-Z0-9]+)",text,re.DOTALL)
if m:
(kknr,kk) = self.fibu.rules.kknr(text)
m = re.search(r"Zeitraum +von +(\d+)\.(\d+)\.(\d+).*?Zeitraum +bis +(\d+)\.(\d+)\.(\d+)",text,re.DOTALL)
if not m:
continue
if not m.group(2) == m.group(5) or not m.group(3) == m.group(6):
continue
jahr = m.group(3)
monat = m.group(2)
newname = newname + "_" + (kk+"______")[0:6] + "__" + jahr + "_" + monat;
newname = re.sub(r"KNAPPS","MINIJO",newname)
text = re.sub(r"(\d)\.(\d+\,\d\d)","\\1\\2",text,9999)
m = re.search(r"Einzugsstelle.*Betriebsnummer +(\d+)(.*?)Name +([^\n ]+)",text,re.DOTALL)
if not m:
continue
self.betriebsnr_kk[kknr] = m.group(1)
remark = m.group(3) + " " + m.group(1)
remark = re.sub(r"[\n-]/"," ",remark,9999,re.DOTALL)
remark = re.sub(r"^(.*?) +(.*?) .*? (\d+)$","\\1 \\2 \\3",remark)
buchungen1 = []
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
while (0 == 0):
m = re.search(r"^(.*)(BetrPr *| *)\nB?e?t?r?P?r? ?(einheitliche|Umlage|Beitra[e\"]?ge|Storno|Zusatzbeitr\S*) (.*?) *(\-?\d+)\,(\d\d)",
text,re.IGNORECASE+re.DOTALL)
if not m:
break
text = m.group(1)
# print ("----------------------------")
# print (text)
# print ("=======================")
remark1 = remark+", " + m.group(2) + m.group(3) + " " + m.group(4)
remark1 = re.sub(r"\n"," ",remark1,9999,re.DOTALL)
ktoa = None
ktob = "10-1510-" + kknr + "-meldung-" + datum[6:8]
if " zur Krankenversicherung" in remark:
ktoa = "11-"+kknr+"-KV-BE-meldung"
elif " Zusatzbei" in remark1:
ktoa = "11-"+kknr+"-KV-ZU-meldung"
elif " Arbeitsfoerderung" in remark1:
ktoa = "11-"+kknr+"-AV-meldung"
elif " Rentenversicherung" in remark1:
ktoa = "11-"+kknr+"-RV-meldung"
elif " Pflegeversicherung" in remark1:
ktoa = "11-"+kknr+"-PV-meldung"
elif " Krankheitsaufwendungen" in remark1:
ktoa = "11-"+kknr+"-U1-meldung"
elif " Mutterschaftsaufwendungen" in remark1:
ktoa = "11-"+kknr+"-U2-meldung"
elif " Insolvenzgeldversicherung" in remark1:
ktoa = "11-"+kknr+"-U3-meldung"
elif " einheitliche" in remark1:
ktoa = "11-"+kknr+"-ST-meldung"
elif " Storno" in remark1:
ktoa = "11-"+kknr+"-ZZ-meldung"
elif " UST" in remark1:
ktoa = "11-"+kknr+"-xxUSTxx-meldung"
elif " einzubehaltene" in remark1:
ktoa = "11-"+kknr+"-LS-meldung"
elif " pauschal" in remark1:
ktoa = "11-"+kknr+"-PL-meldung"
elif " Solidarit" in remark1:
ktoa = "11-"+kknr+"-SZ-meldung"
elif " Kirchensteuer roem" in remark1:
ktoa = "11-"+kknr+"-KR-meldung"
elif " Kirchensteuer evan" in remark1:
ktoa = "11-"+kknr+"-KE-meldung"
elif " Kirchensteuer altk" in remark1:
ktoa = "11-"+kknr+"-KA-meldung"
elif " Kirchensteuer isra" in remark1:
ktoa = "11-"+kknr+"-KB-meldung"
elif re.search(r" Sae?umn| Mahn|gebuehr",remark1):
ktoa = "11-"+kknr+"-saeumn"
elif re.search(r" Beitrae?g| Betriebspr",remark1):
ktoa = "11-"+kknr+"-beitrag"
elif re.search(r" Umbuchung +Leistung+ U1",remark1):
ktoa = "11-"+kknr+"-umbuchung"
betrag1 = float(m.group(5)+"."+m.group(6))
if abs(betrag1) > 0.00001:
buchungen1.append([datum,"%3.2f" % betrag1,ktoa,ktob,"0.00",remark1])
buchungen = buchungen + buchungen1
m = re.search(r"^(.*)[\\\/](.*)\.(.*?)$",file) # renaming the original files
filename0 = m.group(1) + "/" + m.group(2)
filename = m.group(1) + "/" + newname
if not filename0 == filename:
print ("rename file " + filename0 + " to " + filename)
os.rename(filename0 + "." + m.group(3),filename + "." + m.group(3))
try:
os.rename(filename0 + ".pdf" ,filename + ".pdf")
except:
pass
new_addtext = True
if new_addtext:
self.fibu.make_addtext(ktodata)
zeilen = []
for buchung in buchungen:
zeilen.append(" ".join(buchung))
if buchungen:
ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(zeilen) + "\n"
#******************************************************
def parse_sozmeldungen (self,ktodata):
kkdatum = {}
self.betriebsnr_kk = {}
new_addtext = False
files = ( glob.glob(ktodata['KTODIR']+"/*.ocr") )
if len(files) == 0:
return()
buchungen = []
for zeile in ktodata['CONTENT'].split("\n"):
if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* -ME-.*SozMeld",zeile):
buchungen.append(zeile)
files.sort()
for file in files:
text = open(file).read()
text = self.fibu.normalize_text(text)
text = re.sub(r"(\d)\.(\d+\,\d\d)","\\1\\2",text,9999)
m = re.search(r"Meldebescheinigung.*?Name\:?\s+([A-Za-z]+).+?Vorname\:?\s+([A-Za-z])",text,re.DOTALL)
if not m:
continue
m = re.search("sicherungsnum.*?Name.*?([A-Za-z]+).*?Vorname.*?([A-Za-z])",text,re.DOTALL)
if not m:
continue
person = (m.group(2)[0] + m.group(1)).lower()
if person[0:2] == "ss":
person = (m.group(2)[0:2] + m.group(1)).lower()
m = re.search(r"Beschaeftigung +(von|bis) +(\d\d)\.(\d\d)\.(\d\d\d\d)",text)
if not m:
continue
day = m.group(4) + m.group(3) + m.group(2)
kk = "allg"
if re.search(r"Techniker +Krankenkasse",text):
kk = "TKK"
if re.search(r"Knappschaft.*Bahn-See",text):
kk = "MINIJOB"
m = re.search("Personengruppe +(\d+)",text)
pgr = m.group(1)
m = re.search("Grund +der +Abgabe +(\d+) +\= +(.*)",text)
grund = m.group(1)
beschreibung = m.group(2)
m = re.search("Krankenversicherung +(\d).*?Rentenversicherung +(\d).*?Pflegeversicherung +(\d).*?Arbeitslosenversicherung +(\d)",text,re.DOTALL)
param = m.group(1) + m.group(2) + m.group(3) + m.group(4)
m = re.search(r"^(.*)[\\\/](.*)\.(.*?)$",file) # renaming the original files
newname = day + ".SV_" + grund + "_" + re.sub(r" ","_",beschreibung,9999) + "_" + person + "_" + kk
filename0 = m.group(1) + "/" + m.group(2)
filename = m.group(1) + "/" + newname
if not filename0 == filename:
print ("rename file " + filename0 + " to " + filename)
os.rename(filename0 + "." + m.group(3),filename + "." + m.group(3))
os.rename(filename0 + ".pdf" ,filename + ".pdf")
new_addtext = True
if new_addtext:
self.fibu.make_addtext(ktodata)
buchungen.append(day + " 0.01 -ME-" + person + "-" + kk.lower() + " 21-AN-" + person + "-"
+ kk.lower() + "-" + grund + pgr + param + " 0.00 SozMeld " +
grund + ", PersGr " + pgr + ", Merkmale " + param + ", " + kk.upper() )
ktodata['CONTENT'] = "\n".join(buchungen) + "\n"
# print (ktodata['CONTENT'][0:1000])
#******************************************************************************************
def parse_krankmeldung (self,ktodata):
ktodata['RULES_APPLY'] = 0
if ktodata['RULES_APPLIED'] == True:
self.fibu.idem_kto(ktodata,0.99)
return()
kkdatum = {}
self.betriebsnr_kk = {}
new_addtext = False
files = ( glob.glob(ktodata['KTODIR']+"/*.ocr") + glob.glob(ktodata['KTODIR']+"/*.manuell") )
if len(files) == 0:
return()
buchungen = []
for zeile in ktodata['CONTENT'].split("\n"):
if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* Ausfall",zeile):
buchungen.append(zeile)
files.sort()
for file in files:
text = open(file).read()
text = self.fibu.normalize_text(text)
text = re.sub(r"(\d)\.(\d\d\d)\,","\\1\\2\,",text,9999)
while (0 == 0):
o9 = text
text = re.sub(r"(\d+) ?(\d*) ?\, ?(\d) ?(\d)","\\1\\2,\\3\\4",text)
if text == o9:
break
text = re.sub(r"[\'\"\|\]\[\(\)]","",text,99999999)
kk = "allg"
if re.search(r"(15027365|Techniker +Krankenkasse)",text):
kk = "TKK"
if re.search(r"(98000006|Knappschaft.*Bahn-See)",text):
kk = "MINIJOB"
m = re.search(r"(Personalnummer|Arbeitnehmer).*?Name.*?([A-Za-z]+).*?Vorname.*?([A-Za-z]+)",text,re.DOTALL)
if not m:
continue
person = (m.group(3)[0] + m.group(2)).lower()
if person[0:2] == "ss":
person = (m.group(3)[0:2] + m.group(2)).lower()
m = re.search(r"Erstattungszeitraum.*?Vom.*?(\d+)\.(\d+)\.(\d\d)(\d+)",text,re.DOTALL)
if not m:
continue
datum = m.group(3) + m.group(4) + m.group(2) + m.group(1)
m = re.search(r"Erstattungsbetrag.*?(\d+)\,(\d+)",text,re.DOTALL)
if not m:
continue
betrag = m.group(1) + "." + m.group(2)
m = re.search("Monatliches.*?(\d+)\,(\d\d)",text,re.DOTALL)
if not m:
continue
brutto = m.group(1) + "." + m.group(2)
azeit = 40
m = re.search("Arbeitszeit +w.*?chentl.*?(\d+)\,(\d+)",text,re.DOTALL)
if not m:
continue
azeit = m.group(1) + "." + m.group(2)
m = re.search("Erstattungssatz.*?(\d+)\,(\d+)",text,re.DOTALL)
if not m:
continue
esatz = m.group(1) + "." + m.group(2)
m = re.search("Fortgezahltes.*?(\d+)\,(\d+)",text,re.DOTALL)
if not m:
continue
fortz = m.group(1) + "." + m.group(2)
m = re.search("Arbeitszeit +t.*glich.*?(\d+)\,(\d+)",text,re.DOTALL)
if not m:
continue
az = float(m.group(1) + "." + m.group(2))
if az < 0.1 and float(azeit) > 0.0:
az = ("%3.1f" % (float(azeit)/5.0))
m = re.search("Ausgefallene +Arbeitstage.*?(\d+)",text,re.DOTALL)
if m:
ktage = m.group(1)
else:
ktage = "0"
if float(brutto) > 0:
ktage = ("%1u" % int(float(fortz)/float(brutto)*20) )
# print (file)
m = re.search(r"^(.*)[\\\/](.*)\.(.*?)$",file) # renaming the original files
filename0 = m.group(1) + "/" + m.group(2)
filename = m.group(1) + "/"
ending = m.group(3)
m = re.search("TAN +(\d\d\d\d\d\d\d\d\d)\D",text)
if not m:
continue
filename = filename + m.group(1)
m = re.search("Betriebsnummer +(\d\d\d\d\d\d\d\d)\D",text)
if not m:
continue
filename = filename + "_" + m.group(1)
filename = filename + "_Arbeitsunf_Erstattung_" + (kk+"______")[0:6] + "_" + datum + "_" + ktage + "_" + person
if not filename0 == filename:
print ("rename file " + filename0 + " to " + filename)
os.rename(filename0 + "." + ending,filename + "." + ending)
os.rename(filename0 + ".pdf" ,filename + ".pdf")
new_addtext = True
if new_addtext:
self.fibu.make_addtext(ktodata)
buchungen.append(datum + " " + betrag + " -kk-" + self.fibu.ukto_from_betrag(betrag) + " 12-6001-"
+ person + " 0.00 Ausfall " + ("%2u" % int(ktage)) + " Tage a " + str(float(az)) +
" Std, Monatsbrutto " + brutto + ", Satz " + esatz + ", Fortzahlung " + fortz)
ktodata['CONTENT'] = "\n".join(buchungen) + "\n"
#******************************************************************************************
def parse_stundenkk (self,ktodata):
files = ( glob.glob(ktodata['KTODIR']+"/AUX*rankmeld*") )
if len(files) == 0:
return()
buchungen = []
for zeile in ktodata['CONTENT'].split("\n"):
if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* -KK-",zeile):
buchungen.append(zeile)
files.sort()
for file in files:
text = open(file).read()
for zeile in text.split("\n"):
print (zeile)
m = re.search(r"^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +\-([a-z]+) +\d+\-\d+\-(\d+)\S+? +(\-?\d+\.\d\d) .*? +(\d+) +Tage.*? ([\d\.]+) +Std",zeile)
if m:
datum = m.group(1)
betrag = m.group(2)
kk = m.group(4)
print (kk)
person = m.group(3)
tage = m.group(6)
std = m.group(7)
buchungen.append(datum + " " + ( "%3.2f" % (float(tage)*float(std)) ) + " -KK-" +
person + "-" + kk + " 21-" + kk + " 0.00 Stunden wg Krankmeldung " +
("%2u" % int(tage)) + " Tage a " + std + " Stunden")
buchungen[-1] = re.sub(r" 1 Tage "," 1 Tag ",buchungen[-1])
ktodata['CONTENT'] = "\n".join(buchungen) + "\n"
#******************************************************************************************
def parse_projektstunden (self,ktodata):
files = ( glob.glob(ktodata['KTODIR']+"/AUX*rojekt*tunden*") )
if len(files) == 0:
return()
buchungen = []
for zeile in ktodata['CONTENT'].split("\n"):
if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* -PR-",zeile):
buchungen.append(zeile)
files.sort()
for file in files:
text = open(file).read()
for zeile in text.split("\n"):
m = re.search(r"^(\d\d\d\d\d\d\d\d) +.*?12-8400-([a-z]+).*?([a-z]+) +([\d\.]+) +\/ ([\d\.]+)",zeile)
if m:
datum = m.group(1)
kunde = m.group(2)
person = m.group(3)
stunden = m.group(4)
buchungen.append(datum + " " + ( "%3.2f" % (float(stunden)) ) + " -PR-" +
person + "-" + kunde + " 21-" + kunde + " 0.00 Stunden Projekt")
ktodata['CONTENT'] = "\n".join(buchungen) + "\n"
#********************************************************************
def parse_ktoauszug (self,ktodata):
files = ( glob.glob(ktodata['KTODIR']+"/*.ocr") +
glob.glob(ktodata['KTODIR']+"/*.manuell") )
if len(files) == 0:
return()
text = []
for zeile in ktodata['CONTENT'].split("\n"):
if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.*\-(meldung|saeumn)",zeile):
text.append(zeile)
ktodata['CONTENT'] = "\n".join(text) + "\n"
files.sort()
day = {}
entries = {}
for file in files:
buchungen = []
periode = [100000,999999]
m = re.search(r"\D(\d\d\d\d\d\d)\D+(\d\d\d\d\d\d)\D",file)
if m:
periode = [ int(m.group(1)) , int(m.group(2)) ]
periode.sort()
text = open(file).read()
text = self.fibu.normalize_text(text)
text = re.sub("BKK Verkehrsbau","VBU",text)
# print (text)
(kknr,kk) = self.fibu.rules.kknr(text)
text = re.sub(r"(\d)\.(\d\d\d)\,","\\1\\2,",text,999999);
while (0 == 0): # Punkte und Leerzeichen entfernen in Zahlendarstellungen
text1 = text
text = re.sub(r"(\s)(\d+) (\d+),","\\1\\2\\3,",text,9999)
text = re.sub(r",(\d+) (\d+)(\s)",",\\1\\2\\3",text,9999)
text = re.sub(r", (\d+)",",\\1",text,9999)
text = re.sub(r"(\d+) ,","\\1,",text,9999)
if text1 == text:
break
jahr = ""
monat = ""
text1 = []
if int(kknr) == 1517: # TKK
for zeile in text.split("\n"):
m = re.search(r"(\d\d)/(\d\d\d\d) +Faelligkeit",zeile)
if m:
jahr = m.group(2)
monat = m.group(1)
continue
m = re.search(r"(Saeumnis|[bB]eitragsnach|Gebuehr)(.*?) +(\d+)\,(\d\d)",zeile)
if m:
text1.append([jahr+monat,m.group(1) + m.group(2),m.group(3)+"."+m.group(4)])
elif int(kknr) == 1510: # DAK
for zeile in text.split("\n"):
m = re.search(r"Bezugszeitraum +(\d\d)\.(\d\d)\.(\d\d)",zeile,re.IGNORECASE)
if m:
jahr = "20" + m.group(3)
monat = m.group(2)
continue
m = re.search(r"(Forderung|Beitrag aus Betriebspruefung|Saeumniszuschlag)(.*?) +(\-?[\d ]+)\,([\d ]{2})",zeile)
if m:
text1.append([jahr+monat,m.group(1),re.sub(r" ","",m.group(3)+"."+m.group(4),99)])
else:
for zeile in text.split("\n"):
zeile = re.sub(r"\s+"," ",zeile,9999)
zeile = re.sub(r"(\D\d\d)\.(\d\d)\.(\d\d\D)","\\1.\\2.20\\3",zeile,9999)
zeile = re.sub(r"(SZ|SA) +.?(B)(S?)"," Beitrag\\3 ",zeile,9999,re.IGNORECASE) # special MobilOil
zeile = re.sub(r"(SZ|SA) +.?S"," Saeumniszuschlag ",zeile,9999,re.IGNORECASE) # special MobilOil
zeile = re.sub(r"(Beitragszahlung|im +Beitrag)","",zeile,9999,re.IGNORECASE) # special Minijob, TKK
zeile = re.sub(r"\((\d\d)\/(\d\d\d\d)\)\s*","01.\\1.\\2 ",zeile) # VBU BKK futur
zeile = re.sub(r"(Beitraege )","Beitrag ",zeile,9999) # Barmer
# zeile = re.sub(r"(\(\d\d\.\d\d\.\d\d\d\d ?- ?\d\d\.\d\d\.\d\d\d\d\)) +\d\d\.\d\d\.\d\d\d\d","\\1",zeile,9999) # AOK
# m = re.search(r"bezugszeitraum +(.*?) *$",zeile.lower()) # special DAK
# print (zeile)
m = re.search(r"(Betriebspruef|Mahngeb|Saeumnisz|Beitrags?f?e?|Beitraege|Ruecklaeuf|Forderung\s)(.*?)(\s.*?\d\d)\.(\d\d)\.(\d\d\d\d).*?\s(\-?[1-9]?\d*),(\d\d\-?)",zeile)
if m:
# print (" ---> MATCH --->",zeile)
betrag = m.group(6)+"."+m.group(7)
betrag = re.sub(r"(.*)(-$)","-\\1",betrag)
text1.append([m.group(5)+m.group(4),m.group(1)+m.group(2),betrag])
print(text1[-1])
continue
# text = re.sub(r"^(\d\d\.\d\d\.\d\d\d\d[ \-]+\d\d\.\d\d\.\d\d\d\d)(.*?)(\d\d\.\d\d\.\d\d\d\d)",
# "\\1$\\2",text,9999); # special AOK
# text = re.sub(r"^(\d\d\.\d\d\.\d\d\d\d) *\- *(\d\d\.\d\d\.\d\d\d\d)(.*?)","\\1-\\2",text,9999) # special Barmer
# text = re.sub(r"^(\d\d)[\.,](\d\d)[\.,](\d\d\d\d) "," \\1.\\2.\\3 ",text,9999)
#
# for zeile in text.split("\n"):
# zeile = re.sub(r"\s+"," ",zeile,9999)
# zeile = re.sub(r"(SZ|SA) .?(B)(S?)"," Beitrag\\3 ",zeile,9999) # special MobilOil
# zeile = re.sub(r"(SZ|SA) .?S"," Saeumniszuschlag ",zeile,9999) # special MobilOil
# zeile = re.sub(r"(Beitragszahlung|im +Beitrag)","",zeile,9999) # special Minijob, TKK
# m = re.search(r"bezugszeitraum +(.*?) *$",zeile.lower()) # special DAK
# if m:
# zeitraum = m.group(1)
# else:
# zeitraum = ""
# zeile = re.sub(r"^\s*Forderung \d\d\.\d\d\.\d\d","Forderung Beitrag "+zeitraum,zeile) # special DAK
# m = re.search(r"(Betriebspr|Beitra.?g|Saeumnis|Mahn|[A-Z].*?gebuehr|Umbuchung +Leistung +U1)(.*?)(0\d|10|11|12)([\/\.])($jahr|$jahr1)[\_ ]+(.*?)(\-?\d+)\,(\d\d)(-?)",
# zeile)
# print zeile
# if not m:
# continue
# text1.append([jahr + m.group(3) + ("%02u" % day[o9]),
# re.sub(r"--","",m.group(9) + "-" + m.group(7) + "." + m.group(8)),
# "555",
# "899",
# kk + ", " + m.group(1) + m.group(2) + m.group(3) + m.group(4) + m.group(5)])
#'''
for zeile in text1:
jjjjmm = zeile[0]
remark = zeile[1]
betrag = zeile[2]
o9 = kknr + jjjjmm + remark[0:10]
if o9 in day:
day[o9] = day[o9] + 1
else:
day[o9] = 26
dd = ("%02u" % day[o9])
# print (zeile,dd)
if "Saeumn" in remark:
ktoa = "13-6011"
ktob = "10-1500-"+kknr+"-saeumn"
elif "Mahn" in remark:
ktoa = "13-6011"
ktob = "10-1500-"+kknr+"-saeumn"
elif "Ruecklae" in remark:
ktoa = "13-6011"
ktob = "10-1500-"+kknr+"-saeumn"
remark = remark + " " + dd
elif "Beitra" in remark or "Forderung" in remark:
ktob = "10-1500-"+kknr+"-meldung-"+dd
ktoa = "10-1510-"+kknr+"-beitrag"
if not periode[0] <= int(jjjjmm) <= periode[1]:
continue
buchung = [jjjjmm + dd,
re.sub(r"--","",zeile[2]),
ktoa,ktob,"0.00",
kk + ", " + remark + ", Beitragsmonat " + jjjjmm[4:6] + "/" + jjjjmm[0:4]]
entry = jjjjmm + " " + buchung[1] + " " + ktoa + " " + buchung[5]
# print (buchung)
# print (entry)
if not entry in entries:
buchungen.append(buchung)
entries[entry] = 1
zeilen = []
for buchung in buchungen:
zeilen.append(" ".join(buchung))
if buchungen:
ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(zeilen) + "\n"
# print (ktodata['CONTENT'])
#******************************************************
class Usteuer (object):
def __init__ (self,fibu,ust_kto):
self.fibu = fibu
self.ust_kto = ust_kto.strip("-")
#*******************************************************************
# Erzeugt aus einer Buchung die entsprechende Umsatzsteuer- bzw. Vorsteuerbuchung
def qualify (self,ktodata):
text = []
for zeile in ktodata['CONTENT'].split("\n"):
m = re.search(r"^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +(\S+?) +(\S+) +(\-?\d+\.\d\d) +(.*)",zeile)
if not m:
text.append(zeile)
continue
datum = m.group(1)
betrag = m.group(2)
ktoa = m.group(3)
ktob = m.group(4)
remark = m.group(6)
if ktob.find(self.ust_kto) == 0:
continue
text.append(zeile)
if remark[0:2] == "++":
steuersatz = 19
elif remark[0:2] == "+-":
steuersatz = 7
else:
continue
buchung = [datum,betrag,ktoa,ktob,"0.00",remark]
gegenkto = int(buchung[2][0:2] == "10" and not buchung[3][0:2] == "10")
steuerart = gegenkto + int(float(buchung[1]) < 0)
steuerkto = ["U","I"][ steuerart % 2 ] + ["7","6"][ int(steuersatz == 19) ]
steuerart = ["USt.","Vorst."][ steuerart % 2 ]
buchung[1] = "%3.2f" % ( (-steuersatz*0.01/(1.0+steuersatz*0.01)) *float(buchung[1]) )
buchung[5] = ( " " + str(steuersatz) + " v.H. " + steuerart + " von " +
("%3.2f" % abs(float(buchung[1]))) + " (" + buchung[5][2:] + ")" )
buchung[3-gegenkto] = self.ust_kto + "-" + steuerkto
text.append(" ".join(buchung))
ktodata['CONTENT'] = "\n".join(text) + "\n"
#*******************************************************************
# Erzeugt aus einer Buchung die entsprechende Umsatzsteuer- bzw. Vorsteuerbuchung
def xxqualify (self,buchungen):
buchungen1 = []
for buchung in buchungen:
# break
if buchung[4][0:2] == "++":
steuersatz = 19
elif buchung[4][0:2] == "+-":
steuersatz = 7
else:
continue
gegenkto = int(buchung[2][0:2] == "10")
steuerart = gegenkto + int(float(buchung[1]) < 0)
steuerkto = ["I","U"][ steuerart % 2 ] + ["7","6"][ int(steuersatz == 19) ]
steuerart = ["USt.","Vorst."][ steuerart % 2 ]
buchung1 = buchung[:]
buchung1[1] = "%3.2f" % ( (-steuersatz*0.01) *float(buchung[1]) )
buchung1[4] = ( " " + str(steuersatz) + " v.H. " + steuerart + " von " +
("%3.2f" % float(buchung[1])) + " (" + buchung[4][2:] + ")" )
buchung1[3-gegenkto] = "11-1502-" + steuerkto
buchungen1.append(buchung1)
return(buchungen+buchungen1)
#*******************************************************************
class Bilanz (object):
def __init__ (self,fibu):
self.fibu = fibu
#*******************************************************************
def finish_year (self,ktodata):
# ktodata['RULES_APPLY'] = 0
if not ktodata['START'][0:4] == ktodata['ENDE'][0:4]:
return()
text = []
salden = {}
for o in "12,13,14-7630,13-6540,14-7603,14-7604,14-7610,11-9000,11-9001,11-9002,11-9003".split(","):
salden["-"+o] = 0.00
fix = {}
anfangsbestand = 0.00
files = ( glob.glob(ktodata['KTODIR']+"/AUX*") )
if len(files) == 1:
m = re.search(r"^(15-1000) +(\S*) +(\-?\d+\.\d\d) *$",open(file).read())
if m:
anfangsbestand = float(m.group(3))
for zeile in ktodata['CONTENT'].split("\n"):
m = re.search(r"^(\S+) +(\S*) +(\-?\d+\.\d\d) *$",zeile)
if m:
salden["-"+m.group(1)] = float(m.group(3))
if "FIX" in m.group(2):
fix["-" + m.group(1)] = 1
if re.search(r"^\d\d\d\d12.* -11-150[567]",zeile):
continue
if re.search(r"^\d\d\d\d124.* -15-",zeile):
continue
text.append(zeile)
text1 = '''
JAHR1241 -KST- -14-7603 -11-1505-JJ-berechn 0.00 Koerperschaftsteuer
JAHR1241 -SOLKST- -14-7604 -11-1505-JJ-berechn 0.00 Soli KoerpSteuer
JAHR1242 -GEWST- -14-7610 -11-1506-JJ-berechn 0.00 Gewerbesteuer
JAHR1243 -QUST- -14-7632 -11-1507-JJ-berechn 0.00 Quellensteuer
JAHR1243 -SOLI- -14-7633 -11-1507-JJ-berechn 0.00 SolidZuschlag
JAHR1243 -KIRCH- -14-7634 -11-1507-JJ-berechn 0.00 Kirchensteuer
JAHR1245 -ANF- -11-9000 -15-1100 0.00 Anfangsbestamd
JAHR1246 -EBITDA- -11-9001 -15-1200-EbitDA 0.00 EbitDA
JAHR1247 -ABSCHR- -11-9001 -15-1200-Abschr 0.00 Abschreibungen
JAHR1247 -STEUERN- -11-9002 -15-1200-Steuern 0.00 Steuern
JAHR1247 -END- -11-9003 -15-1300 0.00 Endbestand
'''
text1 = re.sub(r"-KST-", "%3.2f" % ( (salden["-12"] + salden["-13"]) * 0.15), text1)
text1 = re.sub(r"-SOLKST-", "%3.2f" % ( (salden["-12"] + salden["-13"]) * 0.15 * 0.055), text1)
text1 = re.sub(r"-GEWST-", "%3.2f" % ( (salden["-12"] + salden["-13"]) * 0.035 * 3.9), text1)
text1 = re.sub(r"-QUST-", "%3.2f" % ( (salden["-14-7630"] * 0.25) ), text1)
text1 = re.sub(r"-SOLI-", "%3.2f" % ( (salden["-14-7630"] * 0.25 * 0.055) ), text1)
text1 = re.sub(r"-KIRCH-", "%3.2f" % ( (salden["-14-7630"] * 0.25 * 0.08) ), text1)
text1 = re.sub(r"-ANF-", "%3.2f" % ( (anfangsbestand) ), text1)
text1 = re.sub(r"-EBITDA-", "%3.2f" % ( (salden["-12"] + salden["-13"] - salden["-13-6540"]) ), text1)
text1 = re.sub(r"-ABSCHR-", "%3.2f" % ( (salden["-13-6540"]) ), text1)
text1 = re.sub(r"-STEUERN-","%3.2f" % ( (salden["-14-7603"] + salden["-14-7604"] + salden["-14-7610"]) ), text1)
text1 = re.sub(r"-END-", "%3.2f" % ( (salden["-10"] + salden["-11"]
- salden["-11-9000"] - salden["-11-9001"] - salden["-11-9002"] - salden["-11-9003"]) ), text1)
text1 = re.sub(r"JAHR",ktodata['START'][0:4],text1,9999)
text1 = re.sub(r"JJ", ktodata['START'][2:4],text1,9999)
# print (text1)
ktodata['CONTENT'] = "\n".join(text) + "\n\n" + text1
# ktodata['RULES_APPLY'] = 0
#********************************************************************************************
def xxf (self):
ebit = ebitda + abschr
kst = ebit * 0.15
soli = kst * 0.055
gwst = ebit * 0.035 * 3.9
self.fibu.add(jahr+"1231","%3.2f" % kst ,"11-1505-"+jahr,"15-1505","Koerperschaftssteuer")
self.fibu.add(jahr+"1231","%3.2f" % soli ,"11-1506-"+jahr,"15-1506","Solidaritaetszuschlag")
self.fibu.add(jahr+"1231","%3.2f" % gwst ,"11-1507-"+jahr,"15-1507","Gewerbesteuer")
self.fibu.add(jahr+"1232","%3.2f" % -kst ,"11-9002-"+jahr,"17-1505","Koerperschaftssteuer")
self.fibu.add(jahr+"1232","%3.2f" % -soli ,"11-9002-"+jahr,"17-1506","Solidaritaetszuschlag")
self.fibu.add(jahr+"1232","%3.2f" % -gwst ,"11-9002-"+jahr,"17-1507","Gewerbesteuer")
aussch = self.fibu.saldo("16",jahr+"0000",jahr+"9999")
self.fibu.add(jahr+"1231","%3.2f" % aussch,"11-9003-"+jahr,"17-1501","Ausschuettung")
qust = aussch * 0.25 * 1.055
self.fibu.add(jahr+"1231","%3.2f" % qust ,"11-1508-"+jahr,"15-1508","Quellensteuer")
self.fibu.add(jahr+"1232","%3.2f" % -qust ,"11-9004-"+jahr,"16-1508","Quellensteuer")
# self.fibu.add(jahr+"1231","%3.2f" % (gewinn * 0.15 * 0.055) ,"11-9003-"+jahr,"15-1200","Soli KoerpSteuer")
# self.fibu.add(jahr+"1231","%3.2f" % (gewinn * 0.035 * 3.9) ,"11-9004-"+jahr,"15-1200","Quellensteuer")
#*******************************************************************
class Abschreibung (object):
def __init__ (self,fibu):
self.fibu = fibu
#*******************************************************************
def qualify (self,ktodata):
text = []
for zeile in ktodata['CONTENT'].split("\n"):
m = re.search(r"^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +(\S+?) +(\S+) +(\-?\d+\.\d\d) +(.*)",zeile)
if m and m.group(4)[0:7] == "13-6540":
continue
text.append(zeile)
m = re.search(r"^(\d\d)([123456789ABC])\_(\d+)(.*?)-AN +(\S+) *$",zeile)
if m:
abschreibungsjahr = m.group(1)
kaufmonat = m.group(2)
abschreibungsanteil = int(m.group(3))
betrag = abs(float(m.group(5)))
ktoa = "-" + m.group(1) + m.group(2) + "_" + m.group(3) + m.group(4) + "-AS"
else:
continue
# print (zeile)
if kaufmonat in "ABC":
kaufmonat = { "A": "10", "B": "11", "C": "12" }[kaufmonat]
teilabschreibung = 13 - int(kaufmonat)
if abschreibungsanteil == 1:
teilabschreibung = 12
restwert = betrag
jahr = int("20" + abschreibungsjahr)
zaehler = 1
while (0 == 0):
datum1 = ("%04u" % jahr) + "1228"
erstjahresanteil = float(teilabschreibung) / 12.0
abschreibungsbetrag = - float("%3.2f" % (min(erstjahresanteil * betrag / abschreibungsanteil,restwert) ))
# print betrag, abschreibungsbetrag, abschreibungsanteil, restwert
restwert = float("%3.2f" % restwert) + float("%3.2f" % abschreibungsbetrag)
if float(restwert)/float(betrag) < 0.01 * abschreibungsanteil:
abschreibungsbetrag = abschreibungsbetrag - restwert
restwert = 0.0
betrag1 = ("%3.2f" % abschreibungsbetrag)
if abs(restwert) < 0.001:
text.append(datum1 + " " + betrag1 + " " + ktoa + " 13-6540" + ktoa + " 0.00 " +
"Rest-Abschreibung, Kaufwert: " + ("%3.2f" % betrag) )
break
else:
remark1 = "Abschreibung"
if teilabschreibung < 12:
remark1 = remark1 + " (" + str(teilabschreibung) + "/12)*"
remark1 = remark1 + ", " + str(zaehler) + ". Teil-Abschreibung (1/" + str(abschreibungsanteil) + ")"
remark1 = remark1 + ", Kaufwert: " + ("%3.2f" % betrag)
text.append(datum1 + " " + betrag1 + " " + ktoa + " 13-6540" + ktoa + " 0.00 " + remark1)
# print (datum1 + " " + betrag1 + " " + ktoa + " 13-6540 0.00 " + remark1)
jahr = jahr + 1
zaehler = zaehler + 1
teilabschreibung = 12
ktodata['CONTENT'] = "\n".join(text) + "\n"
ktodata['RULES_APPLY'] = 0
#******************************************************************************
class Belege (object):
def __init__ (self,fibu):
self.fibu = fibu
#******************************************************************************
def einlesen (self,ktodata):
belege = ( glob.glob(ktodata['KTODIR']+"/*.ocr") )
buchungen = []
new_addtext = False
for beleg in belege:
text = open(beleg).read()
attempt = 0 # wenn die Datei nicht im Format JJMMDD.ustremark_betrag.ocr ist, dieses
while (0 == 0): # erst versuchen zu erreichen
attempt = attempt + 1
m = re.search(r"/(\d\d\d\d\d\d\d?\d?)\.(q?[qw]?)\_?(.*?)\_(\d+)\_(\d\d)","/"+beleg)
if m:
datum = m.group(1)
if len(datum) == 6:
datum = "20" + datum
ust = m.group(2)
remark = m.group(3)
betrag = "%3.2f" % float(m.group(4)+"."+m.group(5))
if not "minus" in remark:
betrag = "-" + betrag
betrag = re.sub(r"^--","",betrag)
buchungen.append([datum,betrag,"-","13-9999","0.00",remark])
break
else:
if attempt == 1:
erg = self.analyze(beleg)
if not erg:
print (beleg, "could not be parsed")
else:
datum1 = erg[2]
ust = erg[1]
betrag = erg[0]
m = re.search(r"^(\d+)\.(\d\d)$","%3.2f" % float(betrag))
newname_remark = re.sub(r"\_+$","",self.remark.keys()[0])
if newname_remark == "":
newname_remark = ( random.choice("abcdefghijkmnpqrstuvwxyz") +
random.choice("abcdefghijkmnpqrstuvwxyz") )
newname = ( datum1 + "." + ust + newname_remark + "_" + m.group(1) + "_" + m.group(2))
print (newname, "<--------------")
m = re.search(r"^(.*)[\\\/](.*)\.pdf$",beleg)
if m:
newname = m.group(1) + "/" + newname
oldname = m.group(1) + "/" + m.group(2)
# print newname,oldname
if os.path.isfile(newname+".ocr") or os.path.isfile(newname+".pdf"):
pass
else:
new_addtext = True
if os.path.isfile(oldname+".pdf"):
os.rename(oldname+".pdf",newname+".pdf")
if os.path.isfile(oldname+".ocr"):
os.rename(oldname+".ocr",newname+".ocr")
beleg = newname + ".pdf"
continue
if new_addtext:
self.fibu.make_addtext(ktodata)
text = []
for buchung in buchungen:
text.append(" ".join(buchung))
# print (buchung)
# exit()
ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(text) + "\n"
#******************************************************************************
def analyze (self,beleg):
belegfile = re.sub(r"^(.*)\.pdf$","\\1",beleg)
try:
text = open(belegfile+".ocr").read()
except:
return()
m = re.search(r"^(.*)[\\\/](.*)$",belegfile)
if m:
filename = m.group(2)
else:
filename = ""
text = re.sub(r"(\d+)\.(\d\d\d),(\d\d)","\\1\\2,\\3",text,9999)
self.betraege = {}
self.stunden = {}
self.stsatz = {}
self.mitarb = {}
self.remark = { "xx" : 1 }
self.text = text
while (0 == 0): # Ermittlung der Stunden
m = re.search(r"^(.*?\D)(\d[\d+\.]*) +Stunden (.*)$",text,re.DOTALL)
if not m:
break
m1 = re.search(r"\D([\d\.\,]+)\D",m.group(3)[0:40])
stsatz = ""
if m1:
stsatz = re.sub(r",",".",m1.group(1))
self.stunden[m.group(2)+" / "+stsatz] = 1
text = m.group(1) + m.group(3)
# print belegfile,filename
m = re.search(r"[\\\/](\d?\d?)(\d\d\d\d\d\d)\_?(\D+)\_?","/"+filename) # Ermittlung des Datums
if m:
self.datum = { m.group(2) : 1 }
self.remark = { re.sub(r"\.","",m.group(3)) : 1 }
else:
m = re.search(r"[\\\/](\d\d)(\d\d)(\d\d)\.([a-z]+)\_(\D+)\_?","/"+filename)
if m:
self.datum = { "20" + m.group(3) + m.group(2) + m.group(1) : 1 }
self.mitarb = { m.group(4) : 1 }
self.remark = { m.group(5) : 1 }
if not m:
self.datum = {}
while (0 == 0):
m = re.search(r"^(.*?[^\.\,0123456789])(\d\d?)[\.\-](\d\d?)[\.\-](\d?\d?)(\d\d)([^\.\,0123456789].*)$",text,re.DOTALL)
if not m:
break
self.datum[m.group(5)+("%02u"%int(m.group(3)))+("%02u"%int(m.group(2)))] = 1
text = m.group(1) + m.group(6)
while (0 == 0): # Ermittlung aller Betraege bzw. alles dessen, was nur annaehernd wie ein Betrag aussieht
m = re.search(r"^(.*?[^\.\,0123456789])(\d+)[\,\.](\d\d)([^\.\,0123456789].*)$",text,re.DOTALL)
if not m:
break
betrag = m.group(2)+"."+m.group(3)
if float(betrag) > 0.00001:
self.betraege[betrag] = {"b":1}
text = m.group(1) + m.group(4)
while (0 == 0):
m = re.search(r"^(.*?)(Stundenaufstellung[^\n]*?, +|Name: +)(\S+).*? (\S+)(\D.*)$",text,re.DOTALL)
if not m:
break
o = (m.group(3)[0] + m.group(4)).lower()
o = re.sub("oime","onne",o)
o = re.sub(r"^ss",m.group(3)[0:2]+"s",o)
self.mitarb[o] = 1
text = m.group(1) + m.group(5)
for betrag in self.betraege:
for betrag1 in self.betraege:
if "%3.2f" % (float(betrag) / float(betrag1)) == "1.07":
self.betraege[betrag]["m"] = 1
elif "%3.2f" % (float(betrag) / float(betrag1)) == "1.19":
self.betraege[betrag]["n"] = 1
elif "%3.2f" % (float(betrag1) / float(betrag) * 1.07) == "0.07":
self.betraege[betrag]["v"] = 1
elif "%3.2f" % (float(betrag1) / float(betrag) * 1.19) == "0.19":
self.betraege[betrag]["u"] = 1
# print self.betraege
# print self.datum
# print self.remark
# print self.stunden
# print self.mitarb
ust = ""
erg = {}
datum1 = None
for betrag in self.betraege:
id = list(self.betraege[betrag].keys())
id.sort()
if "".join(id) in ("bnu","bu"):
erg[betrag] = "qq"
elif "".join(id) in ("bmv","bv"):
erg[betrag] = "qw"
elif len(self.betraege) == 1:
erg[list(self.betraege.keys())[0]] = ""
# print self.betraege
ergs = list(erg.keys())
ergs.sort(key=lambda x: float(x))
if ergs:
ust = erg[ ergs[-1] ]
erg = ergs[-1]
else:
erg = None
if len(self.datum) > 0:
self.datum = list(self.datum.keys())
self.datum.sort()
self.datum.reverse()
datum1 = self.datum[0]
# m = re.search(r"^(\d\d?)\.(\d\d?)\.(\d\d)(\d\d)",self.datum[0])
# if m:
# datum1 = m.group(4) + ("%02u" % int(m.group(2))) + ("%02u" % int(m.group(1)))
# print self.datum, datum1, erg
if datum1 and erg:
return([erg,ust,datum1])
return(None)
#******************************************************************************
def rechnungen (self,ktodata,company):
ktodata['RULES_APPLY'] = 0
if ktodata['RULES_APPLIED'] == True:
self.fibu.idem_kto(ktodata,0.99)
return()
text = []
buchungen = {}
betrktos = {}
for rechn in (glob.glob(ktodata['KTODIR'] + "/*.pdf")):
if "nterschrieben" in rechn or "ndenzettel" in rechn or "NOTVALID" in rechn or "EXCLUDE§" in rechn:
continue
self.stunden = None
self.betraege = None
self.mitarb = None
erg = self.analyze(rechn)
if "GULP" in self.text or "rogressive" in self.text:
self.text = re.sub(r"HAYS","",self.text,9999,re.IGNORECASE)
# m = re.search(r"[\n \_]" + company + "[ \_]",rechn+self.text,re.IGNORECASE)
# if not m:
# continue
if erg:
datum1 = erg[2]
ust = re.sub(r"q","+",re.sub(r"w","-",erg[1],9),9)
betrag = erg[0]
proj = ""
if self.mitarb:
o = list(self.mitarb.keys())[0]
else:
o = "unknown"
if self.stunden:
o = o + " " + list(self.stunden.keys())[0]
# m = re.search(r"\/ *(.*?)(\.|$)",self.stunden.keys()[0])
# if m:
# proj = "-" + m.group(1)
m = re.search(r"^(.*)[\\\/](.*)\.pdf$",rechn)
if m:
o = o + ", " + m.group(2)
if int(datum1[4:6]) > 31:
datum1 = datum1[0:4] + "30"
betrkto = "-" + self.fibu.ukto_from_betrag(betrag)
buchungen["20"+datum1[0:4]+betrkto+"12"] = (
["20"+datum1,betrag,betrkto,"12-8400-"+company,"0.00",ust+o+", "+company])
text = [] # ---- Doppelbuchungen ausschliessen
for zeile in ktodata['CONTENT'].split("\n"):
m = re.search(r"^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +(\S+) +(\S+) +(\-?\d+\.\d\d) +(.*)",zeile)
if not m:
text.append(zeile)
else:
datum = m.group(1)
betrag = m.group(2)
ktoa = m.group(3)
ktob = m.group(4)
remark = m.group(6)
if not (datum[0:6]+betrkto+ktob[0:2]) in buchungen:
if re.search(r"^-\d\d\d\d\d$",ktoa) or ktoa == "-":
ktoa = "-" + self.fibu.ukto_from_betrag(betrag)
buchungen[datum+betrkto+ktob+remark] = [datum,betrag,ktoa,ktob,"0.00",remark]
for buchung in buchungen.values():
text.append(" ".join(buchung))
ktodata['CONTENT'] = "\n".join(text) + "\n"
#******************************************************************************
class Lohn (object):
def __init__ (self,fibu):
self.fibu = fibu
self.gleitzone = { # FIBU-GLEITZONE-002-VALID
"12A": 400, "12B": 800,
"15A": 450, "15B": 850,
2007: 0.7673, 2008: 0.7732,
2009: 0.7472, 2010: 0.7585,
2011: 0.7435, 2012: 0.7491,
2013: 0.7605, 2014: 0.7605,
2015: 0.7585, 2016: 0.7547,
2017: 0.7547, 2018: 0.7547,
}; # Gleitzonenfaktor FIBU-GLEITZONE-002-VALID
# FIBU-BEMESSUNGSGRENZEN-002-VALID
self.rv_obergrenze = { 2007: 5800.00, 2008: 5800.00, 2009: 5800.00,
2010: 5800.00, 2011: 5800.00, 2012: 5800.00,
2013: 5800.00, 2014: 5950.00, 2015: 6050.00,
2016: 6200.00, 2017: 6350.00 }
self.kv_obergrenze = { 2007: 3937.50, 2008: 3937.50, 2009: 3937.50,
2010: 3937.50, 2011: 3937.50, 2012: 3937.50,
2013: 3937.50, 2014: 4050.00, 2015: 4125.00,
2016: 4237.50, 2017: 4350.00 }
# FIBU-BEMESSUNGSGRENZEN-002
#*******************************************************************
def sozvers (self,ktodata):
self.sort_sozvers = "LO,SO,LS,SZ,KR,KE,KA,KI,PL,KV,RV,AV,PV,U1,U2,U3,ZA".split(",")
summen = {}
text = []
ee = []
has_old_values = ""
for zeile in ktodata['CONTENT'].split("\n"):
m = re.search(r"^(\d\d\d\d)(\d\d)(\d\d) +\-?(\d+\.\d\d) +(\S.*?)([a-z]+)(\-?\S*) +\S+ +(\-?\d+\.\d\d) +(.*)",zeile)
if not m:
text.append(zeile)
continue
jahr = m.group(1)
monat = int(m.group(2)) - 1
datum = m.group(1) + m.group(2) + m.group(3)
betrag = float(m.group(4))
anr = m.group(5)
person = m.group(6)
art = re.sub(r"-","",m.group(7))
remark = m.group(9)
ee.append([jahr,monat,datum,betrag,anr,person,art,remark,zeile])
ee.sort(key=lambda x: x[0] + ("%02u" % x[1]) + x[2] + x[5] + ("%1u" % (1 + int("LOHN" in x or "SOND" in x))))
for entry in (ee):
(jahr,monat,datum,betrag,anr,person,art,remark,zeile) = tuple(entry)
if art == "ZAHL":
text.append(zeile) # + " {{SORTIDX: " + person + self.sozvers_sortidx("ANZA") +"}}")
continue
elif art in ("LOHN","LOHNG","LOHNH","SOND"):
text.append(zeile) # + " {{SORTIDX: " + person + self.sozvers_sortidx("AN"+art) +"}}")
if has_old_values == person + jahr + ("%02u" % monat):
continue
else:
if not jahr == "2017":
text.append(zeile) # + " {{SORTIDX: " + person + self.sozvers_sortidx(anr+art) +"}}")
has_old_values = person + jahr + ("%02u" % monat)
# print (has_old_values,zeile)
continue
# print (person+jahr+str(monat),art)
if not (person+jahr) in summen:
summen[person+jahr] = { 'LOHN': ([0.00] * 12),
'LS': ([0.00] * 12),
'SZ': ([0.00] * 12),
'KS': ([0.00] * 12),
'BUCHUNGEN': ([[]] * 12),
'REMARK': ([''] * 12)}
summen[person+jahr]['LOHN'][monat] = summen[person+jahr]['LOHN'][monat] + betrag
summen[person+jahr]['REMARK'][monat] = remark + "|" + summen[person+jahr]['REMARK'][monat]
betrag = summen[person+jahr]['LOHN'][monat] # um mehrere zahlungen pro Monat zu beruecksichtigen
remark = summen[person+jahr]['REMARK'][monat]
buchungen = []
kinderlos = 0
rvbefreit = 0
red_betr = None
# print ("RR",betrag)
m = re.search(r"Gleitzone(\d*)",remark) # FIBU-GLEITZONE-001-VALID
if m:
d = jahr[0:-len(m.group(1))] + m.group(1)
if int(d) < 2013:
gl0 = self.gleitzone["12A"]
gl1 = self.gleitzone["12B"]
else:
gl0 = self.gleitzone["15A"]
gl1 = self.gleitzone["15B"]
if gl0 < betrag < gl1:
red_betrag = (self.gleitzone[int(jahr)] * 450 +
( (gl1/(gl1-gl0)) - (gl0/(gl1-gl0)) * self.gleitzone[int(jahr)] ) * (betrag - 450) )
ag_anteil = { "RV": 0.00, "AV": 0.00, "KV": 0.00, "PV": 0.00 }
gesamt = { "RV": 0.00, "AV": 0.00, "KV": 0.00, "PV": 0.00 } # FIBU-GLEITZONE-001
m = re.search(r"PauschSt +(\d+).*kurzfri",remark)
if m: # FIBU-PAUSCHALSTEUER-001-VALID
buchungen.append([datum,"%3.2f"%(float(m.group(1))*0.01*betrag),
"11-1500-AR-"+person,"11-1503-PL-"+person,"0.00","Pauschalsteuer"
# ,"{{SORTIDX: " + person + self.sozvers_sortidx("ARPL") + "}}"
])
# FIBU-PAUSCHALSTEUER-001
m = re.search(r"([A-Za-z]+) *, +SV-AN\: +([\d\.]+)\/([\d\.]+)\/([\d\.]+)\/([\d\.]+)",remark)
if m:
(kknr,kk) = self.fibu.rules.kknr(" "+remark+" ")
sozvers_faktoren = [[m.group(2),"RV",""],[m.group(3),"AV",""],[m.group(4),"KV","-S"],[m.group(5),"PV","-S"]]
m = re.search(r"Zuschl\: +([\d\.]+)\/([\d\.]+)",remark)
if m:
sozvers_faktoren = sozvers_faktoren + [[m.group(1),"KV","-Z"],[m.group(2),"PV","-Y"]]
sozvers_faktoren.append(None)
m = re.search(r" SV-AR\: +([\d\.]+)\/([\d\.]+)\/([\d\.]+)\/([\d\.]+)",remark)
if m:
sozvers_faktoren = sozvers_faktoren + [[m.group(1),"RV",""],[m.group(2),"AV",""],[m.group(3),"KV",""],[m.group(4),"PV",""]]
m = re.search(r" Uml\: +([\d\.]+)\/([\d\.]+)\/([\d\.]+)",remark)
if m:
sozvers_faktoren = sozvers_faktoren + [[m.group(1),"U1",""],[m.group(2),"U2",""],[m.group(3),"U3",""]]
ANR = "AR"
sozvers_faktoren.reverse()
for o in sozvers_faktoren:
if o == None:
ANR = "AN" # Umschalten
elif float(o[0]) > 0.0001:
# FIBU-BEMESSUNGSGRENZEN-001-VALID
if o[1] in ("RV","AV"):
beitrag = float(o[0])*0.01* ( min(betrag,
max(0,self.rv_obergrenze[int(jahr)]*12 - sum( summen[person+jahr]['LOHN'][0:monat] )) ) )
else:
beitrag = float(o[0])*0.01* ( min(betrag,
max(0,self.kv_obergrenze[int(jahr)]*12 - sum( summen[person+jahr]['LOHN'][0:monat] )) ) )
# FIBU-BEMESSUNGSGRENZEN-001
if red_betr: # FIBU-GLEITZONE-001-VALID
if o[1] in ("RV","AV","KV","PV"):
gesamt[o[1]] = gesamt[o[1]] + float(o[0])*0.01*red_betr
if ANR == "AR":
ar_anteil[o[1]] = beitrag
if ANR == "AN" and o[2] in ("","-S"):
beitrag = gesamt[o[1]] - ag_anteil[o[1]] # FIBU-GLEITZONE-001
buchungen.append([datum,"%3.2f"%beitrag,"11-1500-"+ANR+"-"+person+"-"+o[1]+o[2],
"11-"+kknr+"-"+ANR+"-"+o[1]+"-"+person,"0.00",ANR+"-Anteil "+o[1]+", "+kk
# ,"{{SORTIDX: " + person + self.sozvers_sortidx(ANR+o[1]+o[2]) + "}}"
] )
if o[1] == "RV":
rvbefreit = rvbefreit + 1
if o[1]+o[2] == "PV-Y":
kinderlos = 1
#------------------------------------------ # FIBU-LOHNSTEUER-001-VALID
m = re.search(r"StKl.*?(\d)\/([\d\.]+)\/([\d\.]+)([reia]?).*([\d\.]+) +Kind",remark)
if m:
if not datum[7] == "7": # Monatsabrechung
betrag1 = betrag
intmode = 2
else:
betrag1 = sum( summen[person+jahr]['LOHN'] )
intmode = 1
stkl = m.group(1)
soli = m.group(2)
kirchensteuersatz = float(m.group(3)) * 0.01
religion = m.group(4)
kinder = m.group(5)
# print datum, person, betrag, lohnjahr, intmode
# FIBU-LOHNSTEUER-PARAMS-VALID
exec("import pap.lst" + jahr)
stobj = eval("pap.lst" + jahr + ".Lst"+jahr+"()")
# <!-- 1, wenn die Anwendung des Faktorverfahrens gewählt wurden (nur in Steuerklasse IV) -->
# <INPUT name="af" type="int" default="1"/>
#
# <!-- Auf die Vollendung des 64. Lebensjahres folgende
# Kalenderjahr (erforderlich, wenn ALTER1=1) -->
# <INPUT name="AJAHR" type="int"/>
#
# <!-- 1, wenn das 64. Lebensjahr zu Beginn des Kalenderjahres vollendet wurde, in dem
# der Lohnzahlungszeitraum endet (§ 24 a EStG), sonst = 0 -->
# <INPUT name="ALTER1" type="int"/>
#
# <!-- in VKAPA und VMT enthaltene Entschädigungen nach §24 Nummer 1 EStG in Cent -->
# <INPUT name="ENTSCH" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- eingetragener Faktor mit drei Nachkommastellen -->
# <INPUT name="f" type="double" default="1.0"/>
#
# <!-- Jahresfreibetrag nach Maßgabe der Eintragungen auf der
# Lohnsteuerkarte in Cents (ggf. 0) -->
# <INPUT name="JFREIB" type="BigDecimal"/>
#
# <!-- Jahreshinzurechnungsbetrag in Cents (ggf. 0) -->
# <INPUT name="JHINZU" type="BigDecimal"/>
#
# <!-- Voraussichtlicher Jahresarbeitslohn ohne sonstige Bezüge und ohne Vergütung für mehrjährige Tätigkeit in Cent.
# Anmerkung: Die Eingabe dieses Feldes (ggf. 0) ist erforderlich bei Eingabe „sonsti-ger Bezüge“ (Feld SONSTB)
# oder bei Eingabe der „Vergütung für mehrjährige Tätigkeit“ (Feld VMT).
# Sind in einem vorangegangenen Abrechnungszeitraum bereits sonstige Bezüge gezahlt worden, so sind sie dem
# voraussichtlichen Jahresarbeitslohn hinzuzurechnen. Vergütungen für mehrere Jahres aus einem vorangegangenen
# Abrechnungszeitraum sind in voller Höhe hinzuzurechnen. -->
# <INPUT name="JRE4" type="BigDecimal"/>
#
# <!-- In JRE4 enthaltene Versorgungsbezuege in Cents (ggf. 0) -->
# <INPUT name="JVBEZ" type="BigDecimal"/>
#
# <!--Merker für die Vorsorgepauschale
# 2 = der Arbeitnehmer ist NICHT in der gesetzlichen Rentenversicherung versichert.
#
# 1 = der Arbeitnehmer ist in der gesetzlichen Rentenversicherung versichert, es gilt die
# Beitragsbemessungsgrenze OST.
#
# 0 = der Arbeitnehmer ist in der gesetzlichen Rentenversicherung versichert, es gilt die
# Beitragsbemessungsgrenze WEST. -->
# <INPUT name="KRV" type="int"/>
#
# <!-- Einkommensbezogener Zusatzbeitragssatz eines gesetzlich krankenversicherten Arbeitnehmers,
# auf dessen Basis der an die Krankenkasse zu zahlende Zusatzbeitrag berechnet wird,
# in Prozent (bspw. 0,90 für 0,90 %) mit 2 Dezimalstellen.
# Der von der Kranken-kasse festgesetzte Zusatzbeitragssatz ist bei Abweichungen unmaßgeblich. -->
# <INPUT name="KVZ" type="BigDecimal"/>
stobj.setKrv(0)
#
# <!-- Lohnzahlungszeitraum:
# 1 = Jahr
# 2 = Monat
# 3 = Woche
# 4 = Tag -->
# <INPUT name="LZZ" type="int"/>
stobj.setLzz( int ( intmode ) )
#
# <!-- In der Lohnsteuerkarte des Arbeitnehmers eingetragener Freibetrag für
# den Lohnzahlungszeitraum in Cent -->
# <INPUT name="LZZFREIB" type="BigDecimal"/>
#
# <!-- In der Lohnsteuerkarte des Arbeitnehmers eingetragener Hinzurechnungsbetrag
# für den Lohnzahlungszeitraum in Cent -->
# <INPUT name="LZZHINZU" type="BigDecimal"/>
#
# <!-- Dem Arbeitgeber mitgeteilte Zahlungen des Arbeitnehmers zur privaten
# Kranken- bzw. Pflegeversicherung im Sinne des §10 Abs. 1 Nr. 3 EStG 2010
# als Monatsbetrag in Cent (der Wert ist inabhängig vom Lohnzahlungszeitraum immer
# als Monatsbetrag anzugeben).-->
# <INPUT name="PKPV" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Krankenversicherung:
# 0 = gesetzlich krankenversicherte Arbeitnehmer
# 1 = ausschließlich privat krankenversicherte Arbeitnehmer OHNE Arbeitgeberzuschuss
# 2 = ausschließlich privat krankenversicherte Arbeitnehmer MIT Arbeitgeberzuschuss -->
# <INPUT name="PKV" type="int" default="0"/>
#
# <!-- 1, wenn bei der sozialen Pflegeversicherung die Besonderheiten in Sachsen zu berücksichtigen sind bzw.
# zu berücksichtigen wären, sonst 0. -->
# <INPUT name="PVS" type="int" default="0"/>
#
# <!-- 1, wenn er der Arbeitnehmer den Zuschlag zur sozialen Pflegeversicherung
# zu zahlen hat, sonst 0. -->
# <INPUT name="PVZ" type="int" default="0"/>
#
# <!-- Religionsgemeinschaft des Arbeitnehmers lt. Lohnsteuerkarte (bei
# keiner Religionszugehoerigkeit = 0) -->
# <INPUT name="R" type="int"/>
if kirchensteuersatz > 0:
stobj.setR( 1 )
else:
stobj.setR( 0 )
#
# <!-- Steuerpflichtiger Arbeitslohn vor Beruecksichtigung der Freibetraege
# fuer Versorgungsbezuege, des Altersentlastungsbetrags und des auf
# der Lohnsteuerkarte fuer den Lohnzahlungszeitraum eingetragenen
# Freibetrags in Cents. -->
# <INPUT name="RE4" type="BigDecimal"/>
stobj.setRe4( int(betrag1*100) )
#
# <!-- Sonstige Bezuege (ohne Verguetung aus mehrjaehriger Taetigkeit) einschliesslich
# Sterbegeld bei Versorgungsbezuegen sowie Kapitalauszahlungen/Abfindungen,
# soweit es sich nicht um Bezuege fuer mehrere Jahre handelt in Cents (ggf. 0) -->
# <INPUT name="SONSTB" type="BigDecimal"/>
#
# <!-- Sterbegeld bei Versorgungsbezuegen sowie Kapitalauszahlungen/Abfindungen,
# soweit es sich nicht um Bezuege fuer mehrere Jahre handelt
# (in SONSTB enthalten) in Cents -->
# <INPUT name="STERBE" type="BigDecimal" regex_test="" regex_transform=""/>
#
# <!-- Steuerklasse:
# 1 = I
# 2 = II
# 3 = III
# 4 = IV
# 5 = V
# 6 = VI -->
# <INPUT name="STKL" type="int"/>
stobj.setStkl( int(stkl) )
#
# <!-- In RE4 enthaltene Versorgungsbezuege in Cents (ggf. 0) -->
# <INPUT name="VBEZ" type="BigDecimal"/>
#
# <!-- Vorsorgungsbezug im Januar 2005 bzw. fuer den ersten vollen Monat
# in Cents-->
# <INPUT name="VBEZM" type="BigDecimal"/>
#
# <!-- Voraussichtliche Sonderzahlungen im Kalenderjahr des Versorgungsbeginns
# bei Versorgungsempfaengern ohne Sterbegeld, Kapitalauszahlungen/Abfindungen
# bei Versorgungsbezuegen in Cents-->
# <INPUT name="VBEZS" type="BigDecimal"/>
#
# <!-- In SONSTB enthaltene Versorgungsbezuege einschliesslich Sterbegeld
# in Cents (ggf. 0) -->
# <INPUT name="VBS" type="BigDecimal"/>
#
# <!-- Jahr, in dem der Versorgungsbezug erstmalig gewaehrt wurde; werden
# mehrere Versorgungsbezuege gezahlt, so gilt der aelteste erstmalige Bezug -->
# <INPUT name="VJAHR" type="int" regex_test="" regex_transform=""/>
#
# <!-- Kapitalauszahlungen / Abfindungen / Nachzahlungen bei Versorgungsbezügen
# für mehrere Jahre in Cent (ggf. 0) -->
# <INPUT name="VKAPA" type="BigDecimal" regex_test="" regex_transform=""/>
#
# <!-- Vergütung für mehrjährige Tätigkeit ohne Kapitalauszahlungen und ohne Abfindungen
# bei Versorgungsbezügen in Cent (ggf. 0) -->
# <INPUT name="VMT" type="BigDecimal" regex_test="" regex_transform=""/>
#
# <!-- Zahl der Freibetraege fuer Kinder (eine Dezimalstelle, nur bei Steuerklassen
# I, II, III und IV) -->
# <INPUT name="ZKF" type="BigDecimal" regex_test="" regex_transform=""/>
stobj.setZkf( float(kinder ) )
#
# <!-- Zahl der Monate, fuer die Versorgungsbezuege gezahlt werden (nur
# erforderlich bei Jahresberechnung (LZZ = 1) -->
# <INPUT name="ZMVB" type="int" regex_test="" regex_transform=""/>
#
# <!-- In JRE4 enthaltene Entschädigungen nach § 24 Nummer 1 EStG in Cent -->
# <INPUT name="JRE4ENT" type="BigDecimal" default="BigDecimal.ZERO"/>
#
# <!-- In SONSTB enthaltene Entschädigungen nach § 24 Nummer 1 EStG in Cent -->
# <INPUT name="SONSTENT" type="BigDecimal" default="BigDecimal.ZERO"/>
# <!-- AUSGABEPARAMETER -->
# <OUTPUTS type="STANDARD">
# <!-- Bemessungsgrundlage fuer die Kirchenlohnsteuer in Cents -->
# <OUTPUT name="BK" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Bemessungsgrundlage der sonstigen Einkuenfte (ohne Verguetung
# fuer mehrjaehrige Taetigkeit) fuer die Kirchenlohnsteuer in Cents -->
# <OUTPUT name="BKS" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <OUTPUT name="BKV" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Fuer den Lohnzahlungszeitraum einzubehaltende Lohnsteuer in Cents -->
# <OUTPUT name="LSTLZZ" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Fuer den Lohnzahlungszeitraum einzubehaltender Solidaritaetszuschlag
# in Cents -->
# <OUTPUT name="SOLZLZZ" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Solidaritaetszuschlag fuer sonstige Bezuege (ohne Verguetung fuer mehrjaehrige
# Taetigkeit) in Cents -->
# <OUTPUT name="SOLZS" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Solidaritaetszuschlag fuer die Verguetung fuer mehrjaehrige Taetigkeit in
# Cents -->
# <OUTPUT name="SOLZV" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Lohnsteuer fuer sonstige Einkuenfte (ohne Verguetung fuer mehrjaehrige
# Taetigkeit) in Cents -->
# <OUTPUT name="STS" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Lohnsteuer fuer Verguetung fuer mehrjaehrige Taetigkeit in Cents -->
# <OUTPUT name="STV" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Für den Lohnzahlungszeitraum berücksichtigte Beiträge des Arbeitnehmers zur
# privaten Basis-Krankenversicherung und privaten Pflege-Pflichtversicherung (ggf. auch
# die Mindestvorsorgepauschale) in Cent beim laufenden Arbeitslohn. Für Zwecke der Lohn-
# steuerbescheinigung sind die einzelnen Ausgabewerte außerhalb des eigentlichen Lohn-
# steuerbescheinigungsprogramms zu addieren; hinzuzurechnen sind auch die Ausgabewerte
# VKVSONST -->
# <OUTPUT name="VKVLZZ" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Für den Lohnzahlungszeitraum berücksichtigte Beiträge des Arbeitnehmers
# zur privaten Basis-Krankenversicherung und privaten Pflege-Pflichtversicherung (ggf.
# auch die Mindestvorsorgepauschale) in Cent bei sonstigen Bezügen. Der Ausgabewert kann
# auch negativ sein. Für tarifermäßigt zu besteuernde Vergütungen für mehrjährige
# Tätigkeiten enthält der PAP keinen entsprechenden Ausgabewert. -->
# <OUTPUT name="VKVSONST" type="BigDecimal" default="new BigDecimal(0)"/>
#
# </OUTPUTS>
#
# <!-- AUSGABEPARAMETER DBA -->
# <OUTPUTS type="DBA">
#
# <!-- Verbrauchter Freibetrag bei Berechnung des laufenden Arbeitslohns, in Cent -->
# <OUTPUT name="VFRB" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Verbrauchter Freibetrag bei Berechnung des voraussichtlichen Jahresarbeitslohns, in Cent -->
# <OUTPUT name="VFRBS1" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Verbrauchter Freibetrag bei Berechnung der sonstigen Bezüge, in Cent -->
# <OUTPUT name="VFRBS2" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Für die weitergehende Berücksichtigung des Steuerfreibetrags nach dem DBA Türkei verfügbares ZVE über
# dem Grundfreibetrag bei der Berechnung des laufenden Arbeitslohns, in Cent -->
# <OUTPUT name="WVFRB" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Für die weitergehende Berücksichtigung des Steuerfreibetrags nach dem DBA Türkei verfügbares ZVE über dem Grundfreibetrag
# bei der Berechnung des voraussichtlichen Jahresarbeitslohns, in Cent -->
# <OUTPUT name="WVFRBO" type="BigDecimal" default="new BigDecimal(0)"/>
#
# <!-- Für die weitergehende Berücksichtigung des Steuerfreibetrags nach dem DBA Türkei verfügbares ZVE
# über dem Grundfreibetrag bei der Berechnung der sonstigen Bezüge, in Cent -->
# <OUTPUT name="WVFRBM" type="BigDecimal" default="new BigDecimal(0)"/>
# </OUTPUTS>
#
#
# php_pars = "# " + jahr + '''
#$_POST['stkl'] = ''' + str(stkl) + ''';
#$_POST['zkf'] = ''' + str(kinder) + ''';
#$_POST['r'] = ''' + str(kst) + ''';
#$_POST['kinderlos'] = ''' + str(kinderlos) + ''';
#$_POST['lzz'] = ''' + intmode + ''';
#$_POST['re4'] = ''' + {"2":str(betrag),"1":str(lohnjahr)}[intmode] + ''';
#$_POST['kvsatz'] = ''' + "0" + ''';
#$_POST['anpdez'] = ''' + "0" + ''';
#$_POST['e_krv'] = ''' + str(rvbefreit%2) + ''';
#
#'''
# FIBU-LOHNSTEUER-PARAMS
# self.php_lohn = {}
# if not php_pars in self.php_lohn:
# xhash = "x" # hashlib.md5(php_pars).hexdigest()
# xhash = hashlib.md5(php_pars).hexdigest()
# lstfile = self.fibu.rootdir + "/lohn_tmp/lohn_" + xhash + ".php";
# if not os.path.isfile(lstfile):
# if not jahr in self.php_lohn:
# for file in glob.glob( re.sub(r"^(.*)[\\\/](.*)$","\\1",__file__) + "/*/lohn"+jahr+".php"):
# text = open(file).read()
# self.php_lohn[jahr] = re.sub(
# r"\n( +\$wert1 += +number_format[^\n]*?)\n([^\n]*?)\n([^\n]*?)\n( +return +\$wert)",
# "\n//\\1\n//\\2\n//\\3\n\\4",text,re.DOTALL)
# text = re.sub(r"\n","\n"+php_pars,self.php_lohn[jahr],1)
# open(lstfile,"w").write(text)
# stval = self.lst_auswertung ( os.popen("php " + lstfile + " 2> /dev/null").read() )
# self.php_lohn[php_pars] = stval
# if xhash == "x":
# os.unlink(lstfile)
# else:
# stval = self.php_lohn[php_pars]
#
stobj.MAIN()
ls = 0.01 * float( stobj.getLstlzz() )
sz = 0.01 * float( stobj.getSolzlzz() )
ks = 0.01 * ( float(stobj.getBk()) + float(stobj.getBks()) + float(stobj.getBkv()) ) * kirchensteuersatz
if intmode == 2:
summen[person+jahr]['LS'][monat] = ls
summen[person+jahr]['SZ'][monat] = sz
summen[person+jahr]['KS'][monat] = ks
korrektur = ""
else:
summen[person+jahr]['LS'][monat] = ls - sum( summen[person+jahr]['LS'][0:monat] )
summen[person+jahr]['SZ'][monat] = sz - sum( summen[person+jahr]['SZ'][0:monat] )
summen[person+jahr]['KS'][monat] = ks - sum( summen[person+jahr]['KS'][0:monat] )
korrektur = "Jahreskorrigierte "
for steuerart in ('LS','SZ','KS'):
# print ("---", float(summen[person+jahr][steuerart][monat]) )
if abs(float(summen[person+jahr]['LS'][monat])) > 0.001:
if abs(float(summen[person+jahr]['LS'][monat])) > 0.001 or not steuerart[0] == "K":
steuerart1 = steuerart
if steuerart1[0] == "K":
steuerart1 = "K" + religion.upper()
if steuerart1 == "K":
continue
buchungen.append([datum,("%3.2f" % summen[person+jahr][steuerart][monat] ),
"11-1500-AN-"+person+"-"+steuerart1,"11-1503-"+steuerart1+"-"+person, "0.00", korrektur +
{ "LS":"Lohnsteuer","SZ":"Solidaritaetszuschlag","KS":"Kirchensteuer" }[steuerart]
# ,"{{SORTIDX: " + person + self.sozvers_sortidx("AN"+steuerart1) + "}}"
])
summen[person+jahr]['BUCHUNGEN'][monat] = buchungen
for pj in summen:
for buchungen in summen[pj]['BUCHUNGEN']:
for buchung in buchungen:
text.append(" ".join(buchung))
# print ("\n".join(text) + "\n")
ktodata['CONTENT'] = "\n".join(text) + "\n"
ktodata['CONTENT'] = re.sub("AR-Anteil","Arbeitgeber-Anteil",ktodata['CONTENT'],99999999)
ktodata['CONTENT'] = re.sub("AN-Anteil","Arbeitnehmer-Anteil",ktodata['CONTENT'],99999999)
ktodata['CONTENT'] = re.sub("korrigierte Soli","korrigierter Soli",ktodata['CONTENT'],99999999)
#***************************************************************************
def sozvers_sortidx (self,pattern):
if pattern[2:4] in self.sort_sozvers:
return(pattern[0:2] + ("%02u" % self.sort_sozvers.index(pattern[2:4])))
else:
return(pattern[0:2] + "99")
#***************************************************************************