--- trunk/lohnrechner.py 2006/04/25 15:34:07 62 +++ trunk/lohnrechner.py 2009/02/11 11:04:42 81 @@ -5,50 +5,51 @@ # $Id$ # -------------------------------------------------------------------- # -# Copyright (c) 2005,2006 by Intevation GmbH +# Copyright (c) 2005,2006,2007,2008 by Intevation GmbH # Authors: # Sascha Wilde # # This program is free software under the GPL (>=v2) # Read the file COPYING coming with this package for details. -"""Lohn/Gehaltsrechner für das Jahr 2006""" +"""Lohn/Gehaltsrechner für das Jahr 2008""" __version__ = "$Revision$" # $Source$ _release_version = "0.%s" % __version__[11:-2] -import LST2006 +import LST2008 from Tkinter import * -class Lohnrechner(LST2006.LStRechner2006): +class Lohnrechner(LST2008.LStRechner2008): def __init__(self, root): - LST2006.LStRechner2006.__init__(self) + LST2008.LStRechner2008.__init__(self) # Land, Kirchensteuersatz, Pflegeversicherung AG-Anteil - self.laender = [("Baden-Württemberg", 8, 0.0085), - ("Bayern", 8, 0.0085), - ("Berlin", 9, 0.0085), - ("Brandenburg", 9, 0.0085), - ("Bremen", 9, 0.0085), - ("Bremerhaven", 9, 0.0085), - ("Hamburg", 9, 0.0085), - ("Hessen", 9, 0.0085), - ("Mecklenburg-Vorpommern", 9, 0.0085), - ("Niedersachsen" ,9, 0.0085), - ("Nordrhein-Westfalen", 9, 0.0085), - ("Rheinland-Pfalz", 9, 0.0085), - ("Saarland", 9, 0.0085), - ("Sachsen", 9, 0.0135), - ("Sachsen-Anhalt", 9, 0.0085), - ("Schleswig-Holstein", 9, 0.0085), - ("Thüringen", 9, 0.0085)] + self.laender = [("Baden-Württemberg", 8, 0.0085, 5300), + ("Bayern", 8, 0.0085, 5300), + ("Berlin (ost)", 9, 0.0085, 4500), + ("Berlin (west)", 9, 0.0085, 5300), + ("Brandenburg", 9, 0.0085, 4500), + ("Bremen", 9, 0.0085, 5300), + ("Bremerhaven", 9, 0.0085, 5300), + ("Hamburg", 9, 0.0085, 5300), + ("Hessen", 9, 0.0085, 5300), + ("Mecklenburg-Vorpommern", 9, 0.0085, 4500), + ("Niedersachsen" ,9, 0.0085, 5300), + ("Nordrhein-Westfalen", 9, 0.0085, 5300), + ("Rheinland-Pfalz", 9, 0.0085, 5300), + ("Saarland", 9, 0.0085, 5300), + ("Sachsen", 9, 0.0135, 4500), + ("Sachsen-Anhalt", 9, 0.0085, 4500), + ("Schleswig-Holstein", 9, 0.0085, 5300), + ("Thüringen", 9, 0.0085, 4500)] self.root = root - self.root.title("Lohnrechner 2006 - v%s" % _release_version) + self.root.title("Lohnrechner 2008 - v%s" % _release_version) self.SetupUI() self.UpdateLand() @@ -72,10 +73,20 @@ self.lohn.bind("", self.NewInput) self.lohn.grid(row=1, column=1, sticky=W) - Label(frame, text="Steuerklasse:").grid(row=2, sticky=E) + sonstbezlabel = Label(frame, text="Sonstige Bezüge:") + self.sonstbez = Entry(frame) + self.sonstbez.bind("", self.NewInput) + # Sonstige Bezuege bisher nur unter Randbedingungen: + # - Einmalig im Kalenderjahr + # - Keine Berücksichtigung bei der Berechnung Sozialbeiträge + # Daher per Vorgabe "versteckt", bei Bedarf einfuegen: + # sonstbezlabel.grid(row=2, sticky=E) + # self.sonstbez.grid(row=2, column=1, sticky=W) + + Label(frame, text="Steuerklasse:").grid(row=3, sticky=E) self.stkl = IntVar() stklframe = Frame(frame) - stklframe.grid(row=2, column=1, sticky=W) + stklframe.grid(row=3, column=1, sticky=W) for text, val in [("I", 1), ("II", 2), ("III", 3), @@ -89,17 +100,24 @@ stklradio.select() stklradio.pack(side=LEFT) - Label(frame, text="Kirchensteuer:").grid(row=3, sticky=E) + Label(frame, text="Kirchensteuer:").grid(row=4, sticky=E) self.kirche = IntVar() Checkbutton(frame, onvalue=1, offvalue=0, command=self.NewInput, - variable=self.kirche).grid(row=3, column=1,sticky=W) + variable=self.kirche).grid(row=4, column=1,sticky=W) - Label(frame, text="Kinderfreibetrag:").grid(row=4, sticky=E) + Label(frame, text="Kinderfreibetrag:").grid(row=5, sticky=E) self.kfb = Entry(frame) self.kfb.bind("", self.NewInput) - self.kfb.grid(row=4, column=1, sticky=W) + self.kfb.grid(row=5, column=1, sticky=W) - Label(frame, text="Bundesland:").grid(row=5, sticky=NE) + Label(frame, text="Kinder:").grid(row=6, sticky=E) + self.kinder = IntVar() + self.kinderradio = Checkbutton(frame, onvalue=1, offvalue=0, + command=self.NewInput, + variable=self.kinder) + self.kinderradio.grid(row=6, column=1, sticky=W) + + Label(frame, text="Bundesland:").grid(row=7, sticky=NE) landframe = Frame(frame) scrollbar = Scrollbar(landframe, orient=VERTICAL) self.landbox = Listbox(landframe, height=4, selectmode=SINGLE, @@ -111,7 +129,7 @@ self.landbox.pack(side=RIGHT, fill=Y) scrollbar.config(command=self.landbox.yview) scrollbar.pack(side=LEFT, fill=BOTH, expand=1) - landframe.grid(row=5, rowspan=4, column=1, sticky=W) + landframe.grid(row=7, rowspan=4, column=1, sticky=W) Label(frame, text="Lohnsteuer:").grid(row=0, column=2, sticky=E) self.lst = Entry(frame) @@ -130,24 +148,24 @@ self.netto1.grid(row=3, column=3, sticky=W) # Sozialversicherung Ein/Ausgabe - Label(frame, text="Sozialversicherung:").grid(row=9, sticky=E) + Label(frame, text="Sozialversicherung:").grid(row=11, sticky=E) self.sozv = IntVar() sozvradio = Checkbutton(frame, onvalue=1, offvalue=0, command=self.NewInput, variable=self.sozv) sozvradio.select() - sozvradio.grid(row=9, column=1, sticky=W) + sozvradio.grid(row=11, column=1, sticky=W) - Label(frame, text="Krankenkassenbeitrag:").grid(row=10, sticky=E) + Label(frame, text="Krankenkassenbeitrag:").grid(row=12, sticky=E) self.kvsatz = Entry(frame) self.kvsatz.bind("", self.NewInput) - self.kvsatz.grid(row=10, column=1, sticky=W) + self.kvsatz.grid(row=12, column=1, sticky=W) - Label(frame, text="Krankenkassenzuschlag (0.9%):").grid(row=11, sticky=E) + Label(frame, text="Krankenkassenzuschlag (0.9%):").grid(row=13, sticky=E) self.kvsoli = IntVar() kvsoliradio = Checkbutton(frame, onvalue=1, offvalue=0, - command=self.NewInput, variable=self.kvsoli) + command=self.NewInput, variable=self.kvsoli) kvsoliradio.select() - kvsoliradio.grid(row=11, column=1, sticky=W) + kvsoliradio.grid(row=13, column=1, sticky=W) Label(frame, text="Rentenversicherung:").grid(row=4, column=2, sticky=E) @@ -173,7 +191,7 @@ # Allgemeine UI Elemente buttons = Frame(frame) - buttons.grid(row=10, column=2, rowspan=2, columnspan=2) + buttons.grid(row=10, column=2, rowspan=3, columnspan=2) Button(buttons, text="Quit", command=self.root.quit).pack(side=LEFT) Button(buttons, text="Info", command=self.Info).pack(side=LEFT) Button(buttons, text="Berechnen", command=self.CalcOutput).pack(side=LEFT) @@ -184,7 +202,9 @@ # zwangsselektiert: # FIX ME: eigendlich wäre das ein Fall für ein custom widget! if len(self.landbox.curselection()) == 0: - self.landbox.select_set(self.land) + self.landbox.select_set(self.land) + if float(self.kfb.get()) > 0.0: + self.kinderradio.select() self.CalcOutput() def UpdateLand(self): @@ -197,6 +217,7 @@ def ResetInput(self): self.ResetInputGeb() self.ResetInputLohn() + self.ResetInputSonstBez() self.ResetInputKfb() self.ResetInputKVsatz() self.NewLandSel() @@ -209,6 +230,10 @@ self.lohn.delete(0, END) self.lohn.insert(0, "0") + def ResetInputSonstBez(self): + self.sonstbez.delete(0, END) + self.sonstbez.insert(0, "0") + def ResetInputKfb(self): self.kfb.delete(0, END) self.kfb.insert(0, "0") @@ -224,6 +249,24 @@ self.ResetInputLohn() try: + self.SetSonstigeBezuege(float(self.sonstbez.get())) + except: + self.ResetInputSonstBez() + + # JRE4: Nötig für Sonstige Bezüge. + # Voraussichtlicher Jahresarbeitslohn ohne sonstige Bezüge und ohne + # Vergütung für mehrjährige Tätigkeit in Cent (ggf. 0) + # lohnrechner berechnet diesen aus dem monatlichen Lohn. + try: + self.Set_JRE4(round(float(self.lohn.get())*100.0,2)*12) + except: + pass + + # JVBEZ: Nötig für Sonstige Bezüge. + # lohnrechner berücksichtigt keine Versorgungsbezüge, daher 0. + self.Set_JVBEZ(0) + + try: self.SetGeb(int(self.geb.get())) except: self.ResetInputGeb() @@ -246,13 +289,14 @@ self.InitCalc() self.Calc() self.lst.delete(0, END) - self.lst.insert(0, "%.2f" % self.GetLohnsteuer()) + self.lst.insert(0, "%.2f" % self.GetLohnsteuerGesamt()) self.soli.delete(0, END) - self.soli.insert(0, "%.2f" % self.GetSoli()) + self.soli.insert(0, "%.2f" % self.GetSoliGesamt()) self.kist.delete(0, END) - self.kist.insert(0, "%.2f" % self.GetKirchensteuer()) - netto1 = self.GetLohn() - self.GetLohnsteuer() \ - - self.GetSoli() - self.GetKirchensteuer() + self.kist.insert(0, "%.2f" % self.GetKirchensteuerGesamt()) + netto1 = self.GetLohn() + self.GetSonstigeBezuege() \ + - self.GetLohnsteuerGesamt() \ + - self.GetSoliGesamt() - self.GetKirchensteuerGesamt() self.netto1.delete(0, END) self.netto1.insert(0, "%.2f" % netto1) self.rv.delete(0, END) @@ -271,15 +315,15 @@ def Info(self): infowin = Toplevel(self.root) infowin.title("Info") - Label(infowin, text="Lohnrechner 2006 v%s" % _release_version, + Label(infowin, text="Lohnrechner 2008 v%s" % _release_version, font=("Times", 14, "bold italic")).grid(row=0, pady=20) Label(infowin, text= - "Copyright (C) 2005,2006 Intevation GmbH \n\n\ -Lohnrechner 2006 comes with ABSOLUTELY NO WARRANTY.\n\ + "Copyright (C) 2005,2006,2007,2008 Intevation GmbH \n\n\ +Lohnrechner 2008 comes with ABSOLUTELY NO WARRANTY.\n\ This is free software, and you are welcome to redistribute it\n\ under the terms of the GNU General Public License.\n\ For more information about these matters, see the file named COPYING.\n\n\ -Dieses Programm verwendet LST2006 %s" % LST2006._ModulVersion()).grid(row=1, padx=10) +Dieses Programm verwendet LST2008 %s" % LST2008._ModulVersion()).grid(row=1, padx=10) Button(infowin, text="Ok", command=infowin.destroy).grid(row=2, pady=10) # @@ -289,12 +333,12 @@ # def InitSozv(self): - self.AVsatz = 0.065 / 2 - self.RVsatz = 0.195 / 2 + self.AVsatz = 0.033 / 2 + self.RVsatz = 0.199 / 2 # PVsatz ist in self.laender definiert! self.PVkinderlose = 0.0025 - self.BMG1 = 3562.5 - self.BMG2 = 5250 + self.BMG1 = 3600 + # BMG2 für RV und ALV ist in self.laender definiert! def SetKV(self, value): assert value >= 0.0 and value <= 100.0, \ @@ -302,27 +346,29 @@ self.KVsatz = (value / 100.0) def GetAV(self): - lohn = self.GetLohn() - if lohn > self.BMG2 : lohn = self.BMG2 + lohn = self.GetLohnGesamt() + BMG2 = self.laender[self.land][3] + if lohn > BMG2 : lohn = BMG2 return round(self.sozv.get() * self.AVsatz * lohn, 2) def GetRV(self): - lohn = self.GetLohn() - if lohn > self.BMG2 : lohn = self.BMG2 + lohn = self.GetLohnGesamt() + BMG2 = self.laender[self.land][3] + if lohn > BMG2 : lohn = BMG2 return round(self.sozv.get() * self.RVsatz * lohn, 2) def GetPV(self): self.PVsatz = self.laender[self.land][2] - lohn = self.GetLohn() + lohn = self.GetLohnGesamt() if lohn > self.BMG1 : lohn = self.BMG1 PV = self.PVsatz * lohn - if float(self.kfb.get()) == 0.0 : + if self.kinder.get() == 0 : PV += lohn * self.PVkinderlose return round(self.sozv.get() * PV, 2) def GetKV(self): self.KVsoli = self.kvsoli.get() - lohn = self.GetLohn() + lohn = self.GetLohnGesamt() if lohn > self.BMG1 : lohn = self.BMG1 if self.KVsoli : return round(self.sozv.get() * ((self.KVsatz / 2) + 0.009) * lohn, 2)