Source code for _gettsim.taxes.zu_verst_eink.vorsorgeaufw

from _gettsim.shared import add_rounding_spec, dates_active


[docs]@dates_active(start="2005-01-01", end="2022-12-31", change_name="vorsorgeaufw_alter_tu") def vorsorgeaufw_alter_tu_einfuehrung( ges_rentenv_beitr_m_tu: float, priv_rentenv_beitr_m_tu: float, anz_erwachsene_tu: int, eink_st_abzuege_params: dict, ) -> float: """Determine contributions to retirement savings deductible from taxable income. The share of deductible contributions increases each year from 60% in 2005 to 100% in 2025. Parameters ---------- ges_rentenv_beitr_m_tu See :func:`ges_rentenv_beitr_m_tu`. priv_rentenv_beitr_m_tu See :func:`priv_rentenv_beitr_m_tu`. anz_erwachsene_tu See :func:`anz_erwachsene_tu`. eink_st_abzuege_params See params documentation :ref:`eink_st_abzuege_params <eink_st_abzuege_params>`. Returns ------- """ out = ( eink_st_abzuege_params["einführungsfaktor_vorsorgeaufw_alter_ab_2005"] * (2 * ges_rentenv_beitr_m_tu + priv_rentenv_beitr_m_tu) - ges_rentenv_beitr_m_tu ) * 12 max_value = anz_erwachsene_tu * eink_st_abzuege_params["vorsorge_altersaufw_max"] out = min(out, max_value) return out
[docs]@dates_active(start="2023-01-01") def vorsorgeaufw_alter_tu( ges_rentenv_beitr_m_tu: float, priv_rentenv_beitr_m_tu: float, anz_erwachsene_tu: int, eink_st_abzuege_params: dict, ) -> float: """Determine contributions to retirement savings deductible from taxable income. Parameters ---------- ges_rentenv_beitr_m_tu See :func:`ges_rentenv_beitr_m_tu`. priv_rentenv_beitr_m_tu See :func:`priv_rentenv_beitr_m_tu`. anz_erwachsene_tu See :func:`anz_erwachsene_tu`. eink_st_abzuege_params See params documentation :ref:`eink_st_abzuege_params <eink_st_abzuege_params>`. Returns ------- """ out = (ges_rentenv_beitr_m_tu + priv_rentenv_beitr_m_tu) * 12 max_value = anz_erwachsene_tu * eink_st_abzuege_params["vorsorge_altersaufw_max"] return min(out, max_value)
[docs]@dates_active( start="2005-01-01", end="2009-12-31", change_name="vorsorgeaufw_tu_einführung", ) def vorsorgeaufw_tu_einführung_ab_2005_bis_2009( # noqa: PLR0913 vorsorgeaufw_alter_tu: float, ges_krankenv_beitr_m_tu: float, arbeitsl_v_beitr_m_tu: float, ges_pflegev_beitr_m_tu: float, anz_erwachsene_tu: int, eink_st_abzuege_params: dict, ) -> float: """Calculate Vorsorgeaufwendungen from 2005 to 2009, new mode. Parameters ---------- vorsorgeaufw_alter_tu See :func:`vorsorgeaufw_alter_tu`. ges_krankenv_beitr_m_tu See :func:`ges_krankenv_beitr_m_tu`. arbeitsl_v_beitr_m_tu See :func:`arbeitsl_v_beitr_m_tu`. ges_pflegev_beitr_m_tu See :func:`ges_pflegev_beitr_m_tu`. anz_erwachsene_tu See :func:`anz_erwachsene_tu`. eink_st_abzuege_params See params documentation :ref:`eink_st_abzuege_params <eink_st_abzuege_params>`. Returns ------- """ sum_vorsorge = 12 * ( ges_krankenv_beitr_m_tu + arbeitsl_v_beitr_m_tu + ges_pflegev_beitr_m_tu ) max_value = anz_erwachsene_tu * eink_st_abzuege_params["vorsorge_sonstige_aufw_max"] sum_vorsorge = min(sum_vorsorge, max_value) out = sum_vorsorge + vorsorgeaufw_alter_tu return out
[docs]@dates_active(start="2005-01-01", end="2019-12-31", change_name="vorsorgeaufw_tu") @add_rounding_spec(params_key="eink_st_abzuege") def vorsorgeaufw_tu_guenstiger( vorsorgeaufw_tu_bis_2004: float, vorsorgeaufw_tu_einführung: float, ) -> float: """Calculate Vorsorgeaufwendungen from 2005 to 2019. With the 2005 reform, no taxpayer was supposed to be affected negatively. Therefore, one needs to compute amounts under the 2004 and 2005 regimes and take the more favourable one. After a supreme court ruling, the 2005 rule had to be changed in 2010. Therefore, one needs to compute amounts under the 2004 and 2010 regimes and take the more favourable one. (§10 (3a) EStG). Sidenote: The 2010 rules are by construction at least as beneficial as the 2005 regime, so there is no need for a separate check. Parameters ---------- vorsorgeaufw_tu See :func:`vorsorgeaufw_tu`. vorsorgeaufw_tu_bis_2004 See :func:`vorsorgeaufw_tu_bis_2004`. Returns ------- """ return max(vorsorgeaufw_tu_bis_2004, vorsorgeaufw_tu_einführung)
[docs]@dates_active( start="2010-01-01", end="2019-12-31", change_name="vorsorgeaufw_tu_einführung", ) def vorsorgeaufw_tu_einführung_ab_2010_bis_2019( vorsorgeaufw_tu_ab_2020: float, ) -> float: return vorsorgeaufw_tu_ab_2020
@dates_active(start="2020-01-01", change_name="vorsorgeaufw_tu") @add_rounding_spec(params_key="eink_st_abzuege") def _vorsorgeaufw_tu_ab_2020(vorsorgeaufw_tu_ab_2020: float) -> float: return vorsorgeaufw_tu_ab_2020
[docs]def vorsorgeaufw_tu_ab_2020( # noqa: PLR0913 vorsorgeaufw_alter_tu: float, ges_pflegev_beitr_m_tu: float, ges_krankenv_beitr_m_tu: float, arbeitsl_v_beitr_m_tu: float, anz_erwachsene_tu: int, eink_st_abzuege_params: dict, ) -> float: """Calculate Vorsorgeaufwendungen since 2020. Vorsorgeaufwendungen after the regime implemented in 2010 is in full effect, see § 10 (3) EStG. Parameters ---------- vorsorgeaufw_alter_tu See :func:`vorsorgeaufw_alter_tu`. ges_pflegev_beitr_m_tu See :func:`ges_pflegev_beitr_m_tu`. ges_krankenv_beitr_m_tu See :func:`ges_krankenv_beitr_m_tu`. arbeitsl_v_beitr_m_tu See :func:`arbeitsl_v_beitr_m_tu`. anz_erwachsene_tu See :func:`anz_erwachsene_tu`. eink_st_abzuege_params See params documentation :ref:`eink_st_abzuege_params <eink_st_abzuege_params>`. Returns ------- """ basiskrankenversicherung = 12 * ( ges_pflegev_beitr_m_tu + (1 - eink_st_abzuege_params["vorsorge_kranken_minderung"]) * ges_krankenv_beitr_m_tu ) sonst_vors_max = ( eink_st_abzuege_params["vorsorge_sonstige_aufw_max"] * anz_erwachsene_tu ) sonst_vors_before_basiskrankenv = min( 12 * (arbeitsl_v_beitr_m_tu + ges_pflegev_beitr_m_tu + ges_krankenv_beitr_m_tu), sonst_vors_max, ) # Basiskrankenversicherung can always be deducted even if above sonst_vors_max sonst_vors = max(basiskrankenversicherung, sonst_vors_before_basiskrankenv) out = sonst_vors + vorsorgeaufw_alter_tu return out
@dates_active( start="2005-01-01", end="2019-12-31", change_name="vorsorgeaufw_tu_bis_2004" ) def _vorsorgeaufw_tu_bis_2004( _vorsorgeaufw_vom_lohn_tu_bis_2004: float, ges_krankenv_beitr_m_tu: float, ges_rentenv_beitr_m_tu: float, anz_erwachsene_tu: int, eink_st_abzuege_params: dict, ) -> float: return vorsorgeaufw_tu_bis_2004( _vorsorgeaufw_vom_lohn_tu_bis_2004=_vorsorgeaufw_vom_lohn_tu_bis_2004, ges_krankenv_beitr_m_tu=ges_krankenv_beitr_m_tu, ges_rentenv_beitr_m_tu=ges_rentenv_beitr_m_tu, anz_erwachsene_tu=anz_erwachsene_tu, eink_st_abzuege_params=eink_st_abzuege_params, )
[docs]@dates_active( end="2004-12-31", change_name="vorsorgeaufw_tu", ) @add_rounding_spec(params_key="eink_st_abzuege") def vorsorgeaufw_tu_bis_2004( _vorsorgeaufw_vom_lohn_tu_bis_2004: float, ges_krankenv_beitr_m_tu: float, ges_rentenv_beitr_m_tu: float, anz_erwachsene_tu: int, eink_st_abzuege_params: dict, ) -> float: """Calculate Vorsorgeaufwendungen until 2004. Parameters ---------- _vorsorgeaufw_vom_lohn_tu_bis_2004 See :func:`_vorsorgeaufw_vom_lohn_tu_bis_2004`. ges_krankenv_beitr_m_tu See :func:`ges_krankenv_beitr_m_tu`. ges_rentenv_beitr_m_tu See :func:`ges_rentenv_beitr_m_tu`. anz_erwachsene_tu See :func:`anz_erwachsene_tu`. eink_st_abzuege_params See params documentation :ref:`eink_st_abzuege_params <eink_st_abzuege_params>`. Returns ------- """ multiplikator1 = max( ( 12 * (ges_rentenv_beitr_m_tu + ges_krankenv_beitr_m_tu) - _vorsorgeaufw_vom_lohn_tu_bis_2004 ), 0.0, ) item_1 = (1 / anz_erwachsene_tu) * multiplikator1 if item_1 > eink_st_abzuege_params["vorsorge_2004_grundhöchstbetrag"]: multiplikator2 = eink_st_abzuege_params["vorsorge_2004_grundhöchstbetrag"] else: multiplikator2 = item_1 item_2 = (1 / anz_erwachsene_tu) * multiplikator2 hoechstgrenze_item3 = ( anz_erwachsene_tu * eink_st_abzuege_params["vorsorge_2004_grundhöchstbetrag"] ) if (item_1 - item_2) > hoechstgrenze_item3: item_3 = 0.5 * hoechstgrenze_item3 else: item_3 = 0.5 * (item_1 - item_2) out = _vorsorgeaufw_vom_lohn_tu_bis_2004 + item_2 + item_3 return out
@dates_active(end="2019-12-31") def _vorsorgeaufw_vom_lohn_tu_bis_2004( bruttolohn_m_tu: float, gemeinsam_veranlagt_tu: bool, eink_st_abzuege_params: dict, ) -> float: """Calculate precautionary expenditures until 2019 for singles. Parameters ---------- bruttolohn_m_tu See :func:`bruttolohn_m_tu`. gemeinsam_veranlagt_tu See :func:`gemeinsam_veranlagt_tu`. eink_st_abzuege_params See params documentation :ref:`eink_st_abzuege_params <eink_st_abzuege_params>`. Returns ------- """ if gemeinsam_veranlagt_tu: out = 0.5 * ( 2 * eink_st_abzuege_params["vorsorge2004_vorwegabzug"] - eink_st_abzuege_params["vorsorge2004_kürzung_vorwegabzug"] * 12 * bruttolohn_m_tu ) else: out = ( eink_st_abzuege_params["vorsorge2004_vorwegabzug"] - eink_st_abzuege_params["vorsorge2004_kürzung_vorwegabzug"] * 12 * bruttolohn_m_tu ) return max(out, 0.0)