Commit e01ea76b33fa11a36ea4c823aea39d30ad0d5fb4

Authored by Adhidarma Hadiwinoto
1 parent 14c35798bc
Exists in master

perbaikan kekurangan tutup kurawal

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