
| Current Path : /proc/thread-self/root/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 : //proc/thread-self/root/home/ift/52_procpy/fibu/account3_add.py |
# coding: utf-8
# uncompyle6 version 2.11.5
# Python bytecode 3.4 (3310)
# Decompiled from: Python 2.7.6 (default, Oct 26 2016, 20:32:47)
# [GCC 4.8.4]
# Embedded file name: /home/cgabriel/procpy/account3_add.py
# Compiled at: 2017-09-06 12:20:09
# Size of source mod 2**32: 108399 bytes
import os
import sys
import re
import codecs
import glob
class Sozvers(object):
def __init__(self, fibu):
self.fibu = fibu
self.betriebsnr_kk = {}
#*************************************************************************
def monatnr (self,text):
text = re.sub('Januar', '01', text, 9999)
text = re.sub('Februar', '02', text, 9999)
text = re.sub('M..?rz', '03', text, 9999)
text = re.sub('April', '04', text, 9999)
text = re.sub('Mai', '05', text, 9999)
text = re.sub('Juni', '06', text, 9999)
text = re.sub('Juli', '07', text, 9999)
text = re.sub('August', '08', text, 9999)
text = re.sub('September', '09', text, 9999)
text = re.sub('Oktober', '10', text, 9999)
text = re.sub('November', '11', text, 9999)
text = re.sub('Dezember', '12', text, 9999)
text = re.sub('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('^\\d\\d\\d\\d\\d\\d\\d\\d +\\-?\\d+\\.\\d\\d.* -meldung', zeile):
text.append(zeile)
continue
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('Techniker Krankenkasse', 'TKK', text, 9999)
text = re.sub('Minijob.*Zentrale', 'Knappschaft', text, 9999)
text = re.sub('\\-?Rechtskreis +(West|Ost)', ' RK\\1', text, 9999)
text = re.sub(' BKK +', ' BKK', text, 9999)
text = re.sub(' DAK-', ' DAK ', text, 9999)
text = re.sub('(.*) +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('Zeitraum +von +(\\d+)\\.(\\d+)\\.(\\d+).*?Zeitraum +bis +(\\d+)\\.(\\d+)\\.(\\d+)', text, re.DOTALL)
if not m:
continue
if not not m.group(2) == m.group(5):
if 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('KNAPPS', 'MINIJO', newname)
text = re.sub('(\\d)\\.(\\d+\\,\\d\\d)', '\\1\\2', text, 9999)
m = re.search('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('[\\n-]/', ' ', remark, 9999, re.DOTALL)
remark = re.sub('^(.*?) +(.*?) .*? (\\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('^(.*\\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)
ktoa = None
ktob = '10-1510-' + kknr + '-meldung-' + datum[6:8]
if re.search(', Beitr.*Krankenvers.*ohne|, Beitr.*Krankenvers.*geringf', remark1):
ktoa = '11-' + kknr + '-KV-meldung'
elif re.search(', Zusatzbeitr.*Krankenvers|, Beitr.*Krankenvers.*erm.*igt', remark1):
ktoa = '11-' + kknr + '-KV-meldung'
elif ' Arbeitsfoerderung' in remark1 or 'Arbeitslosen' in remark1:
ktoa = '11-' + kknr + '-AV-meldung'
elif ' Rentenversicherung' in remark1:
ktoa = '11-' + kknr + '-RV-meldung'
elif ' Krankenversicherung' in remark1:
ktoa = '11-' + kknr + '-KV-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 re.search('inheitliche *P', 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(' Sae?umn| Mahn|gebuehr', remark1):
ktoa = '11-' + kknr + '-saeumn'
elif re.search(' Beitrae?g| Betriebspr', remark1):
ktoa = '11-' + kknr + '-beitrag'
elif re.search(' Umbuchung +Leistung+ U1', remark1):
ktoa = '11-' + kknr + '-umbuchung'
elif 'Storno' in remark1:
ktoa = '11-' + kknr + '-ZZ-meldung'
else:
continue
betrag1 = float(m.group(4) + '.' + m.group(5))
if abs(betrag1) > 1e-05:
buchungen1.append([datum, '%3.2f' % betrag1, ktoa, ktob, '0.00', remark1])
continue
buchungen = buchungen + buchungen1
m = re.search('^(.*)[\\\\\\/](.*)\\.(.*?)$', 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))
if os.path.isfile(filename0 + '.pdf'):
os.rename(filename0 + '.pdf', filename + '.pdf')
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'
continue
#*************************************************************************
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('^\\d\\d\\d\\d\\d\\d\\d\\d +\\-?\\d+\\.\\d\\d.* -ME-.*SozMeld', zeile):
buchungen.append(zeile)
continue
files.sort()
for file in files:
text = open(file).read()
text = self.fibu.normalize_text(text)
text = re.sub('(\\d)\\.(\\d+\\,\\d\\d)', '\\1\\2', text, 9999)
m = re.search('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][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('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('Techniker +Krankenkasse', text):
kk = 'TKK'
if re.search('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('^(.*)[\\\\\\/](.*)\\.(.*?)$', file) # renaming the original files
newname = day + '.SV_' + grund + '_' + re.sub(' ', '_', 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))
if os.path.isfile(filename0 + '.pdf'):
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-ME-' + person + '-' + kk.lower() + '-' + grund + pgr + param + ' 0.00 SozMeld ' + grund + ', PersGr ' + pgr + ', Merkmale ' + param + ', ' + kk.upper())
ktodata['CONTENT'] = '\n'.join(buchungen) + '\n'
#*************************************************************************
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:
if "STORN" in file:
continue
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('Erstattung.*?[vV]om.*?(\\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\s+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)
print ("1111111111111111111111"+file)
m = re.search("Arbeitszeit\s+t.*glich.*?(\d+)\,(\d+)",text,re.DOTALL)
if not m:
az = 0.0
else:
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)
for rename_file in glob.glob(filename0 + ".*"):
m2 = re.search("(.*)\.(.*)$",rename_file)
os.rename(filename0 + "." + m2.group(2) ,filename + "." + m2.group(2))
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"):
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)
person = m.group(3)
tage = m.group(6)
std = m.group(7)
buchungen.append(datum + " " + ( "%3.2f" % (float(tage)*float(std)) ) + " -KK-" +
kk + "-" + person + " 21-ST-" + person + "-" + 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*kto") )
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-ST-" + person + "-" + 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|mahn|retour)",zeile):
if not "Leistung U1" in zeile:
text.append(zeile)
ktodata['CONTENT'] = "\n".join(text) + "\n"
files.sort()
day = {}
entries = {}
for file in files:
# print (file)
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)
(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) +Faelligkei",zeile)
if m:
jahr = m.group(2)
monat = m.group(1)
continue
m = re.search(r"(Saeumnis|[bB]e.trags *nach|Mahngeb|Erlass|Retoure +G|Gebuehr|Umbuchung +Leistung +U1)(.*?) +(\-?\d+)[\,\.](\d\d)",zeile)
if m:
text1.append([jahr+monat,m.group(1) + m.group(2),m.group(3)+"."+m.group(4)])
# print (text1[-1])
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:
# print (zeile)
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)
betrag = re.sub(r"--","",zeile[2])
if "Saeumn" in remark:
ktoa = "13-6011"
ktob = "10-1500-"+kknr+"-saeumn"
elif "Mahn" in remark or "Forderung" in remark:
ktoa = "13-6011"
ktob = "10-1500-"+kknr+"-mahn"
elif "Ruecklae" in remark or "Retoure" in remark:
ktoa = "13-6011"
ktob = "10-1500-"+kknr+"-retoure"
remark = remark + " " + dd
elif "Umbuchung" in remark:
ktoa = "10-1500-"+kknr+"-zahlung"
ktob = "10-1500-"+kknr+"-kk-" + self.fibu.ukto_from_betrag(betrag)
remark = remark + " " + dd
elif "eitra" in remark or "ettra" in remark or "orderung" in remark:
ktob = "10-1500-"+kknr+"-meldung-"+dd
ktoa = "10-1510-"+kknr+"-beitrag"
if not periode[0] <= int(jjjjmm) <= periode[1]:
continue
# print ("--->")
buchung = [jjjjmm + dd,
betrag,
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('^(\\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 = 1 - int(buchung[2][0:1] == '-' and not buchung[3][0:1] == '-')
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(betrag)) + ' (' + 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:
if buchung[4][0:2] == '++':
steuersatz = 19
else:
if 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):
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,13-6540,'
+ '11-9001,11-9002,11-9003,11-1500-XAR,11-1500-XPL,11-1500-AR,11-1500-PL').split(','):
salden['-' + o] = 0.0
fix = {}
anfangsbestand = 0.0
files = glob.glob(ktodata['KTODIR'] + '/AUX*.kto')
if len(files) == 1:
m = re.search('\n(15-1300) +(\S*) +(\-?\d+\.\d\d)', open(files[0]).read())
if m:
anfangsbestand = float(m.group(3))
anfangsbestand = 0.0
print ("ANFBESTAND",anfangsbestand)
for zeile in ktodata['CONTENT'].split('\n'):
# print (zeile)
m = re.search('^(\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('^\\d\\d\\d\\d123.* -11-1500-X', zeile):
continue
if re.search('^\\d\\d\\d\\d124.* -11-150[567]', zeile):
continue
if re.search('^\d\d\d\d124.* -15[- ]', zeile):
continue
text.append(zeile)
jahr = ktodata['START'][0:4]
text1 = '''
JAHR1239 -XAR- -13-6010 -11-1500-XAR 0.00 Arbeitgeberanteile Sozialversicherung
JAHR1239 -XPL- -13-6015 -11-1500-XPL 0.00 Pauschalsteuer
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
JAHR1246 -UEBER- -11-9001 -15 0.00 Ueberschuss
#JAHR1245 -ANF- -11-9000 -15-1100 0.00 Anfangsbestand
#JAHR1246 -EBITDA- -11-9001 -15-1200-EbitDA 0.00 EbitDA
äJAHR1247 -ABSCHR- -11-9002 -15-1200-Abschr 0.00 Abschreibungen
äJAHR1247 -STEUERN- -11-9003 -15-1200-Steuern 0.00 Steuern
äJAHR1247 -PRIVAT- -11-9005 -15-1300 0.00 Gesellschafter
#JAHR1247 -END- -79-1300 -15-1300 0.00 Endbestand
'''
text1 = re.sub('-XAR-', '%3.2f' % salden['-11-1500-AR'], text1)
text1 = re.sub('-XPL-', '%3.2f' % salden['-11-1500-PL'], text1)
kstsatz = [0.15,0.25][int(int(jahr) < 2008)]
kst = (-(salden['-12'] + salden['-13']) * kstsatz)
solkst = (-(salden['-12'] + salden['-13']) * kstsatz * 0.055)
gewst = (-(salden['-12'] + salden['-13']) * 0.035 * 3.9)
qust = (salden['-14-7630'] * 0.25)
soli = (salden['-14-7630'] * 0.25 * 0.055)
kirch = (salden['-14-7630'] * 0.25 * 0.08)
abschr = (salden['-13-6540'])
ueber = (-salden['-10'] - salden['-11'] + salden['-11-9001'] )
text1 = re.sub('-KST-', '%3.2f' % kst, text1)
text1 = re.sub('-SOLKST-', '%3.2f' % solkst, text1)
text1 = re.sub('-GEWST-', '%3.2f' % gewst, text1)
text1 = re.sub('-QUST-', '%3.2f' % qust, text1)
text1 = re.sub('-SOLI-', '%3.2f' % soli, text1)
text1 = re.sub('-KIRCH-', '%3.2f' % kirch, text1)
text1 = re.sub('-UEBER-', '%3.2f' % ueber, text1)
# text1 = re.sub('-ANF-', '%3.2f' % anfangsbestand, text1)
# text1 = re.sub('-EBITDA-', '%3.2f' % -(salden['-12'] + salden['-13'] - salden['-13-6540']), text1)
# text1 = re.sub('-ABSCHR-', '%3.2f' % -salden['-13-6540'], text1)
# text1 = re.sub('-STEUERN-', '%3.2f' % -(salden['-14-7603'] + salden['-14-7604'] + salden['-14-7610']), text1)
# text1 = re.sub('-PRIVAT-', '%3.2f' % -(salden['-14-7632'] + salden['-14-7633'] + salden['-14-7634']), text1)
# text1 = re.sub('-EBITDA-', '%3.2f' % (- salden['-10'] - salden['-11']
# + salden['-11-9000'] + salden['-11-9001'] + salden['-11-9002'] + salden['-11-9003']
# - kst - solkst - gewst - abschr), text1)
#
# text1 = re.sub('-ABSCHR-', '%3.2f' % abschr, text1)
# text1 = re.sub('-STEUERN-', '%3.2f' % (kst + solkst + gewst), text1)
# text1 = re.sub('-END-', '%3.2f' % -(salden['-12'] + salden['-13'] + salden['-14']), text1)
text1 = re.sub('JAHR', jahr, text1, 9999)
text1 = re.sub('JJ', jahr[2:4], text1, 9999)
ktodata['CONTENT'] = '\n'.join(text) + '\n\n' + text1
#*************************************************************************
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')
#*************************************************************************
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('^(\\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('^(\\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
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))
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)
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,gegenkonto):
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,"-",gegenkonto,"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"
else:
break
if new_addtext:
self.fibu.make_addtext(ktodata)
text = []
for buchung in buchungen:
text.append(" ".join(buchung))
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
# print (1234)
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 True or not (datum[0:6]+betrkto+ktob[0:2]) in buchungen: # das muss mal ueberprueft werden !!
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 # FIBU-GLEITZONE-002-VALID
try:
self.fibu.rules
except:
self.fibu.rules = self.fibu
self.gleitzone = {
'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.0, 2008: 5800.0, 2009: 5800.0, 2010: 5800.0,
2011: 5800.0, 2012: 5800.0, 2013: 5800.0,
2014: 5950.0, 2015: 6050.0, 2016: 6200.0,
2017: 6350.0, 2018: 6500.0}
self.kv_obergrenze = {2007: 3937.5, 2008: 3937.5, 2009: 3937.5, 2010: 3937.5,
2011: 3937.5, 2012: 3937.5, 2013: 3937.5,
2014: 4050.0, 2015: 4125.0, 2016: 4237.5,
2017: 4350.0, 2018: 4425}
# FIBU-BEMESSUNGSGRENZEN-002
#*************************************************************************
def xxsozvers(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('^(\\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('^-', '', m.group(7))
remark = m.group(9)
ee.append([jahr, monat, datum, betrag, anr, person, art, remark, zeile])
# print(jahr, art, person)
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)
continue
else:
if art in ('LOHN', 'LOHN-K', 'LOHN-R', 'LOHN-Q', 'LOHN-S', 'LOHNG', 'LOHNH',
'SOND', 'ZAHL'):
text.append(zeile)
if has_old_values == person + jahr + '%02u' % monat:
continue
else:
if jahr not in ('2018', '2017', '2016'):
text.append(zeile)
has_old_values = person + jahr + '%02u' % monat
continue
if person + jahr not in summen:
summen[person + jahr] = {'LOHN': [0.0] * 12, 'LOHNK': [0.0] * 12, 'LOHNR': [
0.0] * 12,
'LS': [
0.0] * 12,
'SZ': [
0.0] * 12,
'KS': [
0.0] * 12,
'BUCHUNGEN': [[]] * 12, 'REMARK': [
''] * 12
}
m = re.search('^(.*)\\-([KR])', art)
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]
remark = summen[person + jahr]['REMARK'][monat]
buchungen = []
kinderlos = 0
rvbefreit = 0
red_betr = None
m = re.search('Gleitzone(\\d*)', remark)
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.0, 'AV': 0.0, 'KV': 0.0, 'PV': 0.0}
gesamt = {'RV': 0.0, 'AV': 0.0, 'KV': 0.0, 'PV': 0.0}
m = re.search('Pausch[sS]t +(\\d+).*kurzfri', remark)
if m:
buchungen.append([datum, '%3.2f' % (float(m.group(1)) * 0.01 * betrag),
'11-1500-AR-' + person, '11-1503-PL-' + person, '0.00', 'Pauschalsteuer'])
m = re.search('([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('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(' 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(' 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()
m = re.search('Pausch[sS]t +(\\d+)', remark)
if m:
buchungen.append([datum, '%3.2f' % (float(m.group(1)) * 0.01 * betrag),
'11-1500-AR-' + person + '-ST', '11-' + kknr + '-ST-AR-' + person, '0.00', 'Pauschalsteuer Minijob'])
for o in sozvers_faktoren:
if o == None:
ANR = 'AN'
elif float(o[0]) > 0.0001:
schon_gezahlter_lohn = 0.0
if monat > -1:
schon_gezahlter_lohn = sum(summen[person + jahr]['LOHN'][0:monat])
if o[1] in ('RV', 'AV', 'U1', 'U2'):
beitrag = float(o[0]) * 0.01 * min(betrag, max(0, self.rv_obergrenze[int(jahr)] * 12 - schon_gezahlter_lohn))
else:
if o[1] in ('KV', 'PV'):
beitrag = float(o[0]) * 0.01 * min(betrag, max(0, self.kv_obergrenze[int(jahr)] * 12 - schon_gezahlter_lohn))
else:
beitrag = float(o[0]) * 0.01 * betrag
if red_betr:
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]]
if abs(beitrag) > 0.001:
buchungen.append([datum, '%3.2f' % beitrag, '11-1500-' + ANR + '-' + person + '-' + o[1] + o[2],
'11-' + kknr + '-' + o[1] + '-' + ANR + '-' + person, '0.00', ANR + '-Anteil ' + o[1] + ', ' + kk])
if o[1] == 'RV':
rvbefreit = rvbefreit + 1
if o[1] + o[2] == 'PV-Y':
kinderlos = 1
else:
continue
m = re.search('StKl.*?(\\d)\\/([\\d\\.]+)\\/([\\d\\.]+)([reia]?).*([\\d\\.]+) +Kind', remark)
if m:
if not datum[7] == '7':
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)
exec('import pap.lst' + jahr)
stobj = eval('pap.lst' + jahr + '.Lst' + jahr + '()')
stobj.setKrv(0)
stobj.setLzz(int(intmode))
if kirchensteuersatz > 0:
stobj.setR(1)
else:
stobj.setR(0)
stobj.setRe4(int(betrag1 * 100))
stobj.setStkl(int(stkl))
stobj.setZkf(float(kinder))
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'):
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]])
else:
continue
summen[person + jahr]['BUCHUNGEN'][monat] = buchungen
print(summen)
for pj in summen:
for buchungen in summen[pj]['BUCHUNGEN']:
for buchung in buchungen:
o = ' '.join(buchung)
if 'KV-Z' in o:
o = re.sub('KV-AN-', 'KV-ZU-', o)
if 'PV-Y' in o:
o = re.sub('PV-AN-', 'PV-KI-', o)
text.append(o)
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 (self,ktodata):
self.sort_sozvers = 'LO,SO,LS,SZ,KR,KE,KA,KI,PL,KV,RV,AV,PV,U1,U2,U3,ZA'.split(',')
ee = []
text = []
for zeile in ktodata['CONTENT'].split('\n'):
m = re.search('^(\\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('^-', '', m.group(7))
remark = m.group(9)
ee.append([jahr, monat, datum, betrag, anr, person, art, remark, zeile])
ee.sort(key=lambda x: x[5] + x[0] + '%02u' % x[1] + x[2] + x[5] + '%1u' % (1 + int('LOHN' in x or 'SOND' in x)))
ee.append(['', 0, '', '', '', '', '', '', ''])
person0 = ''
jahr0 = ''
monat0 = -9
buchungen = []
lsk = {}
for entry in ee:
jahr, monat, datum, betrag, anr, person, art, remark, zeile = tuple(entry)
if not (person0 == person and monat0 == monat):
if not person0 == '':
if not has_values:
buchungen.extend(self.sozvers_make_buchungen(person0, jahr0, monat0, datum0, remark0, betrag0, betragk, betragr, lsk))
person0 = person
monat0 = monat
datum0 = datum
betrag0 = 0.0
betragk = 0.0
betragr = 0.0
remark0 = ''
has_values = False
if not jahr0 == jahr:
jahr0 = jahr
lsk = [0.0, 0.0, 0.0, 0.0]
if art == 'ZAHL':
text.append(zeile)
elif art in ('LOHN', 'LOHN-Q', 'LOHN-R', 'LOHN-Z', 'LOHNG', 'LOHNH', 'SOND',
'SOND-Q', 'SOND-R', 'SOND-Z'):
text.append(zeile)
remark0 = remark0 + '| ' + remark
datum0 = datum
m = re.search('^(.*)\\-([KRZ])', art)
if not m:
betrag0 = betrag0 + betrag
betragk = betragk + betrag
betragr = betragr + betrag
else:
if m.group(2) == 'Q':
betrag0 = betrag0 + betrag
betragk = betragk + betrag
betragr = betragr + betrag
if m.group(2) == 'R':
betrag0 = betrag0 + betrag
betragr = betragr + betrag
if m.group(2) == 'Z':
betrag0 = betrag0 + betrag
elif jahr not in ('2018', '2017', '2016'):
text.append(zeile)
has_values = True
continue
for buchung in buchungen:
o = ' '.join(buchung)
if 'KV-Z' in o:
o = re.sub('KV-AN-', 'KV-ZU-', o)
if 'PV-Y' in o:
o = re.sub('PV-AN-', 'PV-KI-', o)
text.append(o)
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 xxsozvers (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_make_buchungen(self, person0, jahr0, monat0, datum0, remark0, betrag0, betragk, betragr, lsk):
buchungen = []
kinderlos = 0
rvbefreit = 0
red_betr = None
sozvers_faktoren = []
m = re.search('Gleitzone(\\d*)', remark0)
if m:
d = jahr0[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(jahr0)] * 450 + (gl1 / (gl1 - gl0) - gl0 / (gl1 - gl0) * self.gleitzone[int(jahr0)]) * (betrag - 450)
ag_anteil = {'RV': 0.0, 'AV': 0.0, 'KV': 0.0, 'PV': 0.0}
gesamt = {'RV': 0.0, 'AV': 0.0, 'KV': 0.0, 'PV': 0.0}
kv_zuschlag_fuer_lst_berechnung = 0.0
m = re.search('([A-Za-z]+) *, +SV-AN\\: +([\\d\\.]+)\\/([\\d\\.]+)\\/([\\d\\.]+)\\/([\\d\\.]+)', remark0)
if m:
kknr, kk = self.fibu.rules.kknr(' ' + remark0 + ' ')
sozvers_faktoren = [[m.group(2), 'RV', ''], [m.group(3), 'AV', ''], [m.group(4), 'KV', '-S'], [m.group(5), 'PV', '-S']]
m = re.search('Zuschl\\: +([\\d\\.]+)\\/([\\d\\.]+)', remark0)
if m:
sozvers_faktoren = sozvers_faktoren + [[m.group(1), 'KV', '-Z'], [m.group(2), 'PV', '-Y']]
kv_zuschlag_fuer_lst_berechnung = float(m.group(1)) + float(m.group(2))
sozvers_faktoren.append(None)
m = re.search(' SV-AR\\: +([\\d\\.]+)\\/([\\d\\.]+)\\/([\\d\\.]+)\\/([\\d\\.]+)', remark0)
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(' Uml\\: +([\\d\\.]+)\\/([\\d\\.]+)\\/([\\d\\.]+)', remark0)
if m:
sozvers_faktoren = sozvers_faktoren + [[m.group(1), 'U1', ''], [m.group(2), 'U2', ''], [m.group(3), 'U3', '']]
ANR = 'AR'
sozvers_faktoren.reverse()
m = re.search('Pausch[sS]t +(\\d+).*kurzfri', remark0)
if m:
buchungen.append([datum0, '%3.2f' % (float(m.group(1)) * 0.01 * betrag0),
'11-1500-AR-' + person0, '11-1503-PL-' + person0, '0.00', 'Pauschalsteuer'])
else:
m = re.search('Pausch[sS]t +(\\d+)', remark0)
if m:
buchungen.append([datum0, '%3.2f' % (float(m.group(1)) * 0.01 * betrag0),
'11-1500-AR-' + person0 + '-ST', '11-' + kknr + '-ST-AR-' + person0, '0.00', 'Pauschalsteuer Minijob'])
for o in sozvers_faktoren:
if o == None:
ANR = 'AN'
elif float(o[0]) > 0.0001:
if o[1] in ('RV', 'AV', 'U1', 'U2'):
beitrag = float(o[0]) * 0.01 * betragr
elif o[1] in ('KV', 'PV'):
beitrag = float(o[0]) * 0.01 * betragk
else:
beitrag = float(o[0]) * 0.01 * betrag0
if red_betr:
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]]
if abs(beitrag) > 0.001:
buchungen.append([datum0, '%3.2f' % beitrag, '11-1500-' + ANR + '-' + person0 + '-' + o[1] + o[2],
'11-' + kknr + '-' + o[1] + '-' + ANR + '-' + person0, '0.00', ANR + '-Anteil ' + o[1] + ', ' + kk])
if o[1] == 'RV':
rvbefreit = rvbefreit + 1
if o[1] + o[2] == 'PV-Y':
kinderlos = 1
lsk[0] = lsk[0] + betrag0
m = re.search('StKl.*?(\\d)\\/([\\d\\.]+)\\/([\\d\\.]+)([reia]?).*([\\d\\.]+) +Kind', remark0)
if m:
if not datum0[7] == '7':
betrag1 = betrag0
intmode = 2
else:
betrag1 = lsk[0]
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)
exec('import pap.lst' + jahr0)
stobj = eval('pap.lst' + jahr0 + '.Lst' + jahr0 + '()')
stobj.setKrv(0)
stobj.setKvz(kv_zuschlag_fuer_lst_berechnung)
stobj.setLzz(int(intmode))
if kirchensteuersatz > 0:
stobj.setR(1)
else:
stobj.setR(0)
stobj.setRe4(int(betrag1 * 100))
stobj.setStkl(int(stkl))
stobj.setZkf(float(kinder))
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
korrektur = ''
if intmode == 1:
ls = ls - lsk[1]
sz = sz - lsk[2]
ks = ks - lsk[3]
korrektur = 'Jahreskorrigierte '
else:
lsk[1] = lsk[1] + ls
lsk[2] = lsk[2] + sz
lsk[3] = lsk[3] + ks
buchungen.append([datum0, '%3.2f' % ls, '11-1500-AN-' + person0 + '-LS', '11-1503-LS-' + person0,
'0.00', korrektur + ' Lohnsteuer'])
buchungen.append([datum0, '%3.2f' % sz, '11-1500-AN-' + person0 + '-SZ', '11-1503-SZ-' + person0,
'0.00', korrektur + 'Solidaritaetszuschlag'])
o = '-K' + religion.upper()
if not o == '-K':
buchungen.append([datum0, '%3.2f' % ks, '11-1500-AN-' + person0 + o, '11-1503' + o + '-' + person0,
'0.00', korrektur + 'Lohnsteuer'])
return (buchungen)
#*************************************************************************
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'