#!/usr/bin/perl
###############################################################################################################
# Vereinfachte Berechnung des Nettogehalts für Angestellte von 2002 bis 2015:
#
# Berücksichtigt sind: Arbeitnehmer- und Verkehrsabsetzbetrag bzw. Sonderausgaben- und Webungskostenpauschale.
# Nicht berücksichtigt sind: Pendlerpauschale, Sachbezug, Alleinverdiener-, Alleinerzieher-, Unterhalts- und
# Kinderabsetzbetrag, etc. Sonderzahlungen (13.+14. Gehalt) sind nur berücksichtigt bei selektiertem "SZ".
#
# (c) 2014-2015 by Ing. Peter Grobner, peter@grobner.at, http://grobner.at/cgi-bin/brutto2netto.cgi
###############################################################################################################
use CGI; $q=new CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
my($minYEAR,$maxYEAR)=(2002,2016); my $YEARs=join '|',$minYEAR..$maxYEAR;
my $brutto=$q->param('brutto');
my $year =$q->param('year')||2015; my %selectet; $selectet{$year}=' selected';
my $woh =$q->param('woh') || 38; $selectet{$woh} =' selected';
my %years=(); $selectet{SV} =' checked' if($q->param('SV'));
my @netto=(); $selectet{SZ} =' checked' if($q->param('SZ'));
foreach(split /\n/,$brutto)
{
my $n=$_;
my $t=($n=~s{(\d+)(\.(\d\d\d))(\,(\d\d))(\D|$)}{$1$3$4$6}g);
my $k=($n=~ s{(\d+)(\,(\d\d))(\D|$)}{$1.$3$4}g);
$year=$2 if($n=~/^\s*("?)($YEARs)(\1)(:|\s*=>)(\s|$)/); $n=~s{(\d+\.\d\d)}{ sprintf('%.2f',brutto2netto($1*$woh/38,$year)); }ge;
$year=$1 if($n=~ /\D($YEARs):\s*$/);
$n=~s{\.(\d\d)(\D|$)} {,$1$2}g if($k);
$n=~s{(\d)(\d\d\d,\d\d)}{$1.$2}g if($t); push @netto,$n; $years{$year}=1;
}
my $years=join ", ",sort keys %years;
my $netto=join "\n",@netto;
my $titel=$q->param('SV')? sprintf('%s%s%s', 'SV-Beitrag ', $years,($q->param('SZ')? ' für Sonderzahlungen':''))
: sprintf('%s%s%s', 'Nettogehalt ',$years,($q->param('SZ')? ' incl. Sonderzahlungen':''));
if($q->param('plain'))
{
print $q->header(-type=>"text/plain").$netto;
}
else
{
my $textarea='textarea';
print $q->header(-type=>"text/html").qq{
Vereinfachte Berechnung des Nettogehalts für Angestellte:
(Berücksichtigt sind: Arbeitnehmer- und Verkehrsabsetzbetrag bzw. Sonderausgaben- und Webungskostenpauschale.
Nicht berücksichtigt sind:}.($q->param('SZ')? '':' Sonderzahlungen,').qq{ Pendlerpauschale,
Sachbezug, Alleinverdiener-, Alleinerzieher-, Unterhalts- und Kinderabsetzbetrag, etc.
Siehe auch: Brutto-Netto-Rechner
des Bundesministeriums für Finanzen)
};
}
exit(0);
# h/Wo
###############################################################################################################
sub brutto2netto
{
my($brutto,$year)=@_; $year||=$maxYEAR; return undef if($year<$minYEAR or $year>$maxYEAR);
return SV($brutto,$year,$q->param('SZ')?1:0) if( $q->param('SV'));
my $BG=$brutto-SV($brutto,$year,0); return (12*$BG-ESt(12*$BG,$year,0))/12 if(!$q->param('SZ'));
my $SZ=$brutto-SV($brutto,$year,1); return (12*$BG-ESt(12*$BG,$year,0)
+2*$SZ-ESt( 2*$SZ,$year,1))/14;
}
###############################################################################################################
sub SV
{
# Geringfügigkeitsgrenze
# # Krankenversicherung §51(3)1.a ASVG
# # # Pensionsversicherung §51(3)2 ASVG
# # # # Grenze AL1%
# # # # # Grenze AL2%
# # # # # # Grenze AL3%
my %Wert= # # # # # # # SV-Höchstbeitragsgrundlage
( # # # # # # #
1999 => [ 283.35, 0.0340, 0.1025, 0.00, 0.00, 0.00, 3095.86 ],
2000 => [ 289.02, 0.0340, 0.1025, 0.00, 0.00, 0.00, 3139.47 ],
2001 => [ 296.21, 0.0340, 0.1025, 0.00, 0.00, 0.00, 3226.67 ],
2002 => [ 301.54, 0.0340, 0.1025, 0.00, 0.00, 0.00, 3270.00 ],
2003 => [ 309.38, 0.0340, 0.1025, 0.00, 0.00, 0.00, 3360.00 ],
2004 => [ 316.19, 0.0370, 0.1025, 0.00, 0.00, 0.00, 3450.00 ],
2005 => [ 323.46, 0.0375, 0.1025, 0.00, 0.00, 0.00, 3630.00 ],
2006 => [ 333.16, 0.0375, 0.1025, 0.00, 0.00, 0.00, 3750.00 ],
2007 => [ 341.16, 0.0375, 0.1025, 0.00, 0.00, 0.00, 3840.00 ],
2008 => [ 349.01, 0.0382, 0.1025, 0.00, 0.00, 0.00, 3930.00 ],
## ab 1.7.2008:
# 2008 => [ 349.01, 0.0382, 0.1025, 1100.00, 1200.00, 1350.00, 3930.00 ],
2009 => [ 357.74, 0.0382, 0.1025, 1128.00, 1230.00, 1384.00, 4020.00 ],
2010 => [ 366.33, 0.0382, 0.1025, 1155.00, 1260.00, 1417.00, 4110.00 ],
2011 => [ 374.02, 0.0382, 0.1025, 1179.00, 1286.00, 1447.00, 4200.00 ],
2012 => [ 376.26, 0.0382, 0.1025, 1186.00, 1294.00, 1456.00, 4230.00 ],
2013 => [ 386.80, 0.0382, 0.1025, 1219.00, 1330.00, 1497.00, 4440.00 ],
2014 => [ 395.31, 0.0382, 0.1025, 1246.00, 1359.00, 1530.00, 4530.00 ],
2015 => [ 405.98, 0.0382, 0.1025, 1280.00, 1396.00, 1571.00, 4650.00 ],
2016 => [ 415.72, 0.0387, 0.1025, 1311.00, 1430.00, 1609.00, 4860.00 ],
);
my($v,$year,$SZ)=@_;
return 0 if($v<=$Wert{$year}[0]); # Geringfügigkeitsgrenze
my $KV = $Wert{$year}[1]; # Krankenversicherung §51(3)1.a ASVG
my $PV = $Wert{$year}[2]; # Pensionsversicherung §51(3)2 ASVG
my $ALV= ($v<=$Wert{$year}[3])? 0.000 # Arbeitslosenversicherung §2a AMPFG
:($v<=$Wert{$year}[4])? 0.010
:($v<=$Wert{$year}[5])? 0.020
: 0.030;
my $AKU= $SZ? 0: 0.005; # AK-Umlage
my $WBF= $SZ? 0: 0.005; # Wohnbauförderung
my $max= $Wert{$year}[6]; # SV-Höchstbeitragsgrundlage
return ($KV+$PV+$ALV+$AKU+$WBF)*($v<$max?
$v:$max);
}
###############################################################################################################
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 ],
2008 => [ 2000, 620, 0-10000, 0.0, 10000-25000, 23/60, 25000-51000, 11335/26000, 51000, 0.5 ],
## ab 1.7.200
# 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 ],
# ÖGB-Modell
# 2016 => [ 2100, 620, 0-11000, 0.0, 11000-20000, 0.25,
# 20000-30000, 0.34,
# 30000-45000, 0.38,
# 45000-60000, 0.43,
# 60000-80000, 0.47, 80000, 0.5 ],
);
my($v,$year,$SZ)=@_;
return ($v<$Wert{$year}[0])? 0
:($v-$Wert{$year}[1])*0.06 if($SZ); # Sonderregelung für Jahressechstel §41(4) EStG
my $zvE=$v -60.00 # Sonderausgabenpauschale (war öS 819,00)
-132.00; # 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) # Allgemeiner Steuerabsetzbetrag mit Einschleifregelung §33(3) EStG
+($year<2016)? -54.00 # Arbeitnehmerabsetzbetrag (war öS 750,00)
-291.00 # Verkehrsabsetzbetrag (war öS 4000,00)
: -400.00; # Verkehrsabsetzbetrag ab 1.1.2016
return $ESt<0? 0:$ESt;
}
###############################################################################################################
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
}
###############################################################################################################