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;