Skip to content
Open
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
2 changes: 2 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ All releases are available on [Anaconda.org](https://anaconda.org/conda-forge/ge

## Unreleased

- {gh}`1163` Implement Bedarfsanteilmethode for Bürgergeld/ALG2.
({ghuser}`MImmesberger`)
- {gh}`1160` Make `tests-with-cov` use loop vectorization to enable coverage reporting.
({ghuser}`hmgaudecker`)

Expand Down
69 changes: 56 additions & 13 deletions src/gettsim/germany/arbeitslosengeld_2/arbeitslosengeld_2.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@


@policy_function(start_date="2005-01-01", end_date="2022-12-31")
def betrag_m_bg(
anspruchshöhe_m_bg: float,
def betrag_m(
anspruchshöhe_m: float,
vorrangprüfungen__wohngeld_kinderzuschlag_vorrangig_oder_günstiger: bool,
volljährige_alle_rentenbezieher_hh: bool,
) -> float:
Expand All @@ -24,25 +24,68 @@ def betrag_m_bg(
):
out = 0.0
else:
out = anspruchshöhe_m_bg
out = anspruchshöhe_m

return out


@policy_function(start_date="2005-01-01", end_date="2022-12-31")
def anspruchshöhe_m_bg(
regelbedarf_m_bg: float,
anzurechnendes_einkommen_m_bg: float,
def anspruchshöhe_m(
ungedeckter_bedarf_m: float,
ungedeckter_bedarf_m_bg: float,
einkommen_zur_verteilung_m_bg: float,
vermögen_bg: float,
vermögensfreibetrag_bg: float,
) -> float:
"""Potential basic subsistence (after income deduction and wealth check)."""
"""Individual share of BG entitlement using the Bedarfsanteilsmethode.

Adults' pooled income is distributed proportionally by each person's share of
ungedeckter Bedarf.

Reference: § 9 Abs. 2 Satz 3 SGB II, § 11 Abs. 1 Satz 5 SGB II
"""
anspruch_m_bg = max(0.0, ungedeckter_bedarf_m_bg - einkommen_zur_verteilung_m_bg)

if vermögen_bg > vermögensfreibetrag_bg:
out = 0.0
return 0.0
else:
out = max(
0.0,
regelbedarf_m_bg - anzurechnendes_einkommen_m_bg,
)
return (ungedeckter_bedarf_m / ungedeckter_bedarf_m_bg) * anspruch_m_bg

return out

@policy_function(start_date="2005-01-01", end_date="2022-12-31")
def ungedeckter_bedarf_m(
regelbedarf_m: float,
anzurechnendes_einkommen_m: float,
familie__ist_kind_in_bedarfsgemeinschaft: bool,
) -> float:
"""Bedarf after netting child's own income.

For children in the BG, own income (mainly Kindergeld) is first netted against
their own Bedarf per § 11 Abs. 1 Satz 5 SGB II. For adults, Bedarf is unchanged —
their income enters the pool for proportional distribution.

Reference: § 9 Abs. 2 Satz 3 SGB II
"""
if familie__ist_kind_in_bedarfsgemeinschaft:
return max(0.0, regelbedarf_m - anzurechnendes_einkommen_m)
else:
return regelbedarf_m


@policy_function(start_date="2005-01-01", end_date="2022-12-31")
def einkommen_zur_verteilung_m(
regelbedarf_m: float,
anzurechnendes_einkommen_m: float,
familie__ist_kind_in_bedarfsgemeinschaft: bool,
) -> float:
"""Income available for proportional distribution across BG.

Adults' full income enters the pool. For children, only excess income beyond own
Bedarf enters the pool; the rest was already netted in ungedeckter_bedarf_m.

Reference: § 9 Abs. 2 Satz 3 SGB II
"""
if familie__ist_kind_in_bedarfsgemeinschaft:
return max(0.0, anzurechnendes_einkommen_m - regelbedarf_m)
else:
return anzurechnendes_einkommen_m
69 changes: 56 additions & 13 deletions src/gettsim/germany/bürgergeld/bürgergeld.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@


@policy_function(start_date="2023-01-01")
def betrag_m_bg(
anspruchshöhe_m_bg: float,
def betrag_m(
anspruchshöhe_m: float,
vorrangprüfungen__wohngeld_kinderzuschlag_vorrangig_oder_günstiger: bool,
volljährige_alle_rentenbezieher_hh: bool,
) -> float:
Expand All @@ -25,25 +25,68 @@ def betrag_m_bg(
):
out = 0.0
else:
out = anspruchshöhe_m_bg
out = anspruchshöhe_m

return out


@policy_function(start_date="2023-01-01")
def anspruchshöhe_m_bg(
regelbedarf_m_bg: float,
anzurechnendes_einkommen_m_bg: float,
def anspruchshöhe_m(
ungedeckter_bedarf_m: float,
ungedeckter_bedarf_m_bg: float,
einkommen_zur_verteilung_m_bg: float,
vermögen_bg: float,
vermögensfreibetrag_bg: float,
) -> float:
"""Potential basic subsistence (after income deduction and wealth check)."""
"""Individual share of BG entitlement using the Bedarfsanteilsmethode.

Adults' pooled income is distributed proportionally by each person's share of
ungedeckter Bedarf.

Reference: § 9 Abs. 2 Satz 3 SGB II, § 11 Abs. 1 Satz 5 SGB II
"""
anspruch_m_bg = max(0.0, ungedeckter_bedarf_m_bg - einkommen_zur_verteilung_m_bg)

if vermögen_bg > vermögensfreibetrag_bg:
out = 0.0
return 0.0
else:
out = max(
0.0,
regelbedarf_m_bg - anzurechnendes_einkommen_m_bg,
)
return (ungedeckter_bedarf_m / ungedeckter_bedarf_m_bg) * anspruch_m_bg

return out

@policy_function(start_date="2023-01-01")
def ungedeckter_bedarf_m(
regelbedarf_m: float,
anzurechnendes_einkommen_m: float,
familie__ist_kind_in_bedarfsgemeinschaft: bool,
) -> float:
"""Bedarf after netting child's own income.

For children in the BG, own income (mainly Kindergeld) is first netted against
their own Bedarf per § 11 Abs. 1 Satz 5 SGB II. For adults, Bedarf is unchanged —
their income enters the pool for proportional distribution.

Reference: § 9 Abs. 2 Satz 3 SGB II
"""
if familie__ist_kind_in_bedarfsgemeinschaft:
return max(0.0, regelbedarf_m - anzurechnendes_einkommen_m)
else:
return regelbedarf_m


@policy_function(start_date="2023-01-01")
def einkommen_zur_verteilung_m(
regelbedarf_m: float,
anzurechnendes_einkommen_m: float,
familie__ist_kind_in_bedarfsgemeinschaft: bool,
) -> float:
"""Income available for proportional distribution across BG.

Adults' full income enters the pool. For children, only excess income beyond own
Bedarf enters the pool; the rest was already netted in ungedeckter_bedarf_m.

Reference: § 9 Abs. 2 Satz 3 SGB II
"""
if familie__ist_kind_in_bedarfsgemeinschaft:
return max(0.0, anzurechnendes_einkommen_m - regelbedarf_m)
else:
return anzurechnendes_einkommen_m
Loading
Loading