"""Functions to compute unemployment benefits (Arbeitslosengeld)."""
import numpy as np
from _gettsim.piecewise_functions import piecewise_polynomial
from _gettsim.taxes.eink_st import _eink_st_tarif
from _gettsim.transfers.rente import ges_rente_regelaltersgrenze
[docs]def arbeitsl_geld_m(
anz_kinder_tu: int,
arbeitsl_geld_berechtigt: bool,
arbeitsl_geld_eink_vorj_proxy_m: float,
arbeitsl_geld_params: dict,
) -> float:
"""Calculate individual unemployment benefit.
Parameters
----------
anz_kinder_tu
See :func:`anz_kinder_tu`.
arbeitsl_geld_berechtigt
See :func:`arbeitsl_geld_berechtigt`.
arbeitsl_geld_eink_vorj_proxy_m
See :func:`arbeitsl_geld_eink_vorj_proxy_m`.
arbeitsl_geld_params
See params documentation :ref:`arbeitsl_geld_params <arbeitsl_geld_params>`.
Returns
-------
"""
if anz_kinder_tu == 0:
arbeitsl_geld_satz = arbeitsl_geld_params["satz_ohne_kinder"]
elif anz_kinder_tu > 0:
arbeitsl_geld_satz = arbeitsl_geld_params["satz_mit_kindern"]
if arbeitsl_geld_berechtigt:
out = arbeitsl_geld_eink_vorj_proxy_m * arbeitsl_geld_satz
else:
out = 0.0
return out
[docs]def arbeitsl_geld_restl_anspruchsd(
alter: int,
sozialv_pflicht_5j: float,
anwartschaftszeit: bool,
m_durchg_alg1_bezug: float,
arbeitsl_geld_params: dict,
) -> int:
"""Calculate the remaining amount of months a person can receive unemployment
benefit this year.
Parameters
----------
alter
See basic input variable :ref:`alter <alter>`.
sozialv_pflicht_5j
See basic input variable :ref:`sozialv_pflicht_5j <sozialv_pflicht_5j>`.
anwartschaftszeit
See basic input variable :ref:`anwartschaftszeit <anwartschaftszeit>`.
m_durchg_alg1_bezug
See basic input variable :ref:`m_durchg_alg1_bezug <m_durchg_alg1_bezug>`.
arbeitsl_geld_params
See params documentation :ref:`arbeitsl_geld_params <arbeitsl_geld_params>`.
Returns
-------
"""
nach_alter = piecewise_polynomial(
alter,
thresholds=[
*list(arbeitsl_geld_params["anspruchsdauer"]["nach_alter"]),
np.inf,
],
rates=np.array(
[[0] * len(arbeitsl_geld_params["anspruchsdauer"]["nach_alter"])]
),
intercepts_at_lower_thresholds=list(
arbeitsl_geld_params["anspruchsdauer"]["nach_alter"].values()
),
)
nach_versich_pfl = piecewise_polynomial(
sozialv_pflicht_5j,
thresholds=[
*list(
arbeitsl_geld_params["anspruchsdauer"][
"nach_versicherungspflichtige_monate"
]
),
np.inf,
],
rates=np.array(
[
[0]
* len(
arbeitsl_geld_params["anspruchsdauer"][
"nach_versicherungspflichtige_monate"
]
)
]
),
intercepts_at_lower_thresholds=list(
arbeitsl_geld_params["anspruchsdauer"][
"nach_versicherungspflichtige_monate"
].values()
),
)
if anwartschaftszeit:
anspruchsdauer_gesamt = min(nach_alter, nach_versich_pfl)
if anwartschaftszeit:
out = max(anspruchsdauer_gesamt - m_durchg_alg1_bezug, 0)
else:
out = 0
return out
[docs]def arbeitsl_geld_berechtigt( # noqa: PLR0913
alter: int,
arbeitssuchend: bool,
arbeitsl_geld_restl_anspruchsd: int,
arbeitsstunden_w: float,
arbeitsl_geld_params: dict,
geburtsjahr: int,
ges_rente_params: dict,
) -> bool:
"""Check eligibility for unemployment benefit.
Parameters
----------
alter
See basic input variable :ref:`alter <alter>`.
arbeitssuchend
See basic input variable :ref:`arbeitssuchend <arbeitssuchend>`.
arbeitsl_geld_restl_anspruchsd
See :func:`arbeitsl_geld_restl_anspruchsd`.
arbeitsstunden_w
See basic input variable :ref:`arbeitsstunden_w <arbeitsstunden_w>`.
arbeitsl_geld_params
See params documentation :ref:`arbeitsl_geld_params <arbeitsl_geld_params>`.
geburtsjahr
See basic input variable :ref:`geburtsjahr <geburtsjahr>`.
ges_rente_params
See params documentation :ref:`ges_rente_params <ges_rente_params>`.
Returns
-------
"""
regelaltersgrenze = ges_rente_regelaltersgrenze(geburtsjahr, ges_rente_params)
out = (
arbeitssuchend
and (arbeitsl_geld_restl_anspruchsd > 0)
and (alter < regelaltersgrenze)
and (arbeitsstunden_w < arbeitsl_geld_params["stundengrenze"])
)
return out
[docs]def arbeitsl_geld_eink_vorj_proxy_m(
_ges_rentenv_beitr_bemess_grenze_m: float,
bruttolohn_vorj_m: float,
arbeitsl_geld_params: dict,
eink_st_params: dict,
eink_st_abzuege_params: dict,
soli_st_params: dict,
) -> float:
"""Approximate last years income for unemployment benefit.
Parameters
----------
_ges_rentenv_beitr_bemess_grenze_m
See :func:`_ges_rentenv_beitr_bemess_grenze_m`.
bruttolohn_vorj_m
See basic input variable :ref:`bruttolohn_vorj_m <bruttolohn_vorj_m>`.
arbeitsl_geld_params
See params documentation :ref:`arbeitsl_geld_params <arbeitsl_geld_params>`.
eink_st_params
See params documentation :ref:`eink_st_params <eink_st_params>`.
eink_st_abzuege_params
See params documentation :ref:`eink_st_abzuege_params <eink_st_abzuege_params>`.
soli_st_params
See params documentation :ref:`soli_st_params <soli_st_params>`.
Returns
-------
"""
# Relevant wage is capped at the contribution thresholds
max_wage = min(bruttolohn_vorj_m, _ges_rentenv_beitr_bemess_grenze_m)
# We need to deduct lump-sum amounts for contributions, taxes and soli
prox_ssc = arbeitsl_geld_params["sozialv_pausch"] * max_wage
# Fictive taxes (Lohnsteuer) are approximated by applying the wage to the tax tariff
# Caution: currently wrong calculation due to
# 12 * max_wage - eink_st_abzuege_params["werbungskostenpauschale"] not being
# the same as zu versteuerndes einkommen
# waiting for PR Lohnsteuer #150 to be merged to correct this problem
prox_tax = _eink_st_tarif(
12 * max_wage - eink_st_abzuege_params["werbungskostenpauschale"],
eink_st_params,
)
prox_soli = piecewise_polynomial(
prox_tax,
thresholds=soli_st_params["soli_st"]["thresholds"],
rates=soli_st_params["soli_st"]["rates"],
intercepts_at_lower_thresholds=soli_st_params["soli_st"][
"intercepts_at_lower_thresholds"
],
)
out = max_wage - prox_ssc - prox_tax / 12 - prox_soli / 12
out = max(out, 0.0)
return out