
| Current Path : /var/www/web-klick.de/dsh/21_finance/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/21_finance/yy.php |
<?php
use Brick\Math\BigDecimal as BaseBigDecimal;
use Brick\Math\RoundingMode as RoundingMode;
/**
* A proxy class to use BigDecimal methods
* as they are found in PAP XML
*/
class BigDecimal {
const ROUND_DOWN = RoundingMode::DOWN;
const ROUND_UP = RoundingMode::UP;
private $bd;
public function __construct($value) {
$this->bd = BaseBigDecimal::of($value);
}
public function divide($other, $scale=null, $rounding=null) {
if (!$scale && !$rounding) {
return new BigDecimal($this->bd->exactlyDividedBy($other));
}
return new BigDecimal($this->bd->dividedBy($other, $scale, $rounding));
}
public static function valueOf($value) {
return new BigDecimal($value);
}
public function multiply($other) {
return new BigDecimal($this->bd->multipliedBy($other));
}
public function setScale($scale, $rounding) {
return new BigDecimal($this->bd->withScale($scale, $rounding));
}
public function add($other) {
return new BigDecimal($this->bd->plus($other));
}
public function subtract($other) {
return new BigDecimal($this->bd->minus($other));
}
public function longValue() {
return $this->bd->toInteger();
}
public function floatValue() {
return $this->bd->toFloat();
}
public function compareTo($other) {
return $this->bd->compareTo($other);
}
public function __toString() {
return $this->bd->__toString();
}
public static function zero() {
return BigDecimal::valueOf(0);
}
public static function one() {
return BigDecimal::valueOf(1);
}
public static function ten() {
return BigDecimal::valueOf(10);
}
}
class xyz {
/**
* Internal variables
*/
// Altersentlastungsbetrag nach Alterseinkuenftegesetz in €,
// Cent (2 Dezimalstellen)
private $ALTE;
// Arbeitnehmer-Pauschbetrag in EURO
private $ANP;
// Auf den Lohnzahlungszeitraum entfallender Anteil von Jahreswerten
// auf ganze Cents abgerundet
private $ANTEIL1;
// Bemessungsgrundlage fuer Altersentlastungsbetrag in €, Cent
// (2 Dezimalstellen)
private $BMG;
// Beitragsbemessungsgrenze in der gesetzlichen Krankenversicherung
// und der sozialen Pflegeversicherung in Euro
private $BBGKVPV;
// allgemeine Beitragsbemessungsgrenze in der allgemeinen Renten-versicherung in Euro
private $BBGRV;
// Differenz zwischen ST1 und ST2 in EURO
private $DIFF;
// Entlastungsbetrag fuer Alleinerziehende in EURO
private $EFA;
// Versorgungsfreibetrag in €, Cent (2 Dezimalstellen)
private $FVB;
// Versorgungsfreibetrag in €, Cent (2 Dezimalstellen) fuer die Berechnung
// der Lohnsteuer fuer den sonstigen Bezug
private $FVBSO;
// Zuschlag zum Versorgungsfreibetrag in EURO
private $FVBZ;
// Zuschlag zum Versorgungsfreibetrag in EURO fuer die Berechnung
// der Lohnsteuer beim sonstigen Bezug
private $FVBZSO;
// Grundfreibetrag in Euro
private $GFB;
// Maximaler Altersentlastungsbetrag in €
private $HBALTE;
// Massgeblicher maximaler Versorgungsfreibetrag in €
private $HFVB;
// Massgeblicher maximaler Zuschlag zum Versorgungsfreibetrag in €,Cent
// (2 Dezimalstellen)
private $HFVBZ;
// Massgeblicher maximaler Zuschlag zum Versorgungsfreibetrag in €, Cent
// (2 Dezimalstellen) fuer die Berechnung der Lohnsteuer fuer den
// sonstigen Bezug
private $HFVBZSO;
// Nummer der Tabellenwerte fuer Versorgungsparameter
private $J;
// Jahressteuer nach § 51a EStG, aus der Solidaritaetszuschlag und
// Bemessungsgrundlage fuer die Kirchenlohnsteuer ermittelt werden in EURO
private $JBMG;
// Auf einen Jahreslohn hochgerechneter LZZFREIB in €, Cent
// (2 Dezimalstellen)
private $JLFREIB;
// Auf einen Jahreslohn hochgerechnete LZZHINZU in €, Cent
// (2 Dezimalstellen)
private $JLHINZU;
// Jahreswert, dessen Anteil fuer einen Lohnzahlungszeitraum in
// UPANTEIL errechnet werden soll in Cents
private $JW;
// Nummer der Tabellenwerte fuer Parameter bei Altersentlastungsbetrag
private $K;
// Merker fuer Berechnung Lohnsteuer fuer mehrjaehrige Taetigkeit.
// 0 = normale Steuerberechnung
// 1 = Steuerberechnung fuer mehrjaehrige Taetigkeit
// 2 = entfaellt
private $KENNVMT;
// Summe der Freibetraege fuer Kinder in EURO
private $KFB;
// Beitragssatz des Arbeitgebers zur Krankenversicherung
private $KVSATZAG;
// Beitragssatz des Arbeitnehmers zur Krankenversicherung
private $KVSATZAN;
// Kennzahl fuer die Einkommensteuer-Tabellenart:
// 1 = Grundtabelle
// 2 = Splittingtabelle
private $KZTAB;
// Jahreslohnsteuer in EURO
private $LSTJAHR;
// Zwischenfelder der Jahreslohnsteuer in Cent
private $LST1;
private $LST2;
private $LST3;
private $LSTOSO;
private $LSTSO;
// Mindeststeuer fuer die Steuerklassen V und VI in EURO
private $MIST;
// Beitragssatz des Arbeitgebers zur Pflegeversicherung
private $PVSATZAG;
// Beitragssatz des Arbeitnehmers zur Pflegeversicherung
private $PVSATZAN;
// Beitragssatz des Arbeitnehmers in der allgemeinen gesetzlichen Rentenversicherung (4 Dezimalstellen)
private $RVSATZAN;
// Rechenwert in Gleitkommadarstellung
private $RW;
// Sonderausgaben-Pauschbetrag in EURO
private $SAP;
// Freigrenze fuer den Solidaritaetszuschlag in EURO
private $SOLZFREI;
// Solidaritaetszuschlag auf die Jahreslohnsteuer in EURO, C (2 Dezimalstellen)
private $SOLZJ;
// Zwischenwert fuer den Solidaritaetszuschlag auf die Jahreslohnsteuer
// in EURO, C (2 Dezimalstellen)
private $SOLZMIN;
// Tarifliche Einkommensteuer in EURO
private $ST;
// Tarifliche Einkommensteuer auf das 1,25-fache ZX in EURO
private $ST1;
// Tarifliche Einkommensteuer auf das 0,75-fache ZX in EURO
private $ST2;
// Zwischenfeld zur Ermittlung der Steuer auf Verguetungen fuer mehrjaehrige Taetigkeit
private $STOVMT;
// Teilbetragssatz der Vorsorgepauschale fuer die Rentenversicherung (2 Dezimalstellen)
private $TBSVORV;
// Bemessungsgrundlage fuer den Versorgungsfreibetrag in Cents
private $VBEZB;
// Bemessungsgrundlage fuer den Versorgungsfreibetrag in Cent fuer
// den sonstigen Bezug
private $VBEZBSO;
// Hoechstbetrag der Vorsorgepauschale nach Alterseinkuenftegesetz in EURO, C
private $VHB;
// Vorsorgepauschale in EURO, C (2 Dezimalstellen)
private $VSP;
// Vorsorgepauschale nach Alterseinkuenftegesetz in EURO, C
private $VSPN;
// Zwischenwert 1 bei der Berechnung der Vorsorgepauschale nach
// dem Alterseinkuenftegesetz in EURO, C (2 Dezimalstellen)
private $VSP1;
// Zwischenwert 2 bei der Berechnung der Vorsorgepauschale nach
// dem Alterseinkuenftegesetz in EURO, C (2 Dezimalstellen)
private $VSP2;
// Vorsorgepauschale mit Teilbetraegen fuer die gesetzliche Kranken- und
// soziale Pflegeversicherung nach fiktiven Betraegen oder ggf. fuer die
// private Basiskrankenversicherung und private Pflege-Pflichtversicherung
// in Euro, Cent (2 Dezimalstellen)
private $VSP3;
// Erster Grenzwert in Steuerklasse V/VI in Euro
private $W1STKL5;
// Zweiter Grenzwert in Steuerklasse V/VI in Euro
private $W2STKL5;
// Dritter Grenzwert in Steuerklasse V/VI in Euro
private $W3STKL5;
// Hoechstbetrag der Vorsorgepauschale nach § 10c Abs. 2 Nr. 2 EStG in EURO
private $VSPMAX1;
// Hoechstbetrag der Vorsorgepauschale nach § 10c Abs. 2 Nr. 3 EStG in EURO
private $VSPMAX2;
// Vorsorgepauschale nach § 10c Abs. 2 Satz 2 EStG vor der Hoechstbetragsberechnung
// in EURO, C (2 Dezimalstellen)
private $VSPO;
// Fuer den Abzug nach § 10c Abs. 2 Nrn. 2 und 3 EStG verbleibender
// Rest von VSPO in EURO, C (2 Dezimalstellen)
private $VSPREST;
// Hoechstbetrag der Vorsorgepauschale nach § 10c Abs. 2 Nr. 1 EStG
// in EURO, C (2 Dezimalstellen)
private $VSPVOR;
// Zu versteuerndes Einkommen gem. § 32a Abs. 1 und 2 EStG €, C
// (2 Dezimalstellen)
private $X;
// gem. § 32a Abs. 1 EStG (6 Dezimalstellen)
private $Y;
// Auf einen Jahreslohn hochgerechnetes RE4 in €, C (2 Dezimalstellen)
// nach Abzug der Freibetraege nach § 39 b Abs. 2 Satz 3 und 4.
private $ZRE4;
// Auf einen Jahreslohn hochgerechnetes RE4 in €, C (2 Dezimalstellen)
private $ZRE4J;
// Auf einen Jahreslohn hochgerechnetes RE4 in €, C (2 Dezimalstellen)
// nach Abzug des Versorgungsfreibetrags und des Alterentlastungsbetrags
// zur Berechnung der Vorsorgepauschale in €, Cent (2 Dezimalstellen)
private $ZRE4VP;
// Feste Tabellenfreibetraege (ohne Vorsorgepauschale) in €, Cent
// (2 Dezimalstellen)
private $ZTABFB;
// Auf einen Jahreslohn hochgerechnetes (VBEZ abzueglich FVB) in
// EURO, C (2 Dezimalstellen)
private $ZVBEZ;
// Auf einen Jahreslohn hochgerechnetes VBEZ in €, C (2 Dezimalstellen)
private $ZVBEZJ;
// Zu versteuerndes Einkommen in €, C (2 Dezimalstellen)
private $ZVE;
// Zwischenfelder zu X fuer die Berechnung der Steuer nach § 39b
// Abs. 2 Satz 7 EStG in €
private $ZX;
private $ZZX;
private $HOCH;
private $VERGL;
// Jahreswert der beruecksichtigten Beitraege zur privaten Basis-Krankenversicherung und
// privaten Pflege-Pflichtversicherung (ggf. auch die Mindestvorsorgepauschale) in Cent.
private $VKV;
/**
* Input variables
*/
// 1, wenn die Anwendung des Faktorverfahrens gewaehlt wurden (nur in Steuerklasse IV)
private $af;
// Auf die Vollendung des 64. Lebensjahres folgende
// Kalenderjahr (erforderlich, wenn ALTER1=1)
private $AJAHR;
// 1, wenn das 64. Lebensjahr zu Beginn des Kalenderjahres vollendet wurde, in dem
// der Lohnzahlungszeitraum endet (§ 24 a EStG), sonst = 0
private $ALTER1;
// in VKAPA und VMT enthaltene Entschaedigungen nach §24 Nummer 1 EStG in Cent
private $ENTSCH;
// eingetragener Faktor mit drei Nachkommastellen
private $f;
// Jahresfreibetrag nach Massgabe der Eintragungen auf der
// Lohnsteuerkarte in Cents (ggf. 0)
private $JFREIB;
// Jahreshinzurechnungsbetrag in Cents (ggf. 0)
private $JHINZU;
// Voraussichtlicher Jahresarbeitslohn ohne sonstige Bezuege und ohne Verguetung fuer mehrjaehrige Taetigkeit in Cent.
// Anmerkung: Die Eingabe dieses Feldes (ggf. 0) ist erforderlich bei Eingabe „sonsti-ger Bezuege“ (Feld SONSTB)
// oder bei Eingabe der „Verguetung fuer mehrjaehrige Taetigkeit“ (Feld VMT).
// Sind in einem vorangegangenen Abrechnungszeitraum bereits sonstige Bezuege gezahlt worden, so sind sie dem
// voraussichtlichen Jahresarbeitslohn hinzuzurechnen. Verguetungen fuer mehrere Jahres aus einem vorangegangenen
// Abrechnungszeitraum sind in voller Hoehe hinzuzurechnen.
private $JRE4;
// In JRE4 enthaltene Versorgungsbezuege in Cents (ggf. 0)
private $JVBEZ;
// Merker fuer die Vorsorgepauschale
// 2 = der Arbeitnehmer ist NICHT in der gesetzlichen Rentenversicherung versichert.
//
// 1 = der Arbeitnehmer ist in der gesetzlichen Rentenversicherung versichert, es gilt die
// Beitragsbemessungsgrenze OST.
//
// 0 = der Arbeitnehmer ist in der gesetzlichen Rentenversicherung versichert, es gilt die
// Beitragsbemessungsgrenze WEST.
private $KRV;
// Einkommensbezogener Zusatzbeitragssatz eines gesetzlich krankenversicherten Arbeitnehmers,
// auf dessen Basis der an die Krankenkasse zu zahlende Zusatzbeitrag berechnet wird,
// in Prozent (bspw. 0,90 fuer 0,90 %) mit 2 Dezimalstellen.
// Der von der Kranken-kasse festgesetzte Zusatzbeitragssatz ist bei Abweichungen unmassgeblich.
private $KVZ;
// Lohnzahlungszeitraum:
// 1 = Jahr
// 2 = Monat
// 3 = Woche
// 4 = Tag
private $LZZ;
// In der Lohnsteuerkarte des Arbeitnehmers eingetragener Freibetrag fuer
// den Lohnzahlungszeitraum in Cent
private $LZZFREIB;
// In der Lohnsteuerkarte des Arbeitnehmers eingetragener Hinzurechnungsbetrag
// fuer den Lohnzahlungszeitraum in Cent
private $LZZHINZU;
// Dem Arbeitgeber mitgeteilte Zahlungen des Arbeitnehmers zur privaten
// Kranken- bzw. Pflegeversicherung im Sinne des §10 Abs. 1 Nr. 3 EStG 2010
// als Monatsbetrag in Cent (der Wert ist inabhaengig vom Lohnzahlungszeitraum immer
// als Monatsbetrag anzugeben).
private $PKPV;
// Krankenversicherung:
// 0 = gesetzlich krankenversicherte Arbeitnehmer
// 1 = ausschliesslich privat krankenversicherte Arbeitnehmer OHNE Arbeitgeberzuschuss
// 2 = ausschliesslich privat krankenversicherte Arbeitnehmer MIT Arbeitgeberzuschuss
private $PKV;
// 1, wenn bei der sozialen Pflegeversicherung die Besonderheiten in Sachsen zu beruecksichtigen sind bzw.
// zu beruecksichtigen waeren, sonst 0.
private $PVS;
// 1, wenn er der Arbeitnehmer den Zuschlag zur sozialen Pflegeversicherung
// zu zahlen hat, sonst 0.
private $PVZ;
// Religionsgemeinschaft des Arbeitnehmers lt. Lohnsteuerkarte (bei
// keiner Religionszugehoerigkeit = 0)
private $R;
// Steuerpflichtiger Arbeitslohn vor Beruecksichtigung der Freibetraege
// fuer Versorgungsbezuege, des Altersentlastungsbetrags und des auf
// der Lohnsteuerkarte fuer den Lohnzahlungszeitraum eingetragenen
// Freibetrags in Cents.
private $RE4;
// Sonstige Bezuege (ohne Verguetung aus mehrjaehriger Taetigkeit) einschliesslich
// Sterbegeld bei Versorgungsbezuegen sowie Kapitalauszahlungen/Abfindungen,
// soweit es sich nicht um Bezuege fuer mehrere Jahre handelt in Cents (ggf. 0)
private $SONSTB;
// Sterbegeld bei Versorgungsbezuegen sowie Kapitalauszahlungen/Abfindungen,
// soweit es sich nicht um Bezuege fuer mehrere Jahre handelt
// (in SONSTB enthalten) in Cents
private $STERBE;
// Steuerklasse:
// 1 = I
// 2 = II
// 3 = III
// 4 = IV
// 5 = V
// 6 = VI
private $STKL;
// In RE4 enthaltene Versorgungsbezuege in Cents (ggf. 0)
private $VBEZ;
// Vorsorgungsbezug im Januar 2005 bzw. fuer den ersten vollen Monat
// in Cents
private $VBEZM;
// Voraussichtliche Sonderzahlungen im Kalenderjahr des Versorgungsbeginns
// bei Versorgungsempfaengern ohne Sterbegeld, Kapitalauszahlungen/Abfindungen
// bei Versorgungsbezuegen in Cents
private $VBEZS;
// In SONSTB enthaltene Versorgungsbezuege einschliesslich Sterbegeld
// in Cents (ggf. 0)
private $VBS;
// Jahr, in dem der Versorgungsbezug erstmalig gewaehrt wurde; werden
// mehrere Versorgungsbezuege gezahlt, so gilt der aelteste erstmalige Bezug
private $VJAHR;
// Kapitalauszahlungen / Abfindungen / Nachzahlungen bei Versorgungsbezuegen
// fuer mehrere Jahre in Cent (ggf. 0)
private $VKAPA;
// Verguetung fuer mehrjaehrige Taetigkeit ohne Kapitalauszahlungen und ohne Abfindungen
// bei Versorgungsbezuegen in Cent (ggf. 0)
private $VMT;
// Zahl der Freibetraege fuer Kinder (eine Dezimalstelle, nur bei Steuerklassen
// I, II, III und IV)
private $ZKF;
// Zahl der Monate, fuer die Versorgungsbezuege gezahlt werden (nur
// erforderlich bei Jahresberechnung (LZZ = 1)
private $ZMVB;
// In JRE4 enthaltene Entschaedigungen nach § 24 Nummer 1 EStG in Cent
private $JRE4ENT;
// In SONSTB enthaltene Entschaedigungen nach § 24 Nummer 1 EStG in Cent
private $SONSTENT;
/**
* Output variables
*/
// Bemessungsgrundlage fuer die Kirchenlohnsteuer in Cents
private $BK;
// Bemessungsgrundlage der sonstigen Einkuenfte (ohne Verguetung
// fuer mehrjaehrige Taetigkeit) fuer die Kirchenlohnsteuer in Cents
private $BKS;
private $BKV;
// Fuer den Lohnzahlungszeitraum einzubehaltende Lohnsteuer in Cents
private $LSTLZZ;
// Fuer den Lohnzahlungszeitraum einzubehaltender Solidaritaetszuschlag
// in Cents
private $SOLZLZZ;
// Solidaritaetszuschlag fuer sonstige Bezuege (ohne Verguetung fuer mehrjaehrige
// Taetigkeit) in Cents
private $SOLZS;
// Solidaritaetszuschlag fuer die Verguetung fuer mehrjaehrige Taetigkeit in
// Cents
private $SOLZV;
// Lohnsteuer fuer sonstige Einkuenfte (ohne Verguetung fuer mehrjaehrige
// Taetigkeit) in Cents
private $STS;
// Lohnsteuer fuer Verguetung fuer mehrjaehrige Taetigkeit in Cents
private $STV;
// Fuer den Lohnzahlungszeitraum beruecksichtigte Beitraege des Arbeitnehmers zur
// privaten Basis-Krankenversicherung und privaten Pflege-Pflichtversicherung (ggf. auch
// die Mindestvorsorgepauschale) in Cent beim laufenden Arbeitslohn. Fuer Zwecke der Lohn-
// steuerbescheinigung sind die einzelnen Ausgabewerte ausserhalb des eigentlichen Lohn-
// steuerbescheinigungsprogramms zu addieren; hinzuzurechnen sind auch die Ausgabewerte
// VKVSONST
private $VKVLZZ;
// Fuer den Lohnzahlungszeitraum beruecksichtigte Beitraege des Arbeitnehmers
// zur privaten Basis-Krankenversicherung und privaten Pflege-Pflichtversicherung (ggf.
// auch die Mindestvorsorgepauschale) in Cent bei sonstigen Bezuegen. Der Ausgabewert kann
// auch negativ sein. Fuer tarifermaessigt zu besteuernde Verguetungen fuer mehrjaehrige
// Taetigkeiten enthaelt der PAP keinen entsprechenden Ausgabewert.
private $VKVSONST;
// Verbrauchter Freibetrag bei Berechnung des laufenden Arbeitslohns, in Cent
private $VFRB;
// Verbrauchter Freibetrag bei Berechnung des voraussichtlichen Jahresarbeitslohns, in Cent
private $VFRBS1;
// Verbrauchter Freibetrag bei Berechnung der sonstigen Bezuege, in Cent
private $VFRBS2;
// Fuer die weitergehende Beruecksichtigung des Steuerfreibetrags nach dem DBA Tuerkei verfuegbares ZVE ueber
// dem Grundfreibetrag bei der Berechnung des laufenden Arbeitslohns, in Cent
private $WVFRB;
// Fuer die weitergehende Beruecksichtigung des Steuerfreibetrags nach dem DBA Tuerkei verfuegbares ZVE ueber dem Grundfreibetrag
// bei der Berechnung des voraussichtlichen Jahresarbeitslohns, in Cent
private $WVFRBO;
// Fuer die weitergehende Beruecksichtigung des Steuerfreibetrags nach dem DBA Tuerkei verfuegbares ZVE
// ueber dem Grundfreibetrag bei der Berechnung der sonstigen Bezuege, in Cent
private $WVFRBM;
public function __construct() {
$this->initialize();
}
protected function initialize() {
// Initialize internal variables
$this->ALTE = new BigDecimal(0);
$this->ANP = new BigDecimal(0);
$this->ANTEIL1 = new BigDecimal(0);
$this->BMG = new BigDecimal(0);
$this->BBGKVPV = new BigDecimal(0);
$this->BBGRV = new BigDecimal(0);
$this->DIFF = new BigDecimal(0);
$this->EFA = new BigDecimal(0);
$this->FVB = new BigDecimal(0);
$this->FVBSO = new BigDecimal(0);
$this->FVBZ = new BigDecimal(0);
$this->FVBZSO = new BigDecimal(0);
$this->GFB = new BigDecimal(0);
$this->HBALTE = new BigDecimal(0);
$this->HFVB = new BigDecimal(0);
$this->HFVBZ = new BigDecimal(0);
$this->HFVBZSO = new BigDecimal(0);
$this->J = 0;
$this->JBMG = new BigDecimal(0);
$this->JLFREIB = new BigDecimal(0);
$this->JLHINZU = new BigDecimal(0);
$this->JW = new BigDecimal(0);
$this->K = 0;
$this->KENNVMT = 0;
$this->KFB = new BigDecimal(0);
$this->KVSATZAG = new BigDecimal(0);
$this->KVSATZAN = new BigDecimal(0);
$this->KZTAB = 0;
$this->LSTJAHR = new BigDecimal(0);
$this->LST1 = new BigDecimal(0);
$this->LST2 = new BigDecimal(0);
$this->LST3 = new BigDecimal(0);
$this->LSTOSO = new BigDecimal(0);
$this->LSTSO = new BigDecimal(0);
$this->MIST = new BigDecimal(0);
$this->PVSATZAG = new BigDecimal(0);
$this->PVSATZAN = new BigDecimal(0);
$this->RVSATZAN = new BigDecimal(0);
$this->RW = new BigDecimal(0);
$this->SAP = new BigDecimal(0);
$this->SOLZFREI = new BigDecimal(0);
$this->SOLZJ = new BigDecimal(0);
$this->SOLZMIN = new BigDecimal(0);
$this->ST = new BigDecimal(0);
$this->ST1 = new BigDecimal(0);
$this->ST2 = new BigDecimal(0);
$this->STOVMT = new BigDecimal(0);
$this->TBSVORV = new BigDecimal(0);
$this->VBEZB = new BigDecimal(0);
$this->VBEZBSO = new BigDecimal(0);
$this->VHB = new BigDecimal(0);
$this->VSP = new BigDecimal(0);
$this->VSPN = new BigDecimal(0);
$this->VSP1 = new BigDecimal(0);
$this->VSP2 = new BigDecimal(0);
$this->VSP3 = new BigDecimal(0);
$this->W1STKL5 = new BigDecimal(0);
$this->W2STKL5 = new BigDecimal(0);
$this->W3STKL5 = new BigDecimal(0);
$this->VSPMAX1 = new BigDecimal(0);
$this->VSPMAX2 = new BigDecimal(0);
$this->VSPO = new BigDecimal(0);
$this->VSPREST = new BigDecimal(0);
$this->VSPVOR = new BigDecimal(0);
$this->X = new BigDecimal(0);
$this->Y = new BigDecimal(0);
$this->ZRE4 = new BigDecimal(0);
$this->ZRE4J = new BigDecimal(0);
$this->ZRE4VP = new BigDecimal(0);
$this->ZTABFB = new BigDecimal(0);
$this->ZVBEZ = new BigDecimal(0);
$this->ZVBEZJ = new BigDecimal(0);
$this->ZVE = new BigDecimal(0);
$this->ZX = new BigDecimal(0);
$this->ZZX = new BigDecimal(0);
$this->HOCH = new BigDecimal(0);
$this->VERGL = new BigDecimal(0);
$this->VKV = new BigDecimal(0);
// Initialize input variables
$this->af = 1;
$this->AJAHR = 0;
$this->ALTER1 = 0;
$this->ENTSCH = new BigDecimal(0);
$this->f = 1.0;
$this->JFREIB = new BigDecimal(0);
$this->JHINZU = new BigDecimal(0);
$this->JRE4 = new BigDecimal(0);
$this->JVBEZ = new BigDecimal(0);
$this->KRV = 0;
$this->KVZ = new BigDecimal(0);
$this->LZZ = 0;
$this->LZZFREIB = new BigDecimal(0);
$this->LZZHINZU = new BigDecimal(0);
$this->PKPV = new BigDecimal(0);
$this->PKV = 0;
$this->PVS = 0;
$this->PVZ = 0;
$this->R = 0;
$this->RE4 = new BigDecimal(0);
$this->SONSTB = new BigDecimal(0);
$this->STERBE = new BigDecimal(0);
$this->STKL = 0;
$this->VBEZ = new BigDecimal(0);
$this->VBEZM = new BigDecimal(0);
$this->VBEZS = new BigDecimal(0);
$this->VBS = new BigDecimal(0);
$this->VJAHR = 0;
$this->VKAPA = new BigDecimal(0);
$this->VMT = new BigDecimal(0);
$this->ZKF = new BigDecimal(0);
$this->ZMVB = 0;
$this->JRE4ENT = BigDecimal::zero();
$this->SONSTENT = BigDecimal::zero();
// Initialize output variables
$this->BK = new BigDecimal(0);
$this->BKS = new BigDecimal(0);
$this->BKV = new BigDecimal(0);
$this->LSTLZZ = new BigDecimal(0);
$this->SOLZLZZ = new BigDecimal(0);
$this->SOLZS = new BigDecimal(0);
$this->SOLZV = new BigDecimal(0);
$this->STS = new BigDecimal(0);
$this->STV = new BigDecimal(0);
$this->VKVLZZ = new BigDecimal(0);
$this->VKVSONST = new BigDecimal(0);
$this->VFRB = new BigDecimal(0);
$this->VFRBS1 = new BigDecimal(0);
$this->VFRBS2 = new BigDecimal(0);
$this->WVFRB = new BigDecimal(0);
$this->WVFRBO = new BigDecimal(0);
$this->WVFRBM = new BigDecimal(0);
// Initialize "constants"
$this->TAB1 = array(BigDecimal::valueOf(0.0), BigDecimal::valueOf(0.4), BigDecimal::valueOf(0.384), BigDecimal::valueOf(0.368), BigDecimal::valueOf(0.352), BigDecimal::valueOf(0.336), BigDecimal::valueOf(0.32), BigDecimal::valueOf(0.304), BigDecimal::valueOf(0.288), BigDecimal::valueOf(0.272), BigDecimal::valueOf(0.256), BigDecimal::valueOf(0.24), BigDecimal::valueOf(0.224), BigDecimal::valueOf(0.208), BigDecimal::valueOf(0.192), BigDecimal::valueOf(0.176), BigDecimal::valueOf(0.16), BigDecimal::valueOf(0.152), BigDecimal::valueOf(0.144), BigDecimal::valueOf(0.136), BigDecimal::valueOf(0.128), BigDecimal::valueOf(0.12), BigDecimal::valueOf(0.112), BigDecimal::valueOf(0.104), BigDecimal::valueOf(0.096), BigDecimal::valueOf(0.088), BigDecimal::valueOf(0.08), BigDecimal::valueOf(0.072), BigDecimal::valueOf(0.064), BigDecimal::valueOf(0.056), BigDecimal::valueOf(0.048), BigDecimal::valueOf(0.04), BigDecimal::valueOf(0.032), BigDecimal::valueOf(0.024), BigDecimal::valueOf(0.016), BigDecimal::valueOf(0.008), BigDecimal::valueOf(0.0));
$this->TAB2 = array(BigDecimal::valueOf(0), BigDecimal::valueOf(3000), BigDecimal::valueOf(2880), BigDecimal::valueOf(2760), BigDecimal::valueOf(2640), BigDecimal::valueOf(2520), BigDecimal::valueOf(2400), BigDecimal::valueOf(2280), BigDecimal::valueOf(2160), BigDecimal::valueOf(2040), BigDecimal::valueOf(1920), BigDecimal::valueOf(1800), BigDecimal::valueOf(1680), BigDecimal::valueOf(1560), BigDecimal::valueOf(1440), BigDecimal::valueOf(1320), BigDecimal::valueOf(1200), BigDecimal::valueOf(1140), BigDecimal::valueOf(1080), BigDecimal::valueOf(1020), BigDecimal::valueOf(960), BigDecimal::valueOf(900), BigDecimal::valueOf(840), BigDecimal::valueOf(780), BigDecimal::valueOf(720), BigDecimal::valueOf(660), BigDecimal::valueOf(600), BigDecimal::valueOf(540), BigDecimal::valueOf(480), BigDecimal::valueOf(420), BigDecimal::valueOf(360), BigDecimal::valueOf(300), BigDecimal::valueOf(240), BigDecimal::valueOf(180), BigDecimal::valueOf(120), BigDecimal::valueOf(60), BigDecimal::valueOf(0));
$this->TAB3 = array(BigDecimal::valueOf(0), BigDecimal::valueOf(900), BigDecimal::valueOf(864), BigDecimal::valueOf(828), BigDecimal::valueOf(792), BigDecimal::valueOf(756), BigDecimal::valueOf(720), BigDecimal::valueOf(684), BigDecimal::valueOf(648), BigDecimal::valueOf(612), BigDecimal::valueOf(576), BigDecimal::valueOf(540), BigDecimal::valueOf(504), BigDecimal::valueOf(468), BigDecimal::valueOf(432), BigDecimal::valueOf(396), BigDecimal::valueOf(360), BigDecimal::valueOf(342), BigDecimal::valueOf(324), BigDecimal::valueOf(306), BigDecimal::valueOf(288), BigDecimal::valueOf(270), BigDecimal::valueOf(252), BigDecimal::valueOf(234), BigDecimal::valueOf(216), BigDecimal::valueOf(198), BigDecimal::valueOf(180), BigDecimal::valueOf(162), BigDecimal::valueOf(144), BigDecimal::valueOf(126), BigDecimal::valueOf(108), BigDecimal::valueOf(90), BigDecimal::valueOf(72), BigDecimal::valueOf(54), BigDecimal::valueOf(36), BigDecimal::valueOf(18), BigDecimal::valueOf(0));
$this->TAB4 = array(BigDecimal::valueOf(0.0), BigDecimal::valueOf(0.4), BigDecimal::valueOf(0.384), BigDecimal::valueOf(0.368), BigDecimal::valueOf(0.352), BigDecimal::valueOf(0.336), BigDecimal::valueOf(0.32), BigDecimal::valueOf(0.304), BigDecimal::valueOf(0.288), BigDecimal::valueOf(0.272), BigDecimal::valueOf(0.256), BigDecimal::valueOf(0.24), BigDecimal::valueOf(0.224), BigDecimal::valueOf(0.208), BigDecimal::valueOf(0.192), BigDecimal::valueOf(0.176), BigDecimal::valueOf(0.16), BigDecimal::valueOf(0.152), BigDecimal::valueOf(0.144), BigDecimal::valueOf(0.136), BigDecimal::valueOf(0.128), BigDecimal::valueOf(0.12), BigDecimal::valueOf(0.112), BigDecimal::valueOf(0.104), BigDecimal::valueOf(0.096), BigDecimal::valueOf(0.088), BigDecimal::valueOf(0.08), BigDecimal::valueOf(0.072), BigDecimal::valueOf(0.064), BigDecimal::valueOf(0.056), BigDecimal::valueOf(0.048), BigDecimal::valueOf(0.04), BigDecimal::valueOf(0.032), BigDecimal::valueOf(0.024), BigDecimal::valueOf(0.016), BigDecimal::valueOf(0.008), BigDecimal::valueOf(0.0));
$this->TAB5 = array(BigDecimal::valueOf(0), BigDecimal::valueOf(1900), BigDecimal::valueOf(1824), BigDecimal::valueOf(1748), BigDecimal::valueOf(1672), BigDecimal::valueOf(1596), BigDecimal::valueOf(1520), BigDecimal::valueOf(1444), BigDecimal::valueOf(1368), BigDecimal::valueOf(1292), BigDecimal::valueOf(1216), BigDecimal::valueOf(1140), BigDecimal::valueOf(1064), BigDecimal::valueOf(988), BigDecimal::valueOf(912), BigDecimal::valueOf(836), BigDecimal::valueOf(760), BigDecimal::valueOf(722), BigDecimal::valueOf(684), BigDecimal::valueOf(646), BigDecimal::valueOf(608), BigDecimal::valueOf(570), BigDecimal::valueOf(532), BigDecimal::valueOf(494), BigDecimal::valueOf(456), BigDecimal::valueOf(418), BigDecimal::valueOf(380), BigDecimal::valueOf(342), BigDecimal::valueOf(304), BigDecimal::valueOf(266), BigDecimal::valueOf(228), BigDecimal::valueOf(190), BigDecimal::valueOf(152), BigDecimal::valueOf(114), BigDecimal::valueOf(76), BigDecimal::valueOf(38), BigDecimal::valueOf(0));
$this->ZAHL1 = BigDecimal::one();
$this->ZAHL2 = new BigDecimal(2);
$this->ZAHL5 = new BigDecimal(5);
$this->ZAHL7 = new BigDecimal(7);
$this->ZAHL12 = new BigDecimal(12);
$this->ZAHL100 = new BigDecimal(100);
$this->ZAHL360 = new BigDecimal(360);
$this->ZAHL500 = new BigDecimal(500);
$this->ZAHL700 = new BigDecimal(700);
$this->ZAHL1000 = new BigDecimal(1000);
$this->ZAHL10000 = new BigDecimal(10000);
}
public function getBk() {
return $this->BK;
}
public function getBks() {
return $this->BKS;
}
public function getBkv() {
return $this->BKV;
}
public function getLstlzz() {
return $this->LSTLZZ;
}
public function getSolzlzz() {
return $this->SOLZLZZ;
}
public function getSolzs() {
return $this->SOLZS;
}
public function getSolzv() {
return $this->SOLZV;
}
public function getSts() {
return $this->STS;
}
public function getStv() {
return $this->STV;
}
public function getVkvlzz() {
return $this->VKVLZZ;
}
public function getVkvsonst() {
return $this->VKVSONST;
}
public function getVfrb() {
return $this->VFRB;
}
public function getVfrbs1() {
return $this->VFRBS1;
}
public function getVfrbs2() {
return $this->VFRBS2;
}
public function getWvfrb() {
return $this->WVFRB;
}
public function getWvfrbo() {
return $this->WVFRBO;
}
public function getWvfrbm() {
return $this->WVFRBM;
}
public function setAf($value) {
$this->af = $value;
}
public function setAjahr($value) {
$this->AJAHR = $value;
}
public function setAlter1($value) {
$this->ALTER1 = $value;
}
public function setEntsch($value) {
$this->ENTSCH = BigDecimal::valueOf($value);
}
public function setF($value) {
$this->f = $value;
}
public function setJfreib($value) {
$this->JFREIB = BigDecimal::valueOf($value);
}
public function setJhinzu($value) {
$this->JHINZU = BigDecimal::valueOf($value);
}
public function setJre4($value) {
$this->JRE4 = BigDecimal::valueOf($value);
}
public function setJvbez($value) {
$this->JVBEZ = BigDecimal::valueOf($value);
}
public function setKrv($value) {
$this->KRV = $value;
}
public function setKvz($value) {
$this->KVZ = BigDecimal::valueOf($value);
}
public function setLzz($value) {
$this->LZZ = $value;
}
public function setLzzfreib($value) {
$this->LZZFREIB = BigDecimal::valueOf($value);
}
public function setLzzhinzu($value) {
$this->LZZHINZU = BigDecimal::valueOf($value);
}
public function setPkpv($value) {
$this->PKPV = BigDecimal::valueOf($value);
}
public function setPkv($value) {
$this->PKV = $value;
}
public function setPvs($value) {
$this->PVS = $value;
}
public function setPvz($value) {
$this->PVZ = $value;
}
public function setR($value) {
$this->R = $value;
}
public function setRe4($value) {
$this->RE4 = BigDecimal::valueOf($value);
}
public function setSonstb($value) {
$this->SONSTB = BigDecimal::valueOf($value);
}
public function setSterbe($value) {
$this->STERBE = BigDecimal::valueOf($value);
}
public function setStkl($value) {
$this->STKL = $value;
}
public function setVbez($value) {
$this->VBEZ = BigDecimal::valueOf($value);
}
public function setVbezm($value) {
$this->VBEZM = BigDecimal::valueOf($value);
}
public function setVbezs($value) {
$this->VBEZS = BigDecimal::valueOf($value);
}
public function setVbs($value) {
$this->VBS = BigDecimal::valueOf($value);
}
public function setVjahr($value) {
$this->VJAHR = $value;
}
public function setVkapa($value) {
$this->VKAPA = BigDecimal::valueOf($value);
}
public function setVmt($value) {
$this->VMT = BigDecimal::valueOf($value);
}
public function setZkf($value) {
$this->ZKF = BigDecimal::valueOf($value);
}
public function setZmvb($value) {
$this->ZMVB = $value;
}
public function setJre4ent($value) {
$this->JRE4ENT = BigDecimal::valueOf($value);
}
public function setSonstent($value) {
$this->SONSTENT = BigDecimal::valueOf($value);
}
/**
* PROGRAMMABLAUFPLAN, PAP Seite 13
*/
public function MAIN() {
$this->MPARA();
$this->MRE4JL();
$this->VBEZBSO = BigDecimal::zero();
$this->KENNVMT = 0;
$this->MRE4();
$this->MRE4ABZ();
$this->MBERECH();
$this->MSONST();
$this->MVMT();
}
/**
* Zuweisung von Werten fuer bestimmte Sozialversicherungsparameter PAP Seite 14
*/
protected function MPARA() {
if ($this->KRV < 2) {
if ($this->KRV == 0) {
$this->BBGRV = new BigDecimal(76200);
} else {
$this->BBGRV = new BigDecimal(68400);
}
$this->RVSATZAN = BigDecimal::valueOf(0.0935);
$this->TBSVORV = BigDecimal::valueOf(0.68);
}
$this->BBGKVPV = new BigDecimal(52200);
$this->KVSATZAN = $this->KVZ->divide($this->ZAHL100)->add(BigDecimal::valueOf(0.07));
$this->KVSATZAG = BigDecimal::valueOf(0.07);
if ($this->PVS == 1) {
$this->PVSATZAN = BigDecimal::valueOf(0.01775);
$this->PVSATZAG = BigDecimal::valueOf(0.00775);
} else {
$this->PVSATZAN = BigDecimal::valueOf(0.01275);
$this->PVSATZAG = BigDecimal::valueOf(0.01275);
}
if ($this->PVZ == 1) {
$this->PVSATZAN = $this->PVSATZAN->add(BigDecimal::valueOf(0.0025));
}
$this->W1STKL5 = new BigDecimal(10240);
$this->W2STKL5 = new BigDecimal(27029);
$this->W3STKL5 = new BigDecimal(205043);
$this->GFB = new BigDecimal(8820);
$this->SOLZFREI = new BigDecimal(972);
}
/**
* Ermittlung des Jahresarbeitslohns nach § 39 b Abs. 2 Satz 2 EStG, PAP Seite 15
*/
protected function MRE4JL() {
if ($this->LZZ == 1) {
$this->ZRE4J = $this->RE4->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->ZVBEZJ = $this->VBEZ->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->JLFREIB = $this->LZZFREIB->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->JLHINZU = $this->LZZHINZU->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
} else {
if ($this->LZZ == 2) {
$this->ZRE4J = $this->RE4->multiply($this->ZAHL12)->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->ZVBEZJ = $this->VBEZ->multiply($this->ZAHL12)->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->JLFREIB = $this->LZZFREIB->multiply($this->ZAHL12)->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->JLHINZU = $this->LZZHINZU->multiply($this->ZAHL12)->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
} else {
if ($this->LZZ == 3) {
$this->ZRE4J = $this->RE4->multiply($this->ZAHL360)->divide($this->ZAHL700, 2, BigDecimal::ROUND_DOWN);
$this->ZVBEZJ = $this->VBEZ->multiply($this->ZAHL360)->divide($this->ZAHL700, 2, BigDecimal::ROUND_DOWN);
$this->JLFREIB = $this->LZZFREIB->multiply($this->ZAHL360)->divide($this->ZAHL700, 2, BigDecimal::ROUND_DOWN);
$this->JLHINZU = $this->LZZHINZU->multiply($this->ZAHL360)->divide($this->ZAHL700, 2, BigDecimal::ROUND_DOWN);
} else {
$this->ZRE4J = $this->RE4->multiply($this->ZAHL360)->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->ZVBEZJ = $this->VBEZ->multiply($this->ZAHL360)->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->JLFREIB = $this->LZZFREIB->multiply($this->ZAHL360)->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->JLHINZU = $this->LZZHINZU->multiply($this->ZAHL360)->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
}
}
}
if ($this->af == 0) {
$this->f = 1;
}
}
/**
* Freibetraege fuer Versorgungsbezuege, Altersentlastungsbetrag (§ 39b Abs. 2 Satz 3 EStG), PAP Seite 16
*/
protected function MRE4() {
if ($this->ZVBEZJ->compareTo(BigDecimal::zero()) == 0) {
$this->FVBZ = BigDecimal::zero();
$this->FVB = BigDecimal::zero();
$this->FVBZSO = BigDecimal::zero();
$this->FVBSO = BigDecimal::zero();
} else {
if ($this->VJAHR < 2006) {
$this->J = 1;
} else {
if ($this->VJAHR < 2040) {
$this->J = $this->VJAHR - 2004;
} else {
$this->J = 36;
}
}
if ($this->LZZ == 1) {
$this->VBEZB = $this->VBEZM->multiply(BigDecimal::valueOf($this->ZMVB))->add($this->VBEZS);
$this->HFVB = $this->TAB2[$this->J]->divide($this->ZAHL12)->multiply(BigDecimal::valueOf($this->ZMVB));
$this->FVBZ = $this->TAB3[$this->J]->divide($this->ZAHL12)->multiply(BigDecimal::valueOf($this->ZMVB))->setScale(0, BigDecimal::ROUND_UP);
} else {
$this->VBEZB = $this->VBEZM->multiply($this->ZAHL12)->add($this->VBEZS)->setScale(2, BigDecimal::ROUND_DOWN);
$this->HFVB = $this->TAB2[$this->J];
$this->FVBZ = $this->TAB3[$this->J];
}
$this->FVB = $this->VBEZB->multiply($this->TAB1[$this->J])->divide($this->ZAHL100)->setScale(2, BigDecimal::ROUND_UP);
if ($this->FVB->compareTo($this->HFVB) == 1) {
$this->FVB = $this->HFVB;
}
if ($this->FVB->compareTo($this->ZVBEZJ) == 1) {
$this->FVB = $this->ZVBEZJ;
}
$this->FVBSO = $this->FVB->add($this->VBEZBSO->multiply($this->TAB1[$this->J])->divide($this->ZAHL100))->setScale(2, BigDecimal::ROUND_UP);
if ($this->FVBSO->compareTo($this->TAB2[$this->J]) == 1) {
$this->FVBSO = $this->TAB2[$this->J];
}
$this->HFVBZSO = $this->VBEZB->add($this->VBEZBSO)->divide($this->ZAHL100)->subtract($this->FVBSO)->setScale(2, BigDecimal::ROUND_DOWN);
$this->FVBZSO = $this->FVBZ->add($this->VBEZBSO->divide($this->ZAHL100))->setScale(0, BigDecimal::ROUND_UP);
if ($this->FVBZSO->compareTo($this->HFVBZSO) == 1) {
$this->FVBZSO = $this->HFVBZSO->setScale(0, BigDecimal::ROUND_UP);
}
if ($this->FVBZSO->compareTo($this->TAB3[$this->J]) == 1) {
$this->FVBZSO = $this->TAB3[$this->J];
}
$this->HFVBZ = $this->VBEZB->divide($this->ZAHL100)->subtract($this->FVB)->setScale(2, BigDecimal::ROUND_DOWN);
if ($this->FVBZ->compareTo($this->HFVBZ) == 1) {
$this->FVBZ = $this->HFVBZ->setScale(0, BigDecimal::ROUND_UP);
}
}
$this->MRE4ALTE();
}
/**
* Altersentlastungsbetrag (§ 39b Abs. 2 Satz 3 EStG), PAP Seite 17
*/
protected function MRE4ALTE() {
if ($this->ALTER1 == 0) {
$this->ALTE = BigDecimal::zero();
} else {
if ($this->AJAHR < 2006) {
$this->K = 1;
} else {
if ($this->AJAHR < 2040) {
$this->K = $this->AJAHR - 2004;
} else {
$this->K = 36;
}
}
$this->BMG = $this->ZRE4J->subtract($this->ZVBEZJ);
$this->ALTE = $this->BMG->multiply($this->TAB4[$this->K])->setScale(0, BigDecimal::ROUND_UP);
$this->HBALTE = $this->TAB5[$this->K];
if ($this->ALTE->compareTo($this->HBALTE) == 1) {
$this->ALTE = $this->HBALTE;
}
}
}
/**
* Ermittlung des Jahresarbeitslohns nach Abzug der Freibetraege nach § 39 b Abs. 2 Satz 3 und 4 EStG, PAP Seite 19
*/
protected function MRE4ABZ() {
$this->ZRE4 = $this->ZRE4J->subtract($this->FVB)->subtract($this->ALTE)->subtract($this->JLFREIB)->add($this->JLHINZU)->setScale(2, BigDecimal::ROUND_DOWN);
if ($this->ZRE4->compareTo(BigDecimal::zero()) == -1) {
$this->ZRE4 = BigDecimal::zero();
}
$this->ZRE4VP = $this->ZRE4J;
if ($this->KENNVMT == 2) {
$this->ZRE4VP = $this->ZRE4VP->subtract($this->ENTSCH->divide($this->ZAHL100))->setScale(2, BigDecimal::ROUND_DOWN);
}
$this->ZVBEZ = $this->ZVBEZJ->subtract($this->FVB)->setScale(2, BigDecimal::ROUND_DOWN);
if ($this->ZVBEZ->compareTo(BigDecimal::zero()) == -1) {
$this->ZVBEZ = BigDecimal::zero();
}
}
/**
* Berechnung fuer laufende Lohnzahlungszeitraueme Seite 20
*/
protected function MBERECH() {
$this->MZTABFB();
$this->VFRB = $this->ANP->add($this->FVB->add($this->FVBZ))->multiply($this->ZAHL100)->setScale(0, BigDecimal::ROUND_DOWN);
$this->MLSTJAHR();
$this->WVFRB = $this->ZVE->subtract($this->GFB)->multiply($this->ZAHL100)->setScale(0, BigDecimal::ROUND_DOWN);
if ($this->WVFRB->compareTo(BigDecimal::zero()) == -1) {
$this->WVFRB = BigDecimal::valueOf(0);
}
$this->LSTJAHR = $this->ST->multiply(BigDecimal::valueOf($this->f))->setScale(0, BigDecimal::ROUND_DOWN);
$this->UPLSTLZZ();
$this->UPVKVLZZ();
if ($this->ZKF->compareTo(BigDecimal::zero()) == 1) {
$this->ZTABFB = $this->ZTABFB->add($this->KFB);
$this->MRE4ABZ();
$this->MLSTJAHR();
$this->JBMG = $this->ST->multiply(BigDecimal::valueOf($this->f))->setScale(0, BigDecimal::ROUND_DOWN);
} else {
$this->JBMG = $this->LSTJAHR;
}
$this->MSOLZ();
}
/**
* Ermittlung der festen Tabellenfreibetraege (ohne Vorsorgepauschale), PAP Seite 21
*/
protected function MZTABFB() {
$this->ANP = BigDecimal::zero();
if ($this->ZVBEZ->compareTo(BigDecimal::zero()) >= 0 && $this->ZVBEZ->compareTo($this->FVBZ) == -1) {
$this->FVBZ = BigDecimal::valueOf($this->ZVBEZ->longValue());
}
if ($this->STKL < 6) {
if ($this->ZVBEZ->compareTo(BigDecimal::zero()) == 1) {
if ($this->ZVBEZ->subtract($this->FVBZ)->compareTo(BigDecimal::valueOf(102)) == -1) {
$this->ANP = $this->ZVBEZ->subtract($this->FVBZ)->setScale(0, BigDecimal::ROUND_UP);
} else {
$this->ANP = BigDecimal::valueOf(102);
}
}
} else {
$this->FVBZ = BigDecimal::valueOf(0);
$this->FVBZSO = BigDecimal::valueOf(0);
}
if ($this->STKL < 6) {
if ($this->ZRE4->compareTo($this->ZVBEZ) == 1) {
if ($this->ZRE4->subtract($this->ZVBEZ)->compareTo($this->ZAHL1000) == -1) {
$this->ANP = $this->ANP->add($this->ZRE4)->subtract($this->ZVBEZ)->setScale(0, BigDecimal::ROUND_UP);
} else {
$this->ANP = $this->ANP->add($this->ZAHL1000);
}
}
}
$this->KZTAB = 1;
if ($this->STKL == 1) {
$this->SAP = BigDecimal::valueOf(36);
$this->KFB = $this->ZKF->multiply(BigDecimal::valueOf(7356))->setScale(0, BigDecimal::ROUND_DOWN);
} else {
if ($this->STKL == 2) {
$this->EFA = BigDecimal::valueOf(1908);
$this->SAP = BigDecimal::valueOf(36);
$this->KFB = $this->ZKF->multiply(BigDecimal::valueOf(7356))->setScale(0, BigDecimal::ROUND_DOWN);
} else {
if ($this->STKL == 3) {
$this->KZTAB = 2;
$this->SAP = BigDecimal::valueOf(36);
$this->KFB = $this->ZKF->multiply(BigDecimal::valueOf(7356))->setScale(0, BigDecimal::ROUND_DOWN);
} else {
if ($this->STKL == 4) {
$this->SAP = BigDecimal::valueOf(36);
$this->KFB = $this->ZKF->multiply(BigDecimal::valueOf(3678))->setScale(0, BigDecimal::ROUND_DOWN);
} else {
if ($this->STKL == 5) {
$this->SAP = BigDecimal::valueOf(36);
$this->KFB = BigDecimal::zero();
} else {
$this->KFB = BigDecimal::zero();
}
}
}
}
}
$this->ZTABFB = $this->EFA->add($this->ANP)->add($this->SAP)->add($this->FVBZ)->setScale(2, BigDecimal::ROUND_DOWN);
}
/**
* Ermittlung Jahreslohnsteuer, PAP Seite 22
*/
protected function MLSTJAHR() {
$this->UPEVP();
if ($this->KENNVMT != 1) {
$this->ZVE = $this->ZRE4->subtract($this->ZTABFB)->subtract($this->VSP)->setScale(2, BigDecimal::ROUND_DOWN);
$this->UPMLST();
} else {
$this->ZVE = $this->ZRE4->subtract($this->ZTABFB)->subtract($this->VSP)->subtract($this->VMT->divide($this->ZAHL100))->subtract($this->VKAPA->divide($this->ZAHL100))->setScale(2, BigDecimal::ROUND_DOWN);
if ($this->ZVE->compareTo(BigDecimal::zero()) == -1) {
$this->ZVE = $this->ZVE->add($this->VMT->divide($this->ZAHL100))->add($this->VKAPA->divide($this->ZAHL100))->divide($this->ZAHL5)->setScale(2, BigDecimal::ROUND_DOWN);
$this->UPMLST();
$this->ST = $this->ST->multiply($this->ZAHL5)->setScale(0, BigDecimal::ROUND_DOWN);
} else {
$this->UPMLST();
$this->STOVMT = $this->ST;
$this->ZVE = $this->ZVE->add($this->VMT->add($this->VKAPA)->divide($this->ZAHL500))->setScale(2, BigDecimal::ROUND_DOWN);
$this->UPMLST();
$this->ST = $this->ST->subtract($this->STOVMT)->multiply($this->ZAHL5)->add($this->STOVMT)->setScale(0, BigDecimal::ROUND_DOWN);
}
}
}
/**
* PAP Seite 23
*/
protected function UPVKVLZZ() {
$this->UPVKV();
$this->JW = $this->VKV;
$this->UPANTEIL();
$this->VKVLZZ = $this->ANTEIL1;
}
/**
* PAP Seite 23
*/
protected function UPVKV() {
if ($this->PKV > 0) {
if ($this->VSP2->compareTo($this->VSP3) == 1) {
$this->VKV = $this->VSP2->multiply($this->ZAHL100);
} else {
$this->VKV = $this->VSP3->multiply($this->ZAHL100);
}
} else {
$this->VKV = BigDecimal::zero();
}
}
/**
* PAP Seite 24
*/
protected function UPLSTLZZ() {
$this->JW = $this->LSTJAHR->multiply($this->ZAHL100);
$this->UPANTEIL();
$this->LSTLZZ = $this->ANTEIL1;
}
/**
* Ermittlung der Jahreslohnsteuer aus dem Einkommensteuertarif. PAP Seite 25
*/
protected function UPMLST() {
if ($this->ZVE->compareTo($this->ZAHL1) == -1) {
$this->ZVE = BigDecimal::zero();
$this->X = BigDecimal::zero();
} else {
$this->X = $this->ZVE->divide(BigDecimal::valueOf($this->KZTAB))->setScale(0, BigDecimal::ROUND_DOWN);
}
if ($this->STKL < 5) {
$this->UPTAB17();
} else {
$this->MST5_6();
}
}
/**
* Vorsorgepauschale (§ 39b Absatz 2 Satz 5 Nummer 3 und Absatz 4 EStG)
* Achtung: Es wird davon ausgegangen, dass
* a) Es wird davon ausge-gangen, dassa) fuer die BBG (Ost) 60.000 Euro und fuer die BBG (West) 71.400 Euro festgelegt wird sowie
* b) der Beitragssatz zur Rentenversicherung auf 18,9 % gesenkt wird.
*
* PAP Seite 26
*/
protected function UPEVP() {
if ($this->KRV > 1) {
$this->VSP1 = BigDecimal::zero();
} else {
if ($this->ZRE4VP->compareTo($this->BBGRV) == 1) {
$this->ZRE4VP = $this->BBGRV;
}
$this->VSP1 = $this->TBSVORV->multiply($this->ZRE4VP)->setScale(2, BigDecimal::ROUND_DOWN);
$this->VSP1 = $this->VSP1->multiply($this->RVSATZAN)->setScale(2, BigDecimal::ROUND_DOWN);
}
$this->VSP2 = $this->ZRE4VP->multiply(BigDecimal::valueOf(0.12))->setScale(2, BigDecimal::ROUND_DOWN);
if ($this->STKL == 3) {
$this->VHB = BigDecimal::valueOf(3000);
} else {
$this->VHB = BigDecimal::valueOf(1900);
}
if ($this->VSP2->compareTo($this->VHB) == 1) {
$this->VSP2 = $this->VHB;
}
$this->VSPN = $this->VSP1->add($this->VSP2)->setScale(0, BigDecimal::ROUND_UP);
$this->MVSP();
if ($this->VSPN->compareTo($this->VSP) == 1) {
$this->VSP = $this->VSPN->setScale(2, BigDecimal::ROUND_DOWN);
}
}
/**
* Vorsorgepauschale (§39b Abs. 2 Satz 5 Nr 3 EStG) Vergleichsberechnung fuer Guenstigerpruefung, PAP Seite 27
*/
protected function MVSP() {
if ($this->ZRE4VP->compareTo($this->BBGKVPV) == 1) {
$this->ZRE4VP = $this->BBGKVPV;
}
if ($this->PKV > 0) {
if ($this->STKL == 6) {
$this->VSP3 = BigDecimal::zero();
} else {
$this->VSP3 = $this->PKPV->multiply($this->ZAHL12)->divide($this->ZAHL100);
if ($this->PKV == 2) {
$this->VSP3 = $this->VSP3->subtract($this->ZRE4VP->multiply($this->KVSATZAG->add($this->PVSATZAG)))->setScale(2, BigDecimal::ROUND_DOWN);
}
}
} else {
$this->VSP3 = $this->ZRE4VP->multiply($this->KVSATZAN->add($this->PVSATZAN))->setScale(2, BigDecimal::ROUND_DOWN);
}
$this->VSP = $this->VSP3->add($this->VSP1)->setScale(0, BigDecimal::ROUND_UP);
}
/**
* Lohnsteuer fuer die Steuerklassen V und VI (§ 39b Abs. 2 Satz 7 EStG), PAP Seite 28
*/
protected function MST5_6() {
$this->ZZX = $this->X;
if ($this->ZZX->compareTo($this->W2STKL5) == 1) {
$this->ZX = $this->W2STKL5;
$this->UP5_6();
if ($this->ZZX->compareTo($this->W3STKL5) == 1) {
$this->ST = $this->ST->add($this->W3STKL5->subtract($this->W2STKL5)->multiply(BigDecimal::valueOf(0.42)))->setScale(0, BigDecimal::ROUND_DOWN);
$this->ST = $this->ST->add($this->ZZX->subtract($this->W3STKL5)->multiply(BigDecimal::valueOf(0.45)))->setScale(0, BigDecimal::ROUND_DOWN);
} else {
$this->ST = $this->ST->add($this->ZZX->subtract($this->W2STKL5)->multiply(BigDecimal::valueOf(0.42)))->setScale(0, BigDecimal::ROUND_DOWN);
}
} else {
$this->ZX = $this->ZZX;
$this->UP5_6();
if ($this->ZZX->compareTo($this->W1STKL5) == 1) {
$this->VERGL = $this->ST;
$this->ZX = $this->W1STKL5;
$this->UP5_6();
$this->HOCH = $this->ST->add($this->ZZX->subtract($this->W1STKL5)->multiply(BigDecimal::valueOf(0.42)))->setScale(0, BigDecimal::ROUND_DOWN);
if ($this->HOCH->compareTo($this->VERGL) == -1) {
$this->ST = $this->HOCH;
} else {
$this->ST = $this->VERGL;
}
}
}
}
/**
* Unterprogramm zur Lohnsteuer fuer die Steuerklassen V und VI (§ 39b Abs. 2 Satz 7 EStG), PAP Seite 29
*/
protected function UP5_6() {
$this->X = $this->ZX->multiply(BigDecimal::valueOf(1.25))->setScale(2, BigDecimal::ROUND_DOWN);
$this->UPTAB17();
$this->ST1 = $this->ST;
$this->X = $this->ZX->multiply(BigDecimal::valueOf(0.75))->setScale(2, BigDecimal::ROUND_DOWN);
$this->UPTAB17();
$this->ST2 = $this->ST;
$this->DIFF = $this->ST1->subtract($this->ST2)->multiply($this->ZAHL2);
$this->MIST = $this->ZX->multiply(BigDecimal::valueOf(0.14))->setScale(0, BigDecimal::ROUND_DOWN);
if ($this->MIST->compareTo($this->DIFF) == 1) {
$this->ST = $this->MIST;
} else {
$this->ST = $this->DIFF;
}
}
/**
* Solidaritaetszuschlag, PAP Seite 30
*/
protected function MSOLZ() {
$this->SOLZFREI = $this->SOLZFREI->multiply(BigDecimal::valueOf($this->KZTAB));
if ($this->JBMG->compareTo($this->SOLZFREI) == 1) {
$this->SOLZJ = $this->JBMG->multiply(BigDecimal::valueOf(5.5))->divide($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
$this->SOLZMIN = $this->JBMG->subtract($this->SOLZFREI)->multiply(BigDecimal::valueOf(20))->divide($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
if ($this->SOLZMIN->compareTo($this->SOLZJ) == -1) {
$this->SOLZJ = $this->SOLZMIN;
}
$this->JW = $this->SOLZJ->multiply($this->ZAHL100)->setScale(0, BigDecimal::ROUND_DOWN);
$this->UPANTEIL();
$this->SOLZLZZ = $this->ANTEIL1;
} else {
$this->SOLZLZZ = BigDecimal::zero();
}
if ($this->R > 0) {
$this->JW = $this->JBMG->multiply($this->ZAHL100);
$this->UPANTEIL();
$this->BK = $this->ANTEIL1;
} else {
$this->BK = BigDecimal::zero();
}
}
/**
* Anteil von Jahresbetraegen fuer einen LZZ (§ 39b Abs. 2 Satz 9 EStG), PAP Seite 31
*/
protected function UPANTEIL() {
if ($this->LZZ == 1) {
$this->ANTEIL1 = $this->JW;
} else {
if ($this->LZZ == 2) {
$this->ANTEIL1 = $this->JW->divide($this->ZAHL12, 0, BigDecimal::ROUND_DOWN);
} else {
if ($this->LZZ == 3) {
$this->ANTEIL1 = $this->JW->multiply($this->ZAHL7)->divide($this->ZAHL360, 0, BigDecimal::ROUND_DOWN);
} else {
$this->ANTEIL1 = $this->JW->divide($this->ZAHL360, 0, BigDecimal::ROUND_DOWN);
}
}
}
}
/**
* Berechnung sonstiger Bezuege nach § 39b Abs. 3 Saetze 1 bis 8 EStG), PAP Seite 32
*/
protected function MSONST() {
$this->LZZ = 1;
if ($this->ZMVB == 0) {
$this->ZMVB = 12;
}
if ($this->SONSTB->compareTo(BigDecimal::zero()) == 0) {
$this->VKVSONST = BigDecimal::zero();
$this->LSTSO = BigDecimal::zero();
$this->STS = BigDecimal::zero();
$this->SOLZS = BigDecimal::zero();
$this->BKS = BigDecimal::zero();
} else {
$this->MOSONST();
$this->UPVKV();
$this->VKVSONST = $this->VKV;
$this->ZRE4J = $this->JRE4->add($this->SONSTB)->divide($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
$this->ZVBEZJ = $this->JVBEZ->add($this->VBS)->divide($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
$this->VBEZBSO = $this->STERBE;
$this->MRE4SONST();
$this->MLSTJAHR();
$this->WVFRBM = $this->ZVE->subtract($this->GFB)->multiply($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
if ($this->WVFRBM->compareTo(BigDecimal::zero()) == -1) {
$this->WVFRBM = BigDecimal::zero();
}
$this->UPVKV();
$this->VKVSONST = $this->VKV->subtract($this->VKVSONST);
$this->LSTSO = $this->ST->multiply($this->ZAHL100);
$this->STS = $this->LSTSO->subtract($this->LSTOSO)->multiply(BigDecimal::valueOf($this->f))->divide($this->ZAHL100, 0, BigDecimal::ROUND_DOWN)->multiply($this->ZAHL100);
if ($this->STS->compareTo(BigDecimal::zero()) == -1) {
$this->STS = BigDecimal::zero();
}
$this->SOLZS = $this->STS->multiply(BigDecimal::valueOf(5.5))->divide($this->ZAHL100, 0, BigDecimal::ROUND_DOWN);
if ($this->R > 0) {
$this->BKS = $this->STS;
} else {
$this->BKS = BigDecimal::zero();
}
}
}
/**
* Berechnung der Verguetung fuer mehrjaehrige Taetigkeit nach § 39b Abs. 3 Satz 9 und 10 EStG), PAP Seite 33
*/
protected function MVMT() {
if ($this->VKAPA->compareTo(BigDecimal::zero()) == -1) {
$this->VKAPA = BigDecimal::zero();
}
if ($this->VMT->add($this->VKAPA)->compareTo(BigDecimal::zero()) == 1) {
if ($this->LSTSO->compareTo(BigDecimal::zero()) == 0) {
$this->MOSONST();
$this->LST1 = $this->LSTOSO;
} else {
$this->LST1 = $this->LSTSO;
}
$this->VBEZBSO = $this->STERBE->add($this->VKAPA);
$this->ZRE4J = $this->JRE4->add($this->SONSTB)->add($this->VMT)->add($this->VKAPA)->divide($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
$this->ZVBEZJ = $this->JVBEZ->add($this->VBS)->add($this->VKAPA)->divide($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
$this->KENNVMT = 2;
$this->MRE4SONST();
$this->MLSTJAHR();
$this->LST3 = $this->ST->multiply($this->ZAHL100);
$this->MRE4ABZ();
$this->ZRE4VP = $this->ZRE4VP->subtract($this->JRE4ENT->divide($this->ZAHL100))->subtract($this->SONSTENT->divide($this->ZAHL100));
$this->KENNVMT = 1;
$this->MLSTJAHR();
$this->LST2 = $this->ST->multiply($this->ZAHL100);
$this->STV = $this->LST2->subtract($this->LST1);
$this->LST3 = $this->LST3->subtract($this->LST1);
if ($this->LST3->compareTo($this->STV) == -1) {
$this->STV = $this->LST3;
}
if ($this->STV->compareTo(BigDecimal::zero()) == -1) {
$this->STV = BigDecimal::zero();
} else {
$this->STV = $this->STV->multiply(BigDecimal::valueOf($this->f))->divide($this->ZAHL100, 0, BigDecimal::ROUND_DOWN)->multiply($this->ZAHL100);
}
$this->SOLZV = $this->STV->multiply(BigDecimal::valueOf(5.5))->divide($this->ZAHL100)->setScale(0, BigDecimal::ROUND_DOWN);
if ($this->R > 0) {
$this->BKV = $this->STV;
} else {
$this->BKV = BigDecimal::zero();
}
} else {
$this->STV = BigDecimal::zero();
$this->SOLZV = BigDecimal::zero();
$this->BKV = BigDecimal::zero();
}
}
/**
* Sonderberechnung ohne sonstige Bezuege fuer Berechnung bei sonstigen Bezuegen oder Verguetung fuer mehrjaehrige Taetigkeit, PAP Seite 34
*/
protected function MOSONST() {
$this->ZRE4J = $this->JRE4->divide($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
$this->ZVBEZJ = $this->JVBEZ->divide($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
$this->JLFREIB = $this->JFREIB->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->JLHINZU = $this->JHINZU->divide($this->ZAHL100, 2, BigDecimal::ROUND_DOWN);
$this->MRE4();
$this->MRE4ABZ();
$this->ZRE4VP = $this->ZRE4VP->subtract($this->JRE4ENT->divide($this->ZAHL100));
$this->MZTABFB();
$this->VFRBS1 = $this->ANP->add($this->FVB->add($this->FVBZ))->multiply($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
$this->MLSTJAHR();
$this->WVFRBO = $this->ZVE->subtract($this->GFB)->multiply($this->ZAHL100)->setScale(2, BigDecimal::ROUND_DOWN);
if ($this->WVFRBO->compareTo(BigDecimal::zero()) == -1) {
$this->WVFRBO = BigDecimal::zero();
}
$this->LSTOSO = $this->ST->multiply($this->ZAHL100);
}
/**
* Sonderberechnung mit sonstige Bezuege fuer Berechnung bei sonstigen Bezuegen oder Verguetung fuer mehrjaehrige Taetigkeit, PAP Seite 35
*/
protected function MRE4SONST() {
$this->MRE4();
$this->FVB = $this->FVBSO;
$this->MRE4ABZ();
$this->ZRE4VP = $this->ZRE4VP->subtract($this->JRE4ENT->divide($this->ZAHL100))->subtract($this->SONSTENT->divide($this->ZAHL100));
$this->FVBZ = $this->FVBZSO;
$this->MZTABFB();
$this->VFRBS2 = $this->ANP->add($this->FVB)->add($this->FVBZ)->multiply($this->ZAHL100)->subtract($this->VFRBS1);
}
/**
* Tarifliche Einkommensteuer §32a EStG, PAP Seite 36
*/
protected function UPTAB17() {
if ($this->X->compareTo($this->GFB->add($this->ZAHL1)) == -1) {
$this->ST = BigDecimal::zero();
} else {
if ($this->X->compareTo(BigDecimal::valueOf(13770)) == -1) {
$this->Y = $this->X->subtract($this->GFB)->divide($this->ZAHL10000, 6, BigDecimal::ROUND_DOWN);
$this->RW = $this->Y->multiply(BigDecimal::valueOf(1007.27));
$this->RW = $this->RW->add(BigDecimal::valueOf(1400));
$this->ST = $this->RW->multiply($this->Y)->setScale(0, BigDecimal::ROUND_DOWN);
} else {
if ($this->X->compareTo(BigDecimal::valueOf(54058)) == -1) {
$this->Y = $this->X->subtract(BigDecimal::valueOf(13769))->divide($this->ZAHL10000, 6, BigDecimal::ROUND_DOWN);
$this->RW = $this->Y->multiply(BigDecimal::valueOf(223.76));
$this->RW = $this->RW->add(BigDecimal::valueOf(2397));
$this->RW = $this->RW->multiply($this->Y);
$this->ST = $this->RW->add(BigDecimal::valueOf(939.57))->setScale(0, BigDecimal::ROUND_DOWN);
} else {
if ($this->X->compareTo(BigDecimal::valueOf(256304)) == -1) {
$this->ST = $this->X->multiply(BigDecimal::valueOf(0.42))->subtract(BigDecimal::valueOf(8475.44))->setScale(0, BigDecimal::ROUND_DOWN);
} else {
$this->ST = $this->X->multiply(BigDecimal::valueOf(0.45))->subtract(BigDecimal::valueOf(16164.53))->setScale(0, BigDecimal::ROUND_DOWN);
}
}
}
}
$this->ST = $this->ST->multiply(BigDecimal::valueOf($this->KZTAB));
}
}