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/2551.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- A change to the statutory Marriage Allowance rate (`gov.hmrc.income_tax.allowances.marriage_allowance.max`) no longer switches on the CPS expanded Marriage Allowance reform. That reform now switches on only from its own parameters: `remove_income_condition`, or an `ma_rate` other than its default. Before, setting the statutory rate to 0 kept a 10% allowance for basic-rate couples and gave it to higher- and additional-rate couples, so income tax fell; now it removes the allowance.
12 changes: 8 additions & 4 deletions policyengine_uk/reforms/cps/marriage_tax_reforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,14 +218,18 @@ def create_marriage_tax_reform(parameters, period):
cps = parameters(period).gov.contrib.cps.marriage_tax_reforms
remove_income_condition = cps.expanded_ma.remove_income_condition
rate = cps.expanded_ma.ma_rate
original_rate = parameters(
period
).gov.hmrc.income_tax.allowances.marriage_allowance.max
# The expanded Marriage Allowance switches on from its own parameters
# only: its switch, or a rate other than its own unreformed value.
# Comparing the rate with the statutory rate instead would switch it on
# whenever the statutory rate changed, replacing that rate with the
# reform's and opening the allowance to higher-rate taxpayers (#2551).
unreformed = parameters.baseline.gov.contrib.cps.marriage_tax_reforms
default_rate = unreformed.expanded_ma.ma_rate(period)
ma_max_child_age = cps.expanded_ma.max_child_age
neutralise_income_tax = cps.marriage_neutral_it.neutralise_income_tax
it_max_child_age = cps.marriage_neutral_it.max_child_age

if remove_income_condition or rate != original_rate:
if remove_income_condition or rate != default_rate:
ma_reform = create_expanded_ma_reform(
max_child_age=ma_max_child_age if ma_max_child_age > 0 else None,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
# The statutory Marriage Allowance rate (#2551), for the two couples in the
# issue, by hand from the 2025-26 parameters: a £12,570 personal allowance, then
# 20% on the first £37,700 of taxable income and 40% above it.
#
# - Earner of £30,000: (30,000 - 12,570) x 20% = 3,486. At the 10% rate the
# partner transfers 12,570 x 10% = 1,257, rounded up to the next £10: 1,260,
# worth 1,260 x 20% = 252, so 3,234. At 20%, 2,514 rounds up to 2,520, worth
# 504, so 2,982. At 0 there is no allowance: 3,486.
# - Earner of £60,000: 37,700 x 20% + (60,000 - 12,570 - 37,700) x 40%
# = 7,540 + 3,892 = 11,432. A higher-rate taxpayer gets no allowance at any
# statutory rate.
#
# These runs apply the parameter change without policyengine_uk.Simulation, so
# they never run the parameter-switched structural reforms. The CPS reform's
# switch, which a statutory rate change used to set off, is tested through
# Simulation in policyengine_uk/tests/test_marriage_allowance_cps_switch.py.

- name: Current law gives the basic-rate earner a 10% Marriage Allowance
period: 2025
absolute_error_margin: 1
input:
people:
earner:
age: 40
employment_income: 30_000
partner:
age: 40
benunits:
benunit:
members: [earner, partner]
is_married: true
households:
household:
members: [earner, partner]
output:
marriage_allowance: [1_260, 0]
income_tax: [3_234, 0]

- name: A statutory rate of 0 removes the basic-rate earner's Marriage Allowance
period: 2025
absolute_error_margin: 1
input:
gov.hmrc.income_tax.allowances.marriage_allowance.max: 0
people:
earner:
age: 40
employment_income: 30_000
partner:
age: 40
benunits:
benunit:
members: [earner, partner]
is_married: true
households:
household:
members: [earner, partner]
output:
marriage_allowance: [0, 0]
income_tax: [3_486, 0]

- name: A statutory rate of 20% doubles the basic-rate earner's Marriage Allowance
period: 2025
absolute_error_margin: 1
input:
gov.hmrc.income_tax.allowances.marriage_allowance.max: 0.2
people:
earner:
age: 40
employment_income: 30_000
partner:
age: 40
benunits:
benunit:
members: [earner, partner]
is_married: true
households:
household:
members: [earner, partner]
output:
marriage_allowance: [2_520, 0]
income_tax: [2_982, 0]

- name: Current law gives the higher-rate earner no Marriage Allowance
period: 2025
absolute_error_margin: 1
input:
people:
earner:
age: 40
employment_income: 60_000
partner:
age: 40
benunits:
benunit:
members: [earner, partner]
is_married: true
households:
household:
members: [earner, partner]
output:
marriage_allowance: [0, 0]
income_tax: [11_432, 0]

- name: A statutory rate of 0 leaves the higher-rate earner's income tax unchanged
period: 2025
absolute_error_margin: 1
input:
gov.hmrc.income_tax.allowances.marriage_allowance.max: 0
people:
earner:
age: 40
employment_income: 60_000
partner:
age: 40
benunits:
benunit:
members: [earner, partner]
is_married: true
households:
household:
members: [earner, partner]
output:
marriage_allowance: [0, 0]
income_tax: [11_432, 0]

- name: A statutory rate of 20% still gives the higher-rate earner no Marriage Allowance
period: 2025
absolute_error_margin: 1
input:
gov.hmrc.income_tax.allowances.marriage_allowance.max: 0.2
people:
earner:
age: 40
employment_income: 60_000
partner:
age: 40
benunits:
benunit:
members: [earner, partner]
is_married: true
households:
household:
members: [earner, partner]
output:
marriage_allowance: [0, 0]
income_tax: [11_432, 0]
Loading
Loading