###############################################################################################################################
# Vereinfachte Berechnung des Nettogehalts bzw. der Nettopension von Angestellten und Pensionisten für 2001 bis 2024:
#
#  Berücksichtigt sind: Arbeitnehmer-, Verkehrs- und Pensionistenabsetzbetrag bzw. Sonderausgaben- und 
#  Webungskostenpauschale. Nicht berücksichtigt sind: Pendlerpauschale, Sachbezug, Alleinverdiener-, Alleinerzieher-, 
#  Unterhalts- und Kinderabsetzbetrag, etc.
#
# (c) 2014-2023 by Ing. Peter Grobner, peter@grobner.at, http://paudorf142.at/cgi-bin/brutto2netto.cgi
#------------------------------------------------------------------------------------------------------------------------------

###############################################################################################################################
# $netto=brutto2netto($brutto,$year,$m,$pens)
#                      \       \     \   \_ 0=Angestellte, 1=Pensionisten
#                       \       \     \____-1=Jahresgehalt, 0..12 Monatsgehalt, 13..14=erste/zweite Sonderzahlung
#                        \       \_________ Jahr der Versteuerung 
#                         \________________ Monatsbrutto
sub brutto2netto
{
 my ($minYEAR,$maxYEAR)=(2001,2024);                                 return      ($minYEAR,$maxYEAR)  if(0==scalar @_);

 my($brutto,$year,$m,$pens)=@_; $year||=1900+(localtime(time))[5];   return undef if($year<$minYEAR or $year>$maxYEAR);

 my $BG12=12*$brutto-12*SV($brutto,$year,0,$pens); my $N12=($BG12-ESt($BG12,$year,0,$pens,$brutto)); return $N12/12 if($m>=0
                                                                                                                   and $m<=12);

 my $BG13=   $brutto-   SV($brutto,$year,1,$pens); my $N13=($BG13-ESt($BG13,$year,1,$pens,$brutto)); return $N13    if($m==13);
                                                   my $N14=($BG13-ESt($BG13,$year,2,$pens,$brutto)); return $N14    if($m==14);

                                                                                                     return $N12+$N13+$N14;
}

