Skip to content

Round tapered personal allowance up to nearest pound #1738

@MaxGhenis

Description

@MaxGhenis

Axiom encoding of Income Tax Act 2007 s.35 surfaced a mismatch in personal_allowance.

Section 35(3) says that if the allowance remaining after the adjusted-net-income taper is not a multiple of £1, it is rounded up to the nearest £1. PE-UK currently applies the s.35(2) half-excess taper but returns the fractional post-taper amount directly.

Repro on current main:

from policyengine_uk import Simulation

sim = Simulation(situation={
    "people": {"p": {"adjusted_net_income": {"2026": 100001}}},
    "benunits": {"bu": {"members": ["p"]}},
    "households": {"h": {"members": ["p"]}},
})
print(float(sim.calculate("personal_allowance", 2026)[0]))

Actual: 12569.5

Expected under ITA 2007 s.35(3): 12570.

Likely fix: apply np.ceil (after the nonnegative floor) in policyengine_uk/variables/gov/hmrc/income_tax/allowances/personal_allowance.py, and add a regression test for odd-pound adjusted net income just above £100,000.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions