640 lines
22 KiB
JavaScript
640 lines
22 KiB
JavaScript
/*
|
|
* (c) Copyright Ascensio System SIA 2010-2014
|
|
*
|
|
* This program is a free software product. You can redistribute it and/or
|
|
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
|
* version 3 as published by the Free Software Foundation. In accordance with
|
|
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
|
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
|
* of any third-party rights.
|
|
*
|
|
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
|
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
*
|
|
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
|
|
* EU, LV-1021.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of the Program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU AGPL version 3.
|
|
*
|
|
* Pursuant to Section 7(b) of the License you must retain the original Product
|
|
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
|
* grant you any rights under trademark law for use of our trademarks.
|
|
*
|
|
* All the Product's GUI elements, including illustrations and icon sets, as
|
|
* well as technical writing content are licensed under the terms of the
|
|
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
|
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
*
|
|
*/
|
|
cFormulaFunction.Financial = {
|
|
"groupName": "Financial",
|
|
"ACCRINT": function () {
|
|
var r = new cBaseFunction("ACCRINT");
|
|
return r;
|
|
},
|
|
"ACCRINTM": function () {
|
|
var r = new cBaseFunction("ACCRINTM");
|
|
return r;
|
|
},
|
|
"AMORDEGRC": function () {
|
|
var r = new cBaseFunction("AMORDEGRC");
|
|
return r;
|
|
},
|
|
"AMORLINC": function () {
|
|
var r = new cBaseFunction("AMORLINC");
|
|
return r;
|
|
},
|
|
"COUPDAYBS": function () {
|
|
var r = new cBaseFunction("COUPDAYBS");
|
|
return r;
|
|
},
|
|
"COUPDAYS": function () {
|
|
var r = new cBaseFunction("COUPDAYS");
|
|
return r;
|
|
},
|
|
"COUPDAYSNC": function () {
|
|
var r = new cBaseFunction("COUPDAYSNC");
|
|
return r;
|
|
},
|
|
"COUPNCD": function () {
|
|
var r = new cBaseFunction("COUPNCD");
|
|
return r;
|
|
},
|
|
"COUPNUM": function () {
|
|
var r = new cBaseFunction("COUPNUM");
|
|
return r;
|
|
},
|
|
"COUPPCD": function () {
|
|
var r = new cBaseFunction("COUPPCD");
|
|
return r;
|
|
},
|
|
"CUMIPMT": function () {
|
|
var r = new cBaseFunction("CUMIPMT");
|
|
return r;
|
|
},
|
|
"CUMPRINC": function () {
|
|
var r = new cBaseFunction("CUMPRINC");
|
|
return r;
|
|
},
|
|
"DB": function () {
|
|
var r = new cBaseFunction("DB");
|
|
return r;
|
|
},
|
|
"DDB": function () {
|
|
var r = new cBaseFunction("DDB");
|
|
return r;
|
|
},
|
|
"DISC": function () {
|
|
var r = new cBaseFunction("DISC");
|
|
return r;
|
|
},
|
|
"DOLLARDE": function () {
|
|
var r = new cBaseFunction("DOLLARDE");
|
|
return r;
|
|
},
|
|
"DOLLARFR": function () {
|
|
var r = new cBaseFunction("DOLLARFR");
|
|
return r;
|
|
},
|
|
"DURATION": function () {
|
|
var r = new cBaseFunction("DURATION");
|
|
return r;
|
|
},
|
|
"EFFECT": function () {
|
|
var r = new cBaseFunction("EFFECT");
|
|
return r;
|
|
},
|
|
"FV": function () {
|
|
var r = new cBaseFunction("FV");
|
|
r.setArgumentsMin(3);
|
|
r.setArgumentsMax(5);
|
|
r.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
nper = arg[1],
|
|
pmt = arg[2],
|
|
pv = arg[3] ? arg[3] : new cNumber(0),
|
|
type = arg[4] ? arg[4] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pmt instanceof cArea || pmt instanceof cArea3D) {
|
|
pmt = pmt.cross(arguments[1].first);
|
|
} else {
|
|
if (pmt instanceof cArray) {
|
|
pmt = pmt.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pmt = pmt.tocNumber();
|
|
pv = pv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pmt instanceof cError) {
|
|
return this.value = pmt;
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
if (type.getValue() != 1 && type.getValue() != 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res;
|
|
if (rate.getValue() != 0) {
|
|
res = -1 * (pv.getValue() * Math.pow(1 + rate.getValue(), nper.getValue()) + pmt.getValue() * (1 + rate.getValue() * type.getValue()) * (Math.pow((1 + rate.getValue()), nper.getValue()) - 1) / rate.getValue());
|
|
} else {
|
|
res = -1 * (pv.getValue() + pmt.getValue() * nper.getValue());
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
r.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , nper , pmt [ , [ pv ] [ ,[ type ] ] ] )"
|
|
};
|
|
};
|
|
r.setFormat(r.formatType.noneFormat);
|
|
return r;
|
|
},
|
|
"FVSCHEDULE": function () {
|
|
var r = new cBaseFunction("FVSCHEDULE");
|
|
return r;
|
|
},
|
|
"INTRATE": function () {
|
|
var r = new cBaseFunction("INTRATE");
|
|
return r;
|
|
},
|
|
"IPMT": function () {
|
|
var r = new cBaseFunction("IPMT");
|
|
return r;
|
|
},
|
|
"IRR": function () {
|
|
var r = new cBaseFunction("IRR");
|
|
return r;
|
|
},
|
|
"ISPMT": function () {
|
|
var r = new cBaseFunction("ISPMT");
|
|
return r;
|
|
},
|
|
"MDURATION": function () {
|
|
var r = new cBaseFunction("MDURATION");
|
|
return r;
|
|
},
|
|
"MIRR": function () {
|
|
var r = new cBaseFunction("MIRR");
|
|
return r;
|
|
},
|
|
"NOMINAL": function () {
|
|
var r = new cBaseFunction("NOMINAL");
|
|
return r;
|
|
},
|
|
"NPER": function () {
|
|
var r = new cBaseFunction("NPER");
|
|
r.setArgumentsMin(3);
|
|
r.setArgumentsMax(5);
|
|
r.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
pmt = arg[1],
|
|
pv = arg[2],
|
|
fv = arg[3] ? arg[3] : new cNumber(0),
|
|
type = arg[4] ? arg[4] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pmt instanceof cArea || pmt instanceof cArea3D) {
|
|
pmt = pmt.cross(arguments[1].first);
|
|
} else {
|
|
if (pmt instanceof cArray) {
|
|
pmt = pmt.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fv instanceof cArea || fv instanceof cArea3D) {
|
|
fv = fv.cross(arguments[1].first);
|
|
} else {
|
|
if (fv instanceof cArray) {
|
|
fv = fv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
pmt = pmt.tocNumber();
|
|
pv = pv.tocNumber();
|
|
fv = fv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (pmt instanceof cError) {
|
|
return this.value = pmt;
|
|
}
|
|
if (pmt instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (fv instanceof cError) {
|
|
return this.value = fv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
if (type.getValue() != 1 && type.getValue() != 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res;
|
|
if (rate.getValue() != 0) {
|
|
rate = rate.getValue();
|
|
pmt = pmt.getValue();
|
|
pv = pv.getValue();
|
|
fv = fv.getValue();
|
|
type = type.getValue();
|
|
res = (-fv * rate + pmt * (1 + rate * type)) / (rate * pv + pmt * (1 + rate * type));
|
|
res = Math.log(res) / Math.log(1 + rate);
|
|
} else {
|
|
res = -pv.getValue() - fv.getValue() / pmt.getValue();
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
r.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , pmt , pv [ , [ fv ] [ , [ type ] ] ] )"
|
|
};
|
|
};
|
|
r.setFormat(r.formatType.noneFormat);
|
|
return r;
|
|
},
|
|
"NPV": function () {
|
|
var r = new cBaseFunction("NPV");
|
|
r.setArgumentsMin(2);
|
|
r.setArgumentsMax(255);
|
|
r.Calculate = function (arg) {
|
|
var arg0 = arg[0],
|
|
arg1 = arg[1],
|
|
iStart = 1,
|
|
res = 0,
|
|
rate;
|
|
function elemCalc(rate, value, step) {
|
|
return value / Math.pow(1 + rate, step);
|
|
}
|
|
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
|
arg0 = arg0.cross(arguments[1].first);
|
|
} else {
|
|
if (arg0 instanceof cArray) {
|
|
arg0 = arg0.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
arg0 = arg0.tocNumber();
|
|
if (arg0 instanceof cError) {
|
|
return this.value = arg0;
|
|
}
|
|
rate = arg0.getValue();
|
|
if (rate == -1) {
|
|
return this.value = new cError(cErrorType.division_by_zero);
|
|
}
|
|
for (var i = 1; i < this.getArguments(); i++) {
|
|
var argI = arg[i];
|
|
if (argI instanceof cArea || argI instanceof cArea3D) {
|
|
var argIArr = argI.getValue();
|
|
for (var j = 0; j < argIArr.length; j++) {
|
|
if (argIArr[j] instanceof cNumber) {
|
|
res += elemCalc(rate, argIArr[j].getValue(), iStart++);
|
|
}
|
|
}
|
|
continue;
|
|
} else {
|
|
if (argI instanceof cArray) {
|
|
argI.foreach(function (elem, r, c) {
|
|
if (elem instanceof cNumber) {
|
|
res += elemCalc(rate, elem.getValue(), iStart++);
|
|
}
|
|
});
|
|
continue;
|
|
}
|
|
}
|
|
argI = argI.tocNumber();
|
|
if (argI instanceof cError) {
|
|
continue;
|
|
}
|
|
res += elemCalc(rate, argI.getValue(), iStart++);
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
r.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , argument-list )"
|
|
};
|
|
};
|
|
r.setFormat(r.formatType.noneFormat);
|
|
return r;
|
|
},
|
|
"ODDFPRICE": function () {
|
|
var r = new cBaseFunction("ODDFPRICE");
|
|
return r;
|
|
},
|
|
"ODDFYIELD": function () {
|
|
var r = new cBaseFunction("ODDFYIELD");
|
|
return r;
|
|
},
|
|
"ODDLPRICE": function () {
|
|
var r = new cBaseFunction("ODDLPRICE");
|
|
return r;
|
|
},
|
|
"ODDLYIELD": function () {
|
|
var r = new cBaseFunction("ODDLYIELD");
|
|
return r;
|
|
},
|
|
"PMT": function () {
|
|
var r = new cBaseFunction("PMT");
|
|
r.setArgumentsMin(3);
|
|
r.setArgumentsMax(5);
|
|
r.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
nper = arg[1],
|
|
pv = arg[2],
|
|
fv = arg[3] ? arg[3] : new cNumber(0),
|
|
type = arg[4] ? arg[4] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fv instanceof cArea || fv instanceof cArea3D) {
|
|
fv = fv.cross(arguments[1].first);
|
|
} else {
|
|
if (fv instanceof cArray) {
|
|
fv = fv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pv = pv.tocNumber();
|
|
fv = fv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (nper.getValue() == 0) {
|
|
return this.value = new cError(cErrorType.division_by_zero);
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (fv instanceof cError) {
|
|
return this.value = fv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
if (type.getValue() != 1 && type.getValue() != 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res;
|
|
if (rate.getValue() != 0) {
|
|
res = -1 * (pv.getValue() * Math.pow(1 + rate.getValue(), nper.getValue()) + fv.getValue()) / ((1 + rate.getValue() * type.getValue()) * (Math.pow((1 + rate.getValue()), nper.getValue()) - 1) / rate.getValue());
|
|
} else {
|
|
res = -1 * (pv.getValue() + fv.getValue()) / nper.getValue();
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
r.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , nper , pv [ , [ fv ] [ ,[ type ] ] ] )"
|
|
};
|
|
};
|
|
r.setFormat(r.formatType.noneFormat);
|
|
return r;
|
|
},
|
|
"PPMT": function () {
|
|
var r = new cBaseFunction("PPMT");
|
|
return r;
|
|
},
|
|
"PRICE": function () {
|
|
var r = new cBaseFunction("PRICE");
|
|
return r;
|
|
},
|
|
"PRICEDISC": function () {
|
|
var r = new cBaseFunction("PRICEDISC");
|
|
return r;
|
|
},
|
|
"PRICEMAT": function () {
|
|
var r = new cBaseFunction("PRICEMAT");
|
|
return r;
|
|
},
|
|
"PV": function () {
|
|
var r = new cBaseFunction("PV");
|
|
r.setArgumentsMin(3);
|
|
r.setArgumentsMax(5);
|
|
r.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
nper = arg[1],
|
|
pmt = arg[2],
|
|
fv = arg[3] ? arg[3] : new cNumber(0),
|
|
type = arg[4] ? arg[4] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pmt instanceof cArea || pmt instanceof cArea3D) {
|
|
pmt = pmt.cross(arguments[1].first);
|
|
} else {
|
|
if (pmt instanceof cArray) {
|
|
pmt = pmt.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fv instanceof cArea || fv instanceof cArea3D) {
|
|
fv = fv.cross(arguments[1].first);
|
|
} else {
|
|
if (fv instanceof cArray) {
|
|
fv = fv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pmt = pmt.tocNumber();
|
|
fv = fv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pmt instanceof cError) {
|
|
return this.value = pmt;
|
|
}
|
|
if (fv instanceof cError) {
|
|
return this.value = fv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
if (type.getValue() != 1 && type.getValue() != 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res;
|
|
if (rate.getValue() != 0) {
|
|
res = -1 * (fv.getValue() + pmt.getValue() * (1 + rate.getValue() * type.getValue()) * ((Math.pow((1 + rate.getValue()), nper.getValue()) - 1) / rate.getValue())) / Math.pow(1 + rate.getValue(), nper.getValue());
|
|
} else {
|
|
res = -1 * (fv.getValue() + pmt.getValue() * nper.getValue());
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
r.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , nper , pmt [ , [ fv ] [ ,[ type ] ] ] )"
|
|
};
|
|
};
|
|
r.setFormat(r.formatType.noneFormat);
|
|
return r;
|
|
},
|
|
"RATE": function () {
|
|
var r = new cBaseFunction("RATE");
|
|
return r;
|
|
},
|
|
"RECEIVED": function () {
|
|
var r = new cBaseFunction("RECEIVED");
|
|
return r;
|
|
},
|
|
"SLN": function () {
|
|
var r = new cBaseFunction("SLN");
|
|
return r;
|
|
},
|
|
"SYD": function () {
|
|
var r = new cBaseFunction("SYD");
|
|
return r;
|
|
},
|
|
"TBILLEQ": function () {
|
|
var r = new cBaseFunction("TBILLEQ");
|
|
return r;
|
|
},
|
|
"TBILLPRICE": function () {
|
|
var r = new cBaseFunction("TBILLPRICE");
|
|
return r;
|
|
},
|
|
"TBILLYIELD": function () {
|
|
var r = new cBaseFunction("TBILLYIELD");
|
|
return r;
|
|
},
|
|
"VDB": function () {
|
|
var r = new cBaseFunction("VDB");
|
|
return r;
|
|
},
|
|
"XIRR": function () {
|
|
var r = new cBaseFunction("XIRR");
|
|
return r;
|
|
},
|
|
"XNPV": function () {
|
|
var r = new cBaseFunction("XNPV");
|
|
return r;
|
|
},
|
|
"YIELD": function () {
|
|
var r = new cBaseFunction("YIELD");
|
|
return r;
|
|
},
|
|
"YIELDDISC": function () {
|
|
var r = new cBaseFunction("YIELDDISC");
|
|
return r;
|
|
},
|
|
"YIELDMAT": function () {
|
|
var r = new cBaseFunction("YIELDMAT");
|
|
return r;
|
|
}
|
|
}; |