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

Contents of /trunk/lohnrechner2007.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 76 - (show annotations)
Wed Jan 16 09:39:58 2008 UTC (17 years, 3 months ago) by wilde
File MIME type: text/x-python
File size: 12996 byte(s)
Aktualisierter lohnrechner.py benutzt LST2008 und neue Sozialvers.-Beiträge.
Die alte Version als lohnrechner2007.py archiviert.

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