Commit 3e149fe8c6abd655f92f6ef40ee0d613da4a0b15

Authored by Adhidarma Hadiwinoto
1 parent ad69977f75
Exists in master

http.globalAgent.maxSockets = Infinity;

Showing 1 changed file with 1 additions and 0 deletions Inline Diff

1 var fs = require('fs'); 1 var fs = require('fs');
2 var https = require('https'); 2 var https = require('https');
3 var http = require('http'); 3 var http = require('http');
4 var url = require('url'); 4 var url = require('url');
5 var request = require('request'); 5 var request = require('request');
6 var xml2js = require('xml2js').parseString; 6 var xml2js = require('xml2js').parseString;
7 var strftime = require('strftime'); 7 var strftime = require('strftime');
8 var math = require('mathjs'); 8 var math = require('mathjs');
9 var winston = require('winston'); 9 var winston = require('winston');
10 var cekstatus = require('./cekstatus.js'); 10 var cekstatus = require('./cekstatus.js');
11 var mongoClient = require('mongodb').MongoClient; 11 var mongoClient = require('mongodb').MongoClient;
12 var LRU = require('lru-cache'); 12 var LRU = require('lru-cache');
13 13
14 var config; 14 var config;
15 var httpServer; 15 var httpServer;
16 var aaa; 16 var aaa;
17 var logger; 17 var logger;
18 var callbackReport; 18 var callbackReport;
19 var mongodb; 19 var mongodb;
20 20
21 var tasks = LRU(10000); 21 var tasks = LRU(10000);
22 22
23 http.globalAgent.maxSockets = Infinity;
23 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 24 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
24 25
25 var sleep_before_retry = 30000; 26 var sleep_before_retry = 30000;
26 var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096']; 27 var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096'];
27 28
28 var logTag = __filename.split('/').reverse()[0]; 29 var logTag = __filename.split('/').reverse()[0];
29 30
30 function initMongoClient() { 31 function initMongoClient() {
31 if (!config.mongodbstruk || !config.mongodbstruk.url) { 32 if (!config.mongodbstruk || !config.mongodbstruk.url) {
32 return; 33 return;
33 } 34 }
34 35
35 try { 36 try {
36 var url = config.mongodbstruk.url; 37 var url = config.mongodbstruk.url;
37 38
38 mongoClient.connect(url, function(err, db) { 39 mongoClient.connect(url, function(err, db) {
39 if (err) { 40 if (err) {
40 logger.warn('Failed to connect to mongodb', {err: err}); 41 logger.warn('Failed to connect to mongodb', {err: err});
41 return; 42 return;
42 } 43 }
43 mongodb = db; 44 mongodb = db;
44 logger.info('MongoDB connected'); 45 logger.info('MongoDB connected');
45 }); 46 });
46 } 47 }
47 catch(err) { 48 catch(err) {
48 logger.warn('Exception when connecting to mongodb', {err: err, url: url}); 49 logger.warn('Exception when connecting to mongodb', {err: err, url: url});
49 } 50 }
50 51
51 } 52 }
52 53
53 function prepareResultData(result) { 54 function prepareResultData(result) {
54 var task; 55 var task;
55 56
56 var data = {}; 57 var data = {};
57 data.gateway = config.globals.gateway_name; 58 data.gateway = config.globals.gateway_name;
58 59
59 try { 60 try {
60 data.requestId = result.reffid[0].trim(); 61 data.requestId = result.reffid[0].trim();
61 62
62 var key = config.globals.gateway_name + '.rid:' + data.requestId; 63 var key = config.globals.gateway_name + '.rid:' + data.requestId;
63 task = tasks.get(key); 64 task = tasks.get(key);
64 } 65 }
65 catch(err) { data.requestId = null; } 66 catch(err) { data.requestId = null; }
66 67
67 try { 68 try {
68 data.status = result.ResultCode[0].trim(); 69 data.status = result.ResultCode[0].trim();
69 } 70 }
70 catch(err) { data.status = '68' } 71 catch(err) { data.status = '68' }
71 72
72 try { 73 try {
73 data.rcmessage = result.ErrorMsg[0].trim(); 74 data.rcmessage = result.ErrorMsg[0].trim();
74 } 75 }
75 catch(err) { data.rcmessage = ''; } 76 catch(err) { data.rcmessage = ''; }
76 77
77 try { 78 try {
78 data.resptext = ''; 79 data.resptext = '';
79 } 80 }
80 catch(err) { data.resptext = ''; } 81 catch(err) { data.resptext = ''; }
81 82
82 try { 83 try {
83 var ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss') 84 var ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss')
84 data.dt = ts; 85 data.dt = ts;
85 } 86 }
86 catch(err) { 87 catch(err) {
87 logger.warn('Exception when getting timestamp data, using current timestamp', {err: err, result: result, task: task}); 88 logger.warn('Exception when getting timestamp data, using current timestamp', {err: err, result: result, task: task});
88 data.dt = strftime('%Y-%m-%d %H:%M:%S', new Date()); 89 data.dt = strftime('%Y-%m-%d %H:%M:%S', new Date());
89 } 90 }
90 91
91 try { 92 try {
92 data.namapel = result.nama_pel[0].trim(); 93 data.namapel = result.nama_pel[0].trim();
93 } 94 }
94 catch(err) { data.namapel = 'UNKNOWN'; } 95 catch(err) { data.namapel = 'UNKNOWN'; }
95 96
96 try { 97 try {
97 data.msn = result.nsm[0].trim(); 98 data.msn = result.nsm[0].trim();
98 } 99 }
99 catch(err) { data.msn = 'UNKNOWN'; } 100 catch(err) { data.msn = 'UNKNOWN'; }
100 101
101 try { 102 try {
102 data.idpel = result.idpel[0].trim(); 103 data.idpel = result.idpel[0].trim();
103 } 104 }
104 catch(err) { data.idpel = 'UNKNOWN'; } 105 catch(err) { data.idpel = 'UNKNOWN'; }
105 106
106 try { 107 try {
107 data.tarifdaya = result.tarif[0].trim(); 108 data.tarifdaya = result.tarif[0].trim();
108 } 109 }
109 catch(err) { data.tarifdaya = 'UNKNOWN'; } 110 catch(err) { data.tarifdaya = 'UNKNOWN'; }
110 111
111 try { 112 try {
112 data.admin = parseInt(result.adminfee[0].trim()); 113 data.admin = parseInt(result.adminfee[0].trim());
113 } 114 }
114 catch(err) { data.admin = 0; } 115 catch(err) { data.admin = 0; }
115 116
116 try { 117 try {
117 data.adm = parseInt(result.admin_fee[0].trim()); 118 data.adm = parseInt(result.admin_fee[0].trim());
118 } 119 }
119 catch(err) { data.adm = 0; } 120 catch(err) { data.adm = 0; }
120 121
121 try { 122 try {
122 data.hargapelanggan = parseInt(result.amount_trx[0].trim()) - data.adm; 123 data.hargapelanggan = parseInt(result.amount_trx[0].trim()) - data.adm;
123 } 124 }
124 catch(err) { data.hargapelanggan = 0; } 125 catch(err) { data.hargapelanggan = 0; }
125 126
126 try { 127 try {
127 data.jumlahkwh = result.jml_daya[0].trim(); 128 data.jumlahkwh = result.jml_daya[0].trim();
128 } 129 }
129 catch(err) { data.jumlahkwh = 0; } 130 catch(err) { data.jumlahkwh = 0; }
130 131
131 try { 132 try {
132 data.token = result.token[0].trim(); 133 data.token = result.token[0].trim();
133 } 134 }
134 catch(err) { data.token = 0; } 135 catch(err) { data.token = 0; }
135 136
136 try { 137 try {
137 data.ppn = result.ppn_fee[0].trim(); 138 data.ppn = result.ppn_fee[0].trim();
138 } 139 }
139 catch(err) { data.ppn_fee = 0; } 140 catch(err) { data.ppn_fee = 0; }
140 141
141 try { 142 try {
142 data.ppj = result.ppj_fee[0].trim(); 143 data.ppj = result.ppj_fee[0].trim();
143 } 144 }
144 catch(err) { data.ppj = 0; } 145 catch(err) { data.ppj = 0; }
145 146
146 try { 147 try {
147 data.angsuran = result.angsuran_fee[0].trim(); 148 data.angsuran = result.angsuran_fee[0].trim();
148 } 149 }
149 catch(err) { data.angsuran = 0; } 150 catch(err) { data.angsuran = 0; }
150 151
151 try { 152 try {
152 data.meterai = result.materai_fee[0].trim(); 153 data.meterai = result.materai_fee[0].trim();
153 } 154 }
154 catch(err) { data.materai_fee = 0; } 155 catch(err) { data.materai_fee = 0; }
155 156
156 return data; 157 return data;
157 } 158 }
158 159
159 function saveTokenToMongoDb(result) { 160 function saveTokenToMongoDb(result) {
160 if (!mongodb) { 161 if (!mongodb) {
161 return; 162 return;
162 } 163 }
163 164
164 if (!config.mongodbstruk) { 165 if (!config.mongodbstruk) {
165 return; 166 return;
166 } 167 }
167 168
168 if (!config.mongodbstruk.collection) { 169 if (!config.mongodbstruk.collection) {
169 return; 170 return;
170 } 171 }
171 172
172 var data = prepareResultData(result); 173 var data = prepareResultData(result);
173 174
174 try { 175 try {
175 mongodb.collection(config.mongodbstruk.collection).insertOne(data); 176 mongodb.collection(config.mongodbstruk.collection).insertOne(data);
176 } 177 }
177 catch(err) { 178 catch(err) {
178 logger.warn('Error when inserting data to mongodb', {err: err, data: data}); 179 logger.warn('Error when inserting data to mongodb', {err: err, data: data});
179 } 180 }
180 } 181 }
181 182
182 function putTaskToCache(task) { 183 function putTaskToCache(task) {
183 var key = config.globals.gateway_name + '.rid:' + task.requestId; 184 var key = config.globals.gateway_name + '.rid:' + task.requestId;
184 185
185 try { 186 try {
186 tasks.set(key, task); 187 tasks.set(key, task);
187 } 188 }
188 catch(err) { 189 catch(err) {
189 logger.warn('Error writing to task to cache', {err: err, key: key, task: task}); 190 logger.warn('Error writing to task to cache', {err: err, key: key, task: task});
190 } 191 }
191 } 192 }
192 193
193 function topupRequest(task) { 194 function topupRequest(task) {
194 aaa.insertTaskToMongoDb(task); 195 aaa.insertTaskToMongoDb(task);
195 putTaskToCache(task); 196 putTaskToCache(task);
196 197
197 var ts = strftime('%Y%m%d%H%M%S', new Date()); 198 var ts = strftime('%Y%m%d%H%M%S', new Date());
198 199
199 var data = 200 var data =
200 config.h2h_out.userid 201 config.h2h_out.userid
201 + '|' + config.h2h_out.password 202 + '|' + config.h2h_out.password
202 + '|' + task['remoteProduct'] 203 + '|' + task['remoteProduct']
203 + '|' + task['destination'] + '|0'; 204 + '|' + task['destination'] + '|0';
204 205
205 var options = { 206 var options = {
206 url: config.h2h_out.partner, 207 url: config.h2h_out.partner,
207 qs: { 208 qs: {
208 ts: ts, 209 ts: ts,
209 data: data, 210 data: data,
210 reffid: task['requestId'] 211 reffid: task['requestId']
211 } 212 }
212 }; 213 };
213 logger.info('Creating http request', {options: options}); 214 logger.info('Creating http request', {options: options});
214 215
215 request(options, function (error, response, body) { 216 request(options, function (error, response, body) {
216 var responseCode = '40'; 217 var responseCode = '40';
217 var responseMessage = 'Gateway Error'; 218 var responseMessage = 'Gateway Error';
218 219
219 if (error) { 220 if (error) {
220 221
221 logger.warn('HTTP REQUEST ERROR', error); 222 logger.warn('HTTP REQUEST ERROR', error);
222 callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')'); 223 callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')');
223 224
224 } else if (response.statusCode != 200) { 225 } else if (response.statusCode != 200) {
225 226
226 var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')'; 227 var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')';
227 logger.warn(error_message); 228 logger.warn(error_message);
228 callbackReport(task['requestId'], '91', error_message); 229 callbackReport(task['requestId'], '91', error_message);
229 230
230 } else { 231 } else {
231 232
232 logger.info('DIRECT RESPONSE', {requestId: task.requestId, body: body}); 233 logger.info('DIRECT RESPONSE', {requestId: task.requestId, body: body});
233 234
234 xml2js(body, function (err, result) { 235 xml2js(body, function (err, result) {
235 if (err) { 236 if (err) {
236 logger.warn('Error parsing xml response', {requestId: task.requestId, err: err, body: body}); 237 logger.warn('Error parsing xml response', {requestId: task.requestId, err: err, body: body});
237 callbackReport(task['requestId'], '40', body); 238 callbackReport(task['requestId'], '40', body);
238 } else { 239 } else {
239 var directResponse = result; 240 var directResponse = result;
240 logger.verbose('DIRECT RESPONSE from partner parsed', {directResponse: directResponse}); 241 logger.verbose('DIRECT RESPONSE from partner parsed', {directResponse: directResponse});
241 242
242 saveTokenToMongoDb(directResponse.Result); 243 saveTokenToMongoDb(directResponse.Result);
243 244
244 try { 245 try {
245 var result_price; 246 var result_price;
246 try { 247 try {
247 result_price = directResponse.Result.Price[0].trim(); 248 result_price = directResponse.Result.Price[0].trim();
248 } 249 }
249 catch(err) { 250 catch(err) {
250 result_price = 0; 251 result_price = 0;
251 } 252 }
252 253
253 var result_error_message; 254 var result_error_message;
254 try { 255 try {
255 result_error_message = directResponse.Result.ErrorMsg[0].trim(); 256 result_error_message = directResponse.Result.ErrorMsg[0].trim();
256 } 257 }
257 catch(err) { 258 catch(err) {
258 result_error_message = ''; 259 result_error_message = '';
259 } 260 }
260 261
261 var resultCode = directResponse.Result.ResultCode[0].trim(); 262 var resultCode = directResponse.Result.ResultCode[0].trim();
262 263
263 responseMessage = 264 responseMessage =
264 'ResultCode: ' + resultCode 265 'ResultCode: ' + resultCode
265 + ' | ErrorMsg: ' + result_error_message 266 + ' | ErrorMsg: ' + result_error_message
266 + ' | DateTime: ' + directResponse.Result.DateTime[0].trim() 267 + ' | DateTime: ' + directResponse.Result.DateTime[0].trim()
267 + ' | nsm: ' + directResponse.Result.nsm[0].trim() 268 + ' | nsm: ' + directResponse.Result.nsm[0].trim()
268 + ' | idpel: ' + directResponse.Result.idpel[0].trim() 269 + ' | idpel: ' + directResponse.Result.idpel[0].trim()
269 + ' | reffid: ' + directResponse.Result.reffid[0].trim() 270 + ' | reffid: ' + directResponse.Result.reffid[0].trim()
270 + ' | TransID: ' + directResponse.Result.TransID[0].trim() 271 + ' | TransID: ' + directResponse.Result.TransID[0].trim()
271 + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim() 272 + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim()
272 + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim() 273 + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim()
273 + ' | token: ' + directResponse.Result.token[0].trim() 274 + ' | token: ' + directResponse.Result.token[0].trim()
274 + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim() 275 + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim()
275 + ' | Price: ' + result_price 276 + ' | Price: ' + result_price
276 + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim() 277 + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim()
277 ; 278 ;
278 279
279 logger.info('Response message: ' + responseMessage); 280 logger.info('Response message: ' + responseMessage);
280 281
281 if ( (resultCode == '0099') && (result_error_message.search(/METER .* YANG ANDA MASUKAN SALAH/) >= 0) ) { 282 if ( (resultCode == '0099') && (result_error_message.search(/METER .* YANG ANDA MASUKAN SALAH/) >= 0) ) {
282 callbackReport(task.requestId, '14', responseMessage); 283 callbackReport(task.requestId, '14', responseMessage);
283 return; 284 return;
284 } 285 }
285 else if ( (resultCode == '0099') && (result_error_message.search(/IDPEL .* YANG ANDA MASUKAN SALAH/) >= 0) ) { 286 else if ( (resultCode == '0099') && (result_error_message.search(/IDPEL .* YANG ANDA MASUKAN SALAH/) >= 0) ) {
286 callbackReport(task.requestId, '14', responseMessage); 287 callbackReport(task.requestId, '14', responseMessage);
287 return; 288 return;
288 } 289 }
289 else if ( (resultCode == '0099') && (result_error_message.search(/KONSUMEN .* DIBLOKIR HUBUNGI PLN/) >= 0) ) { 290 else if ( (resultCode == '0099') && (result_error_message.search(/KONSUMEN .* DIBLOKIR HUBUNGI PLN/) >= 0) ) {
290 callbackReport(task.requestId, '77', responseMessage); 291 callbackReport(task.requestId, '77', responseMessage);
291 return; 292 return;
292 } 293 }
293 else if ( (resultCode == '0099') && (result_error_message.search(/TOTAL KWH MELEBIHI BATAS MAKSIMUM/) >= 0) ) { 294 else if ( (resultCode == '0099') && (result_error_message.search(/TOTAL KWH MELEBIHI BATAS MAKSIMUM/) >= 0) ) {
294 callbackReport(task.requestId, '47', responseMessage); 295 callbackReport(task.requestId, '47', responseMessage);
295 return; 296 return;
296 } 297 }
297 else if ( (resultCode == '0099') && (result_error_message.search(/INQUIRY TIMEOUT, SILAHKAN DICOBA KEMBALI/) >= 0) ) { 298 else if ( (resultCode == '0099') && (result_error_message.search(/INQUIRY TIMEOUT, SILAHKAN DICOBA KEMBALI/) >= 0) ) {
298 callbackReport(task.requestId, '91', responseMessage); 299 callbackReport(task.requestId, '91', responseMessage);
299 return; 300 return;
300 } 301 }
301 302
302 if (aaa) { 303 if (aaa) {
303 // update balance 304 // update balance
304 aaa.updateBalance(directResponse.Result.EndBalance[0]); 305 aaa.updateBalance(directResponse.Result.EndBalance[0]);
305 } 306 }
306 307
307 if (resultCode == '0000') { 308 if (resultCode == '0000') {
308 var nama_pelanggan = directResponse.Result.nama_pel[0].trim(); 309 var nama_pelanggan = directResponse.Result.nama_pel[0].trim();
309 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); 310 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-');
310 var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim(); 311 var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim();
311 sn = sn.replace(/\s/g, '-'); 312 sn = sn.replace(/\s/g, '-');
312 313
313 responseMessage = 'SN=' + sn + '; ' + responseMessage; 314 responseMessage = 'SN=' + sn + '; ' + responseMessage;
314 logger.info('New response message: ' + responseMessage); 315 logger.info('New response message: ' + responseMessage);
315 } 316 }
316 317
317 if (pendingResultCode.indexOf(resultCode) != -1) { 318 if (pendingResultCode.indexOf(resultCode) != -1) {
318 callbackReport(task['requestId'], '68', responseMessage); 319 callbackReport(task['requestId'], '68', responseMessage);
319 320
320 /* 321 /*
321 322
322 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); 323 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms');
323 setTimeout(function () { 324 setTimeout(function () {
324 cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport); 325 cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport);
325 }, sleep_before_retry); 326 }, sleep_before_retry);
326 327
327 */ 328 */
328 329
329 return; 330 return;
330 } 331 }
331 332
332 responseCode = resultCode.replace(/^00/, ""); 333 responseCode = resultCode.replace(/^00/, "");
333 334
334 if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') { 335 if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') {
335 responseCode = '91'; 336 responseCode = '91';
336 } 337 }
337 338
338 } 339 }
339 catch(err) { 340 catch(err) {
340 responseCode = '40'; 341 responseCode = '40';
341 responseMessage = 'Invalid response from gateway'; 342 responseMessage = 'Invalid response from gateway';
342 } 343 }
343 } 344 }
344 345
345 callbackReport(task['requestId'], responseCode, responseMessage); 346 callbackReport(task['requestId'], responseCode, responseMessage);
346 }); 347 });
347 } 348 }
348 349
349 //callbackReport(task['requestId'], responseCode, responseMessage); 350 //callbackReport(task['requestId'], responseCode, responseMessage);
350 }); 351 });
351 } 352 }
352 353
353 function callbackFromWebReport(status) { 354 function callbackFromWebReport(status) {
354 if (!status) { 355 if (!status) {
355 logger.warn('Advice from webreport return empty status'); 356 logger.warn('Advice from webreport return empty status');
356 return; 357 return;
357 } 358 }
358 359
359 logger.info('Got advice result from webreport', {status: status}); 360 logger.info('Got advice result from webreport', {status: status});
360 361
361 var responseCode = '68'; 362 var responseCode = '68';
362 363
363 var result_price = 0; 364 var result_price = 0;
364 try { 365 try {
365 result_price = directResponse.Result.Price[0].trim(); 366 result_price = directResponse.Result.Price[0].trim();
366 } 367 }
367 catch(err) {} 368 catch(err) {}
368 369
369 var errorMsg = ''; 370 var errorMsg = '';
370 try { 371 try {
371 errorMsg = status.response.errormsg[0]; 372 errorMsg = status.response.errormsg[0];
372 } 373 }
373 catch(err) {} 374 catch(err) {}
374 375
375 var responseMessage = ''; 376 var responseMessage = '';
376 try { 377 try {
377 responseMessage = 378 responseMessage =
378 'Hasil advice dari webreport ' 379 'Hasil advice dari webreport '
379 + 'ResultCode: ' + status.response.resultcode[0] 380 + 'ResultCode: ' + status.response.resultcode[0]
380 } 381 }
381 catch(err) { 382 catch(err) {
382 logger.warn('Error parsing ResultCode from webreport advice.', {err: err}); 383 logger.warn('Error parsing ResultCode from webreport advice.', {err: err});
383 } 384 }
384 385
385 try { 386 try {
386 responseMessage = 387 responseMessage =
387 responseMessage 388 responseMessage
388 + ' | ErrorMsg: ' + errorMsg 389 + ' | ErrorMsg: ' + errorMsg
389 } 390 }
390 catch(err) { 391 catch(err) {
391 logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err}); 392 logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err});
392 } 393 }
393 394
394 try { 395 try {
395 responseMessage = 396 responseMessage =
396 responseMessage 397 responseMessage
397 + ' | TrxDate: ' + status.trxDate; 398 + ' | TrxDate: ' + status.trxDate;
398 } 399 }
399 catch(err) { 400 catch(err) {
400 logger.warn('Error parsing TrxDate from webreport advice.', {err: err}); 401 logger.warn('Error parsing TrxDate from webreport advice.', {err: err});
401 } 402 }
402 403
403 try { 404 try {
404 responseMessage = 405 responseMessage =
405 responseMessage 406 responseMessage
406 + ' | UpdateDate: ' + status.updateDate; 407 + ' | UpdateDate: ' + status.updateDate;
407 408
408 } 409 }
409 catch(err) { 410 catch(err) {
410 logger.warn('Error parsing UpdateDate from webreport advice.', {err: err}); 411 logger.warn('Error parsing UpdateDate from webreport advice.', {err: err});
411 } 412 }
412 413
413 try { 414 try {
414 responseMessage = 415 responseMessage =
415 responseMessage 416 responseMessage
416 + ' | nsm: ' + status.response.nsm[0]; 417 + ' | nsm: ' + status.response.nsm[0];
417 } 418 }
418 catch(err) { 419 catch(err) {
419 logger.warn('Error parsing nsm from webreport advice.', {err: err}); 420 logger.warn('Error parsing nsm from webreport advice.', {err: err});
420 } 421 }
421 422
422 try { 423 try {
423 responseMessage = 424 responseMessage =
424 responseMessage 425 responseMessage
425 + ' | idpel: ' + status.response.idpel[0]; 426 + ' | idpel: ' + status.response.idpel[0];
426 } 427 }
427 catch(err) { 428 catch(err) {
428 logger.warn('Error parsing idpel from webreport advice.', {err: err}); 429 logger.warn('Error parsing idpel from webreport advice.', {err: err});
429 } 430 }
430 431
431 try { 432 try {
432 responseMessage = 433 responseMessage =
433 responseMessage 434 responseMessage
434 + ' | reffid: ' + status.response.reffid[0].trim(); 435 + ' | reffid: ' + status.response.reffid[0].trim();
435 } 436 }
436 catch(err) { 437 catch(err) {
437 logger.warn('Error parsing reffid from webreport advice.', {err: err}); 438 logger.warn('Error parsing reffid from webreport advice.', {err: err});
438 } 439 }
439 440
440 try { 441 try {
441 responseMessage = 442 responseMessage =
442 responseMessage 443 responseMessage
443 + ' | TransID: ' + status.response.transid[0].trim(); 444 + ' | TransID: ' + status.response.transid[0].trim();
444 } 445 }
445 catch(err) { 446 catch(err) {
446 logger.warn('Error parsing TransID from webreport advice.', {err: err}); 447 logger.warn('Error parsing TransID from webreport advice.', {err: err});
447 } 448 }
448 449
449 try { 450 try {
450 responseMessage = 451 responseMessage =
451 responseMessage 452 responseMessage
452 + ' | reff_switching: ' + status.response.reff_switching[0]; 453 + ' | reff_switching: ' + status.response.reff_switching[0];
453 } 454 }
454 catch(err) { 455 catch(err) {
455 logger.warn('Error parsing reff_switching from webreport advice.', {err: err}); 456 logger.warn('Error parsing reff_switching from webreport advice.', {err: err});
456 } 457 }
457 458
458 try { 459 try {
459 responseMessage = 460 responseMessage =
460 responseMessage 461 responseMessage
461 + ' | amount_trx: ' + status.response.amount_trx[0]; 462 + ' | amount_trx: ' + status.response.amount_trx[0];
462 } 463 }
463 catch(err) { 464 catch(err) {
464 logger.warn('Error parsing amount_trx from webreport advice.', {err: err}); 465 logger.warn('Error parsing amount_trx from webreport advice.', {err: err});
465 } 466 }
466 467
467 try { 468 try {
468 responseMessage = 469 responseMessage =
469 responseMessage 470 responseMessage
470 + ' | token: ' + status.response.token[0]; 471 + ' | token: ' + status.response.token[0];
471 } 472 }
472 catch(err) { 473 catch(err) {
473 logger.warn('Error parsing token from webreport advice.', {err: err}); 474 logger.warn('Error parsing token from webreport advice.', {err: err});
474 } 475 }
475 476
476 try { 477 try {
477 responseMessage = 478 responseMessage =
478 responseMessage 479 responseMessage
479 + ' | PrevBalance: ' + status.response.prevbalance[0]; 480 + ' | PrevBalance: ' + status.response.prevbalance[0];
480 } 481 }
481 catch(err) { 482 catch(err) {
482 logger.warn('Error parsing PrevBalance from webreport advice.', {err: err}); 483 logger.warn('Error parsing PrevBalance from webreport advice.', {err: err});
483 } 484 }
484 485
485 try { 486 try {
486 responseMessage = 487 responseMessage =
487 responseMessage 488 responseMessage
488 + ' | Price: ' + status.amount; 489 + ' | Price: ' + status.amount;
489 } 490 }
490 catch(err) { 491 catch(err) {
491 logger.warn('Error parsing Price from webreport advice.', {err: err}); 492 logger.warn('Error parsing Price from webreport advice.', {err: err});
492 } 493 }
493 494
494 try { 495 try {
495 responseMessage = 496 responseMessage =
496 responseMessage 497 responseMessage
497 + ' | EndBalance: ' + status.response.endbalance[0]; 498 + ' | EndBalance: ' + status.response.endbalance[0];
498 } 499 }
499 catch(err) { 500 catch(err) {
500 logger.warn('Error parsing EndBalance from webreport advice.', {err: err}); 501 logger.warn('Error parsing EndBalance from webreport advice.', {err: err});
501 } 502 }
502 503
503 504
504 if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) { 505 if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) {
505 responseCode = '00'; 506 responseCode = '00';
506 507
507 var nama_pelanggan = status.response.nama_pel[0] ; 508 var nama_pelanggan = status.response.nama_pel[0] ;
508 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); 509 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-');
509 510
510 var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA/' + status.response.jml_daya[0]; 511 var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA/' + status.response.jml_daya[0];
511 responseMessage = 'SN=' + sn + '; ' + responseMessage; 512 responseMessage = 'SN=' + sn + '; ' + responseMessage;
512 513
513 } else if ((status.status == 'P') || (status.status == 'W')) { 514 } else if ((status.status == 'P') || (status.status == 'W')) {
514 515
515 callbackReport(status.response.reffid[0].trim(), '68', responseMessage); 516 callbackReport(status.response.reffid[0].trim(), '68', responseMessage);
516 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); 517 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms');
517 518
518 setTimeout(function () { 519 setTimeout(function () {
519 520
520 cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport); 521 cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport);
521 522
522 }, sleep_before_retry); 523 }, sleep_before_retry);
523 return; 524 return;
524 525
525 } else { 526 } else {
526 responseCode = status.response.resultcode[0].replace(/^00/, ""); 527 responseCode = status.response.resultcode[0].replace(/^00/, "");
527 if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) { 528 if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) {
528 responseCode = '40'; 529 responseCode = '40';
529 } 530 }
530 } 531 }
531 532
532 533
533 callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage); 534 callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage);
534 } 535 }
535 536
536 function createHttpReportServer() { 537 function createHttpReportServer() {
537 var httpServer = http.createServer(function(request, response) { 538 var httpServer = http.createServer(function(request, response) {
538 var qs = url.parse(request.url, true).query; 539 var qs = url.parse(request.url, true).query;
539 var path = url.parse(request.url).pathname; 540 var path = url.parse(request.url).pathname;
540 541
541 logger.info('Got reverse report from partner', {path: path, qs: qs}); 542 logger.info('Got reverse report from partner', {path: path, qs: qs});
542 response.end('OK'); 543 response.end('OK');
543 544
544 var requestId = qs.reffid; 545 var requestId = qs.reffid;
545 var resultCode = qs.rescode; 546 var resultCode = qs.rescode;
546 547
547 if (requestId && resultCode && resultCode != '0') { 548 if (requestId && resultCode && resultCode != '0') {
548 if (pendingResultCode.indexOf(resultCode) >= 0) { 549 if (pendingResultCode.indexOf(resultCode) >= 0) {
549 callbackReport(requestId, '68', 'Got reverse report: ' + qs.msg); 550 callbackReport(requestId, '68', 'Got reverse report: ' + qs.msg);
550 } else { 551 } else {
551 callbackReport(requestId, '40', 'Got reverse report: ' + qs.msg); 552 callbackReport(requestId, '40', 'Got reverse report: ' + qs.msg);
552 } 553 }
553 return; 554 return;
554 } 555 }
555 556
556 var trxid; 557 var trxid;
557 try { 558 try {
558 trxid = qs.transid; 559 trxid = qs.transid;
559 } 560 }
560 catch(err) { 561 catch(err) {
561 } 562 }
562 563
563 /* 564 /*
564 if (trxid) { 565 if (trxid) {
565 logger.info('Requesting advice from webreport', {trxid: trxid}) 566 logger.info('Requesting advice from webreport', {trxid: trxid})
566 cekstatus.advice({trxid: trxid}, callbackFromWebReport); 567 cekstatus.advice({trxid: trxid}, callbackFromWebReport);
567 } 568 }
568 */ 569 */
569 570
570 }); 571 });
571 572
572 httpServer.listen(config.h2h_out.listen_port, function() { 573 httpServer.listen(config.h2h_out.listen_port, function() {
573 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 574 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
574 }); 575 });
575 } 576 }
576 577
577 function start(options) { 578 function start(options) {
578 if (!options) { 579 if (!options) {
579 console.log('Undefined options, terminating....'); 580 console.log('Undefined options, terminating....');
580 process.exit(1); 581 process.exit(1);
581 } 582 }
582 583
583 if (options.config) { 584 if (options.config) {
584 config = options.config; 585 config = options.config;
585 } else { 586 } else {
586 console.log('Undefined options.config, terminating....') 587 console.log('Undefined options.config, terminating....')
587 process.exit(1); 588 process.exit(1);
588 } 589 }
589 590
590 if (options.aaa) { 591 if (options.aaa) {
591 aaa = options.aaa; 592 aaa = options.aaa;
592 callbackReport = options.aaa.callbackReportWithPushToMongoDb; 593 callbackReport = options.aaa.callbackReportWithPushToMongoDb;
593 } else { 594 } else {
594 console.log('Undefined options.aaa, terminating....') 595 console.log('Undefined options.aaa, terminating....')
595 process.exit(1); 596 process.exit(1);
596 } 597 }
597 598
598 if (options && options.logger) { 599 if (options && options.logger) {
599 logger = options.logger; 600 logger = options.logger;
600 } else { 601 } else {
601 logger = new winston.Logger({ 602 logger = new winston.Logger({
602 transports: [ 603 transports: [
603 new (winston.transports.Console)() 604 new (winston.transports.Console)()
604 ] 605 ]
605 }); 606 });
606 } 607 }
607 608
608 cekstatus.setLogger(logger); 609 cekstatus.setLogger(logger);
609 610
610 createHttpReportServer(); 611 createHttpReportServer();
611 initMongoClient(); 612 initMongoClient();
612 } 613 }
613 614
614 exports.start = start; 615 exports.start = start;
615 exports.topupRequest = topupRequest; 616 exports.topupRequest = topupRequest;
616 617