Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions interface-prototype.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,8 @@
" \"aus_selbstständiger_arbeit\": {\"betrag_m\": \"income_from_self_employment\"},\n",
" \"aus_kapitalvermögen\": {\"kapitalerträge_m\": \"income_from_capital\"},\n",
" \"sonstige\": {\n",
" \"ohne_renten_m\": \"income_from_other_sources\",\n",
" \"renteneinkünfte_m\": \"pension_income\",\n",
" \"alle_weiteren_m\": \"income_from_other_sources\",\n",
" \"betrag_m\": \"pension_income\",\n",
" },\n",
" },\n",
" \"abzüge\": {\n",
Expand Down
14 changes: 10 additions & 4 deletions src/_gettsim/arbeitslosengeld_2/einkommen.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,15 @@ def nettoeinkommen_vor_abzug_freibetrag_m(
@policy_function(start_date="2005-01-01")
def bruttoeinkommen_m(
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__bruttolohn_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__sonstige__alle_weiteren_m: float,
einkommensteuer__einkünfte__sonstige__rente__sonstige_private_vorsorge_m: float,
einkommensteuer__einkünfte__sonstige__rente__geförderte_private_vorsorge_m: float,
einkommensteuer__einkünfte__sonstige__rente__betriebliche_altersvorsorge_m: float,
einkommensteuer__einkünfte__aus_kapitalvermögen__kapitalerträge_m: float,
sozialversicherung__rente__altersrente__betrag_m: float,
sozialversicherung__rente__private_rente_betrag_m: float,
sozialversicherung__rente__erwerbsminderung__betrag_m: float,
sozialversicherung__arbeitslosen__betrag_m: float,
elterngeld__betrag_m: float,
) -> float:
Expand All @@ -97,12 +100,15 @@ def bruttoeinkommen_m(
"""
return (
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__bruttolohn_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
+ einkommensteuer__einkünfte__sonstige__alle_weiteren_m
+ einkommensteuer__einkünfte__sonstige__rente__sonstige_private_vorsorge_m
+ einkommensteuer__einkünfte__sonstige__rente__geförderte_private_vorsorge_m
+ einkommensteuer__einkünfte__sonstige__rente__betriebliche_altersvorsorge_m
+ sozialversicherung__rente__altersrente__betrag_m
+ sozialversicherung__rente__private_rente_betrag_m
+ sozialversicherung__rente__erwerbsminderung__betrag_m
+ sozialversicherung__arbeitslosen__betrag_m
+ elterngeld__betrag_m
)
Expand Down
11 changes: 1 addition & 10 deletions src/_gettsim/einkommensteuer/einkünfte/sonstige/inputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,9 @@


@policy_input()
def ohne_renten_m() -> float:
def alle_weiteren_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.
"""


@policy_input(start_date="2021-01-01")
def renteneinkünfte_vorjahr_m() -> float:
"""Income from private and public pensions in the previous year.

GETTSIM can calculate this input based on the data of the previous year using the
target `("einkommensteuer", "einkünfte", "sonstige", "renteneinkünfte_m")`.
"""
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from __future__ import annotations
46 changes: 46 additions & 0 deletions src/_gettsim/einkommensteuer/einkünfte/sonstige/rente/inputs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
"""Input columns."""

from __future__ import annotations

from ttsim.tt_dag_elements import policy_input


@policy_input()
def alle_weiteren_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.
"""


@policy_input(start_date="2021-01-01")
def gesamtbetrag_vorjahr_m() -> float:
"""Income from private and public pensions in the previous year.

GETTSIM can calculate this input based on the data of the previous year using the
target `("einkommensteuer", "einkünfte", "sonstige", "betrag_m")`.
"""


@policy_input()
def sonstige_private_vorsorge_m() -> float:
"""Monthly payout from private pensions without tax-favored contributions.

This refers to pension payments from plans where the original
contributions were not tax-deductible (or tax-exempt).
"""


@policy_input()
def geförderte_private_vorsorge_m() -> float:
"""Monthly payout from private pensions with tax-favored contributions.

This refers to pension payments from plans where the original
contributions were tax-deductible (or tax-exempt). Primarily Riesterrente.
"""


@policy_input()
def betriebliche_altersvorsorge_m() -> float:
"""Amount of monthly occupational pension."""
53 changes: 53 additions & 0 deletions src/_gettsim/einkommensteuer/einkünfte/sonstige/rente/rente.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
"""Sonstige Einkünfte according to § 22 EStG."""

from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from types import ModuleType

from ttsim.tt_dag_elements import (
PiecewisePolynomialParamValue,
piecewise_polynomial,
policy_function,
)


@policy_function()
def betrag_m(
ertragsanteil: float,
sozialversicherung__rente__altersrente__betrag_m: float,
sozialversicherung__rente__erwerbsminderung__betrag_m: float,
geförderte_private_vorsorge_m: float,
sonstige_private_vorsorge_m: float,
betriebliche_altersvorsorge_m: float,
) -> float:
"""Pension income counting towards taxable income.

Reference: § 22 EStG
"""
return (
ertragsanteil
* (
sozialversicherung__rente__altersrente__betrag_m
+ sozialversicherung__rente__erwerbsminderung__betrag_m
+ sonstige_private_vorsorge_m
)
+ betriebliche_altersvorsorge_m
+ geförderte_private_vorsorge_m
)


@policy_function()
def ertragsanteil(
sozialversicherung__rente__jahr_renteneintritt: int,
parameter_ertragsanteil: PiecewisePolynomialParamValue,
xnp: ModuleType,
) -> float:
"""Share of pensions subject to income taxation."""
return piecewise_polynomial(
x=sozialversicherung__rente__jahr_renteneintritt,
parameters=parameter_ertragsanteil,
xnp=xnp,
)
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@
---
parameter_ertragsanteil_der_rente:
parameter_ertragsanteil:
name:
de: >-
Ertragsanteil-Funktion für den Anteil an sozialversicherungspflichtigen
Renteneinkommen, der versteuert werden muss (piecewise linear)
Parameter der Ertragsanteil-Funktion für den Anteil an
sozialversicherungspflichtigen Renteneinkommen, das versteuert werden muss.
en: >-
Piecewise linear function for calculating the share of pensions subject to income
taxation.
Parameter of the Ertragsanteil-function for the share of pensions subject to
income taxation that is subject to income tax.
description:
de: >-
Renten werden mit dem Ertragsanteil besteuert sofern sie nicht aus einer staatlich
geförderten (d.h. in der Einzahlungsphase steuerlich begünstigten) Vorsorgeform
stammen.
§ 22 EStG
Diese Funktion ist hier ab 2002 angegeben. Vor 2002 das Steuersystem ist nicht
implementiert.
en: null
en: >-
Pensions are taxed with the Ertragsanteil unless they come from a state-sponsored
(i.e. tax-benefited) pension fund.
§ 22 EStG
This function is given from 2002 onwards. Before 2002, the tax system is not
implemented.
unit: null
reference_period: null
type: piecewise_linear
# type: require_converter
2002-01-01:
0:
lower_threshold: -inf
Expand Down
44 changes: 4 additions & 40 deletions src/_gettsim/einkommensteuer/einkünfte/sonstige/sonstige.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,13 @@

from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from types import ModuleType

from ttsim.tt_dag_elements import (
PiecewisePolynomialParamValue,
piecewise_polynomial,
policy_function,
)
from ttsim.tt_dag_elements import policy_function


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


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


@policy_function()
def ertragsanteil_der_rente(
sozialversicherung__rente__jahr_renteneintritt: int,
parameter_ertragsanteil_der_rente: PiecewisePolynomialParamValue,
xnp: ModuleType,
) -> float:
"""Share of pensions subject to income taxation."""
return piecewise_polynomial(
x=sozialversicherung__rente__jahr_renteneintritt,
parameters=parameter_ertragsanteil_der_rente,
xnp=xnp,
)
return alle_weiteren_m + rente__betrag_m
39 changes: 24 additions & 15 deletions src/_gettsim/grundsicherung/im_alter/einkommen.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
@policy_function()
def einkommen_m(
erwerbseinkommen_m: float,
private_rente_betrag_m: float,
einkommen_aus_zusätzlicher_altersvorsorge_m: float,
gesetzliche_rente_m: float,
einkommensteuer__einkünfte__sonstige__ohne_renten_m: float,
einkommensteuer__einkünfte__sonstige__alle_weiteren_m: float,
einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_m: float,
kapitaleinkommen_brutto_m: float,
einkommensteuer__betrag_m_sn: float,
Expand All @@ -34,8 +34,8 @@ def einkommen_m(
total_income = (
erwerbseinkommen_m
+ gesetzliche_rente_m
+ private_rente_betrag_m
+ einkommensteuer__einkünfte__sonstige__ohne_renten_m
+ einkommen_aus_zusätzlicher_altersvorsorge_m
+ einkommensteuer__einkünfte__sonstige__alle_weiteren_m
+ einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_m
+ kapitaleinkommen_brutto_m
+ elterngeld__anrechenbarer_betrag_m
Expand Down Expand Up @@ -110,8 +110,10 @@ def kapitaleinkommen_brutto_m_mit_freibetrag(


@policy_function(start_date="2011-01-01")
def private_rente_betrag_m(
sozialversicherung__rente__private_rente_betrag_m: float,
def einkommen_aus_zusätzlicher_altersvorsorge_m(
einkommensteuer__einkünfte__sonstige__rente__sonstige_private_vorsorge_m: float,
einkommensteuer__einkünfte__sonstige__rente__geförderte_private_vorsorge_m: float,
einkommensteuer__einkünfte__sonstige__rente__betriebliche_altersvorsorge_m: float,
anrechnungsfreier_anteil_private_renteneinkünfte: PiecewisePolynomialParam,
grundsicherung__regelbedarfsstufen: Regelbedarfsstufen,
xnp: ModuleType,
Expand All @@ -121,18 +123,25 @@ def private_rente_betrag_m(

Legal reference: § 82 SGB XII Abs. 4
"""
sozialversicherung__rente__private_rente_betrag_m_amount_exempt = (
piecewise_polynomial(
x=sozialversicherung__rente__private_rente_betrag_m,
parameters=anrechnungsfreier_anteil_private_renteneinkünfte,
xnp=xnp,
)
freibetrag = piecewise_polynomial(
x=(
einkommensteuer__einkünfte__sonstige__rente__sonstige_private_vorsorge_m
+ einkommensteuer__einkünfte__sonstige__rente__geförderte_private_vorsorge_m
+ einkommensteuer__einkünfte__sonstige__rente__betriebliche_altersvorsorge_m
),
parameters=anrechnungsfreier_anteil_private_renteneinkünfte,
xnp=xnp,
)
upper = grundsicherung__regelbedarfsstufen.rbs_1 / 2

return sozialversicherung__rente__private_rente_betrag_m - min(
sozialversicherung__rente__private_rente_betrag_m_amount_exempt,
upper,
return (
einkommensteuer__einkünfte__sonstige__rente__sonstige_private_vorsorge_m
+ einkommensteuer__einkünfte__sonstige__rente__geförderte_private_vorsorge_m
+ einkommensteuer__einkünfte__sonstige__rente__betriebliche_altersvorsorge_m
- min(
freibetrag,
upper,
)
)


Expand Down
6 changes: 4 additions & 2 deletions src/_gettsim/sozialversicherung/kranken/beitrag/einkommen.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,14 @@ def bezugsgröße_selbstständige_m(
@policy_function()
def bemessungsgrundlage_rente_m(
sozialversicherung__rente__altersrente__betrag_m: float,
sozialversicherung__rente__private_rente_betrag_m: float,
sozialversicherung__rente__erwerbsminderung__betrag_m: float,
einkommensteuer__einkünfte__sonstige__rente__betriebliche_altersvorsorge_m: float,
beitragsbemessungsgrenze_m: float,
) -> float:
"""Pension income which is subject to health insurance contribution."""
return min(
sozialversicherung__rente__altersrente__betrag_m
+ sozialversicherung__rente__private_rente_betrag_m,
+ sozialversicherung__rente__erwerbsminderung__betrag_m
+ einkommensteuer__einkünfte__sonstige__rente__betriebliche_altersvorsorge_m,
beitragsbemessungsgrenze_m,
)
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def betrag_m(basisbetrag_m: float, anzurechnendes_einkommen_m: float) -> float:

@policy_function(start_date="2021-01-01")
def einkommen_m(
einkommensteuer__einkünfte__sonstige__renteneinkünfte_vorjahr_m: float,
einkommensteuer__einkünfte__sonstige__rente__gesamtbetrag_vorjahr_m: float,
einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__bruttolohn_vorjahr_m: float,
einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_m: float,
einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_m: float,
Expand Down Expand Up @@ -57,7 +57,7 @@ def einkommen_m(
"""
# Sum income over different income sources.
return (
einkommensteuer__einkünfte__sonstige__renteneinkünfte_vorjahr_m
einkommensteuer__einkünfte__sonstige__rente__gesamtbetrag_vorjahr_m
+ einkommensteuer__einkünfte__aus_nichtselbstständiger_arbeit__bruttolohn_vorjahr_m
+ einkommensteuer__einkünfte__aus_selbstständiger_arbeit__betrag_m # income from self-employment
+ einkommensteuer__einkünfte__aus_vermietung_und_verpachtung__betrag_m # rental income
Expand Down
5 changes: 0 additions & 5 deletions src/_gettsim/sozialversicherung/rente/inputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,6 @@ def pflichtbeitragsmonate() -> float:
"""Total months of mandatory pension insurance contributions."""


@policy_input()
def private_rente_betrag_m() -> float:
"""Amount of monthly private pension."""


@policy_input()
def pflegeberücksichtigungszeiten_monate() -> float:
"""Total months of home care provision (01.01.1992-31.03.1995)."""
Loading
Loading