importPackage(Packages.de.elo.ix.client); //@include lib_Class.js //@include lib_moment.js //@include lib_decimal-light.js //@include lib_sol.common.SordUtils.js //@include lib_sol.common.Map.js //@include lib_sol.common.DateUtils.js //@include lib_sol.common.ix.FunctionBase.js //@include lib_sol.contract.DurationUtils.js var logger = sol.create("sol.Logger", { scope: "sol.contract.ix.functions.ExtendDuration" }); /** * Extends the contract period and recalculates the payment plan * * @eloix * * @requires sol.common.SordUtils * @requires sol.common.Map * @requires sol.common.WfUtils * @requires sol.common.ix.RfUtils * @requires sol.common.ix.FunctionBase * */ sol.define("sol.contract.ix.functions.ExtendDuration", { extend: "sol.common.ix.FunctionBase", requiredConfig: ["objId"], /** * @cfg {String} objId (required) */ initialize: function (config) { var me = this; me.contractConfig = sol.create("sol.common.Config", { compose: "/contract/Configuration/contract.config" }).config; me.$super("sol.common.ix.FunctionBase", "initialize", [config]); me.unitSuffix = me.unitSuffix || "_UNIT"; }, /** * Extends the contract duration */ process: function () { var me = this, newData = [], tplSord, updates, mapData; me.sord = ixConnect.ix().checkoutSord(me.objId, SordC.mbAllIndex, LockC.NO); tplSord = sol.common.SordUtils.getTemplateSord(me.sord).sord; updates = { objKeys: {}, mapKeys: {} }; sol.contract.DurationUtils.calcContractEnd(tplSord, updates); sol.contract.DurationUtils.calcTerminationDateFixed(tplSord, updates); sol.contract.DurationUtils.calcReminderDate(tplSord, updates); me.fillUpdates(updates.objKeys, "GRP", newData); me.fillUpdates(updates.mapKeys, "MAP", newData); mapData = sol.common.SordUtils.updateSord(me.sord, newData); if (mapData) { ixConnect.ix().checkinMap(MapDomainC.DOMAIN_SORD, me.sord.id, me.sord.id, mapData, LockC.NO); } me.sordMap = sol.create("sol.common.SordMap", { objId: me.sord.id }); me.sordMap.read(); me.calcPaymentPlan(); ixConnect.ix().checkinSord(me.sord, SordC.mbAllIndex, LockC.NO); me.sordMap.write(); }, /** * @private * @param {Object} valuesObj * @param {String} type * @param {Array} newData */ fillUpdates: function (valuesObj, type, newData) { var key, value; for (key in valuesObj) { value = valuesObj[key]; newData.push({ type: type, key: key, value: value }); } }, /** * Sets a value * @private * @param {Object} fieldDef Field definition * @param {String} fieldDef.type Field type * @param {String} fieldDef.name Field name * @param {String} value Value */ setValue: function (fieldDef, value) { var me = this; if (!fieldDef || !fieldDef.type || !fieldDef.key) { throw "Field definition is incomplete"; } fieldDef.value = value; me.newData.push(fieldDef); }, /** * @private * Calculates and sets a date * @param {String} srcDateField Source date field * @param {String} durationField Duration field * @param {String} dstDateField Destination date field * @param {Object} params Parameters * @param {Object} params.endOfField * @param {Object} params.minTermStartField * @param {Object} params.minTermNumberField * @param {Object} params.minTermNumberUnitField * @param {Boolean} params.substractOneDay * @param {Boolean} params.minToday * @return {String} */ setCalculatedDate: function (srcDateField, durationField, dstDateField, params) { var me = this, srcIsoDate, durationNumber, durationUnit, dstIsoDate, minTermStartIsoDate, minTermNumber, minTermUnit, minTermIsoDate, todayIso; params = params || {}; todayIso = sol.common.SordUtils.nowIsoForConnection(null, { startOfDay: true }); switch (String(srcDateField.type)) { case "$NOW": srcIsoDate = todayIso; break; case "CONST": srcIsoDate = srcDateField.value || ""; break; default: srcIsoDate = sol.common.SordUtils.getValue(me.sord, srcDateField); break; } if (!srcIsoDate) { return; } durationNumber = sol.common.SordUtils.getValue(me.sord, durationField); durationUnit = sol.common.SordUtils.getLocalizedKwlKey(me.sord, { type: durationField.type, key: durationField.key + me.unitSuffix }); if (params.endOfField) { params.endOfUnit = sol.common.SordUtils.getLocalizedKwlKey(me.sord, params.endOfField) || "d"; } if (params.substractOneDay) { srcIsoDate = sol.contract.DurationUtils.calculateDate(srcIsoDate, -1, "d"); } dstIsoDate = sol.contract.DurationUtils.calculateDate(srcIsoDate, durationNumber, durationUnit, params); if (params.minTermNumberField) { minTermStartIsoDate = sol.common.SordUtils.getValue(me.sord, params.minTermStartField); minTermNumber = sol.common.SordUtils.getObjKeyValueAsNumber(me.sord, params.minTermNumberField) || 0; minTermUnit = sol.common.SordUtils.getLocalizedKwlKey(me.sord, params.minTermNumberUnitField); minTermIsoDate = sol.contract.DurationUtils.calculateDate(minTermStartIsoDate, minTermNumber, minTermUnit); if (minTermIsoDate > dstIsoDate) { dstIsoDate = minTermIsoDate; } if (params.minToday && (dstIsoDate < todayIso)) { dstIsoDate = todayIso; } } me.setValue(dstDateField, dstIsoDate); return dstIsoDate; }, /** * @private * Re-calulates the payment plan */ calcPaymentPlan: function () { var me = this, total, currencyCode, baseCurrencyCode, amountLocalCurr, exchangeRate; total = new Decimal(0); me.sordMap.forEachRow(me.contractConfig.mapFields.contractCashflowRecurringUnit, function (i) { var singleAmount, startDateIso, endDateIso, unit, rowTotal; rowTotal = new Decimal(0); singleAmount = me.sordMap.getNumValue(me.contractConfig.mapFields.contractCashflowSingle + i); if (singleAmount) { startDateIso = me.sordMap.getValue(me.contractConfig.mapFields.contractCashflowDate + i) || sol.common.SordUtils.getObjKeyValue(me.sord, me.contractConfig.fields.contractStart); endDateIso = me.sordMap.getValue(me.contractConfig.mapFields.contractCashflowTo + i) || sol.common.SordUtils.getObjKeyValue(me.sord, me.contractConfig.fields.contractEnd) || sol.common.SordUtils.getObjKeyValue(me.sord, me.contractConfig.fields.nextPossibleTermination); unit = me.sordMap.getValue(me.contractConfig.mapFields.contractCashflowRecurringUnit + i); rowTotal = sol.contract.DurationUtils.calcRowTotal(startDateIso, endDateIso, singleAmount, unit); total = total.plus(rowTotal); } me.sordMap.setNumValue(me.contractConfig.mapFields.contractCashflowAmount + i, rowTotal.toNumber()); }, me); sol.common.SordUtils.setObjKeyValueAsNumber(me.sord, me.contractConfig.fields.cashflowSum, total.toNumber()); baseCurrencyCode = sol.contract.DurationUtils.getBaseCurrency(); currencyCode = sol.common.SordUtils.getObjKeyValue(me.sord, me.contractConfig.fields.currencyCode); if (!currencyCode || (currencyCode == baseCurrencyCode)) { sol.common.SordUtils.setObjKeyValue(me.sord, me.contractConfig.fields.currencyCode, baseCurrencyCode); me.sordMap.setValue(me.contractConfig.mapFields.exchangeRate, "1"); } exchangeRate = me.sordMap.getNumValue(me.contractConfig.mapFields.exchangeRate); amountLocalCurr = sol.contract.DurationUtils.calcLocalCurrencyAmount(total, exchangeRate); sol.common.SordUtils.setObjKeyValueAsNumber(me.sord, me.contractConfig.fields.cashflowSumLocalCurr, amountLocalCurr); } }); /** * @member sol.contract.ix.functions.ExtendDuration * @static * @inheritdoc sol.common.ix.FunctionBase#onEnterNode */ function onEnterNode(clInfo, userId, wFDiagram, nodeId) { logger.enter("onEnterNode_ExtendDuration", { flowId: wFDiagram.id, nodeId: nodeId }); var params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId), module; params.objId = wFDiagram.objId; module = sol.create("sol.contract.ix.functions.ExtendDuration", params); module.process(); logger.exit("onEnterNode_ExtendDuration"); } /** * @member sol.contract.ix.functions.ExtendDuration * @static * @inheritdoc sol.common.ix.FunctionBase#onExitNode */ function onExitNode(clInfo, userId, wFDiagram, nodeId) { logger.enter("onExitNode_ExtendDuration", { flowId: wFDiagram.id, nodeId: nodeId }); var params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId), module; params.objId = wFDiagram.objId; module = sol.create("sol.contract.ix.functions.ExtendDuration", params); module.process(); logger.exit("onExitNode_ExtendDuration"); } /** * @member sol.common.ix.functions.ChangeRights * @method RF_sol_contract_function_ExtendDuration * @static * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName */ function RF_sol_contract_function_ExtendDuration(iXSEContext, args) { logger.enter("RF_sol_contract_function_ExtendDuration", args); var params = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args, "objId"), module = sol.create("sol.contract.ix.functions.ExtendDuration", params); module.process(); logger.exit("RF_sol_contract_function_ExtendDuration"); }