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

Contents of /trunk/lohnrechner2007.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 54 - (show 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 #! /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 beta" % __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 self.SetGeb(int(self.geb.get()))
227 try:
228 self.SetGeb(int(self.geb.get()))
229 except:
230 self.ResetInputGeb()
231
232 try:
233 self.SetKinderfreibetrag(float(self.kfb.get()))
234 except:
235 self.ResetInputKfb()
236
237 try:
238 self.SetKV(float(self.kvsatz.get()))
239 except:
240 self.ResetInputKVsatz()
241
242 self.SetSteuerklasse(self.stkl.get())
243 self.SetKirchensteuerProzent(self.kirche.get() *
244 self.laender[self.land][1])
245
246 def CalcOutput(self):
247 self.InitCalc()
248 self.Calc()
249 self.lst.delete(0, END)
250 self.lst.insert(0, "%.2f" % self.GetLohnsteuer())
251 self.soli.delete(0, END)
252 self.soli.insert(0, "%.2f" % self.GetSoli())
253 self.kist.delete(0, END)
254 self.kist.insert(0, "%.2f" % self.GetKirchensteuer())
255 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
272 def Info(self):
273 infowin = Toplevel(self.root)
274 infowin.title("Info")
275 Label(infowin, text="Lohnrechner 2006 v%s" % _release_version,
276 font=("Times", 14, "bold italic")).grid(row=0, pady=20)
277 Label(infowin, text=
278 "Copyright (C) 2005,2006 Intevation GmbH \n\n\
279 Lohnrechner 2006 comes with ABSOLUTELY NO WARRANTY.\n\
280 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 Dieses Programm verwendet LST2006 %s" % LST2006._ModulVersion()).grid(row=1, padx=10)
284 Button(infowin, text="Ok", command=infowin.destroy).grid(row=2, pady=10)
285
286 #
287 # Funktionen zur Berechnung der Sozialversicherungsbeiträge.
288 #
289 # FIX ME: Dieser Teil könnte evl. in ein eigenes Modul ausgelagert werden.
290 #
291
292 def InitSozv(self):
293 self.AVsatz = 0.065 / 2
294 self.RVsatz = 0.195 / 2
295 # PVsatz ist in self.laender definiert!
296 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 return round(self.sozv.get() * self.AVsatz * lohn, 2)
309
310 def GetRV(self):
311 lohn = self.GetLohn()
312 if lohn > self.BMG2 : lohn = self.BMG2
313 return round(self.sozv.get() * self.RVsatz * lohn, 2)
314
315 def GetPV(self):
316 self.PVsatz = self.laender[self.land][2]
317 lohn = self.GetLohn()
318 if lohn > self.BMG1 : lohn = self.BMG1
319 PV = self.PVsatz * lohn
320 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 self.KVsoli = self.kvsoli.get()
326 lohn = self.GetLohn()
327 if lohn > self.BMG1 : lohn = self.BMG1
328 if self.KVsoli :
329 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
333
334 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