Functional Weave
Code in Python

payroll.holiday-pay-accrual@1.0.0

vectors.json

18,272 bytes · view raw

[
 {
  "name": "rolled-up: 12.07% of \u00a3300 is \u00a336.21",
  "args": [
   "rolled-up",
   {
    "minor": 30000,
    "currency": "GBP"
   },
   [],
   "2024-04-01"
  ],
  "expect": {
   "amount": {
    "minor": 3621,
    "currency": "GBP"
   },
   "weeksCounted": 0
  }
 },
 {
  "name": "rolled-up: 12.07% of \u00a3123.45 is \u00a314.900415, rounded to \u00a314.90",
  "args": [
   "rolled-up",
   {
    "minor": 12345,
    "currency": "GBP"
   },
   [],
   "2025-01-01"
  ],
  "expect": {
   "amount": {
    "minor": 1490,
    "currency": "GBP"
   },
   "weeksCounted": 0
  }
 },
 {
  "name": "rolled-up: half a penny rounds up (\u00a350 gives \u00a36.035)",
  "args": [
   "rolled-up",
   {
    "minor": 5000,
    "currency": "GBP"
   },
   [],
   "2025-01-01"
  ],
  "expect": {
   "amount": {
    "minor": 604,
    "currency": "GBP"
   },
   "weeksCounted": 0
  }
 },
 {
  "name": "rolled-up: nothing earned, nothing added",
  "args": [
   "rolled-up",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [],
   "2025-01-01"
  ],
  "expect": {
   "amount": {
    "minor": 0,
    "currency": "GBP"
   },
   "weeksCounted": 0
  }
 },
 {
  "name": "rolled-up holiday pay is not lawful for a leave year that began before 1 April 2024",
  "args": [
   "rolled-up",
   {
    "minor": 30000,
    "currency": "GBP"
   },
   [],
   "2024-03-31"
  ],
  "expectError": "no rolled-up holiday pay rule for 2024-03-31"
 },
 {
  "name": "52 weeks at \u00a3400 average \u00a3400",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    }
   ],
   "2025-06-02"
  ],
  "expect": {
   "amount": {
    "minor": 40000,
    "currency": "GBP"
   },
   "weeksCounted": 52
  }
 },
 {
  "name": "unpaid weeks are skipped and earlier weeks brought in to make 52",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 99999,
     "currency": "GBP"
    }
   ],
   "2025-06-02"
  ],
  "expect": {
   "amount": {
    "minor": 40000,
    "currency": "GBP"
   },
   "weeksCounted": 52
  }
 },
 {
  "name": "fewer than 52 paid weeks: average over those there are",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 30000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 40000,
     "currency": "GBP"
    },
    {
     "minor": 50000,
     "currency": "GBP"
    }
   ],
   "2025-06-02"
  ],
  "expect": {
   "amount": {
    "minor": 40000,
    "currency": "GBP"
   },
   "weeksCounted": 9
  }
 },
 {
  "name": "no week further back than 104 counts, even to make up 52",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    },
    {
     "minor": 20000,
     "currency": "GBP"
    }
   ],
   "2025-06-02"
  ],
  "expect": {
   "amount": {
    "minor": 20000,
    "currency": "GBP"
   },
   "weeksCounted": 44
  }
 },
 {
  "name": "the average is rounded to the nearest penny, half up",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 10001,
     "currency": "GBP"
    },
    {
     "minor": 10000,
     "currency": "GBP"
    }
   ],
   "2025-06-02"
  ],
  "expect": {
   "amount": {
    "minor": 10001,
    "currency": "GBP"
   },
   "weeksCounted": 2
  }
 },
 {
  "name": "a third of a penny rounds down",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 10001,
     "currency": "GBP"
    },
    {
     "minor": 10000,
     "currency": "GBP"
    },
    {
     "minor": 10000,
     "currency": "GBP"
    }
   ],
   "2025-06-02"
  ],
  "expect": {
   "amount": {
    "minor": 10000,
    "currency": "GBP"
   },
   "weeksCounted": 3
  }
 },
 {
  "name": "two thirds of a penny rounds up",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 10002,
     "currency": "GBP"
    },
    {
     "minor": 10000,
     "currency": "GBP"
    },
    {
     "minor": 10000,
     "currency": "GBP"
    }
   ],
   "2025-06-02"
  ],
  "expect": {
   "amount": {
    "minor": 10001,
    "currency": "GBP"
   },
   "weeksCounted": 3
  }
 },
 {
  "name": "no paid week in the window is an error",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    },
    {
     "minor": 0,
     "currency": "GBP"
    }
   ],
   "2025-06-02"
  ],
  "expectError": "no week with pay in the last 104 weeks"
 },
 {
  "name": "an empty history is an error",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [],
   "2025-06-02"
  ],
  "expectError": "no week with pay"
 },
 {
  "name": "negative weekly pay is an error",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 10000,
     "currency": "GBP"
    },
    {
     "minor": -500,
     "currency": "GBP"
    }
   ],
   "2025-06-02"
  ],
  "expectError": "weekly pay must not be negative"
 },
 {
  "name": "mixed currencies are an error",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 10000,
     "currency": "GBP"
    },
    {
     "minor": 10000,
     "currency": "EUR"
    }
   ],
   "2025-06-02"
  ],
  "expectError": "currency mismatch"
 },
 {
  "name": "the 52-week reference period did not exist before 6 April 2020",
  "args": [
   "average-week",
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 10000,
     "currency": "GBP"
    }
   ],
   "2020-04-05"
  ],
  "expectError": "no average-week holiday pay rule for 2020-04-05"
 },
 {
  "name": "negative period pay is an error",
  "args": [
   "rolled-up",
   {
    "minor": -1,
    "currency": "GBP"
   },
   [],
   "2025-01-01"
  ],
  "expectError": "periodPay must not be negative"
 }
]