DocumentServer/OfficeWeb/sdk/Excel/model/FormulaObjects/financialFunctions.js
nikolay ivanov a8be6b9e72 init repo
2014-07-05 18:22:49 +00:00

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;
}
};