Commit ed7b35458050219777d371b410afc2a07d17eeb2

Authored by Adhidarma Hadiwinoto
1 parent a097fbf1ce
Exists in master

moment

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