Skip to content

Secondary threshold for 2015-16 and 2016-17 is £155 a week, not the statutory £156 #2178

Closed

Description

@MaxGhenis

Problem

gov.hmrc.national_insurance.class_1.thresholds.secondary_threshold holds £155 a week for 2015-16 and 2016-17. The statutory secondary threshold (ST) in both years was £156 a week, and £8,112 for an annual earnings period:

Tax year SI 2001/1004 reg 10(d), weekly ST reg 11(3A)(b), annual Model (52 × weekly)
2015-16 £156 £8,112 £8,060
2016-17 £156 £8,112 £8,060

£155 was the primary threshold in those years (reg 10(c)). It looks like the PT figure was copied into the ST file.

I checked every other year from 2015-16 to 2025-26 against the legislation.gov.uk point-in-time text of regs 10 and 11. They all match: £157 (2017-18), £162, £166, £169, £170, £175 (2022-23 to 2024-25), then the annual £5,000 from 2025-26 (#1967, #2165).

Effect: employer NI in model years 2015 and 2016 is overstated by 13.8% × £52 = £7.18 for each liable employee earning over £8,112.

Coverage gap

test_ni_threshold_freeze.py pins the annual ST at £5,000 for 2025-2030, and its Hypothesis differential checks employer NI against the statute for 2026-2030. No test checks the annual ST in any year before 2025, and no property test checks employer NI in 2025-26 or earlier.

Fix

  • Set the 2015-04-06 and 2016-04-06 values to 156, citing reg 10(d) and reg 11(3A)(b) at those dates.
  • Add a statute table of the reg 11(3A)(b) annual ST and the secondary percentage for every tax year from 2015-16 to 2030-31. Test that 52 × the stored weekly ST equals the annual figure to the penny in every year. Test that, before 2025-26, the stored weekly value is the reg 10(d) figure itself.
  • Add a Hypothesis differential: for any earnings, ni_class_1_employer equals rate × max(e − annual ST, 0) in exact arithmetic, for each of those years. 2022-23 is excluded, because the employer rate there is a separate open question (the 15.05% Health and Social Care Levy rate from 6 April to 5 November 2022 is not in the rate parameter).
  • Add YAML cases for 2015 and 2016.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions