Welcome To Our Shell

Mister Spy & Souheyl Bypass Shell

Current Path : /home/ift/52_procpy/fibu/

Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
Upload File :
Current File : //home/ift/52_procpy/fibu/account3_add_comments.py

#  coding:  utf-8

import os,sys,re,codecs,glob

class Sozvers (object):

    def __init__ (self,fibu):
    
        self.fibu          = fibu
        self.betriebsnr_kk = {}

#******************************************************

    def monatnr (self,text):
    
        text = re.sub(r"Januar",     "01",text,9999)
        text = re.sub(r"Februar",    "02",text,9999)
        text = re.sub(r"M..?rz",     "03",text,9999)
        text = re.sub(r"April",      "04",text,9999)
        text = re.sub(r"Mai",        "05",text,9999)
        text = re.sub(r"Juni",       "06",text,9999)
        text = re.sub(r"Juli",       "07",text,9999)
        text = re.sub(r"August",     "08",text,9999)
        text = re.sub(r"September",  "09",text,9999)
        text = re.sub(r"Oktober",    "10",text,9999)
        text = re.sub(r"November",   "11",text,9999)
        text = re.sub(r"Dezember",   "12",text,9999)
        text = re.sub(r"alenderjahr","13",text,9999)
        
        return(text)

#******************************************************

    def parse_beitragsnachweise (self,ktodata):

        kkdatum            = {}
        self.betriebsnr_kk = {}

        files = ( glob.glob(ktodata['KTODIR']+"/*.ocr") +
                  glob.glob(ktodata['KTODIR']+"/*.manuell") + 
                  glob.glob(ktodata['KTODIR']+"/*.lexware") )

        if len(files) == 0:
            return()

        text = []
        for zeile in ktodata['CONTENT'].split("\n"):
            if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* -meldung",zeile):
                text.append(zeile)
        ktodata['CONTENT'] = "\n".join(text) + "\n"
                  
        files.sort()
        for file in files:

            print (file)
            buchungen = []

            text = open(file).read()
            text = self.fibu.normalize_text(text)

            m    = re.search("TAN +(\d\d\d\d\d\d\d\d\d)\D",text)
            if not m:
                continue
            newname = m.group(1)

            m    = re.search("Betriebsnummer +(\d\d\d\d\d\d\d\d)\D",text)
            if not m:
                continue
            newname = newname + "_" + m.group(1)

            m    = re.search("Sendedatum\:? +(\d\d)\.(\d\d)\.(\d\d)(\d\d)\D",text)
            if not m:
                continue
            newname = newname + "_" + m.group(4) + m.group(2) + m.group(1)

            text      = re.sub(r"Techniker Krankenkasse","TKK",   text,9999)
            text      = re.sub(r"Minijob.*Zentrale","Knappschaft",text,9999)
            text      = re.sub(r"\-?Rechtskreis +(West|Ost)"," RK\\1",text,9999)
            text      = re.sub(r" BKK +"," BKK",                  text,9999)
            text      = re.sub(r" DAK-"," DAK ",                  text,9999)
            text      = re.sub(r"(.*) +ohne +Sozialausgleich(.*)","",     text,9999)  # wegen doppelt eingetragener Betraege
            m = re.search("Einzugs+telle.*?Name +([a-zA-Z0-9]+)",text,re.DOTALL)
            if m:
                (kknr,kk) = self.fibu.rules.kknr(text)

            m = re.search(r"Zeitraum +von +(\d+)\.(\d+)\.(\d+).*?Zeitraum +bis +(\d+)\.(\d+)\.(\d+)",text,re.DOTALL)
            if not m:
                continue

            if not m.group(2) == m.group(5) or not m.group(3) == m.group(6):
                continue

            jahr    = m.group(3)
            monat   = m.group(2)
            newname = newname + "_" + (kk+"______")[0:6] + "__" + jahr + "_" + monat;
            newname = re.sub(r"KNAPPS","MINIJO",newname)
            text    = re.sub(r"(\d)\.(\d+\,\d\d)","\\1\\2",text,9999)

            m = re.search(r"Einzugsstelle.*Betriebsnummer +(\d+)(.*?)Name +([^\n ]+)",text,re.DOTALL)
            if not m:
                continue
            self.betriebsnr_kk[kknr] = m.group(1)

            remark = m.group(3) + " " + m.group(1)
            remark = re.sub(r"[\n-]/"," ",remark,9999,re.DOTALL)
            remark = re.sub(r"^(.*?) +(.*?) .*? (\d+)$","\\1 \\2 \\3",remark)

            buchungen1 = []
            o          = kknr + "," + jahr + monat
            if o in kkdatum:
                kkdatum[o] = kkdatum[o] + 1
            else:
                kkdatum[o] = 20
            
            datum = jahr + monat + ("%02u" % kkdatum[o]) 
            
            new_addtext = False
            while (0 == 0):
                m = re.search(r"^(.*)(BetrPr *| *)\nB?e?t?r?P?r? ?(einheitliche|Umlage|Beitra[e\"]?ge|Storno|Zusatzbeitr\S*) (.*?) *(\-?\d+)\,(\d\d)",
                               text,re.IGNORECASE+re.DOTALL)
                
                if not m:
                    break
                text    = m.group(1)
#                print ("----------------------------")
#                print (text)
#                print ("=======================")
        
                remark1 = remark+", " + m.group(2) + m.group(3) + " " + m.group(4)
                remark1 = re.sub(r"\n"," ",remark1,9999,re.DOTALL)
                

                ktoa = None
                ktob = "10-1510-" + kknr + "-meldung-" + datum[6:8]
                if " zur Krankenversicherung" in remark:
                    ktoa = "11-"+kknr+"-KV-BE-meldung"
                elif " Zusatzbei" in remark1:
                    ktoa = "11-"+kknr+"-KV-ZU-meldung"
                elif " Arbeitsfoerderung" in remark1:
                    ktoa = "11-"+kknr+"-AV-meldung"
                elif " Rentenversicherung" in remark1:
                    ktoa = "11-"+kknr+"-RV-meldung"
                elif " Pflegeversicherung" in remark1:
                    ktoa = "11-"+kknr+"-PV-meldung"
                elif " Krankheitsaufwendungen" in remark1:
                    ktoa = "11-"+kknr+"-U1-meldung"
                elif " Mutterschaftsaufwendungen" in remark1:
                    ktoa = "11-"+kknr+"-U2-meldung"
                elif " Insolvenzgeldversicherung" in remark1:
                    ktoa = "11-"+kknr+"-U3-meldung"
                elif " einheitliche" in remark1:
                    ktoa = "11-"+kknr+"-ST-meldung"
                elif " Storno" in remark1:
                    ktoa = "11-"+kknr+"-ZZ-meldung"
                elif " UST" in remark1:
                    ktoa = "11-"+kknr+"-xxUSTxx-meldung"
                elif " einzubehaltene" in remark1:
                    ktoa = "11-"+kknr+"-LS-meldung"
                elif " pauschal" in remark1:
                    ktoa = "11-"+kknr+"-PL-meldung"
                elif " Solidarit" in remark1:
                    ktoa = "11-"+kknr+"-SZ-meldung"
                elif " Kirchensteuer roem" in remark1:
                    ktoa = "11-"+kknr+"-KR-meldung"
                elif " Kirchensteuer evan" in remark1:
                    ktoa = "11-"+kknr+"-KE-meldung"
                elif " Kirchensteuer altk" in remark1:
                    ktoa = "11-"+kknr+"-KA-meldung"
                elif " Kirchensteuer isra" in remark1:
                    ktoa = "11-"+kknr+"-KB-meldung"
                elif re.search(r" Sae?umn| Mahn|gebuehr",remark1):
                    ktoa = "11-"+kknr+"-saeumn"
                elif re.search(r" Beitrae?g| Betriebspr",remark1):
                    ktoa = "11-"+kknr+"-beitrag"
                elif re.search(r" Umbuchung +Leistung+ U1",remark1):
                    ktoa = "11-"+kknr+"-umbuchung"
                    
                betrag1 = float(m.group(5)+"."+m.group(6))
                
                if abs(betrag1) > 0.00001:
                    buchungen1.append([datum,"%3.2f" % betrag1,ktoa,ktob,"0.00",remark1])
    
            buchungen = buchungen + buchungen1

            m         = re.search(r"^(.*)[\\\/](.*)\.(.*?)$",file)  #  renaming the original files
            filename0 = m.group(1) + "/" + m.group(2)
            filename  = m.group(1) + "/" + newname
            if not filename0 == filename:
                print ("rename file " + filename0 + " to " + filename)
                os.rename(filename0 + "." + m.group(3),filename + "." + m.group(3))
                try:
                    os.rename(filename0 + ".pdf"          ,filename + ".pdf")
                except:
                    pass
                new_addtext = True

            if new_addtext:
                self.fibu.make_addtext(ktodata)

            zeilen = []
            for buchung in buchungen:
                zeilen.append("  ".join(buchung))

            if buchungen:
                ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(zeilen) + "\n"

#******************************************************

    def parse_sozmeldungen (self,ktodata):

        kkdatum            = {}
        self.betriebsnr_kk = {}
        new_addtext        = False

        files = ( glob.glob(ktodata['KTODIR']+"/*.ocr") )

        if len(files) == 0:
            return()

        buchungen = []
        for zeile in ktodata['CONTENT'].split("\n"):
            if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* -ME-.*SozMeld",zeile):
                buchungen.append(zeile)
                  
        files.sort()
        for file in files:

            text = open(file).read()
            text = self.fibu.normalize_text(text)
            text = re.sub(r"(\d)\.(\d+\,\d\d)","\\1\\2",text,9999)

            m    = re.search(r"Meldebescheinigung.*?Name\:?\s+([A-Za-z]+).+?Vorname\:?\s+([A-Za-z])",text,re.DOTALL)
            if not m:
                continue

            m    = re.search("sicherungsnum.*?Name.*?([A-Za-z]+).*?Vorname.*?([A-Za-z])",text,re.DOTALL)
            if not m:
                continue

            person = (m.group(2)[0] + m.group(1)).lower()
            if person[0:2] == "ss":
                person = (m.group(2)[0:2] + m.group(1)).lower()
            
            m    = re.search(r"Beschaeftigung +(von|bis) +(\d\d)\.(\d\d)\.(\d\d\d\d)",text)
            if not m:
                continue
            
            day  = m.group(4) + m.group(3) + m.group(2)

            kk   = "allg"
            if re.search(r"Techniker +Krankenkasse",text):
                kk = "TKK"
            if re.search(r"Knappschaft.*Bahn-See",text):
                kk = "MINIJOB"

            m    = re.search("Personengruppe +(\d+)",text)
            pgr  = m.group(1)

            m     = re.search("Grund +der +Abgabe +(\d+) +\= +(.*)",text)
            grund        = m.group(1)
            beschreibung = m.group(2)

            m     = re.search("Krankenversicherung +(\d).*?Rentenversicherung +(\d).*?Pflegeversicherung +(\d).*?Arbeitslosenversicherung +(\d)",text,re.DOTALL)
            param = m.group(1) + m.group(2) + m.group(3) + m.group(4)

            m         = re.search(r"^(.*)[\\\/](.*)\.(.*?)$",file)  #  renaming the original files
            newname   = day + ".SV_" + grund + "_" + re.sub(r" ","_",beschreibung,9999) + "_" + person + "_" + kk
            filename0 = m.group(1) + "/" + m.group(2)
            filename  = m.group(1) + "/" + newname
            if not filename0 == filename:
                print ("rename file " + filename0 + " to " + filename)
                os.rename(filename0 + "." + m.group(3),filename + "." + m.group(3))
                os.rename(filename0 + ".pdf"          ,filename + ".pdf")
                new_addtext = True

            if new_addtext:
                self.fibu.make_addtext(ktodata)

            buchungen.append(day + "  0.01  -ME-" + person + "-" + kk.lower() + "  21-AN-" + person + "-"
                             + kk.lower() + "-" + grund + pgr + param + "  0.00  SozMeld " +
                             grund + ", PersGr " + pgr + ", Merkmale " + param + ", " + kk.upper() )

        ktodata['CONTENT'] = "\n".join(buchungen) + "\n"
        
