var output = {}; var outMessages = []; var outMsg = {}; var outStatus = "success"; var myDebug = {}; var serviceName = "eon.virta.v2.reloadfields.xsjs"; var serviceVersion = '1.4'; var startTS = new Date(); var debugLevel = 0; switch ($.request.parameters.get("debug")) { case "true": case "yes": case "1": debugLevel = 1; break; case "full": case "2": debugLevel = 2; break; } if (debugLevel > 0) { output.requestParams = $.request.parameters; } function setOutputMessage() { output.status = outStatus; output.durationSeconds = Math.floor((new Date() - startTS) / 1000); if (debugLevel > 0) { output.debugInfos = myDebug; } output.messages = outMessages; $.response.contentType = "application/json"; $.response.setBody(JSON.stringify(output)); //$.response.status = $.net.http.OK; } function exceptionHandler(ex) { if (outMsg.method && outMessages.indexOf(outMsg) === -1) { outMsg.status = "canceled"; outMessages.push(outMsg); } outMsg = {}; outMsg.method = "exceptionHandler"; outMsg.status = "error"; outMsg.message = ex.toString(); if (debugLevel > 0) { outMsg.exceptionInfo = {}; outMsg.exceptionInfo.name = ex.name; outMsg.exceptionInfo.message = ex.message; outMsg.exceptionInfo.fileName = ex.fileName; outMsg.exceptionInfo.lineNumber = ex.lineNumber; outMsg.exceptionInfo.columnNumber = ex.columnNumber; outMsg.exceptionInfo.stack = ex.stack; //outMsg.exceptionInfo.source = ex.toSource(); } outMessages.push(outMsg); outStatus = "error"; output.status = outStatus; if (debugLevel > 0) { output.debugInfos = myDebug; } output.messages = outMessages; var errbody = JSON.stringify(output); $.response.contentType = 'application/json'; $.response.setBody(errbody); //$.response.status = $.net.http.INTERNAL_SERVER_ERROR; // Workaround, weil CRM scheinbar Probleme mit anderen Statuscodes hat $.response.status = $.net.http.OK; } function checkParams() { var isValid = true; var missingParams = []; try { if (!$.request.parameters.get("field")) { missingParams.push("field"); isValid = false; } if (!$.request.parameters.get("datefrom")) { missingParams.push("datefrom"); isValid = false; } if (!$.request.parameters.get("dateto")) { missingParams.push("dateto"); isValid = false; } } catch (e) { exceptionHandler(e); isValid = false; } if (!isValid) { outMsg = {}; outMsg.method = "checkParams"; outMsg.status = "error"; outStatus = "error"; outMsg.message = "missing mandatory parameters: " + missingParams.join(); outMessages.push(outMsg); $.response.status = $.net.http.BAD_REQUEST; } return isValid; } function getCpoTransactionData() { var datefrom = $.request.parameters.get("datefrom"); var dateto = $.request.parameters.get("dateto"); var limit = 1000; var offset = 0; outMsg = {}; outMsg.method = "getCpoTransactionData"; outMsg.status = "error"; var resultData = {}; var resultSet = []; var conn = $.hdb.getConnection(); do { if (debugLevel > 1) { outMsg.limit = limit; outMsg.offset = offset; } var queryResult = conn.executeQuery( "select CDRID, JSONRAW \ from VIRTAPORTAL.CPO_CHARGES \ where STARTTIME >= ? and STARTTIME <= ? and JSONRAW is not null \ order by CDRID \ limit ? offset ?", datefrom, dateto, limit, offset); var iterator = queryResult.getIterator(); while (iterator.next()) { resultSet.push(JSON.parse(JSON.stringify(iterator.value()))); } offset += limit; } while (queryResult.length === limit) conn.close(); resultData = { count: resultSet.length, rows: resultSet }; outMsg.status = "success"; outMsg.result = resultData; if (debugLevel > 0 || outMsg.status === "error") { outMessages.push(outMsg); } return resultData; } function updateCpoValidationResults() { var cpoTransData = getCpoTransactionData(); var completeData = []; if (cpoTransData.count > 0) { completeData = cpoTransData.rows.map(function(row) { var parsedData = {}; var valid = true; try { parsedData = JSON.parse(row.JSONRAW); if (!parsedData.hasOwnProperty('businessValidationResult') || !parsedData.hasOwnProperty('techValidationResult') || !parsedData.hasOwnProperty('notBillableReason')) { valid = false; } } catch (e) { valid = false; } return { CDRID: row.CDRID, BUSINESSVALIDATIONRESULT: parsedData.businessValidationResult, TECHVALIDATIONRESULT: parsedData.techValidationResult, NOTBILLABLEREASON: parsedData.notBillableReason, valid: valid }; }); } if (completeData.some(function(row) { return row.valid; })) { var paramList = completeData.filter(function(row) { return row.valid; }).map(function(row) { return [row.BUSINESSVALIDATIONRESULT, row.TECHVALIDATIONRESULT, row.NOTBILLABLEREASON, row.CDRID]; }); outMsg = {}; outMsg.method = "updateData"; outMsg.status = "error"; var resultData = {}; var conn = $.hdb.getConnection(); var statement = "update VIRTAPORTAL.CPO_CHARGES \ set BUSINESSVALIDATIONRESULT=?,TECHVALIDATIONRESULT=?,NOTBILLABLEREASON=? \ where CDRID = ?"; if (debugLevel > 1) { outMsg.statement = statement; outMsg.paramList = paramList; } var affectedRows = conn.executeUpdate(statement, paramList); conn.commit(); conn.close(); resultData = { count: affectedRows.reduce(function(cur, acc) { return cur + acc; }, 0) }; outMsg.status = "success"; outMsg.result = resultData; outMessages.push(outMsg); } } function getEmpTransactionData() { var datefrom = $.request.parameters.get("datefrom"); var dateto = $.request.parameters.get("dateto"); var limit = 1000; var offset = 0; outMsg = {}; outMsg.method = "getEmpTransactionData"; outMsg.status = "error"; var resultData = {}; var resultSet = []; var conn = $.hdb.getConnection(); do { if (debugLevel > 1) { outMsg.limit = limit; outMsg.offset = offset; } var queryResult = conn.executeQuery( "select UUID, JSONRAW \ from VIRTAPORTAL.EMP_TRANSACTIONS \ where STARTTIME >= ? and STARTTIME <= ? and JSONRAW is not null \ order by UUID \ limit ? offset ?", datefrom, dateto, limit, offset); var iterator = queryResult.getIterator(); while (iterator.next()) { resultSet.push(JSON.parse(JSON.stringify(iterator.value()))); } offset += limit; } while (queryResult.length === limit) conn.close(); resultData = { count: resultSet.length, rows: resultSet }; outMsg.status = "success"; outMsg.result = resultData; if (debugLevel > 0 || outMsg.status === "error") { outMessages.push(outMsg); } return resultData; } function updateEmpFreeMinutes() { var empTransData = getEmpTransactionData(); var completeData = []; if (empTransData.count > 0) { completeData = empTransData.rows.map(function(row) { var parsedData = {}; var valid = true; try { parsedData = JSON.parse(row.JSONRAW); if (!parsedData.hasOwnProperty('empFreeMinutes')) { valid = false; } } catch (e) { valid = false; } return { UUID: row.UUID, FREEMINUTES: parsedData.empFreeMinutes, valid: valid }; }); } // myDebug.completeData = completeData; /*var updateData = completeData.filter(function(row) { return row.valid; }).map(function(row) { return { UUID: row.UUID, FREEMINUTES: row.parsedData.empFreeMinutes }; });*/ //myDebug.updateData = updateData; if (completeData.some(function(row) { return row.valid; })) { var paramList = completeData.filter(function(row) { return row.valid; }).map(function(row) { return [row.FREEMINUTES, row.UUID]; }); outMsg = {}; outMsg.method = "updateData"; outMsg.status = "error"; var resultData = {}; var conn = $.hdb.getConnection(); var statement = "update VIRTAPORTAL.EMP_TRANSACTIONS \ set FREEMINUTES = ? \ where UUID = ?"; if (debugLevel > 1) { outMsg.statement = statement; outMsg.paramList = paramList; } var affectedRows = conn.executeUpdate(statement, paramList); conn.commit(); conn.close(); resultData = { count: affectedRows.reduce(function(cur, acc) { return cur + acc; }, 0) }; outMsg.status = "success"; outMsg.result = resultData; outMessages.push(outMsg); } } function updateEmpValidationResults() { var empTransData = getEmpTransactionData(); var completeData = []; if (empTransData.count > 0) { completeData = empTransData.rows.map(function(row) { var parsedData = {}; var valid = true; try { parsedData = JSON.parse(row.JSONRAW); if (!parsedData.hasOwnProperty('businessValidationResult') || !parsedData.hasOwnProperty('techValidationResult') || !parsedData.hasOwnProperty('notBillableReason')) { valid = false; } } catch (e) { valid = false; } return { UUID: row.UUID, BUSINESSVALIDATIONRESULT: parsedData.businessValidationResult, TECHVALIDATIONRESULT: parsedData.techValidationResult, NOTBILLABLEREASON: parsedData.notBillableReason, valid: valid }; }); } if (completeData.some(function(row) { return row.valid; })) { var paramList = completeData.filter(function(row) { return row.valid; }).map(function(row) { return [row.BUSINESSVALIDATIONRESULT, row.TECHVALIDATIONRESULT, row.NOTBILLABLEREASON, row.UUID]; }); outMsg = {}; outMsg.method = "updateData"; outMsg.status = "error"; var resultData = {}; var conn = $.hdb.getConnection(); var statement = "update VIRTAPORTAL.EMP_TRANSACTIONS \ set BUSINESSVALIDATIONRESULT=?,TECHVALIDATIONRESULT=?,NOTBILLABLEREASON=? \ where UUID = ?"; if (debugLevel > 1) { outMsg.statement = statement; outMsg.paramList = paramList; } var affectedRows = conn.executeUpdate(statement, paramList); conn.commit(); conn.close(); resultData = { count: affectedRows.reduce(function(cur, acc) { return cur + acc; }, 0) }; outMsg.status = "success"; outMsg.result = resultData; outMessages.push(outMsg); } } function checkEmpFreePeriod() { var empTransData = getEmpTransactionData(); var completeData = []; if (empTransData.count > 0) { completeData = empTransData.rows.map(function(row) { var parsedData = {}; var valid = true; try { parsedData = JSON.parse(row.JSONRAW); if (!parsedData.hasOwnProperty('empFreePeriod')) { valid = false; } } catch (e) { valid = false; } return { UUID: row.UUID, FREEPERIOD: parsedData.empFreePeriod, valid: valid }; }); } // myDebug.completeData = completeData; /*var updateData = completeData.filter(function(row) { return row.valid; }).map(function(row) { return { UUID: row.UUID, FREEMINUTES: row.parsedData.empFreeMinutes }; });*/ //myDebug.updateData = updateData; var foundData = completeData.filter(function(row) { return row.valid && row.FREEPERIOD !== null; }).map(function(row) { return { FreePeriod: row.FREEPERIOD, UUID: row.UUID }; }); outMsg = {}; outMsg.method = "updateData"; outMsg.foundData = foundData; outMsg.status = "success"; outMessages.push(outMsg); } function getEoperateTransactionData() { var datefrom = $.request.parameters.get("datefrom"); var dateto = $.request.parameters.get("dateto"); var limit = 1000; var offset = 0; outMsg = {}; outMsg.method = "getEoperateTransactionData"; outMsg.status = "error"; var resultData = {}; var resultSet = []; var conn = $.hdb.getConnection(); do { if (debugLevel > 1) { outMsg.limit = limit; outMsg.offset = offset; } var queryResult = conn.executeQuery( "select BDR_ID, JSONRAW \ from EOPERATE.CHARGEDATA \ where CHARGE_DATA_BEGIN_UTC >= ? and CHARGE_DATA_BEGIN_UTC <= ? and JSONRAW is not null \ order by BDR_ID \ limit ? offset ?", datefrom, dateto, limit, offset); var iterator = queryResult.getIterator(); while (iterator.next()) { resultSet.push(JSON.parse(JSON.stringify(iterator.value()))); } offset += limit; } while (queryResult.length === limit) conn.close(); resultData = { count: resultSet.length, rows: resultSet }; outMsg.status = "success"; outMsg.result = resultData; if (debugLevel > 0 || outMsg.status === "error") { outMessages.push(outMsg); } return resultData; } function roundTo(n, digits) { var negative = false; if (digits === undefined) { digits = 0; } if (n < 0) { negative = true; n = n * -1; } var multiplicator = Math.pow(10, digits); n = parseFloat((n * multiplicator).toFixed(11)); n = (Math.round(n) / multiplicator).toFixed(digits); if (negative) { n = (n * -1).toFixed(digits); } return Number(n); } function updateEoperatePricingItems() { var transData = getEoperateTransactionData(); var completeData = []; if (transData.count > 0) { completeData = transData.rows.map(function(row) { var parsedData = {}; var valid = false; var pricingItemsArray = []; try { parsedData = JSON.parse(row.JSONRAW)[0]; if (parsedData.hasOwnProperty('PRICING') && parsedData.PRICING.hasOwnProperty('ITEMS')) { valid = true; pricingItemsArray = parsedData.PRICING.ITEMS.filter(function(pricingItem) { return pricingItem.TYPE === "CUS"; }); } } catch (e) { valid = false; } return { BDR_ID: row.BDR_ID, ITEMS: pricingItemsArray, valid: valid }; }); } myDebug.completeData = completeData; if (completeData.some(function(row) { return row.valid; })) { var paramList = completeData.filter(function(row) { return row.valid; }).map(function(row) { /* "TYPE": "CUS", "UNIT": "KWH", "UNIT_PRICE": "0.74710000", "QUANTITY": "1.97050000", "NET_AMOUNT": "1.47207941", "CURRENCY": "EUR" */ var params = []; for (let ii = 0; ii < 4; ii++) { var item = row.ITEMS[ii]; if (item) { params.push(item.TYPE, item.UNIT, roundTo(item.UNIT_PRICE, 4), roundTo(item.QUANTITY, 3), roundTo(item.NET_AMOUNT, 3), item.CURRENCY); } else { params.push(null, null, null, null, null, null); } } params.push(row.BDR_ID); return params; }); // myDebug.paramList = paramList; outMsg = {}; outMsg.method = "updateData"; outMsg.status = "error"; var resultData = {}; var conn = $.hdb.getConnection(); var statement = "UPDATE EOPERATE.CHARGEDATA SET PRICING_ITEMS_1_TYPE= ?,PRICING_ITEMS_1_UNIT= ?,PRICING_ITEMS_1_UNIT_PRICE= ?,PRICING_ITEMS_1_QUANTITY= ?,PRICING_ITEMS_1_NET_AMOUNT= ?,PRICING_ITEMS_1_CURRENCY= ?,PRICING_ITEMS_2_TYPE= ?,PRICING_ITEMS_2_UNIT= ?,PRICING_ITEMS_2_UNIT_PRICE= ?,PRICING_ITEMS_2_QUANTITY= ?,PRICING_ITEMS_2_NET_AMOUNT= ?,PRICING_ITEMS_2_CURRENCY= ?,PRICING_ITEMS_3_TYPE= ?,PRICING_ITEMS_3_UNIT= ?,PRICING_ITEMS_3_UNIT_PRICE= ?,PRICING_ITEMS_3_QUANTITY= ?,PRICING_ITEMS_3_NET_AMOUNT= ?,PRICING_ITEMS_3_CURRENCY= ?,PRICING_ITEMS_4_TYPE= ?,PRICING_ITEMS_4_UNIT= ?,PRICING_ITEMS_4_UNIT_PRICE= ?,PRICING_ITEMS_4_QUANTITY= ?,PRICING_ITEMS_4_NET_AMOUNT= ?,PRICING_ITEMS_4_CURRENCY= ? where BDR_ID = ?"; if (debugLevel > 1) { outMsg.statement = statement; outMsg.paramList = paramList; } var affectedRows = conn.executeUpdate(statement, paramList); conn.commit(); conn.close(); resultData = { count: affectedRows.reduce(function(cur, acc) { return cur + acc; }, 0) }; outMsg.status = "success"; outMsg.result = resultData; outMessages.push(outMsg); } } function updateEoperateValidationResults() { var transData = getEoperateTransactionData(); var completeData = []; if (transData.count > 0) { completeData = transData.rows.map(function(row) { var parsedData = {}; var valid = true; try { parsedData = JSON.parse(row.JSONRAW)[0]; if (!parsedData.hasOwnProperty('BUSINESS_VALIDATION_RESULT') || !parsedData.hasOwnProperty('TECH_VALIDATION_RESULT') || !parsedData.hasOwnProperty('NOT_BILLABLE_REASON')) { valid = false; } } catch (e) { valid = false; } return { BDR_ID: row.BDR_ID, BUSINESSVALIDATIONRESULT: parsedData.BUSINESS_VALIDATION_RESULT, TECHVALIDATIONRESULT: parsedData.TECH_VALIDATION_RESULT, NOTBILLABLEREASON: parsedData.NOT_BILLABLE_REASON, valid: valid }; }); } myDebug.completeData = completeData; if (completeData.some(function(row) { return row.valid; })) { var paramList = completeData.filter(function(row) { return row.valid; }).map(function(row) { return [row.BUSINESSVALIDATIONRESULT, row.TECHVALIDATIONRESULT, row.NOTBILLABLEREASON, row.BDR_ID]; }); // myDebug.paramList = paramList; outMsg = {}; outMsg.method = "updateData"; outMsg.status = "error"; var resultData = {}; var conn = $.hdb.getConnection(); var statement = "UPDATE EOPERATE.CHARGEDATA SET BUSINESSVALIDATIONRESULT=?,TECHVALIDATIONRESULT=?,NOTBILLABLEREASON=? where BDR_ID = ?"; if (debugLevel > 1) { outMsg.statement = statement; outMsg.paramList = paramList; } var affectedRows = conn.executeUpdate(statement, paramList); conn.commit(); conn.close(); resultData = { count: affectedRows.reduce(function(cur, acc) { return cur + acc; }, 0) }; outMsg.status = "success"; outMsg.result = resultData; outMessages.push(outMsg); } } function chooseMode(field) { switch (field) { case 'empfreeminutes': updateEmpFreeMinutes(); break; case 'empfreeperiod': checkEmpFreePeriod(); break; case 'empValidationResults': updateEmpValidationResults(); break; case 'cpoValidationResults': updateCpoValidationResults(); break; case 'updateEoperatePricingItems': updateEoperatePricingItems(); break; case 'eoperateValidationResults': updateEoperateValidationResults(); break; default: exceptionHandler(new Error("unsupported mode: field=" + field)); } } try { if (checkParams()) { chooseMode($.request.parameters.get("field")); } } catch (e) { exceptionHandler(e); } setOutputMessage();