1 |
|
# -*- coding: iso-8859-1 -*- |
2 |
# -------------------------------------------------------------------- |
# -------------------------------------------------------------------- |
3 |
# LST2005 -- Python Modul zur Berechnung der Deutschen Lohnsteuer 2005 |
# LST2005 -- Python Modul zur Berechnung der Deutschen Lohnsteuer 2005 |
4 |
# $Id$ |
# $Id$ |
12 |
# Read the file COPYING coming with this package for details. |
# Read the file COPYING coming with this package for details. |
13 |
|
|
14 |
"""Lohnsteuerberechnung nach dem offiziellen Programmablaufplan |
"""Lohnsteuerberechnung nach dem offiziellen Programmablaufplan |
15 |
wie in Programmablaufplan-LSt.pdf dokumentiert.""" |
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 |
# Die Variablen Namen sind h�sslich, die Algorithmen nicht |
26 |
# dokumentiert, der Code grausam -- daf�r entspricht alles Zeile f�r |
# dokumentiert, der Code grausam -- daf�r entspricht alles Zeile f�r |
149 |
self._VSPO = 0.0 # 2 Dezimalstellen |
self._VSPO = 0.0 # 2 Dezimalstellen |
150 |
self._VSPREST = 0.0 # 2 Dezimalstellen |
self._VSPREST = 0.0 # 2 Dezimalstellen |
151 |
self._VSPVOR = 0.0 # 2 Dezimalstellen |
self._VSPVOR = 0.0 # 2 Dezimalstellen |
|
# Jetzt wirds richtig toll: X und Y |
|
|
# kann mal bitte jemand den Verantwortlichen f�r diese |
|
|
# Variablen Namen schlagen? |
|
152 |
self._X = 0.0 # 2 Dezimalstellen |
self._X = 0.0 # 2 Dezimalstellen |
153 |
self._Y = 0.0 # 6 Dezimalstellen |
self._Y = 0.0 # 6 Dezimalstellen |
154 |
self._ZRE4 = 0.0 # 2 Dezimalstellen |
self._ZRE4 = 0.0 # 2 Dezimalstellen |
181 |
else: |
else: |
182 |
self._JBMG = self._LSTJAHR |
self._JBMG = self._LSTJAHR |
183 |
self._MSOLZ() |
self._MSOLZ() |
184 |
# self._MSONST() |
self._MSONST() |
185 |
# self._MVMT() |
self._MVMT() |
186 |
|
|
187 |
# Benutzte Unterprogramme: |
# Benutzte Unterprogramme: |
188 |
def _MRE4LZZ(self): |
def _MRE4LZZ(self): |
236 |
if self.RE4 > self.VBEZ: |
if self.RE4 > self.VBEZ: |
237 |
self._ANP += 920 |
self._ANP += 920 |
238 |
else: |
else: |
239 |
self._ANP = 0 |
self._ANP = 0 |
240 |
if self.STKL == 1: |
if self.STKL == 1: |
241 |
self._SAP = 36 |
self._SAP = 36 |
242 |
self._KFB = self.ZKF * 5808 |
self._KFB = self.ZKF * 5808 |
276 |
self._VSP1 = 1.0 |
self._VSP1 = 1.0 |
277 |
else: |
else: |
278 |
if self._ZRE4VP > 62400: |
if self._ZRE4VP > 62400: |
279 |
self._ZRE4VP = 62400.0 |
self._ZRE4VP = 62400 |
280 |
self._VSP1 = 0.2 * self._ZRE4VP |
self._VSP1 = 0.2 * self._ZRE4VP |
281 |
self._VSP1 = self._VSP1 * 0.0975 |
self._VSP1 = FixedPointFloor(self._VSP1 * 0.0975) |
282 |
self._VSP2 = 0.11 * self._ZRE4VP |
self._VSP2 = FixedPointFloor(0.11 * self._ZRE4VP) |
283 |
self._VHB = 1500 * self._KZTAB |
self._VHB = 1500 * self._KZTAB |
284 |
if self._VSP2 > self._VHB: |
if self._VSP2 > self._VHB: |
285 |
self._VSP2 = self._VHB |
self._VSP2 = self._VHB |
371 |
self.SOLZLZZ = 0 |
self.SOLZLZZ = 0 |
372 |
if self.R > 0: |
if self.R > 0: |
373 |
self._JW = self._JBMG * 100 |
self._JW = self._JBMG * 100 |
374 |
self._UPANTEIL |
self._UPANTEIL() |
375 |
self.BK = self._ANTEIL1 |
self.BK = self._ANTEIL1 |
376 |
else: |
else: |
377 |
self.BK = 0 |
self.BK = 0 |
408 |
self._ST = floor(self._X * 0.42 - 7914) |
self._ST = floor(self._X * 0.42 - 7914) |
409 |
self._ST *= self._KZTAB |
self._ST *= self._KZTAB |
410 |
|
|
411 |
|
def _MSONST(self): |
412 |
|
if self.SONSTB > 0: |
413 |
|
# ------------------------------ |
414 |
|
# Nicht im offiziellen Programm- |
415 |
|
# ablaufplan: Attribute sichern |
416 |
|
old_lzz = self.LZZ |
417 |
|
old_vbez = self.VBEZ |
418 |
|
old_re4 = self.RE4 |
419 |
|
# ------------------------------ |
420 |
|
self.LZZ = 1 |
421 |
|
self.VBEZ = self.JVBEZ |
422 |
|
self.RE4 = self.JRE4 |
423 |
|
self._MRE4LZZ() |
424 |
|
self._MRE4LZZ2() |
425 |
|
self._MRE4() |
426 |
|
self._MZTABFB() |
427 |
|
self._MLSTJAHR() |
428 |
|
self._LST1 = self._ST * 100 |
429 |
|
self.VBEZ = self.JVBEZ + self.VBS |
430 |
|
self.RE4 = self.JRE4 + self.SONSTB |
431 |
|
self._MRE4LZZ() |
432 |
|
self._MRE4LZZ2() |
433 |
|
self._MRE4() |
434 |
|
self._MLSTJAHR() |
435 |
|
self._LST2 = self._ST * 100 |
436 |
|
self.STS = self._LST2 - self._LST1 |
437 |
|
self.SOLZS = self.STS * 5.5 / 100 |
438 |
|
if self.R > 0: |
439 |
|
self.BKS = self.STS |
440 |
|
else: |
441 |
|
self.BKS = 0 |
442 |
|
# ------------------------------ |
443 |
|
# Nicht im offiziellen Programm- |
444 |
|
# ablaufplan: Attribute |
445 |
|
# wiederherstellen |
446 |
|
self.LZZ = old_lzz |
447 |
|
self.VBEZ = old_vbez |
448 |
|
self.RE4 = old_re4 |
449 |
|
# ------------------------------ |
450 |
|
else: |
451 |
|
self.STS = 0 |
452 |
|
self.SOLZS = 0 |
453 |
|
self.BKS = 0 |
454 |
|
|
455 |
|
def _MRE4LZZ2(self): |
456 |
|
self._RE4LZZ = self.RE4 - self._FVB - self._ALTE \ |
457 |
|
- self.JFREIB + self.JHINZU |
458 |
|
self._RE4LZZV = self.RE4 - self._FVB - self._ALTE |
459 |
|
|
460 |
|
def _MVMT(self): |
461 |
|
if self.VMT > 0: |
462 |
|
# ------------------------------ |
463 |
|
# Nicht im offiziellen Programm- |
464 |
|
# ablaufplan: Attribute sichern |
465 |
|
old_lzz = self.LZZ |
466 |
|
old_vbez = self.VBEZ |
467 |
|
old_re4 = self.RE4 |
468 |
|
# ------------------------------ |
469 |
|
self.LZZ = 1 |
470 |
|
self.VBEZ = self.JVBEZ + self.VBS |
471 |
|
self.RE4 = self.JRE4 + self.SONSTB |
472 |
|
self._MRE4LZZ() |
473 |
|
self._MRE4LZZ2() |
474 |
|
self._MRE4() |
475 |
|
self._MZTABFB() |
476 |
|
self._MLSTJAHR() |
477 |
|
self._LST1 = self._ST * 100 |
478 |
|
self.RE4 = self.JRE4 + self.SONSTB + self.VMT |
479 |
|
self._MRE4LZZ() |
480 |
|
self._MRE4LZZ2() |
481 |
|
self._MRE4() |
482 |
|
self._KENNZ = 1 |
483 |
|
self._ZRE4VP1 = self._ZRE4VP |
484 |
|
self._MLSTJAHR() |
485 |
|
self._LST3 = self._ST * 100 |
486 |
|
self.RE4 = self.JRE4 + self.SONSTB |
487 |
|
self._MRE4LZZ() |
488 |
|
self.RE4 = self.JRE4 + self.SONSTB + self.VMT / 5 |
489 |
|
self._MRE4LZZ2() |
490 |
|
self._MRE4() |
491 |
|
self._MLSTJAHR() |
492 |
|
self._LST2 = self._ST * 100 |
493 |
|
self.STV = (self._LST2 - self._LST1) * 5 |
494 |
|
self._LST3 -= self._LST1 |
495 |
|
if self._LST3 < self.STV: |
496 |
|
self.STV = self._LST3 |
497 |
|
self.SOLZV = floor(self.STV * 5.5 / 100) |
498 |
|
if self.R > 0: |
499 |
|
self.BKV = self.STV |
500 |
|
else: |
501 |
|
self.BKV = 0 |
502 |
|
# ------------------------------ |
503 |
|
# Nicht im offiziellen Programm- |
504 |
|
# ablaufplan: Attribute |
505 |
|
# wiederherstellen |
506 |
|
self.LZZ = old_lzz |
507 |
|
self.VBEZ = old_vbez |
508 |
|
self.RE4 = old_re4 |
509 |
|
# ------------------------------ |
510 |
|
else: |
511 |
|
self.STV = 0 |
512 |
|
self.SOLZV = 0 |
513 |
|
self.BKV = 0 |
514 |
|
|
515 |
# Methoden zum gepr�ften setzen der Wert |
# Methoden zum gepr�ften setzen der Wert |
516 |
# FIX ME: Pr�fung _sehr_ unvollst�ndig |
# FIX ME: Pr�fung _sehr_ unvollst�ndig |
517 |
def Set_RE4(self, value): |
def Set_RE4(self, value): |
538 |
self.JVBEZ = value |
self.JVBEZ = value |
539 |
|
|
540 |
def Set_KRV(self, value): |
def Set_KRV(self, value): |
541 |
if value not in (0,1): |
assert value in (0,1), "must be 0 or 1" |
|
raise ValueError |
|
542 |
self.KRV = value |
self.KRV = value |
543 |
|
|
544 |
def Set_LZZ(self, value): |
def Set_LZZ(self, value): |
545 |
if value not in (1,2,3,4): |
assert value in (1,2,3,4), \ |
546 |
raise ValueError |
"must be in range 1-4 (JAHR, MONAT, WOCHE, TAG)" |
547 |
self.LZZ = value |
self.LZZ = value |
548 |
|
|
549 |
def Set_R(self, value): |
def Set_R(self, value): |
550 |
|
assert value >= 0.0 and value <= 100.0, \ |
551 |
|
"must be in range 0.0-100.0 (Percent)" |
552 |
self.R = value |
self.R = value |
553 |
|
|
554 |
def Set_SONSTB(self, value): |
def Set_SONSTB(self, value): |
555 |
self.SONSTB = value |
self.SONSTB = value |
556 |
|
|
557 |
def Set_STKL(self, value): |
def Set_STKL(self, value): |
558 |
if value not in (1,2,3,4,5,6): |
assert value in (1,2,3,4,5,6), \ |
559 |
raise ValueError |
"must be in range 1-6 (I II III IV V VI)" |
560 |
self.STKL = value |
self.STKL = value |
561 |
|
|
562 |
def Set_VBEZ(self, value): |
def Set_VBEZ(self, value): |
578 |
self.WFUNDF = value |
self.WFUNDF = value |
579 |
|
|
580 |
def Set_ZKF(self, value): |
def Set_ZKF(self, value): |
581 |
|
assert float(value) == float("%.1f" % value) and \ |
582 |
|
value >= 0, \ |
583 |
|
"must be positive, and must not have more than one decimal digit" |
584 |
self.ZKF = value |
self.ZKF = value |
585 |
|
|
586 |
def Set_ZMVB(self, value): |
def Set_ZMVB(self, value): |
587 |
self.ZMVB = value |
self.ZMVB = value |
588 |
|
|
589 |
# -------------------------------------------------------------------- |
# -------------------------------------------------------------------- |
590 |
# Eine etwas sch�nere API: |
# Eine etwas sch�nere API |
591 |
# |
# |
592 |
|
# FIX ME: Diese API ber�cksichtigt nicht alle M�glichen Parameter und |
593 |
def Set_Lohn(self, lohn): |
# Berechnungen, es fehlen insbesondere die Berechnungen zu Mehrj�hrigen |
594 |
self.Set_RE4(lohn * 100.0) |
# Bez�gen und Sonstigen Leistungen. |
595 |
|
|
596 |
|
class LStRechner2005(LST): |
597 |
|
def __init__(self): |
598 |
|
LST.__init__(self) |
599 |
|
|
600 |
|
def SetLohn(self, lohn): |
601 |
|
"""Setzt Lohn in Euro.Cent""" |
602 |
|
self.Set_RE4(round (lohn * 100.0)) |
603 |
|
|
604 |
|
def GetLohn(self): |
605 |
|
"""Liefert Lohn in Euro.Cent""" |
606 |
|
return self.RE4 / 100.0 |
607 |
|
|
608 |
def Set_Zeitraum(self, lzz): |
def SetZeitraum(self, lzz): |
609 |
|
"""Setzt Berechnungszeitraum (JAHR, MONAT, WOCHE, TAG)""" |
610 |
self.Set_LZZ(lzz) |
self.Set_LZZ(lzz) |
611 |
|
|
612 |
def Set_Steuerklasse(self, stkl): |
def GetZeitraum(self): |
613 |
|
"""Liefert Berechnungszeitraum (JAHR, MONAT, WOCHE, TAG)""" |
614 |
|
return self.LZZ |
615 |
|
|
616 |
|
def SetSteuerklasse(self, stkl): |
617 |
|
"""Setzt Steuerklasse (I, II, III, IV, V, VI)""" |
618 |
self.Set_STKL(stkl) |
self.Set_STKL(stkl) |
619 |
|
|
620 |
def Get_Lohnsteuer(self): |
def GetSteuerklasse(self): |
621 |
|
"""Liefert Steuerklasse (I, II, III, IV, V, VI)""" |
622 |
|
return self.STKL |
623 |
|
|
624 |
|
def SetKirchensteuerProzent(self, prozent): |
625 |
|
"""Setzt Kirchensteuer in Prozent, |
626 |
|
0 wenn keine Kirchensteuer zu zahlen ist.""" |
627 |
|
self.Set_R(prozent) |
628 |
|
|
629 |
|
def GetKirchensteuerProzent(self): |
630 |
|
"""Liefert Kirchensteuer in Prozent |
631 |
|
oder 0 wenn keine Kirchensteuer zu zahlen ist.""" |
632 |
|
return self.R |
633 |
|
|
634 |
|
def SetKinderfreibetrag(self, kfb): |
635 |
|
"""Setzt Kinderfreibetrag lt. Lohnsteuerkarte""" |
636 |
|
self.Set_ZKF(kfb) |
637 |
|
|
638 |
|
def GetKinderfreibetrag(self): |
639 |
|
"""Liefert Kinderfreibetrag lt. Lohnsteuerkarte""" |
640 |
|
return self.ZFK |
641 |
|
|
642 |
|
def GetLohnsteuer(self): |
643 |
|
"""Liefert Lohnsteuer in Euro.Cent""" |
644 |
return round(self.LSTLZZ / 100, 2) |
return round(self.LSTLZZ / 100, 2) |
645 |
|
|
646 |
|
def GetSoli(self): |
647 |
|
"""Liefert Solidarit�tszuschlag in Euro.Cent""" |
648 |
|
return FixedPointFloor(self.SOLZLZZ / 100, 2) |
649 |
|
|
650 |
|
def GetKirchensteuer(self): |
651 |
|
"""Liefert Kirchensteuer in Euro.Cent""" |
652 |
|
return FixedPointFloor(self.BK * self.R / 10000, 2) |