#        print (ktodata['CONTENT'][0:1000])

#******************************************************************************************

    def parse_krankmeldung (self,ktodata):

        ktodata['RULES_APPLY'] = 0
        if ktodata['RULES_APPLIED'] == True:
            self.fibu.idem_kto(ktodata,0.99)
            return()

        kkdatum            = {}
        self.betriebsnr_kk = {}
        new_addtext        = False

        files = ( glob.glob(ktodata['KTODIR']+"/*.ocr") + glob.glob(ktodata['KTODIR']+"/*.manuell") )

        if len(files) == 0:
            return()

        buchungen = []
        for zeile in ktodata['CONTENT'].split("\n"):
            if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* Ausfall",zeile):
                buchungen.append(zeile)
                  
        files.sort()

        for file in files:

            text = open(file).read()
            text = self.fibu.normalize_text(text)
            text = re.sub(r"(\d)\.(\d\d\d)\,","\\1\\2\,",text,9999)
            while (0 == 0):
                o9   = text
                text = re.sub(r"(\d+) ?(\d*) ?\, ?(\d) ?(\d)","\\1\\2,\\3\\4",text)
                if text == o9:
                    break

            text = re.sub(r"[\'\"\|\]\[\(\)]","",text,99999999)

            kk   = "allg"
            if re.search(r"(15027365|Techniker +Krankenkasse)",text):
                kk = "TKK"
            if re.search(r"(98000006|Knappschaft.*Bahn-See)",text):
                kk = "MINIJOB"

            m = re.search(r"(Personalnummer|Arbeitnehmer).*?Name.*?([A-Za-z]+).*?Vorname.*?([A-Za-z]+)",text,re.DOTALL)
            if not m:
                continue
            person = (m.group(3)[0] + m.group(2)).lower()
            if person[0:2] == "ss":
                person = (m.group(3)[0:2] + m.group(2)).lower()

            m = re.search(r"Erstattungszeitraum.*?Vom.*?(\d+)\.(\d+)\.(\d\d)(\d+)",text,re.DOTALL)
            if not m:
                continue
            datum = m.group(3) + m.group(4) + m.group(2) + m.group(1)

            m = re.search(r"Erstattungsbetrag.*?(\d+)\,(\d+)",text,re.DOTALL)
            if not m:
                continue
            betrag = m.group(1) + "." + m.group(2)

            m = re.search("Monatliches.*?(\d+)\,(\d\d)",text,re.DOTALL)
            if not m:
                continue
            brutto = m.group(1) + "." + m.group(2)

            azeit = 40
            m = re.search("Arbeitszeit +w.*?chentl.*?(\d+)\,(\d+)",text,re.DOTALL)
            if not m:
                continue
            azeit = m.group(1) + "." + m.group(2)

            m = re.search("Erstattungssatz.*?(\d+)\,(\d+)",text,re.DOTALL)
            if not m:
                continue
            esatz = m.group(1) + "." + m.group(2)

            m = re.search("Fortgezahltes.*?(\d+)\,(\d+)",text,re.DOTALL)
            if not m:
                continue
            fortz = m.group(1) + "." + m.group(2)

            m = re.search("Arbeitszeit +t.*glich.*?(\d+)\,(\d+)",text,re.DOTALL)
            if not m:
                continue
            az = float(m.group(1) + "." + m.group(2))
            if az < 0.1 and float(azeit) > 0.0:
                az = ("%3.1f" % (float(azeit)/5.0))

            m = re.search("Ausgefallene +Arbeitstage.*?(\d+)",text,re.DOTALL)
            if m:
                ktage = m.group(1)
            else:
                ktage = "0"
                if float(brutto) > 0:
                    ktage = ("%1u" % int(float(fortz)/float(brutto)*20) )

#            print (file)
            m         = re.search(r"^(.*)[\\\/](.*)\.(.*?)$",file)  #  renaming the original files
            filename0 = m.group(1) + "/" + m.group(2)
            filename  = m.group(1) + "/"
            ending    = m.group(3)

            m = re.search("TAN +(\d\d\d\d\d\d\d\d\d)\D",text)
            if not m:
                continue
            filename = filename + m.group(1)
                
            m = re.search("Betriebsnummer +(\d\d\d\d\d\d\d\d)\D",text)
            if not m:
                continue
            filename = filename + "_" + m.group(1)
                
            filename = filename + "_Arbeitsunf_Erstattung_" + (kk+"______")[0:6] + "_" + datum + "_" + ktage + "_" + person


            if not filename0 == filename:
                print ("rename file " + filename0 + " to " + filename)
                os.rename(filename0 + "." + ending,filename + "." + ending)
                os.rename(filename0 + ".pdf"          ,filename + ".pdf")
                new_addtext = True

            if new_addtext:
                self.fibu.make_addtext(ktodata)


            buchungen.append(datum + "  " + betrag + "  -kk-" + self.fibu.ukto_from_betrag(betrag) + " 12-6001-"
                             + person + "  0.00  Ausfall " + ("%2u" % int(ktage)) + " Tage a " + str(float(az)) +
                             " Std, Monatsbrutto " + brutto + ", Satz " + esatz + ", Fortzahlung " + fortz)

        ktodata['CONTENT'] = "\n".join(buchungen) + "\n"
        
#******************************************************************************************

    def parse_stundenkk (self,ktodata):

        files = ( glob.glob(ktodata['KTODIR']+"/AUX*rankmeld*") )

        if len(files) == 0:
            return()

        buchungen = []
        for zeile in ktodata['CONTENT'].split("\n"):
            if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* -KK-",zeile):
                buchungen.append(zeile)
                  
        files.sort()

        for file in files:

            text = open(file).read()
            for zeile in text.split("\n"):
                print (zeile)
                m = re.search(r"^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +\-([a-z]+) +\d+\-\d+\-(\d+)\S+? +(\-?\d+\.\d\d) .*? +(\d+) +Tage.*? ([\d\.]+) +Std",zeile)
                if m:
                    datum  = m.group(1)
                    betrag = m.group(2)
                    kk     = m.group(4)
                    print (kk)
                    person = m.group(3)
                    tage   = m.group(6)
                    std    = m.group(7)
                    buchungen.append(datum + "  " + ( "%3.2f" % (float(tage)*float(std)) ) + "  -KK-" +
                               person + "-" + kk + "  21-" + kk + "  0.00  Stunden wg Krankmeldung " +
                               ("%2u" % int(tage)) + " Tage a " + std + " Stunden")
                    buchungen[-1] = re.sub(r" 1 Tage "," 1 Tag  ",buchungen[-1])

        ktodata['CONTENT'] = "\n".join(buchungen) + "\n"
        
#******************************************************************************************

    def parse_projektstunden (self,ktodata):

        files = ( glob.glob(ktodata['KTODIR']+"/AUX*rojekt*tunden*") )

        if len(files) == 0:
            return()

        buchungen = []
        for zeile in ktodata['CONTENT'].split("\n"):
            if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.* -PR-",zeile):
                buchungen.append(zeile)
                  
        files.sort()

        for file in files:

            text = open(file).read()
            for zeile in text.split("\n"):
                m = re.search(r"^(\d\d\d\d\d\d\d\d) +.*?12-8400-([a-z]+).*?([a-z]+) +([\d\.]+) +\/ ([\d\.]+)",zeile)
                if m:
                    datum   = m.group(1)
                    kunde   = m.group(2)
                    person  = m.group(3)
                    stunden = m.group(4)
                    buchungen.append(datum + "  " + ( "%3.2f" % (float(stunden)) ) + "  -PR-" +
                               person + "-" + kunde + "  21-" + kunde + "  0.00  Stunden Projekt")

        ktodata['CONTENT'] = "\n".join(buchungen) + "\n"
        
#********************************************************************

    def parse_ktoauszug (self,ktodata):

        files = ( glob.glob(ktodata['KTODIR']+"/*.ocr") +
                  glob.glob(ktodata['KTODIR']+"/*.manuell") )

        if len(files) == 0:
            return()

        text = []
        for zeile in ktodata['CONTENT'].split("\n"):
            if not re.search(r"^\d\d\d\d\d\d\d\d +\-?\d+\.\d\d.*\-(meldung|saeumn)",zeile):
                text.append(zeile)
        ktodata['CONTENT'] = "\n".join(text) + "\n"
                  
        files.sort()
        day       = {}
        entries   = {}
        
        for file in files:
        
            buchungen = []

            periode = [100000,999999]
            m       = re.search(r"\D(\d\d\d\d\d\d)\D+(\d\d\d\d\d\d)\D",file)
            if m:
                periode = [ int(m.group(1)) , int(m.group(2)) ]
                periode.sort()
            
            text      = open(file).read()
            text      = self.fibu.normalize_text(text)
            text      = re.sub("BKK Verkehrsbau","VBU",text)
