From c95b7bf57e14e5b06bd885ebeb9aa3c67f2f81b4 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <gua@adhisimon.org>
Date: Tue, 16 Jun 2015 18:27:40 +0700
Subject: [PATCH] beta

---
 httppulsakita.js | 132 +++++++++++++++++++++++++++++++++
 index.js         |   6 +-
 package.json     |   3 +-
 test.js          |  16 ++++
 xmlout.js        | 222 -------------------------------------------------------
 5 files changed, 153 insertions(+), 226 deletions(-)
 create mode 100644 httppulsakita.js
 delete mode 100644 xmlout.js

diff --git a/httppulsakita.js b/httppulsakita.js
new file mode 100644
index 0000000..9b0b0ad
--- /dev/null
+++ b/httppulsakita.js
@@ -0,0 +1,132 @@
+var url = require('url');
+var math = require('mathjs');
+var request = require('request');
+var xml = require("xml2js").parseString;
+
+var config;
+var callbackReport;
+
+var max_retry = 3;
+var sleep_before_retry = 3000;
+
+process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
+
+function topupRequest(task, retry) {
+    if (config.globals.requests_count == undefined) {
+        config.globals.requests_count = 1;
+    } else {
+        config.globals.requests_count++;
+    }
+    
+    if (config.globals.active_requests_count == undefined) {
+        config.globals.active_requests_count = 1;
+    } else {
+        config.globals.active_requests_count++;
+    }
+    
+    if (config.globals.max_active_requests_count == undefined) {
+        config.globals.max_active_requests_count = config.globals.active_requests_count;
+    } else {
+        config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count);
+    }
+    
+    
+    if (retry === undefined) {
+        retry = max_retry;
+    }
+    
+    var params = {
+        userid: config.h2h_out.userid,
+        pwd: config.h2h_out.password,
+        memberreff: task['requestId'],
+        produk: task['remoteProduct'],
+        tujuan: task['destination']
+    };
+    console.log('PARAMS:');
+    console.log(params);
+    
+    request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) {
+
+        if (error) {
+            console.log('HTTP Request Error (' + task['requestId'] + '): ');
+            console.log(error);
+            
+            if (retry) {
+                
+                console.log('Retrying trx hit (' + retry + ')');
+                setTimeout(function() {
+                    topupRequest(task, retry - 1);
+                }, sleep_before_retry);
+                
+            } else {
+                callbackReport(task['requestId'], '54', 'Gangguan koneksi ke suplier');
+            }
+            return;
+        }
+        
+        console.log('Server Response: ');
+        console.log(httpResponseBody);
+        
+        xml(httpResponseBody, function(err, result) {
+            if (err) {
+                console.log('Gagal parsing XML respon server');
+                topupRequest(task, retry - 1);
+                return;
+            } 
+            
+            var response_code = result.respon.rc.replace(/^00/, '');
+            var token = result.respon.token;
+            var data = result.respon.data.replace(/ /g, '-');
+            var sn = token + '/' + data;
+            
+            var message = result.respon.pesan.replace(/\n/g, ' ');
+            message = 'SN=' + sn + '; ' + message;
+            
+            callbackReport(task['requestId'], response_code, message);
+            
+        });
+    });
+}
+
+function start(_config, _callbackReport) {
+    config = _config;
+    callbackReport = _callbackReport
+}
+
+function parseSN(message) {
+    var sn_regex = new RegExp(config.h2h_out.sn_pattern);
+    var sn_match = message.match(sn_regex);
+    
+    //console.log('SN MATCH:');
+    //console.log(sn_match);
+    
+    if (sn_match <= 0) {
+        console.log('SN Not found: ' + message);
+        return '';
+    }
+    
+    var sn = sn_match[0];
+    var sn_remove_patterns = config.h2h_out.sn_remove_patterns.split(config.h2h_out.sn_remove_patterns_separator);
+    //console.log('SN REMOVE PATTERNS:');
+    //console.log (sn_remove_patterns);
+    
+    var count = sn_remove_patterns.length;
+    
+    for(var i = 0; i < count; i++) {
+        sn = sn.replace(sn_remove_patterns[i], '');
+    }
+    
+    return sn.trim();
+}
+
+function parseResult(message) {
+    var data;
+    xml(message, function(err, result) {
+        data = result;
+    });
+    return data;
+}
+
+exports.start = start;
+exports.topupRequest = topupRequest;
+exports.parseResult = parseResult;
diff --git a/index.js b/index.js
index 70985ec..6b1b2dd 100644
--- a/index.js
+++ b/index.js
@@ -7,7 +7,7 @@ HttpServer = require('./httpserver.js');
 var httpServer = HttpServer.start(config);
 
 var aaa = require('./aaa.js');
