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

Annotation of /trunk/lohnrechner2006.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 51 - (hide annotations)
Mon Jan 23 17:07:57 2006 UTC (19 years, 3 months ago) by wilde
Original Path: lohnrechner.py
File MIME type: text/x-python
File size: 11877 byte(s)
Für 2006 umgestellt.

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