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

Contents of /trunk/lohnrechner2006.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 64 - (show annotations)
Thu Jan 25 08:19:44 2007 UTC (18 years, 3 months ago) by wilde
File MIME type: text/x-python
File size: 12306 byte(s)
New files as basis for 2007 -- nothing changed compared to 2006, yet.

1 #! /usr/bin/python
2 # -*- coding: iso-8859-1 -*-
3 # --------------------------------------------------------------------
4 # Lohnsteuer und Sozialabgaben Rechner
5 # $Id$
6 # --------------------------------------------------------------------
7 #
8 # Copyright (c) 2005,2006 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 2006"""
16
17 __version__ = "$Revision$"
18 # $Source$
19
20 _release_version = "0.%s" % __version__[11:-2]
21
22 import LST2006
23 from Tkinter import *
24
25 class Lohnrechner(LST2006.LStRechner2006):
26
27 def __init__(self, root):
28 LST2006.LStRechner2006.__init__(self)
29
30 # 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
49 self.root = root
50
51 self.root.title("Lohnrechner 2006 - v%s" % _release_version)
52
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)
73 self.lohn.grid(row=1, column=1, sticky=W)
74
75 Label(frame, text="Steuerklasse:").grid(row=2, sticky=E)
76 self.stkl = IntVar()
77 stklframe = Frame(frame)
78 stklframe.grid(row=2, column=1, sticky=W)
79 for text, val in [("I", 1),
80 ("II", 2),
81 ("III", 3),
82 ("IV", 4),
83 ("V", 5),
84 ("VI", 6)]:
85 stklradio = Radiobutton(stklframe, text=text, value=val,
86 indicatoron=0, command=self.NewInput,
87 variable=self.stkl)
88 if text == "I":
89 stklradio.select()
90 stklradio.pack(side=LEFT)
91
92 Label(frame, text="Kirchensteuer:").grid(row=3, sticky=E)
93 self.kirche = IntVar()
94 Checkbutton(frame, onvalue=1, offvalue=0, command=self.NewInput,
95 variable=self.kirche).grid(row=3, column=1,sticky=W)
96
97 Label(frame, text="Kinderfreibetrag:").grid(row=4, sticky=E)
98 self.kfb = Entry(frame)
99 self.kfb.bind("<Return>", self.NewInput)
100 self.kfb.grid(row=4, column=1, sticky=W)
101
102 Label(frame, text="Bundesland:").grid(row=5, sticky=NE)
103 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)
119
120 Label(frame, text="Solidaritätszuschlag:").grid(row=1, column=2, sticky=E)
121 self.soli = Entry(frame)
122 self.soli.grid(row=1, column=3, sticky=W)
123
124 Label(frame, text="Kirchensteuer:").grid(row=2, column=2, sticky=E)
125 self.kist = Entry(frame)
126 self.kist.grid(row=2, column=3, sticky=W)
127
128 Label(frame, text="Lohn nach Steuern:").grid(row=3, column=2, sticky=E)
129 self.netto1 = Entry(frame)
130 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)
179 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()
189
190 def UpdateLand(self):
191 self.land = int(self.landbox.curselection()[0])
192
193 def NewLandSel(self, event=0):
194 self.UpdateLand()
195 self.CalcOutput()
196
197 def ResetInput(self):
198 self.ResetInputGeb()
199 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):
209 self.lohn.delete(0, END)
210 self.lohn.insert(0, "0")
211
212 def ResetInputKfb(self):
213 self.kfb.delete(0, END)
214 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):
221 try:
222 self.SetLohn(float(self.lohn.get()))
223 except:
224 self.ResetInputLohn()
225
226 try:
227 self.SetGeb(int(self.geb.get()))
228 except:
229 self.ResetInputGeb()
230
231 try:
232 self.SetKinderfreibetrag(float(self.kfb.get()))
233 except:
234 self.ResetInputKfb()
235
236 try:
237 self.SetKV(float(self.kvsatz.get()))
238 except:
239 self.ResetInputKVsatz()
240
241 self.SetSteuerklasse(self.stkl.get())
242 self.SetKirchensteuerProzent(self.kirche.get() *
243 self.laender[self.land][1])
244
245 def CalcOutput(self):
246 self.InitCalc()
247 self.Calc()
248 self.lst.delete(0, END)
249 self.lst.insert(0, "%.2f" % self.GetLohnsteuer())
250 self.soli.delete(0, END)
251 self.soli.insert(0, "%.2f" % self.GetSoli())
252 self.kist.delete(0, END)
253 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):
272 infowin = Toplevel(self.root)
273 infowin.title("Info")
274 Label(infowin, text="Lohnrechner 2006 v%s" % _release_version,
275 font=("Times", 14, "bold italic")).grid(row=0, pady=20)
276 Label(infowin, text=
277 "Copyright (C) 2005,2006 Intevation GmbH \n\n\
278 Lohnrechner 2006 comes with ABSOLUTELY NO WARRANTY.\n\
279 This is free software, and you are welcome to redistribute it\n\
280 under the terms of the GNU General Public License.\n\
281 For more information about these matters, see the file named COPYING.\n\n\
282 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)
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 = 3562.5
297 self.BMG2 = 5250
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__":
334 root = Tk()
335 lr = Lohnrechner(root)
336 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