#            print (text)
            (kknr,kk) = self.fibu.rules.kknr(text)

            text  = re.sub(r"(\d)\.(\d\d\d)\,","\\1\\2,",text,999999); 
            while (0 == 0):   #  Punkte und Leerzeichen entfernen in Zahlendarstellungen
                text1 = text
                text  = re.sub(r"(\s)(\d+) (\d+),","\\1\\2\\3,",text,9999)
                text  = re.sub(r",(\d+) (\d+)(\s)",",\\1\\2\\3",text,9999)
                text  = re.sub(r", (\d+)",",\\1",text,9999)
                text  = re.sub(r"(\d+) ,","\\1,",text,9999)
                if text1 == text:
                    break
           
            jahr  = ""
            monat = ""
            text1 = []

            if int(kknr) == 1517:  #  TKK
                for zeile in text.split("\n"):
                    m = re.search(r"(\d\d)/(\d\d\d\d) +Faelligkeit",zeile)
                    if m:
                        jahr  = m.group(2)
                        monat = m.group(1)
                        continue
                    m = re.search(r"(Saeumnis|[bB]eitragsnach|Gebuehr)(.*?) +(\d+)\,(\d\d)",zeile)
                    if m:
                        text1.append([jahr+monat,m.group(1) + m.group(2),m.group(3)+"."+m.group(4)])

            elif int(kknr) == 1510:  #  DAK
                for zeile in text.split("\n"):
                    m = re.search(r"Bezugszeitraum +(\d\d)\.(\d\d)\.(\d\d)",zeile,re.IGNORECASE)
                    if m:
                        jahr  = "20" + m.group(3)
                        monat = m.group(2)
                        continue
                    m = re.search(r"(Forderung|Beitrag aus Betriebspruefung|Saeumniszuschlag)(.*?) +(\-?[\d ]+)\,([\d ]{2})",zeile)
                    if m:
                        text1.append([jahr+monat,m.group(1),re.sub(r" ","",m.group(3)+"."+m.group(4),99)])

            else:
                for zeile in text.split("\n"):
                    zeile = re.sub(r"\s+","  ",zeile,9999)
                    zeile = re.sub(r"(\D\d\d)\.(\d\d)\.(\d\d\D)","\\1.\\2.20\\3",zeile,9999)
                    zeile = re.sub(r"(SZ|SA) +.?(B)(S?)"," Beitrag\\3 ",zeile,9999,re.IGNORECASE)  #  special MobilOil
                    zeile = re.sub(r"(SZ|SA) +.?S"," Saeumniszuschlag ",zeile,9999,re.IGNORECASE)  #  special MobilOil
                    zeile = re.sub(r"(Beitragszahlung|im +Beitrag)","",zeile,9999,re.IGNORECASE)   #  special Minijob, TKK
                    zeile = re.sub(r"\((\d\d)\/(\d\d\d\d)\)\s*","01.\\1.\\2   ",zeile)             #  VBU BKK futur
                    zeile = re.sub(r"(Beitraege )","Beitrag ",zeile,9999)                          #  Barmer                
#                    zeile = re.sub(r"(\(\d\d\.\d\d\.\d\d\d\d ?- ?\d\d\.\d\d\.\d\d\d\d\)) +\d\d\.\d\d\.\d\d\d\d","\\1",zeile,9999)   #  AOK
#                    m = re.search(r"bezugszeitraum +(.*?) *$",zeile.lower())             #  special DAK
#                    print (zeile)
                    
                    m = re.search(r"(Betriebspruef|Mahngeb|Saeumnisz|Beitrags?f?e?|Beitraege|Ruecklaeuf|Forderung\s)(.*?)(\s.*?\d\d)\.(\d\d)\.(\d\d\d\d).*?\s(\-?[1-9]?\d*),(\d\d\-?)",zeile)
                    if m:
#                        print (" --->  MATCH  --->",zeile)
                        betrag = m.group(6)+"."+m.group(7)
                        betrag = re.sub(r"(.*)(-$)","-\\1",betrag)
                        text1.append([m.group(5)+m.group(4),m.group(1)+m.group(2),betrag])
                        print(text1[-1])
                        continue
                        
#                text = re.sub(r"^(\d\d\.\d\d\.\d\d\d\d[ \-]+\d\d\.\d\d\.\d\d\d\d)(.*?)(\d\d\.\d\d\.\d\d\d\d)",
#                                          "\\1$\\2",text,9999);  #  special AOK
#                text = re.sub(r"^(\d\d\.\d\d\.\d\d\d\d) *\- *(\d\d\.\d\d\.\d\d\d\d)(.*?)","\\1-\\2",text,9999) # special Barmer
#                text = re.sub(r"^(\d\d)[\.,](\d\d)[\.,](\d\d\d\d) "," \\1.\\2.\\3 ",text,9999)
#
#        for zeile in text.split("\n"):
#            zeile = re.sub(r"\s+"," ",zeile,9999)
#            zeile = re.sub(r"(SZ|SA) .?(B)(S?)"," Beitrag\\3 ",zeile,9999)       #  special MobilOil
#            zeile = re.sub(r"(SZ|SA) .?S"," Saeumniszuschlag ",zeile,9999)       #  special MobilOil
#            zeile = re.sub(r"(Beitragszahlung|im +Beitrag)","",zeile,9999)       #  special Minijob, TKK
#            m = re.search(r"bezugszeitraum +(.*?) *$",zeile.lower())             #  special DAK
#            if m:
#                zeitraum = m.group(1)
#            else:
#                zeitraum = ""
#            zeile = re.sub(r"^\s*Forderung \d\d\.\d\d\.\d\d","Forderung Beitrag "+zeitraum,zeile) #  special DAK
#            m = re.search(r"(Betriebspr|Beitra.?g|Saeumnis|Mahn|[A-Z].*?gebuehr|Umbuchung +Leistung +U1)(.*?)(0\d|10|11|12)([\/\.])($jahr|$jahr1)[\_ ]+(.*?)(\-?\d+)\,(\d\d)(-?)",
#                             zeile)
#            print zeile
#            if not m:
#                continue
#            text1.append([jahr + m.group(3) + ("%02u" % day[o9]),
#                          re.sub(r"--","",m.group(9) + "-" + m.group(7) + "." + m.group(8)),
#                          "555",
#                          "899",
#                          kk + ", " + m.group(1) + m.group(2) + m.group(3) + m.group(4) + m.group(5)])
#'''

            for zeile in text1:

                jjjjmm = zeile[0]
                remark = zeile[1]
                betrag = zeile[2]
                o9     = kknr + jjjjmm + remark[0:10]
                if o9 in day:
                    day[o9] = day[o9] + 1
                else:
                    day[o9] = 26
            
                dd  = ("%02u" % day[o9])
#                print (zeile,dd)
                if "Saeumn" in remark:
                    ktoa = "13-6011"
                    ktob = "10-1500-"+kknr+"-saeumn"
                elif "Mahn" in remark:
                    ktoa = "13-6011"
                    ktob = "10-1500-"+kknr+"-saeumn"
                elif "Ruecklae" in remark:
                    ktoa = "13-6011"
                    ktob = "10-1500-"+kknr+"-saeumn"
                    remark = remark + " " + dd
                elif "Beitra" in remark or "Forderung" in remark:
                    ktob = "10-1500-"+kknr+"-meldung-"+dd
                    ktoa = "10-1510-"+kknr+"-beitrag"
                if not periode[0] <= int(jjjjmm) <= periode[1]:
                    continue
                buchung =     [jjjjmm + dd,
                              re.sub(r"--","",zeile[2]),
                              ktoa,ktob,"0.00",
                              kk + ", " + remark + ", Beitragsmonat " + jjjjmm[4:6] + "/" + jjjjmm[0:4]]
                entry = jjjjmm + " " + buchung[1] + " " + ktoa + " " + buchung[5]
#                print (buchung)
#                print (entry)
                if not entry in entries:
                    buchungen.append(buchung)
                    entries[entry] = 1

            zeilen = []
            for buchung in buchungen:
                zeilen.append("  ".join(buchung))

            if buchungen:
                ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(zeilen) + "\n"


#            print (ktodata['CONTENT'])

#******************************************************

class Usteuer (object):

    def __init__ (self,fibu,ust_kto):
    
        self.fibu    = fibu
        self.ust_kto = ust_kto.strip("-")

#******************************************************************* 

#   Erzeugt aus einer Buchung die entsprechende Umsatzsteuer- bzw. Vorsteuerbuchung

    def qualify (self,ktodata):

        text = []

        for zeile in ktodata['CONTENT'].split("\n"):

            m = re.search(r"^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +(\S+?) +(\S+) +(\-?\d+\.\d\d) +(.*)",zeile)
            if not m:
                text.append(zeile)
                continue
 
            datum  = m.group(1)
            betrag = m.group(2)
            ktoa   = m.group(3)
            ktob   = m.group(4)
            remark = m.group(6)
            
            if ktob.find(self.ust_kto) == 0:
                continue
                
            text.append(zeile)

            if remark[0:2] == "++":
                steuersatz = 19
            elif remark[0:2] == "+-":
                steuersatz = 7
            else:
                continue

            buchung = [datum,betrag,ktoa,ktob,"0.00",remark]

            gegenkto    = int(buchung[2][0:2] == "10" and not buchung[3][0:2] == "10")
            steuerart   = gegenkto + int(float(buchung[1]) < 0)
            steuerkto   = ["U","I"][ steuerart % 2 ] + ["7","6"][ int(steuersatz == 19) ]
            steuerart   = ["USt.","Vorst."][ steuerart % 2 ]
            buchung[1]  = "%3.2f" % ( (-steuersatz*0.01/(1.0+steuersatz*0.01)) *float(buchung[1]) )
            buchung[5]  = (   "   " + str(steuersatz) + " v.H. " + steuerart + " von " +
                          ("%3.2f" % abs(float(buchung[1]))) + " (" + buchung[5][2:] + ")"   )
            buchung[3-gegenkto] = self.ust_kto + "-" + steuerkto
            text.append("  ".join(buchung))

        ktodata['CONTENT'] = "\n".join(text) + "\n"


#******************************************************************* 

#   Erzeugt aus einer Buchung die entsprechende Umsatzsteuer- bzw. Vorsteuerbuchung

    def xxqualify (self,buchungen):

        buchungen1 = []
        for buchung in buchungen:
#            break
            if buchung[4][0:2] == "++":
                steuersatz = 19
            elif buchung[4][0:2] == "+-":
                steuersatz = 7
            else:
                continue

            gegenkto    = int(buchung[2][0:2] == "10")
            steuerart   = gegenkto + int(float(buchung[1]) < 0)
            steuerkto   = ["I","U"][ steuerart % 2 ] + ["7","6"][ int(steuersatz == 19) ]
            steuerart   = ["USt.","Vorst."][ steuerart % 2 ]
            buchung1    = buchung[:]
            buchung1[1] = "%3.2f" % ( (-steuersatz*0.01) *float(buchung[1]) )
            buchung1[4] = (   "   " + str(steuersatz) + " v.H. " + steuerart + " von " +
                          ("%3.2f" % float(buchung[1])) + " (" + buchung[4][2:] + ")"   )
            buchung1[3-gegenkto] = "11-1502-" + steuerkto
            buchungen1.append(buchung1)

        return(buchungen+buchungen1)

