Commit b099a18e35cac9476b37c15416f591cadc1af47d

Authored by Adhidarma Hadiwinoto
1 parent 7d42bee187
Exists in master

coba save to mongodb

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