# AmortizationCalculation

## Overview

This module details an amortization calculation system that defines constants for various periodic intervals and events, as well as methods for managing loans, payments, rate changes, and schedule calculations. ## Constants

The module includes constants representing various time periods, such as annual, bi-annual, monthly, and weekly intervals, as well as unique identifiers like `NUMBER_UNLIMITED` for unlimited occurrences and `STARTDAY_NORMAL` for consistent start-day tracking. These constants simplify configuring amortization schedules with precise periodicity and event behaviors.

## Methods

Key methods facilitate:

* **Loan and Payment Management**: Functions like `addLoan` and `addPayment` support different configurations, including start and end dates, periodic intervals, and repetitions.
* **Rate Changes and Period Adjustments**: `addRateChange` and `addCompoundPeriodChange` enable dynamic updates to interest rates and compounding periods.
* **Amortization Schedule Handling**: Methods like `calculateAmortizationSchedule` and `getAmortizationSchedule` compute and retrieve detailed schedules, while `getRestBalance` and `solveForUnknown` provide insights into financial balances and unknown variables.

## Features

* Utilities like `isValidPeriod` and `roundMoney` ensure input validity and precision.
* Event management and sorting (`sortEvents`, `getEvents`) organize financial activities over time.

This module streamlines the creation and management of customized amortization schedules with precision and adaptability.

## Constants Summarized

