
| Current Path : /var/www/web-klick.de/dsh/21_finance/23/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/21_finance/23/rules.py |
# coding: utf8
import os,re,sys,glob
class Rules (object):
def __init__ (self):
pass
#+++++++++++++++++++++++++++++++++++++++++
class XRules (object):
def __init__ (self,fibu):
self.fibu = fibu
self.addtext_locale = open( re.sub(r"^(.*)[\\\/](.*)$","\\1",__file__) + "/.gitignore" ).read()
self.header = "IfT Informatik GmbH"
self.ust_kto = "11-1502"
self.sortpatterns = "LOHN,SOND,LS,KS,KE,KR,KA,KB,SZ,RV,AV,KV,PV,U1,U2,U3,AN,AR,PL,Ebit,Abschr".split(",")
self.ktoname = '''
10__Aktiva
10-0201__Anlagen
10-1202__Sparkasse
10-1204__Flessabank
10-1500__Finanzamt_Krankenkassen
10-1510__Beitragsnachweise
10-1511__Krankmeldungen
10-1512__SozMeldungen
10-7000-awender
10-7000-cgabriel
10-7000-cgabriel-10-1200__Commerzbank
10-7000-cgabriel-10-1203__Consors
10-7000__Debitoren
10-7000-emagine
10-7000-gfk
10-7000-gulp
10-7000-hays
10-7000-KK
10-7000-progressive
10-7000-sivantos
10-7000-solcom
10-7000-sterling
10-7000-zaunz
10-7000-zim
10-7001__Lohnsteuerbescheinigungen
11-1500-AN-agosmann
11-1500__Lohnkonten
11-1505__Koerperschaftsteuer
11-1506__Gewerbesteuer
11-1805__Anfangsbestand
11__Passiva
12__Ertrag
13__Aufwand
13-6010__Sozialversicherung
13-6015__Pauschalsteuer
13-6121__Beitrag_VBG
13-6122__Beitrag_IHK
13-6123__Beitrag_GEZ
13-6150__Kfz_Versicherung
13-6300__Buecher_und_Medien
13-6310__Miete_Buero_Fuerth
13-6311__Miete_Buero_Frankfurt
13-6312__Miete_Buero_Frankfurt
13-6320__Heizkosten_Buero
13-6325__Strom_Buero
13-6350__Netz_und_Telefon
13-6430__Gebuehren
13-6530__KFZ_Kosten_Auto
13-6531__KFZ_Gebuehren
13-6540__Abschreibungen
13-6600__Buerokosten
13-6602__Werbekosten
13-6605__Akquisekosten
13-6640__Bewirtungskosten
13-6641__Privatanteil_Bewirt
13-6670__Reisekosten
13-6680__Uebernachtung
13-6700__Computer_ua
13-6800__Porto
13-6815__Buerobedarf
13-6816__Kleingeraete
13-6825__Rechtskosten
13-6855__KtoGeb
13-6890__Verbaende
13-7100__Zinsen
13-7685__KFZ_Steuer
13-7690__Gebuehren_Sonstige
13-7691__Gebuehren_Finanzamt
13-8201__Divers_DEV1304
13-9210__CulturalMarketing
13-9220__Zuwendungen
13-9910__Rundungsausgleich
14__Steuern
14-7603__Koerperschaftssteuer
14-7604__Soli_KSteuer
14-7610__Gewerbesteuer
14-7630__Ausschuettung
14-7632__Quellensteuer
14-7633__Soli_QSteuer
14-7634__KS_QSteuer
15__Ueberschuss
15-1100__Anfangsbestand
15-1200__Jahresueberschuss
15-1300__Endbestand
20__Projektstunden
57__Kennzahlen
'''
#*************************************************
def sortidx (self,kto2):
kto2 = re.sub(r"^\-([A-Z][A-Z]|U\d)\-(AN|AR|PL)\-([a-z]+)","-\\3-\\2-\\1",kto2)
kto2 = re.sub(r"^\-(AN|AR|PL)\-([a-z]+)","-\\2-\\1",kto2)
zaehler = 0
for o in self.sortpatterns:
zaehler = zaehler + 1
kto2 = re.sub("-"+o,"-"+("%03u" % zaehler)+o,kto2)
return(kto2)
#*************************************************
def empty_line_in_ktolist (self,kto2):
if len(kto2) == 2:
return(True)
if re.search(r"^[A-Z][A-Z]\-[a-z]+$",kto2):
return(True)
return(False)
#*************************************************
def rule__raw (self,ktodata):
if " -aktuell" in ktodata['CONTENT']:
ktodata['CONTENT'] = re.sub(r"\-(aktuell|archiv)\-20\d\d","",ktodata['CONTENT'],99999999)
ktodata['CONTENT'] = re.sub(r"\d\d\d\d\d\d\d\d .*?Saldovortrag","",ktodata['CONTENT'],99999999)
#*************************************************
def rule__10_1202 (self,ktodata):
files = glob.glob(ktodata['KTODIR']+"/sync*.csv")
files.sort()
if len(files) == 0:
return()
for file in files:
text = self._raw_data( open(file).read() ,2)
zeilen = []
for zeile in text:
if "Umsatz vorgemerkt" in "".join(zeile):
continue
zeilen.append( zeile[2] + " " + re.sub(r",",".", re.sub(r"[\.\+]","",zeile[8],99) ) +
" - 13-9999 0.00 " + zeile[3] + " " + zeile[4] + " " + zeile[5] + " IBAN " + zeile[6] )
if zeilen:
ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(zeilen) + "\n"
ktodata['CONTENT'] = self.fibu.normalize_text(ktodata['CONTENT'])
self.fibu.assign_ausgaben(ktodata,"13-9999",'''
Gehalt.*Dienlin,Gehalt.*Volker.*Gabriel,Gehalt.*Friedrichs,Lohn.*Engewald,Gehalt.*Wonneberger,Gehalt.*Parfuss,
Gehalt.*Friemann,Gehalt.*Jain,Gehalt.*Friemann,Praktikum.*Meier,
Die Bahn sagt danke,sipgate,Bundesanzeiger,
Aral | Esso | Shell|TANKSTELLE,
Finanzkasse Schwabach,Awender,Nemecek,
Solcom,Osram,STHREE,Hays,
Hobbyland,REWE,Tengelmann,BIO-Welt,Fristo,
ADAC,Conrad ,
GUT.*TK-Beleg.*Guthaben,GUT.*TK-Beleg,Techniker K, TK ,
GUT.*A ?AG.*Knappschaft,Knappschaft, AOK ,Gutschrift.*DEBEKA ,
Rundfunk,infra +fuerth,
Strato , 1u1 ,
410978,3103207,200031185, 44302 ,
Golubovic,GELDAUTOMAT , POST ,
''')
#********************************************************************************
def rule__10_1204 (self,ktodata):
files = glob.glob(ktodata['KTODIR']+"/sync*.csv")
files.sort()
if len(files) == 0:
return()
for file in files:
text = self._raw_data( open(file).read() ,1,"flessa")
zeilen = []
for zeile in text:
if "Umsatz vorgemerkt" in "".join(zeile):
continue
zeilen.append( zeile[1] + " " +
("%3.2f" % float( {'S':'-','H':''}[zeile[12]] + re.sub(r",",".", re.sub(r"[\.\+]","",zeile[11],99) ) )
+ " - 13-9999 0.00 " +
re.sub(r" +"," ",(zeile[3] + " " + zeile[4] + " " + zeile[6] +
" " + zeile[8]).strip(),99999999) ) )
if zeilen:
ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(zeilen) + "\n"
ktodata['CONTENT'] = self.fibu.normalize_text(ktodata['CONTENT'])
self.fibu.assign_ausgaben(ktodata,"13-9999",'''
Dienlin.*Gehalt,Volker.*Gabriel.*Lohn,Friedrichs.*Lohn,Engewald.*Lohn,Wonneberger.*Gehalt,Parfuss.*Gehalt,
Friemann.*Gehalt,Jain.*Gehalt,Gehalt.*Friemann,Meier.*Praktikum,
Die Bahn sagt danke,sipgate,Bundesanzeiger,
Aral,Esso,Shell,TANKSTELLE,
Finanzkasse Schwabach.*2.?18.*129.*10296,Awender,nemecek,
Solcom,STHREE,Hays ,
ABSCHLUSS PER,SB-Auszahlung,Rueckgabe.Wider,
REWE|Tengelmann|BIO-Welt|Fristo| EBL.*NA|NETTO +MA,SPD ,Wien +Energie,
ADAC, BVMW, Conrad ,BANKOMAT,
Ueberweisung.*TK-Beleg,Techniker K, TK ,Knappschaft, AOK R, DEBEKA ,
Rundfunk,0052383044,1105722230,infra +fuerth,VBG ,AOK Nordwest,
Strato | 1u1 | 1und1 ,
3103207,200031185, 44302 ,Auslagen.*Pfaendung,Wonneberger.*Auslagen,
Golubovic,GELDAUTOMAT | Sparda, POST,
''')
#*********************************************************
def rule__10_7000_cgabriel_10_1200 (self,ktodata):
files = glob.glob(ktodata['KTODIR']+"/sync*.csv")
files.sort()
if len(files) == 0:
return()
for file in files:
text = self._raw_data( open(file).read() ,1)
zeilen = []
for zeile in text:
zeilen.append( zeile[1] + " " +
re.sub(r",",".", re.sub(r"[\.\+]","",zeile[4],99) )
+ " - 13-9999 0.00 " +
re.sub(r" +"," ",(zeile[3] + " IBAN " + zeile[8]).strip(),99999999) )
if zeilen:
ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(zeilen) + "\n"
ktodata['CONTENT'] = self.fibu.normalize_text(ktodata['CONTENT'])
self.fibu.assign_ausgaben(ktodata,"13-9999",'''
Vodafone,Abschluss Zinsen,Kontofuehrung,Infra Fuerth|INFRA FUERTH,
HARTMANN GOETTELMANN PLEWA,NEMECEK,Leonard George,ZGASt|Landeskirchenstelle,Vodafone,
200031185,410498, 44302 ,GUTSCHRIFT +UNITED +DOMAINS,Kontofuehrung, DAK |DAK-Gesundhei,UNITED.*DOMAINS.*RECHN,
''')
#*********************************************************************************
def rule__10_7000_cgabriel_10_1203 (self,ktodata):
files = glob.glob(ktodata['KTODIR']+"/KONTOAUS*.ocr")
files.sort()
if len(files) == 0:
return()
# print (files)
for file in files:
# print (file)
buchungen = []
text = open(file).read() + " \n \n"
text = re.sub(chr(12),"",text,99999999)
text = re.sub(r"BONIFIKATION","< x > BONIFIKATION",text,99999999)
text = re.sub(r"\n +VISA"," < x > VISA",text,99999999,re.DOTALL)
m = re.search(r"Datum +\d\d\.(\d\d)\.(\d\d)",text)
monat = int(m.group(1))
jahr1 = "20" + m.group(2)
jahr0 = "%04u" % (int(jahr1)-1)
while (0 == 0):
m = re.search(r"^(.*?)\n(\S+ *\S*) +(\d\d)\.(\d\d)\. +(\d\d\d\d) +\d\d\.\d\d\. +([\d\.]+,\d\d)([\-\+]?)\n +([^\n]*?)\s+\< *([^\n]+?) *\> +(.*?)(\n *\S.*$)",text,flags=re.DOTALL)
if not m:
break
jahr = jahr1
if int(m.group(4)) > monat:
jahr = jahr0
text = m.group(1) + m.group(11)
buchungen.append( [jahr + m.group(4) + m.group(3), re.sub(r",",".",
re.sub(r"[\.\+]","",m.group(7)+m.group(6),99) ),
"-","13-9999", "0.00", re.sub(r" +"," ",m.group(2) + " " + m.group(8),99)
+ " " + m.group(9) + " IBAN " + re.sub("\s+"," ",m.group(10),9999) ] )
while (0 == 0):
m = re.search(r"^(.*?)\n(ABSCHLUSS|GEBUEHREN) +(\d\d)\.(\d\d)\. +(\d\d\d\d) +\d\d\.\d\d\. +([\d\.]+,\d\d)([\-\+]?) *\n(.*$)",text,flags=re.DOTALL)
if not m:
break
jahr = jahr1
if int(m.group(4)) > monat:
jahr = jahr0
text = m.group(1) + m.group(8)
buchungen.append( [jahr + m.group(4) + m.group(3), re.sub(r",",".",
re.sub(r"[\.\+]","",m.group(7)+m.group(6),99) ),
"-","13-9999", "0.00" , m.group(2) + " Kontogebuehren und Zinsen"] )
zeilen = []
for buchung in buchungen:
zeilen.append(" ".join(buchung))
# print (zeilen[-1] )
if buchungen:
ktodata['CONTENT'] = ktodata['CONTENT'] + "\n" + "\n".join(zeilen) + "\n"
self.fibu.assign_ausgaben(ktodata,"13-9999",'''
ERSTE.?BANK|BANKOMAT|SPARDA|SPK |POSTBANK|SPARKASSE|SANTANDER|VR.?BANK|RAIFFEISEN|DEUTSCHE.?BANK|VR +BANK| HVB|DRESDNER|REISEBANK|VOLKSBANK|INTERCARD|INGDIBA|DEUBA|COMMERZBANK|KREISSPAR,
CULTURALL,NETFORGE|GLEICHKLANG|VCINTERNET,3103207,IFT +INSTITUT,Kontogebuehren,Jazz Studio,BEHZANET,
GUTSCHRIFT.?UNITED.?DOMAINS,9549114,Daniela Jungblut,ASKNET,GOOGLE,
''')
#*************************************************************************
def rule__10_1500_xxx (self,ktodata):
self.fibu.sozvers.parse_ktoauszug(ktodata)
self.fibu.sozvers.parse_krankmeldung(ktodata)
#*************************************************************************
def rule__10_1500_1502 (self,ktodata): pass
def rule__10_1500_1503 (self,ktodata): pass
def rule__10_1500_1505 (self,ktodata): pass
def rule__10_1500_1506 (self,ktodata): pass
def rule__10_1500_1507 (self,ktodata): pass
def rule__10_1500_1509 (self,ktodata): pass
#*************************************************************************
def rule__10_1510_xxx (self,ktodata): return( self.fibu.sozvers.parse_beitragsnachweise(ktodata) )
def rule__10_1511_xxx (self,ktodata): return( self.fibu.sozvers.parse_krankmeldung(ktodata) )
def rule__11_1500 (self,ktodata): return( self.fibu.lohn.sozvers(ktodata) )
def rule__12 (self,ktodata): return( self.fibu.usteuer.qualify(ktodata) )
def rule__13 (self,ktodata): return( self.fibu.usteuer.qualify(ktodata) )
def rule__10_0201 (self,ktodata):
self.fibu.abschreibung.qualify(ktodata)
self.fibu.usteuer.qualify(ktodata)
def rule__ (self,ktodata): return( self.fibu.bilanz.finish_year(ktodata) )
#*************************************************************************
def rule__10_7000_xxx (self,ktodata):
name = re.sub(r"^10-7000-","",ktodata['UKTO'])
print(name)
if (","+name+",") in (",swonneberger,tjungblut,sjain,arjasanow,cgabriel,ccsengery,jfriedrichs,ddienlin,afriemann,"):
self.fibu.belege.einlesen(ktodata,"13-9999")
self.fibu.assign_ausgaben(ktodata,"13-9999",
"Fruehstueck|Restaur,Hotel,DB_|Deutsche.*Bahn|Fahrkarte,Taxi_,AirBnB,Conrad|Saturn|USB")
elif (","+name+",") in (",hays,solcom,progressive,emagine,gulp,gfk,sivantos,sterling,usu,"):
self.fibu.belege.rechnungen(ktodata,name)
#*************************************************************************
def rule__13_xxx (self,ktodata):
name = re.sub(r"^10-7000-","",ktodata['UKTO'])
self.fibu.belege.einlesen(ktodata,"33-9999")
self.fibu.assign_ausgaben(ktodata,"13-9999")
#*************************************************************************
def rule__20 (self,ktodata):
# self.fibu.sozvers.parse_sozmeldungen(ktodata)
self.fibu.sozvers.parse_stundenkk(ktodata)
self.fibu.sozvers.parse_projektstunden(ktodata)
#*************************************************************************
def merge (self,ktodata,cursor):
return("Merge not implemented.")
#*************************************************************************
def _raw_data (self,text,datidx,special=""):
zeilen = []
text = re.sub(r"(\d\d)\.(\d\d)\.(\d\d\d\d)\/","\\1-\\2-\\3-",text,99999999)
if special == "flessa":
jahr = "2016"
while (0 == 0):
m = re.search(r"^(.*?\n)(\d\d\.\d\d\.) +(\d\d\.\d\d)\. (.*?)([\d\.]+,\d\d) +([SH])(.*?)(\d\d\.\d\d\. +\d\d\.\d\d\..*)$",text,re.DOTALL)
if not m:
break
text = m.group(1) + "\n" + m.group(8)
zeile = '"' + '";"'.join([
m.group(2) + jahr,
m.group(2) + jahr,
"",
re.sub(r"\s+"," ",m.group(4) + m.group(7),9999,re.DOTALL),
"",
"",
"",
"",
"",
"",
"",
m.group(5),
m.group(6),
]) + '"'
text = text + "\n" + zeile + "\n"
text = re.sub(r"(\n\"?\d\d\.\d\d\.\d\d\d\d\"?\S)","---CR---\\1",text,99999999,re.DOTALL)
text = re.sub(r"\n","",text,99999999,re.DOTALL)
text = re.sub(r"---CR---","\n",text,99999999,re.DOTALL)
for zeile in text.split("\n"):
zeile1 = re.sub(r"\"","",zeile,99999999).split(";")
try:
zeile1[datidx] = re.sub(r"^(\d\d)\.(\d\d)\.\d?\d?(\d\d)\.$","20\\3\\2\\1",zeile1[datidx]+".")
int(zeile1[datidx])
except:
continue
zeilen.append(zeile1)
return(zeilen)
#*************************************************************************
def kknr (self,kk):
kk = kk.upper()
kk = re.sub(r"\n"," ",kk,99999999)
# print (kk)
if " DAK" in kk:
return("1510","DAK")
elif "AOK HESSEN" in kk:
return("1511","AOKHES")
elif " AOK RHEINL" in kk:
return("1520","AOKRPS")
elif " AOK NORD" in kk:
return("1521","AOKNWE")
elif " MINIJOB" in kk or " KNAPPSCHAFT" in kk:
return("1512","MINIJO")
elif re.search("( BKK_?VER|[- ]VBU)",kk):
return("1513","VBU")
elif " AOK BAYERN" in kk:
return("1514","AOKBAY")
elif re.search("( BKK_?MOBIL| MOBILOI?L?| BKKMOIL|LFD.\s*NR.\s*ERFASSUNG)",kk):
return("1515","MOBILO")
elif re.search("( BKK_?SIEMENS | SBK )",kk):
return("1516","SBK")
elif " TECHNIKER" in kk or " TKK" in kk or " TECHNKK" in kk:
return("1517","TKK")
elif " BARMER" in kk:
return("1518","BARMER")
elif " DEBEKA" in kk:
return("1519","DEBEKA")
return("1528","UNKNOWN")
#*************************************************************************