Commit d7a34173c47ce8edec9bae340d854e9990865c0a

Authored by Adhidarma Hadiwinoto
1 parent 418ac78505
Exists in master

langsung gagal jika dapat reverse report gagal

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