var ParDebug = false; var output = {}; var outMessages = []; var outErrorMessages = []; var outMsg = {}; var outStatus = "success"; var myDebug = {}; var serviceVersion = '2.8'; 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; 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) { 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(); outMsg.serviceVersion = serviceVersion; } 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; } function checkUUID(myUUID) { var exists = false; var conn = $.db.getConnection(); var pstmt; var query = "select \"UUID\" from \"VIRTAPORTAL\".\"EMP_TRANSACTIONS\" where UUID = ?"; pstmt = conn.prepareStatement(query); pstmt.setNString(1, myUUID); var rs = pstmt.executeQuery(); if (rs.next()) { exists = true; } rs.close(); pstmt.close(); conn.close(); return exists; } function writeObj2Table(transOBJ) { //var pdcontent = $.request.body.asString(); // pdcontent = pdcontent.replace(/\"([^(\")"]+)\":/g,"$1:"); var conn = $.db.getConnection(); var pstmt; var query; var vals = {}; var data = []; var isUpdateMode = false; // var query2; // var output = {results: [] }; //var mynextval = getnextval(); //myDebug.mynextval = mynextval; try { var myUUID = transOBJ[0].uuid.toString(); isUpdateMode = checkUUID(myUUID); if (isUpdateMode) { // "UPDATE \"EOPERATE\".\"CHARGEDATA\" SET BDR_ID = ?,EMAID =? ,UNIQUE_ID = ?, CREATION_DATE_UTC = ?,CHARGEPOINT_ID= ?,CHARGEPOINT_TYPE= ?,CHARGEPOINT_METER_ID= ?,CHARGEPOINT_ADDRESS_COUNTRY= ?,CHARGEPOINT_ADDRESS_POSTALCODE= ?,CHARGEPOINT_ADDRESS_CITY= ?,CHARGEPOINT_ADDRESS_STREET= ?,CHARGEPOINT_OPERATOR_ID= ?,CHARGEPOINT_OPERATOR_NAME= ?,EMOBILITY_PROVIDER_ID= ?,EMOBILITY_PROVIDER_NAME= ?,CHARGE_DATA_AUTHORIZATION_TYPE= ?,CHARGE_DATA_CONSUMPTION_KWH= ?,CHARGE_DATA_BEGIN_UTC= ?,CHARGE_DATA_END_UTC= ?,CHARGE_DATA_TIME_ZONE= ?,CHARGE_DATA_EKA_STATUS= ?,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= ?,SUBSCRIPTION_ID= ?,JSONRAW= ?,UPDATE_TS= CURRENT_TIMESTAMP,UPDATE_USER= CURRENT_USER)"; query = "UPDATE \"VIRTAPORTAL\".\"EMP_TRANSACTIONS\" SET UUID=?,CDRID=?,STATIONUUID=?,CUSTOMERID=?,STARTTIME=?,STOPTIME=?,DURATION=?,WATTHOUR=?,AMOUNT=?,CURRENCY=?,TRANSACTIONTYPE=?,CREATED=?,RFID=?,STATION=?,STATION_ID=?,STATION_NAME=?,LOCATION_ID=?,LOCATION_ADDRESS=?,LOCATION_CITY=?,LOCATION_TYPE=?,CUSTOMERGROUPID=?,CUSTOMERGROUPNAME=?,ORGANIZATIONID=?,PAYMENTTYPE=?,EVSEID=?,PLUGTYPE=?,EMPSHARE=?,SIGNEDMETERVALUEBEGIN=?,SIGNEDMETERVALUEEND=?,OPERATORPRICE=?,OPERATORCURRENCY=?,OPERATORID=?,FREECHARGING=?,EMPTARIFFID=?,EMPTARIFFNAME=?,FULLEVSEID=?,METERSTART=?,METERSTOP=?,NOTES=?,MILEAGE=?,JSONRAW=?,EICHRECHTTYPE=?,KWHNETPRICE=?,MINUTENETPRICE=?,SESSIONNETPRICE=?,CPOOPERATORID=?,KWHGROSSPRICE=?,MINUTEGROSSPRICE=?,SESSIONGROSSPRICE=?,LOCATION_COUNTRY=?,BUSINESSVALIDATIONRESULT=?,TECHVALIDATIONRESULT=?,NOTBILLABLEREASON=?,FREEMINUTES=?,UPDATE_TS=CURRENT_TIMESTAMP,UPDATE_USER=CURRENT_USER where UUID = ?"; outMsg.method = "Update Data UUID: " + myUUID; } else { query = "INSERT INTO \"VIRTAPORTAL\".\"EMP_TRANSACTIONS\" (UUID,CDRID,STATIONUUID,CUSTOMERID,STARTTIME,STOPTIME,DURATION,WATTHOUR,AMOUNT,CURRENCY,TRANSACTIONTYPE,CREATED,RFID,STATION,STATION_ID,STATION_NAME,LOCATION_ID,LOCATION_ADDRESS,LOCATION_CITY,LOCATION_TYPE,CUSTOMERGROUPID,CUSTOMERGROUPNAME,ORGANIZATIONID,PAYMENTTYPE,EVSEID,PLUGTYPE,EMPSHARE,SIGNEDMETERVALUEBEGIN,SIGNEDMETERVALUEEND,OPERATORPRICE,OPERATORCURRENCY,OPERATORID,FREECHARGING,EMPTARIFFID,EMPTARIFFNAME,FULLEVSEID,METERSTART,METERSTOP,NOTES,MILEAGE,JSONRAW,UPDATE_TS,EICHRECHTTYPE,KWHNETPRICE,MINUTENETPRICE,SESSIONNETPRICE,CPOOPERATORID,KWHGROSSPRICE,MINUTEGROSSPRICE,SESSIONGROSSPRICE,LOCATION_COUNTRY,BUSINESSVALIDATIONRESULT,TECHVALIDATIONRESULT,NOTBILLABLEREASON,FREEMINUTES,UPDATE_USER) values (" + "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP,?,?,?,?,?,?,?,?,?,?,?,?,?,CURRENT_USER)"; outMsg.method = "Insert Data UUID: " + myUUID; } // query = "INSERT INTO \"NICEPORTAL\".\"UO_CRM_DATA_BP\" (ID,ID_MSD,TYPE,GROUP,SALUTATION,TITLE,NAME,SURNAME,PHONE,MOBILE_PHONE,EMAIL,ADDRESS_JSON,IBAN,BIC,SEPA_MANDATE_ID,SIGNATURE_DATE,ACCOUNT_OWNER,STREET,STREET_NO,ZIP_CODE,CITY,JSONRAW,CREATE_TS,UPDATE_TS) values (\"NICEPORTAL\".\"SEQ_CRMBP_ID\".NEXTVAL,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)"; //query = // "UPSERT \"VIRTAPORTAL\".\"EMP_TRANSACTIONS\" (UUID,CDRID,STATIONUUID,CUSTOMERID,STARTTIME,STOPTIME,DURATION,WATTHOUR,AMOUNT,CURRENCY,TRANSACTIONTYPE,CREATED,RFID,STATION,STATION_ID,STATION_NAME,LOCATION_ID,LOCATION_ADDRESS,LOCATION_CITY,LOCATION_TYPE,CUSTOMERGROUPID,CUSTOMERGROUPNAME,ORGANIZATIONID,PAYMENTTYPE,EVSEID,PLUGTYPE,EMPSHARE,SIGNEDMETERVALUEBEGIN,SIGNEDMETERVALUEEND,OPERATORPRICE,OPERATORCURRENCY,OPERATORID,FREECHARGING,EMPTARIFFID,EMPTARIFFNAME,FULLEVSEID,METERSTART,METERSTOP,NOTES,MILEAGE,JSONRAW,UPDATE_TS,EICHRECHTTYPE,KWHNETPRICE,MINUTENETPRICE,SESSIONNETPRICE,CPOOPERATORID,KWHGROSSPRICE,MINUTEGROSSPRICE,SESSIONGROSSPRICE,LOCATION_COUNTRY) values (" + // "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP,?,?,?,?,?,?,?,?,?) WITH PRIMARY KEY"; // "INSERT INTO \"NICEPORTAL\".\"UO_CRM_DATA_BP\" (ID,ID_MSD,ID_CRM,TYPE,BPGROUP,SALUTATION,TITLE,NAME,SURNAME,PHONE,MOBILE_PHONE,EMAIL,ADDRESS_JSON,IBAN,BIC,SEPA_MANDATE_ID,SIGNATURE_DATE,ACCOUNT_OWNER,STREET,STREET_NO,ZIP_CODE,CITY,JSONRAW,CREATE_TS,UPDATE_TS) values (\"NICEPORTAL\".\"SEQ_CRMBP_ID\".NEXTVAL,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)"; pstmt = conn.prepareStatement(query); pstmt.setBatchSize(transOBJ.length); //$.trace.debug("prepareBatchStatement (" + transOBJ.length.toString() + " rows): " + query); transOBJ.forEach(function(transRow) { pstmt.setNString(1, transRow.uuid); /* if (!isNaN(parseInt(transRow.cdrId))) { pstmt.setInteger(2, transRow.cdrId); } else { pstmt.setNull(2); } */ if (transRow.cdrId) { pstmt.setNString(2, transRow.cdrId.toString()); } else { pstmt.setNull(2); } if (transRow.stationUuid) { pstmt.setNString(3, transRow.stationUuid); } else { pstmt.setNull(3); } if (!isNaN(parseInt(transRow.customerId))) { pstmt.setInteger(4, transRow.customerId); } else { pstmt.setNull(4); } if (transRow.startTime) { pstmt.setNString(5, transRow.startTime); } else { pstmt.setNull(5); } if (transRow.stopTime) { pstmt.setNString(6, transRow.stopTime); } else { pstmt.setNull(6); } if (!isNaN(parseInt(transRow.duration))) { pstmt.setInteger(7, transRow.duration); } else { pstmt.setNull(7); } if (!isNaN(parseInt(transRow.wattHour))) { pstmt.setInteger(8, transRow.wattHour); } else { pstmt.setNull(8); } if (!isNaN(parseInt(transRow.amount))) { pstmt.setInteger(9, transRow.amount); } else { pstmt.setNull(9); } if (transRow.currency) { pstmt.setNString(10, transRow.currency); } else { pstmt.setNull(10); } if (transRow.transactionType) { pstmt.setNString(11, transRow.transactionType); } else { pstmt.setNull(11); } if (transRow.created) { pstmt.setNString(12, transRow.created); } else { pstmt.setNull(12); } if (transRow.rfid) { pstmt.setNString(13, transRow.rfid); } else { pstmt.setNull(13); } if (transRow.station) { pstmt.setNClob(14, JSON.stringify(transRow.station)); pstmt.setNString(15, transRow.station.identity); if (transRow.station.name) { pstmt.setNString(16, transRow.station.name.substr(0,100)); } else { pstmt.setNull(16); } if (typeof transRow.station.location === "undefined") { pstmt.setNull(17); pstmt.setNull(18); pstmt.setNull(19); pstmt.setNull(20); pstmt.setNull(50); } else { if (!isNaN(parseInt(transRow.station.location.id))) { pstmt.setInteger(17, transRow.station.location.id); } else { pstmt.setNull(17); } if (transRow.station.location.address) { pstmt.setNString(18, transRow.station.location.address); } else { pstmt.setNull(18); } if (transRow.station.location.city) { pstmt.setNString(19, transRow.station.location.city); } else { pstmt.setNull(19); } if (transRow.station.location.locationType) { pstmt.setNString(20, transRow.station.location.locationType); } else { pstmt.setNull(20); } if (transRow.station.location.country) { pstmt.setNString(50, transRow.station.location.country); } else { pstmt.setNull(50); } } } else { pstmt.setNull(14); pstmt.setNull(15); pstmt.setNull(16); pstmt.setNull(17); pstmt.setNull(18); pstmt.setNull(19); pstmt.setNull(20); pstmt.setNull(50); } pstmt.setInteger(21, transRow.customerGroupId); if (transRow.customerGroupName) { pstmt.setNString(22, transRow.customerGroupName); } else { pstmt.setNull(22); } if (!isNaN(parseInt(transRow.organizationId))) { pstmt.setInteger(23, transRow.organizationId); } else { pstmt.setNull(23); } if (transRow.paymentType) { pstmt.setNString(24, transRow.paymentType); } else { pstmt.setNull(24); } if (transRow.evseId) { pstmt.setNString(25, transRow.evseId.toString()); } else { pstmt.setNull(25); } if (transRow.plugType) { pstmt.setNString(26, transRow.plugType); } else { pstmt.setNull(26); } if (!isNaN(parseInt(transRow.empShare))) { pstmt.setInteger(27, transRow.empShare); } else { pstmt.setNull(27); } if (transRow.signedMeterValueBegin) { pstmt.setNString(28, transRow.signedMeterValueBegin.substr(0, 50)); } else { pstmt.setNull(28); } if (transRow.signedMeterValueEnd) { pstmt.setNString(29, transRow.signedMeterValueEnd.substr(0, 50)); } else { pstmt.setNull(29); } if (!isNaN(parseInt(transRow.operatorPrice))) { pstmt.setInteger(30, transRow.operatorPrice); } else { pstmt.setNull(30); } if (transRow.operatorCurrency) { pstmt.setNString(31, transRow.operatorCurrency); } else { pstmt.setNull(31); } if (!isNaN(parseInt(transRow.operatorId))) { pstmt.setInteger(32, transRow.operatorId); } else { pstmt.setNull(32); } if (transRow.freeCharging) { pstmt.setNString(33, transRow.freeCharging); } else { pstmt.setNull(33); } if (!isNaN(parseInt(transRow.empTariffId))) { pstmt.setInteger(34, transRow.empTariffId); } else { pstmt.setNull(34); } if (transRow.empTariffName) { pstmt.setNString(35, transRow.empTariffName); } else { pstmt.setNull(35); } if (transRow.fullEvseId) { pstmt.setNString(36, transRow.fullEvseId); } else { pstmt.setNull(36); } if (!isNaN(parseInt(transRow.meterStart))) { pstmt.setInteger(37, transRow.meterStart); } else { pstmt.setNull(37); } if (!isNaN(parseInt(transRow.meterStop))) { pstmt.setInteger(38, transRow.meterStop); } else { pstmt.setNull(38); } pstmt.setNString(39, JSON.stringify(transRow.notes)); if (transRow.notes && transRow.notes.length > 0) { pstmt.setInteger(40, transRow.notes[0].value); } else { pstmt.setNull(40); } //pstmt.setNString(34, "1234"); pstmt.setNString(41, JSON.stringify(transRow)); if (transRow.eichrechtType) { pstmt.setNString(42, transRow.eichrechtType); } else { pstmt.setNull(42); } if (!isNaN(parseInt(transRow.empKwhNetPrice))) { pstmt.setInteger(43, transRow.empKwhNetPrice); } else { pstmt.setNull(43); } if (!isNaN(parseInt(transRow.empMinuteNetPrice))) { pstmt.setInteger(44, transRow.empMinuteNetPrice); } else { pstmt.setNull(44); } if (!isNaN(parseInt(transRow.empSessionNetPrice))) { pstmt.setInteger(45, transRow.empSessionNetPrice); } else { pstmt.setNull(45); } if (transRow.cpoOperatorId) { pstmt.setNString(46, transRow.cpoOperatorId); } else { pstmt.setNull(46); } if (!isNaN(parseInt(transRow.empKwhGrossPrice))) { pstmt.setInteger(47, transRow.empKwhGrossPrice); } else { pstmt.setNull(47); } if (!isNaN(parseInt(transRow.empMinuteGrossPrice))) { pstmt.setInteger(48, transRow.empMinuteGrossPrice); } else { pstmt.setNull(48); } if (!isNaN(parseInt(transRow.empSessionGrossPrice))) { pstmt.setInteger(49, transRow.empSessionGrossPrice); } else { pstmt.setNull(49); } //20.04.2023 Erweiterung PlausiheckFelder if (transRow.businessValidationResult) { pstmt.setNString(51, transRow.businessValidationResult); } else { pstmt.setNull(51); } if (transRow.techValidationResult) { pstmt.setNString(52, transRow.techValidationResult); } else { pstmt.setNull(52); } if (transRow.notBillableReason) { pstmt.setNString(53, transRow.notBillableReason); } else { pstmt.setNull(53); } if (!isNaN(parseInt(transRow.empFreeMinutes))) { pstmt.setInteger(54, transRow.empFreeMinutes); } else { pstmt.setNull(54); } if (isUpdateMode) { pstmt.setNString(55, myUUID); } pstmt.addBatch(); }); var batchResult = pstmt.executeBatch(); //$.trace.debug("BatchUpsert Result: " + batchResult.toString()); pstmt.close(); conn.commit(); conn.close(); outMsg = {}; outMsg.method = "insertDB"; outMsg.status = "success"; outMessages.push(outMsg); } catch (e) { $.trace.error("InsertDB ExceptionHandler: " + e.toString()); exceptionHandler(e); /*outMsg = {}; outMsg.method = "exceptionHandler"; outMsg.status = "error"; outStatus = "error"; output.status = outStatus; outMsg.message = e.toString(); if (ParDebug) { outMsg.exceptionInfo = {}; outMsg.exceptionInfo.name = e.name; outMsg.exceptionInfo.message = e.message; outMsg.exceptionInfo.fileName = e.fileName; outMsg.exceptionInfo.lineNumber = e.lineNumber; outMsg.exceptionInfo.columnNumber = e.columnNumber; outMsg.exceptionInfo.stack = e.stack; //outMsg.exceptionInfo.source = e.toSource(); } outMessages.push(outMsg); vals.status = 'error'; //vals.description = e.message; vals.messages = outMessages; if (ParDebug) { vals.debug = {}; vals.debug.statement = query; }*/ } } function checkPayload(aCDR) { var isValid = true; var reason = ""; try { if (Array.isArray(aCDR)) { aCDR.forEach(function(cdrObj) { if (!cdrObj.hasOwnProperty('uuid')) { isValid = false; reason = " (mandatory properties are: uuid)"; } }); } else { isValid = false; reason = " (payload is not an array)"; } } catch (e) { exceptionHandler(e); isValid = false; } if (!isValid) { outMsg = {}; outMsg.method = "checkPayload"; outMsg.status = "error"; outStatus = "error"; $.response.status = $.net.http.BAD_REQUEST; outMsg.message = "invalid payload structure" + reason; outMessages.push(outMsg); } return isValid; } function processData(sObj) { try { var cdrData = JSON.parse(sObj); if (!Array.isArray(cdrData)) { cdrData = [cdrData]; } if (checkPayload(cdrData)) { writeObj2Table(cdrData); } } catch (e) { exceptionHandler(e); } } ParDebug = $.request.parameters.get('debug') && $.request.parameters.get('debug').toLowerCase() === "true"; var content = ''; if ($.request.body) { content = $.request.body.asString(); } processData(content); setOutputMessage();