Commit 855827cf6e1c835a1f2c22ef5ee2af4b1088c106

Authored by Adhidarma Hadiwinoto
1 parent 57711acc6a
Exists in master

insertTaskToMongoDb dan callbackReportWithPushToMongoDb

Showing 2 changed files with 139 additions and 125 deletions Inline Diff

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