#*******************************************************************

class Bilanz (object):

    def __init__ (self,fibu):
    
        self.fibu = fibu

#******************************************************************* 

    def finish_year (self,ktodata):

#        ktodata['RULES_APPLY'] = 0

        if not ktodata['START'][0:4] == ktodata['ENDE'][0:4]:
            return()

        text   = []
        salden = {}
        for o in "12,13,14-7630,13-6540,14-7603,14-7604,14-7610,11-9000,11-9001,11-9002,11-9003".split(","):
            salden["-"+o] = 0.00
        fix    = {}
        
        anfangsbestand = 0.00
        files = ( glob.glob(ktodata['KTODIR']+"/AUX*") )
        if len(files) == 1:
            m = re.search(r"^(15-1000) +(\S*) +(\-?\d+\.\d\d) *$",open(file).read())
            if m:
                anfangsbestand = float(m.group(3))
                
        for zeile in ktodata['CONTENT'].split("\n"):
            
            m = re.search(r"^(\S+) +(\S*) +(\-?\d+\.\d\d) *$",zeile)
            if m:
                salden["-"+m.group(1)] = float(m.group(3))
                if "FIX" in m.group(2):
                    fix["-" + m.group(1)] = 1
            if re.search(r"^\d\d\d\d12.* -11-150[567]",zeile):
                continue
            if re.search(r"^\d\d\d\d124.* -15-",zeile):
                continue
            text.append(zeile)

        text1 = '''

JAHR1241   -KST-      -14-7603   -11-1505-JJ-berechn    0.00   Koerperschaftsteuer
JAHR1241   -SOLKST-   -14-7604   -11-1505-JJ-berechn    0.00   Soli KoerpSteuer
JAHR1242   -GEWST-    -14-7610   -11-1506-JJ-berechn    0.00   Gewerbesteuer
JAHR1243   -QUST-     -14-7632   -11-1507-JJ-berechn    0.00   Quellensteuer
JAHR1243   -SOLI-     -14-7633   -11-1507-JJ-berechn    0.00   SolidZuschlag
JAHR1243   -KIRCH-    -14-7634   -11-1507-JJ-berechn    0.00   Kirchensteuer

JAHR1245   -ANF-      -11-9000   -15-1100               0.00   Anfangsbestamd
JAHR1246   -EBITDA-   -11-9001   -15-1200-EbitDA        0.00   EbitDA
JAHR1247   -ABSCHR-   -11-9001   -15-1200-Abschr        0.00   Abschreibungen
JAHR1247   -STEUERN-  -11-9002   -15-1200-Steuern       0.00   Steuern
JAHR1247   -END-      -11-9003   -15-1300               0.00   Endbestand

'''

        text1 = re.sub(r"-KST-",    "%3.2f" % ( (salden["-12"] + salden["-13"]) * 0.15),                          text1)
        text1 = re.sub(r"-SOLKST-", "%3.2f" % ( (salden["-12"] + salden["-13"]) * 0.15 * 0.055),                  text1)
        text1 = re.sub(r"-GEWST-",  "%3.2f" % ( (salden["-12"] + salden["-13"]) * 0.035 * 3.9),                   text1)
        text1 = re.sub(r"-QUST-",   "%3.2f" % ( (salden["-14-7630"] * 0.25) ),                                    text1)
        text1 = re.sub(r"-SOLI-",   "%3.2f" % ( (salden["-14-7630"] * 0.25 * 0.055) ),                            text1)
        text1 = re.sub(r"-KIRCH-",  "%3.2f" % ( (salden["-14-7630"] * 0.25 * 0.08) ),                             text1)

        text1 = re.sub(r"-ANF-",    "%3.2f" % ( (anfangsbestand) ),                                               text1)
        text1 = re.sub(r"-EBITDA-", "%3.2f" % ( (salden["-12"] + salden["-13"] - salden["-13-6540"]) ),           text1)
        text1 = re.sub(r"-ABSCHR-", "%3.2f" % ( (salden["-13-6540"]) ),                                           text1)
        text1 = re.sub(r"-STEUERN-","%3.2f" % ( (salden["-14-7603"] + salden["-14-7604"] + salden["-14-7610"]) ), text1) 
        text1 = re.sub(r"-END-",    "%3.2f" % ( (salden["-10"] + salden["-11"]
                          - salden["-11-9000"] - salden["-11-9001"] - salden["-11-9002"] - salden["-11-9003"]) ), text1) 


        text1 = re.sub(r"JAHR",ktodata['START'][0:4],text1,9999)
        text1 = re.sub(r"JJ",  ktodata['START'][2:4],text1,9999)

#        print (text1)

        ktodata['CONTENT'] = "\n".join(text) + "\n\n" + text1

#        ktodata['RULES_APPLY'] = 0

#********************************************************************************************


    def xxf (self):

        ebit   = ebitda + abschr
        kst    = ebit * 0.15
        soli   = kst  * 0.055
        gwst   = ebit * 0.035 * 3.9
        
        self.fibu.add(jahr+"1231","%3.2f" % kst    ,"11-1505-"+jahr,"15-1505","Koerperschaftssteuer")
        self.fibu.add(jahr+"1231","%3.2f" % soli   ,"11-1506-"+jahr,"15-1506","Solidaritaetszuschlag")
        self.fibu.add(jahr+"1231","%3.2f" % gwst   ,"11-1507-"+jahr,"15-1507","Gewerbesteuer")
        self.fibu.add(jahr+"1232","%3.2f" % -kst   ,"11-9002-"+jahr,"17-1505","Koerperschaftssteuer")
        self.fibu.add(jahr+"1232","%3.2f" % -soli  ,"11-9002-"+jahr,"17-1506","Solidaritaetszuschlag")
        self.fibu.add(jahr+"1232","%3.2f" % -gwst  ,"11-9002-"+jahr,"17-1507","Gewerbesteuer")

        aussch = self.fibu.saldo("16",jahr+"0000",jahr+"9999")
        self.fibu.add(jahr+"1231","%3.2f" % aussch,"11-9003-"+jahr,"17-1501","Ausschuettung")

        qust   = aussch * 0.25 * 1.055
        self.fibu.add(jahr+"1231","%3.2f" % qust   ,"11-1508-"+jahr,"15-1508","Quellensteuer")
        self.fibu.add(jahr+"1232","%3.2f" % -qust  ,"11-9004-"+jahr,"16-1508","Quellensteuer")



#        self.fibu.add(jahr+"1231","%3.2f" % (gewinn * 0.15 * 0.055) ,"11-9003-"+jahr,"15-1200","Soli KoerpSteuer")
#        self.fibu.add(jahr+"1231","%3.2f" % (gewinn * 0.035 * 3.9)  ,"11-9004-"+jahr,"15-1200","Quellensteuer")

#******************************************************************* 

class Abschreibung (object):

    def __init__ (self,fibu):
    
        self.fibu = fibu

#******************************************************************* 

    def qualify (self,ktodata):
    

        text = []

        for zeile in ktodata['CONTENT'].split("\n"):

            m = re.search(r"^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +(\S+?) +(\S+) +(\-?\d+\.\d\d) +(.*)",zeile)
            if m and m.group(4)[0:7] == "13-6540":
                continue
            
            text.append(zeile)
            m = re.search(r"^(\d\d)([123456789ABC])\_(\d+)(.*?)-AN +(\S+) *$",zeile)
             
            if m:
                abschreibungsjahr   = m.group(1)
                kaufmonat           = m.group(2)
                abschreibungsanteil = int(m.group(3))
                betrag              = abs(float(m.group(5)))
                ktoa                = "-" + m.group(1) + m.group(2) + "_" + m.group(3) + m.group(4) + "-AS"
            else:
                continue
                
#            print (zeile)
        
            if kaufmonat in "ABC":
                kaufmonat = { "A": "10", "B": "11", "C": "12" }[kaufmonat]
            teilabschreibung = 13 - int(kaufmonat)
            if abschreibungsanteil == 1:
                teilabschreibung = 12

            restwert = betrag
            jahr     = int("20" + abschreibungsjahr)
            zaehler  = 1

            while (0 == 0):
                datum1              = ("%04u" % jahr) + "1228"
                erstjahresanteil    = float(teilabschreibung) / 12.0
                abschreibungsbetrag = - float("%3.2f" % (min(erstjahresanteil * betrag / abschreibungsanteil,restwert) ))
#                print betrag, abschreibungsbetrag, abschreibungsanteil, restwert
                restwert            = float("%3.2f" % restwert) + float("%3.2f" % abschreibungsbetrag)
                if float(restwert)/float(betrag) < 0.01 * abschreibungsanteil:
                    abschreibungsbetrag = abschreibungsbetrag - restwert
                    restwert            = 0.0
                betrag1                 = ("%3.2f" % abschreibungsbetrag)
                if abs(restwert) < 0.001:
                    text.append(datum1 + "  " + betrag1 + "  " + ktoa + "  13-6540" + ktoa + "  0.00  " +
                                        "Rest-Abschreibung, Kaufwert: " + ("%3.2f" % betrag) )
                    break
                else:
                    remark1 = "Abschreibung"
                    if teilabschreibung < 12:
                        remark1 = remark1 + " (" + str(teilabschreibung) + "/12)*"
                    remark1 = remark1 + ", " + str(zaehler) + ". Teil-Abschreibung (1/" + str(abschreibungsanteil) + ")"
                    remark1 = remark1 + ", Kaufwert: " + ("%3.2f" % betrag)
                text.append(datum1 + "  " + betrag1 + "  " + ktoa + "  13-6540" + ktoa + "  0.00  " + remark1)
#                print (datum1 + "  " + betrag1 + "  " + ktoa + "  13-6540  0.00  " + remark1)
                jahr             = jahr    + 1
                zaehler          = zaehler + 1
                teilabschreibung = 12

        ktodata['CONTENT']     = "\n".join(text) + "\n"
        ktodata['RULES_APPLY'] = 0


#******************************************************************************

class Belege (object):

    def __init__ (self,fibu):
    
        self.fibu        = fibu

