Skip to content

No Grundsicherung im Alter if a child's annual Gesamteinkommen is 100,000 € or more (§ 43 Abs. 5 SGB XII, 2005–2019)#1167

Merged
MImmesberger merged 67 commits into
gsia-rewritefrom
fix-1148
Jun 7, 2026
Merged

No Grundsicherung im Alter if a child's annual Gesamteinkommen is 100,000 € or more (§ 43 Abs. 5 SGB XII, 2005–2019)#1167
MImmesberger merged 67 commits into
gsia-rewritefrom
fix-1148

Conversation

@MImmesberger
Copy link
Copy Markdown
Member

@MImmesberger MImmesberger commented Mar 25, 2026

Summary

  • Implement the 100k children exclusion per § 43 Abs. 5 SGB XII (originally Abs. 2, BGBl. I 2003 S. 3022) for policy dates 2005–2019: applicants are excluded from Grundsicherung im Alter if any first-degree descendant has an annual Gesamteinkommen (§ 16 SGB IV) of 100,000 EUR or more. The threshold applies to each child individually.
  • The Angehörigen-Entlastungsgesetz (BGBl. I 2019 S. 2135) repealed the exclusion as of 2020-01-01. Since then the 100,000 EUR limit only restricts the Unterhaltsrückgriff of the Sozialhilfeträger against the children (§ 94 Abs. 1a SGB XII), which does not affect the benefit — betrag_m therefore no longer depends on children's income from 2020 on.
  • Add einkommensgrenze_kinder YAML parameter (100,000 EUR/year, 2005–2019, expired with a note on the repeal).
  • New policy functions: hat_gesamteinkommen_über_kindeseinkommensgrenze, hat_kind_mit_einkommen_über_einkommensgrenze_als_elternteil_1/_2 (AggType.ANY aggregations over both p_id_elternteil_* slots), and hat_kind_mit_einkommen_über_einkommensgrenze.
  • Gate betrag_m on the new check until 2019; separate betrag_m variant from 2020 on.
  • Add a documentation page explaining both regimes (docs/tt_explanations/childrens_income_grundsicherung_im_alter.md).
  • Policy cases for the exclusion live at 2018-07-01 (pre-repeal).
  • Bump ttsim-backend to current main for the any_by_p_id aggregation.

Closes #1148

🤖 Generated with Claude Code

MImmesberger and others added 30 commits March 21, 2026 17:22
The SGB XII benefit unit (§ 27 Abs. 2) includes the couple plus their minor
unmarried children (< 18) in the same household, not just the couple as in
SGB II's Einstandsgemeinschaft. This adds sg_id and switches Grundsicherung
im Alter from _eg to _sg aggregation.

Changes:
- Add sg_id group creation function with sgb_xii_sg_id_formula (age < 18)
- Add SG aggregation functions in familie.py (ist_kind_in_sozialhilfegemeinschaft,
  anzahl_kinder_sg, anzahl_erwachsene_sg, anzahl_personen_sg)
- Rename _eg → _sg throughout grundsicherung/im_alter namespace
- Fix vermögensfreibetrag bug: was using _fg counts, now uses _sg counts
- Move p_id_einstandspartner to familie namespace (shared across SGB II/XII)
- Collapse date-split fg_id/eg_id functions into single functions
- Remove unused EG child/adult functions from familie.py
- Update documentation (hh_concepts.md, AGENTS.md)
- Skip hh_id_25 test (needs recomputation with SG grouping)

Closes #1147
Supersedes #738

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
commit 8983f95
Author: Marvin Immesberger <immesberger@posteo.de>
Date:   Tue Mar 24 17:09:20 2026 +0100

    Add regression test.

commit 2674c22
Author: Marvin Immesberger <immesberger@posteo.de>
Date:   Tue Mar 24 17:02:03 2026 +0100

    Add test for Musterberechnung.

