diff --git a/partner-sc.js b/partner-sc.js index 0de49a7..d389616 100644 --- a/partner-sc.js +++ b/partner-sc.js @@ -9,13 +9,16 @@ var math = require('mathjs'); var winston = require('winston'); var cekstatus = require('./cekstatus.js'); var mongoClient = require('mongodb').MongoClient; -var mongodb; +var LRU = require('lru-cache'); var config; var httpServer; var aaa; var logger; var callbackReport; +var mongodb; + +var tasks = LRU(10000); process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; @@ -23,7 +26,7 @@ var sleep_before_retry = 30000; var logTag = __filename.split('/').reverse()[0]; -unction initMongoClient() { +function initMongoClient() { if (!config.mongodb || !config.mongodb.url) { return; } @@ -46,8 +49,153 @@ unction initMongoClient() { } -function topupRequest(task) { +function prepareResultData(result) { + var task; + + var data = {}; + data.gateway = config.globals.gateway_name; + + try { + data.requestId = result.reffid[0].trim(); + + var key = config.globals.gateway_name + '.rid:' + data.requestId; + task = tasks.get(key); + } + catch(err) { data.requestId = null; } + + try { + data.status = result.ResultCode[0].trim(); + } + catch(err) { data.status = '68' } + + try { + data.rcmessage = result.ErrorMsg[0].trim(); + } + catch(err) { data.rcmessage = ''; } + + try { + data.resptext = ''; + } + catch(err) { data.resptext = ''; } + + try { + data.dt = task.timestamp; + } + catch(err) { + logger.warn('Exception when getting timestamp data, using current timestamp', {err: err, result: result, task: task}); + data.dt = strftime('%Y-%m-%d %H:%M:%S', new Date()); + } + + try { + data.namapel = result.nama_pel[0].trim(); + } + catch(err) { data.namapel = 'UNKNOWN'; } + + try { + data.msn = result.nsm[0].trim(); + } + catch(err) { data.msn = 'UNKNOWN'; } + + try { + data.idpel = result.idpel[0].trim(); + } + catch(err) { data.idpel = 'UNKNOWN'; } + + try { + data.tarifdaya = result.tarif[0].trim(); + } + catch(err) { data.tarifdaya = 'UNKNOWN'; } + + try { + data.admin = parseInt(result.adminfee[0].trim()); + } + catch(err) { data.admin = 0; } + + try { + data.adm = parseInt(result.adminfee[0].trim()); + } + catch(err) { data.adm = 0; } + + try { + data.hargatotal = parseInt(result.amount_trx[0].trim()); + } + catch(err) { data.hargatotal = 0; } + + try { + data.hargapelanggan = data.hargatotal - data.adm; + } + catch(err) { data.hargapelanggan = 0; } + + try { + data.jumlahkwh = result.jml_daya[0].trim(); + } + catch(err) { data.jumlahkwh = 0; } + + try { + data.token = result.token[0].trim(); + } + catch(err) { data.token = 0; } + + try { + data.ppn = result.ppn_fee[0].trim(); + } + catch(err) { data.ppn_fee = 0; } + + try { + data.ppj = result.ppj_fee[0].trim(); + } + catch(err) { data.ppj = 0; } + + try { + data.angsuran = result.angsuran_fee[0].trim(); + } + catch(err) { data.angsuran = 0; } + + try { + data.meterai = result.materai_fee[0].trim(); + } + catch(err) { data.materai_fee = 0; } + + return data; +} + +function saveTokenToMongoDb(result) { + if (!mongodb) { + return; + } + + if (!config.mongodb) { + return; + } + + if (!config.mongodb.collection) { + return; + } + + data = prepareResultData(result); + try { + mongodb.collection(config.mongodb.collection).insertOne(data); + } + catch(err) { + logger.warn('Error when inserting data to mongodb', {err: err, data: data}); + } +} + +function putTaskToCache(task) { + var key = config.globals.gateway_name + '.rid:' + task.requestId; + + try { + tasks.set(key, task); + } + catch(err) { + logger.warn('Error writing to task to cache', {err: err, key: key, task: task}); + } +} + +function topupRequest(task) { + putTaskToCache(task); + var ts = strftime('%Y%m%d%H%M%S', new Date()); var data = @@ -92,6 +240,8 @@ function topupRequest(task) { var directResponse = result; logger.info(directResponse); + saveTokenToMongoDb(directResponse.Result); + try { var result_price; try { @@ -406,6 +556,7 @@ function start(_config, _callbackReport, options) { } createHttpReportServer(); + initMongoClient(); } exports.start = start;