/* * (c) Copyright Ascensio System SIA 2010-2024 * * 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 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * 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 * */ "use strict"; (/** * @param {Window} window * @param {undefined} undefined */ function (window, undefined) { var cDate = Asc.cDate; var cErrorType = AscCommonExcel.cErrorType; var cNumber = AscCommonExcel.cNumber; var cBool = AscCommonExcel.cBool; var cError = AscCommonExcel.cError; var cArea = AscCommonExcel.cArea; var cArea3D = AscCommonExcel.cArea3D; var cEmpty = AscCommonExcel.cEmpty; var cArray = AscCommonExcel.cArray; var cBaseFunction = AscCommonExcel.cBaseFunction; var cFormulaFunctionGroup = AscCommonExcel.cFormulaFunctionGroup; var argType = Asc.c_oAscFormulaArgumentType; var cElementType = AscCommonExcel.cElementType; var c_msPerDay = AscCommonExcel.c_msPerDay; var startRangeCurrentDateSystem = 1; function getPMT(rate, nper, pv, fv, flag) { var res, part; if (rate === 0) { res = (pv + fv) / nper; } else { part = Math.pow(1 + rate, nper); if (flag > 0) { res = (fv * rate / (part - 1) + pv * rate / (1 - 1 / part)) / (1 + rate); } else { res = fv * rate / (part - 1) + pv * rate / (1 - 1 / part); } } return -res; } function getFV(rate, nper, pmt, pv, type) { var res, part; if (rate === 0) { res = pv + pmt * nper; } else { part = Math.pow(1 + rate, nper); if (type > 0) { res = pv * part + pmt * (1 + rate) * (part - 1) / rate; } else { res = pv * part + pmt * (part - 1) / rate; } } return -res; } function getDDB(cost, salvage, life, period, factor) { var ddb, ipmt, oldCost, newCost; ipmt = factor / life; if (ipmt >= 1) { ipmt = 1; if (period === 1) { oldCost = cost; } else { oldCost = 0; } } else { oldCost = cost * Math.pow(1 - ipmt, period - 1); } newCost = cost * Math.pow(1 - ipmt, period); if (newCost < salvage) { ddb = oldCost - salvage; } else { ddb = oldCost - newCost; } if (ddb < 0) { ddb = 0; } return ddb; } function getIPMT(rate, per, pv, type, pmt) { var ipmt; if (per === 1) { if (type > 0) { ipmt = 0; } else { ipmt = -pv; } } else { if (type > 0) { ipmt = getFV(rate, per - 2, pmt, pv, 1) - pmt; } else { ipmt = getFV(rate, per - 1, pmt, pv, 0); } } return ipmt * rate; } /** * @return {boolean} */ function RateIteration(nper, payment, pv, fv, payType, guess) { var valid = true, found = false, x, xnew, term, termDerivation, geoSeries, geoSeriesDerivation, iterationMax = 150, nCount = 0, minEps = 1E-14, eps = 1E-7, powN, powNminus1; fv = fv - payment * payType; pv = pv + payment * payType; if (nper === Math.round(nper)) { x = guess; while (!found && nCount < iterationMax) { powNminus1 = Math.pow(1 + x, nper - 1); powN = powNminus1 * (1 + x); if (Math.approxEqual(Math.abs(x), 0)) { geoSeries = nper; geoSeriesDerivation = nper * (nper - 1) / 2; } else { geoSeries = (powN - 1) / x; geoSeriesDerivation = (nper * powNminus1 - geoSeries) / x; } term = fv + pv * powN + payment * geoSeries; termDerivation = pv * nper * powNminus1 + payment * geoSeriesDerivation; if (Math.abs(term) < minEps) { found = true; } else { if (Math.approxEqual(Math.abs(termDerivation), 0)) { xnew = x + 1.1 * eps; } else { xnew = x - term / termDerivation; } nCount++; found = (Math.abs(xnew - x) < eps); x = xnew; } } valid = (x >= -1); } else { x = (guess < -1) ? -1 : guess; while (valid && !found && nCount < iterationMax) { if (Math.approxEqual(Math.abs(x), 0)) { geoSeries = nper; geoSeriesDerivation = nper * (nper - 1) / 2; } else { geoSeries = (Math.pow(1 + x, nper) - 1) / x; geoSeriesDerivation = nper * Math.pow(1 + x, nper - 1) / x - geoSeries / x; } term = fv + pv * Math.pow(1 + x, nper) + payment * geoSeries; termDerivation = pv * nper * Math.pow(1 + x, nper - 1) + payment * geoSeriesDerivation; if (Math.abs(term) < minEps) { found = true; } else { if (Math.approxEqual(Math.abs(termDerivation), 0)) { xnew = x + 1.1 * eps; } else { xnew = x - term / termDerivation; } nCount++; found = (Math.abs(xnew - x) < eps); x = xnew; valid = (x >= -1); } } } if (valid && found) { return new cNumber(x); } else { return new cError(cErrorType.not_numeric); } } function lcl_GetCouppcd(settl, matur, freq) { var n = new cDate(matur); n.setUTCFullYear(settl.getUTCFullYear()); if (n < settl) { n.addYears(1); } while (n > settl) { n.addMonths(-12 / freq); } if (n.getExcelDate() < 0) { return new cDate((0 - AscCommonExcel.c_DateCorrectConst) * c_msPerDay); } return n; } function lcl_GetCoupncd(settl, matur, freq) { matur.setUTCFullYear(settl.getUTCFullYear()); if (matur > settl) { matur.addYears(-1); } while (matur <= settl) { matur.addMonths(12 / freq); } } function getcoupdaybs(settl, matur, frequency, basis) { var n = lcl_GetCouppcd(settl, matur, frequency); return AscCommonExcel.diffDate(n, settl, basis); } function getcoupdays(settl, matur, frequency, basis) { if (basis == AscCommonExcel.DayCountBasis.ActualActual) { var m = lcl_GetCouppcd(settl, matur, frequency), n = new cDate(m); n.addMonths(12 / frequency); return AscCommonExcel.diffDate(m, n, basis); } return new cNumber(AscCommonExcel.daysInYear(0, basis) / frequency); } function getcoupnum(settl, matur, frequency) { var n = lcl_GetCouppcd(settl, matur, frequency), months = (matur.getUTCFullYear() - n.getUTCFullYear()) * 12 + matur.getUTCMonth() - n.getUTCMonth(); return Math.ceil(months * frequency / 12); } function getcoupdaysnc(settl, matur, frequency, basis) { if ((basis !== 0) && (basis !== 4)) { lcl_GetCoupncd(settl, matur, frequency); return AscCommonExcel.diffDate(settl, matur, basis); } return getcoupdays(new cDate(settl), new cDate(matur), frequency, basis) - getcoupdaybs(new cDate(settl), new cDate(matur), frequency, basis); } function getcoupncd(settl, matur, frequency) { var s = new cDate(settl), m = new cDate(matur); lcl_GetCoupncd(s, m, frequency); return m; } function getprice(settle, mat, rate, yld, redemp, freq, base) { var cdays = getcoupdays(new cDate(settle), new cDate(mat), freq, base), cnum = getcoupnum(new cDate(settle), new cDate(mat), freq), cdaybs = getcoupdaybs(new cDate(settle), new cDate(mat), freq, base), cdaysnc = (cdays - cdaybs) / cdays, fT1 = 100 * rate / freq, fT2 = 1 + yld / freq, res = redemp / (Math.pow(1 + yld / freq, cnum - 1 + cdaysnc)); if (cnum == 1) { return (redemp + fT1) / (1 + cdaysnc * yld / freq) - 100 * rate / freq * cdaybs / cdays; } res -= 100 * rate / freq * cdaybs / cdays; for (var i = 0; i < cnum; i++) { res += fT1 / Math.pow(fT2, i + cdaysnc); } return res; } function getYield(settle, mat, coup, price, redemp, freq, base) { var priceN = 0, yield1 = 0, yield2 = 1, price1 = getprice(settle, mat, coup, yield1, redemp, freq, base), price2 = getprice(settle, mat, coup, yield2, redemp, freq, base), yieldN = (yield2 - yield1) * 0.5; for (var i = 0; i < 100 && priceN != price; i++) { priceN = getprice(settle, mat, coup, yieldN, redemp, freq, base); if (price == price1) { return yield1; } else if (price == price2) { return yield2; } else if (price == priceN) { return yieldN; } else if (price < price2) { yield2 *= 2; price2 = getprice(settle, mat, coup, yield2, redemp, freq, base); yieldN = (yield2 - yield1) * 0.5; } else { if (price < priceN) { yield1 = yieldN; price1 = priceN; } else { yield2 = yieldN; price2 = priceN; } yieldN = yield2 - (yield2 - yield1) * ((price - price2) / (price1 - price2)); } } if (Math.abs(price - priceN) > price / 100) { return new cError(cErrorType.not_numeric); // result not precise enough } return new cNumber(yieldN); } function getyieldmat(settle, mat, issue, rate, price, base) { var issMat = AscCommonExcel.yearFrac(issue, mat, base); var issSet = AscCommonExcel.yearFrac(issue, settle, base); var setMat = AscCommonExcel.yearFrac(settle, mat, base); var y = (1 + issMat * rate) / (price / 100 + issSet * rate) - 1; y /= setMat; return y; } function getduration(settlement, maturity, coupon, yld, frequency, basis) { var dbc = getcoupdaybs(new cDate(settlement), new cDate(maturity), frequency, basis), coupD = getcoupdays(new cDate(settlement), new cDate(maturity), frequency, basis), numCoup = getcoupnum(new cDate(settlement), new cDate(maturity), frequency); var duration = 0, p = 0; var dsc = coupD - dbc; var diff = dsc / coupD - 1; yld = yld / frequency + 1; coupon *= 100 / frequency; for (var index = 1; index <= numCoup; index++) { var di = index + diff; var yldPOW = Math.pow(yld, di); duration += di * coupon / yldPOW; p += coupon / yldPOW; } duration += (diff + numCoup) * 100 / Math.pow(yld, diff + numCoup); p += 100 / Math.pow(yld, diff + numCoup); return duration / p / frequency; } function oddFPrice(settl, matur, iss, firstCoup, rate, yld, redemption, frequency, basis) { function positiveDaysBetween(d1, d2, b) { var res = AscCommonExcel.diffDate(d1, d2, b).getValue(); return res > 0 ? res : 0; } function addMonth(orgDate, numMonths, returnLastDay) { var newDate = new cDate(orgDate); newDate.addMonths(numMonths); if (returnLastDay) { newDate.setUTCDate(newDate.getDaysInMonth()); } return newDate; } function coupNumber(startDate, endDate, countMonths, isWholeNumber) { var my = startDate.getUTCFullYear(), mm = startDate.getUTCMonth(), md = startDate.getUTCDate(), endOfMonthTemp = startDate.lastDayOfMonth(), endOfMonth = (!endOfMonthTemp && mm != 1 && md > 28 && md < new cDate(my, mm).getDaysInMonth()) ? endDate.lastDayOfMonth() : endOfMonthTemp, startDate = addMonth(endDate, 0, endOfMonth), coupons = (isWholeNumber - 0) + (endDate < startDate), frontDate = addMonth(startDate, countMonths, endOfMonth); while (!(countMonths > 0 ? frontDate >= endDate : frontDate <= endDate)) { frontDate = addMonth(frontDate, countMonths, endOfMonth); coupons++; } return coupons; } var res = 0, DSC, numMonths = 12 / frequency, numMonthsNeg = -numMonths, E = getcoupdays(settl, new cDate(firstCoup), frequency, basis).getValue(), coupNums = getcoupnum(settl, new cDate(matur), frequency), dfc = positiveDaysBetween(new cDate(iss), new cDate(firstCoup), basis); if (dfc < E) { DSC = positiveDaysBetween(settl, firstCoup, basis); rate *= 100 / frequency; yld /= frequency; yld++; DSC /= E; res = redemption / Math.pow(yld, (coupNums - 1 + DSC)); res += rate * dfc / E / Math.pow(yld, DSC); res -= rate * positiveDaysBetween(iss, settl, basis) / E; for (var i = 1; i < coupNums; i++) { res += rate / Math.pow(yld, (i + DSC)); } } else { var nc = getcoupnum(iss, firstCoup, frequency), lateCoupon = new cDate(firstCoup), DCdivNL = 0, AdivNL = 0, startDate, endDate, earlyCoupon, NLi, DCi; for (var index = nc; index >= 1; index--) { earlyCoupon = addMonth(lateCoupon, numMonthsNeg, false); NLi = basis == AscCommonExcel.DayCountBasis.ActualActual ? positiveDaysBetween(earlyCoupon, lateCoupon, basis) : E; DCi = index > 1 ? NLi : positiveDaysBetween(iss, lateCoupon, basis); startDate = iss > earlyCoupon ? iss : earlyCoupon; endDate = settl < lateCoupon ? settl : lateCoupon; lateCoupon = new cDate(earlyCoupon); DCdivNL += DCi / NLi; AdivNL += positiveDaysBetween(startDate, endDate, basis) / NLi; } if (basis == AscCommonExcel.DayCountBasis.Actual360 || basis == AscCommonExcel.DayCountBasis.Actual365) { DSC = positiveDaysBetween(settl, getcoupncd(settl, firstCoup, frequency), basis); } else { DSC = E - AscCommonExcel.diffDate(lcl_GetCouppcd(settl, firstCoup, frequency), settl, basis); } var Nq = coupNumber(firstCoup, settl, numMonths, true); coupNums = getcoupnum(firstCoup, matur, frequency); yld /= frequency; yld++; DSC /= E; rate *= 100 / frequency; for (var i = 1; i <= coupNums; i++) { res += 1 / Math.pow(yld, (i + Nq + DSC)); } res *= rate; res += redemption / Math.pow(yld, (DSC + Nq + coupNums)); res += rate * DCdivNL / Math.pow(yld, (Nq + DSC)); res -= rate * AdivNL; } return res; } cFormulaFunctionGroup['Financial'] = cFormulaFunctionGroup['Financial'] || []; cFormulaFunctionGroup['Financial'].push(cACCRINT, cACCRINTM, cAMORDEGRC, cAMORLINC, cCOUPDAYBS, cCOUPDAYS, cCOUPDAYSNC, cCOUPNCD, cCOUPNUM, cCOUPPCD, cCUMIPMT, cCUMPRINC, cDB, cDDB, cDISC, cDOLLARDE, cDOLLARFR, cDURATION, cEFFECT, cFV, cFVSCHEDULE, cINTRATE, cIPMT, cIRR, cISPMT, cMDURATION, cMIRR, cNOMINAL, cNPER, cNPV, cODDFPRICE, cODDFYIELD, cODDLPRICE, cODDLYIELD, cPDURATION, cPMT, cPPMT, cPRICE, cPRICEDISC, cPRICEMAT, cPV, cRATE, cRECEIVED, cRRI, cSLN, cSYD, cTBILLEQ, cTBILLPRICE, cTBILLYIELD, cVDB, cXIRR, cXNPV, cYIELD, cYIELDDISC, cYIELDMAT); /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cACCRINT() { } //***array-formula*** cACCRINT.prototype = Object.create(cBaseFunction.prototype); cACCRINT.prototype.constructor = cACCRINT; cACCRINT.prototype.name = 'ACCRINT'; cACCRINT.prototype.argumentsMin = 6; cACCRINT.prototype.argumentsMax = 8; cACCRINT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cACCRINT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cACCRINT.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cACCRINT.prototype.Calculate = function (arg) { // the ACCRINT formula in ms does not always match the calculation using the formula manually let issue = arg[0], firstInterest = arg[1], settlement = arg[2], rate = arg[3], par = arg[4] && !(cElementType.empty === arg[4].type) ? arg[4] : new cNumber(1000), frequency = arg[5], basis = arg[6] && !(cElementType.empty === arg[6].type) ? arg[6] : new cNumber(0), calcMethod = arg[7] && !(cElementType.empty === arg[7].type) ? arg[7] : new cBool(true); // ------------------------- arg0 type check -------------------------// if (cElementType.cell === issue.type || cElementType.cell3D === issue.type) { issue = issue.getValue(); } else if (cElementType.cellsRange === issue.type || cElementType.cellsRange3D === issue.type) { if (issue.isOneElement()) { issue = issue.getFirstElement(); } else { issue = new cError(cErrorType.wrong_value_type); } } else if (cElementType.array === issue.type) { issue = issue.getElementRowCol(0, 0); } if (cElementType.bool === issue.type) { issue = new cError(cErrorType.wrong_value_type); } else if (cElementType.empty === issue.type) { issue = new cError(cErrorType.not_available); } // ------------------------- arg1 type check -------------------------// if (cElementType.cell === firstInterest.type || cElementType.cell3D === firstInterest.type) { firstInterest = firstInterest.getValue(); } else if (cElementType.cellsRange === firstInterest.type || cElementType.cellsRange3D === firstInterest.type) { if (firstInterest.isOneElement()) { firstInterest = firstInterest.getFirstElement(); } else { firstInterest = new cError(cErrorType.wrong_value_type); } } else if (cElementType.array === firstInterest.type) { firstInterest = firstInterest.getElementRowCol(0, 0); } if (cElementType.bool === firstInterest.type) { firstInterest = new cError(cErrorType.wrong_value_type); } else if (cElementType.empty === firstInterest.type) { firstInterest = new cError(cErrorType.not_available); } // ------------------------- arg2 type check -------------------------// if (cElementType.cell === settlement.type || cElementType.cell3D === settlement.type) { settlement = settlement.getValue(); } else if (cElementType.cellsRange === settlement.type || cElementType.cellsRange3D === settlement.type) { if (settlement.isOneElement()) { settlement = settlement.getFirstElement(); } else { settlement = new cError(cErrorType.wrong_value_type); } } else if (cElementType.array === settlement.type) { settlement = settlement.getElementRowCol(0, 0); } if (cElementType.bool === settlement.type) { settlement = new cError(cErrorType.wrong_value_type); } else if (cElementType.empty === settlement.type) { settlement = new cError(cErrorType.not_available); } // ------------------------- arg3 type check -------------------------// if (cElementType.cell === rate.type || cElementType.cell3D === rate.type) { rate = rate.getValue(); } else if (cElementType.cellsRange === rate.type || cElementType.cellsRange3D === rate.type) { if (rate.isOneElement()) { rate = rate.getFirstElement(); } else { rate = new cError(cErrorType.wrong_value_type); } } else if (cElementType.array === rate.type) { rate = rate.getElementRowCol(0, 0); } if (cElementType.bool === rate.type) { rate = new cError(cErrorType.wrong_value_type); } else if (cElementType.empty === rate.type) { rate = new cError(cErrorType.not_available); } // ------------------------- arg4 type check -------------------------// if (cElementType.cell === par.type || cElementType.cell3D === par.type) { par = par.getValue(); } else if (cElementType.cellsRange === par.type || cElementType.cellsRange3D === par.type) { if (par.isOneElement()) { par = par.getFirstElement(); } else { par = new cError(cErrorType.wrong_value_type); } } else if (cElementType.array === par.type) { par = par.getElementRowCol(0, 0); } if (cElementType.bool === par.type) { par = new cError(cErrorType.wrong_value_type); } // ------------------------- arg5 type check -------------------------// if (cElementType.cell === frequency.type || cElementType.cell3D === frequency.type) { frequency = frequency.getValue(); } else if (cElementType.cellsRange === frequency.type || cElementType.cellsRange3D === frequency.type) { if (frequency.isOneElement()) { frequency = frequency.getFirstElement(); } else { frequency = new cError(cErrorType.wrong_value_type); } } else if (cElementType.array === frequency.type) { frequency = frequency.getElementRowCol(0, 0); } if (cElementType.bool === frequency.type) { frequency = new cError(cErrorType.wrong_value_type); } else if (cElementType.empty === frequency.type) { frequency = new cError(cErrorType.not_available); } // ------------------------- arg6 type check -------------------------// if (cElementType.cell === basis.type || cElementType.cell3D === basis.type) { basis = basis.getValue(); } else if (cElementType.cellsRange === basis.type || cElementType.cellsRange3D === basis.type) { if (basis.isOneElement()) { basis = basis.getFirstElement(); } else { basis = new cError(cErrorType.wrong_value_type); } } else if (cElementType.array === basis.type) { basis = basis.getElementRowCol(0, 0); } if (cElementType.bool === basis.type) { basis = new cError(cErrorType.wrong_value_type); } else if (cElementType.empty === basis.type) { basis = new cError(cErrorType.not_available); } // ------------------------- arg7 type check -------------------------// if (cElementType.cell === calcMethod.type || cElementType.cell3D === calcMethod.type) { calcMethod = calcMethod.getValue(); } else if (cElementType.cellsRange === calcMethod.type || cElementType.cellsRange3D === calcMethod.type) { if (calcMethod.isOneElement()) { calcMethod = calcMethod.getFirstElement(); } else { calcMethod = new cError(cErrorType.wrong_value_type); } } else if (cElementType.array === calcMethod.type) { calcMethod = calcMethod.getElementRowCol(0, 0); } if (cElementType.string === calcMethod.type) { calcMethod = calcMethod.tocNumber(); } if (cElementType.error === calcMethod.type) { return calcMethod; } issue = issue.tocNumber(); firstInterest = firstInterest.tocNumber(); settlement = settlement.tocNumber(); rate = rate.tocNumber(); par = par.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); calcMethod = calcMethod.tocBool(); let argError; if (argError = this._checkErrorArg([issue, firstInterest, settlement, rate, par, frequency, basis, calcMethod])) { return argError; } issue = Math.floor(issue.getValue()); firstInterest = Math.floor(firstInterest.getValue()); settlement = Math.floor(settlement.getValue()); rate = rate.getValue(); par = par.getValue(); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); calcMethod = calcMethod.toBool(); // checking for out-of-date dates let maxDate = AscCommonExcel.getMaxDate(); if (issue > maxDate || firstInterest > maxDate || settlement > maxDate) { return new cError(cErrorType.not_numeric); } if (issue < startRangeCurrentDateSystem || issue <= 0 || issue >= settlement || firstInterest < startRangeCurrentDateSystem || settlement < startRangeCurrentDateSystem || rate <= 0 || par <= 0 || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4) || (!calcMethod && firstInterest < 366 / frequency)) { return new cError(cErrorType.not_numeric); } function addMonth(orgDate, numMonths, returnLastDay) { let newDate = new cDate(orgDate); newDate.addMonths(numMonths); if (returnLastDay) { newDate.setUTCDate(newDate.getDaysInMonth()); } return newDate; } // The function calculates accrued interest on a security on which interest is paid at a certain frequency // Argument calc_method = 0 (we calculate the accumulated interest from the first payment date (first_interest) to the date of purchase of the security (settlement)) // calc_method = 1 (we calculate the accumulated interest from the issue date to the date of purchase of the security (settlement)) // calc_method = 0 is taken into account only if the date of the first payment (first_interest) is greater than the release date (issue) // exception for 1900/1/29 date let iss = issue === 60 ? new Date(Date.UTC(1900, 1, 29)) : AscCommonExcel.getCorrectDate(issue), fInter = firstInterest === 60 ? new Date(Date.UTC(1900, 1, 29)) : AscCommonExcel.getCorrectDate(firstInterest), settl = settlement === 60 ? new Date(Date.UTC(1900, 1, 29)) : AscCommonExcel.getCorrectDate(settlement), numMonths = 12 / frequency, numMonthsNeg = -numMonths, endMonth = fInter.lastDayOfMonth() || (fInter.getUTCDate() === 30 && basis === AscCommonExcel.DayCountBasis.UsPsa30_360), coupPCD, firstDate, startDate, endDate, res, days, coupDays; let mainCoupPcd = lcl_GetCouppcd(iss, fInter, frequency); // if the first coupon period === 0, return 0 as in MS if (mainCoupPcd.getExcelDate() <= 0) { return new cNumber(0); } if (settl > fInter && calcMethod) { coupPCD = new cDate(fInter); startDate = endDate = new cDate(settl); while (!(numMonths > 0 ? coupPCD >= startDate : coupPCD <= startDate)) { endDate = coupPCD; coupPCD = addMonth(coupPCD, numMonths, endMonth); } } else { coupPCD = addMonth(fInter, numMonthsNeg, endMonth); } // basis = 0; firstDate = new cDate(iss > coupPCD ? iss : coupPCD); mainCoupPcd = lcl_GetCouppcd(settl, fInter, frequency); // if first coup period, get date difference by default if (mainCoupPcd < iss) { days = AscCommonExcel.diffDate(firstDate, settl, basis).getValue(); } else { days = AscCommonExcel.days360(firstDate, settl, basis, true); } // if the first date was greater, change the sign of the day difference to minus days = Math.abs(days) * (firstDate > settl ? -1 : 1); coupDays = getcoupdays(coupPCD, fInter, frequency, basis).getValue(); res = days / coupDays; startDate = new cDate(coupPCD); endDate = iss; // res - the coefficient that we use in the formula res * par * rate / frequency // is found by iterating from the first coupon date to the issue date of the bond // 1 step equals the number of months in the coupon period (12, 6, 3) // at each iteration, the issue date and the current coupon date (with the step) are checked, and depending on the result, a number is added to the coefficient: // - 1 or 0 depending on the calc_method used // - or a fraction - the result of dividing the difference in days between the previous step's date and the current date by the number of days in the coupon period while (!(numMonthsNeg > 0 ? startDate >= iss : startDate <= iss)) { endDate = startDate; startDate = addMonth(startDate, numMonthsNeg, endMonth); firstDate = iss > startDate ? iss : startDate; if (basis == AscCommonExcel.DayCountBasis.UsPsa30_360) { days = AscCommonExcel.days360(firstDate, endDate, !(iss > startDate)); coupDays = getcoupdays(startDate, endDate, frequency, basis).getValue(); } else { days = AscCommonExcel.diffDate(firstDate, endDate, basis).getValue(); coupDays = (basis == AscCommonExcel.DayCountBasis.Actual365) ? (365 / frequency) : AscCommonExcel.diffDate(startDate, endDate, basis).getValue(); } res += (iss <= startDate) ? calcMethod : days / coupDays; } res *= par * rate / frequency; return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cACCRINTM() { } //***array-formula*** cACCRINTM.prototype = Object.create(cBaseFunction.prototype); cACCRINTM.prototype.constructor = cACCRINTM; cACCRINTM.prototype.name = 'ACCRINTM'; cACCRINTM.prototype.argumentsMin = 4; cACCRINTM.prototype.argumentsMax = 5; cACCRINTM.prototype.numFormat = AscCommonExcel.cNumFormatNone; cACCRINTM.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cACCRINTM.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any]; cACCRINTM.prototype.Calculate = function (arg) { var issue = arg[0], settlement = arg[1], rate = arg[2], par = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(1000), basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0); if (issue instanceof cArea || issue instanceof cArea3D) { issue = issue.cross(arguments[1]); } else if (issue instanceof cArray) { issue = issue.getElementRowCol(0, 0); } if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (par instanceof cArea || par instanceof cArea3D) { par = par.cross(arguments[1]); } else if (par instanceof cArray) { par = par.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } issue = issue.tocNumber(); settlement = settlement.tocNumber(); rate = rate.tocNumber(); par = par.tocNumber(); basis = basis.tocNumber(); if (issue instanceof cError) { return issue; } if (settlement instanceof cError) { return settlement; } if (rate instanceof cError) { return rate; } if (par instanceof cError) { return par; } if (basis instanceof cError) { return basis; } issue = Math.floor(issue.getValue()); settlement = Math.floor(settlement.getValue()); rate = rate.getValue(); par = par.getValue(); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || issue >= settlement || rate <= 0 || par <= 0 || basis < 0 || basis > 4) { return new cError(cErrorType.not_numeric); } var res = AscCommonExcel.yearFrac(cDate.prototype.getDateFromExcel(issue), cDate.prototype.getDateFromExcel(settlement), basis); res *= rate * par; return new cNumber(res) }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cAMORDEGRC() { } //***array-formula*** cAMORDEGRC.prototype = Object.create(cBaseFunction.prototype); cAMORDEGRC.prototype.constructor = cAMORDEGRC; cAMORDEGRC.prototype.name = 'AMORDEGRC'; cAMORDEGRC.prototype.argumentsMin = 6; cAMORDEGRC.prototype.argumentsMax = 7; cAMORDEGRC.prototype.numFormat = AscCommonExcel.cNumFormatNone; cAMORDEGRC.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cAMORDEGRC.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cAMORDEGRC.prototype.Calculate = function (arg) { var cost = arg[0], datePurch = arg[1], firstPer = arg[2], salvage = arg[3], period = arg[4], rate = arg[5], basis = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cNumber(0); if (cost instanceof cArea || cost instanceof cArea3D) { cost = cost.cross(arguments[1]); } else if (cost instanceof cArray) { cost = cost.getElementRowCol(0, 0); } if (datePurch instanceof cArea || datePurch instanceof cArea3D) { datePurch = datePurch.cross(arguments[1]); } else if (datePurch instanceof cArray) { datePurch = datePurch.getElementRowCol(0, 0); } if (firstPer instanceof cArea || firstPer instanceof cArea3D) { firstPer = firstPer.cross(arguments[1]); } else if (firstPer instanceof cArray) { firstPer = firstPer.getElementRowCol(0, 0); } if (salvage instanceof cArea || salvage instanceof cArea3D) { salvage = salvage.cross(arguments[1]); } else if (salvage instanceof cArray) { salvage = salvage.getElementRowCol(0, 0); } if (period instanceof cArea || period instanceof cArea3D) { period = period.cross(arguments[1]); } else if (period instanceof cArray) { period = period.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } cost = cost.tocNumber(); datePurch = datePurch.tocNumber(); firstPer = firstPer.tocNumber(); salvage = salvage.tocNumber(); period = period.tocNumber(); rate = rate.tocNumber(); basis = basis.tocNumber(); if (cost instanceof cError) { return cost; } if (datePurch instanceof cError) { return datePurch; } if (firstPer instanceof cError) { return firstPer; } if (salvage instanceof cError) { return salvage; } if (period instanceof cError) { return period; } if (rate instanceof cError) { return rate; } if (basis instanceof cError) { return basis; } rate = rate.getValue(); cost = cost.getValue(); salvage = salvage.getValue(); period = period.getValue(); basis = Math.floor(basis.getValue()); datePurch = datePurch.getValue(); firstPer = firstPer.getValue(); if (cost < 0 || salvage < 0 || period < 0 || rate <= 0 || basis == 2 || basis < 0 || basis > 4 || firstPer < 0 || datePurch < 0 || datePurch > firstPer || cost < salvage) { return new cError(cErrorType.not_numeric); } if (cost == salvage /*|| period > per*/) { return new cNumber(0); } datePurch = cDate.prototype.getDateFromExcel(datePurch); firstPer = cDate.prototype.getDateFromExcel(firstPer); function findDepr(countedPeriod, depr, rate, cost) { if (countedPeriod > period) { return new cNumber(Math.round(depr)); } else { countedPeriod++; } var calcT = assetLife - countedPeriod, deprTemp = calcT == 2 ? cost * 0.5 : rate * cost; rate = (calcT == 2 ? 1 : rate); if (cost < salvage) { if (cost - salvage < 0) { depr = 0; } else { depr = cost - salvage; } } else { depr = deprTemp; } cost -= depr; return findDepr(countedPeriod, depr, rate, cost); } function firstDeprLinc(cost, datePurch, firstP, salvage, rate, per, basis) { function fix29February(d) { if ((basis == AscCommonExcel.DayCountBasis.ActualActual || basis == AscCommonExcel.DayCountBasis.Actual365) && d.isLeapYear() && d.getUTCMonth() == 2 && d.getUTCDate() >= 28) { return new cDate(d.getUTCFullYear(), d.getUTCMonth(), 28); } else { return d; } } var firstLen = AscCommonExcel.diffDate(fix29February(datePurch), fix29February(firstP), basis), firstDeprTemp = firstLen / AscCommonExcel.daysInYear(datePurch, basis) * rate * cost, firstDepr = firstDeprTemp == 0 ? cost * rate : firstDeprTemp, period = firstDeprTemp == 0 ? per : per + 1, availDepr = cost - salvage; if (firstDepr > availDepr) { return [availDepr, period]; } else { return [firstDepr, period]; } } var per = 1 / rate, coeff, res; /*Math.ceil(*/ if (cost == salvage || period > per) { res = new cNumber(0); } else { if (per >= 3 && per <= 4) { coeff = 1.5; } else if (per >= 5 && per <= 6) { coeff = 2; } else if (per > 6) { coeff = 2.5; } else { res = new cError(cErrorType.not_numeric); } var deprR = rate * coeff, o = firstDeprLinc(cost, datePurch, firstPer, salvage, deprR, per, basis); var firstDeprLinc = o[0], assetLife = o[1], firstDepr = Math.round(firstDeprLinc); if (period == 0) { res = new cNumber(firstDepr); } else { res = findDepr(1, 0, deprR, (cost - firstDepr)); } } return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cAMORLINC() { } //***array-formula*** cAMORLINC.prototype = Object.create(cBaseFunction.prototype); cAMORLINC.prototype.constructor = cAMORLINC; cAMORLINC.prototype.name = 'AMORLINC'; cAMORLINC.prototype.argumentsMin = 6; cAMORLINC.prototype.argumentsMax = 7; cAMORLINC.prototype.numFormat = AscCommonExcel.cNumFormatNone; cAMORLINC.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cAMORLINC.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cAMORLINC.prototype.Calculate = function (arg) { var cost = arg[0], datePurch = arg[1], firstPer = arg[2], salvage = arg[3], period = arg[4], rate = arg[5], basis = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cNumber(0); if (cost instanceof cArea || cost instanceof cArea3D) { cost = cost.cross(arguments[1]); } else if (cost instanceof cArray) { cost = cost.getElementRowCol(0, 0); } if (datePurch instanceof cArea || datePurch instanceof cArea3D) { datePurch = datePurch.cross(arguments[1]); } else if (datePurch instanceof cArray) { datePurch = datePurch.getElementRowCol(0, 0); } if (firstPer instanceof cArea || firstPer instanceof cArea3D) { firstPer = firstPer.cross(arguments[1]); } else if (firstPer instanceof cArray) { firstPer = firstPer.getElementRowCol(0, 0); } if (salvage instanceof cArea || salvage instanceof cArea3D) { salvage = salvage.cross(arguments[1]); } else if (salvage instanceof cArray) { salvage = salvage.getElementRowCol(0, 0); } if (period instanceof cArea || period instanceof cArea3D) { period = period.cross(arguments[1]); } else if (period instanceof cArray) { period = period.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } cost = cost.tocNumber(); datePurch = datePurch.tocNumber(); firstPer = firstPer.tocNumber(); salvage = salvage.tocNumber(); period = period.tocNumber(); rate = rate.tocNumber(); basis = basis.tocNumber(); if (cost instanceof cError) { return cost; } if (datePurch instanceof cError) { return datePurch; } if (firstPer instanceof cError) { return firstPer; } if (salvage instanceof cError) { return salvage; } if (period instanceof cError) { return period; } if (rate instanceof cError) { return rate; } if (basis instanceof cError) { return basis; } cost = cost.getValue(); datePurch = datePurch.getValue(); firstPer = firstPer.getValue(); salvage = salvage.getValue(); period = period.getValue(); rate = rate.getValue(); basis = Math.floor(basis.getValue()); var val0 = cDate.prototype.getDateFromExcel(datePurch), val1 = cDate.prototype.getDateFromExcel(firstPer); if (cost < 0 || salvage < 0 || period < 0 || rate <= 0 || basis == 2 || basis < 0 || basis > 4 || datePurch < 0 || firstPer < 0 || datePurch > firstPer || cost < salvage) { return new cError(cErrorType.not_numeric); } var fDepTime = AscCommonExcel.yearFrac(val0, val1, basis).getValue() * rate * cost, fDep, depr = rate * cost, availDepr, availDeprTemp, countedPeriod = 1, c = 0, maxIter = 10000; fDep = fDepTime == 0 ? cost * rate : fDepTime; availDepr = (cost - salvage - fDep); rate = Math.ceil(1 / rate); if (cost == salvage || period > rate) { return new cNumber(0); } else { if (period == 0) { return new cNumber(fDep); } else { while (countedPeriod <= period && c < maxIter) { depr = depr > availDepr ? availDepr : depr; availDeprTemp = availDepr - depr; availDepr = availDeprTemp < 0 ? 0 : availDeprTemp; countedPeriod++; c++; } return new cNumber(Math.floor(depr)); } } }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cCOUPDAYBS() { } //***array-formula*** cCOUPDAYBS.prototype = Object.create(cBaseFunction.prototype); cCOUPDAYBS.prototype.constructor = cCOUPDAYBS; cCOUPDAYBS.prototype.name = 'COUPDAYBS'; cCOUPDAYBS.prototype.argumentsMin = 3; cCOUPDAYBS.prototype.argumentsMax = 4; cCOUPDAYBS.prototype.numFormat = AscCommonExcel.cNumFormatNone; cCOUPDAYBS.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cCOUPDAYBS.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any]; cCOUPDAYBS.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], frequency = arg[2], basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); basis = Math.floor(basis.getValue()); frequency = Math.floor(frequency.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); return new cNumber(getcoupdaybs(settl, matur, frequency, basis)); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cCOUPDAYS() { } //***array-formula*** cCOUPDAYS.prototype = Object.create(cBaseFunction.prototype); cCOUPDAYS.prototype.constructor = cCOUPDAYS; cCOUPDAYS.prototype.name = 'COUPDAYS'; cCOUPDAYS.prototype.argumentsMin = 3; cCOUPDAYS.prototype.argumentsMax = 4; cCOUPDAYS.prototype.numFormat = AscCommonExcel.cNumFormatNone; cCOUPDAYS.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cCOUPDAYS.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any]; cCOUPDAYS.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], frequency = arg[2], basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); return new cNumber(getcoupdays(settl, matur, frequency, basis)); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cCOUPDAYSNC() { } //***array-formula*** cCOUPDAYSNC.prototype = Object.create(cBaseFunction.prototype); cCOUPDAYSNC.prototype.constructor = cCOUPDAYSNC; cCOUPDAYSNC.prototype.name = 'COUPDAYSNC'; cCOUPDAYSNC.prototype.argumentsMin = 3; cCOUPDAYSNC.prototype.argumentsMax = 4; cCOUPDAYSNC.prototype.numFormat = AscCommonExcel.cNumFormatNone; cCOUPDAYSNC.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cCOUPDAYSNC.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any]; cCOUPDAYSNC.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], frequency = arg[2], basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); return new cNumber(getcoupdaysnc(new cDate(settl), new cDate(matur), frequency, basis)); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cCOUPNCD() { } //***array-formula*** cCOUPNCD.prototype = Object.create(cBaseFunction.prototype); cCOUPNCD.prototype.constructor = cCOUPNCD; cCOUPNCD.prototype.name = 'COUPNCD'; cCOUPNCD.prototype.argumentsMin = 3; cCOUPNCD.prototype.argumentsMax = 4; cCOUPNCD.prototype.numFormat = AscCommonExcel.cNumFormatNone; cCOUPNCD.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cCOUPNCD.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any]; cCOUPNCD.prototype.Calculate = function (arg) { let settlement = arg[0], maturity = arg[1], frequency = arg[2], basis = arg[3] && !(arg[3].type === cElementType.empty) ? arg[3] : new cNumber(0); if (settlement.type === cElementType.cellsRange || settlement.type === cElementType.cellsRange3D) { settlement = settlement.cross(arguments[1]); } else if (settlement.type === cElementType.array) { settlement = settlement.getElementRowCol(0, 0); } if (maturity.type === cElementType.cellsRange || maturity.type === cElementType.cellsRange3D) { maturity = maturity.cross(arguments[1]); } else if (maturity.type === cElementType.array) { maturity = maturity.getElementRowCol(0, 0); } if (frequency.type === cElementType.cellsRange || frequency.type === cElementType.cellsRange3D) { frequency = frequency.cross(arguments[1]); } else if (frequency.type === cElementType.array) { frequency = frequency.getElementRowCol(0, 0); } if (basis.type === cElementType.cellsRange || basis.type === cElementType.cellsRange3D) { basis = basis.cross(arguments[1]); } else if (basis.type === cElementType.array) { basis = basis.getElementRowCol(0, 0); } if (settlement.type === cElementType.empty || maturity.type === cElementType.empty || frequency.type === cElementType.empty) { return new cError(cErrorType.not_available); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); let argError; if (argError = this._checkErrorArg([settlement, maturity, frequency, basis])) { return argError; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if ((settlement !== 0 && settlement < startRangeCurrentDateSystem) || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) { return new cError(cErrorType.not_numeric); } let settl = AscCommonExcel.getCorrectDate(settlement), matur = AscCommonExcel.getCorrectDate(maturity) let res = new cNumber(getcoupncd(settl, matur, frequency).getExcelDate()); // res.numFormat = 14; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cCOUPNUM() { } //***array-formula*** cCOUPNUM.prototype = Object.create(cBaseFunction.prototype); cCOUPNUM.prototype.constructor = cCOUPNUM; cCOUPNUM.prototype.name = 'COUPNUM'; cCOUPNUM.prototype.argumentsMin = 3; cCOUPNUM.prototype.argumentsMax = 4; cCOUPNUM.prototype.numFormat = AscCommonExcel.cNumFormatNone; cCOUPNUM.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cCOUPNUM.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any]; cCOUPNUM.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], frequency = arg[2], basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); var res = getcoupnum(settl, matur, frequency); return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cCOUPPCD() { } //***array-formula*** cCOUPPCD.prototype = Object.create(cBaseFunction.prototype); cCOUPPCD.prototype.constructor = cCOUPPCD; cCOUPPCD.prototype.name = 'COUPPCD'; cCOUPPCD.prototype.argumentsMin = 3; cCOUPPCD.prototype.argumentsMax = 4; cCOUPPCD.prototype.numFormat = AscCommonExcel.cNumFormatNone; cCOUPPCD.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cCOUPPCD.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any]; cCOUPPCD.prototype.Calculate = function (arg) { let settlement = arg[0], maturity = arg[1], frequency = arg[2], basis = arg[3] && !(arg[3].type === cElementType.empty) ? arg[3] : new cNumber(0); if (settlement.type === cElementType.cellsRange || settlement.type === cElementType.cellsRange3D) { settlement = settlement.cross(arguments[1]); } else if (settlement.type === cElementType.array) { settlement = settlement.getElementRowCol(0, 0); } if (maturity.type === cElementType.cellsRange || maturity.type === cElementType.cellsRange3D) { maturity = maturity.cross(arguments[1]); } else if (maturity.type === cElementType.array) { maturity = maturity.getElementRowCol(0, 0); } if (frequency.type === cElementType.cellsRange || frequency.type === cElementType.cellsRange3D) { frequency = frequency.cross(arguments[1]); } else if (frequency.type === cElementType.array) { frequency = frequency.getElementRowCol(0, 0); } if (basis.type === cElementType.cellsRange || basis.type === cElementType.cellsRange3D) { basis = basis.cross(arguments[1]); } else if (basis.type === cElementType.array) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); let argError; if (argError = this._checkErrorArg([settlement, maturity, frequency, basis])) { return argError; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) { return new cError(cErrorType.not_numeric); } let settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); let n = lcl_GetCouppcd(settl, matur, frequency); let res = new cNumber(n.getExcelDate()); // res.numFormat = 14; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cCUMIPMT() { } //***array-formula*** cCUMIPMT.prototype = Object.create(cBaseFunction.prototype); cCUMIPMT.prototype.constructor = cCUMIPMT; cCUMIPMT.prototype.name = 'CUMIPMT'; cCUMIPMT.prototype.argumentsMin = 6; cCUMIPMT.prototype.argumentsMax = 6; cCUMIPMT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cCUMIPMT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cCUMIPMT.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cCUMIPMT.prototype.Calculate = function (arg) { var rate = arg[0], nper = arg[1], pv = arg[2], startPeriod = arg[3], endPeriod = arg[4], type = arg[5]; if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (nper instanceof cArea || nper instanceof cArea3D) { nper = nper.cross(arguments[1]); } else if (nper instanceof cArray) { nper = nper.getElementRowCol(0, 0); } if (pv instanceof cArea || pv instanceof cArea3D) { pv = pv.cross(arguments[1]); } else if (pv instanceof cArray) { pv = pv.getElementRowCol(0, 0); } if (startPeriod instanceof cArea || startPeriod instanceof cArea3D) { startPeriod = startPeriod.cross(arguments[1]); } else if (startPeriod instanceof cArray) { startPeriod = startPeriod.getElementRowCol(0, 0); } if (endPeriod instanceof cArea || endPeriod instanceof cArea3D) { endPeriod = endPeriod.cross(arguments[1]); } else if (endPeriod instanceof cArray) { endPeriod = endPeriod.getElementRowCol(0, 0); } if (type instanceof cArea || type instanceof cArea3D) { type = type.cross(arguments[1]); } else if (type instanceof cArray) { type = type.getElementRowCol(0, 0); } rate = rate.tocNumber(); nper = nper.tocNumber(); pv = pv.tocNumber(); startPeriod = startPeriod.tocNumber(); endPeriod = endPeriod.tocNumber(); type = type.tocNumber(); if (rate instanceof cError) { return rate; } if (nper instanceof cError) { return nper; } if (pv instanceof cError) { return pv; } if (startPeriod instanceof cError) { return startPeriod; } if (endPeriod instanceof cError) { return endPeriod; } if (type instanceof cError) { return type; } rate = rate.getValue(); nper = nper.getValue(); pv = pv.getValue(); startPeriod = startPeriod.getValue(); endPeriod = endPeriod.getValue(); type = type.getValue(); var fv, ipmt = 0; if (startPeriod < 1 || endPeriod < startPeriod || rate <= 0 || endPeriod > nper || nper <= 0 || pv <= 0 || (type != 0 && type != 1)) { return new cError(cErrorType.not_numeric); } fv = getPMT(rate, nper, pv, 0, type); if (startPeriod == 1) { if (type <= 0) { ipmt = -pv; } startPeriod++; } for (var i = startPeriod; i <= endPeriod; i++) { if (type > 0) { ipmt += getFV(rate, i - 2, fv, pv, 1) - fv; } else { ipmt += getFV(rate, i - 1, fv, pv, 0); } } ipmt *= rate; return new cNumber(ipmt); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cCUMPRINC() { } //***array-formula*** cCUMPRINC.prototype = Object.create(cBaseFunction.prototype); cCUMPRINC.prototype.constructor = cCUMPRINC; cCUMPRINC.prototype.name = 'CUMPRINC'; cCUMPRINC.prototype.argumentsMin = 6; cCUMPRINC.prototype.argumentsMax = 6; cCUMPRINC.prototype.numFormat = AscCommonExcel.cNumFormatNone; cCUMPRINC.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cCUMPRINC.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cCUMPRINC.prototype.Calculate = function (arg) { var rate = arg[0], nper = arg[1], pv = arg[2], startPeriod = arg[3], endPeriod = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0), type = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0); if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (nper instanceof cArea || nper instanceof cArea3D) { nper = nper.cross(arguments[1]); } else if (nper instanceof cArray) { nper = nper.getElementRowCol(0, 0); } if (pv instanceof cArea || pv instanceof cArea3D) { pv = pv.cross(arguments[1]); } else if (pv instanceof cArray) { pv = pv.getElementRowCol(0, 0); } if (startPeriod instanceof cArea || startPeriod instanceof cArea3D) { startPeriod = startPeriod.cross(arguments[1]); } else if (startPeriod instanceof cArray) { startPeriod = startPeriod.getElementRowCol(0, 0); } if (endPeriod instanceof cArea || endPeriod instanceof cArea3D) { endPeriod = endPeriod.cross(arguments[1]); } else if (endPeriod instanceof cArray) { endPeriod = endPeriod.getElementRowCol(0, 0); } if (type instanceof cArea || type instanceof cArea3D) { type = type.cross(arguments[1]); } else if (type instanceof cArray) { type = type.getElementRowCol(0, 0); } rate = rate.tocNumber(); nper = nper.tocNumber(); pv = pv.tocNumber(); startPeriod = startPeriod.tocNumber(); endPeriod = endPeriod.tocNumber(); type = type.tocNumber(); if (rate instanceof cError) { return rate; } if (nper instanceof cError) { return nper; } if (pv instanceof cError) { return pv; } if (startPeriod instanceof cError) { return startPeriod; } if (endPeriod instanceof cError) { return endPeriod; } if (type instanceof cError) { return type; } rate = rate.getValue(); nper = nper.getValue(); pv = pv.getValue(); startPeriod = startPeriod.getValue(); endPeriod = endPeriod.getValue(); type = type.getValue(); var fv, res = 0, nStart = startPeriod; if (startPeriod < 1 || endPeriod < startPeriod || endPeriod < 1 || rate <= 0 || nper <= 0 || pv <= 0 || (type != 0 && type != 1)) { return new cError(cErrorType.not_numeric); } fv = getPMT(rate, nper, pv, 0, type); if (nStart == 1) { if (type <= 0) { res = fv + pv * rate; } else { res = fv; } nStart++; } for (var i = nStart; i <= endPeriod; i++) { if (type > 0) { res += fv - (getFV(rate, i - 2, fv, pv, 1) - fv) * rate; } else { res += fv - getFV(rate, i - 1, fv, pv, 0) * rate; } } return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDB() { } //***array-formula*** cDB.prototype = Object.create(cBaseFunction.prototype); cDB.prototype.constructor = cDB; cDB.prototype.name = 'DB'; cDB.prototype.argumentsMin = 4; cDB.prototype.argumentsMax = 5; cDB.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDB.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number]; cDB.prototype.Calculate = function (arg) { var cost = arg[0], salvage = arg[1], life = arg[2], period = arg[3], month = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(12); if (cost instanceof cArea || cost instanceof cArea3D) { cost = cost.cross(arguments[1]); } else if (cost instanceof cArray) { cost = cost.getElementRowCol(0, 0); } if (salvage instanceof cArea || salvage instanceof cArea3D) { salvage = salvage.cross(arguments[1]); } else if (salvage instanceof cArray) { salvage = salvage.getElementRowCol(0, 0); } if (life instanceof cArea || life instanceof cArea3D) { life = life.cross(arguments[1]); } else if (life instanceof cArray) { life = life.getElementRowCol(0, 0); } if (period instanceof cArea || period instanceof cArea3D) { period = period.cross(arguments[1]); } else if (period instanceof cArray) { period = period.getElementRowCol(0, 0); } if (month instanceof cArea || month instanceof cArea3D) { month = month.cross(arguments[1]); } else if (month instanceof cArray) { month = month.getElementRowCol(0, 0); } cost = cost.tocNumber(); salvage = salvage.tocNumber(); life = life.tocNumber(); period = period.tocNumber(); month = month.tocNumber(); if (cost instanceof cError) { return cost; } if (salvage instanceof cError) { return salvage; } if (life instanceof cError) { return life; } if (period instanceof cError) { return period; } if (month instanceof cError) { return month; } cost = cost.getValue(); salvage = salvage.getValue(); life = life.getValue(); period = period.getValue(); month = Math.floor(month.getValue()); if (salvage >= cost) { return new cNumber(0); } if (month < 1 || month > 12 || salvage < 0 || life < 0 || period < 0 || life + 1 < period || cost < 0) { return new cError(cErrorType.not_numeric); } var rate = 1 - Math.pow(salvage / cost, 1 / life); rate = Math.floor((rate * 1000) + 0.5) / 1000; var firstRate = cost * rate * month / 12; var res = 0; if (Math.floor(period) == 1) { res = firstRate; } else { var sum = firstRate, min = life; if (min > period) { min = period; } var max = Math.floor(min); for (var i = 2; i <= max; i++) { res = (cost - sum) * rate; sum += res; } if (period > life) { res = ((cost - sum) * rate * (12 - month)) / 12; } } return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDDB() { } //***array-formula*** cDDB.prototype = Object.create(cBaseFunction.prototype); cDDB.prototype.constructor = cDDB; cDDB.prototype.name = 'DDB'; cDDB.prototype.argumentsMin = 4; cDDB.prototype.argumentsMax = 5; cDDB.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDDB.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number]; cDDB.prototype.Calculate = function (arg) { var cost = arg[0], salvage = arg[1], life = arg[2], period = arg[3], factor = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(2); if (cost instanceof cArea || cost instanceof cArea3D) { cost = cost.cross(arguments[1]); } else if (cost instanceof cArray) { cost = cost.getElementRowCol(0, 0); } if (salvage instanceof cArea || salvage instanceof cArea3D) { salvage = salvage.cross(arguments[1]); } else if (salvage instanceof cArray) { salvage = salvage.getElementRowCol(0, 0); } if (life instanceof cArea || life instanceof cArea3D) { life = life.cross(arguments[1]); } else if (life instanceof cArray) { life = life.getElementRowCol(0, 0); } if (period instanceof cArea || period instanceof cArea3D) { period = period.cross(arguments[1]); } else if (period instanceof cArray) { period = period.getElementRowCol(0, 0); } if (factor instanceof cArea || factor instanceof cArea3D) { factor = factor.cross(arguments[1]); } else if (factor instanceof cArray) { factor = factor.getElementRowCol(0, 0); } cost = cost.tocNumber(); salvage = salvage.tocNumber(); life = life.tocNumber(); period = period.tocNumber(); factor = factor.tocNumber(); if (cost instanceof cError) { return cost; } if (salvage instanceof cError) { return salvage; } if (life instanceof cError) { return life; } if (period instanceof cError) { return period; } if (factor instanceof cError) { return factor; } cost = cost.getValue(); salvage = salvage.getValue(); life = life.getValue(); period = period.getValue(); factor = factor.getValue(); if (/*cost < salvage ||*/ cost <= 0 || salvage < 0 || factor <= 0 || life <= 0 || period <= 0 || life < period) { return new cError(cErrorType.not_numeric); } if (cost == 0 || salvage == 0) { return new cNumber(0); } var res = new cNumber(getDDB(cost, salvage, life, period, factor)); res.numFormat = /*Asc.c_oAscNumFormatType.Currency*/7; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDISC() { } //***array-formula*** cDISC.prototype = Object.create(cBaseFunction.prototype); cDISC.prototype.constructor = cDISC; cDISC.prototype.name = 'DISC'; cDISC.prototype.argumentsMin = 4; cDISC.prototype.argumentsMax = 5; cDISC.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDISC.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDISC.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any]; cDISC.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], pr = arg[2], redemption = arg[3], basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (pr instanceof cArea || pr instanceof cArea3D) { pr = pr.cross(arguments[1]); } else if (pr instanceof cArray) { pr = pr.getElementRowCol(0, 0); } if (redemption instanceof cArea || redemption instanceof cArea3D) { redemption = redemption.cross(arguments[1]); } else if (redemption instanceof cArray) { redemption = redemption.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); pr = pr.tocNumber(); redemption = redemption.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (pr instanceof cError) { return pr; } if (redemption instanceof cError) { return redemption; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); pr = pr.getValue(); redemption = redemption.getValue(); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || pr <= 0 || redemption <= 0 || basis < 0 || basis > 4) { return new cError(cErrorType.not_numeric); } var res = (1 - pr / redemption) / AscCommonExcel.yearFrac(cDate.prototype.getDateFromExcel(settlement), cDate.prototype.getDateFromExcel(maturity), basis); // this.value.numFormat = 9; return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDOLLARDE() { } //***array-formula*** cDOLLARDE.prototype = Object.create(cBaseFunction.prototype); cDOLLARDE.prototype.constructor = cDOLLARDE; cDOLLARDE.prototype.name = 'DOLLARDE'; cDOLLARDE.prototype.argumentsMin = 2; cDOLLARDE.prototype.argumentsMax = 2; cDOLLARDE.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDOLLARDE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDOLLARDE.prototype.argumentsType = [argType.any, argType.any]; cDOLLARDE.prototype.Calculate = function (arg) { var fractionalDollar = arg[0], fraction = arg[1]; if (fractionalDollar instanceof cArea || fractionalDollar instanceof cArea3D) { fractionalDollar = fractionalDollar.cross(arguments[1]); } else if (fractionalDollar instanceof cArray) { fractionalDollar = fractionalDollar.getElementRowCol(0, 0); } if (fraction instanceof cArea || fraction instanceof cArea3D) { fraction = fraction.cross(arguments[1]); } else if (fraction instanceof cArray) { fraction = fraction.getElementRowCol(0, 0); } fractionalDollar = fractionalDollar.tocNumber(); fraction = fraction.tocNumber(); if (fractionalDollar instanceof cError) { return fractionalDollar; } if (fraction instanceof cError) { return fraction; } fractionalDollar = fractionalDollar.getValue(); fraction = fraction.getValue(); if (fraction < 0) { return new cError(cErrorType.not_numeric); } else if (fraction == 0) { return new cError(cErrorType.division_by_zero); } fraction = Math.floor(fraction); var fInt = Math.floor(fractionalDollar), res = fractionalDollar - fInt; res /= fraction; res *= Math.pow(10, Math.ceil(Math.log10(fraction))); res += fInt; return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDOLLARFR() { } //***array-formula*** cDOLLARFR.prototype = Object.create(cBaseFunction.prototype); cDOLLARFR.prototype.constructor = cDOLLARFR; cDOLLARFR.prototype.name = 'DOLLARFR'; cDOLLARFR.prototype.argumentsMin = 2; cDOLLARFR.prototype.argumentsMax = 2; cDOLLARFR.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDOLLARFR.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDOLLARFR.prototype.argumentsType = [argType.any, argType.any]; cDOLLARFR.prototype.Calculate = function (arg) { var decimalDollar = arg[0], fraction = arg[1]; if (decimalDollar instanceof cArea || decimalDollar instanceof cArea3D) { decimalDollar = decimalDollar.cross(arguments[1]); } else if (decimalDollar instanceof cArray) { decimalDollar = decimalDollar.getElementRowCol(0, 0); } if (fraction instanceof cArea || fraction instanceof cArea3D) { fraction = fraction.cross(arguments[1]); } else if (fraction instanceof cArray) { fraction = fraction.getElementRowCol(0, 0); } decimalDollar = decimalDollar.tocNumber(); fraction = fraction.tocNumber(); if (decimalDollar instanceof cError) { return decimalDollar; } if (fraction instanceof cError) { return fraction; } decimalDollar = decimalDollar.getValue(); fraction = fraction.getValue(); if (fraction < 0) { return new cError(cErrorType.not_numeric); } else if (fraction == 0) { return new cError(cErrorType.division_by_zero); } fraction = Math.floor(fraction); var fInt = Math.floor(decimalDollar), res = decimalDollar - fInt; res *= fraction; res *= Math.pow(10, -Math.ceil(Math.log10(fraction))); res += fInt; return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDURATION() { } //***array-formula*** cDURATION.prototype = Object.create(cBaseFunction.prototype); cDURATION.prototype.constructor = cDURATION; cDURATION.prototype.name = 'DURATION'; cDURATION.prototype.argumentsMin = 5; cDURATION.prototype.argumentsMax = 6; cDURATION.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDURATION.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDURATION.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cDURATION.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], coupon = arg[2], yld = arg[3], frequency = arg[4], basis = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (coupon instanceof cArea || coupon instanceof cArea3D) { coupon = coupon.cross(arguments[1]); } else if (coupon instanceof cArray) { coupon = coupon.getElementRowCol(0, 0); } if (yld instanceof cArea || yld instanceof cArea3D) { yld = yld.cross(arguments[1]); } else if (yld instanceof cArray) { yld = yld.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); coupon = coupon.tocNumber(); yld = yld.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (coupon instanceof cError) { return coupon; } if (yld instanceof cError) { return yld; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); coupon = coupon.getValue(); yld = yld.getValue(); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4) || yld < 0 || coupon < 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); return new cNumber(getduration(settl, matur, coupon, yld, frequency, basis)); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cEFFECT() { } //***array-formula*** cEFFECT.prototype = Object.create(cBaseFunction.prototype); cEFFECT.prototype.constructor = cEFFECT; cEFFECT.prototype.name = 'EFFECT'; cEFFECT.prototype.argumentsMin = 2; cEFFECT.prototype.argumentsMax = 2; cEFFECT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cEFFECT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cEFFECT.prototype.argumentsType = [argType.any, argType.any]; cEFFECT.prototype.Calculate = function (arg) { var nominalRate = arg[0], npery = arg[1]; if (nominalRate instanceof cArea || nominalRate instanceof cArea3D) { nominalRate = nominalRate.cross(arguments[1]); } else if (nominalRate instanceof cArray) { nominalRate = nominalRate.getElementRowCol(0, 0); } if (npery instanceof cArea || npery instanceof cArea3D) { npery = npery.cross(arguments[1]); } else if (npery instanceof cArray) { npery = npery.getElementRowCol(0, 0); } nominalRate = nominalRate.tocNumber(); npery = npery.tocNumber(); if (nominalRate instanceof cError) { return nominalRate; } if (npery instanceof cError) { return npery; } nominalRate = nominalRate.getValue(); npery = Math.floor(npery.getValue()); if (nominalRate <= 0 || npery < 1) { return new cError(cErrorType.not_numeric); } return new cNumber(Math.pow((1 + nominalRate / npery), npery) - 1); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cFV() { } //***array-formula*** cFV.prototype = Object.create(cBaseFunction.prototype); cFV.prototype.constructor = cFV; cFV.prototype.name = 'FV'; cFV.prototype.argumentsMin = 3; cFV.prototype.argumentsMax = 5; cFV.prototype.numFormat = AscCommonExcel.cNumFormatNone; cFV.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number]; cFV.prototype.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]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (nper instanceof cArea || nper instanceof cArea3D) { nper = nper.cross(arguments[1]); } else if (nper instanceof cArray) { nper = nper.getElementRowCol(0, 0); } if (pmt instanceof cArea || pmt instanceof cArea3D) { pmt = pmt.cross(arguments[1]); } else if (pmt instanceof cArray) { pmt = pmt.getElementRowCol(0, 0); } if (pv instanceof cArea || pv instanceof cArea3D) { pv = pv.cross(arguments[1]); } else if (pv instanceof cArray) { pv = pv.getElementRowCol(0, 0); } if (type instanceof cArea || type instanceof cArea3D) { type = type.cross(arguments[1]); } 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 rate; } if (nper instanceof cError) { return nper; } if (pmt instanceof cError) { return pmt; } if (pv instanceof cError) { return pv; } if (type instanceof cError) { return type; } if (type.getValue() != 1 && type.getValue() != 0) { return 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 new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cFVSCHEDULE() { } //***array-formula*** cFVSCHEDULE.prototype = Object.create(cBaseFunction.prototype); cFVSCHEDULE.prototype.constructor = cFVSCHEDULE; cFVSCHEDULE.prototype.name = 'FVSCHEDULE'; cFVSCHEDULE.prototype.argumentsMin = 2; cFVSCHEDULE.prototype.argumentsMax = 2; cFVSCHEDULE.prototype.numFormat = AscCommonExcel.cNumFormatNone; cFVSCHEDULE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cFVSCHEDULE.prototype.arrayIndexes = {1: 1}; cFVSCHEDULE.prototype.argumentsType = [argType.any, argType.any]; cFVSCHEDULE.prototype.Calculate = function (arg) { var principal = arg[0], schedule = arg[1], shedList = []; if (principal instanceof cArea || principal instanceof cArea3D) { principal = principal.cross(arguments[1]); } else if (principal instanceof cArray) { principal = principal.getElementRowCol(0, 0); } if (schedule instanceof cArea || schedule instanceof cArea3D) { schedule.foreach2(function (v) { shedList.push(v.tocNumber()); }) } else if (schedule instanceof cArray) { schedule.foreach(function (v) { shedList.push(v.tocNumber()); }) } else { shedList.push(schedule.tocNumber()) } principal = principal.tocNumber(); if (principal instanceof cError) { return principal; } var princ = principal.getValue(); for (var i = 0; i < shedList.length; i++) { if (shedList[i] instanceof cError) { return new cError(cErrorType.wrong_value_type); } else { princ *= 1 + shedList[i].getValue(); } } return new cNumber(princ); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cINTRATE() { } //***array-formula*** cINTRATE.prototype = Object.create(cBaseFunction.prototype); cINTRATE.prototype.constructor = cINTRATE; cINTRATE.prototype.name = 'INTRATE'; cINTRATE.prototype.argumentsMin = 4; cINTRATE.prototype.argumentsMax = 5; cINTRATE.prototype.numFormat = AscCommonExcel.cNumFormatNone; cINTRATE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cINTRATE.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any]; cINTRATE.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], investment = arg[2], redemption = arg[3], basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (investment instanceof cArea || investment instanceof cArea3D) { investment = investment.cross(arguments[1]); } else if (investment instanceof cArray) { investment = investment.getElementRowCol(0, 0); } if (redemption instanceof cArea || redemption instanceof cArea3D) { redemption = redemption.cross(arguments[1]); } else if (redemption instanceof cArray) { redemption = redemption.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); investment = investment.tocNumber(); redemption = redemption.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (investment instanceof cError) { return investment; } if (redemption instanceof cError) { return redemption; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); investment = investment.getValue(); redemption = redemption.getValue(); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || investment <= 0 || redemption <= 0 || basis < 0 || basis > 4) { return new cError(cErrorType.not_numeric); } var res = ((redemption / investment) - 1) / AscCommonExcel.yearFrac(cDate.prototype.getDateFromExcel(settlement), cDate.prototype.getDateFromExcel(maturity), basis); var res = new cNumber(res); res.numFormat = 10; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cIPMT() { } //***array-formula*** cIPMT.prototype = Object.create(cBaseFunction.prototype); cIPMT.prototype.constructor = cIPMT; cIPMT.prototype.name = 'IPMT'; cIPMT.prototype.argumentsMin = 4; cIPMT.prototype.argumentsMax = 6; cIPMT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cIPMT.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number, argType.number]; cIPMT.prototype.Calculate = function (arg) { var rate = arg[0], per = arg[1], nper = arg[2], pv = arg[3], fv = arg[4] ? arg[4] : new cNumber(0), type = arg[5] ? arg[5] : new cNumber(0); if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (per instanceof cArea || per instanceof cArea3D) { per = per.cross(arguments[1]); } else if (per instanceof cArray) { per = per.getElementRowCol(0, 0); } if (nper instanceof cArea || nper instanceof cArea3D) { nper = nper.cross(arguments[1]); } else if (nper instanceof cArray) { nper = nper.getElementRowCol(0, 0); } if (pv instanceof cArea || pv instanceof cArea3D) { pv = pv.cross(arguments[1]); } else if (pv instanceof cArray) { pv = pv.getElementRowCol(0, 0); } if (fv instanceof cArea || fv instanceof cArea3D) { fv = fv.cross(arguments[1]); } else if (fv instanceof cArray) { fv = fv.getElementRowCol(0, 0); } if (type instanceof cArea || type instanceof cArea3D) { type = type.cross(arguments[1]); } else if (type instanceof cArray) { type = type.getElementRowCol(0, 0); } rate = rate.tocNumber(); per = per.tocNumber(); nper = nper.tocNumber(); pv = pv.tocNumber(); fv = fv.tocNumber(); type = type.tocNumber(); if (rate instanceof cError) { return rate; } if (per instanceof cError) { return per; } if (nper instanceof cError) { return nper; } if (pv instanceof cError) { return pv; } if (fv instanceof cError) { return fv; } if (type instanceof cError) { return type; } rate = rate.getValue(); per = per.getValue(); nper = nper.getValue(); pv = pv.getValue(); fv = fv.getValue(); type = type.getValue(); var res; if (per < 1 || per > nper || type != 0 && type != 1) { return new cError(cErrorType.not_numeric); } res = getPMT(rate, nper, pv, fv, type); // this.value.numFormat = 9; return new cNumber(getIPMT(rate, per, pv, type, res)); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cIRR() { } //***array-formula*** cIRR.prototype = Object.create(cBaseFunction.prototype); cIRR.prototype.constructor = cIRR; cIRR.prototype.name = 'IRR'; cIRR.prototype.argumentsMin = 1; cIRR.prototype.argumentsMax = 2; cIRR.prototype.numFormat = AscCommonExcel.cNumFormatNone; cIRR.prototype.arrayIndexes = {0: 1}; cIRR.prototype.argumentsType = [argType.reference, argType.number]; cIRR.prototype.Calculate = function (arg) { var arg0 = arg[0], arg1 = arg[1] ? arg[1] : new cNumber(0.1); function npv(r, cf) { var res = 0; for (var i = 1; i <= cf.length; i++) { res += cf[i - 1].getValue() / Math.pow(1 + r, i); } return res; } function irr2(x, arr) { var g_Eps = 1e-7, nIM = 500, eps = 1, nMC = 0, xN, guess = x; while (eps > g_Eps && nMC < nIM) { xN = x - npv(x, arr) / ((npv(x + g_Eps, arr) - npv(x - g_Eps, arr)) / (2 * g_Eps)); nMC++; eps = Math.abs(xN - x); x = xN; } if (isNaN(x) || Infinity == Math.abs(x)) { var max = Number.MAX_VALUE, min = -Number.MAX_VALUE, step = 1.6, low = guess - 0.01 <= min ? min + g_Eps : guess - 0.01, high = guess + 0.01 >= max ? max - g_Eps : guess + 0.01, i, xBegin, xEnd, x, y, currentIter = 0; if (guess <= min || guess >= max) { return new cError(cErrorType.not_numeric); } for (i = 0; i < nIM; i++) { xBegin = low <= min ? min + g_Eps : low; xEnd = high >= max ? max - g_Eps : high; x = npv(xBegin, arr); y = npv(xEnd, arr); if (x * y <= 0) { break; } else if (x * y > 0) { low = (xBegin + step * (xBegin - xEnd)); high = (xEnd + step * (xEnd - xBegin)); } else { return new cError(cErrorType.not_numeric); } } if (i == nIM) { return new cError(cErrorType.not_numeric); } var fXbegin = npv(xBegin, arr), fXend = npv(xEnd, arr), fXi, xI; if (Math.abs(fXbegin) < g_Eps) { return new cNumber(fXbegin); } if (Math.abs(fXend) < g_Eps) { return new cNumber(fXend); } do { xI = xBegin + (xEnd - xBegin) / 2; fXi = npv(xI, arr); if (fXbegin * fXi < 0) { xEnd = xI; } else { xBegin = xI; } fXbegin = npv(xBegin, arr); currentIter++; } while (Math.abs(fXi) > g_Eps && currentIter < nIM); return new cNumber(xI); } else { return new cNumber(x); } } var arr = []; if (arg0 instanceof cArray) { arg0.foreach(function (v) { if (v instanceof cNumber) { arr.push(v); } }); } else if (arg0.type === cElementType.cellsRange || arg0.type === cElementType.cellsRange3D) { arg0.foreach2(function (v) { if (v instanceof cNumber) { arr.push(v); } }); } arg1 = arg1.tocNumber(); if (arg1 instanceof cError) { return new cError(cErrorType.not_numeric); } var wasNeg = false, wasPos = false; for (var i = 0; i < arr.length; i++) { if (arr[i].getValue() > 0) { wasNeg = true; } if (arr[i].getValue() < 0) { wasPos = true; } } if (!(wasNeg && wasPos)) { return new cError(cErrorType.not_numeric); } var res = irr2(arg1.getValue(), arr); res.numFormat = 9; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cISPMT() { } //***array-formula*** cISPMT.prototype = Object.create(cBaseFunction.prototype); cISPMT.prototype.constructor = cISPMT; cISPMT.prototype.name = 'ISPMT'; cISPMT.prototype.argumentsMin = 4; cISPMT.prototype.argumentsMax = 4; cISPMT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cISPMT.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number]; cISPMT.prototype.Calculate = function (arg) { var rate = arg[0], per = arg[1], nper = arg[2], pv = arg[3]; if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (per instanceof cArea || per instanceof cArea3D) { per = per.cross(arguments[1]); } else if (per instanceof cArray) { per = per.getElementRowCol(0, 0); } if (nper instanceof cArea || nper instanceof cArea3D) { nper = nper.cross(arguments[1]); } else if (nper instanceof cArray) { nper = nper.getElementRowCol(0, 0); } if (pv instanceof cArea || pv instanceof cArea3D) { pv = pv.cross(arguments[1]); } else if (pv instanceof cArray) { pv = pv.getElementRowCol(0, 0); } rate = rate.tocNumber(); per = per.tocNumber(); nper = nper.tocNumber(); pv = pv.tocNumber(); if (rate instanceof cError) { return rate; } if (per instanceof cError) { return per; } if (nper instanceof cError) { return nper; } if (pv instanceof cError) { return pv; } if (nper.getValue() == 0) { return new cError(cErrorType.division_by_zero); } return new cNumber(pv.getValue() * rate.getValue() * (per.getValue() / nper.getValue() - 1)); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cMDURATION() { } //***array-formula*** cMDURATION.prototype = Object.create(cBaseFunction.prototype); cMDURATION.prototype.constructor = cMDURATION; cMDURATION.prototype.name = 'MDURATION'; cMDURATION.prototype.argumentsMin = 5; cMDURATION.prototype.argumentsMax = 6; cMDURATION.prototype.numFormat = AscCommonExcel.cNumFormatNone; cMDURATION.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cMDURATION.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cMDURATION.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], coupon = arg[2], yld = arg[3], frequency = arg[4], basis = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (coupon instanceof cArea || coupon instanceof cArea3D) { coupon = coupon.cross(arguments[1]); } else if (coupon instanceof cArray) { coupon = coupon.getElementRowCol(0, 0); } if (yld instanceof cArea || yld instanceof cArea3D) { yld = yld.cross(arguments[1]); } else if (yld instanceof cArray) { yld = yld.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); coupon = coupon.tocNumber(); yld = yld.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (coupon instanceof cError) { return coupon; } if (yld instanceof cError) { return yld; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); coupon = coupon.getValue(); yld = yld.getValue(); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4) || yld < 0 || coupon < 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); var duration = getduration(settl, matur, coupon, yld, frequency, basis); duration /= 1 + yld / frequency; return new cNumber(duration); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cMIRR() { } //***array-formula*** cMIRR.prototype = Object.create(cBaseFunction.prototype); cMIRR.prototype.constructor = cMIRR; cMIRR.prototype.name = 'MIRR'; cMIRR.prototype.argumentsMin = 3; cMIRR.prototype.argumentsMax = 3; cMIRR.prototype.numFormat = AscCommonExcel.cNumFormatNone; cMIRR.prototype.arrayIndexes = {0: 1}; cMIRR.prototype.argumentsType = [argType.reference, argType.number, argType.number]; cMIRR.prototype.Calculate = function (arg) { var arg0 = arg[0], invest = arg[1], reinvest = arg[2]; var valueArray = []; if (arg0 instanceof cArea) { arg0.foreach2(function (c) { if (c instanceof cNumber || c instanceof cError) { valueArray.push(c); } }) } else if (arg0 instanceof cArray) { arg0.foreach(function (c) { if (c instanceof cNumber || c instanceof cError) { valueArray.push(c); } }) } else if (arg0 instanceof cArea3D) { if (arg0.isSingleSheet()) { arg0.foreach2(function (c) { if (c instanceof cNumber || c instanceof cError) { valueArray.push(c); } }) } else { return new cError(cErrorType.wrong_value_type); } } else { if (arg0 instanceof cError) { return new cError(cErrorType.not_numeric) } else if (arg0 instanceof cNumber) { valueArray.push(arg0); } } if (invest instanceof cArea || invest instanceof cArea3D) { invest = invest.cross(arguments[1]); } else if (invest instanceof cArray) { invest = invest.getElementRowCol(0, 0); } if (reinvest instanceof cArea || reinvest instanceof cArea3D) { reinvest = reinvest.cross(arguments[1]); } else if (reinvest instanceof cArray) { reinvest = reinvest.getElementRowCol(0, 0); } invest = invest.tocNumber(); reinvest = reinvest.tocNumber(); if (invest instanceof cError) { return invest; } if (reinvest instanceof cError) { return reinvest; } invest = invest.getValue() + 1; reinvest = reinvest.getValue() + 1; var NPVreinvest = 0, POWreinvest = 1, NPVinvest = 0, POWinvest = 1, cellValue, wasNegative = false, wasPositive = false; for (var i = 0; i < valueArray.length; i++) { cellValue = valueArray[i]; if (cellValue instanceof cError) { return cellValue; } cellValue = valueArray[i].getValue(); if (cellValue > 0) { // reinvestments wasPositive = true; NPVreinvest += cellValue * POWreinvest; } else if (cellValue < 0) { // investments wasNegative = true; NPVinvest += cellValue * POWinvest; } POWreinvest /= reinvest; POWinvest /= invest; } if (!(wasNegative && wasPositive)) { return new cError(cErrorType.division_by_zero); } var res = -NPVreinvest / NPVinvest; res *= Math.pow(reinvest, valueArray.length - 1); res = Math.pow(res, 1 / (valueArray.length - 1)); var res = new cNumber(res - 1); res.numFormat = 9; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cNOMINAL() { } //***array-formula*** cNOMINAL.prototype = Object.create(cBaseFunction.prototype); cNOMINAL.prototype.constructor = cNOMINAL; cNOMINAL.prototype.name = 'NOMINAL'; cNOMINAL.prototype.argumentsMin = 2; cNOMINAL.prototype.argumentsMax = 2; cNOMINAL.prototype.numFormat = AscCommonExcel.cNumFormatNone; cNOMINAL.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cNOMINAL.prototype.argumentsType = [argType.any, argType.any]; cNOMINAL.prototype.Calculate = function (arg) { var effectRate = arg[0], npery = arg[1]; if (effectRate instanceof cArea || effectRate instanceof cArea3D) { effectRate = effectRate.cross(arguments[1]); } else if (effectRate instanceof cArray) { effectRate = effectRate.getElementRowCol(0, 0); } if (npery instanceof cArea || npery instanceof cArea3D) { npery = npery.cross(arguments[1]); } else if (npery instanceof cArray) { npery = npery.getElementRowCol(0, 0); } effectRate = effectRate.tocNumber(); npery = npery.tocNumber(); if (effectRate instanceof cError) { return effectRate; } if (npery instanceof cError) { return npery; } effectRate = effectRate.getValue(); npery = npery.getValue(); npery = Math.floor(npery); if (effectRate <= 0 || npery < 1) { return new cError(cErrorType.not_numeric); } // this.value.numFormat = 9; return new cNumber((Math.pow(effectRate + 1, 1 / npery) - 1) * npery); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cNPER() { } //***array-formula*** cNPER.prototype = Object.create(cBaseFunction.prototype); cNPER.prototype.constructor = cNPER; cNPER.prototype.name = 'NPER'; cNPER.prototype.argumentsMin = 3; cNPER.prototype.argumentsMax = 5; cNPER.prototype.numFormat = AscCommonExcel.cNumFormatNone; cNPER.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number]; cNPER.prototype.Calculate = function (arg) { let 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.type === cElementType.cellsRange || rate.type === cElementType.cellsRange3D) { rate = rate.cross(arguments[1]); } else if (rate.type === cElementType.array) { rate = rate.getElementRowCol(0, 0); } if (pmt.type === cElementType.cellsRange || pmt.type === cElementType.cellsRange3D) { pmt = pmt.cross(arguments[1]); } else if (pmt.type === cElementType.array) { pmt = pmt.getElementRowCol(0, 0); } if (pv.type === cElementType.cellsRange || pv.type === cElementType.cellsRange3D) { pv = pv.cross(arguments[1]); } else if (pv.type === cElementType.array) { pv = pv.getElementRowCol(0, 0); } if (fv.type === cElementType.cellsRange || fv.type === cElementType.cellsRange3D) { fv = fv.cross(arguments[1]); } else if (fv.type === cElementType.array) { fv = fv.getElementRowCol(0, 0); } if (type.type === cElementType.cellsRange || type.type === cElementType.cellsRange3D) { type = type.cross(arguments[1]); } else if (type.type === cElementType.array) { type = type.getElementRowCol(0, 0); } rate = rate.tocNumber(); pmt = pmt.tocNumber(); pv = pv.tocNumber(); fv = fv.tocNumber(); type = type.tocNumber(); if (rate.type === cElementType.error) { return rate; } if (pmt.type === cElementType.error) { return pmt; } if (pv.type === cElementType.error) { return pv; } if (fv.type === cElementType.error) { return fv; } if (type.type === cElementType.error) { return type; } if (type.getValue() != 1 && type.getValue() != 0) { return new cError(cErrorType.not_numeric); } let 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 new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cNPV() { } //***array-formula*** cNPV.prototype = Object.create(cBaseFunction.prototype); cNPV.prototype.constructor = cNPV; cNPV.prototype.name = 'NPV'; cNPV.prototype.argumentsMin = 2; cNPV.prototype.numFormat = AscCommonExcel.cNumFormatNone; cNPV.prototype.argumentsType = [argType.number, [argType.number]]; //TODO нужен новый тип - все элементы приходят в виде массива, кроме первого cNPV.prototype.arrayIndexes = {1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1}; cNPV.prototype.getArrayIndex = function (index) { if (index === 0) { return undefined; } return 1; }; cNPV.prototype.Calculate = function (arg) { var arg0 = arg[0], 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]); } else if (arg0 instanceof cArray) { arg0 = arg0.getElementRowCol(0, 0); } arg0 = arg0.tocNumber(); if (arg0 instanceof cError) { return arg0; } rate = arg0.getValue(); if (rate == -1) { return new cError(cErrorType.division_by_zero); } for (var i = 1; i < arg.length; 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) { 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 new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cODDFPRICE() { } //***array-formula*** cODDFPRICE.prototype = Object.create(cBaseFunction.prototype); cODDFPRICE.prototype.constructor = cODDFPRICE; cODDFPRICE.prototype.name = 'ODDFPRICE'; cODDFPRICE.prototype.argumentsMin = 8; cODDFPRICE.prototype.argumentsMax = 9; cODDFPRICE.prototype.numFormat = AscCommonExcel.cNumFormatNone; cODDFPRICE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cODDFPRICE.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cODDFPRICE.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], issue = arg[2], first_coupon = arg[3], rate = arg[4], yld = arg[5], redemption = arg[6], frequency = arg[7], basis = arg[8] && !(arg[8] instanceof cEmpty) ? arg[8] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (issue instanceof cArea || issue instanceof cArea3D) { issue = issue.cross(arguments[1]); } else if (issue instanceof cArray) { issue = issue.getElementRowCol(0, 0); } if (first_coupon instanceof cArea || first_coupon instanceof cArea3D) { first_coupon = first_coupon.cross(arguments[1]); } else if (first_coupon instanceof cArray) { first_coupon = first_coupon.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (yld instanceof cArea || yld instanceof cArea3D) { yld = yld.cross(arguments[1]); } else if (yld instanceof cArray) { yld = yld.getElementRowCol(0, 0); } if (redemption instanceof cArea || redemption instanceof cArea3D) { redemption = redemption.cross(arguments[1]); } else if (redemption instanceof cArray) { redemption = redemption.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); issue = issue.tocNumber(); first_coupon = first_coupon.tocNumber(); rate = rate.tocNumber(); yld = yld.tocNumber(); redemption = redemption.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (issue instanceof cError) { return issue; } if (first_coupon instanceof cError) { return first_coupon; } if (rate instanceof cError) { return rate; } if (yld instanceof cError) { return yld; } if (redemption instanceof cError) { return redemption; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); issue = Math.floor(issue.getValue()); first_coupon = Math.floor(first_coupon.getValue()); rate = rate.getValue(); yld = yld.getValue(); redemption = redemption.getValue(); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (maturity < startRangeCurrentDateSystem || settlement < startRangeCurrentDateSystem || first_coupon < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || maturity <= first_coupon || first_coupon <= settlement || settlement <= issue || basis < 0 || basis > 4 || yld < 0 || rate < 0 || redemption < 0 || frequency != 1 && frequency != 2 && frequency != 4) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity), iss = cDate.prototype.getDateFromExcel(issue), firstCoup = cDate.prototype.getDateFromExcel(first_coupon); return new cNumber(oddFPrice(settl, matur, iss, firstCoup, rate, yld, redemption, frequency, basis)) }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cODDFYIELD() { } //***array-formula*** cODDFYIELD.prototype = Object.create(cBaseFunction.prototype); cODDFYIELD.prototype.constructor = cODDFYIELD; cODDFYIELD.prototype.name = 'ODDFYIELD'; cODDFYIELD.prototype.argumentsMin = 8; cODDFYIELD.prototype.argumentsMax = 9; cODDFYIELD.prototype.numFormat = AscCommonExcel.cNumFormatNone; cODDFYIELD.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cODDFYIELD.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cODDFYIELD.prototype.Calculate = function (arg) { let settlement = arg[0], maturity = arg[1], issue = arg[2], first_coupon = arg[3], rate = arg[4], pr = arg[5], redemption = arg[6], frequency = arg[7], basis = arg[8] && !(arg[8] instanceof cEmpty) ? arg[8] : new cNumber(0); if (settlement.type === cElementType.cellsRange || settlement.type === cElementType.cellsRange3D) { settlement = settlement.cross(arguments[1]); } else if (settlement.type === cElementType.array) { settlement = settlement.getElementRowCol(0, 0); } if (maturity.type === cElementType.cellsRange || maturity.type === cElementType.cellsRange3D) { maturity = maturity.cross(arguments[1]); } else if (maturity.type === cElementType.array) { maturity = maturity.getElementRowCol(0, 0); } if (issue.type === cElementType.cellsRange || issue.type === cElementType.cellsRange3D) { issue = issue.cross(arguments[1]); } else if (issue.type === cElementType.array) { issue = issue.getElementRowCol(0, 0); } if (first_coupon.type === cElementType.cellsRange || first_coupon.type === cElementType.cellsRange3D) { first_coupon = first_coupon.cross(arguments[1]); } else if (first_coupon.type === cElementType.array) { first_coupon = first_coupon.getElementRowCol(0, 0); } if (rate.type === cElementType.cellsRange || rate.type === cElementType.cellsRange3D) { rate = rate.cross(arguments[1]); } else if (rate.type === cElementType.array) { rate = rate.getElementRowCol(0, 0); } if (pr.type === cElementType.cellsRange || pr.type === cElementType.cellsRange3D) { pr = pr.cross(arguments[1]); } else if (pr.type === cElementType.array) { pr = pr.getElementRowCol(0, 0); } if (redemption.type === cElementType.cellsRange || redemption.type === cElementType.cellsRange3D) { redemption = redemption.cross(arguments[1]); } else if (redemption.type === cElementType.array) { redemption = redemption.getElementRowCol(0, 0); } if (frequency.type === cElementType.cellsRange || frequency.type === cElementType.cellsRange3D) { frequency = frequency.cross(arguments[1]); } else if (frequency.type === cElementType.array) { frequency = frequency.getElementRowCol(0, 0); } if (basis.type === cElementType.cellsRange || basis.type === cElementType.cellsRange3D) { basis = basis.cross(arguments[1]); } else if (basis.type === cElementType.array) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); issue = issue.tocNumber(); first_coupon = first_coupon.tocNumber(); rate = rate.tocNumber(); pr = pr.tocNumber(); redemption = redemption.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement.type === cElementType.error) { return settlement; } if (maturity.type === cElementType.error) { return maturity; } if (issue.type === cElementType.error) { return issue; } if (first_coupon.type === cElementType.error) { return first_coupon; } if (rate.type === cElementType.error) { return rate; } if (pr.type === cElementType.error) { return pr; } if (redemption.type === cElementType.error) { return redemption; } if (frequency.type === cElementType.error) { return frequency; } if (basis.type === cElementType.error) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); issue = Math.floor(issue.getValue()); first_coupon = Math.floor(first_coupon.getValue()); rate = rate.getValue(); pr = pr.getValue(); redemption = redemption.getValue(); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || first_coupon < startRangeCurrentDateSystem || maturity <= first_coupon || first_coupon <= settlement || settlement <= issue || basis < 0 || basis > 4 || pr < 0 || rate < 0 || redemption < 0 || frequency != 1 && frequency != 2 && frequency != 4) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity), iss = cDate.prototype.getDateFromExcel(issue), firstCoup = cDate.prototype.getDateFromExcel(first_coupon); var years = AscCommonExcel.diffDate(settl, matur, basis), px = pr - 100, num = rate * years * 100 - px, denum = px * 0.25 * (1 + 2 * years) + years * 100, guess = num / denum, x = guess, g_Eps = 1e-7, nIM = 500, eps = 1, nMC = 0, xN; function iterF(yld) { return pr - oddFPrice(settl, matur, iss, firstCoup, rate, yld, redemption, frequency, basis) } while (eps > g_Eps && nMC < nIM) { xN = x - iterF(x) / ((iterF(x + g_Eps) - iterF(x - g_Eps)) / (2 * g_Eps)); nMC++; eps = Math.abs(xN - x); x = xN; } if (isNaN(x) || Infinity == Math.abs(x)) { let max = Number.MAX_VALUE, min = -Number.MAX_VALUE, step = 1.6, low = guess - 0.01 <= min ? min + g_Eps : guess - 0.01, high = guess + 0.01 >= max ? max - g_Eps : guess + 0.01, i, xBegin, xEnd, x, y, currentIter = 0; if (guess <= min || guess >= max) { return new cError(cErrorType.not_numeric); } for (i = 0; i < nIM; i++) { xBegin = low <= min ? min + g_Eps : low; xEnd = high >= max ? max - g_Eps : high; x = iterF(xBegin); y = iterF(xEnd); if (x * y <= 0) { break; } else if (x * y > 0) { low = (xBegin + step * (xBegin - xEnd)); high = (xEnd + step * (xEnd - xBegin)); } else { return new cError(cErrorType.not_numeric); } } if (i == nIM) { return new cError(cErrorType.not_numeric); } let fXbegin = iterF(xBegin), fXend = iterF(xEnd), fXi, xI; if (Math.abs(fXbegin) < g_Eps) { return new cNumber(fXbegin); } if (Math.abs(fXend) < g_Eps) { return new cNumber(fXend); } do { xI = xBegin + (xEnd - xBegin) / 2; fXi = iterF(xI); if (fXbegin * fXi < 0) { xEnd = xI; } else { xBegin = xI; } fXbegin = iterF(xBegin); currentIter++; } while (Math.abs(fXi) > g_Eps && currentIter < nIM); return new cNumber(xI); } else { return new cNumber(x); } }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cODDLPRICE() { } cODDLPRICE.prototype = Object.create(cBaseFunction.prototype); cODDLPRICE.prototype.constructor = cODDLPRICE; cODDLPRICE.prototype.name = 'ODDLPRICE'; cODDLPRICE.prototype.argumentsMin = 7; cODDLPRICE.prototype.argumentsMax = 8; cODDLPRICE.prototype.numFormat = AscCommonExcel.cNumFormatNone; cODDLPRICE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cODDLPRICE.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cODDLPRICE.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], last_interest = arg[2], rate = arg[3], yld = arg[4], redemption = arg[5], frequency = arg[6], basis = arg[7] && !(arg[7] instanceof cEmpty) ? arg[7] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (last_interest instanceof cArea || last_interest instanceof cArea3D) { last_interest = last_interest.cross(arguments[1]); } else if (last_interest instanceof cArray) { last_interest = last_interest.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (yld instanceof cArea || yld instanceof cArea3D) { yld = yld.cross(arguments[1]); } else if (yld instanceof cArray) { yld = yld.getElementRowCol(0, 0); } if (redemption instanceof cArea || redemption instanceof cArea3D) { redemption = redemption.cross(arguments[1]); } else if (redemption instanceof cArray) { redemption = redemption.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); last_interest = last_interest.tocNumber(); rate = rate.tocNumber(); yld = yld.tocNumber(); redemption = redemption.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (last_interest instanceof cError) { return last_interest; } if (rate instanceof cError) { return rate; } if (yld instanceof cError) { return yld; } if (redemption instanceof cError) { return redemption; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); last_interest = Math.floor(last_interest.getValue()); rate = rate.getValue(); yld = yld.getValue(); redemption = redemption.getValue(); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || last_interest < startRangeCurrentDateSystem || maturity <= settlement || settlement <= last_interest || basis < 0 || basis > 4 || yld < 0 || rate < 0 || frequency != 1 && frequency != 2 && frequency != 4 || redemption <= 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity), lastInt = cDate.prototype.getDateFromExcel(last_interest); var fDCi = AscCommonExcel.yearFrac(lastInt, matur, basis) * frequency; var fDSCi = AscCommonExcel.yearFrac(settl, matur, basis) * frequency; var fAi = AscCommonExcel.yearFrac(lastInt, settl, basis) * frequency; var res = redemption + fDCi * 100 * rate / frequency; res /= fDSCi * yld / frequency + 1; res -= fAi * 100 * rate / frequency; return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cODDLYIELD() { } cODDLYIELD.prototype = Object.create(cBaseFunction.prototype); cODDLYIELD.prototype.constructor = cODDLYIELD; cODDLYIELD.prototype.name = 'ODDLYIELD'; cODDLYIELD.prototype.argumentsMin = 7; cODDLYIELD.prototype.argumentsMax = 8; cODDLYIELD.prototype.numFormat = AscCommonExcel.cNumFormatNone; cODDLYIELD.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cODDLYIELD.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cODDLYIELD.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], last_interest = arg[2], rate = arg[3], pr = arg[4], redemption = arg[5], frequency = arg[6], basis = arg[7] && !(arg[7] instanceof cEmpty) ? arg[7] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (last_interest instanceof cArea || last_interest instanceof cArea3D) { last_interest = last_interest.cross(arguments[1]); } else if (last_interest instanceof cArray) { last_interest = last_interest.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (pr instanceof cArea || pr instanceof cArea3D) { pr = pr.cross(arguments[1]); } else if (pr instanceof cArray) { pr = pr.getElementRowCol(0, 0); } if (redemption instanceof cArea || redemption instanceof cArea3D) { redemption = redemption.cross(arguments[1]); } else if (redemption instanceof cArray) { redemption = redemption.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); last_interest = last_interest.tocNumber(); rate = rate.tocNumber(); pr = pr.tocNumber(); redemption = redemption.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (last_interest instanceof cError) { return last_interest; } if (rate instanceof cError) { return rate; } if (pr instanceof cError) { return pr; } if (redemption instanceof cError) { return redemption; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); last_interest = Math.floor(last_interest.getValue()); rate = rate.getValue(); pr = pr.getValue(); redemption = redemption.getValue(); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || last_interest < startRangeCurrentDateSystem || maturity <= settlement || settlement <= last_interest || basis < 0 || basis > 4 || pr < 0 || rate < 0 || frequency != 1 && frequency != 2 && frequency != 4 || redemption <= 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity), lastInt = cDate.prototype.getDateFromExcel(last_interest); var fDCi = AscCommonExcel.yearFrac(lastInt, matur, basis) * frequency; var fDSCi = AscCommonExcel.yearFrac(settl, matur, basis) * frequency; var fAi = AscCommonExcel.yearFrac(lastInt, settl, basis) * frequency; var res = redemption + fDCi * 100 * rate / frequency; res /= pr + fAi * 100 * rate / frequency; res--; res *= frequency / fDSCi; return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cPDURATION() { } //***array-formula*** cPDURATION.prototype = Object.create(cBaseFunction.prototype); cPDURATION.prototype.constructor = cPDURATION; cPDURATION.prototype.name = 'PDURATION'; cPDURATION.prototype.argumentsMin = 3; cPDURATION.prototype.argumentsMax = 3; cPDURATION.prototype.isXLFN = true; cPDURATION.prototype.argumentsType = [argType.number, argType.number, argType.number]; cPDURATION.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true); var argClone = oArguments.args; argClone[0] = argClone[0].tocNumber(); argClone[1] = argClone[1].tocNumber(); argClone[2] = argClone[2].tocNumber(); var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var calcfunc = function (argArray) { var arg0 = argArray[0]; var arg1 = argArray[1]; var arg2 = argArray[2]; if (arg0 <= 0.0 || arg1 <= 0.0 || arg2 <= 0.0) { return new cError(cErrorType.not_numeric); } return new cNumber(Math.log(arg2 / arg1) / Math.log1p(arg0)); }; return this._findArrayInNumberArguments(oArguments, calcfunc); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cPMT() { } //***array-formula*** cPMT.prototype = Object.create(cBaseFunction.prototype); cPMT.prototype.constructor = cPMT; cPMT.prototype.name = 'PMT'; cPMT.prototype.argumentsMin = 3; cPMT.prototype.argumentsMax = 5; cPMT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cPMT.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number]; cPMT.prototype.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]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (nper instanceof cArea || nper instanceof cArea3D) { nper = nper.cross(arguments[1]); } else if (nper instanceof cArray) { nper = nper.getElementRowCol(0, 0); } if (pv instanceof cArea || pv instanceof cArea3D) { pv = pv.cross(arguments[1]); } else if (pv instanceof cArray) { pv = pv.getElementRowCol(0, 0); } if (fv instanceof cArea || fv instanceof cArea3D) { fv = fv.cross(arguments[1]); } else if (fv instanceof cArray) { fv = fv.getElementRowCol(0, 0); } if (type instanceof cArea || type instanceof cArea3D) { type = type.cross(arguments[1]); } 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 rate; } if (nper instanceof cError) { return nper; } if (pv instanceof cError) { return pv; } if (fv instanceof cError) { return fv; } if (type instanceof cError) { return type; } rate = rate.getValue(); nper = nper.getValue(); fv = fv.getValue(); type = type.getValue(); pv = pv.getValue(); if (type != 1 && type != 0 || nper == 0) { return new cError(cErrorType.not_numeric); } var res; if (rate != 0) { res = -1 * (pv * Math.pow(1 + rate, nper) + fv) / ((1 + rate * type) * (Math.pow((1 + rate), nper) - 1) / rate); } else { res = -1 * (pv + fv) / nper; } res = new cNumber(res); res.numFormat = "#,##0.00\\ \"₽\";[Red]\\-#,##0.00\\ \"₽\""; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cPPMT() { } //***array-formula*** cPPMT.prototype = Object.create(cBaseFunction.prototype); cPPMT.prototype.constructor = cPPMT; cPPMT.prototype.name = 'PPMT'; cPPMT.prototype.argumentsMin = 4; cPPMT.prototype.argumentsMax = 6; cPPMT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cPPMT.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number, argType.number]; cPPMT.prototype.Calculate = function (arg) { var rate = arg[0], per = arg[1], nper = arg[2], pv = arg[3], fv = arg[4] ? arg[4] : new cNumber(0), type = arg[5] ? arg[5] : new cNumber(0); if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (per instanceof cArea || per instanceof cArea3D) { per = per.cross(arguments[1]); } else if (per instanceof cArray) { per = per.getElementRowCol(0, 0); } if (nper instanceof cArea || nper instanceof cArea3D) { nper = nper.cross(arguments[1]); } else if (nper instanceof cArray) { nper = nper.getElementRowCol(0, 0); } if (pv instanceof cArea || pv instanceof cArea3D) { pv = pv.cross(arguments[1]); } else if (pv instanceof cArray) { pv = pv.getElementRowCol(0, 0); } if (fv instanceof cArea || fv instanceof cArea3D) { fv = fv.cross(arguments[1]); } else if (fv instanceof cArray) { fv = fv.getElementRowCol(0, 0); } if (type instanceof cArea || type instanceof cArea3D) { type = type.cross(arguments[1]); } else if (type instanceof cArray) { type = type.getElementRowCol(0, 0); } rate = rate.tocNumber(); per = per.tocNumber(); nper = nper.tocNumber(); pv = pv.tocNumber(); fv = fv.tocNumber(); type = type.tocNumber(); if (rate instanceof cError) { return rate; } if (per instanceof cError) { return per; } if (nper instanceof cError) { return nper; } if (pv instanceof cError) { return pv; } if (fv instanceof cError) { return fv; } if (type instanceof cError) { return type; } rate = rate.getValue(); per = per.getValue(); nper = nper.getValue(); pv = pv.getValue(); fv = fv.getValue(); type = type.getValue(); var res; if (per < 1 || per > nper || type != 0 && type != 1) { return new cError(cErrorType.not_numeric); } var fRmz = getPMT(rate, nper, pv, fv, type); res = fRmz - getIPMT(rate, per, pv, type, fRmz); // this.value.numFormat = 9; return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cPRICE() { } //***array-formula*** cPRICE.prototype = Object.create(cBaseFunction.prototype); cPRICE.prototype.constructor = cPRICE; cPRICE.prototype.name = 'PRICE'; cPRICE.prototype.argumentsMin = 6; cPRICE.prototype.argumentsMax = 7; cPRICE.prototype.numFormat = AscCommonExcel.cNumFormatNone; cPRICE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cPRICE.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cPRICE.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], rate = arg[2], yld = arg[3], redemption = arg[4], frequency = arg[5], basis = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (yld instanceof cArea || yld instanceof cArea3D) { yld = yld.cross(arguments[1]); } else if (yld instanceof cArray) { yld = yld.getElementRowCol(0, 0); } if (redemption instanceof cArea || redemption instanceof cArea3D) { redemption = redemption.cross(arguments[1]); } else if (redemption instanceof cArray) { redemption = redemption.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); rate = rate.tocNumber(); yld = yld.tocNumber(); redemption = redemption.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (rate instanceof cError) { return rate; } if (yld instanceof cError) { return yld; } if (redemption instanceof cError) { return redemption; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); rate = rate.getValue(); yld = yld.getValue(); redemption = redemption.getValue(); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4) || rate < 0 || yld < 0 || redemption <= 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); return new cNumber(getprice(settl, matur, rate, yld, redemption, frequency, basis)); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cPRICEDISC() { } //***array-formula*** cPRICEDISC.prototype = Object.create(cBaseFunction.prototype); cPRICEDISC.prototype.constructor = cPRICEDISC; cPRICEDISC.prototype.name = 'PRICEDISC'; cPRICEDISC.prototype.argumentsMin = 4; cPRICEDISC.prototype.argumentsMax = 5; cPRICEDISC.prototype.numFormat = AscCommonExcel.cNumFormatNone; cPRICEDISC.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cPRICEDISC.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any]; cPRICEDISC.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], discount = arg[2], redemption = arg[3], basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (discount instanceof cArea || discount instanceof cArea3D) { discount = discount.cross(arguments[1]); } else if (discount instanceof cArray) { discount = discount.getElementRowCol(0, 0); } if (redemption instanceof cArea || redemption instanceof cArea3D) { redemption = redemption.cross(arguments[1]); } else if (redemption instanceof cArray) { redemption = redemption.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); discount = discount.tocNumber(); redemption = redemption.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (discount instanceof cError) { return discount; } if (redemption instanceof cError) { return redemption; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); discount = discount.getValue(); redemption = redemption.getValue(); basis = Math.floor(basis.getValue()); if (settlement >= maturity || settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || basis < 0 || basis > 4 || discount <= 0 || redemption <= 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); var res = redemption * (1 - discount * AscCommonExcel.yearFrac(settl, matur, basis)); return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cPRICEMAT() { } //***array-formula*** cPRICEMAT.prototype = Object.create(cBaseFunction.prototype); cPRICEMAT.prototype.constructor = cPRICEMAT; cPRICEMAT.prototype.name = 'PRICEMAT'; cPRICEMAT.prototype.argumentsMin = 5; cPRICEMAT.prototype.argumentsMax = 6; cPRICEMAT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cPRICEMAT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cPRICEMAT.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cPRICEMAT.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], issue = arg[2], rate = arg[3], yld = arg[4], basis = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (issue instanceof cArea || issue instanceof cArea3D) { issue = issue.cross(arguments[1]); } else if (issue instanceof cArray) { issue = issue.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (yld instanceof cArea || yld instanceof cArea3D) { yld = yld.cross(arguments[1]); } else if (yld instanceof cArray) { yld = yld.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); issue = issue.tocNumber(); rate = rate.tocNumber(); yld = yld.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (issue instanceof cError) { return issue; } if (rate instanceof cError) { return rate; } if (yld instanceof cError) { return yld; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); issue = Math.floor(issue.getValue()); rate = rate.getValue(); yld = yld.getValue(); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || rate < 0 || yld < 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity), iss = cDate.prototype.getDateFromExcel(issue); var fIssMat = AscCommonExcel.yearFrac(new cDate(iss), new cDate(matur), basis); var fIssSet = AscCommonExcel.yearFrac(new cDate(iss), new cDate(settl), basis); var fSetMat = AscCommonExcel.yearFrac(new cDate(settl), new cDate(matur), basis); var res = 1 + fIssMat * rate; res /= 1 + fSetMat * yld; res -= fIssSet * rate; res *= 100; return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cPV() { } //***array-formula*** cPV.prototype = Object.create(cBaseFunction.prototype); cPV.prototype.constructor = cPV; cPV.prototype.name = 'PV'; cPV.prototype.argumentsMin = 3; cPV.prototype.argumentsMax = 5; cPV.prototype.numFormat = AscCommonExcel.cNumFormatNone; cPV.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number]; cPV.prototype.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]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (nper instanceof cArea || nper instanceof cArea3D) { nper = nper.cross(arguments[1]); } else if (nper instanceof cArray) { nper = nper.getElementRowCol(0, 0); } if (pmt instanceof cArea || pmt instanceof cArea3D) { pmt = pmt.cross(arguments[1]); } else if (pmt instanceof cArray) { pmt = pmt.getElementRowCol(0, 0); } if (fv instanceof cArea || fv instanceof cArea3D) { fv = fv.cross(arguments[1]); } else if (fv instanceof cArray) { fv = fv.getElementRowCol(0, 0); } if (type instanceof cArea || type instanceof cArea3D) { type = type.cross(arguments[1]); } 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 rate; } if (nper instanceof cError) { return nper; } if (pmt instanceof cError) { return pmt; } if (fv instanceof cError) { return fv; } if (type instanceof cError) { return type; } if (type.getValue() != 1 && type.getValue() != 0) { return 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 new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cRATE() { } //***array-formula*** cRATE.prototype = Object.create(cBaseFunction.prototype); cRATE.prototype.constructor = cRATE; cRATE.prototype.name = 'RATE'; cRATE.prototype.argumentsMin = 3; cRATE.prototype.argumentsMax = 6; cRATE.prototype.numFormat = AscCommonExcel.cNumFormatNone; cRATE.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number, argType.number]; cRATE.prototype.Calculate = function (arg) { var nper = arg[0], pmt = arg[1], pv = arg[2], fv = arg[3] ? arg[3] : new cNumber(0), type = arg[4] ? arg[4] : new cNumber(0), quess = arg[5] ? arg[5] : new cNumber(0.1); if (nper instanceof cArea || nper instanceof cArea3D) { nper = nper.cross(arguments[1]); } else if (nper instanceof cArray) { nper = nper.getElementRowCol(0, 0); } if (pmt instanceof cArea || pmt instanceof cArea3D) { pmt = pmt.cross(arguments[1]); } else if (pmt instanceof cArray) { pmt = pmt.getElementRowCol(0, 0); } if (pv instanceof cArea || pv instanceof cArea3D) { pv = pv.cross(arguments[1]); } else if (pv instanceof cArray) { pv = pv.getElementRowCol(0, 0); } if (fv instanceof cArea || fv instanceof cArea3D) { fv = fv.cross(arguments[1]); } else if (fv instanceof cArray) { fv = fv.getElementRowCol(0, 0); } if (type instanceof cArea || type instanceof cArea3D) { type = type.cross(arguments[1]); } else if (type instanceof cArray) { type = type.getElementRowCol(0, 0); } if (quess instanceof cArea || quess instanceof cArea3D) { quess = quess.cross(arguments[1]); } else if (quess instanceof cArray) { quess = quess.getElementRowCol(0, 0); } nper = nper.tocNumber(); pmt = pmt.tocNumber(); pv = pv.tocNumber(); fv = fv.tocNumber(); type = type.tocNumber(); quess = quess.tocNumber(); if (nper instanceof cError) { return nper; } if (pmt instanceof cError) { return pmt; } if (pv instanceof cError) { return pv; } if (fv instanceof cError) { return fv; } if (type instanceof cError) { return type; } if (quess instanceof cError) { return quess; } nper = nper.getValue(); pmt = pmt.getValue(); pv = pv.getValue(); fv = fv.getValue(); type = type.getValue(); quess = quess.getValue(); if (type != 1 && type != 0 || nper <= 0) { return new cError(cErrorType.not_numeric); } var res = new cNumber(RateIteration(nper, pmt, pv, fv, type, quess)); res.numFormat = 9; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cRECEIVED() { } //***array-formula*** cRECEIVED.prototype = Object.create(cBaseFunction.prototype); cRECEIVED.prototype.constructor = cRECEIVED; cRECEIVED.prototype.name = 'RECEIVED'; cRECEIVED.prototype.argumentsMin = 4; cRECEIVED.prototype.argumentsMax = 5; cRECEIVED.prototype.numFormat = AscCommonExcel.cNumFormatNone; cRECEIVED.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cRECEIVED.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any]; cRECEIVED.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], investment = arg[2], discount = arg[3], basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (investment instanceof cArea || investment instanceof cArea3D) { investment = investment.cross(arguments[1]); } else if (investment instanceof cArray) { investment = investment.getElementRowCol(0, 0); } if (discount instanceof cArea || discount instanceof cArea3D) { discount = discount.cross(arguments[1]); } else if (discount instanceof cArray) { discount = discount.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); investment = investment.tocNumber(); discount = discount.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (investment instanceof cError) { return investment; } if (discount instanceof cError) { return discount; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); investment = investment.getValue(); discount = discount.getValue(); basis = Math.floor(basis.getValue()); if (settlement >= maturity || investment <= 0 || discount <= 0 || settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || basis < 0 || basis > 4) { return new cError(cErrorType.not_numeric); } var res = investment / (1 - (discount * AscCommonExcel.yearFrac(cDate.prototype.getDateFromExcel(settlement), cDate.prototype.getDateFromExcel(maturity), basis))); // this.value.numFormat = 9; return res >= 0 ? new cNumber(res) : new cError(cErrorType.not_numeric); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cRRI() { } //***array-formula*** cRRI.prototype = Object.create(cBaseFunction.prototype); cRRI.prototype.constructor = cRRI; cRRI.prototype.name = 'RRI'; cRRI.prototype.argumentsMin = 3; cRRI.prototype.argumentsMax = 3; cRRI.prototype.isXLFN = true; cRRI.prototype.argumentsType = [argType.number, argType.number, argType.number]; cRRI.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true); var argClone = oArguments.args; argClone[0] = argClone[0].tocNumber(); argClone[1] = argClone[1].tocNumber(); argClone[2] = argClone[2].tocNumber(); var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var calcrpi = function (argArray) { var arg0 = argArray[0]; var arg1 = argArray[1]; var arg2 = argArray[2]; if (arg0 <= 0.0 || arg1 === 0.0) { return new cError(cErrorType.not_numeric); } return new cNumber(Math.pow(arg2 / arg1, 1.0 / arg0) - 1.0); }; return this._findArrayInNumberArguments(oArguments, calcrpi); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cSLN() { } cSLN.prototype = Object.create(cBaseFunction.prototype); cSLN.prototype.constructor = cSLN; cSLN.prototype.name = 'SLN'; cSLN.prototype.argumentsMin = 3; cSLN.prototype.argumentsMax = 3; cSLN.prototype.numFormat = AscCommonExcel.cNumFormatNone; cSLN.prototype.argumentsType = [argType.number, argType.number, argType.number]; cSLN.prototype.Calculate = function (arg) { var cost = arg[0], salvage = arg[1], life = arg[2]; if (cost instanceof cArea || cost instanceof cArea3D) { cost = cost.cross(arguments[1]); } else if (cost instanceof cArray) { cost = cost.getElementRowCol(0, 0); } if (salvage instanceof cArea || salvage instanceof cArea3D) { salvage = salvage.cross(arguments[1]); } else if (salvage instanceof cArray) { salvage = salvage.getElementRowCol(0, 0); } if (life instanceof cArea || life instanceof cArea3D) { life = life.cross(arguments[1]); } else if (life instanceof cArray) { life = life.getElementRowCol(0, 0); } cost = cost.tocNumber(); salvage = salvage.tocNumber(); life = life.tocNumber(); if (cost instanceof cError) { return cost; } if (salvage instanceof cError) { return salvage; } if (life instanceof cError) { return life; } cost = cost.getValue(); salvage = salvage.getValue(); life = life.getValue(); if (life == 0) { return new cError(cErrorType.division_by_zero); } return new cNumber((cost - salvage) / life) }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cSYD() { } //***array-formula*** cSYD.prototype = Object.create(cBaseFunction.prototype); cSYD.prototype.constructor = cSYD; cSYD.prototype.name = 'SYD'; cSYD.prototype.argumentsMin = 4; cSYD.prototype.argumentsMax = 4; cSYD.prototype.numFormat = AscCommonExcel.cNumFormatNone; cSYD.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number]; cSYD.prototype.Calculate = function (arg) { var cost = arg[0], salvage = arg[1], life = arg[2], per = arg[3]; if (cost instanceof cArea || cost instanceof cArea3D) { cost = cost.cross(arguments[1]); } else if (cost instanceof cArray) { cost = cost.getElementRowCol(0, 0); } if (salvage instanceof cArea || salvage instanceof cArea3D) { salvage = salvage.cross(arguments[1]); } else if (salvage instanceof cArray) { salvage = salvage.getElementRowCol(0, 0); } if (life instanceof cArea || life instanceof cArea3D) { life = life.cross(arguments[1]); } else if (life instanceof cArray) { life = life.getElementRowCol(0, 0); } if (per instanceof cArea || per instanceof cArea3D) { per = per.cross(arguments[1]); } else if (per instanceof cArray) { per = per.getElementRowCol(0, 0); } cost = cost.tocNumber(); salvage = salvage.tocNumber(); life = life.tocNumber(); per = per.tocNumber(); if (cost instanceof cError) { return cost; } if (salvage instanceof cError) { return salvage; } if (life instanceof cError) { return life; } if (per instanceof cError) { return per; } cost = cost.getValue(); salvage = salvage.getValue(); life = life.getValue(); per = per.getValue(); if (life == 1 || life <= 0 || salvage < 0 || per < 0) { return new cError(cErrorType.not_numeric); } var res = 2; res *= cost - salvage; res *= life + 1 - per; res /= (life + 1) * life; return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cTBILLEQ() { } //***array-formula*** cTBILLEQ.prototype = Object.create(cBaseFunction.prototype); cTBILLEQ.prototype.constructor = cTBILLEQ; cTBILLEQ.prototype.name = 'TBILLEQ'; cTBILLEQ.prototype.argumentsMin = 3; cTBILLEQ.prototype.argumentsMax = 3; cTBILLEQ.prototype.numFormat = AscCommonExcel.cNumFormatNone; cTBILLEQ.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cTBILLEQ.prototype.argumentsType = [argType.any, argType.any, argType.any]; cTBILLEQ.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], discount = arg[2]; if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (discount instanceof cArea || discount instanceof cArea3D) { discount = discount.cross(arguments[1]); } else if (discount instanceof cArray) { discount = discount.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); discount = discount.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (discount instanceof cError) { return discount; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); discount = discount.getValue(); if (settlement >= maturity || settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || discount <= 0 || nDiff > 360) { return new cError(cErrorType.not_numeric); } var nMat = maturity + 1; var d1 = cDate.prototype.getDateFromExcel(settlement); var d2 = cDate.prototype.getDateFromExcel(nMat); var date1 = d1.getUTCDate(), month1 = d1.getUTCMonth(), year1 = d1.getUTCFullYear(), date2 = d2.getUTCDate(), month2 = d2.getUTCMonth(), year2 = d2.getUTCFullYear(); var nDiff = AscCommonExcel.GetDiffDate360(date1, month1, year1, date2, month2, year2, true); if (nDiff > 360) { return new cError(cErrorType.not_numeric); } var res = new cNumber((365 * discount) / (360 - (discount * nDiff))); res.numFormat = 9; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cTBILLPRICE() { } //***array-formula*** cTBILLPRICE.prototype = Object.create(cBaseFunction.prototype); cTBILLPRICE.prototype.constructor = cTBILLPRICE; cTBILLPRICE.prototype.name = 'TBILLPRICE'; cTBILLPRICE.prototype.argumentsMin = 3; cTBILLPRICE.prototype.argumentsMax = 3; cTBILLPRICE.prototype.numFormat = AscCommonExcel.cNumFormatNone; cTBILLPRICE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cTBILLPRICE.prototype.argumentsType = [argType.any, argType.any, argType.any]; cTBILLPRICE.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], discount = arg[2]; if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (discount instanceof cArea || discount instanceof cArea3D) { discount = discount.cross(arguments[1]); } else if (discount instanceof cArray) { discount = discount.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); discount = discount.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (discount instanceof cError) { return discount; } settlement = Math.floor(Math.floor(settlement.getValue())); maturity = Math.floor(Math.floor(maturity.getValue())); discount = discount.getValue(); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || discount <= 0) { return new cError(cErrorType.not_numeric); } var d1 = cDate.prototype.getDateFromExcel(settlement), d2 = cDate.prototype.getDateFromExcel(maturity), d3 = new cDate(d1); d3.addYears(1); if (d2 > d3) { return new cError(cErrorType.not_numeric); } discount *= AscCommonExcel.diffDate(d1, d2, AscCommonExcel.DayCountBasis.ActualActual); return new cNumber(100 * (1 - discount / 360)); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cTBILLYIELD() { } //***array-formula*** cTBILLYIELD.prototype = Object.create(cBaseFunction.prototype); cTBILLYIELD.prototype.constructor = cTBILLYIELD; cTBILLYIELD.prototype.name = 'TBILLYIELD'; cTBILLYIELD.prototype.argumentsMin = 3; cTBILLYIELD.prototype.argumentsMax = 3; cTBILLYIELD.prototype.numFormat = AscCommonExcel.cNumFormatNone; cTBILLYIELD.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cTBILLYIELD.prototype.argumentsType = [argType.any, argType.any, argType.any]; cTBILLYIELD.prototype.Calculate = function (arg) { let settlement = arg[0], maturity = arg[1], pr = arg[2]; if (settlement.type === cElementType.cellsRange || settlement.type === cElementType.cellsRange3D) { settlement = settlement.cross(arguments[1]); } else if (settlement.type === cElementType.array) { settlement = settlement.getElementRowCol(0, 0); } if (maturity.type === cElementType.cellsRange || maturity.type === cElementType.cellsRange3D) { maturity = maturity.cross(arguments[1]); } else if (maturity.type === cElementType.array) { maturity = maturity.getElementRowCol(0, 0); } if (pr.type === cElementType.cellsRange || pr.type === cElementType.cellsRange3D) { pr = pr.cross(arguments[1]); } else if (pr.type === cElementType.array) { pr = pr.getElementRowCol(0, 0); } if (settlement.type === cElementType.bool || maturity.type === cElementType.bool || pr.type === cElementType.bool) { return new cError(cErrorType.wrong_value_type); } else if (settlement.type === cElementType.empty || maturity.type === cElementType.empty || pr.type === cElementType.empty) { return new cError(cErrorType.not_available); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); pr = pr.tocNumber(); if (settlement.type === cElementType.error) { return settlement; } if (maturity.type === cElementType.error) { return maturity; } if (pr.type === cElementType.error) { return pr; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); pr = pr.getValue(); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || pr <= 0) { return new cError(cErrorType.not_numeric); } let d1 = cDate.prototype.getDateFromExcel(settlement), d2 = cDate.prototype.getDateFromExcel(maturity), date1 = d1.getUTCDate(), month1 = d1.getUTCMonth(), year1 = d1.getUTCFullYear(), date2 = d2.getUTCDate(), month2 = d2.getUTCMonth(), year2 = d2.getUTCFullYear(); let nDiff = AscCommonExcel.GetDiffDate360(date1, month1, year1, date2, month2, year2, true); if (maturity >= 33) { nDiff++; } if (nDiff > 360) { return new cError(cErrorType.not_numeric); } let res = new cNumber(((100 - pr) / pr) * (360 / nDiff)); res.numFormat = 9; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cVDB() { } //***array-formula*** cVDB.prototype = Object.create(cBaseFunction.prototype); cVDB.prototype.constructor = cVDB; cVDB.prototype.name = 'VDB'; cVDB.prototype.argumentsMin = 5; cVDB.prototype.argumentsMax = 7; cVDB.prototype.numFormat = AscCommonExcel.cNumFormatNone; cVDB.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number, argType.number, argType.logical]; cVDB.prototype.Calculate = function (arg) { let cost = arg[0], salvage = arg[1], life = arg[2], startPeriod = arg[3], endPeriod = arg[4], factor, flag = arg[6] && !(cElementType.empty === arg[6].type) ? arg[6] : new cBool(false); // in ms factor = 0 if arg is empty and factor = 2 if undefined if (arg[5] === undefined) { factor = new cNumber(2); } else if (cElementType.empty === arg[5].type) { factor = new cNumber(0); } else { factor = arg[5]; } function getVDB(cost, fRest, life, life1, startPeriod, factor) { let res = 0, loopEnd = end = Math.ceil(startPeriod), temp, sln = 0, rest = cost - fRest, sln1 = false, ddb; for (let i = 1; i <= loopEnd; i++) { if (!sln1) { ddb = getDDB(cost, fRest, life, i, factor); sln = rest / (life1 - (i - 1)); if (sln > ddb) { temp = sln; sln1 = true; } else { temp = ddb; rest -= ddb; } } else { temp = sln; } if (i == loopEnd) { temp *= (startPeriod + 1.0 - end); } res += temp; } return res; } if (cElementType.cellsRange === cost.type || cElementType.cellsRange3D === cost.type) { cost = cost.cross(arguments[1]); } else if (cElementType.array === cost.type) { cost = cost.getElementRowCol(0, 0); } if (cElementType.cellsRange === salvage.type || cElementType.cellsRange3D === salvage.type) { salvage = salvage.cross(arguments[1]); } else if (cElementType.array === salvage.type) { salvage = salvage.getElementRowCol(0, 0); } if (cElementType.cellsRange === life.type || cElementType.cellsRange3D === life.type) { life = life.cross(arguments[1]); } else if (cElementType.array === life.type) { life = life.getElementRowCol(0, 0); } if (cElementType.cellsRange === startPeriod.type || cElementType.cellsRange3D === startPeriod.type) { startPeriod = startPeriod.cross(arguments[1]); } else if (cElementType.array === startPeriod.type) { startPeriod = startPeriod.getElementRowCol(0, 0); } if (cElementType.cellsRange === endPeriod.type || cElementType.cellsRange3D === endPeriod.type) { endPeriod = endPeriod.cross(arguments[1]); } else if (cElementType.array === endPeriod.type) { endPeriod = endPeriod.getElementRowCol(0, 0); } if (cElementType.cellsRange === factor.type || cElementType.cellsRange3D === factor.type) { factor = factor.cross(arguments[1]); } else if (cElementType.array === factor.type) { factor = factor.getElementRowCol(0, 0); } if (cElementType.cellsRange === flag.type || cElementType.cellsRange3D === flag.type) { flag = flag.cross(arguments[1]); } else if (cElementType.array === flag.type) { flag = flag.getElementRowCol(0, 0); } cost = cost.tocNumber(); salvage = salvage.tocNumber(); life = life.tocNumber(); startPeriod = startPeriod.tocNumber(); endPeriod = endPeriod.tocNumber(); factor = factor.tocNumber(); flag = flag.tocBool(); if (cElementType.error === cost.type) { return cost; } if (cElementType.error === salvage.type) { return salvage; } if (cElementType.error === life.type) { return life; } if (cElementType.error === startPeriod.type) { return startPeriod; } if (cElementType.error === endPeriod.type) { return endPeriod; } if (cElementType.error === factor.type) { return factor; } if (cElementType.error === flag.type) { return flag; } if (flag.type === cElementType.string) { return new cError(cErrorType.wrong_value_type); } cost = cost.getValue(); salvage = salvage.getValue(); life = life.getValue(); startPeriod = startPeriod.getValue(); endPeriod = endPeriod.getValue(); factor = factor.getValue(); flag = flag.toBool(); if (life === 0 && startPeriod === 0 && endPeriod === 0) { return new cError(cErrorType.division_by_zero); } if (cost < 0 || salvage < 0 || life < 0 || startPeriod < 0 || endPeriod < 0 || factor < 0 || life < startPeriod || startPeriod > endPeriod || life < endPeriod) { return new cError(cErrorType.not_numeric); } let start = Math.floor(startPeriod), end = Math.ceil(endPeriod); let res = 0; if (cost < salvage) { if (startPeriod >= 1 || flag) { return new cNumber(res); } else { let tempMinus = Math.abs(cost - salvage); res = tempMinus * (endPeriod - startPeriod) > tempMinus ? tempMinus : tempMinus * (endPeriod - startPeriod); return new cNumber(res * -1); } } if (flag) { for (let i = start + 1; i <= end; i++) { let ddb = getDDB(cost, salvage, life, i, factor); if (i == start + 1) { ddb *= (Math.min(endPeriod, start + 1) - startPeriod); } else if (i == end) { ddb *= (endPeriod + 1 - end); } res += ddb; } } else { let life1 = life; if (!Math.approxEqual(startPeriod, Math.floor(startPeriod))) { if (factor > 1) { if (startPeriod > life / 2 || Math.approxEqual(startPeriod, life / 2)) { let fPart = startPeriod - life / 2; startPeriod = life / 2; endPeriod -= fPart; life1 += 1; } } } cost -= getVDB(cost, salvage, life, life1, startPeriod, factor); res = getVDB(cost, salvage, life, life - startPeriod, endPeriod - startPeriod, factor); } return new cNumber(res); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cXIRR() { } //***array-formula*** cXIRR.prototype = Object.create(cBaseFunction.prototype); cXIRR.prototype.constructor = cXIRR; cXIRR.prototype.name = 'XIRR'; cXIRR.prototype.argumentsMin = 2; cXIRR.prototype.argumentsMax = 3; cXIRR.prototype.numFormat = AscCommonExcel.cNumFormatNone; cXIRR.prototype.arrayIndexes = {0: 1, 1: 1}; cXIRR.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cXIRR.prototype.argumentsType = [argType.any, argType.any, argType.any]; cXIRR.prototype.Calculate = function (arg) { let arg0 = arg[0], arg1 = arg[1], arg2 = arg[2] ? arg[2] : new cNumber(0.1); function xirrFunction(values, dates, rate) { var D_0 = dates[0], r = rate + 1, res = values[0]; for (var i = 1; i < values.length; i++) { res += values[i] / Math.pow(r, (dates[i] - D_0) / 365); } return res; } function xirrDeriv(values, dates, rate) { var D_0 = dates[0], r = rate + 1, res = 0, sumDerivI; for (var i = 1, count = values.length; i < count; i++) { sumDerivI = (dates[i] - D_0) / 365; res -= sumDerivI * values[i] / Math.pow(r, sumDerivI + 1); } return res; } function xirr2(_values, _dates, _rate) { if (_values.length === 0 || _dates.length === 0) { return new cError(cErrorType.not_numeric); } let arr0 = _values[0], arr1 = _dates[0]; if (arr0 instanceof cError) { return arr0; } if (arr1 instanceof cError) { return arr1; } if (arr0.getValue() == 0) { return new cError(cErrorType.not_numeric); } if (_values.length < 2 || (_dates.length != _values.length)) { return new cError(cErrorType.not_numeric); } var res = _rate.getValue(); if (res <= -1) { return new cError(cErrorType.not_numeric); } var wasNeg = false, wasPos = false; for (var i = 0; i < _dates.length; i++) { _dates[i] = _dates[i].tocNumber(); _values[i] = _values[i].tocNumber(); if (_dates[i] instanceof cError || _values[i] instanceof cError) { return new cError(cErrorType.wrong_value_type); } _dates[i] = Math.floor(_dates[i].getValue()); _values[i] = _values[i].getValue(); if (_dates[0] > _dates[i]) { return new cError(cErrorType.not_numeric); } if (_values[i] < 0) { wasNeg = true; } else { wasPos = true; } } if (!(wasNeg && wasPos)) { return new cError(cErrorType.not_numeric); } var g_Eps = 1e-7, nIM = 500, eps = 1, nMC = 0, xN, guess = res, g_Eps2 = g_Eps * 2; while (eps > g_Eps && nMC < nIM) { xN = res - xirrFunction(_values, _dates, res) / ((xirrFunction(_values, _dates, res + g_Eps) - xirrFunction(_values, _dates, res - g_Eps)) / g_Eps2); nMC++; eps = Math.abs(xN - res); res = xN; } if (isNaN(res) || Infinity == Math.abs(res)) { var max = Number.MAX_VALUE, min = -Number.MAX_VALUE, step = 1.6, low = guess - 0.01 <= min ? min + g_Eps : guess - 0.01, high = guess + 0.01 >= max ? max - g_Eps : guess + 0.01, i, xBegin, xEnd, x, y, currentIter = 0; if (guess <= min || guess >= max) { return new cError(cErrorType.not_numeric); } for (i = 0; i < nIM; i++) { xBegin = low <= min ? min + g_Eps : low; xEnd = high >= max ? max - g_Eps : high; x = xirrFunction(_values, _dates, xBegin); y = xirrFunction(_values, _dates, xEnd); if (x * y <= 0) { break; } else if (x * y > 0) { low = (xBegin + step * (xBegin - xEnd)); high = (xEnd + step * (xEnd - xBegin)); } else { return new cError(cErrorType.not_numeric); } } if (i == nIM) { return new cError(cErrorType.not_numeric); } var fXbegin = xirrFunction(_values, _dates, xBegin), fXend = xirrFunction(_values, _dates, xEnd), fXi, xI; if (Math.abs(fXbegin) < g_Eps) { return new cNumber(fXbegin); } if (Math.abs(fXend) < g_Eps) { return new cNumber(fXend); } do { xI = xBegin + (xEnd - xBegin) / 2; fXi = xirrFunction(_values, _dates, xI); if (fXbegin * fXi < 0) { xEnd = xI; } else { xBegin = xI; } fXbegin = xirrFunction(_values, _dates, xBegin); currentIter++; } while (Math.abs(fXi) > g_Eps && currentIter < nIM); return new cNumber(xI); } else { return new cNumber(res); } } if (arg0.type === cElementType.error) { return arg0; } if (arg1.type === cElementType.error) { return arg1; } if (arg2.type === cElementType.error) { return arg2; } if (arg0.type === cElementType.empty || arg1.type === cElementType.empty) { return new cError(cErrorType.not_available); } let _dates = [], _values = []; if (arg0.type === cElementType.cellsRange || arg0.type === cElementType.cellsRange3D) { if (arg0.type === cElementType.cellsRange3D && !arg0.isSingleSheet()) { return new cError(cErrorType.wrong_value_type); } arg0.foreach2(function (c) { if (c instanceof cNumber) { _values.push(c); } else if (c instanceof cEmpty) { _values.push(c.tocNumber()); } else { _values.push(new cError(cErrorType.wrong_value_type)); } }) } else if (arg0.type === cElementType.array) { arg0.foreach(function (c) { if (c instanceof cNumber) { _values.push(c); } else if (c instanceof cEmpty) { _values.push(c.tocNumber()); } else { _values.push(new cError(cErrorType.wrong_value_type)); } }) } else { if (!(arg0.type === cElementType.number)) { return new cError(cErrorType.wrong_value_type) } _values[0] = arg0; } if (arg1.type === cElementType.cellsRange || arg1.type === cElementType.cellsRange3D) { if (arg1.type === cElementType.cellsRange3D && !arg1.isSingleSheet()) { return new cError(cErrorType.wrong_value_type); } arg1.foreach2(function (c) { if (c instanceof cNumber) { _dates.push(c); } else if (c instanceof cEmpty) { _dates.push(c.tocNumber()); } else { _dates.push(new cError(cErrorType.wrong_value_type)); } }) } else if (arg1.type === cElementType.array) { arg1.foreach(function (c) { if (c instanceof cNumber) { _dates.push(c); } else if (c instanceof cEmpty) { _dates.push(c.tocNumber()); } else { _dates.push(new cError(cErrorType.wrong_value_type)); } }) } else { if (!(arg1.type === cElementType.number)) { return new cError(cErrorType.wrong_value_type) } _dates[0] = arg1; } if (arg2 instanceof AscCommonExcel.cRef || arg2 instanceof AscCommonExcel.cRef3D) { arg2 = arg2.getValue(); if (!(arg2 instanceof cNumber)) { return new cError(cErrorType.wrong_value_type); } } else if (arg2 instanceof cArea || arg2 instanceof cArea3D) { arg2 = arg2.cross(arguments[1]); if (!(arg2 instanceof cNumber)) { return new cError(cErrorType.wrong_value_type); } } else if (arg2 instanceof cArray) { arg2 = arg2.getElement(0); if (!(arg2 instanceof cNumber)) { return new cError(cErrorType.wrong_value_type); } } arg2 = arg2.tocNumber(); if (arg2 instanceof cError) { return arg2; } let res = xirr2(_values, _dates, arg2); res.numFormat = 9; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cXNPV() { } //***array-formula*** //todo формула массива имеет различия в резальтатах в случае с range - аргументами cXNPV.prototype = Object.create(cBaseFunction.prototype); cXNPV.prototype.constructor = cXNPV; cXNPV.prototype.name = 'XNPV'; cXNPV.prototype.argumentsMin = 3; cXNPV.prototype.argumentsMax = 3; cXNPV.prototype.numFormat = AscCommonExcel.cNumFormatNone; cXNPV.prototype.arrayIndexes = {1: 1, 2: 1}; cXNPV.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cXNPV.prototype.argumentsType = [argType.any, argType.any, argType.any]; cXNPV.prototype.Calculate = function (arg) { var arg0 = arg[0], arg1 = arg[1], arg2 = arg[2]; function xnpv(rate, valueArray, dateArray) { var res = 0, vaTmp, daTmp, r = 1 + rate.getValue(); if (dateArray.length != valueArray.length) { return new cError(cErrorType.not_numeric); } if (!(dateArray[0] instanceof cNumber) || !(valueArray[0] instanceof cNumber)) { return new cError(cErrorType.wrong_value_type); } var d1 = Math.floor(dateArray[0].getValue()), wasNeg = false, wasPos = false; for (var i = 0; i < dateArray.length; i++) { vaTmp = valueArray[i].tocNumber(); daTmp = dateArray[i].tocNumber(); if (vaTmp instanceof cError || daTmp instanceof cError) { return new cError(cErrorType.not_numeric); } res += vaTmp.getValue() / (Math.pow(r, (Math.floor(daTmp.getValue()) - d1) / 365)); } return new cNumber(res); } if (arg0 instanceof cArea || arg0 instanceof cArea3D) { arg0 = arg0.cross(arguments[1]); } if (arg0 instanceof cArray) { arg0 = arg0.getElement(0); } arg0 = arg0.tocNumber(); if (arg0 instanceof cError) { return arg0; } var dateArray = [], valueArray = []; if (arg1 instanceof cArea) { arg1.foreach2(function (c) { if (c instanceof cNumber) { valueArray.push(c); } else { valueArray.push(new cError(cErrorType.not_numeric)); } }); // valueArray = arg1.getMatrix(); } else if (arg1 instanceof cArray) { arg1.foreach(function (c) { if (c instanceof cNumber) { valueArray.push(c); } else { valueArray.push(new cError(cErrorType.not_numeric)); } }) } else if (arg1 instanceof cArea3D) { if (arg1.isSingleSheet()) { valueArray = arg1.getMatrix()[0]; } else { return new cError(cErrorType.wrong_value_type); } } else { arg1 = arg1.tocNumber(); if (arg1 instanceof cError) { return new cError(cErrorType.not_numeric) } else { valueArray[0] = arg1; } } if (arg2 instanceof cArea) { arg2.foreach2(function (c) { if (c instanceof cNumber) { dateArray.push(c); } else { dateArray.push(new cError(cErrorType.not_numeric)); } }); // dateArray = arg2.getMatrix(); } else if (arg2 instanceof cArray) { arg2.foreach(function (c) { if (c instanceof cNumber) { dateArray.push(c); } else { dateArray.push(new cError(cErrorType.not_numeric)); } }); // dateArray = arg2.getMatrix(); } else if (arg2 instanceof cArea3D) { if (arg2.isSingleSheet()) { dateArray = arg2.getMatrix()[0]; } else { return new cError(cErrorType.wrong_value_type); } } else { arg2 = arg2.tocNumber(); if (arg2 instanceof cError) { return new cError(cErrorType.not_numeric) } else { dateArray[0] = arg2; } } return xnpv(arg0, valueArray, dateArray); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cYIELD() { } //***array-formula*** cYIELD.prototype = Object.create(cBaseFunction.prototype); cYIELD.prototype.constructor = cYIELD; cYIELD.prototype.name = 'YIELD'; cYIELD.prototype.argumentsMin = 6; cYIELD.prototype.argumentsMax = 7; cYIELD.prototype.numFormat = AscCommonExcel.cNumFormatNone; cYIELD.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cYIELD.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cYIELD.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], rate = arg[2], pr = arg[3], redemption = arg[4], frequency = arg[5], basis = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (pr instanceof cArea || pr instanceof cArea3D) { pr = pr.cross(arguments[1]); } else if (pr instanceof cArray) { pr = pr.getElementRowCol(0, 0); } if (redemption instanceof cArea || redemption instanceof cArea3D) { redemption = redemption.cross(arguments[1]); } else if (redemption instanceof cArray) { redemption = redemption.getElementRowCol(0, 0); } if (frequency instanceof cArea || frequency instanceof cArea3D) { frequency = frequency.cross(arguments[1]); } else if (frequency instanceof cArray) { frequency = frequency.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); rate = rate.tocNumber(); pr = pr.tocNumber(); redemption = redemption.tocNumber(); frequency = frequency.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (rate instanceof cError) { return rate; } if (pr instanceof cError) { return pr; } if (redemption instanceof cError) { return redemption; } if (frequency instanceof cError) { return frequency; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); rate = rate.getValue(); pr = pr.getValue(); redemption = redemption.getValue(); frequency = Math.floor(frequency.getValue()); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4) || rate < 0 || pr <= 0 || redemption <= 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); // this.value.numFormat = 9; return new cNumber(getYield(settl, matur, rate, pr, redemption, frequency, basis)); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cYIELDDISC() { } //***array-formula*** cYIELDDISC.prototype = Object.create(cBaseFunction.prototype); cYIELDDISC.prototype.constructor = cYIELDDISC; cYIELDDISC.prototype.name = 'YIELDDISC'; cYIELDDISC.prototype.argumentsMin = 4; cYIELDDISC.prototype.argumentsMax = 5; cYIELDDISC.prototype.numFormat = AscCommonExcel.cNumFormatNone; cYIELDDISC.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cYIELDDISC.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any]; cYIELDDISC.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], pr = arg[2], redemption = arg[3], basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (pr instanceof cArea || pr instanceof cArea3D) { pr = pr.cross(arguments[1]); } else if (pr instanceof cArray) { pr = pr.getElementRowCol(0, 0); } if (redemption instanceof cArea || redemption instanceof cArea3D) { redemption = redemption.cross(arguments[1]); } else if (redemption instanceof cArray) { redemption = redemption.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); pr = pr.tocNumber(); redemption = redemption.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (pr instanceof cError) { return pr; } if (redemption instanceof cError) { return redemption; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); pr = pr.getValue(); redemption = redemption.getValue(); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || pr <= 0 || redemption <= 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity); var fRet = (redemption / pr) - 1; fRet /= AscCommonExcel.yearFrac(settl, matur, basis); var res = new cNumber(fRet); res.numFormat = 10; return res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cYIELDMAT() { } //***array-formula*** cYIELDMAT.prototype = Object.create(cBaseFunction.prototype); cYIELDMAT.prototype.constructor = cYIELDMAT; cYIELDMAT.prototype.name = 'YIELDMAT'; cYIELDMAT.prototype.argumentsMin = 5; cYIELDMAT.prototype.argumentsMax = 6; cYIELDMAT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cYIELDMAT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cYIELDMAT.prototype.argumentsType = [argType.any, argType.any, argType.any, argType.any, argType.any, argType.any]; cYIELDMAT.prototype.Calculate = function (arg) { var settlement = arg[0], maturity = arg[1], issue = arg[2], rate = arg[3], pr = arg[4], basis = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0); if (settlement instanceof cArea || settlement instanceof cArea3D) { settlement = settlement.cross(arguments[1]); } else if (settlement instanceof cArray) { settlement = settlement.getElementRowCol(0, 0); } if (maturity instanceof cArea || maturity instanceof cArea3D) { maturity = maturity.cross(arguments[1]); } else if (maturity instanceof cArray) { maturity = maturity.getElementRowCol(0, 0); } if (issue instanceof cArea || issue instanceof cArea3D) { issue = issue.cross(arguments[1]); } else if (issue instanceof cArray) { issue = issue.getElementRowCol(0, 0); } if (rate instanceof cArea || rate instanceof cArea3D) { rate = rate.cross(arguments[1]); } else if (rate instanceof cArray) { rate = rate.getElementRowCol(0, 0); } if (pr instanceof cArea || pr instanceof cArea3D) { pr = pr.cross(arguments[1]); } else if (pr instanceof cArray) { pr = pr.getElementRowCol(0, 0); } if (basis instanceof cArea || basis instanceof cArea3D) { basis = basis.cross(arguments[1]); } else if (basis instanceof cArray) { basis = basis.getElementRowCol(0, 0); } settlement = settlement.tocNumber(); maturity = maturity.tocNumber(); issue = issue.tocNumber(); rate = rate.tocNumber(); pr = pr.tocNumber(); basis = basis.tocNumber(); if (settlement instanceof cError) { return settlement; } if (maturity instanceof cError) { return maturity; } if (issue instanceof cError) { return issue; } if (rate instanceof cError) { return rate; } if (pr instanceof cError) { return pr; } if (basis instanceof cError) { return basis; } settlement = Math.floor(settlement.getValue()); maturity = Math.floor(maturity.getValue()); issue = Math.floor(issue.getValue()); rate = rate.getValue(); pr = pr.getValue(); basis = Math.floor(basis.getValue()); if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || pr <= 0 || rate <= 0) { return new cError(cErrorType.not_numeric); } var settl = cDate.prototype.getDateFromExcel(settlement), matur = cDate.prototype.getDateFromExcel(maturity), iss = cDate.prototype.getDateFromExcel(issue), res = getyieldmat(settl, matur, iss, rate, pr, basis); var res = new cNumber(res); res.numFormat = 10; return res; }; //----------------------------------------------------------export---------------------------------------------------- window['AscCommonExcel'] = window['AscCommonExcel'] || {}; window['AscCommonExcel'].getPMT = getPMT; window['AscCommonExcel'].getIPMT = getIPMT; window['AscCommonExcel'].getcoupdaybs = getcoupdaybs; window['AscCommonExcel'].getcoupdays = getcoupdays; window['AscCommonExcel'].getcoupnum = getcoupnum; })(window);