###############################################################################################################################
# $svBetrag=SV($v,$year,$SZ,$pens)
#                \  \     \  \_ 0=Angestellte, 1=Pensionisten
#                 \  \     \___ 0=laufendes Monat, >0=Sonderzahlung, <0=SV-Quote
#                  \  \________ Jahr der Bemessung 
#                   \__________ Monatsbrutto
#
#    @werte=SV(-1,$year)
#    $Quote=SV($v,$year,-1);
#
sub SV
{
                  ## Geringfügigkeitsgrenze/M
                  #       ## Ausgleichstaxe (für Betriebe > 400MA) §9(2) BEinstG
                  #       #     ## Krankenversicherung  §51(3)1.a ASVG
                  #       #     #       ## Pensionsversicherung §51(3)2 ASVG
                  #       #     #       #          ## Grenze AL1%
                  #       #     #       #          #        ## Grenze AL2%
                  #       #     #       #          #        #        ## Grenze AL3%
 my %Wert=        #       #     #       #          #        #        #        ## SV-Höchstbeitragsgrundlage/M
 (                #       #     #       #          #        #        #        #
   1999   => [ 283.35, 148.25, 0.0340, 0.1025,    0.00,    0.00,    0.00, 3095.86 ],
   2000   => [ 289.02, 148.98, 0.0340, 0.1025,    0.00,    0.00,    0.00, 3139.47 ],
   2001   => [ 296.21, 149.71, 0.0340, 0.1025,    0.00,    0.00,    0.00, 3226.67 ],
   2002   => [ 301.54, 196.22, 0.0340, 0.1025,    0.00,    0.00,    0.00, 3270.00 ],
   2003   => [ 309.38, 196.22, 0.0340, 0.1025,    0.00,    0.00,    0.00, 3360.00 ],

   2004   => [ 316.19, 198.00, 0.0370, 0.1025,    0.00,    0.00,    0.00, 3450.00 ],

   2005   => [ 323.46, 201.00, 0.0375, 0.1025,    0.00,    0.00,    0.00, 3630.00 ],
   2006   => [ 333.16, 206.00, 0.0375, 0.1025,    0.00,    0.00,    0.00, 3750.00 ],
   2007   => [ 341.16, 209.00, 0.0375, 0.1025,    0.00,    0.00,    0.00, 3840.00 ],

   200801 => [ 349.01, 213.00, 0.0382, 0.1025,    0.00,    0.00,    0.00, 3930.00 ],
   200802 => [ 349.01, 213.00, 0.0382, 0.1025,    0.00,    0.00,    0.00, 3930.00 ],
   200803 => [ 349.01, 213.00, 0.0382, 0.1025,    0.00,    0.00,    0.00, 3930.00 ],
   200804 => [ 349.01, 213.00, 0.0382, 0.1025,    0.00,    0.00,    0.00, 3930.00 ],
   200805 => [ 349.01, 213.00, 0.0382, 0.1025,    0.00,    0.00,    0.00, 3930.00 ],
   200806 => [ 349.01, 213.00, 0.0382, 0.1025,    0.00,    0.00,    0.00, 3930.00 ],

   2008   => [ 349.01, 213.00, 0.0382, 0.1025, 1100.00, 1200.00, 1350.00, 3930.00 ],
   2009   => [ 357.74, 220.00, 0.0382, 0.1025, 1128.00, 1230.00, 1384.00, 4020.00 ],
   2010   => [ 366.33, 233.00, 0.0382, 0.1025, 1155.00, 1260.00, 1417.00, 4110.00 ],
   2011   => [ 374.02, 336.00, 0.0382, 0.1025, 1179.00, 1286.00, 1447.00, 4200.00 ],
   2012   => [ 376.26, 345.00, 0.0382, 0.1025, 1186.00, 1294.00, 1456.00, 4230.00 ],
   2013   => [ 386.80, 355.00, 0.0382, 0.1025, 1219.00, 1330.00, 1497.00, 4440.00 ],
   2014   => [ 395.31, 364.00, 0.0382, 0.1025, 1246.00, 1359.00, 1530.00, 4530.00 ],
   2015   => [ 405.98, 370.00, 0.0382, 0.1025, 1280.00, 1396.00, 1571.00, 4650.00 ],

   2016   => [ 415.72, 374.00, 0.0387, 0.1025, 1311.00, 1430.00, 1609.00, 4860.00 ],
   2017   => [ 425.70, 377.00, 0.0387, 0.1025, 1342.00, 1464.00, 1648.00, 4980.00 ],

   201801 => [ 438.05, 383.00, 0.0387, 0.1025, 1381.00, 1506.00, 1696.00, 5130.00 ],
   201802 => [ 438.05, 383.00, 0.0387, 0.1025, 1381.00, 1506.00, 1696.00, 5130.00 ],
   201803 => [ 438.05, 383.00, 0.0387, 0.1025, 1381.00, 1506.00, 1696.00, 5130.00 ],
   201804 => [ 438.05, 383.00, 0.0387, 0.1025, 1381.00, 1506.00, 1696.00, 5130.00 ],
   201805 => [ 438.05, 383.00, 0.0387, 0.1025, 1381.00, 1506.00, 1696.00, 5130.00 ],
   201806 => [ 438.05, 383.00, 0.0387, 0.1025, 1381.00, 1506.00, 1696.00, 5130.00 ],

   2018   => [ 438.05, 383.00, 0.0387, 0.1025, 1648.00, 1798.00, 1948.00, 5130.00 ],
   2019   => [ 446.81, 391.00, 0.0387, 0.1025, 1681.00, 1834.00, 1987.00, 5220.00 ],
   2020   => [ 460.66, 398.00, 0.0387, 0.1025, 1733.00, 1891.00, 2049.00, 5370.00 ],
   2021   => [ 475.86, 404.00, 0.0387, 0.1025, 1790.00, 1953.00, 2117.00, 5550.00 ],
   2022   => [ 485.85, 411.00, 0.0387, 0.1025, 1828.00, 1994.00, 2161.00, 5670.00 ],
   2023   => [ 500.91, 435.00, 0.0387, 0.1025, 1885.00, 2056.00, 2228.00, 5850.00 ],
   2024   => [ 500.91, 435.00, 0.0387, 0.1025, 1885.00, 2056.00, 2228.00, 5850.00 ],
 );          #    0       1     2       3          4        5        6        7      

 my($v,$year,$SZ,$pens)=@_; $year||=100*(1900+(localtime(time))[5])
                                           +1+(localtime(time))[6]; $year=~s/\d\d$// unless($Wert{$year});
                                                                        return undef unless($Wert{$year});

 return        @{$Wert{$year}} if($v==-1);  # Rückgabe der Wertetabelle

 return                         $v*0.051 if($pens);  # Pensionisten zahlen 5,1% Krankenversicherungsbeitrag
                                                     # laut https://www.ots.at/presseaussendung/OTS_20100526_OTS0176/
                                                     # seit mindestens 2010 ...

 return 0 if($v<=$Wert{$year}[0]);          # Geringfügigkeitsgrenze/M

 my $KV =        $Wert{$year}[2];           # Krankenversicherung  §51(3)1.a ASVG
 my $PV =        $Wert{$year}[3];           # Pensionsversicherung §51(3)2 ASVG
 my $ALV=   ($v<=$Wert{$year}[4])? 0.000    # Arbeitslosenversicherung §2a AMPFG
           :($v<=$Wert{$year}[5])? 0.010
           :($v<=$Wert{$year}[6])? 0.020
                                 : 0.030;
 my $AKU=              ($SZ>0)? 0: 0.005;   # AK-Umlage
 my $WBF=              ($SZ>0)? 0: 0.005;   # Wohnbauförderung

 my $max=        $Wert{$year}[7];           # SV-Höchstbeitragsgrundlage/M

 my $sv=($KV+$PV+$ALV+$AKU+$WBF)*($v<$max?
                                  $v:$max);
 return ($SZ<0)? $sv/$v:$sv;
}

