Impressum:Ing. Peter GrobnerUnter der Leithen 3aA-3340 Waidhofen/Ybbs
brutto2netto.cgi
#!/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) Bruttogehalt $years: <$textarea cols="120" rows="20" name="brutto" _onClick_="this.form.elements[0].select();">$brutto$textarea> }.(join "\n",map "$_",$minYEAR..$maxYEAR).qq{ SV SZ $titel: <$textarea cols="120" rows="20" name="netto" onClick="this.form.elements[3].select();">$netto$textarea> }; } exit(0); # } .(join "\n",map "$_",(38,35,30,25,20,19,15,10)).qq{ # 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 } ###############################################################################################################
Bruttogehalt $years: <$textarea cols="120" rows="20" name="brutto" _onClick_="this.form.elements[0].select();">$brutto$textarea> }.(join "\n",map "$_",$minYEAR..$maxYEAR).qq{ SV SZ
$titel: <$textarea cols="120" rows="20" name="netto" onClick="this.form.elements[3].select();">$netto$textarea>
Vereinfachte Berechnung des Nettogehalts für Angestellte von 2002 bis 2016(14.5kB)
Download