#-------------------------------------------------------------
# Script for gnuplot 4.6, Lizenz: CC-BY-SA-3.0 by Udo Brechtel
#-------------------------------------------------------------
reset
#-------------------------------------------------------------
#-------------------------------------------------------------
# Allgemeine Variablen:
#-------------------------------------------------------------
#Diagrammtitel-/Achsenbeschriftung:
lblTITEL = "Arbeitsentgelt, Sozialversicherung und Lohnsteuer 2015 in Deutschland";
lblYACHSE = "Anteile"
lblXACHSE = "Bruttoarbeitsentgelt in Euro/Monat"
#Weitere Labels:
lbl201 = "Minijob";
lbl202 = "Midijob (Gleitzone)";
lbl203 = "Normalbeschäftigung";
lblLizenz = "CC-BY-SA 3.0, Udo Brechtel"; #Label 100
# Canvas (px):
xsize = 1600; ysize = 800;
xleftmargin = 10; ytopmargin = 5;
#x-/y-Achse:
xmin = 0; xmax = 8000; dx = 1000; #xmax/10; # x = monatliches Bruttoarbeitsentgelt
ymin = 0; ymax = 140; dy = 10;
#Kennungen und Grenzen Arbeitsentgelt (AE) Minijob, Midijob
maxAEmini = 450; maxAEmidi = 850;
x1 = xmini = maxAEmini;
x2 = maxAEmidi;
SAMPLES = 2001;
#Ausgabedateien:
xmin_text = sprintf("%g",xmin);
xmax_text = sprintf("%g",xmax);
path = "svg2015/";
fn1 = path."SV_LST_2015_Euro_".xmin_text."_".xmax_text.".svg";
fn2_einzeln = path."Arbeitsentgelt_SV_LST_Anteile_Single_2015_bis_".xmax_text.".svg";
fn2_splitting = path."Arbeitsentgelt_SV_LST_Anteile_Paar_2015_bis_".xmax_text.".svg";
fn3 = path."ESt_Tarif_2015_Betrag_".xmin_text."_".xmax_text.".svg";
fn4 = path."ESt_Tarif_2015_Satz_".xmin_text."_".xmax_text.".svg";
fn5 = path."Vorsorgepauschale_2015.svg";
path_dat = "dat/";
fn_dat_2_einzeln = path_dat."prozentwerte_einzeln.dat";
fn_dat_2_splitting = path_dat."prozentwerte_splitting.dat";
#-------------------------------------------------------------
# Variablen/Funktionen 2015
#-----------------------------------------------------------------
#Math
Abrunden(zahl, kommastellen) = floor(zahl * 10 ** kommastellen) - floor(zahl);
Jahr = 2015;
KIND = 0; # 0 oder 1; entspricht nein oder ja
VERH = 1; # 0 oder 1; entspricht nein oder ja
lblUNTERTITEL(vh) = (vh==0) ? "Arbeitnehmer, Steuerklasse I oder IV" \
: "Arbeitnehmer, Steuerklasse III";
#.......................................................
#Sozialversicherung 2015:
#.......................................................
#Gesamtbeitragssatz (Prozent):
kv = 0.146 ; #Krankenversicherung 2015
pv = 0.0235; #Pflegeversicherung 2015
pvz = (KIND == 0) ? 0.0025 : 0.0; #Zuschlag Kinderlose
rv = 0.187 ; #Rentenversicherung 2015
alv = 0.03 ; #Arbeitslosenversicherung
kvz = 0.009 ; #Zusatzbeitrag Durchschnitt 2015
kve = 0.07 ; #erm. Satz für Vorsorgepauschale (VSP)
#Beitragsbemessungsgrenze (BBG) 2015:
BBG_KV = 4125; #monatlich
BBG_RV = 6050; #monatlich, West
KV_AG(x) = (x > BBG_KV) ? BBG_KV * kv/2 : x * kv/2;
KV_AN(x) = (x > BBG_KV) ? BBG_KV * (kv/2) : x * (kv/2);
PV_AG(x) = (x > BBG_KV) ? BBG_KV * pv/2 : x * pv/2;
PV_AN(x) = (x > BBG_KV) ? BBG_KV * (pv/2) : x * (pv/2);
RV_AG(x) = (x > BBG_RV) ? BBG_RV * rv/2 : x * rv/2;
RV_AN(x) = (x > BBG_RV) ? BBG_RV * rv/2 : x * rv/2;
ALV_AG(x) = (x > BBG_RV) ? BBG_RV * alv/2 : x * alv/2;
ALV_AN(x) = (x > BBG_RV) ? BBG_RV * alv/2 : x * alv/2;
KV_ANerm(x) = (x > BBG_KV) ? BBG_KV * (kve + kvz) : x * (kve + kvz); #für VSP
#Gesamtbeiträge:
KVPV(x) = KV_AG(x) + KV_AN(x) + PV_AG(x) + PV_AN(x);
RVALV(x) = RV_AG(x) + RV_AN(x) + ALV_AG(x) + ALV_AN(x);
#Zusatzbeitrag AN:
KVZPVZ(x) = (x > BBG_KV) ? BBG_KV * (kvz + pvz) : x * (kvz + pvz);
print("----------------------------------------------------------------");
sv_ges_ag = (kv + pv + rv + alv) / 2; print(sv_ges_ag*100.0);
sv_ges_an = sv_ges_ag + (kvz + pvz*(KIND==0)); print(sv_ges_an*100.0);
sv_ges = sv_ges_ag + sv_ges_an; print(sv_ges *100.0);
print("----------------------------------------------------------------");
#Gleitzone (Midi) 2015
F = 0.7585;
GE(x) = (x > 450 && x <= 850) ? 450 * F + (2.125 - 1.125 * F) * (x - 450) : -10;
sv_midi_ag = (kv + pv + rv + alv) / 2; print(sv_midi_ag*100.0);
sv_midi_ges = (kv + pv + rv + alv + kvz + pvz); print(sv_midi_ges*100.0);
print("----------------------------------------------------------------");
#SV Minijob privat:
kv_mini_priv_ag = 0.05; rv_mini_priv_ag = 0.05; st_priv_ag = 0.02;
rv_mini_priv_an = 0.137;
#SV Minijob gewerblich:
kv_mini_ag = 0.13; rv_mini_ag = 0.15;
rv_mini_an = 0.037;
sv_mini_ag = kv_mini_ag + rv_mini_ag; print(sv_mini_ag *100.0);
sv_mini_an = rv_mini_an; print(sv_mini_an *100.0);
sv_mini_ges = sv_mini_ag + sv_mini_an; print(sv_mini_ges*100.0);
print("----------------------------------------------------------------");
#Umlagen Arbeitgeber (Prozent):
u1_mini = 0.007 ; u2_mini = 0.0024; u3_mini = 0.0015;
u1_midi = 0.02; u2_midi = 0.0038; u3_midi = 0.0015; # U1,U2 = #(Beispiel DAK Gesundheit 2015)
uv_mini = 0.016;
#Gesetzl. Unfallversicherung
#(Beispiel BG Energie Textil Elektro Medienerzeugnisse, BG ETEM, 2015)
uv_gkl = 2.7; #Gefahrklasse (mittel)
uv_bfs = 0.00318; #Beitragsfuß bzw. Umlageziffer
uv = uv_gkl * uv_bfs;
UV_JAVH = 84000; #Jahresarbeitsverdienst-Höchstgrenze
UV_AG(x) = (x > UV_JAVH/12) ? uv * UV_JAVH/12 : uv * x;
#Umlagen gesamt AG
UML_AG(x) = (x > maxAEmidi) ? x * (u1_midi + u2_midi + u3_midi) + UV_AG(x) \
: (x > maxAEmini) ? x * (u1_midi + u2_midi + u3_midi) + UV_AG(x) \
: x * (u1_mini + u2_mini + u3_mini + uv_mini);
#Bruttoarbeitsentgelt:
BAE(x) = x;
#SV-Beitrag monatlich:
SVB_ges(x) = (x > maxAEmidi) ? KVPV(x) + KVZPVZ(x) + RVALV(x) \
: (x > maxAEmini) ? GE(x) * sv_midi_ges \
: x * sv_mini_ges;
SVB_AG(x) = (x > maxAEmidi) ? KVPV(x) / 2 + RVALV(x) / 2 \
: (x > maxAEmini) ? x * sv_midi_ag \
: x * sv_mini_ag; #+ Umlagen + UV
SVB_AN(x) = SVB_ges(x) - SVB_AG(x);
print("----------------------------------------------------------------");
TESTBRUTTO=2500;
print(SVB_AG(TESTBRUTTO)/TESTBRUTTO);
print(SVB_AN(TESTBRUTTO)/TESTBRUTTO);
print(SVB_ges(TESTBRUTTO)/TESTBRUTTO);
print("----------------------------------------------------------------");
print(kv);print(pv);print(rv);print(alv);
print(kvz);print(pvz);
print("----------------------------------------------------------------");
#SV-Beitragssätze:
svbs_ges(x) = SVB_ges(x) / x;
svbs_an(x) = SVB_AN(x) / x;
svbs_ag(x) = SVB_AG(x) / x;
#-----------------------------------------------------------------
#Lohn-/Einkommensteuer 2015
#-----------------------------------------------------------------
# Freibeträge:
#-----------------------------------------------------------------
ANP = 1000; #Arbeitnehmerpauschale (Werbungskosten)
SAP = 36; #Sonderausgabenpauschale
#Vorsorgepauschale (abhängig vom Brutto) 2015:
## liefert VSP(x) jährlich
## mit x = Brutto monatlich
a(Jahr) = (20 + 4 * (Jahr - 2005)) / 100.0;
VSP1(x) = 12 * RV_AN(x) * a(Jahr);
VHB(vh) = (vh==0) ? 1900 : 3000;
VSP2(x,vh) = (12*x*0.12 > VHB(vh)) ? VHB(vh) : 12*x*0.12; #mindestens
MVSP(x) = 12 * (KV_ANerm(x) + PV_AN(x));
VSP3(x,vh) = (VSP2(x,vh) > MVSP(x)) ? VSP2(x,vh) : MVSP(x);
VSP(x,vh) = ceil(VSP1(x) + VSP3(x,vh)); # aufgerundet, pro Jahr!
#-----------------------------------------------------------------
# Einkommensteuer-Tarif
#-----------------------------------------------------------------
EST_2015(zvE) = (zvE > 250730) ? zvE * 0.45 - 15761 \
: (zvE > 52881) ? zvE * 0.42 - 8239 \
: (zvE > 13469) ? (228.74e-8 * (zvE - 13469) + 0.2397) * (zvE - 13469) + 971 \
: (zvE > 8354) ? (974.58e-8 * (zvE - 8354) + 0.1400) * (zvE - 8354) \
: 0;
zvE(x,vh) = 12.0*x - VSP(x,vh) - ANP - SAP;
#Grundtarif #Splittingtarif
LSTmonat(x, vh) = (vh == 0) ? EST_2015(zvE(x,vh)) / 12.0 : 2 * EST_2015(zvE(x,vh) / 2) / 12.0;
#-----------------------------------------------------------------
# Solidaritaetszuschlag
#-----------------------------------------------------------------
SOLZgrenz(vh) = (vh == 0) ? 972 : 1944;
SOLZ_1(STB) = Abrunden(0.055 * STB, 2); #normal 5,5 % des Steuerbetrags
SOLZ_2(STB,vh) = (STB > SOLZgrenz(vh)) ? (STB - SOLZgrenz(vh)) * 0.2 : 0; #max 20 % des Unterschiedes
SOLZ(STB, vh) = (SOLZ_1(STB) > SOLZ_2(STB,vh)) ? SOLZ_2(STB,vh) : SOLZ_1(STB);
SOLZmonat(STB, vh) = SOLZ(STB, vh) / 12.0;
s_eff(x, vh) = LSTmonat(x, vh) * 100.0 / x;
LST_AG(x) = (x > maxAEmini) ? 0.0 : x * 0.02; #Pauschalsteuer
s_eff_ag(x) = LST_AG(x) * 100.0 / x;
sg(zvE) = (zvE > 250730) ? 0.45 \
: (zvE > 52881) ? 0.42 \
: (zvE > 13469) ? 2 * 228.74e-8 * (zvE - 13469) + 0.2397 \
: (zvE > 8354) ? 2 * 974.58e-8 * (zvE - 8354) + 0.1400 \
: 0;
sg_eff(x, vh) = (vh==0) ? sg(zvE(x,vh)) * 100.0 : sg(zvE(x,vh)/2) * 100.0;
#------------------
# Summen:
#------------------
Brutto_AG3(x) = Brutto_AG2(x) + LST_AG(x);
Brutto_AG2(x) = Brutto_AG1(x) + UML_AG(x);
Brutto_AG1(x) = BAE(x) + SVB_AG(x);
Brutto(x) = BAE(x);
Netto_AN1(x) = BAE(x) - SVB_AN(x);
Netto_AN2(x,vh) = Netto_AN1(x) - LSTmonat(x,vh) - SOLZmonat(LSTmonat(x,vh), vh);
brutto_ag3(x) = Brutto_AG3(x) * 100.0 / x;
brutto_ag2(x) = Brutto_AG2(x) * 100.0 / x;
brutto_ag1(x) = Brutto_AG1(x) * 100.0 / x;
brutto(x) = 100.0;
netto_an1(x) = Netto_AN1(x) * 100.0 / x;
netto_an2(x,vh) = Netto_AN2(x,vh) * 100.0 / x;
#ALG II / Einkommensanrechnung:
ALG_2 = 800; #geschätzt
#Freibetrag:
FB_0 = 100; #Grundfreibetrag vom Netto_AN2
BAE_1 = 1000;
BAE_2(kd) = (kd==0) ? 1200 : 1500;
anr_1 = 0.2; anr_2 = 0.1;
FBges(x, kd) = (x > BAE_2(kd)) ? FB_0 + (BAE_1 - FB_0) * 0.2 + (BAE_2(kd) - BAE_1) * 0.1 \
: (x > BAE_1) ? FB_0 + (BAE_1 - FB_0) * 0.2 + (x - BAE_1) * 0.1 \
: (x > FB_0 ) ? FB_0 + (x - FB_0) * 0.2 \
: x;
AEanr(x, kd, vh) = Netto_AN2(x, vh) - FBges(x, kd);
ALG_2_red(x, kd, vh) = ALG_2 - AEanr(x, kd, vh);
Netto_AN3(x, kd, vh) = (ALG_2 > AEanr(x, kd, vh)) ? ALG_2 + FBges(x, kd) \
: Netto_AN2(x,vh);
#----------------------------------------------------------------------------
# Settings
#----------------------------------------------------------------------------
Arial_8 = "Arial, 8";
Arial_10 = "Arial, 10";
Arial_12 = "Arial, 12";
Arial_Bold_10 = "Arial Bold, 10";
Arial_Bold_12 = "Arial Bold, 12";
Arial_Bold_14 = "Arial Bold, 14";
Arial_Bold_16 = "Arial Bold, 16";
Arial_Bold_18 = "Arial Bold, 18";
Arial_Bold_24 = "Arial Bold, 24";
#Linienstyles
set style line 12999 lt 1 lw 1.0 lc rgb "black";
set style line 13000 lt 1 lw 3.5 lc rgb "black";
set style line 13001 lt 1 lw 1.0 lc rgb "red";
set style line 13002 lt 1 lw 1.0 lc rgb "yellow";
set style line 13003 lt 1 lw 1.0 lc rgb "green";
set style line 13004 lt 1 lw 1.0 lc rgb "#0F0" #"blue";
set style line 130044 lt 1 lw 1.0 lc rgb "#020" #"dark-blue";
set style line 13005 lt 1 lw 0.7 lc rgb "black";
set style line 13006 lt 1 lw 1.0 lc rgb "violet-blue";
set style line 13011 lt 4 lw 2.5 lc rgb "red";
set style line 13012 lt 1 lw 6 lc rgb "red";
#-----------------------------------------------------------------
# Beginn Script zum Plotten
#-----------------------------------------------------------------
set encoding utf8;
set terminal svg size xsize,ysize font Arial_12 dashed linewidth 1.0 background rgb "white"
set noborder;
set zeroaxis;
set sample SAMPLES;
set lmargin xleftmargin
set tmargin ytopmargin
set bmargin ytopmargin
#Diagrammtitel
set title lblTITEL offset 0,1 font Arial_Bold_24
set label 1 at xmax/2,ymax center lblUNTERTITEL(VERH) font Arial_Bold_18;
#Legende Position/Breite:
xkey = xmax*2/3; ykey = 52.5; wkey = 1;
#Legende (key) setzen
set key at xkey,ykey left Left spacing 1.2 width wkey height 0.75 box 1
set key opaque reverse vertical maxrows 8
set key font Arial_Bold_14
#y-Achse:
set yzeroaxis ls 12999;
set yrange [ymin:ymax];
set format y "%.0f %%";
set ytics out nomirror ymin,dy font Arial_Bold_16;
set ytics add ("0" 0);
#x-Achse:
set xzeroaxis ls 12999;
set xrange [xmin:xmax];
set format x "%g";
set xtics out nomirror xmin,dx font Arial_Bold_16;
set xlabel lblXACHSE offset 2,0 font Arial_Bold_18;
#Labels:
x201 = (xmin + maxAEmini) / 2.0; y201 = 50.0;
x202 = (maxAEmini + maxAEmidi) / 2.0; y202 = 50.4;
x203 = xmax/3; y203 = 45;
#x201 = (xmin + maxAEmini) / 2.0; y201 = 650;
#x202 = (maxAEmini + maxAEmidi) / 2.0; y202 = 1225;
#x203 = xmax/3; y203 = 1850;
set label 201 at x201,y201 rotate center lbl201 font Arial_Bold_16;
set label 202 at x202,y202 rotate center lbl202 font Arial_Bold_16;
set label 203 at x203,y203 right lbl203 font Arial_Bold_18;
set label 100 at -xmax*35/1000,-15 left lblLizenz font Arial_10;
set label 101 at -xmax*35/1000,ymax+6 left lblYACHSE font Arial_Bold_18;
#Gitternetz:
set grid xtics mxtics ytics mytics lw 0.3, lw 0.1;
#Fläche
set style fill solid 0.25 border lc rgb "black"
#-----------------------------------------------------------------
#Titel, Legendetext
t1 = "Arbeitgeberanteil SV";
t2 = "Bruttoarbeitsentgelt";
t3 = "Arbeitnehmeranteil SV";
t4 = "Auszahlung netto";
t4a = "Auszahlung netto + ALG II";
t5 = "Lohnsteuer + Solidaritätszuschlag"
tps = "Pauschalsteuer"
tuv = "Unfallversicherung + Umlagen"
#-----------------------------------------------------------------------
# Plotting
#-----------------------------------------------------------------------
ymini = (BAE(xmini) + SVB_AG(xmini) + UML_AG(xmini))*100.0/xmini;
#print(ymini);
#------------------------------------------------------------------------------
# print data files
#------------------------------------------------------------------------------
set print fn_dat_2_einzeln;
VERH = 0;
print "b; bag3; bag2; bag1; b; nan1; nan2";
do for [i = 1:SAMPLES] {b = i * xmax/SAMPLES; bag3 = brutto_ag3(b); bag2 = brutto_ag2(b); bag1 = brutto_ag1(b); nan1 = netto_an1(b); nan2 = netto_an2(b,VERH);
print b, "; ", bag3, "; ", bag2, "; ", bag1, "; ", b, "; ", nan1, "; ", nan2;
}
unset print;
set print fn_dat_2_splitting;
VERH = 1;
do for [i = 1:SAMPLES] {b = i * xmax/SAMPLES; bag3 = brutto_ag3(b); bag2 = brutto_ag2(b); bag1 = brutto_ag1(b); nan1 = netto_an1(b); nan2 = netto_an2(b,VERH);
print b, "; ", bag3, "; ", bag2, "; ", bag1, "; ", b, "; ", nan1, "; ", nan2;
}
unset print;
#--------------------------------------------------------------------------
# Diagramm Anteile in Prozent plotten
#--------------------------------------------------------------------------
#y-Achse (Anteile in Prozent):
# Trennlinien Minijob/Midijob (rot):
set arrow 901 from x1,ymin to x1,ymax nohead filled ls 13011;
set arrow 902 from x2,ymin to x2,ymax nohead filled ls 13011;
# Plot Einzeln StKl I oder IV
VERH = 0;
set label 1 at xmax/2,ymax+3 center lblUNTERTITEL(VERH) font Arial_Bold_18;
set output fn2_einzeln;
print(fn2_einzeln);
plot brutto_ag3(x) / (x < 450) with filledcurve y1=ymini ls 130044 t tps, \
brutto_ag3(x) ls 13005 notitle, \
brutto_ag2(x) ls 13005 notitle, \
brutto_ag1(x) ls 13005 notitle, \
fn_dat_2_einzeln u 1:3:4 with filledcurve ls 13006 t tuv, \
brutto_ag1(x) with filledcurve y2=100 ls 13001 t t1, \
brutto(x) ls 13000 t t2, \
netto_an1(x) with filledcurve y1=100 ls 13002 t t3, \
fn_dat_2_einzeln u 1:6:7 with filledcurve ls 13004 t t5, \
netto_an2(x,VERH) with filledcurve x1 ls 13003 t t4, \
netto_an2(x,VERH) ls 13005 notitle, \
netto_an1(x) ls 13005 notitle;
unset output;
# Plot Splitting StKl III
VERH = 1;
set label 1 at xmax/2,ymax+3 center lblUNTERTITEL(VERH) font Arial_Bold_18;
set output fn2_splitting;
print(fn2_splitting);
plot brutto_ag3(x) / (x < 450) with filledcurve y1=ymini ls 130044 t tps, \
brutto_ag3(x) ls 13005 notitle, \
brutto_ag2(x) ls 13005 notitle, \
brutto_ag1(x) ls 13005 notitle, \
fn_dat_2_splitting u 1:3:4 with filledcurve ls 13006 t tuv, \
brutto_ag1(x) with filledcurve y2=100 ls 13001 t t1, \
brutto(x) ls 13000 t t2, \
netto_an1(x) with filledcurve y1=100 ls 13002 t t3, \
fn_dat_2_splitting u 1:6:7 with filledcurve ls 13004 t t5, \
netto_an2(x,VERH) with filledcurve x1 ls 13003 t t4, \
netto_an2(x,VERH) ls 13005 notitle, \
netto_an1(x) ls 13005 notitle;
unset output;
# END