#******************************************************************************

    def einlesen (self,ktodata):
    
        belege      = ( glob.glob(ktodata['KTODIR']+"/*.ocr") )
        buchungen   = []
        new_addtext = False

        for beleg in belege:

            text = open(beleg).read()

            attempt = 0       #   wenn die Datei nicht im Format JJMMDD.ustremark_betrag.ocr ist, dieses
            while (0 == 0):   #   erst versuchen zu erreichen

                attempt = attempt + 1
                m = re.search(r"/(\d\d\d\d\d\d\d?\d?)\.(q?[qw]?)\_?(.*?)\_(\d+)\_(\d\d)","/"+beleg)
                if m:
                    datum   = m.group(1)
                    if len(datum) == 6:
                        datum = "20" + datum
                    ust     = m.group(2)
                    remark  = m.group(3)
                    betrag  = "%3.2f" % float(m.group(4)+"."+m.group(5))
                    if not "minus" in remark:
                        betrag = "-" + betrag
                    betrag = re.sub(r"^--","",betrag)
                    buchungen.append([datum,betrag,"-","13-9999","0.00",remark])
                    break
                
                else:
                    if attempt == 1:
                        erg = self.analyze(beleg)
                        if not erg:
                            print (beleg, "could not be parsed")
                        else:
                            datum1 = erg[2]
                            ust    = erg[1]
                            betrag = erg[0]
                            m      = re.search(r"^(\d+)\.(\d\d)$","%3.2f" % float(betrag))
                            newname_remark = re.sub(r"\_+$","",self.remark.keys()[0])
                            if newname_remark == "":
                                newname_remark = ( random.choice("abcdefghijkmnpqrstuvwxyz") +
                                                   random.choice("abcdefghijkmnpqrstuvwxyz") )
                            newname = ( datum1 + "." + ust + newname_remark + "_" + m.group(1) + "_" + m.group(2))
                            print (newname, "<--------------")
                            m       = re.search(r"^(.*)[\\\/](.*)\.pdf$",beleg)
                            if m:
                                newname = m.group(1) + "/" + newname
                                oldname = m.group(1) + "/" + m.group(2)
#                                print newname,oldname
                                if os.path.isfile(newname+".ocr") or os.path.isfile(newname+".pdf"):
                                    pass
                                else:
                                    new_addtext = True

                                    if os.path.isfile(oldname+".pdf"):
                                        os.rename(oldname+".pdf",newname+".pdf")
                                    if os.path.isfile(oldname+".ocr"):
                                        os.rename(oldname+".ocr",newname+".ocr")
                                beleg   = newname + ".pdf"
                        continue
                
        if new_addtext:
            self.fibu.make_addtext(ktodata)

        text = []
        for buchung in buchungen:
            text.append("  ".join(buchung))
#            print (buchung)
#        exit()

        ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(text) + "\n"

#******************************************************************************

    def analyze (self,beleg):
    
        belegfile = re.sub(r"^(.*)\.pdf$","\\1",beleg)
        try:
            text = open(belegfile+".ocr").read()
        except:
            return()
            
        m = re.search(r"^(.*)[\\\/](.*)$",belegfile)
        if m:
            filename = m.group(2)
        else:
            filename = ""

        text = re.sub(r"(\d+)\.(\d\d\d),(\d\d)","\\1\\2,\\3",text,9999)

        self.betraege = {}
        self.stunden  = {}
        self.stsatz   = {}
        self.mitarb   = {}
        self.remark   = { "xx" : 1 }
        self.text     = text
        
        while (0 == 0):    #   Ermittlung der Stunden
            m = re.search(r"^(.*?\D)(\d[\d+\.]*) +Stunden (.*)$",text,re.DOTALL)
            if not m:
                break
            m1     = re.search(r"\D([\d\.\,]+)\D",m.group(3)[0:40])
            stsatz = ""
            if m1:
                stsatz = re.sub(r",",".",m1.group(1))
            self.stunden[m.group(2)+" / "+stsatz] = 1
            text = m.group(1) + m.group(3)

#        print belegfile,filename
        m = re.search(r"[\\\/](\d?\d?)(\d\d\d\d\d\d)\_?(\D+)\_?","/"+filename)     #  Ermittlung des Datums
        if m:
            self.datum  = { m.group(2) : 1 }
            self.remark = { re.sub(r"\.","",m.group(3)) : 1 }
        else:
            m = re.search(r"[\\\/](\d\d)(\d\d)(\d\d)\.([a-z]+)\_(\D+)\_?","/"+filename)
            if m:
                self.datum  = { "20" + m.group(3) + m.group(2) + m.group(1) : 1 }
                self.mitarb = { m.group(4) : 1 }
                self.remark = { m.group(5) : 1 }
        if not m:
            self.datum = {}
            while (0 == 0):
                m = re.search(r"^(.*?[^\.\,0123456789])(\d\d?)[\.\-](\d\d?)[\.\-](\d?\d?)(\d\d)([^\.\,0123456789].*)$",text,re.DOTALL)
                if not m:
                    break
                self.datum[m.group(5)+("%02u"%int(m.group(3)))+("%02u"%int(m.group(2)))] = 1
                text = m.group(1) + m.group(6)

        while (0 == 0):    #  Ermittlung aller Betraege bzw. alles dessen, was nur annaehernd wie ein Betrag aussieht
            m = re.search(r"^(.*?[^\.\,0123456789])(\d+)[\,\.](\d\d)([^\.\,0123456789].*)$",text,re.DOTALL)
            if not m:
                break
            betrag = m.group(2)+"."+m.group(3)
            if float(betrag) > 0.00001:
                self.betraege[betrag] = {"b":1}
            text = m.group(1) + m.group(4)

        while (0 == 0):
            m = re.search(r"^(.*?)(Stundenaufstellung[^\n]*?, +|Name: +)(\S+).*? (\S+)(\D.*)$",text,re.DOTALL)
            if not m:
                break
            o = (m.group(3)[0] + m.group(4)).lower()
            o = re.sub("oime","onne",o)
            o = re.sub(r"^ss",m.group(3)[0:2]+"s",o)
            self.mitarb[o] = 1
            text = m.group(1) + m.group(5)

        for betrag in self.betraege:
            for betrag1 in self.betraege:
                if   "%3.2f" % (float(betrag) / float(betrag1)) == "1.07":
                    self.betraege[betrag]["m"] = 1
                elif "%3.2f" % (float(betrag) / float(betrag1)) == "1.19":
                    self.betraege[betrag]["n"] = 1
                elif "%3.2f" % (float(betrag1) / float(betrag) * 1.07) == "0.07":
                    self.betraege[betrag]["v"] = 1
                elif "%3.2f" % (float(betrag1) / float(betrag) * 1.19) == "0.19":
                    self.betraege[betrag]["u"] = 1
        
#        print self.betraege
#        print self.datum
#        print self.remark
#        print self.stunden
#        print self.mitarb

        ust    = ""
        erg    = {}
        datum1 = None
        for betrag in self.betraege:
            id = list(self.betraege[betrag].keys())
            id.sort()
            if "".join(id) in ("bnu","bu"):
                erg[betrag] = "qq"
            elif "".join(id) in ("bmv","bv"):
                erg[betrag] = "qw"
            elif len(self.betraege) == 1:
                erg[list(self.betraege.keys())[0]] = ""

#        print self.betraege
        ergs = list(erg.keys())
        ergs.sort(key=lambda x: float(x))
        if ergs:        
            ust = erg[ ergs[-1] ]
            erg = ergs[-1]
        else:
            erg = None
            
        if len(self.datum) > 0:
            self.datum = list(self.datum.keys())
            self.datum.sort()
            self.datum.reverse()
            datum1 = self.datum[0]
#            m = re.search(r"^(\d\d?)\.(\d\d?)\.(\d\d)(\d\d)",self.datum[0])
#            if m:
#                datum1 = m.group(4) + ("%02u" % int(m.group(2))) + ("%02u" % int(m.group(1)))

#        print self.datum, datum1, erg
        if datum1 and erg:
            return([erg,ust,datum1])
        return(None)

#******************************************************************************

    def rechnungen (self,ktodata,company):

        ktodata['RULES_APPLY'] = 0
        if ktodata['RULES_APPLIED'] == True:
            self.fibu.idem_kto(ktodata,0.99)
            return()

        text      = []
        buchungen = {}
        betrktos  = {}
        
        for rechn in (glob.glob(ktodata['KTODIR'] + "/*.pdf")):

            if "nterschrieben" in rechn or "ndenzettel" in rechn or "NOTVALID" in rechn or "EXCLUDE§" in rechn:
                continue
            
            self.stunden  = None
            self.betraege = None
            self.mitarb   = None
            erg           = self.analyze(rechn)
            if "GULP" in self.text or "rogressive" in self.text:
                self.text = re.sub(r"HAYS","",self.text,9999,re.IGNORECASE)
            
#            m = re.search(r"[\n \_]" + company + "[ \_]",rechn+self.text,re.IGNORECASE)
#            if not m:
#                continue
            
            if erg:
                datum1 = erg[2]
                ust    = re.sub(r"q","+",re.sub(r"w","-",erg[1],9),9)
                betrag = erg[0]
                proj   = ""
                if self.mitarb:
                    o = list(self.mitarb.keys())[0]
                else:
                    o = "unknown"
                if self.stunden:
                    o = o + " " + list(self.stunden.keys())[0]
#                    m = re.search(r"\/ *(.*?)(\.|$)",self.stunden.keys()[0])
#                    if m:
#                        proj = "-" + m.group(1)
                m  = re.search(r"^(.*)[\\\/](.*)\.pdf$",rechn)
                if m:
                    o = o + ", " + m.group(2)
                if int(datum1[4:6]) > 31:
                    datum1 = datum1[0:4] + "30"
                
                betrkto = "-" + self.fibu.ukto_from_betrag(betrag)
                buchungen["20"+datum1[0:4]+betrkto+"12"] = (
                   ["20"+datum1,betrag,betrkto,"12-8400-"+company,"0.00",ust+o+", "+company])

        text = []     #   ---- Doppelbuchungen ausschliessen
        for zeile in ktodata['CONTENT'].split("\n"):

            m = re.search(r"^(\d\d\d\d\d\d\d\d) +(\-?\d+\.\d\d) +(\S+) +(\S+) +(\-?\d+\.\d\d) +(.*)",zeile)
            if not m:
                text.append(zeile)
            else:
                datum   = m.group(1)
                betrag  = m.group(2)
                ktoa    = m.group(3)
                ktob    = m.group(4)
                remark  = m.group(6)
                if not (datum[0:6]+betrkto+ktob[0:2]) in buchungen:
                    if re.search(r"^-\d\d\d\d\d$",ktoa) or ktoa == "-":
                        ktoa = "-" + self.fibu.ukto_from_betrag(betrag)
                    buchungen[datum+betrkto+ktob+remark] = [datum,betrag,ktoa,ktob,"0.00",remark]

        for buchung in buchungen.values():
            text.append("  ".join(buchung))
        ktodata['CONTENT'] = "\n".join(text) + "\n"
        

