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
1 change: 1 addition & 0 deletions changelog.d/resolved-household-head.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Read one household head per household in every programme, so an `is_household_head` input that flags several members, or none, can no longer leave rent, non-dependant and Council Tax Reduction rules disagreeing about whose household it is.
1 change: 0 additions & 1 deletion policyengine_uk/dynamics/participation.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ def calculate_participation_elasticities(
is_single = ~is_married

# Get partner employment status for married individuals
is_household_head = sim.calculate("is_household_head", map_to="person")
benunit_count_adults = composition["count_aged_18_or_over"].values
employment_income = sim.calculate("employment_income")
benunit_id = sim.calculate("benunit_id", map_to="person")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,386 @@
# One household head per household, whatever is_household_head flags. With
# several members flagged, the eldest flagged member is the head; with none,
# the eldest member is; a tie in age goes to the member listed first among
# the people (is_resolved_household_head).
# Rent liability (UC Regs 2013 Sch 4 para 24; HB Regs 2006 reg 12B),
# non-dependants and the size criteria (UC Regs 2013 Sch 4 paras 9-10; HB Regs
# 2006 regs 3, 13D and 74), boarders and lodgers, Council Tax Reduction
# claimants and non-dependants (SI 2012/2885 reg 9 and Sch 1 paras 2-3; SI
# 2013/3029 reg 9; SSI 2021/249 reg 8) and the maintenance loan's
# living-arrangement proxy all read the same head, so they agree on whose
# household it is.

- name: Two members of separate families flagged as head - only the eldest flagged member's family has the rent, and the other family is its non-dependant
period: 2026
absolute_error_margin: 0.01
input:
people:
younger_flagged:
age: 40
is_household_head: true
uc_individual_non_dep_deduction: 1_000
household_benefits_individual_non_dep_deduction: 800
council_tax_reduction_individual_non_dep_deduction: 200
elder_flagged:
age: 60
is_household_head: true
benunits:
younger_family:
members: [younger_flagged]
elder_family:
members: [elder_flagged]
households:
home:
members: [younger_flagged, elder_flagged]
rent: 12_000
tenure_type: RENT_PRIVATELY
country: WALES
local_authority: CARDIFF
council_tax: 1_800
output:
is_resolved_household_head: [false, true]
benunit_contains_household_head: [false, true]
# Each flagged family used to have half the rent (6,000), and the younger
# one was then neither a Council Tax Reduction claimant nor a Universal
# Credit or Housing Benefit non-dependant.
is_liable_for_household_rent: [false, true]
share_of_household_rent: [0, 1]
personal_rent: [0, 12_000]
benunit_rent: [0, 12_000]
is_non_dependant_of_household_head: [true, false]
uc_non_dep_deductions: [0, 1_000]
housing_benefit_non_dep_deductions: [0, 800]
LHA_allowed_bedrooms: [1, 2]
housing_benefit_LHA_allowed_bedrooms: [1, 2]
lha_renter_has_non_dependant: [false, true]
council_tax_reduction_claimant_benunit: [false, true]
council_tax_reduction_individual_non_dep_deduction_eligible: [true, false]
council_tax_reduction_non_dep_deductions: [0, 200]

- name: A couple both flagged as head carry the household's rent once
period: 2026
absolute_error_margin: 0.01
input:
people:
head:
age: 40
is_household_head: true
partner:
age: 38
is_household_head: true
benunits:
family:
members: [head, partner]
households:
home:
members: [head, partner]
rent: 12_000
tenure_type: RENT_PRIVATELY
output:
is_resolved_household_head: [true, false]
is_liable_for_household_rent: [true, true]
# The family's share sits on one person, not on each flagged partner.
personal_rent: [12_000, 0]
benunit_rent: 12_000

- name: No member flagged as head - the eldest member's family has the rent, and the other family is its non-dependant
period: 2026
absolute_error_margin: 0.01
input:
people:
younger:
age: 40
is_household_head: false
uc_individual_non_dep_deduction: 1_000
household_benefits_individual_non_dep_deduction: 800
council_tax_reduction_individual_non_dep_deduction: 200
elder:
age: 60
is_household_head: false
benunits:
younger_family:
members: [younger]
elder_family:
members: [elder]
households:
home:
members: [younger, elder]
rent: 12_000
tenure_type: RENT_PRIVATELY
country: SCOTLAND
local_authority: CITY_OF_EDINBURGH
council_tax: 1_800
output:
is_resolved_household_head: [false, true]
benunit_contains_household_head: [false, true]
# No family used to be liable for the rent at all.
is_liable_for_household_rent: [false, true]
share_of_household_rent: [0, 1]
personal_rent: [0, 12_000]
is_non_dependant_of_household_head: [true, false]
uc_non_dep_deductions: [0, 1_000]
housing_benefit_non_dep_deductions: [0, 800]
LHA_allowed_bedrooms: [1, 2]
housing_benefit_LHA_allowed_bedrooms: [1, 2]
lha_renter_has_non_dependant: [false, true]
council_tax_reduction_claimant_benunit: [false, true]
council_tax_reduction_individual_non_dep_deduction_eligible: [true, false]
council_tax_reduction_non_dep_deductions: [0, 200]

- name: No member flagged as head and the eldest tied - the first eldest member's family is the head's
period: 2026
absolute_error_margin: 0.01
input:
people:
first:
age: 50
is_household_head: false
second:
age: 50
is_household_head: false
uc_individual_non_dep_deduction: 1_000
household_benefits_individual_non_dep_deduction: 800
benunits:
first_family:
members: [first]
second_family:
members: [second]
households:
home:
members: [first, second]
rent: 12_000
tenure_type: RENT_PRIVATELY
country: ENGLAND
local_authority: MAIDSTONE
council_tax: 1_800
output:
is_resolved_household_head: [true, false]
personal_rent: [12_000, 0]
is_non_dependant_of_household_head: [false, true]
uc_non_dep_deductions: [1_000, 0]
housing_benefit_non_dep_deductions: [800, 0]
council_tax_reduction_claimant_benunit: [true, false]
council_tax_reduction_individual_non_dep_deduction_eligible: [false, true]

- name: Two members flagged as head beside a sharer - the eldest flagged member's family and the sharer split the rent and claim, and the other flagged family is a non-dependant
period: 2026
absolute_error_margin: 0.01
input:
people:
younger_flagged:
age: 30
is_household_head: true
uc_individual_non_dep_deduction: 1_000
household_benefits_individual_non_dep_deduction: 800
council_tax_reduction_individual_non_dep_deduction: 200
elder_flagged:
age: 70
is_household_head: true
sharer:
age: 45
is_household_head: false
benunits:
younger_family:
members: [younger_flagged]
elder_family:
members: [elder_flagged]
sharer_family:
members: [sharer]
liable_for_share_of_household_rent: true
households:
home:
members: [younger_flagged, elder_flagged, sharer]
rent: 20_000
tenure_type: RENT_PRIVATELY
country: WALES
local_authority: CARDIFF
council_tax: 1_800
output:
is_resolved_household_head: [false, true, false]
benunit_contains_household_head: [false, true, false]
# Two people liable (UC Sch 4 para 24(4)): 10,000 each.
is_liable_for_household_rent: [false, true, true]
share_of_household_rent: [0, 0.5, 0.5]
benunit_rent: [0, 10_000, 10_000]
is_non_dependant_of_household_head: [true, false, false]
# UC counts the non-dependant in one claim by a liable renter only (UC
# Regs 2013 Sch 4 para 9(2)(f); see uc_non_dependants_counted): the
# head's family's if it claims, else the first liable family that does.
# The head is 70, over State Pension age, so not eligible for UC; the
# sharer's claim counts the non-dependant. HB apportions it between the
# joint occupiers by their shares of the rent (reg 74(5)).
is_uc_eligible: [true, false, true]
uc_non_dependants_counted: [false, false, true]
uc_non_dep_deductions: [0, 0, 1_000]
housing_benefit_non_dep_deductions: [0, 400, 400]
council_tax_reduction_claimant_benunit: [false, true, true]
council_tax_reduction_individual_non_dep_deduction_eligible: [true, false, false]

- name: The head and a sharer both flagged beside a non-dependant - only the head's family's Universal Credit claim counts the non-dependant
period: 2026
absolute_error_margin: 0.01
input:
people:
head:
age: 50
is_household_head: true
sharer:
age: 40
is_household_head: true
non_dependant:
age: 30
is_household_head: false
uc_individual_non_dep_deduction: 1_000
household_benefits_individual_non_dep_deduction: 800
council_tax_reduction_individual_non_dep_deduction: 200
benunits:
head_family:
members: [head]
sharer_family:
members: [sharer]
liable_for_share_of_household_rent: true
non_dependant_family:
members: [non_dependant]
households:
home:
members: [head, sharer, non_dependant]
rent: 20_000
tenure_type: RENT_PRIVATELY
country: WALES
local_authority: CARDIFF
council_tax: 1_800
output:
is_resolved_household_head: [true, false, false]
benunit_contains_household_head: [true, false, false]
# Two people liable (UC Sch 4 para 24(4)): 10,000 each.
is_liable_for_household_rent: [true, true, false]
share_of_household_rent: [0.5, 0.5, 0]
benunit_rent: [10_000, 10_000, 0]
is_non_dependant_of_household_head: [false, false, true]
# Both renters claim Universal Credit. UC Regs 2013 Sch 4 para 9(2)(f)
# lets only one of their claims count the non-dependant; the model gives
# them to the head's family's claim, so they are not one in the sharer's:
# one deduction and one extra bedroom (para 10), on the head's family.
# Read from the raw flag, both claims counted them.
is_uc_eligible: [true, true, true]
uc_non_dependants_counted: [true, false, false]
uc_non_dep_deductions: [1_000, 0, 0]
LHA_allowed_bedrooms: [2, 1, 1]
# HB apportions the deduction between the joint occupiers by their shares
# of the rent (reg 74(5)).
housing_benefit_non_dep_deductions: [400, 400, 0]
council_tax_reduction_claimant_benunit: [true, true, false]
council_tax_reduction_individual_non_dep_deduction_eligible: [false, false, true]

- name: A lodger flagged as head beside the householder pays the householder and has no share of the rent
period: 2026
absolute_error_margin: 0.01
input:
people:
householder:
age: 50
is_household_head: true
lodger:
age: 30
is_household_head: true
rent_paid_as_lodger: 5_200
benunits:
householder_family:
members: [householder]
lodger_family:
members: [lodger]
households:
home:
members: [householder, lodger]
rent: 12_000
tenure_type: RENT_FROM_COUNCIL
country: ENGLAND
local_authority: MAIDSTONE
council_tax: 1_800
output:
is_resolved_household_head: [true, false]
pays_rent_to_householder: [false, true]
share_of_household_rent: [1, 0]
personal_rent: [12_000, 5_200]
# The lodger rents privately from the householder, not from the council.
benunit_tenure_type: [RENT_FROM_COUNCIL, RENT_PRIVATELY]
is_non_dependant_of_household_head: [false, false]
council_tax_reduction_claimant_benunit: [true, false]
council_tax_reduction_individual_non_dep_deduction_eligible: [false, false]

- name: A student flagged as head beside their parent lives with their parents for the maintenance loan
period: 2025
input:
people:
parent:
age: 52
current_education: NOT_IN_EDUCATION
adjusted_net_income: 30_000
is_household_head: true
student:
age: 20
current_education: TERTIARY
adjusted_net_income: 2_000
is_household_head: true
benunits:
parent_benunit:
members: [parent]
student_benunit:
members: [student]
households:
household:
members: [parent, student]
country: ENGLAND
region: NORTH_WEST
output:
is_resolved_household_head: [true, false]
maintenance_loan_living_arrangement: [AWAY_OUTSIDE_LONDON, LIVING_WITH_PARENTS]
maintenance_loan_household_income: [30_000, 32_000]

- name: Where only one household flags its head, every other household's eldest member is its head
period: 2026
absolute_error_margin: 0.01
input:
people:
first_head:
age: 40
is_household_head: true
first_parent:
age: 70
is_household_head: false
second_younger:
age: 30
second_elder:
age: 65
benunits:
first_head_family:
members: [first_head]
first_parent_family:
members: [first_parent]
second_younger_family:
members: [second_younger]
second_elder_family:
members: [second_elder]
households:
first_home:
members: [first_head, first_parent]
rent: 12_000
tenure_type: RENT_PRIVATELY
country: ENGLAND
local_authority: MAIDSTONE
council_tax: 1_800
second_home:
members: [second_younger, second_elder]
rent: 9_000
tenure_type: RENT_PRIVATELY
country: ENGLAND
local_authority: MAIDSTONE
council_tax: 1_500
output:
# The second household's members default to false once anyone has the
# input, so no one there is flagged.
is_household_head: [true, false, false, false]
is_resolved_household_head: [true, false, false, true]
personal_rent: [12_000, 0, 0, 9_000]
is_non_dependant_of_household_head: [false, true, true, false]
council_tax_reduction_claimant_benunit: [true, false, false, true]
Loading
Loading