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

Annotation of /trunk/lohnrechner2007.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 54 - (hide annotations)
Wed Jan 25 11:43:04 2006 UTC (19 years, 3 months ago) by wilde
Original Path: lohnrechner.py
File MIME type: text/x-python
File size: 12350 byte(s)
Neues Eingabefeld "Geburtsjahr".

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

Properties

Name Value
svn:eol-style native
svn:executable *
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26