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

Diff of /trunk/LST2008.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2 by wilde, Tue Jan 11 15:22:31 2005 UTC revision 20 by wilde, Fri Jan 14 11:44:48 2005 UTC
# Line 1  Line 1 
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$
# Line 13  Line 14 
14  """Lohnsteuerberechnung nach dem offiziellen Programmablaufplan  """Lohnsteuerberechnung nach dem offiziellen Programmablaufplan
15     wie in Programmablaufplan-LSt.pdf dokumentiert."""     wie in Programmablaufplan-LSt.pdf dokumentiert."""
16    
17    __version__ = "$Revision$"
18    # $Source$
19    
20    def _ModulVersion():
21        return __version__[11:-2]
22    
23  # Die Variablen Namen sind h�sslich, die Algorithmen nicht  # Die Variablen Namen sind h�sslich, die Algorithmen nicht
24  # dokumentiert, der Code grausam -- daf�r entspricht alles Zeile f�r  # dokumentiert, der Code grausam -- daf�r entspricht alles Zeile f�r
25  # Zeile obigem Dokument.  Jedenfalls sollte es so sein...  # Zeile obigem Dokument.  Jedenfalls sollte es so sein...
# Line 175  class LST: Line 182  class LST:
182          else:          else:
183              self._JBMG = self._LSTJAHR              self._JBMG = self._LSTJAHR
184          self._MSOLZ()          self._MSOLZ()
185  #        self._MSONST()          self._MSONST()
186  #        self._MVMT()          self._MVMT()
187                    
188      # Benutzte Unterprogramme:      # Benutzte Unterprogramme:
189      def _MRE4LZZ(self):      def _MRE4LZZ(self):
# Line 230  class LST: Line 237  class LST:
237              if self.RE4 > self.VBEZ:              if self.RE4 > self.VBEZ:
238                  self._ANP += 920                  self._ANP += 920
239          else:          else:
240              self._ANP = 0              self._ANP = 0            
241          if self.STKL == 1:          if self.STKL == 1:
242              self._SAP = 36              self._SAP = 36
243              self._KFB = self.ZKF * 5808              self._KFB = self.ZKF * 5808
# Line 270  class LST: Line 277  class LST:
277              self._VSP1 = 1.0              self._VSP1 = 1.0
278          else:          else:
279              if self._ZRE4VP > 62400:              if self._ZRE4VP > 62400:
280                  self._ZRE4VP = 62400.0                  self._ZRE4VP = 62400
281              self._VSP1 = 0.2 * self._ZRE4VP              self._VSP1 = 0.2 * self._ZRE4VP
282              self._VSP1 = self._VSP1 * 0.0975              self._VSP1 = FixedPointFloor(self._VSP1 * 0.0975)
283          self._VSP2 = 0.11 * self._ZRE4VP          self._VSP2 = FixedPointFloor(0.11 * self._ZRE4VP)
284          self._VHB = 1500 * self._KZTAB          self._VHB = 1500 * self._KZTAB
285          if self._VSP2 > self._VHB:          if self._VSP2 > self._VHB:
286              self._VSP2 = self._VHB              self._VSP2 = self._VHB
# Line 365  class LST: Line 372  class LST:
372              self.SOLZLZZ = 0              self.SOLZLZZ = 0
373          if self.R > 0:          if self.R > 0:
374              self._JW = self._JBMG * 100              self._JW = self._JBMG * 100
375              self._UPANTEIL              self._UPANTEIL()
376              self.BK = self._ANTEIL1              self.BK = self._ANTEIL1
377          else:          else:
378              self.BK = 0              self.BK = 0
# Line 402  class LST: Line 409  class LST:
409              self._ST = floor(self._X * 0.42 - 7914)              self._ST = floor(self._X * 0.42 - 7914)
410          self._ST *= self._KZTAB          self._ST *= self._KZTAB
411    
412        def _MSONST(self):
413            if self.SONSTB > 0:
414                # ------------------------------
415                # Nicht im offiziellen Programm-
416                # ablaufplan: Attribute sichern
417                old_lzz = self.LZZ
418                old_vbez = self.VBEZ
419                old_re4 = self.RE4
420                # ------------------------------
421                self.LZZ = 1
422                self.VBEZ = self.JVBEZ
423                self.RE4 = self.JRE4
424                self._MRE4LZZ()
425                self._MRE4LZZ2()
426                self._MRE4()
427                self._MZTABFB()
428                self._MLSTJAHR()
429                self._LST1 = self._ST * 100
430                self.VBEZ = self.JVBEZ + self.VBS
431                self.RE4 = self.JRE4 + self.SONSTB
432                self._MRE4LZZ()
433                self._MRE4LZZ2()
434                self._MRE4()
435                self._MLSTJAHR()
436                self._LST2 = self._ST * 100
437                self.STS = self._LST2 - self._LST1
438                self.SOLZS = self.STS * 5.5 / 100
439                if self.R > 0:
440                    self.BKS = self.STS
441                else:
442                    self.BKS = 0
443                # ------------------------------
444                # Nicht im offiziellen Programm-
445                # ablaufplan: Attribute
446                # wiederherstellen
447                self.LZZ = old_lzz
448                self.VBEZ = old_vbez
449                self.RE4 = old_re4
450                # ------------------------------
451            else:
452                self.STS = 0
453                self.SOLZS = 0
454                self.BKS = 0
455    
456        def _MRE4LZZ2(self):
457            self._RE4LZZ = self.RE4 - self._FVB - self._ALTE \
458                           - self.JFREIB + self.JHINZU
459            self._RE4LZZV = self.RE4 - self._FVB - self._ALTE
460    
461        def _MVMT(self):
462            if self.VMT > 0:
463                # ------------------------------
464                # Nicht im offiziellen Programm-
465                # ablaufplan: Attribute sichern
466                old_lzz = self.LZZ
467                old_vbez = self.VBEZ
468                old_re4 = self.RE4
469                # ------------------------------  
470                self.LZZ = 1
471                self.VBEZ = self.JVBEZ + self.VBS
472                self.RE4 = self.JRE4 + self.SONSTB
473                self._MRE4LZZ()
474                self._MRE4LZZ2()
475                self._MRE4()
476                self._MZTABFB()
477                self._MLSTJAHR()
478                self._LST1 = self._ST * 100
479                self.RE4 = self.JRE4 + self.SONSTB + self.VMT
480                self._MRE4LZZ()
481                self._MRE4LZZ2()
482                self._MRE4()
483                self._KENNZ = 1
484                self._ZRE4VP1 = self._ZRE4VP
485                self._MLSTJAHR()
486                self._LST3 = self._ST * 100
487                self.RE4 = self.JRE4 + self.SONSTB
488                self._MRE4LZZ()
489                self.RE4 = self.JRE4 + self.SONSTB + self.VMT / 5
490                self._MRE4LZZ2()
491                self._MRE4()
492                self._MLSTJAHR()
493                self._LST2 = self._ST * 100
494                self.STV = (self._LST2 - self._LST1) * 5
495                self._LST3 -= self._LST1
496                if self._LST3 < self.STV:
497                    self.STV = self._LST3
498                self.SOLZV = floor(self.STV * 5.5 / 100)
499                if self.R > 0:
500                    self.BKV = self.STV
501                else:
502                    self.BKV = 0
503                # ------------------------------
504                # Nicht im offiziellen Programm-
505                # ablaufplan: Attribute
506                # wiederherstellen
507                self.LZZ = old_lzz
508                self.VBEZ = old_vbez
509                self.RE4 = old_re4
510                # ------------------------------
511            else:
512                self.STV = 0
513                self.SOLZV = 0
514                self.BKV = 0
515    
516      # Methoden zum gepr�ften setzen der Wert      # Methoden zum gepr�ften setzen der Wert
517      # FIX ME: Pr�fung _sehr_ unvollst�ndig      # FIX ME: Pr�fung _sehr_ unvollst�ndig
518      def Set_RE4(self, value):      def Set_RE4(self, value):
# Line 428  class LST: Line 539  class LST:
539          self.JVBEZ = value          self.JVBEZ = value
540                    
541      def Set_KRV(self, value):      def Set_KRV(self, value):
542          if value not in (0,1):          assert value in (0,1), "must be 0 or 1"
             raise ValueError  
