Functional Weave
Code in TypeScript

lending.early-settlement@1.0.0

vectors.json

63,140 bytes · view raw

[
 {
  "name": "\u00a35,000 over 36 months at 9.9% APR: settlement 28 days after the notice",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2026-03-01",
   null,
   "none"
  ],
  "expect": {
   "settlementDate": "2026-03-29",
   "settlementAmount": {
    "minor": 321832,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 354200,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 32368,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "the creditor defers by one month under regulation 6",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2026-03-01",
   null,
   "one-month"
  ],
  "expect": {
   "settlementDate": "2026-04-29",
   "settlementAmount": {
    "minor": 308265,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 338100,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 29835,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "the creditor elects 30 days instead of a month",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2026-03-01",
   null,
   "thirty-days"
  ],
  "expect": {
   "settlementDate": "2026-04-28",
   "settlementAmount": {
    "minor": 308185,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 338100,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 29915,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "a later date named in the notice is used",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2026-03-01",
   "2026-05-10",
   "none"
  ],
  "expect": {
   "settlementDate": "2026-05-10",
   "settlementAmount": {
    "minor": 309143,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 338100,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 28957,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "an earlier date named in the notice cannot shorten the 28 days",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2026-03-01",
   "2026-03-05",
   "none"
  ],
  "expect": {
   "settlementDate": "2026-03-29",
   "settlementAmount": {
    "minor": 321832,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 354200,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 32368,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "a month's deferral from the 31st lands on the last day of February",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2026-01-03",
   null,
   "one-month"
  ],
  "expect": {
   "settlementDate": "2026-02-28",
   "settlementAmount": {
    "minor": 335465,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 370300,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 34835,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "interest-free credit: no rebate, the balance is owed",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 360000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    }
   ],
   0,
   "2026-03-01",
   null,
   "none"
  ],
  "expect": {
   "settlementDate": "2026-03-29",
   "settlementAmount": {
    "minor": 220000,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 220000,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 0,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "a high-cost loan: 12 months at 49.9%",
  "args": [
   [
    {
     "date": "2026-01-10",
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2026-02-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    }
   ],
   4990,
   "2026-05-20",
   null,
   "none"
  ],
  "expect": {
   "settlementDate": "2026-06-17",
   "settlementAmount": {
    "minor": 62488,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 73500,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 11012,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "notice straight after drawdown: nearly all the interest is rebated",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2025-01-16",
   null,
   "none"
  ],
  "expect": {
   "settlementDate": "2025-02-13",
   "settlementAmount": {
    "minor": 503764,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 579600,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 75836,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "settling after the last instalment is due: nothing left to pay",
  "args": [
   [
    {
     "date": "2026-01-10",
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2026-02-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    }
   ],
   4990,
   "2027-01-01",
   null,
   "none"
  ],
  "expect": {
   "settlementDate": "2027-01-29",
   "settlementAmount": {
    "minor": 0,
    "currency": "GBP"
   },
   "remainingRepayments": {
    "minor": 0,
    "currency": "GBP"
   },
   "rebate": {
    "minor": 0,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "a deferral is refused on a one-year agreement",
  "args": [
   [
    {
     "date": "2026-01-10",
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2026-02-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-10",
     "amount": {
      "minor": 10500,
      "currency": "GBP"
     }
    }
   ],
   4990,
   "2026-05-20",
   null,
   "one-month"
  ],
  "expectError": "deferral is only allowed when the credit is repaid over more than a year"
 },
 {
  "name": "an unknown deferral",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2026-03-01",
   null,
   "two-months"
  ],
  "expectError": "unknown deferral"
 },
 {
  "name": "no advances",
  "args": [
   [],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2026-03-01",
   null,
   "none"
  ],
  "expectError": "advances must not be empty"
 },
 {
  "name": "no repayments",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [],
   990,
   "2026-03-01",
   null,
   "none"
  ],
  "expectError": "repayments must not be empty"
 },
 {
  "name": "a negative APR is refused",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   -1,
   "2026-03-01",
   null,
   "none"
  ],
  "expectError": "aprBasisPoints must be between 0 and 1000000"
 },
 {
  "name": "mixed currencies are refused",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 100,
      "currency": "EUR"
     }
    }
   ],
   990,
   "2026-03-01",
   null,
   "none"
  ],
  "expectError": "currency mismatch"
 },
 {
  "name": "a notice before any drawdown",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2024-11-01",
   null,
   "none"
  ],
  "expectError": "no credit was advanced before the settlement date"
 },
 {
  "name": "an impossible notice date",
  "args": [
   [
    {
     "date": "2025-01-15",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "date": "2025-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-02-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-03-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-04-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-07-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-08-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-09-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-10-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-11-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-12-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    },
    {
     "date": "2028-01-15",
     "amount": {
      "minor": 16100,
      "currency": "GBP"
     }
    }
   ],
   990,
   "2026-02-30",
   null,
   "none"
  ],
  "expectError": "is not a real calendar date"
 }
]