Commit 57711acc6a48ce667288f2f360c82c2a3af261a5

Authored by Adhidarma Hadiwinoto
1 parent ed7b354580
Exists in master

perbaikan adm

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