Welcome To Our Shell

Mister Spy & Souheyl Bypass Shell

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
Upload File :
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'

bypass 1.0, Devloped By El Moujahidin (the source has been moved and devloped)
Email: contact@elmoujehidin.net bypass 1.0, Devloped By El Moujahidin (the source has been moved and devloped) Email: contact@elmoujehidin.net