Functional Weave
Code in TypeScript

payroll.minimum-wage-check@1.0.0

vectors.json

6,126 bytes · view raw

[
  { "name": "40 hours at exactly the 2026 National Living Wage", "args": [{ "minor": 50840, "currency": "GBP" }, 2400, "1990-01-01", "2026-09-01", null], "expect": { "band": "national-living-wage", "hourlyRate": { "minor": 1271, "currency": "GBP" }, "required": { "minor": 50840, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "a penny short", "args": [{ "minor": 50839, "currency": "GBP" }, 2400, "1990-01-01", "2026-09-01", null], "expect": { "band": "national-living-wage", "hourlyRate": { "minor": 1271, "currency": "GBP" }, "required": { "minor": 50840, "currency": "GBP" }, "shortfall": { "minor": 1, "currency": "GBP" }, "compliant": false } },
  { "name": "a 20-year-old on the 18 to 20 rate", "args": [{ "minor": 43400, "currency": "GBP" }, 2400, "2006-01-01", "2026-09-01", null], "expect": { "band": "age-18-to-20", "hourlyRate": { "minor": 1085, "currency": "GBP" }, "required": { "minor": 43400, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "turning 21 during the period keeps the 18 to 20 rate for that period", "args": [{ "minor": 173600, "currency": "GBP" }, 9600, "2005-09-15", "2026-09-01", null], "expect": { "band": "age-18-to-20", "hourlyRate": { "minor": 1085, "currency": "GBP" }, "required": { "minor": 173600, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "a period that starts before 1 April uses last year's rate even if paid in April", "args": [{ "minor": 195360, "currency": "GBP" }, 9600, "1990-01-01", "2026-03-16", null], "expect": { "band": "national-living-wage", "hourlyRate": { "minor": 1221, "currency": "GBP" }, "required": { "minor": 195360, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "2023: a 22-year-old was on the separate 21 to 22 rate", "args": [{ "minor": 40000, "currency": "GBP" }, 2400, "2001-06-01", "2023-09-01", null], "expect": { "band": "age-21-to-22", "hourlyRate": { "minor": 1018, "currency": "GBP" }, "required": { "minor": 40720, "currency": "GBP" }, "shortfall": { "minor": 720, "currency": "GBP" }, "compliant": false } },
  { "name": "2023: the National Living Wage started at 23", "args": [{ "minor": 1563, "currency": "GBP" }, 90, "1990-01-01", "2023-09-01", null], "expect": { "band": "national-living-wage", "hourlyRate": { "minor": 1042, "currency": "GBP" }, "required": { "minor": 1563, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "2024: a 22-year-old moved onto the National Living Wage", "args": [{ "minor": 45760, "currency": "GBP" }, 2400, "2002-06-01", "2024-09-01", null], "expect": { "band": "national-living-wage", "hourlyRate": { "minor": 1144, "currency": "GBP" }, "required": { "minor": 45760, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "an 18-year-old apprentice in their second year is still on the apprentice rate", "args": [{ "minor": 32000, "currency": "GBP" }, 2400, "2008-01-01", "2026-09-01", "2024-09-01"], "expect": { "band": "apprentice", "hourlyRate": { "minor": 800, "currency": "GBP" }, "required": { "minor": 32000, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "a 25-year-old apprentice in the first year, one minute rounded up", "args": [{ "minor": 14, "currency": "GBP" }, 1, "2001-01-01", "2026-09-01", "2026-01-10"], "expect": { "band": "apprentice", "hourlyRate": { "minor": 800, "currency": "GBP" }, "required": { "minor": 14, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "a 25-year-old apprentice after the first year is owed the full rate", "args": [{ "minor": 32000, "currency": "GBP" }, 2400, "2001-01-01", "2026-09-01", "2025-06-01"], "expect": { "band": "national-living-wage", "hourlyRate": { "minor": 1271, "currency": "GBP" }, "required": { "minor": 50840, "currency": "GBP" }, "shortfall": { "minor": 18840, "currency": "GBP" }, "compliant": false } },
  { "name": "a 16-year-old on the under-18 rate", "args": [{ "minor": 8000, "currency": "GBP" }, 600, "2009-09-02", "2026-09-01", null], "expect": { "band": "under-18", "hourlyRate": { "minor": 800, "currency": "GBP" }, "required": { "minor": 8000, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "one minute's work needs 22p, not 21p", "args": [{ "minor": 21, "currency": "GBP" }, 1, "1990-01-01", "2026-09-01", null], "expect": { "band": "national-living-wage", "hourlyRate": { "minor": 1271, "currency": "GBP" }, "required": { "minor": 22, "currency": "GBP" }, "shortfall": { "minor": 1, "currency": "GBP" }, "compliant": false } },
  { "name": "overpaying is compliant with no shortfall", "args": [{ "minor": 100000, "currency": "GBP" }, 2400, "1990-01-01", "2025-06-01", null], "expect": { "band": "national-living-wage", "hourlyRate": { "minor": 1221, "currency": "GBP" }, "required": { "minor": 48840, "currency": "GBP" }, "shortfall": { "minor": 0, "currency": "GBP" }, "compliant": true } },
  { "name": "a worker under 16 is an error", "args": [{ "minor": 1000, "currency": "GBP" }, 60, "2011-01-01", "2026-09-01", null], "expectError": "below school leaving age" },
  { "name": "a period before the rates this version carries is an error", "args": [{ "minor": 1000, "currency": "GBP" }, 60, "1990-01-01", "2023-03-31", null], "expectError": "no minimum wage rate" },
  { "name": "negative minutes are an error", "args": [{ "minor": 1000, "currency": "GBP" }, -1, "1990-01-01", "2026-09-01", null], "expectError": "not negative" },
  { "name": "pay in another currency is an error", "args": [{ "minor": 1000, "currency": "EUR" }, 60, "1990-01-01", "2026-09-01", null], "expectError": "minimum wage is in GBP" },
  { "name": "an apprenticeship that starts after the period is an error", "args": [{ "minor": 1000, "currency": "GBP" }, 60, "2001-01-01", "2026-09-01", "2026-10-01"], "expectError": "is after periodStart" }
]