#******************************************************************************

class Lohn (object):

    def __init__ (self,fibu):
    
        self.fibu     = fibu
        
        self.gleitzone = {    #  FIBU-GLEITZONE-002-VALID
            "12A":   400,    "12B":  800,
            "15A":   450,    "15B":  850,

             2007:   0.7673,  2008:  0.7732,
             2009:   0.7472,  2010:  0.7585,
             2011:   0.7435,  2012:  0.7491,
             2013:   0.7605,  2014:  0.7605,
             2015:   0.7585,  2016:  0.7547,
             2017:   0.7547,  2018:  0.7547,
             
             };  #  Gleitzonenfaktor     FIBU-GLEITZONE-002-VALID
                          #  FIBU-BEMESSUNGSGRENZEN-002-VALID
        self.rv_obergrenze = { 2007: 5800.00, 2008: 5800.00, 2009: 5800.00,
                               2010: 5800.00, 2011: 5800.00, 2012: 5800.00,
                               2013: 5800.00, 2014: 5950.00, 2015: 6050.00,
                               2016: 6200.00, 2017: 6350.00 }
        self.kv_obergrenze = { 2007: 3937.50, 2008: 3937.50, 2009: 3937.50,
                               2010: 3937.50, 2011: 3937.50, 2012: 3937.50,
                               2013: 3937.50, 2014: 4050.00, 2015: 4125.00,
                               2016: 4237.50, 2017: 4350.00 }
                          #  FIBU-BEMESSUNGSGRENZEN-002



#******************************************************************* 

    def sozvers (self,ktodata):

        self.sort_sozvers = "LO,SO,LS,SZ,KR,KE,KA,KI,PL,KV,RV,AV,PV,U1,U2,U3,ZA".split(",")
        summen            = {}
        text              = []
        ee                = []
        has_old_values    = ""

        for zeile in ktodata['CONTENT'].split("\n"):

            m = re.search(r"^(\d\d\d\d)(\d\d)(\d\d) +\-?(\d+\.\d\d) +(\S.*?)([a-z]+)(\-?\S*) +\S+ +(\-?\d+\.\d\d) +(.*)",zeile)
            if not m:
                text.append(zeile)
                continue
 
            jahr   = m.group(1)
            monat  = int(m.group(2)) - 1
            datum  = m.group(1) + m.group(2) + m.group(3)
            betrag = float(m.group(4))
            anr    = m.group(5)
            person = m.group(6)
            art    = re.sub(r"-","",m.group(7))
            remark = m.group(9)
            ee.append([jahr,monat,datum,betrag,anr,person,art,remark,zeile])
                        
        ee.sort(key=lambda x: x[0] + ("%02u" % x[1]) + x[2] + x[5] + ("%1u" % (1 + int("LOHN" in x or "SOND" in x))))
        
        for entry in (ee):

            (jahr,monat,datum,betrag,anr,person,art,remark,zeile) = tuple(entry)
            if art == "ZAHL":
                text.append(zeile)  # + "  {{SORTIDX: " + person + self.sozvers_sortidx("ANZA") +"}}")
                continue
            elif art in ("LOHN","LOHNG","LOHNH","SOND"):
                text.append(zeile)  # + "  {{SORTIDX: " + person + self.sozvers_sortidx("AN"+art) +"}}")
                if has_old_values == person + jahr + ("%02u" % monat):
                    continue
            else:
                if not jahr == "2017":
                    text.append(zeile)  # + "  {{SORTIDX: " + person + self.sozvers_sortidx(anr+art) +"}}")
                    has_old_values = person + jahr + ("%02u" % monat)
 #                   print (has_old_values,zeile)
                continue

 #           print (person+jahr+str(monat),art)
            if not (person+jahr) in summen:
                summen[person+jahr] = { 'LOHN':       ([0.00] * 12),
                                        'LS':         ([0.00] * 12),
                                        'SZ':         ([0.00] * 12),
                                        'KS':         ([0.00] * 12),
                                        'BUCHUNGEN':  ([[]]   * 12),
                                        'REMARK':     (['']   * 12)}

            summen[person+jahr]['LOHN'][monat]   = summen[person+jahr]['LOHN'][monat]   + betrag
            summen[person+jahr]['REMARK'][monat] = remark + "|" + summen[person+jahr]['REMARK'][monat]

            betrag    = summen[person+jahr]['LOHN'][monat]     #  um mehrere zahlungen pro Monat zu beruecksichtigen
            remark    = summen[person+jahr]['REMARK'][monat]

            buchungen = []
            kinderlos = 0
            rvbefreit = 0

            red_betr  = None
#            print ("RR",betrag)
            
            m = re.search(r"Gleitzone(\d*)",remark)      #  FIBU-GLEITZONE-001-VALID
            if m:
                d = jahr[0:-len(m.group(1))] + m.group(1)
                if int(d) < 2013:
                    gl0 = self.gleitzone["12A"]
                    gl1 = self.gleitzone["12B"]
                else:
                    gl0 = self.gleitzone["15A"]
                    gl1 = self.gleitzone["15B"]

                if gl0 < betrag < gl1:
                    red_betrag = (self.gleitzone[int(jahr)] * 450 +
                                   ( (gl1/(gl1-gl0)) - (gl0/(gl1-gl0)) * self.gleitzone[int(jahr)] ) * (betrag - 450) )
                    ag_anteil  = { "RV": 0.00,  "AV": 0.00,  "KV": 0.00,  "PV": 0.00 } 
                    gesamt     = { "RV": 0.00,  "AV": 0.00,  "KV": 0.00,  "PV": 0.00 }    #  FIBU-GLEITZONE-001
                  
            m = re.search(r"PauschSt +(\d+).*kurzfri",remark)
            if m:              #   FIBU-PAUSCHALSTEUER-001-VALID
                buchungen.append([datum,"%3.2f"%(float(m.group(1))*0.01*betrag),
                                  "11-1500-AR-"+person,"11-1503-PL-"+person,"0.00","Pauschalsteuer"
                                  # ,"{{SORTIDX: " + person + self.sozvers_sortidx("ARPL") + "}}"
                                  ])
                               #   FIBU-PAUSCHALSTEUER-001

            m = re.search(r"([A-Za-z]+) *, +SV-AN\: +([\d\.]+)\/([\d\.]+)\/([\d\.]+)\/([\d\.]+)",remark)
            if m:

                (kknr,kk) = self.fibu.rules.kknr(" "+remark+" ")
                sozvers_faktoren = [[m.group(2),"RV",""],[m.group(3),"AV",""],[m.group(4),"KV","-S"],[m.group(5),"PV","-S"]]
                m      = re.search(r"Zuschl\: +([\d\.]+)\/([\d\.]+)",remark)
                if m:
                    sozvers_faktoren = sozvers_faktoren + [[m.group(1),"KV","-Z"],[m.group(2),"PV","-Y"]]
                sozvers_faktoren.append(None)
                m      = re.search(r" SV-AR\: +([\d\.]+)\/([\d\.]+)\/([\d\.]+)\/([\d\.]+)",remark)
                if m:
                    sozvers_faktoren = sozvers_faktoren + [[m.group(1),"RV",""],[m.group(2),"AV",""],[m.group(3),"KV",""],[m.group(4),"PV",""]]
                m      = re.search(r" Uml\: +([\d\.]+)\/([\d\.]+)\/([\d\.]+)",remark)
                if m:
                    sozvers_faktoren = sozvers_faktoren + [[m.group(1),"U1",""],[m.group(2),"U2",""],[m.group(3),"U3",""]]
                ANR = "AR"
                sozvers_faktoren.reverse()
                for o in sozvers_faktoren:
                    if o == None:
                        ANR = "AN"   #  Umschalten
                    elif float(o[0]) > 0.0001:
                              #  FIBU-BEMESSUNGSGRENZEN-001-VALID
                        if o[1] in ("RV","AV"):
                            beitrag = float(o[0])*0.01* ( min(betrag, 
                                        max(0,self.rv_obergrenze[int(jahr)]*12 - sum( summen[person+jahr]['LOHN'][0:monat] )) ) )
                        else:
                            beitrag = float(o[0])*0.01* ( min(betrag,
                                        max(0,self.kv_obergrenze[int(jahr)]*12 - sum( summen[person+jahr]['LOHN'][0:monat] )) ) )
                                                               #  FIBU-BEMESSUNGSGRENZEN-001
                        if red_betr:            #  FIBU-GLEITZONE-001-VALID
                            if o[1] in ("RV","AV","KV","PV"):
                                gesamt[o[1]] = gesamt[o[1]] + float(o[0])*0.01*red_betr
                                if ANR == "AR":
                                    ar_anteil[o[1]] = beitrag
                                if ANR == "AN" and o[2] in ("","-S"):
                                    beitrag = gesamt[o[1]] - ag_anteil[o[1]]    #  FIBU-GLEITZONE-001

                        buchungen.append([datum,"%3.2f"%beitrag,"11-1500-"+ANR+"-"+person+"-"+o[1]+o[2],
                                      "11-"+kknr+"-"+ANR+"-"+o[1]+"-"+person,"0.00",ANR+"-Anteil "+o[1]+", "+kk
#                                      ,"{{SORTIDX: " + person + self.sozvers_sortidx(ANR+o[1]+o[2]) + "}}"
                                      ] )
                        if o[1] == "RV":
                            rvbefreit = rvbefreit + 1
                        if o[1]+o[2] == "PV-Y":
                            kinderlos = 1
                            
            #------------------------------------------    #   FIBU-LOHNSTEUER-001-VALID
            
            m = re.search(r"StKl.*?(\d)\/([\d\.]+)\/([\d\.]+)([reia]?).*([\d\.]+) +Kind",remark)
            if m:

                if not datum[7] == "7":   #   Monatsabrechung
                    betrag1 = betrag
                    intmode = 2
                else:
                    betrag1 = sum( summen[person+jahr]['LOHN'] )
                    intmode = 1

                stkl              = m.group(1)
                soli              = m.group(2)
                kirchensteuersatz = float(m.group(3)) * 0.01
                religion          = m.group(4)
                kinder            = m.group(5)
#                    print datum, person, betrag, lohnjahr, intmode
                                               # FIBU-LOHNSTEUER-PARAMS-VALID
                exec("import pap.lst" + jahr)
                stobj = eval("pap.lst" + jahr + ".Lst"+jahr+"()")

