Commit b7e6c0056390ae9f0ba5b02a892494f399be7aba

Authored by Adhidarma Hadiwinoto
1 parent b05d7de6ca
Exists in master

KONSUMEN .* DIBLOKIR HUBUNGI PLN

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

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