###########################################################################################################################
# $lohnsteuer=LSt($v,$year,$SZ,$pens,$brutto)
#                  \  \     \   \     \__ Brutto wg. Vergleich mit Jahressechstel-Freigrenze
#                  \  \     \   \_______ 0=Angestellte, 1=Pensionisten
#                  \  \     \__________ 0=laufendes Monat, 1=erste Sonderzahlung, 2=zweite Sonderzahlung, -1=max Stufe
#                  \  \_______________ Jahr der Bemessung 
#                  \_________________ Bemessungsgrundlage=12*(Monatsbrutto-SV)
#
sub LStK { my($b,$year)=@_; return ESt(12*($b-SV($b,$year)),$year,-1);    } 
sub LStB { my($b,$year)=@_; return ESt(12*($b-SV($b,$year)),$year, 0)/12; } 
sub LSt  { return ESt(@_); } 
sub ESt
{                ## Jahressechstel-Freigrenze
                 #    ## Jahressechstel-Freibetrag
 my %Wert=       #    #    ## Steuerklassen-Grenzbeträge
 (               #    #    #        ##  Steuerklassen-Steuersätze, ...
                 #    #    #        #
   1999   => [ 1671, 618, 0- 3634, 0.1,  3634- 7267, 0.22,   7267-10901, 0.32,  10901-29070, 0.42, 29070, 0.5 ],
   2000   => [ 1671, 618, 0- 3640, 0.0,  3640- 7270, 0.21,   7270-21800, 0.31,  21800-50870, 0.41, 50870, 0.5 ],
   2001   => [ 1671, 618, 0- 3640, 0.0,  3640- 7270, 0.21,   7270-21800, 0.31,  21800-50870, 0.41, 50870, 0.5 ],

   2002   => [ 1680, 620, 0- 3640, 0.0,  3640- 7270, 0.21,   7270-21800, 0.31,  21800-50870, 0.41, 50870, 0.5 ],
   2003   => [ 1680, 620, 0- 3640, 0.0,  3640- 7270, 0.21,   7270-21800, 0.31,  21800-50870, 0.41, 50870, 0.5 ],
   2004   => [ 1900, 620, 0- 3640, 0.0,  3640- 7270, 0.21,   7270-21800, 0.31,  21800-50870, 0.41, 50870, 0.5 ],

   2005   => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],
   2006   => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],
   2007   => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],
   200801 => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],
   200802 => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],
   200803 => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],
   200804 => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],
   200805 => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],
   200806 => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],

   2008   => [ 2100, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000,              51000, 0.5 ],

   2009   => [ 2100, 620, 0-11000, 0.0, 11000-25000, 0.365, 25000-60000, 15125/35000,              60000, 0.5 ],
   2010   => [ 2100, 620, 0-11000, 0.0, 11000-25000, 0.365, 25000-60000, 15125/35000,              60000, 0.5 ],
   2011   => [ 2100, 620, 0-11000, 0.0, 11000-25000, 0.365, 25000-60000, 15125/35000,              60000, 0.5 ],
   2012   => [ 2100, 620, 0-11000, 0.0, 11000-25000, 0.365, 25000-60000, 15125/35000,              60000, 0.5 ],
   2013   => [ 2100, 620, 0-11000, 0.0, 11000-25000, 0.365, 25000-60000, 15125/35000,              60000, 0.5 ],
   2014   => [ 2100, 620, 0-11000, 0.0, 11000-25000, 0.365, 25000-60000, 15125/35000,              60000, 0.5 ],
   2015   => [ 2100, 620, 0-11000, 0.0, 11000-25000, 0.365, 25000-60000, 15125/35000,              60000, 0.5 ],

   2016   => [ 2100, 620, 0-11000, 0.0, 11000-18000, 0.25,  18000-31000, 0.35,
                                        31000-60000, 0.42,  60000-90000, 0.48,             90000-1000000, 0.5,
                                                                                                 1000000, 0.55 ],
   2017   => [ 2100, 620, 0-11000, 0.0, 11000-18000, 0.25,  18000-31000, 0.35,
                                        31000-60000, 0.42,  60000-90000, 0.48,             90000-1000000, 0.5,
                                                                                                 1000000, 0.55 ],
   2018   => [ 2100, 620, 0-11000, 0.0, 11000-18000, 0.25,  18000-31000, 0.35,
                                        31000-60000, 0.42,  60000-90000, 0.48,             90000-1000000, 0.5,
                                                                                                 1000000, 0.55 ],
   2019   => [ 2100, 620, 0-11000, 0.0, 11000-18000, 0.25,  18000-31000, 0.35,
                                        31000-60000, 0.42,  60000-90000, 0.48,             90000-1000000, 0.5,
                                                                                                 1000000, 0.55 ],
   2020   => [ 2100, 620, 0-11000, 0.0, 11000-18000, 0.20,  18000-31000, 0.35,
                                        31000-60000, 0.42,  60000-90000, 0.48,             90000-1000000, 0.5,
                                                                                                 1000000, 0.55 ],
   2021   => [ 2100, 620, 0-11000, 0.0, 11000-18000, 0.20,  18000-31000, 0.35,
                                        31000-60000, 0.42,  60000-90000, 0.48,             90000-1000000, 0.5,
                                                                                                 1000000, 0.55 ],
   #-------------------------------------------------------------------------------------------------------------
   # ÖkoStRefG 2022 Teil I)
   #  390. a) Die Senkung des Steuersatzes von 35% auf 30% gemäß § 33 Abs. 1 in der Fassung des Bundesgesetzes 
   #          BGBl. I Nr. xx/2022 tritt mit 1. Juli 2022 in Kraft und ist erstmalig anzuwenden, wenn
   #          - die Einkommensteuer veranlagt oder durch Veranlagung festgesetzt wird, 
   #            bei der Veranlagung für das Kalenderjahr 2023,
   #          - die Einkommensteuer (Lohnsteuer) durch Abzug eingehoben wird, für Lohnzahlungszeiträume, 
   #            die nach dem 31. Dezember 2022 enden.
   #       b) Für das Kalenderjahr 2022 ist die Senkung des Steuersatzes von 35% auf 30% wie folgt zu berücksichtigen:
   #          - Wenn die Einkommensteuer veranlagt oder durch Veranlagung festgesetzt wird, ist für das gesamte 
   #            Kalenderjahr ein Steuersatz von 32,5% anzuwenden.
   #          - Wenn die Einkommensteuer (Lohnsteuer) durch Abzug eingehoben wird, ist für Lohnzahlungszeiträume, 
   #            die nach dem 31. Dezember 2021 enden, ein Steuersatz von 32,5% anzuwenden. Wurde für derartige 
   #            Lohnzahlungszeiträume der Steuersatz von 32,5% noch nicht berücksichtigt, hat der Arbeitgeber 
   #            für seine Arbeitnehmer eine Aufrollung gemäß § 77 Abs. 3 so bald wie möglich, jedoch spätestens bis 
   #            31. Mai 2022 durchzuführen, sofern die technischen und organisatorischen Möglichkeiten dazu vorliegen.
   #
   #  391. a) Die Senkung des Steuersatzes von 42% auf 40% gemäß § 33 Abs. 1 in der Fassung des Bundesgesetzes 
   #          BGBl. I Nr. xx/2022 tritt mit 1. Juli 2023 in Kraft und ist erstmalig anzuwenden, wenn
   #          - die Einkommensteuer veranlagt wird, bei der Veranlagung für das Kalenderjahr 2024,
   #          - die Einkommensteuer (Lohnsteuer) durch Abzug eingehoben oder durch Veranlagung festgesetzt wird, 
   #            für Lohnzahlungszeiträume, die nach dem 31. Dezember 2023 enden.
   #       b) Für das Kalenderjahr 2023 ist die Senkung des Steuersatzes von 42% auf 40% wie folgt zu berücksichtigen:
   #          - Wenn die Einkommensteuer veranlagt oder durch Veranlagung festgesetzt wird, ist für das gesamte 
   #            Kalenderjahr ein Steuersatz von 41% anzuwenden.
   #          - Wenn die Einkommensteuer (Lohnsteuer) durch Abzug eingehoben wird, ist für Lohnzahlungszeiträume, 
   #            die nach dem 31. Dezember 2022 enden, ein Steuersatz von 41% anzuwenden.

   2022   => [ 2100, 620, 0-11000, 0.0, 11000-18000, 0.20,  18000-31000, 0.325,
                                        31000-60000, 0.42,  60000-90000, 0.48,             90000-1000000, 0.5,
                                                                                                 1000000, 0.55 ],
   #-------------------------------------------------------------------------------------------------------------
   # 163. Bundesgesetz, mit dem das Einkommensteuergesetz 1988, das Familienlastenausgleichsgesetz 1967
   # und das Umsatzsteuergesetz 1994 geändert werden (Teuerungs-Entlastungspaket Teil II)
   # [...]
   # Das Einkommensteuergesetz 1988, BGBl. Nr. 400/1988, zuletzt geändert durch das Bundesgesetz BGBl. I Nr. 138/2022,
   # wird wie folgt geändert:
   # 1. In § 1 Abs. 4 wird der Betrag "11 000" durch den Betrag "11 693" ersetzt. [...]

   2023   => [ 2100, 620, 0-11693, 0.0, 11693-19134, 0.20,  19134-32075, 0.30,
                                        32075-62080, 0.41,  62080-93120, 0.48,             93120-1000000, 0.5,
                                                                                                 1000000, 0.55 ],
   2024   => [ 2100, 620, 0-11693, 0.0, 11693-19134, 0.20,  19134-32075, 0.30,
                                        32075-62080, 0.40,  62080-93120, 0.48,             93120-1000000, 0.5,
                                                                                                 1000000, 0.55 ],
 );

 my($v,$year,$SZ,$pens,$b)=@_; $year||=100*(1900+(localtime(time))[5])
                                              +1+(localtime(time))[6]; $year=~s/\d\d$// unless($Wert{$year});
                                                                           return undef unless($Wert{$year});

 return      @{$Wert{$year}}         if($v==-1);     # Rückgabe der Wertetabelle

 return (2*$b<=$Wert{$year}[0])? 0   : ($SZ==1)?
        (  $v -$Wert{$year}[1])*0.06 :               # Sonderregelung für Jahressechstel §41(4) EStG incl. Freibetrag
        (  $v                 )*0.06 if($SZ>0);      # Sonderregelung für Jahressechstel §41(4) EStG excl. Freibetrag

 my $zvE=  $v;
    $zvE= $zvE                -60.00 if($year<2021); # Sonderausgabenpauschale (war öS  819,00); entfällt ab 2021
    $zvE= $zvE               -132.00 if(!$pens);     #  Webungskostenpauschale (war öS 1800,00)

 my($zv,$ESt,$i)=($zvE,0,2); while($zv>0)
 {
   my($p,$q)=@{$Wert{$year}}[$i++,$i++];  $p=-$p;

        $ESt+=($p<0 || $zv<$p)? $q*$zv:$q*$p; $zv-=$p; last if($p<0);
 }
        $ESt+= -allgAB($zvE,$year);             # bis 2004: Allg. Steuerabsetzbetrag mit Einschleifregelung §33(3) EStG
        $ESt+= -verkAB($zvE,$year)  if(!$pens); #  ab 2004: Arbeitnehmer-, Verkehrsabsetzbetrag
                                                #  ab 2020: SV-Bonus über AN-Veranlagung!
        $ESt+= -pensAB( $v, $year)  if( $pens); # Pensionistenabsetzbetrag §33(6)Z3 EStG 1988

 return $Wert{$year}[$i-1] if($SZ<0 && $i>3);

 return $ESt<0? 0:$ESt;
}

