Commit 7ec4016657837ae777abb3c05de7038be30fb306

Authored by Adhidarma Hadiwinoto
1 parent f0303f53a1
Exists in master

perbaikan parsesn

Showing 2 changed files with 19 additions and 32 deletions Inline Diff

1 var url = require('url'); 1 var url = require('url');
2 var math = require('mathjs'); 2 var math = require('mathjs');
3 var request = require('request'); 3 var request = require('request');
4 var xml = require("xml2js").parseString; 4 var xml = require("xml2js").parseString;
5 5
6 var config; 6 var config;
7 var callbackReport; 7 var callbackReport;
8 8
9 var max_retry = 3; 9 var max_retry = 3;
10 var sleep_before_retry = 3000; 10 var sleep_before_retry = 3000;
11 11
12 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 12 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
13 13
14 function parseSN(message) { 14 function parseSN(message, _config) {
15 var sn_regex = new RegExp(config.h2h_out.sn_pattern); 15
16 if (!_config) {
17 _config = config;
18 }
19
20 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
16 var sn_match = message.match(sn_regex); 21 var sn_match = message.match(sn_regex);
17 22
18 if (sn_match <= 0) { 23 if (sn_match <= 0) {
19 console.log('SN Not found: ' + message); 24 console.log('SN Not found: ' + message);
20 return ''; 25 return '';
21 } 26 }
22 27
23 var sn = sn_match[0]; 28 var sn = sn_match[0];
24 var sn_remove_patterns = config.h2h_out.sn_remove_patterns.split(config.h2h_out.sn_remove_patterns_separator); 29 var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
25 30
26 var count = sn_remove_patterns.length; 31 var count = sn_remove_patterns.length;
27 32
28 for(var i = 0; i < count; i++) { 33 for(var i = 0; i < count; i++) {
29 sn = sn.replace(sn_remove_patterns[i], ''); 34 sn = sn.replace(sn_remove_patterns[i], '');
30 } 35 }
31 36
32 return sn.trim(); 37 return sn.trim();
33 } 38 }
34 39
35 40
36 function topupRequest(task, retry) { 41 function topupRequest(task, retry) {
37 if (config.globals.requests_count == undefined) { 42 if (config.globals.requests_count == undefined) {
38 config.globals.requests_count = 1; 43 config.globals.requests_count = 1;
39 } else { 44 } else {
40 config.globals.requests_count++; 45 config.globals.requests_count++;
41 } 46 }
42 47
43 if (config.globals.active_requests_count == undefined) { 48 if (config.globals.active_requests_count == undefined) {
44 config.globals.active_requests_count = 1; 49 config.globals.active_requests_count = 1;
45 } else { 50 } else {
46 config.globals.active_requests_count++; 51 config.globals.active_requests_count++;
47 } 52 }
48 53
49 if (config.globals.max_active_requests_count == undefined) { 54 if (config.globals.max_active_requests_count == undefined) {
50 config.globals.max_active_requests_count = config.globals.active_requests_count; 55 config.globals.max_active_requests_count = config.globals.active_requests_count;
51 } else { 56 } else {
52 config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); 57 config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count);
53 } 58 }
54 59
55 60
56 if (retry === undefined) { 61 if (retry === undefined) {
57 retry = max_retry; 62 retry = max_retry;
58 } 63 }
59 64
60 var params = { 65 var params = {
61 userid: config.h2h_out.userid, 66 userid: config.h2h_out.userid,
62 pwd: config.h2h_out.password, 67 pwd: config.h2h_out.password,
63 memberreff: task['requestId'], 68 memberreff: task['requestId'],
64 produk: task['remoteProduct'], 69 produk: task['remoteProduct'],
65 tujuan: task['destination'] 70 tujuan: task['destination']
66 }; 71 };
67 console.log('PARAMS:'); 72 console.log('PARAMS:');
68 console.log(params); 73 console.log(params);
69 74
70 request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { 75 request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) {
71 76
72 config.globals.active_requests_count--; 77 config.globals.active_requests_count--;
73 78
74 if (err) { 79 if (err) {
75 console.log('HTTP Request Error (' + task['requestId'] + '): '); 80 console.log('HTTP Request Error (' + task['requestId'] + '): ');
76 console.log(err); 81 console.log(err);
77 82
78 if (retry) { 83 if (retry) {
79 84
80 console.log('Retrying trx hit (' + retry + ')'); 85 console.log('Retrying trx hit (' + retry + ')');
81 setTimeout(function() { 86 setTimeout(function() {
82 topupRequest(task, retry - 1); 87 topupRequest(task, retry - 1);
83 }, sleep_before_retry); 88 }, sleep_before_retry);
84 89
85 } else { 90 } else {
86 callbackReport(task['requestId'], '40', 'Gangguan koneksi ke suplier'); 91 callbackReport(task['requestId'], '40', 'Gangguan koneksi ke suplier');
87 } 92 }
88 return; 93 return;
89 } 94 }
90 95
91 console.log('Server Response: '); 96 console.log('Server Response: ');
92 console.log(httpResponseBody); 97 console.log(httpResponseBody);
93 98
94 if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { 99 if (httpResponseBody.indexOf('502 Proxy Error') >= 0) {
95 callbackReport(task['requestId'], '40', '502 Proxy error'); 100 callbackReport(task['requestId'], '40', '502 Proxy error');
96 return; 101 return;
97 } 102 }
98 103
99 xml(httpResponseBody, function(err, result) { 104 xml(httpResponseBody, function(err, result) {
100 if (err) { 105 if (err) {
101 console.log('Gagal parsing XML respon server'); 106 console.log('Gagal parsing XML respon server');
102 //topupRequest(task, retry - 1); 107 //topupRequest(task, retry - 1);
103 callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); 108 callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server');
104 return; 109 return;
105 } 110 }
106 111
107 console.log('Response Data:'); 112 console.log('Response Data:');
108 console.log(result); 113 console.log(result);
109 114
110 var response_code = result.respon.rc[0].replace(/^00/, ''); 115 var response_code = result.respon.rc[0].replace(/^00/, '');
111 116
112 var token = ''; 117 var token = '';
113 if (result.respon.token) { 118 if (result.respon.token) {
114 token = result.respon.token[0]; 119 token = result.respon.token[0];
115 } 120 }
116 121
117 var data_pelanggan = 'NO-DATA'; 122 var data_pelanggan = 'NO-DATA';
118 if (result.respon.data) { 123 if (result.respon.data) {
119 data_pelanggan = result.respon.data[0].replace(/ /g, '-'); 124 data_pelanggan = result.respon.data[0].replace(/ /g, '-');
120 } 125 }
121 126
122 var message = result.respon.pesan[0].replace(/\n/g, ' '); 127 var message = result.respon.pesan[0].replace(/\n/g, ' ');
123 128
124 129
125 if (response_code == '00') { 130 if (response_code == '00') {
126 131
127 var sn = ""; 132 var sn = "";
128 133
129 if (config.h2h_out.parse_sn == 'YES') { 134 if (config.h2h_out.parse_sn == 'YES') {
130 sn = parseSN(message); 135 sn = parseSN(message);
131 } else if (token && data_pelanggan) { 136 } else if (token && data_pelanggan) {
132 sn = token + '/' + data_pelanggan; 137 sn = token + '/' + data_pelanggan;
133 } 138 }
134 139
135 message = 'SN=' + sn + '; ' + message; 140 message = 'SN=' + sn + '; ' + message;
136 } 141 }
137 142
138 callbackReport(task['requestId'], response_code, message); 143 callbackReport(task['requestId'], response_code, message);
139 144
140 if (response_code == '54' || response_code == '68') { 145 if (response_code == '54' || response_code == '68') {
141 setTimeout(function() { 146 setTimeout(function() {
142 topupRequest(task, 5); 147 topupRequest(task, 5);
143 }, 60000); 148 }, 60000);
144 } 149 }
145 150
146 }); 151 });
147 }); 152 });
148 } 153 }
149 154
150 function start(_config, _callbackReport) { 155 function start(_config, _callbackReport) {
151 config = _config; 156 config = _config;
152 callbackReport = _callbackReport 157 callbackReport = _callbackReport
153 } 158 }
154 159
155 function parseSN(message) {
156 var sn_regex = new RegExp(config.h2h_out.sn_pattern);
157 var sn_match = message.match(sn_regex);
158
159 //console.log('SN MATCH:');
160 //console.log(sn_match);
161
162 if (sn_match <= 0) {
163 console.log('SN Not found: ' + message);
164 return '';
165 }
166
167 var sn = sn_match[0];
168 var sn_remove_patterns = config.h2h_out.sn_remove_patterns.split(config.h2h_out.sn_remove_patterns_separator);
169 //console.log('SN REMOVE PATTERNS:');
170 //console.log (sn_remove_patterns);
171
172 var count = sn_remove_patterns.length;
173
174 for(var i = 0; i < count; i++) {
175 sn = sn.replace(sn_remove_patterns[i], '');
176 }
177
178 return sn.trim();
179 }
180
181 function parseResult(message) { 160 function parseResult(message) {
182 var data; 161 var data;
183 xml(message, function(err, result) { 162 xml(message, function(err, result) {
184 data = result; 163 data = result;
185 }); 164 });
186 return data; 165 return data;
187 } 166 }
188 167
1 var assert = require("assert"); 1 var assert = require("assert");
2 2
3 3
4 describe('aaa', function() { 4 describe('aaa', function() {
5 var aaa = require('./aaa'); 5 var aaa = require('./aaa');
6 6
7 describe("#unaliasResponseCode()", function() { 7 describe("#unaliasResponseCode()", function() {
8 it('should return 68', function() { 8 it('should return 68', function() {
9 assert.equal('68', aaa.unaliasResponseCode('01', '01:68')); 9 assert.equal('68', aaa.unaliasResponseCode('01', '01:68'));
10 }); 10 });
11 11
12 it('should return 68', function() { 12 it('should return 68', function() {
13 assert.equal('68', aaa.unaliasResponseCode('68', '01:68')); 13 assert.equal('68', aaa.unaliasResponseCode('68', '01:68'));
14 }); 14 });
15 15
16 it('should return 00', function() { 16 it('should return 00', function() {
17 assert.equal('00', aaa.unaliasResponseCode('00', '01:68')); 17 assert.equal('00', aaa.unaliasResponseCode('00', '01:68'));
18 }); 18 });
19 19
20 it('should return 40', function() { 20 it('should return 40', function() {
21 assert.equal('40', aaa.unaliasResponseCode('40', '')); 21 assert.equal('40', aaa.unaliasResponseCode('40', ''));
22 }); 22 });
23 23
24 it('should return 40', function() { 24 it('should return 40', function() {
25 assert.equal('40', aaa.unaliasResponseCode('40', '')); 25 assert.equal('40', aaa.unaliasResponseCode('40', ''));
26 }); 26 });
27 27
28 it('should return 40', function() { 28 it('should return 40', function() {
29 assert.equal('40', aaa.unaliasResponseCode('40')); 29 assert.equal('40', aaa.unaliasResponseCode('40'));
30 }); 30 });
31 31
32 }); 32 });
33 }); 33 });
34 34
35 describe('httppulsakita', function() { 35 describe('httppulsakita', function() {
36 var partner = require('./httppulsakita'); 36 var partner = require('./httppulsakita');
37 37
38 describe("#parseResult()", function() { 38 describe("#parseResult()", function() {
39 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. \ 39 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. \
40 Sisa saldo Rp. 5,000,000 - Rp. 18,700 = Rp. 4,981,300</pesan></respon>'; 40 Sisa saldo Rp. 5,000,000 - Rp. 18,700 = Rp. 4,981,300</pesan></respon>';
41 41
42 data = partner.parseResult(message); 42 data = partner.parseResult(message);
43 console.log(data); 43 console.log(data);
44 44
45 it('should return 2015/6/16 15:43:35', function() { 45 it('should return 2015/6/16 15:43:35', function() {
46 assert.equal('2015/6/16 15:43:35', data.respon.tanggal); 46 assert.equal('2015/6/16 15:43:35', data.respon.tanggal);
47 }); 47 });
48 }); 48 });
49 49
50 /* 50
51 describe("parseSN()", function() { 51 describe("parseSN()", function() {
52 config = {
53 h2h_out: {
54 parse_sn: 'YES',
55 sn_pattern: 'refnum \\w* pada',
56 sn_remove_patterns_separator: '|',
57 sn_remove_patterns: 'refnum | pada'
58 }
59 };
52 60
53 message = "#14837 XR5 ke:081809903333 SUKSES. Isi pulsa XR5 berhasil untuk nomor 6281809903333 sebesar 5.000, refnum B93D0792A47841AE03B0000000000000 pada tgl 16/06/15 15:47. \ 61 message = "#14837 XR5 ke:081809903333 SUKSES. Isi pulsa XR5 berhasil untuk nomor 6281809903333 sebesar 5.000, refnum B93D0792A47841AE03B0000000000000 pada tgl 16/06/15 15:47. \
54 Sisa saldo Rp. 4,981,300 - Rp. 5,250 = Rp. 4,976,050"; 62 Sisa saldo Rp. 4,981,300 - Rp. 5,250 = Rp. 4,976,050";
55 it ('should return B93D0792A47841AE03B0000000000000', function() { 63 it ('should return B93D0792A47841AE03B0000000000000', function() {
56 assert.equal('B93D0792A47841AE03B0000000000000', parseSN(message)); 64 assert.equal('B93D0792A47841AE03B0000000000000', partner.parseSN(message, config));
57 }); 65 });
58 66
59 }); 67 });
60 */ 68
61 }); 69 });
62 70