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

Contents of /trunk/LST2007.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 68 - (show annotations)
Thu Jan 25 11:20:34 2007 UTC (18 years, 3 months ago) by wilde
File MIME type: text/x-python
File size: 29171 byte(s)
Minor code cleanup.

1 # -*- coding: iso-8859-1 -*-
2 # --------------------------------------------------------------------
3 # LST2007 -- Python Modul zur Berechnung der Deutschen Lohnsteuer 2007
4 # $Id$
5 # --------------------------------------------------------------------
6 #
7 # Copyright (c) 2005, 2006, 2007 by Intevation GmbH
8 # Authors:
9 # Sascha Wilde <[email protected]>
10 #
11 # This program is free software under the GPL (>=v2)
12 # Read the file COPYING coming with this package for details.
13
14 """Lohnsteuerberechnung nach dem offiziellen Programmablaufplan
15 wie im offiziellen Programmablaufplan des Bundesfinanzministerium
16 dokumentiert.
17 http://www.bundesfinanzministerium.de/Service/Interaktiver-Steuerrechner-.577.htm"""
18
19 __version__ = "$Revision$"
20 # $Source$
21
22 def _ModulVersion():
23 return __version__[11:-2]
24
25 # Die Variablen Namen sind hässlich, die Algorithmen nicht
26 # dokumentiert, der Code grausam -- dafür entspricht alles Zeile für
27 # Zeile obigem Dokument. Jedenfalls sollte es so sein...
28
29 from math import ceil, floor
30
31 # Wir brauchen eigene Rundungsfunktionen mit definierter Präzision
32 def FixedPointFloor(value, precision=2):
33 i = 10.0 ** precision
34 return floor(value * i) / i
35
36 def FixedPointCeil(value, precision=2):
37 i = 10.0 ** precision
38 return ceil(value * i) / i
39
40 # Ein paar Konstanten um das ganze etwas Benutzbarer zu machen:
41 JAHR = 1
42 MONAT = 2
43 WOCHE = 3
44 TAG = 4
45 I = 1
46 II = 2
47 III = 3
48 IV = 4
49 V = 5
50 VI = 6
51
52 class LST:
53 def __init__(self,
54 AJAHR =1964,
55 ALTER1=0,
56 HINZUR=0,
57 JFREIB=0,
58 JHINZU=0,
59 JRE4 =0,
60 JVBEZ =0,
61 KRV =0,
62 LZZ =2,
63 R =0,
64 RE4 =0,
65 SONSTB=0,
66 STERBE=0,
67 STKL =1,
68 VBEZ =0,
69 VBEZM =0,
70 VBEZS =0,
71 VBS =0,
72 VJAHR =0,
73 VKAPA =0,
74 VMT =0,
75 WFUNDF=0,
76 ZKF =0,
77 ZMVB =0):
78 self.Set_AJAHR(AJAHR)
79 self.Set_ALTER1(ALTER1)
80 self.Set_HINZUR(HINZUR)
81 self.Set_JFREIB(JFREIB)
82 self.Set_JHINZU(JHINZU)
83 self.Set_JRE4(JRE4)
84 self.Set_JVBEZ(JVBEZ)
85 self.Set_KRV(KRV)
86 self.Set_LZZ(LZZ)
87 self.Set_R(R)
88 self.Set_RE4(RE4)
89 self.Set_SONSTB(SONSTB)
90 self.Set_STERBE(STERBE)
91 self.Set_STKL(STKL)
92 self.Set_VBEZ(VBEZ)
93 self.Set_VBEZM(VBEZM)
94 self.Set_VBEZS(VBEZS)
95 self.Set_VBS(VBS)
96 self.Set_VJAHR(VJAHR)
97 self.Set_VKAPA(VKAPA)
98 self.Set_VMT(VMT)
99 self.Set_WFUNDF(WFUNDF)
100 self.Set_ZKF(ZKF)
101 self.Set_ZMVB(ZMVB)
102 # Vorgegebene Ausgangsparameter
103 self.BK = 0
104 self.BKS = 0
105 self.BKV = 0
106 self.LSTLZZ = 0
107 self.SOLZLZZ = 0
108 self.SOLZS = 0
109 self.SOLZV = 0
110 self.STS = 0
111 self.STV = 0
112
113 def Calc(self):
114 """Berechnet die Lohnsteuer,
115 setzt BK, BKS, BKV, LSTLZZ, SOLZLZZ, SOLZS, SOLZV, STS und STV"""
116 # Interne Felder
117 # Laut Dokumentation sollen diese vor der Berechnung gelöscht werden,
118 # es ist mir nicht klar, ob das wirklich nötig ist...
119 self._ALTE = 0
120 self._ANP = 0
121 self._ANTEIL1 = 0
122 self._ANTEIL2 = 0
123 self._BMG = 0
124 self._DIFF = 0
125 self._EFA = 0
126 self._FVB = 0
127 self._FVBZ = 0
128 self._HFVB = 0
129 self._J = 0
130 self._JBMG = 0
131 self._JW = 0
132 self._K = 0
133 self._KENNZ = 0
134 self._KFB = 0
135 self._KZTAB = 1
136 self._LSTJAHR = 0
137 self._LST1 = 0
138 self._LST2 = 0
139 self._LST3 = 0
140 self._MIST = 0
141 self._RE4LZZ = 0
142 self._RE4LZZV = 0
143 self._RW = 0.0
144 self._SAP = 0
145 self._SOLZFREI = 0
146 self._SOLZJ = 0.0 # 2 Dezimalstellen
147 self._SOLZMIN = 0.0 # 2 Dezimalstellen
148 self._ST = 0
149 self._ST1 = 0
150 self._ST2 = 0
151 self._TAB1=(None, # 1 als erstes Element, wie im PAP
152 0.400, # bis 2005
153 0.384, # 2006
154 0.368, # 2007
155 0.352, # 2008
156 0.336, # 2009
157 0.320, # 2010
158 0.304, # 2011
159 0.288, # 2012
160 0.272, # 2013
161 0.256, # 2014
162 0.240, # 2015
163 0.224, # 2016
164 0.208, # 2017
165 0.192, # 2018
166 0.176, # 2019
167 0.160, # 2020
168 0.152, # 2021
169 0.144, # 2022
170 0.136, # 2023
171 0.128, # 2024
172 0.120, # 2025
173 0.112, # 2026
174 0.104, # 2027
175 0.096, # 2028
176 0.088, # 2029
177 0.080, # 2030
178 0.072, # 2031
179 0.064, # 2032
180 0.056, # 2033
181 0.048, # 2034
182 0.040, # 2035
183 0.032, # 2036
184 0.024, # 2037
185 0.016, # 2038
186 0.008, # 2039
187 0.000) # 2040
188 self._TAB2=(None, # 1 als erstes Element, wie im PAP
189 3000, # bis 2005
190 2880, # 2006
191 2760, # 2007
192 2640, # 2008
193 2520, # 2009
194 2400, # 2010
195 2280, # 2011
196 2160, # 2012
197 2040, # 2013
198 1920, # 2014
199 1800, # 2015
200 1680, # 2016
201 1560, # 2017
202 1440, # 2018
203 1320, # 2019
204 1200, # 2020
205 1140, # 2021
206 1080, # 2022
207 1020, # 2023
208 960, # 2024
209 900, # 2025
210 840, # 2026
211 780, # 2027
212 720, # 2028
213 660, # 2029
214 600, # 2030
215 540, # 2031
216 480, # 2032
217 420, # 2033
218 360, # 2034
219 300, # 2035
220 240, # 2036
221 180, # 2037
222 120, # 2038
223 60, # 2039
224 0) # 2040
225 self._TAB3=(None, # 1 als erstes Element, wie im PAP
226 900, # bis 2005
227 864, # 2006
228 828, # 2007
229 792, # 2008
230 756, # 2009
231 720, # 2010
232 684, # 2011
233 648, # 2012
234 612, # 2013
235 576, # 2014
236 540, # 2015
237 504, # 2016
238 468, # 2017
239 432, # 2018
240 396, # 2019
241 360, # 2020
242 342, # 2021
243 324, # 2022
244 306, # 2023
245 288, # 2024
246 270, # 2025
247 252, # 2026
248 234, # 2027
249 216, # 2028
250 198, # 2029
251 180, # 2030
252 162, # 2031
253 144, # 2032
254 126, # 2033
255 108, # 2034
256 90, # 2035
257 72, # 2036
258 54, # 2037
259 36, # 2038
260 18, # 2039
261 0) # 2040
262 self._TAB4=self._TAB1
263 self._TAB5=(None, # 1 als erstes Element, wie im PAP
264 1900, # bis 2005
265 1824, # 2006
266 1748, # 2007
267 1672, # 2008
268 1596, # 2009
269 1520, # 2010
270 1444, # 2011
271 1368, # 2012
272 1292, # 2013
273 1216, # 2014
274 1140, # 2015
275 1064, # 2016
276 988, # 2017
277 912, # 2018
278 836, # 2019
279 760, # 2020
280 722, # 2021
281 684, # 2022
282 646, # 2023
283 608, # 2024
284 570, # 2025
285 532, # 2026
286 494, # 2027
287 456, # 2028
288 418, # 2029
289 380, # 2030
290 342, # 2031
291 304, # 2032
292 266, # 2033
293 228, # 2034
294 190, # 2035
295 152, # 2036
296 114, # 2037
297 76, # 2038
298 38, # 2039
299 0) # 2040
300 self._VBEZB = 0
301 self._VHB = 0
302 self._VSP = 0.0 # 2 Dezimalstellen
303 self._VSPN = 0
304 self._VSP1 = 0.0 # 2 Dezimalstellen
305 self._VSP2 = 0.0 # 2 Dezimalstellen
306 self._VSPKURZ = 0
307 self._VSPMAX1 = 0
308 self._VSPMAX2 = 0
309 self._VSPO = 0.0 # 2 Dezimalstellen
310 self._VSPREST = 0.0 # 2 Dezimalstellen
311 self._VSPVOR = 0.0 # 2 Dezimalstellen
312 self._X = 0.0 # 2 Dezimalstellen
313 self._Y = 0.0 # 6 Dezimalstellen
314 self._ZRE4 = 0.0 # 2 Dezimalstellen
315 self._ZRE4VP = 0.0 # 2 Dezimalstellen
316 self._ZRE4VP1 = 0.0 # 2 Dezimalstellen
317 self._ZTABFB = 0
318 self._ZVBEZ = 0
319 self._ZVE = 0
320 self._ZX = 0
321 self._ZZX = 0
322 self._HOCH = 0
323 self._VERGL = 0
324 # ------------------------------------------------------------
325 # Anfang der Berechnung
326 self._MRE4LZZ()
327 self._KENNZ = 0
328 self._RE4LZZ = self.RE4 - self._FVB \
329 - self._ALTE - self.WFUNDF \
330 + self.HINZUR
331 self._RE4LZZV = self.RE4 - self._FVB - self._ALTE
332 self._MRE4()
333 self._MZTABFB()
334 self._MLSTJAHR()
335 self._LSTJAHR = self._ST
336 self._JW = self._LSTJAHR * 100
337 self._UPANTEIL()
338 self.LSTLZZ = self._ANTEIL1
339 if self.ZKF > 0:
340 self._ZTABFB += self._KFB
341 self._MLSTJAHR()
342 self._JBMG = self._ST
343 else:
344 self._JBMG = self._LSTJAHR
345 self._MSOLZ()
346 self._MSONST()
347 self._MVMT()
348
349 # Benutzte Unterprogramme:
350 def _MRE4LZZ(self):
351 if self.VBEZ == 0:
352 self._FVBZ = 0
353 self._FVB = 0
354 else:
355 if self.VJAHR < 2006:
356 self._J = 1
357 elif self.VJAHR < 2040:
358 self._J = VJAHR - 2004
359 else:
360 self._J = 36
361 if self.LZZ == 1:
362 if ( self.STERBE + self.VKAPA ) > 0:
363 self._VBEZB = self.VBEZM * self.ZMVB + self.VBEZS
364 self._HFVB = self._TAB2[self._J] * 100
365 self._FVBZ = self._TAB3[self._J]
366 else:
367 self._VBEZB = self.VBEZM * self.ZMVB + self.VBEZS
368 self._HFVB = self._TAB2[self._J] / 12 * self.ZMVB * 100
369 self._FVBZ = ceil(self._TAB3[self._J] / 12 * self.ZMVB)
370 else:
371 self._VBEZB = self.VBEZM * 12 + self.VBEZS
372 self._HFVB = self._TAB2[self._J] * 100
373 self._FVBZ = self._TAB3[self._J]
374 self._FVB = ceil(self._VBEZB * self._TAB1[self._J])
375 if self._FVB > self._HFVB:
376 self._FVB = self._HFVB
377 self._JW = self._FVB
378 self._UPANTEIL()
379 self._FVB = self._ANTEIL2
380 if self.ALTER1 == 0:
381 self._ALTE = 0
382 else:
383 if self.AJAHR < 2006:
384 self._K = 1
385 elif self.AJAHR < 2040:
386 self._K = self.AJAHR - 2004
387 else:
388 self._K = 36
389 self._BMG = self.RE4 - self.VBEZ
390 self._ALTE = ceil(self._BMG * self._TAB4[self._K])
391 self._JW = self._TAB5[self._K] * 100
392 self._UPANTEIL()
393 if self._ALTE > self._ANTEIL2:
394 self._ALTE = self._ANTEIL2
395
396 def _MRE4(self):
397 if self.LZZ == 1:
398 self._ZRE4 = FixedPointFloor(self._RE4LZZ / 100.0)
399 self._ZRE4VP = FixedPointFloor(self._RE4LZZV / 100.0)
400 self._ZVBEZ = FixedPointFloor((self.VBEZ - self._FVB) / 100.0)
401 elif self.LZZ == 2:
402 self._ZRE4 = FixedPointFloor((self._RE4LZZ + 0.67) * 0.12)
403 self._ZRE4VP = FixedPointFloor((self._RE4LZZV + 0.67) * 0.12)
404 self._ZVBEZ = FixedPointFloor((self.VBEZ - self._FVB + 0.67) * 0.12)
405 elif self.LZZ == 3:
406 self._ZRE4 = FixedPointFloor((self._RE4LZZ + 0.89) * 3.6 / 7)
407 self._ZRE4VP = FixedPointFloor((self._RE4LZZV + 0.89) * 3.6 / 7)
408 self._ZVBEZ = FixedPointFloor((self.VBEZ - self._FVB + 0.89) * 3.6 / 7)
409 else:
410 self._ZRE4 = FixedPointFloor((self._RE4LZZ + 0.56) * 3.6)
411 self._ZRE4VP = FixedPointFloor((self._RE4LZZV + 0.56) * 3.6)
412 self._ZVBEZ = FixedPointFloor((self.VBEZ - self._FVB + 0.56) * 3.6)
413 if self._RE4LZZ < 0:
414 self._ZRE4 = 0.0
415 if self._RE4LZZV < 0:
416 self._ZRE4VP = 0.0
417 if (self.VBEZ == 0) and (self._FVB == 0):
418 self._ZVBEZ = 0
419 elif (self.VBEZ - self._FVB) < 0:
420 self._ZVBEZ = 0
421
422 def _MZTABFB(self):
423 self._ANP = 0
424 if (self._ZVBEZ >= 0) and (self._ZVBEZ < self._FVBZ):
425 self._FVBZ = self._ZVBEZ
426 if (self.STKL < 6) and (self._ZVBEZ > 0):
427 if (self._ZVBEZ - self._FVBZ) < 102:
428 self._ANP = self._ZVBEZ - self._FVBZ
429 else:
430 self._ANP = 102
431 if (self.STKL < 6) and (self._ZRE4 > self._ZVBEZ):
432 if (self._ZRE4 - self._ZVBEZ) < 920:
433 self._ANP += self._ZRE4 - self._ZVBEZ
434 else:
435 self._ANP += 920
436 self._KZTAB = 1
437 if self.STKL == 1:
438 self._SAP = 36
439 self._KFB = self.ZKF * 5808
440 elif self.STKL == 2:
441 self._EFA = 1308
442 self._SAP = 36
443 self._KFB = self.ZKF * 5808
444 elif self.STKL == 3:
445 self._KZTAB = 2
446 self._SAP = 72
447 self._KFB = self.ZKF * 5808
448 elif self.STKL == 4:
449 self._SAP = 36
450 self._KFB = self.ZKF * 2904
451 else:
452 self._KFB = 0
453 self._ZTABFB = self._EFA + self._ANP + self._SAP + self._FVBZ
454
455 def _MLSTJAHR(self):
456 if self.STKL < 5:
457 self._UPEVP()
458 else:
459 self._VSP = 0.0
460 self._ZVE = self._ZRE4 - self._ZTABFB - self._VSP
461 if self._ZVE < 1:
462 self._ZVE = self._X = 0.0
463 else:
464 self._X = floor(float(self._ZVE) / self._KZTAB)
465 if self.STKL < 5:
466 self._UPTAB07()
467 else:
468 self._MST5_6()
469
470 def _UPEVP(self):
471 if self.KRV == 1:
472 self._VSP1 = 0.0
473 else:
474 if self._ZRE4VP > 63000:
475 self._ZRE4VP = 63000
476 self._VSP1 = 0.28 * self._ZRE4VP
477 self._VSP1 = FixedPointFloor(self._VSP1 * 0.0995)
478 self._VSP2 = FixedPointFloor(0.11 * self._ZRE4VP)
479 self._VHB = 1500 * self._KZTAB
480 if self._VSP2 > self._VHB:
481 self._VSP2 = self._VHB
482 self._VSPN = ceil(self._VSP1 + self._VSP2)
483 self._MVSP()
484 if self._VSPN > self._VSP:
485 self._VSP = self._VSPN
486
487 def _MVSP(self):
488 if self._KENNZ == 1:
489 self._VSPO = self._ZRE4VP1 * 0.2
490 else:
491 self._VSPO = self._ZRE4VP * 0.2
492 self._VSPVOR = 3068 * self._KZTAB
493 self._VSPMAX1 = 1334 * self._KZTAB
494 self._VSPMAX2 = 667 * self._KZTAB
495 self._VSPKURZ = 1134 * self._KZTAB
496 if self.KRV == 1:
497 if self._VSPO > self._VSPKURZ:
498 self._VSP = self._VSPKURZ
499 else:
500 self._VSP = floor(self._VSPO)
501 else:
502 self._UMVSP()
503
504 def _UMVSP(self):
505 if self._KENNZ == 1:
506 self._VSPVOR -= self._ZRE4VP1 * 0.16
507 else:
508 self._VSPVOR -= self._ZRE4VP * 0.16
509 if self._VSPVOR < 0:
510 self._VSPVOR = 0.0
511 if self._VSPO > self._VSPVOR:
512 self._VSP = self._VSPVOR
513 self._VSPREST = self._VSPO - self._VSPVOR
514 if self._VSPREST > self._VSPMAX1:
515 self._VSP += self._VSPMAX1
516 self._VSPREST = FixedPointCeil((self._VSPREST - self._VSPMAX1) / 2.0)
517 if self._VSPREST > self._VSPMAX2:
518 self._VSP = floor(self._VSP + self._VSPMAX2)
519 else:
520 self._VSP = floor(self._VSP + self._VSPREST)
521 else:
522 self._VSP = floor(self._VSP + self._VSPREST)
523 else:
524 self._VSP = floor(self._VSPO)
525
526 def _MST5_6(self):
527 self._ZZX = self._X
528 if self._ZZX > 25812:
529 self._ZX = 25812
530 self._UP5_6()
531 if self._ZZX > 200000:
532 self._ST += (200000 - 25812) * 0.42
533 self._ST = floor(self._ST + (self._ZZX - 200000) * 0.45)
534 else:
535 self._ST = floor(self._ST + (self._ZZX - 25812) * 0.42)
536 else:
537 self._ZX = self._ZZX
538 self._UP5_6()
539 if self._ZZX > 9144:
540 self._VERGL = self._ST
541 self._ZX = 9144
542 self._UP5_6()
543 self._HOCH = floor(self._ST + (self._ZZX - 9144) * 0.42)
544 if self._HOCH < self._VERGL:
545 self._ST = self._HOCH
546 else:
547 self._ST = self._VERGL
548
549 def _UP5_6(self):
550 self._X = self._ZX * 1.25
551 self._UPTAB07()
552 self._ST1 = self._ST
553 self._X = self._ZX * 0.75
554 self._UPTAB07()
555 self._ST2 = self._ST
556 self._DIFF = (self._ST1 - self._ST2) * 2
557 self._MIST = floor(self._ZX * 0.15)
558 if self._MIST > self._DIFF:
559 self._ST = self._MIST
560 else:
561 self._ST = self._DIFF
562
563 def _MSOLZ(self):
564 self._SOLZFREI = 972 * self._KZTAB
565 if self._JBMG > self._SOLZFREI:
566 self._SOLZJ = FixedPointFloor(self._JBMG * 5.5 / 100.0)
567 self._SOLZMIN = (self._JBMG - self._SOLZFREI) * 20 / 100.0
568 if self._SOLZMIN < self._SOLZJ:
569 self._SOLZJ = self._SOLZMIN
570 self._JW = self._SOLZJ * 100
571 self._UPANTEIL()
572 self.SOLZLZZ = self._ANTEIL1
573 else:
574 self.SOLZLZZ = 0
575 if self.R > 0:
576 self._JW = self._JBMG * 100
577 self._UPANTEIL()
578 self.BK = self._ANTEIL1
579 else:
580 self.BK = 0
581
582 def _UPANTEIL(self):
583 if self.LZZ == 1:
584 self._ANTEIL1 = self._JW
585 self._ANTEIL2 = self._JW
586 elif self.LZZ == 2:
587 self._ANTEIL1 = floor(self._JW / 12.0)
588 self._ANTEIL2 = ceil(self._JW / 12.0)
589 elif self.LZZ == 3:
590 self._ANTEIL1 = floor(self._JW * 7 / 360.0)
591 self._ANTEIL2 = ceil(self._JW * 7 / 360.0)
592 else:
593 self._ANTEIL1 = floor(self._JW / 360.0)
594 self._ANTEIL2 = ceil(self._JW / 360.0)
595
596 def _UPTAB07(self):
597 if self._X < 7665:
598 self._ST = 0
599 elif self._X < 12740:
600 self._Y = (self._X - 7664) / 10000.0
601 self._RW = self._Y * 883.74
602 self._RW += 1500
603 self._ST = floor(self._RW * self._Y)
604 elif self._X < 52152:
605 self._Y = (self._X - 12739) / 10000.0
606 self._RW = self._Y * 228.74
607 self._RW += 2397
608 self._RW *= self._Y
609 self._ST = floor(self._RW + 989)
610 elif self._X < 250001:
611 self._ST = floor(self._X * 0.42 - 7914)
612 else:
613 self._ST = floor(self._X * 0.45 - 15414)
614 self._ST *= self._KZTAB
615
616 def _MSONST(self):
617 if self.SONSTB == 0:
618 self.STS = 0
619 self.SOLZS = 0
620 self.BKS = 0
621 else:
622 # ------------------------------
623 # Nicht im offiziellen Programm-
624 # ablaufplan: Attribute sichern
625 old_lzz = self.LZZ
626 old_vbez = self.VBEZ
627 old_re4 = self.RE4
628 # ------------------------------
629 self.LZZ = 1
630 self.VBEZ = self.JVBEZ
631 self.RE4 = self.JRE4
632 self._MRE4LZZ()
633 self._MRE4LZZ2()
634 self._MLSTJAHR()
635 self._LST1 = self._ST * 100
636 self.VBEZ = self.JVBEZ + self.VBS
637 self.RE4 = self.JRE4 + self.SONSTB
638 self.VBEZS += self.STERBE
639 self._MRE4LZZ()
640 self._MRE4LZZ2()
641 self._MLSTJAHR()
642 self._LST2 = self._ST * 100
643 self.STS = self._LST2 - self._LST1
644 if (self.SONSTB > 0) and (self.STS < 0):
645 self.STS = 0
646 self.SOLZS = floor(self.STS * 5.5 / 100)
647 if self.R > 0:
648 self.BKS = self.STS
649 else:
650 self.BKS = 0
651 # ------------------------------
652 # Nicht im offiziellen Programm-
653 # ablaufplan: Attribute
654 # wiederherstellen
655 self.LZZ = old_lzz
656 self.VBEZ = old_vbez
657 self.RE4 = old_re4
658 # ------------------------------
659
660 def _MRE4LZZ2(self):
661 self._RE4LZZ = self.RE4 - self._FVB - self._ALTE \
662 - self.JFREIB + self.JHINZU
663 self._RE4LZZV = self.RE4 - self._FVB - self._ALTE
664 self._MRE4()
665 self._MZTABFB()
666
667 def _MVMT(self):
668 # ------------------------------
669 # Nicht im offiziellen Programm-
670 # ablaufplan: Attribute sichern
671 old_lzz = self.LZZ
672 old_vbez = self.VBEZ
673 old_re4 = self.RE4
674 # ------------------------------
675 if self.VKAPA < 0:
676 self.VKAPA = 0
677 if (self.VMT + self.VKAPA) > 0:
678 self.LZZ = 1
679 self.VBEZ = self.JVBEZ + self.VBS
680 self.RE4 = self.JRE4 + self.SONSTB
681 self._MRE4LZZ()
682 self._MRE4LZZ2()
683 self._MLSTJAHR()
684 self._LST1 = self._ST * 100
685 self.VMT += self.VKAPA
686 self.VBEZS += self.VKAPA
687 self.VBEZ += self.VKAPA
688 self.RE4 = self.JRE4 + self.SONSTB + self.VMT
689 self._MRE4LZZ()
690 self._MRE4LZZ2()
691 self._KENNZ = 1
692 self._ZRE4VP1 = self._ZRE4VP
693 self._MLSTJAHR()
694 self._LST3 = self._ST * 100
695 self.VBEZ -= self.VKAPA
696 self.VBEZS -= self.VKAPA
697 self.RE4 = self.JRE4 + self.SONSTB
698 self._MRE4LZZ()
699 if (self.RE4 - self.JFREIB + self.JHINZU) < 0:
700 self.RE4 -= self.JFREIB + self.JHINZU
701 self.JFREIB = 0
702 self.JHINZU = 0
703 self.RE4 = (self.RE4 + self.VMT) / 5
704 self._MRE4LZZ2()
705 self._MLSTJAHR()
706 self._LST2 = self._ST * 100
707 self.STV = self._LST2 * 5
708 else:
709 self.RE4 += self.VMT / 5
710 self._MRE4LZZ2()
711 self._MLSTJAHR()
712 self._LST2 = self._ST * 100
713 self.STV = (self._LST2 - self._LST1) * 5
714 self._LST3 -= self._LST1
715 if self._LST3 < self.STV:
716 self.STV = self._LST3
717 self.SOLZV = floor(self.STV * 5.5 / 100)
718 if self.R > 0:
719 self.BKV = self.STV
720 else:
721 self.BKV = 0
722 # ------------------------------
723 # Nicht im offiziellen Programm-
724 # ablaufplan: Attribute
725 # wiederherstellen
726 self.LZZ = old_lzz
727 self.VBEZ = old_vbez
728 self.RE4 = old_re4
729 # ------------------------------
730 else:
731 self.STV = 0
732 self.SOLZV = 0
733 self.BKV = 0
734
735 # Methoden zum geprüften setzen der Wert
736 # FIX ME: Prüfung _sehr_ unvollständig
737
738 def Set_AJAHR(self, value):
739 assert type(value) == type(0), "must be integer"
740 assert value >= 1900, "must be greater than 1900"
741 self.AJAHR = value
742
743 def Set_ALTER1(self, value):
744 assert value in (0,1), "must be 0 or 1"
745 self.ALTER1 = value
746
747 def Set_HINZUR(self, value):
748 self.HINZUR = value
749
750 def Set_JFREIB(self, value):
751 self.JFREIB = value
752
753 def Set_JHINZU(self, value):
754 self.JHINZU = value
755
756 def Set_JRE4(self, value):
757 self.JRE4 = value
758
759 def Set_JVBEZ(self, value):
760 self.JVBEZ = value
761
762 def Set_KRV(self, value):
763 assert value in (0,1), "must be 0 or 1"
764 self.KRV = value
765
766 def Set_LZZ(self, value):
767 assert value in (1,2,3,4), \
768 "must be in range 1-4 (JAHR, MONAT, WOCHE, TAG)"
769 self.LZZ = value
770
771 def Set_R(self, value):
772 assert value >= 0.0 and value <= 100.0, \
773 "must be in range 0.0-100.0 (Percent)"
774 self.R = value
775
776 def Set_RE4(self, value):
777 assert value >= 0, "must not be negative"
778 self.RE4 = value
779
780 def Set_SONSTB(self, value):
781 self.SONSTB = value
782
783 def Set_STERBE(self, value):
784 self.STERBE = value
785
786 def Set_STKL(self, value):
787 assert value in (1,2,3,4,5,6), \
788 "must be in range 1-6 (I II III IV V VI)"
789 self.STKL = value
790
791 def Set_VBEZ(self, value):
792 self.VBEZ = value
793
794 def Set_VBEZM(self, value):
795 self.VBEZM = value
796
797 def Set_VBEZS(self, value):
798 self.VBEZS = value
799
800 def Set_VBS(self, value):
801 self.VBS = value
802
803 def Set_VJAHR(self, value):
804 self.VJAHR = value
805
806 def Set_VKAPA(self, value):
807 self.VKAPA = value
808
809 def Set_VMT(self, value):
810 self.VMT = value
811
812 def Set_WFUNDF(self, value):
813 self.WFUNDF = value
814
815 def Set_ZKF(self, value):
816 assert float(value) == float("%.1f" % value) and \
817 value >= 0, \
818 "must be positive, and must not have more than one decimal digit"
819 self.ZKF = value
820
821 def Set_ZMVB(self, value):
822 self.ZMVB = value
823
824 # --------------------------------------------------------------------
825 # Eine etwas schönere API
826 #
827 # FIX ME: Diese API berücksichtigt nicht alle Möglichen Parameter und
828 # Berechnungen, es fehlen insbesondere die Berechnungen zu Mehrjährigen
829 # Bezügen und Sonstigen Leistungen.
830
831 class LStRechner2007(LST):
832 def __init__(self):
833 LST.__init__(self)
834
835 def SetGeb(self, geb):
836 """Setzt das Geburtsjahr"""
837 self.Set_AJAHR(geb + 65)
838 if self.AJAHR <= 2007:
839 self.Set_ALTER1(1)
840 else:
841 self.Set_ALTER1(0)
842
843 def SetLohn(self, lohn):
844 """Setzt Lohn in Euro.Cent"""
845 self.Set_RE4(round (lohn * 100.0))
846
847 def GetLohn(self):
848 """Liefert Lohn in Euro.Cent"""
849 return self.RE4 / 100.0
850
851 def SetZeitraum(self, lzz):
852 """Setzt Berechnungszeitraum (JAHR, MONAT, WOCHE, TAG)"""
853 self.Set_LZZ(lzz)
854
855 def GetZeitraum(self):
856 """Liefert Berechnungszeitraum (JAHR, MONAT, WOCHE, TAG)"""
857 return self.LZZ
858
859 def SetSteuerklasse(self, stkl):
860 """Setzt Steuerklasse (I, II, III, IV, V, VI)"""
861 self.Set_STKL(stkl)
862
863 def GetSteuerklasse(self):
864 """Liefert Steuerklasse (I, II, III, IV, V, VI)"""
865 return self.STKL
866
867 def SetKirchensteuerProzent(self, prozent):
868 """Setzt Kirchensteuer in Prozent,
869 0 wenn keine Kirchensteuer zu zahlen ist."""
870 self.Set_R(prozent)
871
872 def GetKirchensteuerProzent(self):
873 """Liefert Kirchensteuer in Prozent
874 oder 0 wenn keine Kirchensteuer zu zahlen ist."""
875 return self.R
876
877 def SetKinderfreibetrag(self, kfb):
878 """Setzt Kinderfreibetrag lt. Lohnsteuerkarte"""
879 self.Set_ZKF(kfb)
880
881 def GetKinderfreibetrag(self):
882 """Liefert Kinderfreibetrag lt. Lohnsteuerkarte"""
883 return self.ZFK
884
885 def GetLohnsteuer(self):
886 """Liefert Lohnsteuer in Euro.Cent"""
887 return round(self.LSTLZZ / 100, 2)
888
889 def GetSoli(self):
890 """Liefert Solidaritätszuschlag in Euro.Cent"""
891 return FixedPointFloor(self.SOLZLZZ / 100, 2)
892
893 def GetKirchensteuer(self):
894 """Liefert Kirchensteuer in Euro.Cent"""
895 return FixedPointFloor(self.BK * self.R / 10000, 2)

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26