###########################################################################################################################
# ($Pendlerpauschale,$Pendlereuro)=PP($km,$year)
#                                      \   \_______ Jahr der Bemessung  
#                                      \___________ km Wohnort => Dienstort
# § 16 EStG 1988
#
sub  PP { return ($_[2] && $_[2]=~/^g/)? gPP(@_):kPP(@_); } 
sub kPP
{
  my %Wert=
  (       # EUR/km km => EUR km => EUR  km => EUR  
   2000   => [  0, 20,31.98, 40, 63.95, 60, 95.93 ], # öS => EUR
   2001   => [  0, 20,31.98, 40, 63.95, 60, 95.93 ],

   2002   => [  0, 20,32.00, 40, 64.00, 60, 96.00 ],
   2003   => [  0, 20,32.00, 40, 64.00, 60, 96.00 ],

   2004   => [  0, 20,37.50, 40, 74.25, 60,111.00 ],
   2005   => [  0, 20,37.50, 40, 74.25, 60,111.00 ],

   2006   => [  0, 20,41.25, 40, 81.75, 60,122.25 ],
   200701 => [  0, 20,41.25, 40, 81.75, 60,122.25 ],
   200702 => [  0, 20,41.25, 40, 81.75, 60,122.25 ],
   200703 => [  0, 20,41.25, 40, 81.75, 60,122.25 ],
   200704 => [  0, 20,41.25, 40, 81.75, 60,122.25 ],
   200705 => [  0, 20,41.25, 40, 81.75, 60,122.25 ],
   200706 => [  0, 20,41.25, 40, 81.75, 60,122.25 ],

   2007   => [  0, 20,45.50, 40, 90.00, 60,134.50 ],
   200801 => [  0, 20,45.50, 40, 90.00, 60,134.50 ],
   200802 => [  0, 20,45.50, 40, 90.00, 60,134.50 ],
   200803 => [  0, 20,45.50, 40, 90.00, 60,134.50 ],
   200804 => [  0, 20,45.50, 40, 90.00, 60,134.50 ],
   200805 => [  0, 20,45.50, 40, 90.00, 60,134.50 ],
   200806 => [  0, 20,45.50, 40, 90.00, 60,134.50 ],

   2008   => [  0, 20,52.50, 40,103.50, 60,154.75 ],
   2009   => [  0, 20,52.50, 40,103.50, 60,154.75 ],
   2010   => [  0, 20,52.50, 40,103.50, 60,154.75 ],

   2011   => [  0, 20,58.00, 40,113.00, 60,168.00 ],
   2012   => [  0, 20,58.00, 40,113.00, 60,168.00 ],

   2013   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2014   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2015   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2016   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2017   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2018   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2019   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2020   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2021   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   202201 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   202202 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   202203 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   202205 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2022   => [  4, 20,87.00, 40,169.50, 60,252.00 ],
   2023   => [  4, 20,87.00, 40,169.50, 60,252.00 ],
   202307 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   202308 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   202309 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   202310 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   202311 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   202312 => [  1, 20,58.00, 40,113.00, 60,168.00 ],
   2024   => [  1, 20,58.00, 40,113.00, 60,168.00 ],
  );

 my($km,$year)=@_; $year||=100*(1900+(localtime(time))[5])
                                  +1+(localtime(time))[6]; $year=~s/\d\d$// unless($Wert{$year});
                                                               return undef unless($Wert{$year});
 my($pp, $pe, @pp)=(0,@{$Wert{$year}});
 
    $pp=shift @pp while(@pp and $km>=shift @pp); return ($pp,$pp? 2*$km*$pe/12:0);
}

