Functional Weave
Code in Python

lending.amortisation-schedule@1.0.1

vectors.json

42,733 bytes · view raw

[
 {
  "name": "\u00a31,000 at 12% over 12 months, half-up",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   1200,
   12,
   12,
   "half-up"
  ],
  "expect": {
   "payment": {
    "minor": 8885,
    "currency": "GBP"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1000,
      "currency": "GBP"
     },
     "principal": {
      "minor": 7885,
      "currency": "GBP"
     },
     "balance": {
      "minor": 92115,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 921,
      "currency": "GBP"
     },
     "principal": {
      "minor": 7964,
      "currency": "GBP"
     },
     "balance": {
      "minor": 84151,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 842,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8043,
      "currency": "GBP"
     },
     "balance": {
      "minor": 76108,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 761,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8124,
      "currency": "GBP"
     },
     "balance": {
      "minor": 67984,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 680,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8205,
      "currency": "GBP"
     },
     "balance": {
      "minor": 59779,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 598,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8287,
      "currency": "GBP"
     },
     "balance": {
      "minor": 51492,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 515,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8370,
      "currency": "GBP"
     },
     "balance": {
      "minor": 43122,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 431,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8454,
      "currency": "GBP"
     },
     "balance": {
      "minor": 34668,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 347,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8538,
      "currency": "GBP"
     },
     "balance": {
      "minor": 26130,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 261,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8624,
      "currency": "GBP"
     },
     "balance": {
      "minor": 17506,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "payment": {
      "minor": 8885,
      "currency": "GBP"
     },
     "interest": {
      "minor": 175,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8710,
      "currency": "GBP"
     },
     "balance": {
      "minor": 8796,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 88,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8796,
      "currency": "GBP"
     },
     "balance": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "totalInterest": {
    "minor": 6619,
    "currency": "GBP"
   },
   "totalPaid": {
    "minor": 106619,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "rounded up, the final payment is smaller",
  "args": [
   {
    "minor": 200000,
    "currency": "GBP"
   },
   999,
   12,
   12,
   "up"
  ],
  "expect": {
   "payment": {
    "minor": 17583,
    "currency": "GBP"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1665,
      "currency": "GBP"
     },
     "principal": {
      "minor": 15918,
      "currency": "GBP"
     },
     "balance": {
      "minor": 184082,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1532,
      "currency": "GBP"
     },
     "principal": {
      "minor": 16051,
      "currency": "GBP"
     },
     "balance": {
      "minor": 168031,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1399,
      "currency": "GBP"
     },
     "principal": {
      "minor": 16184,
      "currency": "GBP"
     },
     "balance": {
      "minor": 151847,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1264,
      "currency": "GBP"
     },
     "principal": {
      "minor": 16319,
      "currency": "GBP"
     },
     "balance": {
      "minor": 135528,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1128,
      "currency": "GBP"
     },
     "principal": {
      "minor": 16455,
      "currency": "GBP"
     },
     "balance": {
      "minor": 119073,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 991,
      "currency": "GBP"
     },
     "principal": {
      "minor": 16592,
      "currency": "GBP"
     },
     "balance": {
      "minor": 102481,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 853,
      "currency": "GBP"
     },
     "principal": {
      "minor": 16730,
      "currency": "GBP"
     },
     "balance": {
      "minor": 85751,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 714,
      "currency": "GBP"
     },
     "principal": {
      "minor": 16869,
      "currency": "GBP"
     },
     "balance": {
      "minor": 68882,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 573,
      "currency": "GBP"
     },
     "principal": {
      "minor": 17010,
      "currency": "GBP"
     },
     "balance": {
      "minor": 51872,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 432,
      "currency": "GBP"
     },
     "principal": {
      "minor": 17151,
      "currency": "GBP"
     },
     "balance": {
      "minor": 34721,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "payment": {
      "minor": 17583,
      "currency": "GBP"
     },
     "interest": {
      "minor": 289,
      "currency": "GBP"
     },
     "principal": {
      "minor": 17294,
      "currency": "GBP"
     },
     "balance": {
      "minor": 17427,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "payment": {
      "minor": 17572,
      "currency": "GBP"
     },
     "interest": {
      "minor": 145,
      "currency": "GBP"
     },
     "principal": {
      "minor": 17427,
      "currency": "GBP"
     },
     "balance": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "totalInterest": {
    "minor": 10985,
    "currency": "GBP"
   },
   "totalPaid": {
    "minor": 210985,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "rounded down, the final payment is larger",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   1200,
   12,
   12,
   "down"
  ],
  "expect": {
   "payment": {
    "minor": 8884,
    "currency": "GBP"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1000,
      "currency": "GBP"
     },
     "principal": {
      "minor": 7884,
      "currency": "GBP"
     },
     "balance": {
      "minor": 92116,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 921,
      "currency": "GBP"
     },
     "principal": {
      "minor": 7963,
      "currency": "GBP"
     },
     "balance": {
      "minor": 84153,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 842,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8042,
      "currency": "GBP"
     },
     "balance": {
      "minor": 76111,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 761,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8123,
      "currency": "GBP"
     },
     "balance": {
      "minor": 67988,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 680,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8204,
      "currency": "GBP"
     },
     "balance": {
      "minor": 59784,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 598,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8286,
      "currency": "GBP"
     },
     "balance": {
      "minor": 51498,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 515,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8369,
      "currency": "GBP"
     },
     "balance": {
      "minor": 43129,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 431,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8453,
      "currency": "GBP"
     },
     "balance": {
      "minor": 34676,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 347,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8537,
      "currency": "GBP"
     },
     "balance": {
      "minor": 26139,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 261,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8623,
      "currency": "GBP"
     },
     "balance": {
      "minor": 17516,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "payment": {
      "minor": 8884,
      "currency": "GBP"
     },
     "interest": {
      "minor": 175,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8709,
      "currency": "GBP"
     },
     "balance": {
      "minor": 8807,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "payment": {
      "minor": 8895,
      "currency": "GBP"
     },
     "interest": {
      "minor": 88,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8807,
      "currency": "GBP"
     },
     "balance": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "totalInterest": {
    "minor": 6619,
    "currency": "GBP"
   },
   "totalPaid": {
    "minor": 106619,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "\u00a35,000 at 6% over 6 months",
  "args": [
   {
    "minor": 500000,
    "currency": "GBP"
   },
   600,
   6,
   12,
   "half-up"
  ],
  "expect": {
   "payment": {
    "minor": 84798,
    "currency": "GBP"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 84798,
      "currency": "GBP"
     },
     "interest": {
      "minor": 2500,
      "currency": "GBP"
     },
     "principal": {
      "minor": 82298,
      "currency": "GBP"
     },
     "balance": {
      "minor": 417702,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "payment": {
      "minor": 84798,
      "currency": "GBP"
     },
     "interest": {
      "minor": 2089,
      "currency": "GBP"
     },
     "principal": {
      "minor": 82709,
      "currency": "GBP"
     },
     "balance": {
      "minor": 334993,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "payment": {
      "minor": 84798,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1675,
      "currency": "GBP"
     },
     "principal": {
      "minor": 83123,
      "currency": "GBP"
     },
     "balance": {
      "minor": 251870,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "payment": {
      "minor": 84798,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1259,
      "currency": "GBP"
     },
     "principal": {
      "minor": 83539,
      "currency": "GBP"
     },
     "balance": {
      "minor": 168331,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "payment": {
      "minor": 84798,
      "currency": "GBP"
     },
     "interest": {
      "minor": 842,
      "currency": "GBP"
     },
     "principal": {
      "minor": 83956,
      "currency": "GBP"
     },
     "balance": {
      "minor": 84375,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "payment": {
      "minor": 84797,
      "currency": "GBP"
     },
     "interest": {
      "minor": 422,
      "currency": "GBP"
     },
     "principal": {
      "minor": 84375,
      "currency": "GBP"
     },
     "balance": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "totalInterest": {
    "minor": 8787,
    "currency": "GBP"
   },
   "totalPaid": {
    "minor": 508787,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "interest-free: the pennies left over go on the last payment",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   0,
   12,
   12,
   "down"
  ],
  "expect": {
   "payment": {
    "minor": 8333,
    "currency": "GBP"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 91667,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 83334,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 75001,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 66668,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 58335,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 50002,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 41669,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 33336,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 25003,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 16670,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "payment": {
      "minor": 8333,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8333,
      "currency": "GBP"
     },
     "balance": {
      "minor": 8337,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "payment": {
      "minor": 8337,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 8337,
      "currency": "GBP"
     },
     "balance": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "totalInterest": {
    "minor": 0,
    "currency": "GBP"
   },
   "totalPaid": {
    "minor": 100000,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "rounded up, a tiny interest-free loan clears three payments early",
  "args": [
   {
    "minor": 25,
    "currency": "GBP"
   },
   0,
   12,
   12,
   "up"
  ],
  "expect": {
   "payment": {
    "minor": 3,
    "currency": "GBP"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 3,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 3,
      "currency": "GBP"
     },
     "balance": {
      "minor": 22,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "payment": {
      "minor": 3,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 3,
      "currency": "GBP"
     },
     "balance": {
      "minor": 19,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "payment": {
      "minor": 3,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 3,
      "currency": "GBP"
     },
     "balance": {
      "minor": 16,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "payment": {
      "minor": 3,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 3,
      "currency": "GBP"
     },
     "balance": {
      "minor": 13,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "payment": {
      "minor": 3,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 3,
      "currency": "GBP"
     },
     "balance": {
      "minor": 10,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "payment": {
      "minor": 3,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 3,
      "currency": "GBP"
     },
     "balance": {
      "minor": 7,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "payment": {
      "minor": 3,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 3,
      "currency": "GBP"
     },
     "balance": {
      "minor": 4,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "payment": {
      "minor": 3,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 3,
      "currency": "GBP"
     },
     "balance": {
      "minor": 1,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "payment": {
      "minor": 1,
      "currency": "GBP"
     },
     "interest": {
      "minor": 0,
      "currency": "GBP"
     },
     "principal": {
      "minor": 1,
      "currency": "GBP"
     },
     "balance": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "totalInterest": {
    "minor": 0,
    "currency": "GBP"
   },
   "totalPaid": {
    "minor": 25,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "a single annual payment",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   1000,
   12,
   1,
   "half-up"
  ],
  "expect": {
   "payment": {
    "minor": 110000,
    "currency": "GBP"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 110000,
      "currency": "GBP"
     },
     "interest": {
      "minor": 10000,
      "currency": "GBP"
     },
     "principal": {
      "minor": 100000,
      "currency": "GBP"
     },
     "balance": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "totalInterest": {
    "minor": 10000,
    "currency": "GBP"
   },
   "totalPaid": {
    "minor": 110000,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "quarterly over two years at 8%",
  "args": [
   {
    "minor": 1000000,
    "currency": "GBP"
   },
   800,
   24,
   4,
   "half-up"
  ],
  "expect": {
   "payment": {
    "minor": 136510,
    "currency": "GBP"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 136510,
      "currency": "GBP"
     },
     "interest": {
      "minor": 20000,
      "currency": "GBP"
     },
     "principal": {
      "minor": 116510,
      "currency": "GBP"
     },
     "balance": {
      "minor": 883490,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "payment": {
      "minor": 136510,
      "currency": "GBP"
     },
     "interest": {
      "minor": 17670,
      "currency": "GBP"
     },
     "principal": {
      "minor": 118840,
      "currency": "GBP"
     },
     "balance": {
      "minor": 764650,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "payment": {
      "minor": 136510,
      "currency": "GBP"
     },
     "interest": {
      "minor": 15293,
      "currency": "GBP"
     },
     "principal": {
      "minor": 121217,
      "currency": "GBP"
     },
     "balance": {
      "minor": 643433,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "payment": {
      "minor": 136510,
      "currency": "GBP"
     },
     "interest": {
      "minor": 12869,
      "currency": "GBP"
     },
     "principal": {
      "minor": 123641,
      "currency": "GBP"
     },
     "balance": {
      "minor": 519792,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "payment": {
      "minor": 136510,
      "currency": "GBP"
     },
     "interest": {
      "minor": 10396,
      "currency": "GBP"
     },
     "principal": {
      "minor": 126114,
      "currency": "GBP"
     },
     "balance": {
      "minor": 393678,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "payment": {
      "minor": 136510,
      "currency": "GBP"
     },
     "interest": {
      "minor": 7874,
      "currency": "GBP"
     },
     "principal": {
      "minor": 128636,
      "currency": "GBP"
     },
     "balance": {
      "minor": 265042,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "payment": {
      "minor": 136510,
      "currency": "GBP"
     },
     "interest": {
      "minor": 5301,
      "currency": "GBP"
     },
     "principal": {
      "minor": 131209,
      "currency": "GBP"
     },
     "balance": {
      "minor": 133833,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "payment": {
      "minor": 136510,
      "currency": "GBP"
     },
     "interest": {
      "minor": 2677,
      "currency": "GBP"
     },
     "principal": {
      "minor": 133833,
      "currency": "GBP"
     },
     "balance": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "totalInterest": {
    "minor": 92080,
    "currency": "GBP"
   },
   "totalPaid": {
    "minor": 1092080,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "a small loan where rounding dominates",
  "args": [
   {
    "minor": 1000,
    "currency": "GBP"
   },
   1999,
   12,
   12,
   "half-up"
  ],
  "expect": {
   "payment": {
    "minor": 93,
    "currency": "GBP"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 17,
      "currency": "GBP"
     },
     "principal": {
      "minor": 76,
      "currency": "GBP"
     },
     "balance": {
      "minor": 924,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 15,
      "currency": "GBP"
     },
     "principal": {
      "minor": 78,
      "currency": "GBP"
     },
     "balance": {
      "minor": 846,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 14,
      "currency": "GBP"
     },
     "principal": {
      "minor": 79,
      "currency": "GBP"
     },
     "balance": {
      "minor": 767,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 13,
      "currency": "GBP"
     },
     "principal": {
      "minor": 80,
      "currency": "GBP"
     },
     "balance": {
      "minor": 687,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 11,
      "currency": "GBP"
     },
     "principal": {
      "minor": 82,
      "currency": "GBP"
     },
     "balance": {
      "minor": 605,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 10,
      "currency": "GBP"
     },
     "principal": {
      "minor": 83,
      "currency": "GBP"
     },
     "balance": {
      "minor": 522,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 9,
      "currency": "GBP"
     },
     "principal": {
      "minor": 84,
      "currency": "GBP"
     },
     "balance": {
      "minor": 438,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 7,
      "currency": "GBP"
     },
     "principal": {
      "minor": 86,
      "currency": "GBP"
     },
     "balance": {
      "minor": 352,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 6,
      "currency": "GBP"
     },
     "principal": {
      "minor": 87,
      "currency": "GBP"
     },
     "balance": {
      "minor": 265,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 4,
      "currency": "GBP"
     },
     "principal": {
      "minor": 89,
      "currency": "GBP"
     },
     "balance": {
      "minor": 176,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "payment": {
      "minor": 93,
      "currency": "GBP"
     },
     "interest": {
      "minor": 3,
      "currency": "GBP"
     },
     "principal": {
      "minor": 90,
      "currency": "GBP"
     },
     "balance": {
      "minor": 86,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "payment": {
      "minor": 87,
      "currency": "GBP"
     },
     "interest": {
      "minor": 1,
      "currency": "GBP"
     },
     "principal": {
      "minor": 86,
      "currency": "GBP"
     },
     "balance": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "totalInterest": {
    "minor": 110,
    "currency": "GBP"
   },
   "totalPaid": {
    "minor": 1110,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "dollars, monthly for three years at 7.5%",
  "args": [
   {
    "minor": 1500000,
    "currency": "USD"
   },
   750,
   36,
   12,
   "half-up"
  ],
  "expect": {
   "payment": {
    "minor": 46659,
    "currency": "USD"
   },
   "rows": [
    {
     "period": 1,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 9375,
      "currency": "USD"
     },
     "principal": {
      "minor": 37284,
      "currency": "USD"
     },
     "balance": {
      "minor": 1462716,
      "currency": "USD"
     }
    },
    {
     "period": 2,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 9142,
      "currency": "USD"
     },
     "principal": {
      "minor": 37517,
      "currency": "USD"
     },
     "balance": {
      "minor": 1425199,
      "currency": "USD"
     }
    },
    {
     "period": 3,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 8907,
      "currency": "USD"
     },
     "principal": {
      "minor": 37752,
      "currency": "USD"
     },
     "balance": {
      "minor": 1387447,
      "currency": "USD"
     }
    },
    {
     "period": 4,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 8672,
      "currency": "USD"
     },
     "principal": {
      "minor": 37987,
      "currency": "USD"
     },
     "balance": {
      "minor": 1349460,
      "currency": "USD"
     }
    },
    {
     "period": 5,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 8434,
      "currency": "USD"
     },
     "principal": {
      "minor": 38225,
      "currency": "USD"
     },
     "balance": {
      "minor": 1311235,
      "currency": "USD"
     }
    },
    {
     "period": 6,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 8195,
      "currency": "USD"
     },
     "principal": {
      "minor": 38464,
      "currency": "USD"
     },
     "balance": {
      "minor": 1272771,
      "currency": "USD"
     }
    },
    {
     "period": 7,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 7955,
      "currency": "USD"
     },
     "principal": {
      "minor": 38704,
      "currency": "USD"
     },
     "balance": {
      "minor": 1234067,
      "currency": "USD"
     }
    },
    {
     "period": 8,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 7713,
      "currency": "USD"
     },
     "principal": {
      "minor": 38946,
      "currency": "USD"
     },
     "balance": {
      "minor": 1195121,
      "currency": "USD"
     }
    },
    {
     "period": 9,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 7470,
      "currency": "USD"
     },
     "principal": {
      "minor": 39189,
      "currency": "USD"
     },
     "balance": {
      "minor": 1155932,
      "currency": "USD"
     }
    },
    {
     "period": 10,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 7225,
      "currency": "USD"
     },
     "principal": {
      "minor": 39434,
      "currency": "USD"
     },
     "balance": {
      "minor": 1116498,
      "currency": "USD"
     }
    },
    {
     "period": 11,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 6978,
      "currency": "USD"
     },
     "principal": {
      "minor": 39681,
      "currency": "USD"
     },
     "balance": {
      "minor": 1076817,
      "currency": "USD"
     }
    },
    {
     "period": 12,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 6730,
      "currency": "USD"
     },
     "principal": {
      "minor": 39929,
      "currency": "USD"
     },
     "balance": {
      "minor": 1036888,
      "currency": "USD"
     }
    },
    {
     "period": 13,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 6481,
      "currency": "USD"
     },
     "principal": {
      "minor": 40178,
      "currency": "USD"
     },
     "balance": {
      "minor": 996710,
      "currency": "USD"
     }
    },
    {
     "period": 14,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 6229,
      "currency": "USD"
     },
     "principal": {
      "minor": 40430,
      "currency": "USD"
     },
     "balance": {
      "minor": 956280,
      "currency": "USD"
     }
    },
    {
     "period": 15,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 5977,
      "currency": "USD"
     },
     "principal": {
      "minor": 40682,
      "currency": "USD"
     },
     "balance": {
      "minor": 915598,
      "currency": "USD"
     }
    },
    {
     "period": 16,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 5722,
      "currency": "USD"
     },
     "principal": {
      "minor": 40937,
      "currency": "USD"
     },
     "balance": {
      "minor": 874661,
      "currency": "USD"
     }
    },
    {
     "period": 17,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 5467,
      "currency": "USD"
     },
     "principal": {
      "minor": 41192,
      "currency": "USD"
     },
     "balance": {
      "minor": 833469,
      "currency": "USD"
     }
    },
    {
     "period": 18,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 5209,
      "currency": "USD"
     },
     "principal": {
      "minor": 41450,
      "currency": "USD"
     },
     "balance": {
      "minor": 792019,
      "currency": "USD"
     }
    },
    {
     "period": 19,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 4950,
      "currency": "USD"
     },
     "principal": {
      "minor": 41709,
      "currency": "USD"
     },
     "balance": {
      "minor": 750310,
      "currency": "USD"
     }
    },
    {
     "period": 20,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 4689,
      "currency": "USD"
     },
     "principal": {
      "minor": 41970,
      "currency": "USD"
     },
     "balance": {
      "minor": 708340,
      "currency": "USD"
     }
    },
    {
     "period": 21,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 4427,
      "currency": "USD"
     },
     "principal": {
      "minor": 42232,
      "currency": "USD"
     },
     "balance": {
      "minor": 666108,
      "currency": "USD"
     }
    },
    {
     "period": 22,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 4163,
      "currency": "USD"
     },
     "principal": {
      "minor": 42496,
      "currency": "USD"
     },
     "balance": {
      "minor": 623612,
      "currency": "USD"
     }
    },
    {
     "period": 23,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 3898,
      "currency": "USD"
     },
     "principal": {
      "minor": 42761,
      "currency": "USD"
     },
     "balance": {
      "minor": 580851,
      "currency": "USD"
     }
    },
    {
     "period": 24,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 3630,
      "currency": "USD"
     },
     "principal": {
      "minor": 43029,
      "currency": "USD"
     },
     "balance": {
      "minor": 537822,
      "currency": "USD"
     }
    },
    {
     "period": 25,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 3361,
      "currency": "USD"
     },
     "principal": {
      "minor": 43298,
      "currency": "USD"
     },
     "balance": {
      "minor": 494524,
      "currency": "USD"
     }
    },
    {
     "period": 26,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 3091,
      "currency": "USD"
     },
     "principal": {
      "minor": 43568,
      "currency": "USD"
     },
     "balance": {
      "minor": 450956,
      "currency": "USD"
     }
    },
    {
     "period": 27,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 2818,
      "currency": "USD"
     },
     "principal": {
      "minor": 43841,
      "currency": "USD"
     },
     "balance": {
      "minor": 407115,
      "currency": "USD"
     }
    },
    {
     "period": 28,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 2544,
      "currency": "USD"
     },
     "principal": {
      "minor": 44115,
      "currency": "USD"
     },
     "balance": {
      "minor": 363000,
      "currency": "USD"
     }
    },
    {
     "period": 29,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 2269,
      "currency": "USD"
     },
     "principal": {
      "minor": 44390,
      "currency": "USD"
     },
     "balance": {
      "minor": 318610,
      "currency": "USD"
     }
    },
    {
     "period": 30,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 1991,
      "currency": "USD"
     },
     "principal": {
      "minor": 44668,
      "currency": "USD"
     },
     "balance": {
      "minor": 273942,
      "currency": "USD"
     }
    },
    {
     "period": 31,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 1712,
      "currency": "USD"
     },
     "principal": {
      "minor": 44947,
      "currency": "USD"
     },
     "balance": {
      "minor": 228995,
      "currency": "USD"
     }
    },
    {
     "period": 32,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 1431,
      "currency": "USD"
     },
     "principal": {
      "minor": 45228,
      "currency": "USD"
     },
     "balance": {
      "minor": 183767,
      "currency": "USD"
     }
    },
    {
     "period": 33,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 1149,
      "currency": "USD"
     },
     "principal": {
      "minor": 45510,
      "currency": "USD"
     },
     "balance": {
      "minor": 138257,
      "currency": "USD"
     }
    },
    {
     "period": 34,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 864,
      "currency": "USD"
     },
     "principal": {
      "minor": 45795,
      "currency": "USD"
     },
     "balance": {
      "minor": 92462,
      "currency": "USD"
     }
    },
    {
     "period": 35,
     "payment": {
      "minor": 46659,
      "currency": "USD"
     },
     "interest": {
      "minor": 578,
      "currency": "USD"
     },
     "principal": {
      "minor": 46081,
      "currency": "USD"
     },
     "balance": {
      "minor": 46381,
      "currency": "USD"
     }
    },
    {
     "period": 36,
     "payment": {
      "minor": 46671,
      "currency": "USD"
     },
     "interest": {
      "minor": 290,
      "currency": "USD"
     },
     "principal": {
      "minor": 46381,
      "currency": "USD"
     },
     "balance": {
      "minor": 0,
      "currency": "USD"
     }
    }
   ],
   "totalInterest": {
    "minor": 179736,
    "currency": "USD"
   },
   "totalPaid": {
    "minor": 1679736,
    "currency": "USD"
   }
  }
 },
 {
  "name": "a zero principal is refused",
  "args": [
   {
    "minor": 0,
    "currency": "GBP"
   },
   500,
   12,
   12,
   "half-up"
  ],
  "expectError": "principal must be greater than zero"
 },
 {
  "name": "a term that is not a whole number of payments",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   500,
   7,
   4,
   "half-up"
  ],
  "expectError": "is not a whole number of payments"
 },
 {
  "name": "a negative rate is refused",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   -50,
   12,
   12,
   "half-up"
  ],
  "expectError": "annualRateBasisPoints must be between 0 and 100000"
 }
]