Source code for _gettsim.social_insurance_contributions.eink_grenzen
from _gettsim.shared import add_rounding_spec, dates_active
[docs]@dates_active(
end="2022-09-30",
)
def minijob_grenze_west(sozialv_beitr_params: dict) -> float:
"""Obtains marginal job thresholds for West Germany until September 2022.
Parameters
----------
sozialv_beitr_params:
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
Returns
-------
Marginal Job Threshold
"""
return sozialv_beitr_params["geringfügige_eink_grenzen_m"]["minijob"]["west"]
[docs]@dates_active(
end="2022-09-30",
)
def minijob_grenze_ost(sozialv_beitr_params: dict) -> float:
"""Obtains marginal job thresholds for East Germany until September 2022.
Parameters
----------
sozialv_beitr_params:
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
Returns
-------
Marginal Job Threshold
"""
return sozialv_beitr_params["geringfügige_eink_grenzen_m"]["minijob"]["ost"]
[docs]@dates_active(end="2022-09-30", change_name="minijob_grenze")
@add_rounding_spec(params_key="sozialv_beitr")
def minijob_grenze_unterschied_ost_west(
wohnort_ost: bool, minijob_grenze_west: float, minijob_grenze_ost: float
) -> float:
"""Select the income threshold depending on place of living.
Parameters
----------
wohnort_ost
See basic input variable :ref:`wohnort_ost <wohnort_ost>`.
sozialv_beitr_params
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
Returns
-------
"""
out = minijob_grenze_ost if wohnort_ost else minijob_grenze_west
return float(out)
[docs]@add_rounding_spec(params_key="sozialv_beitr")
@dates_active(start="2022-10-01")
def minijob_grenze(sozialv_beitr_params: dict) -> float:
"""Obtains marginal job threshold since 10/2022. Since then, it is calculated from
the statutory minimum wage.
Parameters
----------
sozialv_beitr_params
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
Returns
-------
Marginal Job Threshold
"""
return (
sozialv_beitr_params["mindestlohn"]
* sozialv_beitr_params["geringf_eink_faktor"]
/ sozialv_beitr_params["geringf_eink_divisor"]
)
[docs]def geringfügig_beschäftigt(bruttolohn_m: float, minijob_grenze: float) -> bool:
"""Check if individual earns less than marginal employment threshold.
Marginal employed pay no social insurance contributions.
Legal reference: § 8 Abs. 1 Satz 1 and 2 SGB IV
Parameters
----------
bruttolohn_m
See basic input variable :ref:`bruttolohn_m <bruttolohn_m>`.
minijob_grenze
See :func:`minijob_grenze`.
Returns
-------
Whether person earns less than marginal employment threshold.
"""
return bruttolohn_m <= minijob_grenze
[docs]def in_gleitzone(
bruttolohn_m: float,
geringfügig_beschäftigt: bool,
sozialv_beitr_params: dict,
) -> bool:
"""Check if individual's income is in midi-job range.
Employed people with their wage in the range of gleitzone pay reduced social
insurance contributions.
Legal reference: § 20 Abs. 2 SGB IV
Parameters
----------
bruttolohn_m
See basic input variable :ref:`bruttolohn_m <bruttolohn_m>`.
geringfügig_beschäftigt
See :func:`geringfügig_beschäftigt`.
sozialv_beitr_params
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
Returns
-------
Whether individual's income is in midi-job range.
"""
out = (
bruttolohn_m <= sozialv_beitr_params["geringfügige_eink_grenzen_m"]["midijob"]
) and (not geringfügig_beschäftigt)
return out
[docs]@dates_active(
end="2022-09-30",
change_name="midijob_faktor_f",
)
@add_rounding_spec(params_key="sozialv_beitr")
def midijob_faktor_f_mit_minijob_st(
sozialv_beitr_params: dict,
ges_krankenv_beitr_satz: float,
_ges_krankenv_beitr_satz_arbeitg: float,
) -> float:
"""Faktor F which is needed for the calculation of Bemessungsentgelt
(beitragspflichtige Einnahme) of midijobs before October 2022. It is calculated as
the ratio of the sum of lump-sum contributions for marginal employment (30 %)
divided by the total social security contribution rate
(Gesamtsozialversicherungsbeitragssatz).
Legal reference: § 163 Abs. 10 SGB VI
Parameters
----------
sozialv_beitr_params
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
ges_krankenv_beitr_satz
See :func:`ges_krankenv_beitr_satz`.
_ges_krankenv_beitr_satz_arbeitg
See :func:`_ges_krankenv_beitr_satz_arbeitg`.
Returns
-------
Income subject to social insurance contributions for midijob.
"""
# First calculate the factor F from the formula in § 163 (10) SGB VI
# Therefore sum the contributions which are the same for employee and employer
allg_sozialv_beitr = (
sozialv_beitr_params["beitr_satz"]["ges_rentenv"]
+ sozialv_beitr_params["beitr_satz"]["ges_pflegev"]["standard"]
+ sozialv_beitr_params["beitr_satz"]["arbeitsl_v"]
)
# Then calculate specific shares
an_anteil = allg_sozialv_beitr + ges_krankenv_beitr_satz
ag_anteil = allg_sozialv_beitr + _ges_krankenv_beitr_satz_arbeitg
# Sum over the shares which are specific for midijobs.
pausch_mini = (
sozialv_beitr_params["ag_abgaben_geringf"]["ges_krankenv"]
+ sozialv_beitr_params["ag_abgaben_geringf"]["ges_rentenv"]
+ sozialv_beitr_params["ag_abgaben_geringf"]["st"]
)
# Now calculate final factor
out = pausch_mini / (an_anteil + ag_anteil)
return out
[docs]@dates_active(start="2022-10-01", change_name="midijob_faktor_f")
@add_rounding_spec(params_key="sozialv_beitr")
def midijob_faktor_f_ohne_minijob_st(
sozialv_beitr_params: dict,
ges_krankenv_beitr_satz: float,
_ges_krankenv_beitr_satz_arbeitg: float,
) -> float:
"""Faktor F which is needed for the calculation of Bemessungsentgelt
(beitragspflichtige Einnahme) of midijobs since October 2022. It is calculated as
the ratio of the sum of lump-sum contributions for marginal employment (28 %)
divided by the total social security contribution rate
(Gesamtsozialversicherungsbeitragssatz). Since October 2022 the sum of lump-sum
contributions for marginal employment does not include the 2% flat-rate tax.
Legal reference: § 163 Abs. 10 SGB VI
Parameters
----------
sozialv_beitr_params
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
ges_krankenv_beitr_satz
See :func:`ges_krankenv_beitr_satz`.
_ges_krankenv_beitr_satz_arbeitg
See :func:`_ges_krankenv_beitr_satz_arbeitg`.
Returns
-------
Income subject to social insurance contributions for midijob.
"""
# Calculate the Gesamtsozialversicherungsbeitragssatz by summing social
# insurance contributions for employer and employee and
# adding the mean Zusatzbeitrag
# First calculate the factor F from the formula in § 163 (10) SGB VI
# Therefore sum the contributions which are the same for employee and employer
allg_sozialv_beitr = (
sozialv_beitr_params["beitr_satz"]["ges_rentenv"]
+ sozialv_beitr_params["beitr_satz"]["ges_pflegev"]["standard"]
+ sozialv_beitr_params["beitr_satz"]["arbeitsl_v"]
)
# Then calculate specific shares
an_anteil = allg_sozialv_beitr + ges_krankenv_beitr_satz
ag_anteil = allg_sozialv_beitr + _ges_krankenv_beitr_satz_arbeitg
# Sum over the shares which are specific for midijobs.
# New formula only inludes the lump-sum contributions to health care
# and pension insurance
pausch_mini = (
sozialv_beitr_params["ag_abgaben_geringf"]["ges_krankenv"]
+ sozialv_beitr_params["ag_abgaben_geringf"]["ges_rentenv"]
)
# Now calculate final factor f
out = pausch_mini / (an_anteil + ag_anteil)
return out
[docs]@dates_active(
end="2022-09-30",
change_name="midijob_bemessungsentgelt_m",
)
def midijob_bemessungsentgelt_m_bis_09_2022(
bruttolohn_m: float,
midijob_faktor_f: float,
minijob_grenze: float,
sozialv_beitr_params: dict,
) -> float:
"""Income subject to social insurance contributions for midijob until September
2022.
Bemessungsgeld (Gleitzonenentgelt) is the reference income for midijobs subject to
social insurance contribution.
Legal reference: § 163 Abs. 10 SGB VI
Parameters
----------
bruttolohn_m
See basic input variable :ref:`bruttolohn_m <bruttolohn_m>`.
midijob_faktor_f
See :func:`midijob_faktor_f`.
minijob_grenze
See :func:`minijob_grenze`.
sozialv_beitr_params
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
Returns
-------
Income subject to social insurance contributions for midijob.
"""
# Now use the factor to calculate the overall bemessungsentgelt
minijob_anteil = midijob_faktor_f * minijob_grenze
lohn_über_mini = bruttolohn_m - minijob_grenze
gewichtete_midijob_rate = (
sozialv_beitr_params["geringfügige_eink_grenzen_m"]["midijob"]
/ (
sozialv_beitr_params["geringfügige_eink_grenzen_m"]["midijob"]
- minijob_grenze
)
) - (
minijob_grenze
/ (
sozialv_beitr_params["geringfügige_eink_grenzen_m"]["midijob"]
- minijob_grenze
)
* midijob_faktor_f
)
return minijob_anteil + lohn_über_mini * gewichtete_midijob_rate
[docs]@dates_active(start="2022-10-01", change_name="midijob_bemessungsentgelt_m")
def midijob_bemessungsentgelt_m_ab_10_2022(
bruttolohn_m: float,
midijob_faktor_f: float,
minijob_grenze: float,
sozialv_beitr_params: dict,
) -> float:
"""Total income subject to social insurance contributions for employers a and
employees for midijob since October 2022. In the law, the considered income is
referred to as "beitragspflichtige Einnahme".
Beitragspflichtige Einnahme is the reference income for midijobs subject
to employer and employee social insurance contribution.
Legal reference: Changes in § 20 SGB IV from 01.10.2022
Parameters
----------
bruttolohn_m
See basic input variable :ref:`bruttolohn_m <bruttolohn_m>`.
midijob_faktor_f
See :func:`midijob_faktor_f`.
minijob_grenze
See :func:`minijob_grenze`.
sozialv_beitr_params
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
Returns
-------
Income subject to social insurance contributions for midijob.
"""
midijob_grenze = sozialv_beitr_params["geringfügige_eink_grenzen_m"]["midijob"]
quotient1 = (midijob_grenze) / (midijob_grenze - minijob_grenze)
quotient2 = (minijob_grenze) / (midijob_grenze - minijob_grenze)
einkommen_diff = bruttolohn_m - minijob_grenze
faktor1 = midijob_faktor_f * minijob_grenze
faktor2 = (quotient1 - quotient2 * midijob_faktor_f) * einkommen_diff
out = faktor1 + faktor2
return out
def _midijob_beitragspfl_einnahme_arbeitn_m(
bruttolohn_m: float,
sozialv_beitr_params: dict,
minijob_grenze: float,
) -> float:
"""Income subject to employee social insurance contributions for midijob since
October 2022.
Gesonderte Beitragspflichtige Einnahme is the reference income for midijobs subject
to employee social insurance contribution.
Legal reference: Changes in § 20 SGB IV from 01.10.2022
Parameters
----------
bruttolohn_m
See basic input variable :ref:`bruttolohn_m <bruttolohn_m>`.
sozialv_beitr_params
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
minijob_grenze
See :func:`minijob_grenze`.
Returns
-------
Income subject to employee social insurance contributions for midijob.
"""
midijob_grenze = sozialv_beitr_params["geringfügige_eink_grenzen_m"]["midijob"]
quotient = midijob_grenze / (midijob_grenze - minijob_grenze)
einkommen_diff = bruttolohn_m - minijob_grenze
out = quotient * einkommen_diff
return out
[docs]def regulär_beschäftigt(bruttolohn_m: float, sozialv_beitr_params: dict) -> bool:
"""Check if person is in regular employment.
Employees earning more than the midijob threshold, are subject to all ordinary
income and social insurance contribution regulations. In gettsim we call these
regular employed.
Parameters
----------
bruttolohn_m
See basic input variable :ref:`bruttolohn_m <bruttolohn_m>`.
sozialv_beitr_params
See params documentation :ref:`sozialv_beitr_params <sozialv_beitr_params>`.
Returns
-------
Whether regular employed persons.
"""
out = bruttolohn_m >= sozialv_beitr_params["geringfügige_eink_grenzen_m"]["midijob"]
return out