-var xmlout = require('./xmlout.js');
+var partner = require('./httppulsakita.js');
 
-xmlout.start(config, aaa.callbackReport);
-aaa.start(config, xmlout);
+partner.start(config, aaa.callbackReport);
+aaa.start(config, partner);
diff --git a/package.json b/package.json
index 1f5e943..1299997 100644
--- a/package.json
+++ b/package.json
@@ -26,6 +26,7 @@
     "strftime": "~0.9.2",
     "iniparser": "~1.0.5",
     "mathjs": "~1.7.0",
-    "xmlrpc": "~1.3.1"
+    "xmlrpc": "~1.3.1",
+    "xml2js": "~0.4.9"
   }
 }
diff --git a/test.js b/test.js
index 7510e8e..46a97e3 100644
--- a/test.js
+++ b/test.js
@@ -31,3 +31,19 @@ describe('aaa', function() {
     
     });
 });
+
+describe('aaa', function() {
+    var partner = require('./httppulsakita');
+    
+    describe("#parseResult()", function() {
+        message = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><respon><tanggal>2015/6/16 15:43:35</tanggal><idagen>P0039</idagen><refid>AEE15B32987941D89FFF4BC7EF676C13</refid><produk>PLN20</produk><tujuan>14204279369</tujuan><rc>0000</rc><data> </data><token> </token><pesan>#14836 PLN20 ke:14204279369 SUKSES. SN:3520-2887-6627-6699-4826/TestDummyPanjang6955555/P1/7000VA/32,4. \
+Sisa saldo  Rp. 5,000,000 - Rp. 18,700 = Rp. 4,981,300</pesan></respon>';
+
+        data = partner.parseResult(message);
+        console.log(data);
+        
+        it('should return 2015/6/16 15:43:35', function() {
+            assert.equal('2015/6/16 15:43:35', data.respon.tanggal);
+        });
+    });
+});
diff --git a/xmlout.js b/xmlout.js
deleted file mode 100644
index 4534183..0000000
--- a/xmlout.js
+++ /dev/null
@@ -1,222 +0,0 @@
-var xmlrpc = require('xmlrpc');
-var url = require('url');
-var math = require('mathjs');
-
-var config;
-var callbackReport;
-
-var max_retry = 2;
-var sleep_before_retry = 2000;
-
-process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
-
-function topupRequest(task, retry) {
-    if (config.globals.requests_count == undefined) {
-        config.globals.requests_count = 1;
-    } else {
-        config.globals.requests_count++;
-    }
-    
-    if (config.globals.active_requests_count == undefined) {
-        config.globals.active_requests_count = 1;
-    } else {
-        config.globals.active_requests_count++;
-    }
-    
-    if (config.globals.max_active_requests_count == undefined) {
-        config.globals.max_active_requests_count = config.globals.active_requests_count;
-    } else {
-        config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count);
-    }
-    
-    
-    if (retry === undefined) {
-        retry = max_retry;
-    }
-
-    var partnerUrl = url.parse(config.h2h_out.partner);
-    var clientOptions = {
-        host: partnerUrl.hostname
-        , port: partnerUrl.port
-        , path: partnerUrl.pathname
-    };
-    console.log('XMLRPC client options:');
-    console.log(clientOptions);
-
-    var client;
-    if (partnerUrl.protocol == 'https:') {
-        console.log('Use SSL');
-        client = xmlrpc.createSecureClient(clientOptions);
-    } else {
-        console.log('Not using SSL');
-        client = xmlrpc.createClient(clientOptions);
-    }
-
-    var methodName = 'topUpRequest';
-    console.log('methodName: ' + methodName);
-
-    var params = {
-        MSISDN: config.h2h_out.userid,
-        REQUESTID: task['requestId'],
-        PIN: config.h2h_out.password,
-        NOHP: task['destination'],
-        NOM: task['remoteProduct']
-    };
-    console.log('PARAMS:');
-    console.log(params);
-
-
-    client.methodCall(methodName, [ params ], function (error, value) {
-        
-        if (config.globals.active_requests_count == undefined) {
-            config.globals.active_requests_count = 0;
-        } else {
-            config.globals.active_requests_count--;
-        }
-        
-        // Results of the method response
-        if (error) {
-            console.log('XMLRPC Client Error (' + task['requestId'] + '): ');
-            console.log(error);
-            
-            if (retry) {
-                
-                console.log('Retrying topUpRequest (' + retry + ')');
-                setTimeout(function() {
-                    topupRequest(task, retry - 1);
-                }, sleep_before_retry);
-                
-            } else {
-                callbackReport(task['requestId'], '40', 'Gangguan koneksi ke suplier');
-            }
-            return;
-        }
-        
-        console.log('Method response for \'' + methodName + '\': ')
-        console.log(value);
-        
-        if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
-            value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
-            //console.log('Message with SN: ' + value['MESSAGE']);
-        }
-        
-        callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
-    });
-}
-
-function createServer() {
-
-    console.log('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
-    var serverOptions = {
-        port: config.h2h_out.listen_port
-    };
-
-    var server = xmlrpc.createServer(serverOptions);
-
-    server.on('NotFound', function (method, params) {
-        console.log(method + ' is not found on our XML-RPC server');
-        console.log('params:');
-        console.log(params);
-    });
-
-    server.on('topUpReport', function (err, params, callback) {
-        console.log('RECEIVE topUpReport, params:');
-        console.log(params);
-        
-        var paramscount = params.length;
-        for (var i = 0; i < paramscount; i++) {
-            var value = params[i];
-            
-            if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
-                value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
-                //console.log('Message with SN: ' + value['MESSAGE']);
-            }
-                        
-            callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
-        }
-
-        callback(null, 'ACK REPORT OK');
-    })
-
-}
-
-function checkStatus(task) {
-    var partnerUrl = url.parse(config.h2h_out.partner);
-    var clientOptions = {
-        host: partnerUrl.hostname
-        , port: partnerUrl.port
-        , path: partnerUrl.pathname
-    };
-    console.log('XMLRPC client options:');
-    console.log(clientOptions);
-
-    var client;
-    if (partnerUrl.protocol == 'https:') {
-        console.log('Use SSL');
-        client = xmlrpc.createSecureClient(clientOptions);
-    } else {
-        console.log('Not using SSL');
-        client = xmlrpc.createClient(clientOptions);
-    }
-
-    var methodName = 'topUpInquiry';
-    console.log('methodName: ' + methodName);
-
-    var params = {
-        MSISDN: config.h2h_out.userid,
-        REQUESTID: task['requestId'],
-        PIN: config.h2h_out.password,
-        NOHP: task['destination']
-    };
-    console.log('PARAMS:');
-    console.log(params);
-
-    client.methodCall(methodName, [ params ], function (error, value) {
-        // Results of the method response
-        if (error) {
-            console.log('Error: ');
-            console.log(error);
-            return;
-        }
-        console.log('Method response for \'' + methodName + '\': ')
-        console.log(value);
-
-        callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
-    });
-}
-
-function start(_config, _callbackReport) {
-    config = _config;
-    callbackReport = _callbackReport
-
-    createServer();
-}
-
-function parseSN(message) {
-    var sn_regex = new RegExp(config.h2h_out.sn_pattern);
-    var sn_match = message.match(sn_regex);
-    
-    //console.log('SN MATCH:');
-    //console.log(sn_match);
-    
-    if (sn_match <= 0) {
-        console.log('SN Not found: ' + message);
-        return '';
-    }
-    
-    var sn = sn_match[0];
-    var sn_remove_patterns = config.h2h_out.sn_remove_patterns.split(config.h2h_out.sn_remove_patterns_separator);
-    //console.log('SN REMOVE PATTERNS:');
-    //console.log (sn_remove_patterns);
-    
-    var count = sn_remove_patterns.length;
-    
-    for(var i = 0; i < count; i++) {
-        sn = sn.replace(sn_remove_patterns[i], '');
-    }
-    
-    return sn.trim();
-}
-
-exports.start = start;
-exports.topupRequest = topupRequest;
-- 
1.9.0