Skip to content
Merged
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ extend-ignore = [
"PLC2401", # Allow non-ASCII characters in variable names.
"PLC2403", # Allow non-ASCII function names for imports.
"N999", # Allow non-ASCII characters in file names.
"PLR0913", # Too many arguments in function definition.

# Things we are not sure we want
# ==============================
Expand Down
12 changes: 6 additions & 6 deletions src/_gettsim/arbeitslosengeld_2/einkommen.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,9 @@ def nettoeinkommen_vor_abzug_freibetrag_m(


@policy_function()
def bruttoeinkommen_m( # noqa: PLR0913
def bruttoeinkommen_m(
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__bruttolohn_m: float,
einkommensteuer__einkünfte__sonstige__betrag_m: float,
einkommensteuer__einkünfte__sonstige__ohne_renten_m: float,
einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_m: float,
einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_m: float,
einkommensteuer__einkünfte__aus_kapitalvermögen__kapitalerträge_m: float,
Expand All @@ -131,8 +131,8 @@ def bruttoeinkommen_m( # noqa: PLR0913
----------
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__bruttolohn_m
See basic input variable :ref:`hh_id <hh_id>`.
einkommensteuer__einkünfte__sonstige__betrag_m
See basic input variable :ref:`einkommensteuer__einkünfte__sonstige__betrag_m <einkommensteuer__einkünfte__sonstige__betrag_m>`.
einkommensteuer__einkünfte__sonstige__ohne_renten_m
See basic input variable :ref:`einkommensteuer__einkünfte__sonstige__ohne_renten_m <einkommensteuer__einkünfte__sonstige__ohne_renten_m>`.
einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_m
See basic input variable :ref:`einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_m <einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_m>`.
einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_m
Expand All @@ -155,7 +155,7 @@ def bruttoeinkommen_m( # noqa: PLR0913
"""
out = (
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__bruttolohn_m
+ einkommensteuer__einkünfte__sonstige__betrag_m
+ einkommensteuer__einkünfte__sonstige__ohne_renten_m
+ einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_m
+ einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_m
+ einkommensteuer__einkünfte__aus_kapitalvermögen__kapitalerträge_m
Expand All @@ -169,7 +169,7 @@ def bruttoeinkommen_m( # noqa: PLR0913


@policy_function(end_date="2005-09-30")
def nettoquote_m( # noqa: PLR0913
def nettoquote_m(
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__bruttolohn_m: float,
einkommensteuer__betrag_m_sn: float,
solidaritätszuschlag__betrag_m_sn: float,
Expand Down
2 changes: 1 addition & 1 deletion src/_gettsim/arbeitslosengeld_2/group_by_ids.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ def bg_id(


@group_by_function()
def fg_id( # noqa: PLR0913 PLR0912
def fg_id( # noqa: PLR0912
p_id_einstandspartner: numpy.ndarray[int],
p_id: numpy.ndarray[int],
hh_id: numpy.ndarray[int],
Expand Down
2 changes: 1 addition & 1 deletion src/_gettsim/arbeitslosengeld_2/kindergeldübertrag.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ def kindergeld_zur_bedarfsdeckung_m(


@policy_function()
def differenz_kindergeld_kindbedarf_m( # noqa: PLR0913
def differenz_kindergeld_kindbedarf_m(
regelbedarf_m_bg: float,
nettoeinkommen_nach_abzug_freibetrag_m: float,
wohngeld__anspruchshöhe_m_bg: float,
Expand Down
4 changes: 2 additions & 2 deletions src/_gettsim/einkommensteuer/abzüge/altersfreibetrag.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@


@policy_function(end_date="2004-12-31", leaf_name="altersfreibetrag_y")
def altersfreibetrag_y_bis_2004( # noqa: PLR0913
def altersfreibetrag_y_bis_2004(
alter: int,
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__bruttolohn_y: float,
einkommensteuer__einkünfte__aus_kapitalvermögen__kapitalerträge_y: float,
Expand Down Expand Up @@ -57,7 +57,7 @@ def altersfreibetrag_y_bis_2004( # noqa: PLR0913


@policy_function(start_date="2005-01-01", leaf_name="altersfreibetrag_y")
def altersfreibetrag_y_ab_2005( # noqa: PLR0913
def altersfreibetrag_y_ab_2005(
alter: int,
geburtsjahr: int,
sozialversicherung__geringfügig_beschäftigt: bool,
Expand Down
4 changes: 2 additions & 2 deletions src/_gettsim/einkommensteuer/abzüge/vorsorgeaufwendungen.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ def vorsorgeaufwendungen_regime_bis_2004_y_sn(
start_date="2005-01-01",
end_date="2009-12-31",
)
def vorsorgeaufwendungen_globale_kappung_y_sn( # noqa: PLR0913
def vorsorgeaufwendungen_globale_kappung_y_sn(
altersvorsorge_y_sn: float,
sozialversicherung__kranken__beitrag__betrag_versicherter_y_sn: float,
sozialversicherung__arbeitslosen__beitrag__betrag_versicherter_y_sn: float,
Expand Down Expand Up @@ -236,7 +236,7 @@ def vorsorgeaufwendungen_globale_kappung_y_sn( # noqa: PLR0913
@policy_function(
start_date="2010-01-01",
)
def vorsorgeaufwendungen_keine_kappung_krankenversicherung_y_sn( # noqa: PLR0913
def vorsorgeaufwendungen_keine_kappung_krankenversicherung_y_sn(
altersvorsorge_y_sn: float,
sozialversicherung__pflege__beitrag__betrag_versicherter_y_sn: float,
sozialversicherung__kranken__beitrag__betrag_versicherter_y_sn: float,
Expand Down
157 changes: 5 additions & 152 deletions src/_gettsim/einkommensteuer/einkommen.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,162 +3,15 @@
Einkommen are Einkünfte minus Sonderausgaben, Vorsorgeaufwendungen, außergewöhnliche
Belastungen and sonstige Abzüge."""

from ttsim import piecewise_polynomial, policy_function
from ttsim import policy_function


@policy_function()
def gesamteinkommen_y(
gesamteinkommen_ohne_abzüge_y_sn: float,
einkommensteuer__abzüge__betrag_y_sn: float,
einkünfte__gesamtbetrag_der_einkünfte_y_sn: float,
abzüge__betrag_y_sn: float,
) -> float:
"""Calculate taxable income without child allowance on Steuernummer level.

Parameters
----------
gesamteinkommen_ohne_abzüge_y_sn
See :func:`gesamteinkommen_ohne_abzüge_y_sn`.
einkommensteuer__abzüge__betrag_y_sn
See :func:`einkommensteuer__abzüge__betrag_y_sn`.


Returns
-------

"""
out = gesamteinkommen_ohne_abzüge_y_sn - einkommensteuer__abzüge__betrag_y_sn
"""Gesamteinkommen without Kinderfreibetrag on tax unit level."""
out = einkünfte__gesamtbetrag_der_einkünfte_y_sn - abzüge__betrag_y_sn

return max(out, 0.0)


@policy_function(end_date="2008-12-31", leaf_name="gesamteinkommen_ohne_abzüge_y")
def gesamteinkommen_ohne_abzüge_mit_kapitaleinkünften_y(
einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_y: float,
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__betrag_y: float,
einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_y: float,
renteneinkommen_y: float,
einkommensteuer__einkünfte__aus_kapitalvermögen__betrag_y: float,
) -> float:
"""Sum of gross incomes with capital income.

# TODO(@MImmesberger): Use this function to compute sum of Einkünfte instead. In
particular, don't add Renteneinkommen here, but Renteneinkünfte.
# https://github.com/iza-institute-of-labor-economics/gettsim/issues/842

Parameters
----------
einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_y
See :func:`einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_y`.
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__betrag_y
See :func:`einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__betrag_y`.
einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_y
See :func:`einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_y`.
renteneinkommen_y
See :func:`renteneinkommen_y`.
einkommensteuer__einkünfte__aus_kapitalvermögen__betrag_y
See :func:`einkommensteuer__einkünfte__aus_kapitalvermögen__betrag_y`.

Returns
-------

"""
out = (
einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_y
+ einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__betrag_y
+ einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_y
+ renteneinkommen_y
+ einkommensteuer__einkünfte__aus_kapitalvermögen__betrag_y
)
return out


@policy_function(start_date="2009-01-01", leaf_name="gesamteinkommen_ohne_abzüge_y")
def gesamteinkommen_ohne_abzüge_ohne_kapitaleinkünfte_y(
einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_y: float,
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__betrag_y: float,
einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_y: float,
renteneinkommen_y: float,
) -> float:
"""Sum of gross incomes without capital income.

Since 2009 capital income is not subject to normal taxation.
Parameters
----------
einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_y
See :func:`einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_y`.
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__betrag_y
See :func:`einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__betrag_y`.
einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_y
See :func:`einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_y`.
renteneinkommen_y
See :func:`renteneinkommen_y`.

Returns
-------

"""
out = (
einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_y
+ einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__betrag_y
+ einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_y
+ renteneinkommen_y
)
return out


@policy_function()
def renteneinkommen_m(
sozialversicherung__rente__altersrente__betrag_m: float,
sozialversicherung__rente__private_rente_betrag_m: float,
rente_ertragsanteil: float,
) -> float:
"""Calculate monthly pension payment subject to taxation.

# TODO(@MImmesberger): Add Renteneinkünfte to Einkünfte/Sonstige namespace.
# Calculate deduction from Renteneinkünfte in Abzüge dir instead of Renteneinkommen
# here directly.
# https://github.com/iza-institute-of-labor-economics/gettsim/issues/842

Parameters
----------
sozialversicherung__rente__altersrente__betrag_m
See :func:`sozialversicherung__rente__altersrente__betrag_m`.
sozialversicherung__rente__private_rente_betrag_m
See :func:`sozialversicherung__rente__private_rente_betrag_m`.
rente_ertragsanteil
See :func:`rente_ertragsanteil`.

Returns
-------

"""
return rente_ertragsanteil * (
sozialversicherung__rente__altersrente__betrag_m
+ sozialversicherung__rente__private_rente_betrag_m
)


@policy_function()
def rente_ertragsanteil(
sozialversicherung__rente__jahr_renteneintritt: int, eink_st_params: dict
) -> float:
"""Share of pensions subject to income taxation.

Parameters
----------
sozialversicherung__rente__jahr_renteneintritt
See basic input variable :ref:`sozialversicherung__rente__jahr_renteneintritt <sozialversicherung__rente__jahr_renteneintritt>`.
eink_st_params
See params documentation :ref:`eink_st_params <eink_st_params>`.
Returns
-------

"""
out = piecewise_polynomial(
x=sozialversicherung__rente__jahr_renteneintritt,
thresholds=eink_st_params["rente_ertragsanteil"]["thresholds"],
rates=eink_st_params["rente_ertragsanteil"]["rates"],
intercepts_at_lower_thresholds=eink_st_params["rente_ertragsanteil"][
"intercepts_at_lower_thresholds"
],
)
return out
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
"""Input columns."""

from ttsim import policy_input


@policy_input()
def betrag_m() -> float:
"""Monthly income from forestry and agriculture."""
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
"""Input columns."""

from ttsim import policy_input


@policy_input()
def betrag_m() -> float:
"""Monthly business income."""
50 changes: 50 additions & 0 deletions src/_gettsim/einkommensteuer/einkünfte/einkünfte.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
"""Einkünfte according to §§ 13-24 EStG."""

from ttsim import policy_function


@policy_function(end_date="2008-12-31", leaf_name="gesamtbetrag_der_einkünfte_y")
def gesamtbetrag_der_einkünfte_y_mit_kapiteleinkünften(
aus_forst_und_landwirtschaft__betrag_y: float,
aus_gewerbebetrieb__betrag_y: float,
aus_selbstständiger_arbeit__betrag_y: float,
aus_nichtselbstständiger_arbeit__betrag_y: float,
aus_kapitalvermögen__betrag_y: float,
aus_vermietung_und_verpachtung__betrag_y: float,
sonstige__betrag_y: float,
) -> float:
"""Gesamtbetrag der Einkünfte (GdE) with capital income."""
out = (
aus_forst_und_landwirtschaft__betrag_y
+ aus_gewerbebetrieb__betrag_y
+ aus_selbstständiger_arbeit__betrag_y
+ aus_nichtselbstständiger_arbeit__betrag_y
+ aus_kapitalvermögen__betrag_y
+ aus_vermietung_und_verpachtung__betrag_y
+ sonstige__betrag_y
)
return out


@policy_function(start_date="2009-01-01", leaf_name="gesamtbetrag_der_einkünfte_y")
def gesamtbetrag_der_einkünfte_y_ohne_kapitaleinkünfte(
aus_forst_und_landwirtschaft__betrag_y: float,
aus_gewerbebetrieb__betrag_y: float,
aus_selbstständiger_arbeit__betrag_y: float,
aus_nichtselbstständiger_arbeit__betrag_y: float,
aus_vermietung_und_verpachtung__betrag_y: float,
sonstige__betrag_y: float,
) -> float:
"""Gesamtbetrag der Einkünfte (GdE) without capital income.

Since 2009 capital income is not subject to normal taxation.
"""
out = (
aus_forst_und_landwirtschaft__betrag_y
+ aus_gewerbebetrieb__betrag_y
+ aus_selbstständiger_arbeit__betrag_y
+ aus_nichtselbstständiger_arbeit__betrag_y
+ aus_vermietung_und_verpachtung__betrag_y
+ sonstige__betrag_y
)
return out
8 changes: 6 additions & 2 deletions src/_gettsim/einkommensteuer/einkünfte/sonstige/inputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,9 @@


@policy_input()
def betrag_m() -> float:
"""Additional income: includes private and public transfers that are not yet implemented in GETTSIM (e.g., BAföG, Kriegsopferfürsorge)"""
def ohne_renten_m() -> float:
"""Additional income: includes private and public transfers that are not yet
implemented in GETTSIM (e.g., BAföG, Kriegsopferfürsorge).

Excludes income from public and private pensions.
"""
40 changes: 40 additions & 0 deletions src/_gettsim/einkommensteuer/einkünfte/sonstige/sonstige.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""Sonstige Einkünfte according to § 22 EStG."""

from ttsim import piecewise_polynomial, policy_function


@policy_function()
def betrag_m(
ohne_renten_m: float,
renteneinkünfte_m: float,
) -> float:
"""Total sonstige Einkünfte."""
return ohne_renten_m + renteneinkünfte_m


@policy_function()
def renteneinkünfte_m(
rente_ertragsanteil: float,
sozialversicherung__rente__altersrente__betrag_m: float,
sozialversicherung__rente__private_rente_betrag_m: float,
) -> float:
"""Pension income counting towards taxable income."""
return rente_ertragsanteil * (
sozialversicherung__rente__altersrente__betrag_m
+ sozialversicherung__rente__private_rente_betrag_m
)


@policy_function()
def rente_ertragsanteil(
sozialversicherung__rente__jahr_renteneintritt: int, eink_st_params: dict
) -> float:
"""Share of pensions subject to income taxation."""
return piecewise_polynomial(
x=sozialversicherung__rente__jahr_renteneintritt,
thresholds=eink_st_params["rente_ertragsanteil"]["thresholds"],
rates=eink_st_params["rente_ertragsanteil"]["rates"],
intercepts_at_lower_thresholds=eink_st_params["rente_ertragsanteil"][
"intercepts_at_lower_thresholds"
],
)
Loading
Loading