543          self.KRV = value          self.KRV = value
544                    
545      def Set_LZZ(self, value):      def Set_LZZ(self, value):
546          if value not in (1,2,3,4):          assert value in (1,2,3,4), \
547              raise ValueError                 "must be in range 1-4 (JAHR, MONAT, WOCHE, TAG)"
548          self.LZZ = value          self.LZZ = value
549                    
550      def Set_R(self, value):      def Set_R(self, value):
551            assert value >= 0.0 and value <= 100.0, \
552                   "must be in range 0.0-100.0 (Percent)"
553          self.R = value          self.R = value
554                    
555      def Set_SONSTB(self, value):      def Set_SONSTB(self, value):
556          self.SONSTB = value          self.SONSTB = value
557                    
558      def Set_STKL(self, value):      def Set_STKL(self, value):
559          if value not in (1,2,3,4,5,6):          assert value in (1,2,3,4,5,6), \
560              raise ValueError                 "must be in range 1-6 (I II III IV V VI)"
561          self.STKL = value          self.STKL = value
562                    
563      def Set_VBEZ(self, value):      def Set_VBEZ(self, value):
# Line 467  class LST: Line 579  class LST:
579          self.WFUNDF = value          self.WFUNDF = value
580    
581      def Set_ZKF(self, value):      def Set_ZKF(self, value):
582            assert float(value) == float("%.1f" % value) and \
583                   value >= 0, \
584                   "must be positive, and must not have more than one decimal digit"
585          self.ZKF = value          self.ZKF = value
586            
587      def Set_ZMVB(self, value):      def Set_ZMVB(self, value):
588          self.ZMVB = value          self.ZMVB = value
589    
590      # --------------------------------------------------------------------  # --------------------------------------------------------------------
591      # Eine etwas sch�nere API:  # Eine etwas sch�nere API
592      #  #
593    # FIX ME: Diese API ber�cksichtigt nicht alle M�glichen Parameter und
594      def Set_Lohn(self, lohn):  # Berechnungen, es fehlen insbesondere die Berechnungen zu Mehrj�hrigen
595    # Bez�gen und Sonstigen Leistungen.
596    
597    class LStRechner2005(LST):
598        def __init__(self):
599            LST.__init__(self)
600        
601        def SetLohn(self, lohn):
602            """Setzt Lohn in Euro.Cent"""
603          self.Set_RE4(lohn * 100.0)          self.Set_RE4(lohn * 100.0)
604    
605      def Set_Zeitraum(self, lzz):      def SetZeitraum(self, lzz):
606            """Setzt Berechnungszeitraum (JAHR, MONAT, WOCHE, TAG)"""
607          self.Set_LZZ(lzz)          self.Set_LZZ(lzz)
608    
609      def Set_Steuerklasse(self, stkl):      def SetSteuerklasse(self, stkl):
610            """Setzt Steuerklasse (I, II, III, IV, V, VI)"""
611          self.Set_STKL(stkl)          self.Set_STKL(stkl)
612    
613      def Get_Lohnsteuer(self):      def SetKirchensteuer(self, prozent):
614            """Setzt Kirchensteuer in Prozent"""
615            self.Set_R(prozent)
616    
617        def SetKinderfreibetrag(self, kfb):
618            """Setzt Kinderfreibetrag lt. Lohnsteuerkarte"""
619            self.Set_ZKF(kfb)
620    
621        def GetLohnsteuer(self):
622            """Liefert Lohnsteuer in Euro.Cent"""
623          return round(self.LSTLZZ / 100, 2)          return round(self.LSTLZZ / 100, 2)
624        
625        def GetSoli(self):
626            """Liefert Solidarit�tszuschlag in Euro.Cent"""
627            return FixedPointFloor(self.SOLZLZZ / 100, 2)
628    
629        def GetKirchensteuer(self):
630            """Liefert Kirchensteuer in Euro.Cent"""
631            return FixedPointFloor(self.BK * self.R / 10000, 2)

Legend:
Removed from v.2  
changed lines
  Added in v.20

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26