sub gPP
{
  my %Wert=
  (       # EUR/km km => EUR km => EUR  km => EUR  
   2000   => [  0, 2,17.44, 20, 69.77, 40,122.09, 60,174.42 ], # öS => EUR
   2001   => [  0, 2,17.44, 20, 69.77, 40,122.09, 60,174.42 ],

   2002   => [  0, 2,17.50, 20, 70.00, 40,122.50, 60,175.00 ],
   2003   => [  0, 2,17.50, 20, 70.00, 40,122.50, 60,175.00 ],

   2004   => [  0, 2,20.25, 20, 81.00, 40,141.00, 60,201.75 ],
   2005   => [  0, 2,20.25, 20, 81.00, 40,141.00, 60,201.75 ],

   2006   => [  0, 2,22.50, 20, 89.25, 40,155.25, 60,222.00 ],
   200701 => [  0, 2,22.50, 20, 89.25, 40,155.25, 60,222.00 ],
   200702 => [  0, 2,22.50, 20, 89.25, 40,155.25, 60,222.00 ],
   200703 => [  0, 2,22.50, 20, 89.25, 40,155.25, 60,222.00 ],
   200704 => [  0, 2,22.50, 20, 89.25, 40,155.25, 60,222.00 ],
   200705 => [  0, 2,22.50, 20, 89.25, 40,155.25, 60,222.00 ],
   200706 => [  0, 2,22.50, 20, 89.25, 40,155.25, 60,222.00 ],

   2007   => [  0, 2,24.75, 20, 98.25, 40,171.00, 60,244.25 ],
   200801 => [  0, 2,24.75, 20, 98.25, 40,171.00, 60,244.25 ],
   200802 => [  0, 2,24.75, 20, 98.25, 40,171.00, 60,244.25 ],
   200803 => [  0, 2,24.75, 20, 98.25, 40,171.00, 60,244.25 ],
   200804 => [  0, 2,24.75, 20, 98.25, 40,171.00, 60,244.25 ],
   200805 => [  0, 2,24.75, 20, 98.25, 40,171.00, 60,244.25 ],
   200806 => [  0, 2,24.75, 20, 98.25, 40,171.00, 60,244.25 ],

   2008   => [  0, 2,28.50, 20,113.00, 40,196.75, 60,281.00 ],
   2009   => [  0, 2,28.50, 20,113.00, 40,196.75, 60,281.00 ],
   2010   => [  0, 2,28.50, 20,113.00, 40,196.75, 60,281.00 ],

   2011   => [  0, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2012   => [  0, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],

   2013   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2014   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2015   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2016   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2017   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2018   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2019   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2020   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2021   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   202201 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   202202 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   202203 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   202204 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2022   => [  4, 2,46.50, 20,184.50, 40,321.00, 60,459.00 ],
   2023   => [  4, 2,46.50, 20,184.50, 40,321.00, 60,459.00 ],
   202307 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   202308 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   202309 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   202310 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   202311 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   202312 => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
   2024   => [  1, 2,31.00, 20,123.00, 40,214.00, 60,306.00 ],
  );

 my($km,$year)=@_; $year||=100*(1900+(localtime(time))[5])
                                  +1+(localtime(time))[6]; $year=~s/\d\d$// unless($Wert{$year});
                                                               return undef unless($Wert{$year});
 my($pp, $pe, @pp)=(0,@{$Wert{$year}});
 
    $pp=shift @pp while(@pp and $km>=shift @pp); return ($pp,$pp? 2*$km*$pe/12:0);
}

###########################################################################################################################
# $vekehrsAbsetzbetrag=verkAB($v,$year)
#                              \  \________ Jahr der Bemessung 
#                               \__________ zu versteuerndes Einkommen (Brutto-SV-Absetzbeträge)
sub verkAB
{
 my($v,$year)=@_;

 return   54.00                           # Arbeitnehmerabsetzbetrag (war öS  750,00)
        +291.00 if($year<2016);           #     Verkehrsabsetzbetrag (war öS 4000,00)

 return  400.00 if($year<2023);           #     Verkehrsabsetzbetrag ab 1.1.2016
 return  421.00;                          #     Verkehrsabsetzbetrag ab 1.1.2023

 #--------------------------------------------------------------------
 # EStG §33 vom 30.10.2019
 # (5) Bei Einkünften aus einem bestehenden Dienstverhältnis stehen folgende Absetzbeträge zu:
 #  1. Ein Verkehrsabsetzbetrag von 400 Euro jährlich.
 #  2. Bei Anspruch auf ein Pendlerpauschale gemäß § 16 Abs. 1 Z 6 erhöht sich der Verkehrsabsetzbetrag auf 690 Euro, 
 #     wenn das Einkommen des Steuerpflichtigen 12 200 Euro im Kalenderjahr nicht übersteigt. Der erhöhte
 #     Verkehrsabsetzbetrag vermindert sich zwischen Einkommen von 12 200 Euro und 13 000 Euro gleichmäßig 
 #     einschleifend auf 400 Euro.
 #  3. Der Verkehrsabsetzbetrag gemäß Z 1 oder 2 erhöht sich um 300 Euro (Zuschlag), wenn das Einkommen des 
 #     Steuerpflichtigen 15 500 Euro im Kalenderjahr nicht übersteigt. Der Zuschlag vermindert sich zwischen 
 #     Einkommen von 15 500 Euro und 21 500 Euro gleichmäßig einschleifend auf Null.
 #
 # ABER ...
 #
 # laut z.B. https://www.ketreuhand.at/Newsletter-1903/Steuerreform-2020/Steuerreform-2020.htm
 # "Der Zuschlag soll nur im Rahmen der Veranlagung berücksichtigt werden können."
 # 
 # return  400.00 if($year<2020);           #     Verkehrsabsetzbetrag vor 2020
 #
 # return  400.00+300.00 if(15500>$v);  # voller Verkehrsabsetzbetrag unter 15.500,-/a 
 # return  400.00        if(21500<$v);  #   kein Verkehrsabsetzbetrag über  21.500,-/a (§33(5)Z3 EStG vom 30.10.2019)
 # 
 # return  400.00+300.00 * (21500-$v)
 #                       / (21500-15500);  #    Einschleifregelung zw. 15.500,- und 21.500,-

 #--------------------------------------------------------------------
 # 			| bis Veranlagung 2020	| ab Veranlagung 2021
 # Verkehrsabsetzbetrag |    400 Euro		|    400 Euro
 # Zuschlag		|    400 Euro		|    650 Euro
 # Einkommensgrenze/a	|
 # für vollen Zuschlag	| 15.500 Euro		| 16.000 Euro
 #
 # laut https://www.szabo.at/steuerreform-steuerzuckerl-fuer-niedrigverdiener-gelten-grossteils-ab-2021/
}

###########################################################################################################################
# $pensionistenAbsetzbetrag=penskAB($v,$year)
#                                    \  \________ Jahr der Bemessung 
#                                     \__________ Bemessungsgrundlage (Monatsbrutto-SV)
sub pensAB
{
 my %Wert=
 (
  #-----------------------------------------------------
  # §33 EStG vom 30.12.2000 (ab 1.1.2001)
  # (6) Soweit einem Steuerpflichtigen die Absetzbeträge nach Abs. 5 nicht zustehen, hat er Anspruch auf einen 
  #     Pensionistenabsetzbetrag bis zu 5 500 S jährlich [...]. Der Pensionistenabsetzbetrag vermindert sich
  #     gleichmäßig einschleifend zwischen zu versteuernden Pensionsbezügen von 230 000 S und 300 000 S auf Null.

  2001 => [ 400, 16715, 21800 ],

  #-----------------------------------------------------
  # §33 EStG vom 1.1.2002 (ab 1.1.2002)
  # (6) Soweit einem Steuerpflichtigen die Absetzbeträge nach Abs. 5 nicht zustehen, hat er Anspruch auf einen
  #  Pensionistenabsetzbetrag bis zu 400 Euro jährlich [...]. Der Pensionistenabsetzbetrag vermindert sich
  #  gleichmäßig einschleifend zwischen zu versteuernden Pensionsbezügen von 16 715 Euro und 21 800 Euro auf Null.

  2002 => [ 400, 16715, 28000 ],  2003 => [ 400, 16715, 28000 ],  2004 => [ 400, 16715, 28000 ],

  #-----------------------------------------------------
  # §33 EStG vom 30.12.2004 (ab 1.1.2005)
  # (6) Stehen einem Steuerpflichtigen die Absetzbeträge nach Abs. 5 nicht zu, hat er Anspruch auf einen
  #     Pensionistenabsetzbetrag bis zu 400 Euro jährlich [...]. Der Pensionistenabsetzbetrag vermindert sich
  #     gleichmäßig einschleifend zwischen zu versteuernden Pensionsbezügen von 17.000 Euro und 25.000 Euro auf Null.

  2005 => [ 400, 17000, 25000 ],  2006 => [ 400, 17000, 25000 ],  2007 => [ 400, 17000, 25000 ], 
  2008 => [ 400, 17000, 25000 ],  2009 => [ 400, 17000, 25000 ],  2010 => [ 400, 17000, 25000 ],
  2011 => [ 400, 17000, 25000 ],  2012 => [ 400, 17000, 25000 ],  2013 => [ 400, 17000, 25000 ],
  2014 => [ 400, 17000, 25000 ],  2015 => [ 400, 17000, 25000 ],  2016 => [ 400, 17000, 25000 ],
  2017 => [ 400, 17000, 25000 ],  2018 => [ 400, 17000, 25000 ],  2019 => [ 400, 17000, 25000 ],

  #-----------------------------------------------------
  # §33 EStG vom 30.10.2019 (ab 1.1.2020)
  # (6) 
  #  3. Liegen die Voraussetzungen für einen erhöhten Pensionistenabsetzbetrag nach der Z 1 nicht vor, beträgt der
  #     Pensionistenabsetzbetrag 600 Euro. Dieser Absetzbetrag vermindert sich gleichmäßig einschleifend zwischen 
  #     zu versteuernden laufenden Pensionseinkünften von 17 000 Euro und 25 000 Euro auf Null.

  2020 => [ 600, 17000, 25000 ],
  2021 => [ 600, 17000, 25000 ],

  #--------------------------------------------------------------------
  # ÖkoStRefG 2022 Teil I) 18.
  # § 33 EStG Abs. 6 Z 2 und Z 3 lauten:
  #  2. Der erhöhte Pensionistenabsetzbetrag beträgt 1 214 Euro, wenn die laufenden Pensionseinkünfte des Steuerpflichtigen
  #     19 930 Euro im Kalenderjahr nicht übersteigen. Dieser Absetzbetrag vermindert sich gleichmäßig einschleifend 
  #     zwischen zu versteuernden laufenden Pensionseinkünften von 19 930 Euro und 25 250 Euro auf null.
  #  3. Liegen die Voraussetzungen für einen erhöhten Pensionistenabsetzbetrag nach der Z 1 nicht vor, beträgt der 
  #     Pensionistenabsetzbetrag 825 Euro. Dieser Absetzbetrag vermindert sich gleichmäßig einschleifend zwischen zu 
  #     versteuernden laufenden Pensionseinkünften von 17 500 Euro und 25 500 Euro auf null.

  2022 => [ 825, 17500, 25500 ],
  2023 => [ 868, 18410, 26826 ],
  2024 => [ 868, 18410, 26826 ],
 );

 my($v,$year)=@_; my($ab,$u,$o)=@{$Wert{$year}};

 return  $ab if($v<=$u); # voller Pensionistenabsetzbetrag unter ... 
 return 0.00 if($v>=$o); #   kein Pensionistenabsetzbetrag über  ... 

 return  $ab * ($o-$v)
             / ($o-$u);  # Einschleifregelung dazwischen ...
}
###########################################################################################################################
sub allgAB 
{
 my %Wert=
 (
  # §33 EStG
  #
  # (3) Ein allgemeiner Steuerabsetzbetrag von 8 840 S jährlich steht jedem Steuerpflichtigen zu.
  # Übersteigt das Einkommen 200 000 S, so vermindert sich der Absetzbetrag gleichmäßig in einem
  # solchen Ausmaß, dass sich bei einem Einkommen von 500 000 S kein Absetzbetrag mehr ergibt.

  1999 => [  1758, 642, 36337, -642 ],

  # (3) Ein allgemeiner Steuerabsetzbetrag von 12 200 S jährlich steht jedem Steuerpflichtigen zu.
  # Der allgemeine Steuerabsetzbetrag verändert sich nach Maßgabe der folgenden Bestimmungen:
  # von 122.000 öS bis 135.000 öS um .......... -1600 öS
  # von 135.000 öS bis 150.000 öS um .......... +1300 öS
  # von 150.000 öS bis 200.000 öS um ..........  -500 öS.
  # von 200.000 öS bis 250.000 öS um .......... -2000 öS
  # von 250.000 öS bis 400.000 öS um .......... -2900 öS
  # von 400.000 öS bis 500.000 öS um .......... -4000 öS
  # von 500.000 öS bis 700.000 öS um .......... -2000 öS.

  2000 => [  8866, 887, 9811, -116, 10901,  94, 14535, -36, 18168, -146, 21800, -221, 29070, -291, 36337, -146 ],

  # Für Arbeitnehmer oder Pensionisten ohne Alleinverdiener- oder
  # Alleinerzieherabsetzbetrag verändert sich der allgemeine
  # Steuerabsetzbetrag gleichmäßig einschleifend für Einkommensteile
  # von 122.000 öS bis 135.000 öS um .......... -1600 öS
  # von 135.000 öS bis 150.000 öS um .......... +1300 öS
  # von 150.000 öS bis 200.000 öS um ..........  -500 öS
  # von 200.000 öS bis 250.000 öS um .......... -2000 öS
  # von 250.000 öS bis 300.000 öS um ..........  -967 öS
  # von 300.000 öS bis 487.400 öS um .......... -8433 öS
                          
  2001 => [  8866, 887, 9811, -116, 10901,  94, 14535, -36, 18168, -146, 21800, -70, 35421, -613 ],

  # (3) Ein allgemeiner Steuerabsetzbetrag von 887 Euro jährlich steht jedem Steuerpflichtigen zu. 
  # Der allgemeine Steuerabsetzbetrag verändert sich nach Maßgabe der folgenden Bestimmungen:
  # von  8.866 Euro bis  9.811 Euro um ........ -116 Euro
  # von  9.811 Euro bis 10.901 Euro um ........  +94 Euro
  # von 10.901 Euro bis 14.535 Euro um ........  -36 Euro
  # von 14.535 Euro bis 18.168 Euro um ........ -146 Euro
  # von 18.168 Euro bis 21.800 Euro um ........  -70 Euro
  # von 21.800 Euro bis 35.421 Euro um ........ -613 Euro

  2002 => [  8866, 887, 9811, -116, 10901,  94, 14535, -36, 18168, -146, 21800, -70, 35421, -613 ],
  2003 => [  8866, 887, 9811, -116, 10901,  94, 14535, -36, 18168, -146, 21800, -70, 35421, -613 ],

  # (3) Ein allgemeiner Steuerabsetzbetrag von 1 264 Euro jährlich
  # steht jedem Steuerpflichtigen zu. Der allgemeine Steuerabsetzbetrag
  # vermindert sich gleichmäßig einschleifend für die Einkommensteile
  # von 10.000 Euro bis 15.000 Euro um ........  375 Euro
  # von 15.000 Euro bis 21.800 Euro um ........  272 Euro
  # von 21.800 Euro bis 35.511 Euro um ........  617 Euro

  2004 => [ 10000, 1264, 15000, -375, 21800, -272, 35511, -617 ],
 );
 
 my($v,$year)=@_; 

 if($Wert{$year})
 {
  my($i,$m)=(0,$Wert{$year}[1]);

    return $m                                           if($v<$Wert{$year}[0]);

   while($Wert{$year}[$i+3])
   {
    return $m+ $Wert{$year}[$i+3]*($v-$Wert{$year}[$i])/
              ($Wert{$year}[$i+2]    -$Wert{$year}[$i]) if($v<$Wert{$year}[$i+2]);

           $m+=$Wert{$year}[$i+3]; $i+=2;
   }
 }  return 0 
}
###########################################################################################################################
1;
