/[lohnrechner]/trunk/lohnrechner2006.py
ViewVC logotype

Diff of /trunk/lohnrechner2006.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 18 by wilde, Thu Jan 13 16:59:53 2005 UTC revision 33 by wilde, Fri Feb 4 13:25:36 2005 UTC
# Line 1  Line 1 
1  #! /usr/bin/python  #! /usr/bin/python
2    # -*- coding: iso-8859-1 -*-
3  # --------------------------------------------------------------------  # --------------------------------------------------------------------
4  # Lohnsteuer und Sozialabgaben Rechner  # Lohnsteuer und Sozialabgaben Rechner
5  # $Id$  # $Id$
# Line 16  Line 17 
17  __version__ = "$Revision$"  __version__ = "$Revision$"
18  # $Source$  # $Source$
19                    
20  _release_version = "0.%s alpha" % __version__[11:-2]  _release_version = "0.%s beta" % __version__[11:-2]
21    
22  import LST2005  import LST2005
23  from Tkinter import *  from Tkinter import *
# Line 26  class Lohnrechner(LST2005.LStRechner2005 Line 27  class Lohnrechner(LST2005.LStRechner2005
27      def __init__(self, root):      def __init__(self, root):
28          LST2005.LStRechner2005.__init__(self)          LST2005.LStRechner2005.__init__(self)
29    
30          root.title("Lohnrechner 2005 - v%s" % _release_version)          # Land, Kirchensteuersatz
31          root.resizable(NO, NO)          self.laender = [("Baden-W�rttemberg", 8),
32                            ("Bayern", 8),
33                            ("Berlin", 9),
34                            ("Brandenburg", 9),
35                            ("Bremen", 9),
36                            ("Bremerhaven", 9),
37                            ("Hamburg", 9),
38                            ("Hessen", 9),
39                            ("Mecklenburg-Vorpommern", 9),
40                            ("Niedersachsen" ,9),
41                            ("Nordrhein-Westfalen", 9),
42                            ("Rheinland-Pfalz", 9),
43                            ("Saarland", 9),
44                            ("Sachsen", 9),
45                            ("Sachsen-Anhalt", 9),
46                            ("Schleswig-Holstein", 9),
47                            ("Th�ringen", 9)]
48    
49            self.InitSozv()
50            
51          self.root = root          self.root = root
52    
53          Label(root, text="Lohn:").grid(row=0, sticky=E)          self.root.title("Lohnrechner 2005 - v%s" % _release_version)
54          self.lohn = Entry(root)  
55            self.SetupUI()
56            self.ResetInput()
57    
58        def SetupUI(self):
59            self.root.resizable(NO, NO)
60    
61            frame = Frame(self.root)
62            frame.grid(padx=10, pady=10)
63    
64            # Steuern Ein/Ausgabe
65            Label(frame, text="Lohn:").grid(row=0, sticky=E)
66            self.lohn = Entry(frame)
67          self.lohn.bind("<Return>", self.NewInput)          self.lohn.bind("<Return>", self.NewInput)
68          self.lohn.grid(row=0, column=1, sticky=W)          self.lohn.grid(row=0, column=1, sticky=W)
69    
70          Label(root, text="Steuerklasse:").grid(row=1, sticky=E)          Label(frame, text="Steuerklasse:").grid(row=1, sticky=E)
71          self.stkl = StringVar()          self.stkl = IntVar()
72          stklframe = Frame(root)          stklframe = Frame(frame)
73          stklframe.grid(row=1, column=1, sticky=W)          stklframe.grid(row=1, column=1, sticky=W)
74          for text, val in [("I", "1"),          for text, val in [("I", 1),
75                            ("II", "2"),                            ("II", 2),
76                            ("III", "3"),                            ("III", 3),
77                            ("IV", "4"),                            ("IV", 4),
78                            ("V", "5"),                            ("V", 5),
79                            ("VI", "6")]:                            ("VI", 6)]:
80              stklradio = Radiobutton(stklframe, text=text, value=val,              stklradio = Radiobutton(stklframe, text=text, value=val,
81                                      indicatoron=0, command=self.CalcOutput,                                      indicatoron=0, command=self.NewInput,
82                                      variable=self.stkl)                                      variable=self.stkl)
83              if text == "I":              if text == "I":
84                  stklradio.select()                  stklradio.select()
85              stklradio.pack(side=LEFT)              stklradio.pack(side=LEFT)
86    
87          Label(root, text="Kirchensteuer (%):").grid(row=2, sticky=E)          Label(frame, text="Kirchensteuer:").grid(row=2, sticky=E)
88          self.kirche = StringVar()          self.kirche = IntVar()
89          kircheframe = Frame(root)          Checkbutton(frame, onvalue=1, offvalue=0, command=self.NewInput,
90          kircheframe.grid(row=2, column=1, sticky=W)                      variable=self.kirche).grid(row=2, column=1,sticky=W)
91          for text, val in [("keine", "0"),  
92                            ("8 %", "8"),          Label(frame, text="Kinderfreibetrag:").grid(row=3, sticky=E)
93                            ("9 %", "9")]:          self.kfb = Entry(frame)
94              kircheradio = Radiobutton(kircheframe, text=text, value=val,          self.kfb.bind("<Return>", self.NewInput)
95                                      indicatoron=0, command=self.CalcOutput,          self.kfb.grid(row=3, column=1, sticky=W)
96                                      variable=self.kirche)  
97              if val == "0":          Label(frame, text="Bundesland:").grid(row=4, sticky=NE)
98                  kircheradio.select()          landframe = Frame(frame)
99              kircheradio.pack(side=LEFT)          scrollbar = Scrollbar(landframe, orient=VERTICAL)
100            self.landbox = Listbox(landframe, height=4, selectmode=SINGLE,
101          self.ResetInput()                                 yscrollcommand=scrollbar.set)
102            for land in self.laender:
103          Label(root, text="Lohnsteuer:").grid(row=0, column=2, sticky=E)              self.landbox.insert(END, land[0])
104          self.lst = Entry(root)          self.landbox.select_set(0)
105            self.landbox.bind("<<ListboxSelect>>", self.NewLandSel)
106            self.landbox.pack(side=RIGHT, fill=Y)
107            scrollbar.config(command=self.landbox.yview)
108            scrollbar.pack(side=LEFT, fill=BOTH, expand=1)
109            landframe.grid(row=4, rowspan=4, column=1, sticky=W)
110            
111            Label(frame, text="Lohnsteuer:").grid(row=0, column=2, sticky=E)
112            self.lst = Entry(frame)
113          self.lst.grid(row=0, column=3, sticky=W)          self.lst.grid(row=0, column=3, sticky=W)
114    
115          Label(root, text="Solidarit�tszuschlag:").grid(row=1, column=2, sticky=E)          Label(frame, text="Solidarit�tszuschlag:").grid(row=1, column=2, sticky=E)
116          self.soli = Entry(root)          self.soli = Entry(frame)
117          self.soli.grid(row=1, column=3, sticky=W)          self.soli.grid(row=1, column=3, sticky=W)
118    
119          Label(root, text="Kirchensteuer:").grid(row=2, column=2, sticky=E)          Label(frame, text="Kirchensteuer:").grid(row=2, column=2, sticky=E)
120          self.kist = Entry(root)          self.kist = Entry(frame)
121          self.kist.grid(row=2, column=3, sticky=W)          self.kist.grid(row=2, column=3, sticky=W)
122    
123          buttons = Frame()          Label(frame, text="Lohn nach Steuern:").grid(row=3, column=2, sticky=E)
124          buttons.grid(row=3, columnspan=4)          self.netto1 = Entry(frame)
125          Button(buttons, text="Quit", command=root.quit).pack(side=LEFT)          self.netto1.grid(row=3, column=3, sticky=W)
126    
127            # Sozialversicherung Ein/Ausgabe
128            Label(frame, text="Sozialversicherung:").grid(row=8, sticky=E)
129            self.sozv = IntVar()
130            sozvradio = Checkbutton(frame, onvalue=1, offvalue=0,
131                                    command=self.NewInput, variable=self.sozv)
132            sozvradio.select()
133            sozvradio.grid(row=8, column=1, sticky=W)
134    
135            Label(frame, text="Krankenkassenbeitrag:").grid(row=9, sticky=E)
136            self.kvsatz = Entry(frame)
137            self.kvsatz.bind("<Return>", self.NewInput)
138            self.kvsatz.grid(row=9, column=1, sticky=W)
139    
140            Label(frame, text="Rentenversicherung:").grid(row=4, column=2, sticky=E)
141            self.rv = Entry(frame)
142            self.rv.grid(row=4, column=3, sticky=W)
143    
144            Label(frame, text="Krankenversicherung:").grid(row=5, column=2, sticky=E)
145            self.kv = Entry(frame)
146            self.kv.grid(row=5, column=3, sticky=W)
147    
148            Label(frame, text="Arbeitslosenversicherung:").grid(row=6, column=2,
149                                                                sticky=E)
150            self.av = Entry(frame)
151            self.av.grid(row=6, column=3, sticky=W)
152    
153            Label(frame, text="Pflegeversicherung:").grid(row=7, column=2, sticky=E)
154            self.pv = Entry(frame)
155            self.pv.grid(row=7, column=3, sticky=W)
156    
157            Label(frame, text="Netto Lohn:").grid(row=8, column=2, sticky=E)
158            self.netto2 = Entry(frame)
159            self.netto2.grid(row=8, column=3, sticky=W)
160    
161            # Allgemeine UI Elemente
162            buttons = Frame(frame)
163            buttons.grid(row=9, column=2, columnspan=2)
164            Button(buttons, text="Quit", command=self.root.quit).pack(side=LEFT)
165          Button(buttons, text="Info", command=self.Info).pack(side=LEFT)          Button(buttons, text="Info", command=self.Info).pack(side=LEFT)
166          Button(buttons, text="Berechnen", command=self.CalcOutput).pack(side=LEFT)          Button(buttons, text="Berechnen", command=self.CalcOutput).pack(side=LEFT)
167            
168        def NewInput(self, event=0):
169            # Es ist m�glich alle Eintr�ge in der Listbox zu deselektieren,
170            # es ist aber immer genau ein Eintrag aktuell, darum wird er ggf.
171            # zwangsselektiert:
172            # FIX ME: eigendlich w�re das ein Fall f�r ein custom widget!
173            if len(self.landbox.curselection()) == 0:
174                self.landbox.select_set(self.land)            
175          self.CalcOutput()          self.CalcOutput()
176    
177      def NewInput(self, event):      def UpdateLand(self):
178            self.land = int(self.landbox.curselection()[0])
179    
180        def NewLandSel(self, event=0):
181            self.UpdateLand()
182          self.CalcOutput()          self.CalcOutput()
183    
184      def ResetInput(self):      def ResetInput(self):
185          self.ResetInputLohn()          self.ResetInputLohn()
186            self.ResetInputKfb()
187            self.ResetInputKVsatz()
188            self.NewLandSel()
189    
190      def ResetInputLohn(self):      def ResetInputLohn(self):
191          self.lohn.delete(0, END)          self.lohn.delete(0, END)
192          self.lohn.insert(0, "0")          self.lohn.insert(0, "0")
193    
194        def ResetInputKfb(self):
195            self.kfb.delete(0, END)
196            self.kfb.insert(0, "0")
197    
198        def ResetInputKVsatz(self):
199            self.kvsatz.delete(0, END)
200            self.kvsatz.insert(0, "14.7")
201    
202      def InitCalc(self):      def InitCalc(self):
203          try:          try:
204              self.SetLohn(float(self.lohn.get()))              self.SetLohn(float(self.lohn.get()))
205          except:          except:
206              self.ResetInputLohn()              self.ResetInputLohn()
207    
208          self.SetSteuerklasse(int(self.stkl.get()))          try:
209          self.SetKirchensteuer(int(self.kirche.get()))              self.SetKinderfreibetrag(float(self.kfb.get()))
210            except:
211                self.ResetInputKfb()
212    
213            try:
214                self.SetKV(float(self.kvsatz.get()))
215            except:
216                self.ResetInputKVsatz()
217    
218            self.SetSteuerklasse(self.stkl.get())
219            self.SetKirchensteuerProzent(self.kirche.get() *
220                                         self.laender[self.land][1])
221    
222      def CalcOutput(self):      def CalcOutput(self):
223          self.InitCalc()          self.InitCalc()
224          self.Calc()          self.Calc()
225          self.lst.delete(0, END)          self.lst.delete(0, END)
226          self.lst.insert(0, "%.2f" % self.GetLohnsteuer())                  self.lst.insert(0, "%.2f" % self.GetLohnsteuer())
227          self.soli.delete(0, END)          self.soli.delete(0, END)
228          self.soli.insert(0, "%.2f" % self.GetSoli())                  self.soli.insert(0, "%.2f" % self.GetSoli())
229          self.kist.delete(0, END)          self.kist.delete(0, END)
230          self.kist.insert(0, "%.2f" % self.GetKirchensteuer())                  self.kist.insert(0, "%.2f" % self.GetKirchensteuer())
231            netto1 = self.GetLohn() - self.GetLohnsteuer() \
232                     - self.GetSoli() - self.GetKirchensteuer()
233            self.netto1.delete(0, END)
234            self.netto1.insert(0, "%.2f" % netto1)
235            self.rv.delete(0, END)
236            self.rv.insert(0, "%.2f" % self.GetRV())
237            self.pv.delete(0, END)
238            self.pv.insert(0, "%.2f" % self.GetPV())
239            self.av.delete(0, END)
240            self.av.insert(0, "%.2f" % self.GetAV())
241            self.kv.delete(0, END)
242            self.kv.insert(0, "%.2f" % self.GetKV())
243            netto2 = netto1 - self.GetRV() - self.GetAV() \
244                     - self.GetPV() - self.GetKV()
245            self.netto2.delete(0, END)
246            self.netto2.insert(0, "%.2f" % netto2)        
247    
248      def Info(self):      def Info(self):
249          infowin = Toplevel(self.root)          infowin = Toplevel(self.root)
# Line 131  For more information about these matters Line 259  For more information about these matters
259  Dieses Programm verwendet LST2005 %s" % LST2005._ModulVersion()).grid(row=1, padx=10)  Dieses Programm verwendet LST2005 %s" % LST2005._ModulVersion()).grid(row=1, padx=10)
260          Button(infowin, text="Ok", command=infowin.destroy).grid(row=2, pady=10)          Button(infowin, text="Ok", command=infowin.destroy).grid(row=2, pady=10)
261    
262        #
263        # Funktionen zur Berechnung der Sozialversicherungsbeitr�ge.
264        #
265        # FIX ME: Dieser Teil k�nnte evl. in ein eigenes Modul ausgelagert werden.
266        #
267    
268        def InitSozv(self):
269            self.AVsatz = 0.065
270            self.RVsatz = 0.195
271            self.PVsatz = 0.017
272            self.PVkinderlose = 0.0025
273            self.BMG1 = 3525
274            self.BMG2 = 5200
275    
276        def SetKV(self, value):
277            assert value >= 0.0 and value <= 100.0, \
278                   "must be in range 0.0-100.0 (Percent)"
279            self.KVsatz = (value / 100.0)
280    
281        def GetAV(self):
282            lohn = self.GetLohn()
283            if lohn > self.BMG2 : lohn = self.BMG2
284            return round(self.sozv.get() * self.AVsatz * lohn / 2, 2)
285    
286        def GetRV(self):
287            lohn = self.GetLohn()
288            if lohn > self.BMG2 : lohn = self.BMG2
289            return round(self.sozv.get() * self.RVsatz * lohn / 2, 2)
290    
291        def GetPV(self):
292            lohn = self.GetLohn()
293            if lohn > self.BMG1 : lohn = self.BMG1
294            PV =  self.PVsatz * lohn / 2
295            if float(self.kfb.get()) == 0.0 :
296                PV += lohn * self.PVkinderlose
297            return round(self.sozv.get() * PV, 2)
298    
299        def GetKV(self):
300            lohn = self.GetLohn()
301            if lohn > self.BMG1 : lohn = self.BMG1
302            return round(self.sozv.get() * self.KVsatz * lohn / 2, 2)
303        
304    
305  if __name__ == "__main__":  if __name__ == "__main__":
306      root = Tk()      root = Tk()
307      lr = Lohnrechner(root)      lr = Lohnrechner(root)
308      root.mainloop()      root.mainloop()
   

Legend:
Removed from v.18  
changed lines
  Added in v.33

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26