#            <!-- 1, wenn die Anwendung des Faktorverfahrens gewählt wurden (nur in Steuerklasse IV) -->
#	        <INPUT name="af" type="int" default="1"/>
#
#	        <!-- Auf die Vollendung des 64. Lebensjahres folgende
#	             Kalenderjahr (erforderlich, wenn ALTER1=1) -->
#	        <INPUT name="AJAHR" type="int"/>
#	
#	        <!-- 1, wenn das 64. Lebensjahr zu Beginn des Kalenderjahres vollendet wurde, in dem
#	             der Lohnzahlungszeitraum endet (§ 24 a EStG), sonst = 0 -->
#	        <INPUT name="ALTER1" type="int"/>
#	
#	        <!-- in VKAPA und VMT enthaltene Entschädigungen nach §24 Nummer 1 EStG in Cent -->
#	        <INPUT name="ENTSCH" type="BigDecimal" default="new BigDecimal(0)"/>
#	
#	        <!-- eingetragener Faktor mit drei Nachkommastellen -->
#	        <INPUT name="f" type="double" default="1.0"/>
#	
#	        <!-- Jahresfreibetrag nach Maßgabe der Eintragungen auf der
#	             Lohnsteuerkarte in Cents (ggf. 0) -->
#	        <INPUT name="JFREIB" type="BigDecimal"/>
#	
#	        <!-- Jahreshinzurechnungsbetrag in Cents (ggf. 0) -->
#	        <INPUT name="JHINZU" type="BigDecimal"/>
#	
#	        <!-- Voraussichtlicher Jahresarbeitslohn ohne sonstige Bezüge und ohne Vergütung für mehrjährige Tätigkeit in Cent. 
#	             Anmerkung: Die Eingabe dieses Feldes (ggf. 0) ist erforderlich bei Eingabe „sonsti-ger Bezüge“ (Feld SONSTB) 
#	             oder bei Eingabe der „Vergütung für mehrjährige Tätigkeit“ (Feld VMT).
#	             Sind in einem vorangegangenen Abrechnungszeitraum bereits sonstige Bezüge gezahlt worden, so sind sie dem 
#	             voraussichtlichen Jahresarbeitslohn hinzuzurechnen. Vergütungen für mehrere Jahres aus einem vorangegangenen 
#	             Abrechnungszeitraum sind in voller Höhe hinzuzurechnen. --> 
#	        <INPUT name="JRE4" type="BigDecimal"/>
#	 
#	        <!-- In JRE4 enthaltene Versorgungsbezuege in Cents (ggf. 0) -->
#	        <INPUT name="JVBEZ" type="BigDecimal"/>
#	
#			<!--Merker für die Vorsorgepauschale
#				2 = der Arbeitnehmer ist NICHT in der gesetzlichen Rentenversicherung versichert.
#				
#				1 = der Arbeitnehmer ist in der gesetzlichen Rentenversicherung versichert, es gilt die 
#					Beitragsbemessungsgrenze OST.
#					
#				0 = der Arbeitnehmer ist in der gesetzlichen Rentenversicherung versichert, es gilt die 
#					Beitragsbemessungsgrenze WEST. -->
#	        <INPUT name="KRV" type="int"/>
#	
#			<!-- Einkommensbezogener Zusatzbeitragssatz eines gesetzlich krankenversicherten Arbeitnehmers, 
#			 auf dessen Basis der an die Krankenkasse zu zahlende Zusatzbeitrag berechnet wird,
#			 in Prozent (bspw. 0,90 für 0,90 %) mit 2 Dezimalstellen. 
#			 Der von der Kranken-kasse festgesetzte Zusatzbeitragssatz ist bei Abweichungen unmaßgeblich. -->
#			<INPUT name="KVZ" type="BigDecimal"/>
                stobj.setKrv(0)
#	
#	        <!-- Lohnzahlungszeitraum:
#	             1 = Jahr
#	             2 = Monat
#	             3 = Woche
#	             4 = Tag -->
#	        <INPUT name="LZZ" type="int"/>
                stobj.setLzz( int ( intmode ) )
#	
#	        <!-- In der Lohnsteuerkarte des Arbeitnehmers eingetragener Freibetrag für
#	             den Lohnzahlungszeitraum in Cent -->
#	        <INPUT name="LZZFREIB" type="BigDecimal"/>
#	
#	        <!-- In der Lohnsteuerkarte des Arbeitnehmers eingetragener Hinzurechnungsbetrag
#	             für den Lohnzahlungszeitraum in Cent -->
#	        <INPUT name="LZZHINZU" type="BigDecimal"/>
#	
#	        <!-- Dem Arbeitgeber mitgeteilte Zahlungen des Arbeitnehmers zur privaten
#	             Kranken- bzw. Pflegeversicherung im Sinne des §10 Abs. 1 Nr. 3 EStG 2010
#	             als Monatsbetrag in Cent (der Wert ist inabhängig vom Lohnzahlungszeitraum immer 
#	             als Monatsbetrag anzugeben).-->
#	        <INPUT name="PKPV" type="BigDecimal" default="new BigDecimal(0)"/>
#	        
#	        <!-- Krankenversicherung:
#	             0 = gesetzlich krankenversicherte Arbeitnehmer
#	             1 = ausschließlich privat krankenversicherte Arbeitnehmer OHNE Arbeitgeberzuschuss
#	             2 = ausschließlich privat krankenversicherte Arbeitnehmer MIT Arbeitgeberzuschuss -->
#	        <INPUT name="PKV" type="int" default="0"/>
#	        
#	        <!-- 1, wenn bei der sozialen Pflegeversicherung die Besonderheiten in Sachsen zu berücksichtigen sind bzw. 
#	        	 	zu berücksichtigen wären, sonst 0. -->
#	        <INPUT name="PVS" type="int" default="0"/>
#	
#	        <!-- 1, wenn er der Arbeitnehmer den Zuschlag zur sozialen Pflegeversicherung 
#	        	 	zu zahlen hat, sonst 0. -->
#	        <INPUT name="PVZ" type="int" default="0"/>
#	        
#	        <!-- Religionsgemeinschaft des Arbeitnehmers lt. Lohnsteuerkarte (bei
#	             keiner Religionszugehoerigkeit = 0) -->
#	        <INPUT name="R" type="int"/>
                if kirchensteuersatz > 0:
                    stobj.setR( 1 )
                else:
                    stobj.setR( 0 )
#	
#	        <!-- Steuerpflichtiger Arbeitslohn vor Beruecksichtigung der Freibetraege
#	             fuer Versorgungsbezuege, des Altersentlastungsbetrags und des auf
#	             der Lohnsteuerkarte fuer den Lohnzahlungszeitraum eingetragenen
#	             Freibetrags in Cents. -->
#	        <INPUT name="RE4" type="BigDecimal"/>
                stobj.setRe4( int(betrag1*100) )
#	
#	        <!-- Sonstige Bezuege (ohne Verguetung aus mehrjaehriger Taetigkeit) einschliesslich
#	             Sterbegeld bei Versorgungsbezuegen sowie Kapitalauszahlungen/Abfindungen,
#	             soweit es sich nicht um Bezuege fuer mehrere Jahre handelt in Cents (ggf. 0) -->
#	        <INPUT name="SONSTB" type="BigDecimal"/>
#	
#	        <!-- Sterbegeld bei Versorgungsbezuegen sowie Kapitalauszahlungen/Abfindungen,
#	             soweit es sich nicht um Bezuege fuer mehrere Jahre handelt
#	             (in SONSTB enthalten) in Cents -->
#	        <INPUT name="STERBE" type="BigDecimal" regex_test="" regex_transform=""/>
#	
#	        <!-- Steuerklasse:
#	             1 = I
#	             2 = II
#	             3 = III
#	             4 = IV
#	             5 = V
#	             6 = VI -->
#	        <INPUT name="STKL" type="int"/>
                stobj.setStkl( int(stkl) )
#	
#	        <!-- In RE4 enthaltene Versorgungsbezuege in Cents (ggf. 0) -->
#	        <INPUT name="VBEZ" type="BigDecimal"/>
#	
#	        <!-- Vorsorgungsbezug im Januar 2005 bzw. fuer den ersten vollen Monat
#	             in Cents-->
#	        <INPUT name="VBEZM" type="BigDecimal"/>
#	
#	        <!-- Voraussichtliche Sonderzahlungen im Kalenderjahr des Versorgungsbeginns
#	             bei Versorgungsempfaengern ohne Sterbegeld, Kapitalauszahlungen/Abfindungen
#	             bei Versorgungsbezuegen in Cents-->
#	        <INPUT name="VBEZS" type="BigDecimal"/>
#	
#	        <!-- In SONSTB enthaltene Versorgungsbezuege einschliesslich Sterbegeld
#	            in Cents (ggf. 0) -->
#	        <INPUT name="VBS" type="BigDecimal"/>
#	
#	        <!-- Jahr, in dem der Versorgungsbezug erstmalig gewaehrt wurde; werden
#	             mehrere Versorgungsbezuege gezahlt, so gilt der aelteste erstmalige Bezug -->
#	        <INPUT name="VJAHR" type="int" regex_test="" regex_transform=""/>
#	
#	        <!-- Kapitalauszahlungen / Abfindungen / Nachzahlungen bei Versorgungsbezügen 
#	             für mehrere Jahre in Cent (ggf. 0) -->     
#	        <INPUT name="VKAPA" type="BigDecimal" regex_test="" regex_transform=""/>
#	 
#			<!-- Vergütung für mehrjährige Tätigkeit ohne Kapitalauszahlungen und ohne Abfindungen 
#				 bei Versorgungsbezügen in Cent (ggf. 0) -->
#	        <INPUT name="VMT" type="BigDecimal" regex_test="" regex_transform=""/>
#	
#	        <!-- Zahl der Freibetraege fuer Kinder (eine Dezimalstelle, nur bei Steuerklassen
#	             I, II, III und IV) -->
#	        <INPUT name="ZKF" type="BigDecimal" regex_test="" regex_transform=""/>
                stobj.setZkf( float(kinder ) )
#	
#	        <!-- Zahl der Monate, fuer die Versorgungsbezuege gezahlt werden (nur
#	             erforderlich bei Jahresberechnung (LZZ = 1) -->
#	        <INPUT name="ZMVB" type="int" regex_test="" regex_transform=""/>
#	        
#	        <!-- In JRE4 enthaltene Entschädigungen nach § 24 Nummer 1 EStG in Cent -->
#	    	<INPUT name="JRE4ENT" type="BigDecimal" default="BigDecimal.ZERO"/>
#	    	
#	    	<!-- In SONSTB enthaltene Entschädigungen nach § 24 Nummer 1 EStG in Cent -->
#	    	<INPUT name="SONSTENT" type="BigDecimal" default="BigDecimal.ZERO"/>


