Functional Weave
Code in Python

payroll.pension-auto-enrolment@1.0.0

vectors.json

11,994 bytes · view raw

[
 {
  "name": "statutory minimum, relief at source, monthly: 5% and 3% of pay between \u00a3520 and \u00a34,189",
  "args": [
   {
    "minor": 250000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 198000,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 9900,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 7920,
    "currency": "GBP"
   },
   "employer": {
    "minor": 5940,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "the same under a net pay arrangement: the whole 5% comes off before tax",
  "args": [
   {
    "minor": 250000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "net-pay"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 198000,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 9900,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 9900,
    "currency": "GBP"
   },
   "employer": {
    "minor": 5940,
    "currency": "GBP"
   },
   "deductBeforeTax": true,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "pay above the upper level: contributions stop at \u00a34,189",
  "args": [
   {
    "minor": 500000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 366900,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 18345,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 14676,
    "currency": "GBP"
   },
   "employer": {
    "minor": 11007,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "pay exactly at the upper level",
  "args": [
   {
    "minor": 418900,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 366900,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 18345,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 14676,
    "currency": "GBP"
   },
   "employer": {
    "minor": 11007,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "pay below the lower level: nothing to contribute",
  "args": [
   {
    "minor": 50000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 0,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 0,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 0,
    "currency": "GBP"
   },
   "employer": {
    "minor": 0,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": false
  }
 },
 {
  "name": "between the lower level and the trigger: contributions due if enrolled, but no automatic enrolment",
  "args": [
   {
    "minor": 70000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 18000,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 900,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 720,
    "currency": "GBP"
   },
   "employer": {
    "minor": 540,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": false
  }
 },
 {
  "name": "exactly the trigger is not more than it",
  "args": [
   {
    "minor": 83300,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 31300,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 1565,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 1252,
    "currency": "GBP"
   },
   "employer": {
    "minor": 939,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": false
  }
 },
 {
  "name": "weekly in 2025-26 uses the \u00a3120 weekly lower level",
  "args": [
   {
    "minor": 40000,
    "currency": "GBP"
   },
   "weekly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2025-07-04"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 28000,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 1400,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 1120,
    "currency": "GBP"
   },
   "employer": {
    "minor": 840,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "fortnightly in 2024-25 uses the \u00a3240 fortnightly lower level",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   "fortnightly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2024-07-05"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 76000,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 3800,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 3040,
    "currency": "GBP"
   },
   "employer": {
    "minor": 2280,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "four-weekly in 2023-24 uses the \u00a3480 four-weekly lower level",
  "args": [
   {
    "minor": 200000,
    "currency": "GBP"
   },
   "four-weekly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2023-07-07"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 152000,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 7600,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 6080,
    "currency": "GBP"
   },
   "employer": {
    "minor": 4560,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "all-earnings scheme with supplied rates",
  "args": [
   {
    "minor": 250000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": 300,
    "employerBasisPoints": 500,
    "earningsBasis": "all-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 250000,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 7500,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 6000,
    "currency": "GBP"
   },
   "employer": {
    "minor": 12500,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "an employer paying 6% lets the employee pay 2% and still meet the 8% minimum",
  "args": [
   {
    "minor": 250000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": 600,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 198000,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 3960,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 3168,
    "currency": "GBP"
   },
   "employer": {
    "minor": 11880,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "an employer paying 10% leaves no minimum employee contribution",
  "args": [
   {
    "minor": 250000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": 1000,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 198000,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 0,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 0,
    "currency": "GBP"
   },
   "employer": {
    "minor": 19800,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "half a penny rounds up, and 80% of the rounded gross is rounded again",
  "args": [
   {
    "minor": 100010,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expect": {
   "pensionableEarnings": {
    "minor": 48010,
    "currency": "GBP"
   },
   "employeeGross": {
    "minor": 2401,
    "currency": "GBP"
   },
   "employeeDeduction": {
    "minor": 1921,
    "currency": "GBP"
   },
   "employer": {
    "minor": 1440,
    "currency": "GBP"
   },
   "deductBeforeTax": false,
   "earningsTriggerMet": true
  }
 },
 {
  "name": "a date before the thresholds this package carries",
  "args": [
   {
    "minor": 250000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2023-04-05"
  ],
  "expectError": "no auto-enrolment earnings thresholds"
 },
 {
  "name": "negative earnings are refused",
  "args": [
   {
    "minor": -1,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expectError": "earnings must not be negative"
 },
 {
  "name": "a negative rate is refused",
  "args": [
   {
    "minor": 250000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": -100,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expectError": "employeeBasisPoints must be a whole number of basis points"
 },
 {
  "name": "an unknown earnings basis is refused",
  "args": [
   {
    "minor": 250000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "band",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expectError": "unknown earnings basis"
 },
 {
  "name": "an unknown relief arrangement is refused",
  "args": [
   {
    "minor": 250000,
    "currency": "GBP"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "salary-sacrifice"
   },
   "2026-05-28"
  ],
  "expectError": "unknown relief arrangement"
 },
 {
  "name": "another currency is refused",
  "args": [
   {
    "minor": 250000,
    "currency": "EUR"
   },
   "monthly",
   {
    "employeeBasisPoints": null,
    "employerBasisPoints": null,
    "earningsBasis": "qualifying-earnings",
    "arrangement": "relief-at-source"
   },
   "2026-05-28"
  ],
  "expectError": "must be in GBP"
 }
]