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

Diff of /trunk/lohnrechner2007.py

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

trunk/RCS/lohnrechner.py revision 21 by wilde, Fri Jan 14 11:50:38 2005 UTC trunk/lohnrechner.py revision 60 by wilde, Fri Mar 24 11:28:43 2006 UTC
# Line 5  Line 5 
5  # $Id$  # $Id$
6  # --------------------------------------------------------------------  # --------------------------------------------------------------------
7  #  #
8  # Copyright (c) 2005 by Intevation GmbH  # Copyright (c) 2005,2006 by Intevation GmbH
9  # Authors:  # Authors:
10  # Sascha Wilde <[email protected]>  # Sascha Wilde <[email protected]>
11  #  #
12  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
13  # Read the file COPYING coming with this package for details.  # Read the file COPYING coming with this package for details.
14    
15  """Lohn/Gehaltsrechner f�r das Jahr 2005"""  """Lohn/Gehaltsrechner f�r das Jahr 2006"""
16    
17  __version__ = "$Revision$"  __version__ = "$Revision$"
18  # $Source$  # $Source$
19                    
20  _release_version = "0.%s beta" % __version__[11:-2]  _release_version = "0.%s" % __version__[11:-2]
21    
22  import LST2005  import LST2006
23  from Tkinter import *  from Tkinter import *
24    
25  class Lohnrechner(LST2005.LStRechner2005):  class Lohnrechner(LST2006.LStRechner2006):
26    
27      def __init__(self, root):      def __init__(self, root):
28          LST2005.LStRechner2005.__init__(self)          LST2006.LStRechner2006.__init__(self)
29    
30          root.title("Lohnrechner 2005 - v%s" % _release_version)          # Land, Kirchensteuersatz, Pflegeversicherung AG-Anteil
31          root.resizable(NO, NO)          self.laender = [("Baden-W�rttemberg", 8, 0.0085),
32                            ("Bayern", 8, 0.0085),
33                            ("Berlin", 9, 0.0085),
34                            ("Brandenburg", 9, 0.0085),
35                            ("Bremen", 9, 0.0085),
36                            ("Bremerhaven", 9, 0.0085),
37                            ("Hamburg", 9, 0.0085),
38                            ("Hessen", 9, 0.0085),
39                            ("Mecklenburg-Vorpommern", 9, 0.0085),
40                            ("Niedersachsen" ,9, 0.0085),
41                            ("Nordrhein-Westfalen", 9, 0.0085),
42                            ("Rheinland-Pfalz", 9, 0.0085),
43                            ("Saarland", 9, 0.0085),
44                            ("Sachsen", 9, 0.0135),
45                            ("Sachsen-Anhalt", 9, 0.0085),
46                            ("Schleswig-Holstein", 9, 0.0085),
47                            ("Th�ringen", 9, 0.0085)]
48            
49          self.root = root          self.root = root
50    
51          Label(root, text="Lohn:").grid(row=0, sticky=E)          self.root.title("Lohnrechner 2006 - v%s" % _release_version)
52          self.lohn = Entry(root)  
53            self.SetupUI()
54            self.UpdateLand()
55            self.InitSozv()
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="Geburtsjahr:").grid(row=0, sticky=E)
66            self.geb = Entry(frame)
67            self.geb.bind("<Return>", self.NewInput)
68            self.geb.grid(row=0, column=1, sticky=W)
69    
70            Label(frame, text="Lohn (monatlich):").grid(row=1, sticky=E)
71            self.lohn = Entry(frame)
72          self.lohn.bind("<Return>", self.NewInput)          self.lohn.bind("<Return>", self.NewInput)
73          self.lohn.grid(row=0, column=1, sticky=W)          self.lohn.grid(row=1, column=1, sticky=W)
74    
75          Label(root, text="Steuerklasse:").grid(row=1, sticky=E)          Label(frame, text="Steuerklasse:").grid(row=2, sticky=E)
76          self.stkl = IntVar()          self.stkl = IntVar()
77          stklframe = Frame(root)          stklframe = Frame(frame)
78          stklframe.grid(row=1, column=1, sticky=W)          stklframe.grid(row=2, column=1, sticky=W)
79          for text, val in [("I", 1),          for text, val in [("I", 1),
80                            ("II", 2),                            ("II", 2),
81                            ("III", 3),                            ("III", 3),
# Line 47  class Lohnrechner(LST2005.LStRechner2005 Line 83  class Lohnrechner(LST2005.LStRechner2005
83                            ("V", 5),                            ("V", 5),
84                            ("VI", 6)]:                            ("VI", 6)]:
85              stklradio = Radiobutton(stklframe, text=text, value=val,              stklradio = Radiobutton(stklframe, text=text, value=val,
86                                      indicatoron=0, command=self.CalcOutput,                                      indicatoron=0, command=self.NewInput,
87                                      variable=self.stkl)                                      variable=self.stkl)
88              if text == "I":              if text == "I":
89                  stklradio.select()                  stklradio.select()
90              stklradio.pack(side=LEFT)              stklradio.pack(side=LEFT)
91    
92          Label(root, text="Kirchensteuer (%):").grid(row=2, sticky=E)          Label(frame, text="Kirchensteuer:").grid(row=3, sticky=E)
93          self.kirche = StringVar()          self.kirche = IntVar()
94          kircheframe = Frame(root)          Checkbutton(frame, onvalue=1, offvalue=0, command=self.NewInput,
95          kircheframe.grid(row=2, column=1, sticky=W)                      variable=self.kirche).grid(row=3, column=1,sticky=W)
         for text, val in [("keine", "0"),  
                           ("8 %", "8"),  
                           ("9 %", "9")]:  
             kircheradio = Radiobutton(kircheframe, text=text, value=val,  
                                     indicatoron=0, command=self.CalcOutput,  
                                     variable=self.kirche)  
             if val == "0":  
                 kircheradio.select()  
             kircheradio.pack(side=LEFT)  
96    
97          Label(root, text="Kinderfreibetrag:").grid(row=3, sticky=E)          Label(frame, text="Kinderfreibetrag:").grid(row=4, sticky=E)
98          self.kfb = Entry(root)          self.kfb = Entry(frame)
99          self.kfb.bind("<Return>", self.NewInput)          self.kfb.bind("<Return>", self.NewInput)
100          self.kfb.grid(row=3, column=1, sticky=W)          self.kfb.grid(row=4, column=1, sticky=W)
   
         self.ResetInput()  
101    
102          Label(root, text="Lohnsteuer:").grid(row=0, column=2, sticky=E)          Label(frame, text="Bundesland:").grid(row=5, sticky=NE)
103          self.lst = Entry(root)          landframe = Frame(frame)
104            scrollbar = Scrollbar(landframe, orient=VERTICAL)
105            self.landbox = Listbox(landframe, height=4, selectmode=SINGLE,
106                                   yscrollcommand=scrollbar.set)
107            for land in self.laender:
108                self.landbox.insert(END, land[0])
109            self.landbox.select_set(0)
110            self.landbox.bind("<<ListboxSelect>>", self.NewLandSel)
111            self.landbox.pack(side=RIGHT, fill=Y)
112            scrollbar.config(command=self.landbox.yview)
113            scrollbar.pack(side=LEFT, fill=BOTH, expand=1)
114            landframe.grid(row=5, rowspan=4, column=1, sticky=W)
115            
116            Label(frame, text="Lohnsteuer:").grid(row=0, column=2, sticky=E)
117            self.lst = Entry(frame)
118          self.lst.grid(row=0, column=3, sticky=W)          self.lst.grid(row=0, column=3, sticky=W)
119    
120          Label(root, text="Solidarit�tszuschlag:").grid(row=1, column=2, sticky=E)          Label(frame, text="Solidarit�tszuschlag:").grid(row=1, column=2, sticky=E)
121          self.soli = Entry(root)          self.soli = Entry(frame)
122          self.soli.grid(row=1, column=3, sticky=W)          self.soli.grid(row=1, column=3, sticky=W)
123    
124          Label(root, text="Kirchensteuer:").grid(row=2, column=2, sticky=E)          Label(frame, text="Kirchensteuer:").grid(row=2, column=2, sticky=E)
125          self.kist = Entry(root)          self.kist = Entry(frame)
126          self.kist.grid(row=2, column=3, sticky=W)          self.kist.grid(row=2, column=3, sticky=W)
127    
128          buttons = Frame()          Label(frame, text="Lohn nach Steuern:").grid(row=3, column=2, sticky=E)
129          buttons.grid(row=4, columnspan=4)          self.netto1 = Entry(frame)
130          Button(buttons, text="Quit", command=root.quit).pack(side=LEFT)          self.netto1.grid(row=3, column=3, sticky=W)
131    
132            # Sozialversicherung Ein/Ausgabe
133            Label(frame, text="Sozialversicherung:").grid(row=9, sticky=E)
134            self.sozv = IntVar()
135            sozvradio = Checkbutton(frame, onvalue=1, offvalue=0,
136                                    command=self.NewInput, variable=self.sozv)
137            sozvradio.select()
138            sozvradio.grid(row=9, column=1, sticky=W)
139    
140            Label(frame, text="Krankenkassenbeitrag:").grid(row=10, sticky=E)
141            self.kvsatz = Entry(frame)
142            self.kvsatz.bind("<Return>", self.NewInput)
143            self.kvsatz.grid(row=10, column=1, sticky=W)
144    
145            Label(frame, text="Krankenkassenzuschlag (0.9%):").grid(row=11, sticky=E)
146            self.kvsoli = IntVar()
147            kvsoliradio = Checkbutton(frame, onvalue=1, offvalue=0,
148                                    command=self.NewInput, variable=self.kvsoli)
149            kvsoliradio.select()
150            kvsoliradio.grid(row=11, column=1, sticky=W)
151    
152    
153            Label(frame, text="Rentenversicherung:").grid(row=4, column=2, sticky=E)
154            self.rv = Entry(frame)
155            self.rv.grid(row=4, column=3, sticky=W)
156    
157            Label(frame, text="Krankenversicherung:").grid(row=5, column=2, sticky=E)
158            self.kv = Entry(frame)
159            self.kv.grid(row=5, column=3, sticky=W)
160    
161            Label(frame, text="Arbeitslosenversicherung:").grid(row=6, column=2,
162                                                                sticky=E)
163            self.av = Entry(frame)
164            self.av.grid(row=6, column=3, sticky=W)
165    
166            Label(frame, text="Pflegeversicherung:").grid(row=7, column=2, sticky=E)
167            self.pv = Entry(frame)
168            self.pv.grid(row=7, column=3, sticky=W)
169    
170            Label(frame, text="Netto Lohn:").grid(row=8, column=2, sticky=E)
171            self.netto2 = Entry(frame)
172            self.netto2.grid(row=8, column=3, sticky=W)
173    
174            # Allgemeine UI Elemente
175            buttons = Frame(frame)
176            buttons.grid(row=10, column=2, rowspan=2, columnspan=2)
177            Button(buttons, text="Quit", command=self.root.quit).pack(side=LEFT)
178          Button(buttons, text="Info", command=self.Info).pack(side=LEFT)          Button(buttons, text="Info", command=self.Info).pack(side=LEFT)
179          Button(buttons, text="Berechnen", command=self.CalcOutput).pack(side=LEFT)          Button(buttons, text="Berechnen", command=self.CalcOutput).pack(side=LEFT)
180            
181        def NewInput(self, event=0):
182            # Es ist m�glich alle Eintr�ge in der Listbox zu deselektieren,
183            # es ist aber immer genau ein Eintrag aktuell, darum wird er ggf.
184            # zwangsselektiert:
185            # FIX ME: eigendlich w�re das ein Fall f�r ein custom widget!
186            if len(self.landbox.curselection()) == 0:
187                self.landbox.select_set(self.land)            
188          self.CalcOutput()          self.CalcOutput()
189    
190      def NewInput(self, event):      def UpdateLand(self):
191            self.land = int(self.landbox.curselection()[0])
192    
193        def NewLandSel(self, event=0):
194            self.UpdateLand()
195          self.CalcOutput()          self.CalcOutput()
196    
197      def ResetInput(self):      def ResetInput(self):
198            self.ResetInputGeb()
199          self.ResetInputLohn()          self.ResetInputLohn()
200            self.ResetInputKfb()
201            self.ResetInputKVsatz()
202            self.NewLandSel()
203    
204        def ResetInputGeb(self):
205            self.geb.delete(0, END)
206            self.geb.insert(0, "1964")
207    
208      def ResetInputLohn(self):      def ResetInputLohn(self):
209          self.lohn.delete(0, END)          self.lohn.delete(0, END)
# Line 108  class Lohnrechner(LST2005.LStRechner2005 Line 213  class Lohnrechner(LST2005.LStRechner2005
213          self.kfb.delete(0, END)          self.kfb.delete(0, END)
214          self.kfb.insert(0, "0")          self.kfb.insert(0, "0")
215    
216        def ResetInputKVsatz(self):
217            self.kvsatz.delete(0, END)
218            self.kvsatz.insert(0, "13.8")
219    
220      def InitCalc(self):      def InitCalc(self):
221          try:          try:
222              self.SetLohn(float(self.lohn.get()))              self.SetLohn(float(self.lohn.get()))
# Line 115  class Lohnrechner(LST2005.LStRechner2005 Line 224  class Lohnrechner(LST2005.LStRechner2005
224              self.ResetInputLohn()              self.ResetInputLohn()
225    
226          try:          try:
227                self.SetGeb(int(self.geb.get()))
228            except:
229                self.ResetInputGeb()
230    
231            try:
232              self.SetKinderfreibetrag(float(self.kfb.get()))              self.SetKinderfreibetrag(float(self.kfb.get()))
233          except:          except:
234              self.ResetInputKfb()              self.ResetInputKfb()
235    
236            try:
237                self.SetKV(float(self.kvsatz.get()))
238            except:
239                self.ResetInputKVsatz()
240    
241          self.SetSteuerklasse(self.stkl.get())          self.SetSteuerklasse(self.stkl.get())
242          self.SetKirchensteuer(int(self.kirche.get()))          self.SetKirchensteuerProzent(self.kirche.get() *
243                                         self.laender[self.land][1])
244    
245      def CalcOutput(self):      def CalcOutput(self):
246          self.InitCalc()          self.InitCalc()
247          self.Calc()          self.Calc()
248          self.lst.delete(0, END)          self.lst.delete(0, END)
249          self.lst.insert(0, "%.2f" % self.GetLohnsteuer())                  self.lst.insert(0, "%.2f" % self.GetLohnsteuer())
250          self.soli.delete(0, END)          self.soli.delete(0, END)
251          self.soli.insert(0, "%.2f" % self.GetSoli())                  self.soli.insert(0, "%.2f" % self.GetSoli())
252          self.kist.delete(0, END)          self.kist.delete(0, END)
253          self.kist.insert(0, "%.2f" % self.GetKirchensteuer())                  self.kist.insert(0, "%.2f" % self.GetKirchensteuer())
254            netto1 = self.GetLohn() - self.GetLohnsteuer() \
255                     - self.GetSoli() - self.GetKirchensteuer()
256            self.netto1.delete(0, END)
257            self.netto1.insert(0, "%.2f" % netto1)
258            self.rv.delete(0, END)
259            self.rv.insert(0, "%.2f" % self.GetRV())
260            self.pv.delete(0, END)
261            self.pv.insert(0, "%.2f" % self.GetPV())
262            self.av.delete(0, END)
263            self.av.insert(0, "%.2f" % self.GetAV())
264            self.kv.delete(0, END)
265            self.kv.insert(0, "%.2f" % self.GetKV())
266            netto2 = netto1 - self.GetRV() - self.GetAV() \
267                     - self.GetPV() - self.GetKV()
268            self.netto2.delete(0, END)
269            self.netto2.insert(0, "%.2f" % netto2)        
270    
271      def Info(self):      def Info(self):
272          infowin = Toplevel(self.root)          infowin = Toplevel(self.root)
273          infowin.title("Info")          infowin.title("Info")
274          Label(infowin, text="Lohnrechner 2005 v%s" % _release_version,          Label(infowin, text="Lohnrechner 2006 v%s" % _release_version,
275                font=("Times", 14, "bold italic")).grid(row=0, pady=20)                font=("Times", 14, "bold italic")).grid(row=0, pady=20)
276          Label(infowin, text=          Label(infowin, text=
277                "Copyright (C) 2005 Intevation GmbH \n\n\                "Copyright (C) 2005,2006 Intevation GmbH \n\n\
278  Lohnrechner 2005 comes with ABSOLUTELY NO WARRANTY.\n\  Lohnrechner 2006 comes with ABSOLUTELY NO WARRANTY.\n\
279  This is free software, and you are welcome to redistribute it\n\  This is free software, and you are welcome to redistribute it\n\
280  under the terms of the GNU General Public License.\n\  under the terms of the GNU General Public License.\n\
281  For more information about these matters, see the file named COPYING.\n\n\  For more information about these matters, see the file named COPYING.\n\n\
282  Dieses Programm verwendet LST2005 %s" % LST2005._ModulVersion()).grid(row=1, padx=10)  Dieses Programm verwendet LST2006 %s" % LST2006._ModulVersion()).grid(row=1, padx=10)
283          Button(infowin, text="Ok", command=infowin.destroy).grid(row=2, pady=10)          Button(infowin, text="Ok", command=infowin.destroy).grid(row=2, pady=10)
284    
285        #
286        # Funktionen zur Berechnung der Sozialversicherungsbeitr�ge.
287        #
288        # FIX ME: Dieser Teil k�nnte evl. in ein eigenes Modul ausgelagert werden.
289        #
290    
291        def InitSozv(self):
292            self.AVsatz = 0.065 / 2
293            self.RVsatz = 0.195 / 2
294            # PVsatz ist in self.laender definiert!
295            self.PVkinderlose = 0.0025
296            self.BMG1 = 3525
297            self.BMG2 = 5200
298    
299        def SetKV(self, value):
300            assert value >= 0.0 and value <= 100.0, \
301                   "must be in range 0.0-100.0 (Percent)"
302            self.KVsatz = (value / 100.0)
303    
304        def GetAV(self):
305            lohn = self.GetLohn()
306            if lohn > self.BMG2 : lohn = self.BMG2
307            return round(self.sozv.get() * self.AVsatz * lohn, 2)
308    
309        def GetRV(self):
310            lohn = self.GetLohn()
311            if lohn > self.BMG2 : lohn = self.BMG2
312            return round(self.sozv.get() * self.RVsatz * lohn, 2)
313    
314        def GetPV(self):
315            self.PVsatz = self.laender[self.land][2]
316            lohn = self.GetLohn()
317            if lohn > self.BMG1 : lohn = self.BMG1
318            PV =  self.PVsatz * lohn
319            if float(self.kfb.get()) == 0.0 :
320                PV += lohn * self.PVkinderlose
321            return round(self.sozv.get() * PV, 2)
322    
323        def GetKV(self):
324            self.KVsoli = self.kvsoli.get()
325            lohn = self.GetLohn()
326            if lohn > self.BMG1 : lohn = self.BMG1
327            if self.KVsoli :
328                return round(self.sozv.get() * ((self.KVsatz / 2) + 0.009) * lohn, 2)
329            else :
330                return round(self.sozv.get() * self.KVsatz * lohn / 2, 2)
331        
332    
333  if __name__ == "__main__":  if __name__ == "__main__":
334      root = Tk()      root = Tk()
335      lr = Lohnrechner(root)      lr = Lohnrechner(root)
336      root.mainloop()      root.mainloop()
   

Legend:
Removed from v.21  
changed lines
  Added in v.60

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26