#    	<!--  AUSGABEPARAMETER  -->
#		<OUTPUTS type="STANDARD">
#	        <!-- Bemessungsgrundlage fuer die Kirchenlohnsteuer in Cents -->
#	        <OUTPUT name="BK" type="BigDecimal" default="new BigDecimal(0)"/>
#	
#	        <!-- Bemessungsgrundlage der sonstigen Einkuenfte (ohne Verguetung
#	             fuer mehrjaehrige Taetigkeit) fuer die Kirchenlohnsteuer in Cents -->
#	        <OUTPUT name="BKS" type="BigDecimal" default="new BigDecimal(0)"/>
#	
#	        <OUTPUT name="BKV" type="BigDecimal" default="new BigDecimal(0)"/>
#	
#	        <!-- Fuer den Lohnzahlungszeitraum einzubehaltende Lohnsteuer in Cents -->
#	        <OUTPUT name="LSTLZZ" type="BigDecimal" default="new BigDecimal(0)"/>
#	
#	        <!-- Fuer den Lohnzahlungszeitraum einzubehaltender Solidaritaetszuschlag
#	             in Cents -->
#	        <OUTPUT name="SOLZLZZ" type="BigDecimal" default="new BigDecimal(0)"/>
#	
#	        <!-- Solidaritaetszuschlag fuer sonstige Bezuege (ohne Verguetung fuer mehrjaehrige
#	             Taetigkeit) in Cents -->
#	        <OUTPUT name="SOLZS" type="BigDecimal" default="new BigDecimal(0)"/>
#	
#	        <!-- Solidaritaetszuschlag fuer die Verguetung fuer mehrjaehrige Taetigkeit in
#	             Cents -->
#	        <OUTPUT name="SOLZV" type="BigDecimal" default="new BigDecimal(0)"/>
#	
#	        <!-- Lohnsteuer fuer sonstige Einkuenfte (ohne Verguetung fuer mehrjaehrige
#	             Taetigkeit) in Cents -->
#	        <OUTPUT name="STS" type="BigDecimal" default="new BigDecimal(0)"/>
#	
#	        <!-- Lohnsteuer fuer Verguetung fuer mehrjaehrige Taetigkeit in Cents -->
#	        <OUTPUT name="STV" type="BigDecimal" default="new BigDecimal(0)"/>
#	        
#	        <!-- Für den Lohnzahlungszeitraum berücksichtigte Beiträge des Arbeitnehmers zur
#				 privaten Basis-Krankenversicherung und privaten Pflege-Pflichtversicherung (ggf. auch
#				 die Mindestvorsorgepauschale) in Cent beim laufenden Arbeitslohn. Für Zwecke der Lohn-
#				 steuerbescheinigung sind die einzelnen Ausgabewerte außerhalb des eigentlichen Lohn-
#				 steuerbescheinigungsprogramms zu addieren; hinzuzurechnen sind auch die Ausgabewerte
#				 VKVSONST -->
#			<OUTPUT name="VKVLZZ" type="BigDecimal" default="new BigDecimal(0)"/> 
#			
#			<!-- Für den Lohnzahlungszeitraum berücksichtigte Beiträge des Arbeitnehmers 
#				 zur privaten Basis-Krankenversicherung und privaten Pflege-Pflichtversicherung (ggf. 
#				 auch die Mindestvorsorgepauschale) in Cent bei sonstigen Bezügen. Der Ausgabewert kann
#				 auch negativ sein. Für tarifermäßigt zu besteuernde Vergütungen für mehrjährige 
#				 Tätigkeiten enthält der PAP keinen entsprechenden Ausgabewert. -->
#			<OUTPUT name="VKVSONST" type="BigDecimal" default="new BigDecimal(0)"/> 
#		
#		</OUTPUTS>
#		
#		<!--  AUSGABEPARAMETER DBA  -->
#		<OUTPUTS type="DBA">
#		
#			<!-- Verbrauchter Freibetrag bei Berechnung des laufenden Arbeitslohns, in Cent -->
#			<OUTPUT name="VFRB" type="BigDecimal" default="new BigDecimal(0)"/> 
#			
#			<!-- Verbrauchter Freibetrag bei Berechnung des voraussichtlichen Jahresarbeitslohns, in Cent -->
#			<OUTPUT name="VFRBS1" type="BigDecimal" default="new BigDecimal(0)"/> 
#			
#			<!-- Verbrauchter Freibetrag bei Berechnung der sonstigen Bezüge, in Cent -->
#			<OUTPUT name="VFRBS2" type="BigDecimal" default="new BigDecimal(0)"/> 
#			
#			<!-- Für die weitergehende Berücksichtigung des Steuerfreibetrags nach dem DBA Türkei verfügbares ZVE über 
#				dem Grundfreibetrag bei der Berechnung des laufenden Arbeitslohns, in Cent -->
#			<OUTPUT name="WVFRB" type="BigDecimal" default="new BigDecimal(0)"/> 
#			
#			<!-- Für die weitergehende Berücksichtigung des Steuerfreibetrags nach dem DBA Türkei verfügbares ZVE über dem Grundfreibetrag 
#				bei der Berechnung des voraussichtlichen Jahresarbeitslohns, in Cent -->
#			<OUTPUT name="WVFRBO" type="BigDecimal" default="new BigDecimal(0)"/> 
#			
#			<!-- Für die weitergehende Berücksichtigung des Steuerfreibetrags nach dem DBA Türkei verfügbares ZVE 
#				über dem Grundfreibetrag bei der Berechnung der sonstigen Bezüge, in Cent -->
#			<OUTPUT name="WVFRBM" type="BigDecimal" default="new BigDecimal(0)"/> 
#		</OUTPUTS>

#                 
#
#                    php_pars = "# " + jahr + '''         
#$_POST['stkl']      =  ''' + str(stkl)            + ''';
#$_POST['zkf']       =  ''' + str(kinder)          + ''';
#$_POST['r']         =  ''' + str(kst)             + ''';
#$_POST['kinderlos'] =  ''' + str(kinderlos)       + ''';
#$_POST['lzz']       =  ''' + intmode              + ''';
#$_POST['re4']       =  ''' + {"2":str(betrag),"1":str(lohnjahr)}[intmode]  + ''';
#$_POST['kvsatz']    =  ''' + "0"                  + ''';
#$_POST['anpdez']    =  ''' + "0"                  + ''';
#$_POST['e_krv']     =  ''' + str(rvbefreit%2)     + ''';
#
#'''
                                               # FIBU-LOHNSTEUER-PARAMS
                                               
#                self.php_lohn = {}
#                    if not php_pars in self.php_lohn:
#                        xhash   = "x"   #   hashlib.md5(php_pars).hexdigest()
#                        xhash   = hashlib.md5(php_pars).hexdigest()
#                        lstfile = self.fibu.rootdir + "/lohn_tmp/lohn_" + xhash + ".php";
#                        if not os.path.isfile(lstfile):
#                            if not jahr in self.php_lohn:
#                                for file in glob.glob( re.sub(r"^(.*)[\\\/](.*)$","\\1",__file__) + "/*/lohn"+jahr+".php"):
#                                    text = open(file).read()
#                                    self.php_lohn[jahr] = re.sub(
#                                      r"\n( +\$wert1 += +number_format[^\n]*?)\n([^\n]*?)\n([^\n]*?)\n( +return +\$wert)",
#                                      "\n//\\1\n//\\2\n//\\3\n\\4",text,re.DOTALL)
#                            text = re.sub(r"\n","\n"+php_pars,self.php_lohn[jahr],1)
#                            open(lstfile,"w").write(text)
#                        stval = self.lst_auswertung ( os.popen("php " + lstfile + " 2> /dev/null").read() )
#                        self.php_lohn[php_pars] = stval
#                        if xhash == "x":
#                            os.unlink(lstfile)
#                    else:
#                        stval = self.php_lohn[php_pars]
#                    

                stobj.MAIN()

                ls = 0.01 * float( stobj.getLstlzz() )
                sz = 0.01 * float( stobj.getSolzlzz() )
                ks = 0.01 * ( float(stobj.getBk()) + float(stobj.getBks()) + float(stobj.getBkv()) ) * kirchensteuersatz
                if intmode == 2:
                    summen[person+jahr]['LS'][monat] = ls
                    summen[person+jahr]['SZ'][monat] = sz 
                    summen[person+jahr]['KS'][monat] = ks 
                    korrektur                        = ""
                else:
                    summen[person+jahr]['LS'][monat] = ls - sum( summen[person+jahr]['LS'][0:monat] )
                    summen[person+jahr]['SZ'][monat] = sz - sum( summen[person+jahr]['SZ'][0:monat] )
                    summen[person+jahr]['KS'][monat] = ks - sum( summen[person+jahr]['KS'][0:monat] )
                    korrektur   = "Jahreskorrigierte "
                        
                for steuerart in ('LS','SZ','KS'):
#                    print ("---", float(summen[person+jahr][steuerart][monat]) )
                    if abs(float(summen[person+jahr]['LS'][monat])) > 0.001:
                        if abs(float(summen[person+jahr]['LS'][monat])) > 0.001 or not steuerart[0] == "K":
                            steuerart1 = steuerart
                            if steuerart1[0] == "K":
                                steuerart1 = "K" + religion.upper()
                                if steuerart1 == "K":
                                    continue
                            buchungen.append([datum,("%3.2f" % summen[person+jahr][steuerart][monat] ),
                                  "11-1500-AN-"+person+"-"+steuerart1,"11-1503-"+steuerart1+"-"+person, "0.00", korrektur +
                                  { "LS":"Lohnsteuer","SZ":"Solidaritaetszuschlag","KS":"Kirchensteuer" }[steuerart]
#                                  ,"{{SORTIDX: " + person + self.sozvers_sortidx("AN"+steuerart1) + "}}"
                                  ])

            summen[person+jahr]['BUCHUNGEN'][monat] = buchungen
                                                
        for pj in summen:
            for buchungen in summen[pj]['BUCHUNGEN']:
                for buchung in buchungen:
                    text.append("  ".join(buchung))

#        print ("\n".join(text) + "\n")
        ktodata['CONTENT'] = "\n".join(text) + "\n"
        ktodata['CONTENT'] = re.sub("AR-Anteil","Arbeitgeber-Anteil",ktodata['CONTENT'],99999999)
        ktodata['CONTENT'] = re.sub("AN-Anteil","Arbeitnehmer-Anteil",ktodata['CONTENT'],99999999)
        ktodata['CONTENT'] = re.sub("korrigierte Soli","korrigierter Soli",ktodata['CONTENT'],99999999)
        

#***************************************************************************

    def sozvers_sortidx (self,pattern):
    
        if pattern[2:4] in self.sort_sozvers:
            return(pattern[0:2] + ("%02u" % self.sort_sozvers.index(pattern[2:4])))
        else:
            return(pattern[0:2] + "99")

#***************************************************************************




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