commit 1df9140
Author: Marvin Immesberger <immesberger@posteo.de>
Date:   Tue Mar 24 16:48:06 2026 +0100

    Bedarfsanteilmethode
Base automatically changed from bg-gemischt to gsia-rewrite June 4, 2026 15:36
Content of gsia-rewrite tip (squash-merge of PR #1164, bg-gemischt) is
tree-identical to the bg-gemischt branch tip already merged in the
previous commit, so this merge only records the history.
@MImmesberger MImmesberger changed the title Implement 100k children exclusion for Grundsicherung im Alter (§43 SGB XII) No Grundsicherung im Alter if a child's annual Gesamteinkommen is 100,000 € or more (§ 43 Abs. 5 SGB XII) Jun 4, 2026
MImmesberger and others added 2 commits June 4, 2026 18:07
CI's pixi v0.66.0 cannot read the version-7 pixi.lock written by
pixi >= 0.68.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Collaborator

@hmgaudecker hmgaudecker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just wondering whether the rule is really that simple cutoff? No exceptions, hardship, ... ?

Comment thread src/gettsim/germany/grundsicherung/im_alter/im_alter.py Outdated
Comment thread src/gettsim/germany/grundsicherung/im_alter/im_alter.py Outdated
MImmesberger and others added 5 commits June 6, 2026 11:55
- Rename p_id aggregations to anzahl_kinder_..._als_elternteil_1/2 (was
  über_elternteil_1/2) and document the parent-side semantics.
- End the §43 Abs. 5 SGB XII exclusion on 2019-12-31: the
  Angehörigen-Entlastungsgesetz (BGBl. I 2019 S. 2135) repealed it as of
  2020-01-01; since then the 100,000 Euro threshold only limits the
  recourse of the Sozialhilfeträger against the children (§94 Abs. 1a
  SGB XII), which does not affect the benefit.
- Add betrag_m variant without the children's income test from 2020 on.
- Expire the einkommensgrenze_kinder parameter accordingly.
- Move the kind_über/unter_einkommensgrenze policy cases from 2026-01-01
  to 2018-07-01 and adapt date-dependent inputs and expected outputs.
- Drop the hat_kind_mit_einkommen_über_einkommensgrenze input overrides
  from post-2020 policy cases (column no longer exists there).
- Clarify the test notes (monthly gross earnings instead of annual
  gross income).
- Add a docs page on children's income and Grundsicherung im Alter.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
# Conflicts:
#	.github/workflows/main.yml
#	CHANGES.md
#	docs/tt_explanations/index.md
#	pixi.lock
#	src/gettsim/germany/grundsicherung/im_alter/einkommen.py
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2023-07-01/vermögen_über_freibetrag.yaml
- Bump ttsim-backend to current main (1.2.2.dev11+gad3d21c12), which
  implements any/all/count/mean/max/min by_p_id aggregations.
- Use AggType.ANY for the per-parent children's income aggregations
  (hat_kind_mit_einkommen_über_einkommensgrenze_als_elternteil_1/2).
- Count einnahmen__renten__basisrente_m (introduced on main in #1175)
  in the pre-2018 Grundsicherung im Alter income concepts and provide
  it in the policy cases that lacked it.
- Drop redundant grundsicherung.hilfe_zum_lebensunterhalt.
  überschusseinkommen_m input overrides from policy cases (all zeros;
  the param function provides 0.0). The stricter auto-aggregation type
  resolution of current ttsim cannot type free input columns.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
# Conflicts:
#	CHANGES.md
#	docs/tt_explanations/index.md
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2010-07-01/mehrbedarf_bei_schwerbehinderung.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2017-07-01/hh_id_13.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2017-07-01/hh_id_16.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2017-07-01/hh_id_17.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2017-07-01/hh_id_6.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2017-07-01/kein_freibetrag_zusaetzliche_altersvorsorge.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2018-07-01/berufsständische_versorgung_kein_freibetrag.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2018-07-01/erwerbseinkommen.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2018-07-01/freibetrag_erreicht_obergrenze.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2018-07-01/freibetrag_unter_100.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2018-07-01/freibetrag_zusätzliche_altersvorsorge.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2018-07-01/hh_id_12.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2018-07-01/hh_id_20.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2018-07-01/hh_id_22.yaml
#	src/gettsim/tests_germany/policy_cases/grundsicherung/im_alter/2018-07-01/hh_id_3.yaml
@MImmesberger
Copy link
Copy Markdown
Member Author

MImmesberger commented Jun 6, 2026

Just wondering whether the rule is really that simple cutoff? No exceptions, hardship, ... ?

Good that you push back. Apparently since 2020 parents can actually receive Grundsicherung im Alter if their children earn more than 100k annually (before 2020 it was indeed a restriction that excluded the parents from receiving the transfer; no hardship rules, at least in the SGB). Today, parents receive Grundsicherung im Alter, but the Sozialamt can reach out to the children to get that money back afterwards if they are more than 100k.

AFAICT the Sozialämter usually do this but since it is not an automatically applied rule, I'd say we don't model if past 2019.

I added an explanation to GETTSIM's documentation and the corresponding functions.

@MImmesberger MImmesberger changed the title No Grundsicherung im Alter if a child's annual Gesamteinkommen is 100,000 € or more (§ 43 Abs. 5 SGB XII) No Grundsicherung im Alter if a child's annual Gesamteinkommen is 100,000 € or more (§ 43 Abs. 5 SGB XII, 2005–2019) Jun 6, 2026
MImmesberger and others added 2 commits June 6, 2026 14:46
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@hmgaudecker
Copy link
Copy Markdown
Collaborator

Could you please fix the test-jax errors before I look into this? Thanks!

@hmgaudecker
Copy link
Copy Markdown
Collaborator

but the Sozialamt can reach out to the children to get that money back afterwards if they are more than 100k. AFAICT the Sozialämter usually do this

In this case, I think we should add an input variable sozialamt_rückgriff_auf_kindereinkommen: bool (or so). We don't want to have a hard policy break when in practice, there often is none.

@hmgaudecker
Copy link
Copy Markdown
Collaborator

Actually, the more important reason: We want to be able to represent the clawback to children's income. The situation is not quite symmetric to take-up because we can always leave out a target and it won't be computed. If we left out the possibility here, we would not be able to represent it.

@MImmesberger
Copy link
Copy Markdown
Member Author

MImmesberger commented Jun 6, 2026

I'd prefer to postpone a proper treatment. It is complex because

  • children are obliged to pay Unterhalt according to the Düsseldorfer Tabelle; in that sense the problem is similar to determining parental Unterhalt for children
  • the Sozialhilfeträger's claim can never exceed the minimum of {individuelle Unterhaltsverpflichtung, geleistete Sozialhilfe, individuelle Leistungsfähigkeit}
  • Especially in the presence of multiple children its not trivial how the Amt distributes their claim across children. To me it seems like the children below earnings of 100k are relevant too (their liability share is not lost but the Amt takes care of it).

We could ofc provide a target maximaler_unterhaltsrückgriff_des_sozialamts which equals the parental Grundsicherung im Alter. But I'd be afraid of giving users a false sense of security regarding the implementation.

If you agree, I'll post the corresponding issue.

@hmgaudecker
Copy link
Copy Markdown
Collaborator

Agree, but I think I prefer keeping the pre-2020 rule as the default then despite this going against our philosophy. Again, easier to turn that off than to turn Rückgriff on if we don't model it.

Copy link
Copy Markdown
Collaborator

@hmgaudecker hmgaudecker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@MImmesberger MImmesberger merged commit 2be79c8 into gsia-rewrite Jun 7, 2026
10 of 14 checks passed
@MImmesberger MImmesberger deleted the fix-1148 branch June 7, 2026 11:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement 100k children exclusion for Grundsicherung im Alter (§43 Abs. 5 SGB XII)

2 participants