| Type                                                     | Name                                          | Summary                                                                                                                                 |
| -------------------------------------------------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [NUMBER\_UNLIMITED](#number_unlimited)        | The numeric constant used to identify an unlimited number of repeated events.                                                           |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_ANNUALY](#period_annualy)            | The numeric constant used to identify an annual period.                                                                                 |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_BI\_ANNUALLY](#period_bi_annually)   | The numeric constant used to identify a bi-annual period (twice every year).                                                            |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_BI\_MONTHLY](#period_bi_monthly)     | The numeric constant used to identify a bi-monthly period (twice every month).                                                          |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_DAILY](#period_daily)                | The numeric constant used to identify a daily period.                                                                                   |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_FOUR\_MONTHLY](#period_four_monthly) | The numeric constant used to identify a four-monthly period (once every four months).                                                   |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_FOUR\_WEEKLY](#period_four_weekly)   | The numeric constant used to identify a four-weekly period (once every four weeks).                                                     |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_MONTHLY](#period_monthly)            | The numeric constant used to identify a monthly period.                                                                                 |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_NONE](#period_none)                  | The numeric constant used to identify that there is no period.                                                                          |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_QUARTERLY](#period_quarterly)        | The numeric constant used to identify a quarterly period (once every three months).                                                     |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_TWO\_MONTHLY](#period_two_monthly)   | The numeric constant used to identify a two-monthly period (once every two months).                                                     |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_TWO\_WEEKLY](#period_two_weekly)     | The numeric constant used to identify a two-weekly period (once every two weeks).                                                       |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [PERIOD\_WEEKLY](#period_weekly)              | The numeric constant used to identify a weekly period.                                                                                  |
| [Number](/reference/servoycore/dev-api/js-lib/number.md) | [STARTDAY\_NORMAL](#startday_normal)          | The numeric constant used to identify that the same start day should be used as the day of the month of the starting date of the event. |

## Methods Summarized

| Type                                                                     | Name                                                                                                                              | Summary                                                                                                              |
| ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addCompoundPeriodChange(newPeriod, date)](#addcompoundperiodchange-newperiod-date)                                               | Adds a compound period change.                                                                                       |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addLoan(amount, date)](#addloan-amount-date)                                                                                     | Adds a loan.                                                                                                         |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addLoan(amount, firstDate, lastDate, period)](#addloan-amount-firstdate-lastdate-period)                                         | Adds a loan.                                                                                                         |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addLoan(amount, firstDate, lastDate, period, number)](#addloan-amount-firstdate-lastdate-period-number)                          | Adds a loan.                                                                                                         |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addLoan(amount, firstDate, lastDate, period, number, startday)](#addloan-amount-firstdate-lastdate-period-number-startday)       | Adds a loan.                                                                                                         |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addPayment(amount, date)](#addpayment-amount-date)                                                                               | Adds a payment.                                                                                                      |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addPayment(amount, firstDate, lastDate, period)](#addpayment-amount-firstdate-lastdate-period)                                   | Adds a payment.                                                                                                      |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addPayment(amount, firstDate, lastDate, period, number)](#addpayment-amount-firstdate-lastdate-period-number)                    | Adds a payment.                                                                                                      |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addPayment(amount, firstDate, lastDate, period, number, startday)](#addpayment-amount-firstdate-lastdate-period-number-startday) | Adds a payment.                                                                                                      |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [addRateChange(newRate, date)](#addratechange-newrate-date)                                                                       | Sets a new interest rate.                                                                                            |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [calculateAmortizationSchedule()](#calculateamortizationschedule)                                                                 | Calculates the amortization schedule.                                                                                |
| [JSDataSet](/reference/servoycore/dev-api/database-manager/jsdataset.md) | [getAmortizationSchedule()](#getamortizationschedule)                                                                             | Gets the amortization schedule as a JSDataSet.                                                                       |
| [Number](/reference/servoycore/dev-api/js-lib/number.md)                 | [getError()](#geterror)                                                                                                           | Returns the error that remains when solving for the unknown.                                                         |
| [JSDataSet](/reference/servoycore/dev-api/database-manager/jsdataset.md) | [getEvents()](#getevents)                                                                                                         | Returns all the amortization events - such as rate changes, loan events, payment events, compounding period changes. |
| [Number](/reference/servoycore/dev-api/js-lib/number.md)                 | [getRestBalance()](#getrestbalance)                                                                                               | Gets the rest balance after the amortization schedule.                                                               |
| [Number](/reference/servoycore/dev-api/js-lib/number.md)                 | [getUnknown()](#getunknown)                                                                                                       | Returns the solveForUnknown value.                                                                                   |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [isValidPeriod(period)](#isvalidperiod-period)                                                                                    | Returns true if the period is valid, or false if the period is not valid.                                            |
| [Number](/reference/servoycore/dev-api/js-lib/number.md)                 | [roundMoney(amount)](#roundmoney-amount)                                                                                          | Rounds a number up to the nearest cents.                                                                             |
| [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md)               | [solveForUnknown()](#solveforunknown)                                                                                             | Returns true if successful or false if the call failed.                                                              |
| void                                                                     | [sortEvents()](#sortevents)                                                                                                       | Sorts the amortization events ascending by date.                                                                     |

## Constants Detailed

### NUMBER\_UNLIMITED

The numeric constant used to identify an unlimited number of repeated events.

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_ANNUALY

The numeric constant used to identify an annual period.

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_BI\_ANNUALLY

The numeric constant used to identify a bi-annual period (twice every year).

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_BI\_MONTHLY

The numeric constant used to identify a bi-monthly period (twice every month).\
TODO: this period is not supported yet.

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_DAILY

The numeric constant used to identify a daily period.

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_FOUR\_MONTHLY

The numeric constant used to identify a four-monthly period (once every four months).

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_FOUR\_WEEKLY

The numeric constant used to identify a four-weekly period (once every four weeks).

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_MONTHLY

The numeric constant used to identify a monthly period.

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_NONE

The numeric constant used to identify that there is no period.

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_QUARTERLY

The numeric constant used to identify a quarterly period (once every three months).

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_TWO\_MONTHLY

The numeric constant used to identify a two-monthly period (once every two months).

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_TWO\_WEEKLY

The numeric constant used to identify a two-weekly period (once every two weeks).

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### PERIOD\_WEEKLY

The numeric constant used to identify a weekly period.

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

### STARTDAY\_NORMAL

The numeric constant used to identify that the same start day should be used as the day of the month of the starting date of the event.

**Type**\
[Number](/reference/servoycore/dev-api/js-lib/number.md)

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addPayment(500, new Date(2005, 1, 28), null,
			plugins.amortization.AmortizationCalculation.PERIOD_DAILY, 5,
			plugins.amortization.AmortizationCalculation.STARTDAY_NORMAL);

var c2 = plugins.amortization.newCalculation();
c2.addPayment(300, new Date(2006, 11, 24), new Date(2006, 12, 24),
			plugins.amortization.AmortizationCalculation.PERIOD_BI_MONTHLY,
			plugins.amortization.AmortizationCalculation.NUMBER_UNLIMITED, 30);
```

## Methods Detailed

### addCompoundPeriodChange(newPeriod, date)

Adds a compound period change.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **newPeriod** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **date** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) the total number of pages printed during the meta print job.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### addLoan(amount, date)

Adds a loan.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **amount** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **date** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the loan event was added successfully, false otherwise.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### addLoan(amount, firstDate, lastDate, period)

Adds a loan.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **amount** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **firstDate** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **lastDate** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **period** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the loan event was added successfully, false otherwise.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### addLoan(amount, firstDate, lastDate, period, number)

Adds a loan.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **amount** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **firstDate** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **lastDate** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **period** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **number** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the loan event was added successfully, false otherwise.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### addLoan(amount, firstDate, lastDate, period, number, startday)

Adds a loan.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **amount** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **firstDate** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **lastDate** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **period** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **number** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **startday** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the loan event was added successfully, false otherwise.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### addPayment(amount, date)

Adds a payment.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **amount** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **date** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the payment event was added successfully, false otherwise.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### addPayment(amount, firstDate, lastDate, period)

Adds a payment.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **amount** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **firstDate** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **lastDate** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **period** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the payment event was added successfully, false otherwise.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### addPayment(amount, firstDate, lastDate, period, number)

Adds a payment.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **amount** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **firstDate** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **lastDate** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **period** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **number** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the payment event was added successfully, false otherwise.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### addPayment(amount, firstDate, lastDate, period, number, startday)

Adds a payment.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **amount** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **firstDate** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **lastDate** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **period** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **number** ;
* [Number](/reference/servoycore/dev-api/js-lib/number.md) **startday** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the payment event was added successfully, false otherwise.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### addRateChange(newRate, date)

Sets a new interest rate.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **newRate** ;
* [Date](/reference/servoycore/dev-api/js-lib/date.md) **date** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the rate change was added successfully, false otherwise.

**Sample**

```js
var c = plugins.amortization.newCalculation();
c.addRateChange(r, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
c.addPayment(500, new Date(2005, 1, 28), null, 12, 5, 31);
```

### calculateAmortizationSchedule()

Calculates the amortization schedule.

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the amortization schedule was calculated successfully, false otherwise.

**Sample**

```js
plugins.amortization.calculateAmortizationSchedule();
```

### getAmortizationSchedule()

Gets the amortization schedule as a JSDataSet.

**Returns:** [JSDataSet](/reference/servoycore/dev-api/database-manager/jsdataset.md) the amortization schedule as a JSDataSet.

**Sample**

```js
plugins.amortization.getAmortizationSchedule();
```

### getError()

Returns the error that remains when solving for the unknown.\
Please note that the error should be less or equal to 1E-8 - otherwise, the solveForUnknown value is incorrect.

**Returns:** [Number](/reference/servoycore/dev-api/js-lib/number.md) the error value resulting from solving for the unknown.

**Sample**

```js
var c = plugins.amortization.newCalculation();
// sets the rate to -1 for unknown.
c.addRateChange(-1, new Date(2005, 0, 1));
c.addCompoundPeriodChange(12, new Date(2005, 0, 1));
c.addLoan(2000, new Date(2005, 0, 1));
var lastDate = null;
var period = 12;
var number_count = 5;
var startday = 31;
c.addPayment(500, new Date(2005, 1, 28), lastDate, period,number_count, startday);
// solves for the interest rate.
c.solveForUnknown();
// gets the interest rate and the error in the calculation.
// which should be small (otherwise the calculation did
// not converge for some reason.
var r = c.getUnknown();
var e = c.getError();
```

### getEvents()

Returns all the amortization events - such as rate changes, loan events, payment events, compounding period changes.

**Returns:** [JSDataSet](/reference/servoycore/dev-api/database-manager/jsdataset.md) all amortization events such as rate changes, loans, payments, and compounding period changes as a JSDataSet.

**Sample**

```js
plugins.amortization.getEvents();
```

### getRestBalance()

Gets the rest balance after the amortization schedule.

**Returns:** [Number](/reference/servoycore/dev-api/js-lib/number.md) the remaining balance after the amortization schedule.

**Sample**

```js
var rb = plugins.amortization.getRestBalance();
```

### getUnknown()

Returns the solveForUnknown value.

**Returns:** [Number](/reference/servoycore/dev-api/js-lib/number.md) the value of the unknown parameter solved during amortization.

**Sample**

```js
plugins.amortization.getUnknown();
```

### isValidPeriod(period)

Returns true if the period is valid, or false if the period is not valid.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **period** ;

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the specified period is valid, false otherwise.

**Sample**

```js
var v_period = plugins.amortization.isValidPeriod(12);
```

### roundMoney(amount)

Rounds a number up to the nearest cents.

**Parameters**

* [Number](/reference/servoycore/dev-api/js-lib/number.md) **amount** ;

**Returns:** [Number](/reference/servoycore/dev-api/js-lib/number.md) the amount rounded to the nearest cent.

**Sample**

```js
//rounds the number up to 34.35
var rm = plugins.amortization.roundMoney(34.349384);
```

### solveForUnknown()

Returns true if successful or false if the call failed.

**Returns:** [Boolean](/reference/servoycore/dev-api/js-lib/boolean.md) true if the unknown value was successfully solved, false otherwise.

**Sample**

```js
plugins.amortization.solveForUnknown();
```

### sortEvents()

Sorts the amortization events ascending by date.

**Returns:** void

**Sample**

```js
plugins.amortization.sortEvents();
```

***


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.servoy.com/reference/servoyextensions/server-plugins/amortization/amortizationcalculation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
