Commit ae9ce259d73db5496dca6fb7da418863dc7b7347

Authored by Adhidarma Hadiwinoto
1 parent 3539394bc9
Exists in master

hapus kurung dari sn

Showing 1 changed file with 3 additions and 1 deletions Inline Diff

1 var http = require('http'); 1 var http = require('http');
2 var xmlrpc = require('xmlrpc'); 2 var xmlrpc = require('xmlrpc');
3 var url = require('url'); 3 var url = require('url');
4 var math = require('mathjs'); 4 var math = require('mathjs');
5 var winston = require('winston'); 5 var winston = require('winston');
6 var redis = require('redis'); 6 var redis = require('redis');
7 var resendDelay = require('sate24/resend-delay.js'); 7 var resendDelay = require('sate24/resend-delay.js');
8 var LRU = require('lru-cache'); 8 var LRU = require('lru-cache');
9 9
10 var aaa; 10 var aaa;
11 var logger; 11 var logger;
12 var config; 12 var config;
13 var _callbackReport; 13 var _callbackReport;
14 var redisClient; 14 var redisClient;
15 15
16 var taskHistory = LRU({max: 500, maxAge: 1000 * 3600 * 2}); 16 var taskHistory = LRU({max: 500, maxAge: 1000 * 3600 * 2});
17 17
18 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 18 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
19 http.globalAgent.maxSockets = Infinity; 19 http.globalAgent.maxSockets = Infinity;
20 20
21 var irsRc = { 21 var irsRc = {
22 '0': '00', 22 '0': '00',
23 '00': '00', 23 '00': '00',
24 '1': '00', 24 '1': '00',
25 '2': '14', 25 '2': '14',
26 '17': '40', 26 '17': '40',
27 '63': '40', 27 '63': '40',
28 '89': '40', 28 '89': '40',
29 '68': '68', 29 '68': '68',
30 '94': '68', 30 '94': '68',
31 '05': '40', 31 '05': '40',
32 '30': '40', 32 '30': '40',
33 '51': '40', 33 '51': '40',
34 '13': '40', 34 '13': '40',
35 '14': '14', 35 '14': '14',
36 '91': '40', 36 '91': '40',
37 '40': '40', 37 '40': '40',
38 '49': '40', 38 '49': '40',
39 '53': '40', 39 '53': '40',
40 '54': '40', 40 '54': '40',
41 '914': '55', 41 '914': '55',
42 '55': '55', 42 '55': '55',
43 '06': '40', 43 '06': '40',
44 '92': '40' 44 '92': '40'
45 } 45 }
46 46
47 function callbackReport(requestId, responseCode, message, dontResendDelay, raw) { 47 function callbackReport(requestId, responseCode, message, dontResendDelay, raw) {
48 var responseToSave = { 48 var responseToSave = {
49 parsed: { 49 parsed: {
50 MESSAGE: message, 50 MESSAGE: message,
51 } 51 }
52 }; 52 };
53 53
54 if (raw) { 54 if (raw) {
55 responseToSave.raw = raw; 55 responseToSave.raw = raw;
56 } else { 56 } else {
57 responseToSave.raw = message; 57 responseToSave.raw = message;
58 } 58 }
59 59
60 if (responseCode != '68' || dontResendDelay) { 60 if (responseCode != '68' || dontResendDelay) {
61 resendDelay.cancel(requestId); 61 resendDelay.cancel(requestId);
62 } else { 62 } else {
63 getTaskFromHistory(requestId, function(err, archivedTask) { 63 getTaskFromHistory(requestId, function(err, archivedTask) {
64 if (archivedTask) { 64 if (archivedTask) {
65 logger.verbose('DEBUG', {archivedTask: archivedTask}); 65 logger.verbose('DEBUG', {archivedTask: archivedTask});
66 resendDelay.register(archivedTask); 66 resendDelay.register(archivedTask);
67 } 67 }
68 }); 68 });
69 } 69 }
70 70
71 _callbackReport(requestId, responseCode, message, null, responseToSave); 71 _callbackReport(requestId, responseCode, message, null, responseToSave);
72 } 72 }
73 73
74 function createRedisClient(host, port) { 74 function createRedisClient(host, port) {
75 if (!host && !port) { 75 if (!host && !port) {
76 logger.info('Not creating redis client because unspecified host or port'); 76 logger.info('Not creating redis client because unspecified host or port');
77 return; 77 return;
78 } 78 }
79 79
80 try { 80 try {
81 redisClient = redis.createClient(port, host); 81 redisClient = redis.createClient(port, host);
82 } catch(err) { 82 } catch(err) {
83 logger.warn("Error creating redis client to " + host + ':' + port); 83 logger.warn("Error creating redis client to " + host + ':' + port);
84 } 84 }
85 } 85 }
86 86
87 function topupRequest(task) { 87 function topupRequest(task) {
88 aaa.insertTaskToMongoDb(task); 88 aaa.insertTaskToMongoDb(task);
89 89
90 getTaskFromHistory(task, function(err, archivedTask) { 90 getTaskFromHistory(task, function(err, archivedTask) {
91 putTaskToHistory(task); 91 putTaskToHistory(task);
92 92
93 if (archivedTask) { 93 if (archivedTask) {
94 logger.info('Task has been executed before, going to checkStatus', {task: task, archivedTask: archivedTask}); 94 logger.info('Task has been executed before, going to checkStatus', {task: task, archivedTask: archivedTask});
95 checkStatus(task); 95 checkStatus(task);
96 } else { 96 } else {
97 _topupRequest(task); 97 _topupRequest(task);
98 } 98 }
99 }); 99 });
100 } 100 }
101 101
102 function _topupRequest(task, pendingOnConnectError) { 102 function _topupRequest(task, pendingOnConnectError) {
103 103
104 if (!aaa.isTodayTrx(task)) { 104 if (!aaa.isTodayTrx(task)) {
105 callbackReport(task.requestId, '68', 'Terdeteksi transaksi beda hari, batal kirim ke supplier. Silahkan cek webreport', true); 105 callbackReport(task.requestId, '68', 'Terdeteksi transaksi beda hari, batal kirim ke supplier. Silahkan cek webreport', true);
106 return; 106 return;
107 } 107 }
108 108
109 var partnerUrl = url.parse(config.h2h_out.partner); 109 var partnerUrl = url.parse(config.h2h_out.partner);
110 var clientOptions = { 110 var clientOptions = {
111 host: partnerUrl.hostname, 111 host: partnerUrl.hostname,
112 port: partnerUrl.port, 112 port: partnerUrl.port,
113 path: partnerUrl.pathname 113 path: partnerUrl.pathname
114 }; 114 };
115 115
116 var client; 116 var client;
117 if (partnerUrl.protocol == 'https:') { 117 if (partnerUrl.protocol == 'https:') {
118 client = xmlrpc.createSecureClient(clientOptions); 118 client = xmlrpc.createSecureClient(clientOptions);
119 } else { 119 } else {
120 client = xmlrpc.createClient(clientOptions); 120 client = xmlrpc.createClient(clientOptions);
121 } 121 }
122 122
123 var params = { 123 var params = {
124 MSISDN: config.h2h_out.userid, 124 MSISDN: config.h2h_out.userid,
125 REQUESTID: task['requestId'], 125 REQUESTID: task['requestId'],
126 PIN: config.h2h_out.password, 126 PIN: config.h2h_out.password,
127 NOHP: task['destination'], 127 NOHP: task['destination'],
128 NOM: task['remoteProduct'] 128 NOM: task['remoteProduct']
129 }; 129 };
130 130
131 var methodName = 'topUpRequest'; 131 var methodName = 'topUpRequest';
132 logger.info('Preparing XMLRPC request', {methodname: methodName, params: params, partnerUrl: partnerUrl.href}); 132 logger.info('Preparing XMLRPC request', {methodname: methodName, params: params, partnerUrl: partnerUrl.href});
133 133
134 client.methodCall(methodName, [ params ], function (error, value) { 134 client.methodCall(methodName, [ params ], function (error, value) {
135 135
136 // Results of the method response 136 // Results of the method response
137 137
138 if (error) { 138 if (error) {
139 var rc = '68'; 139 var rc = '68';
140 var msg = 'XMLRPC Client Error: ' + error; 140 var msg = 'XMLRPC Client Error: ' + error;
141 141
142 if (!pendingOnConnectError && (error.code == 'ECONNREFUSED' || error.code == 'EHOSTUNREACH')) { 142 if (!pendingOnConnectError && (error.code == 'ECONNREFUSED' || error.code == 'EHOSTUNREACH')) {
143 rc = '91'; 143 rc = '91';
144 msg = 'XMLRPC Client Error on connecting'; 144 msg = 'XMLRPC Client Error on connecting';
145 } else if (!pendingOnConnectError && error.code == 'ETIMEDOUT' && error.syscall == "connect") { 145 } else if (!pendingOnConnectError && error.code == 'ETIMEDOUT' && error.syscall == "connect") {
146 rc = '91'; 146 rc = '91';
147 msg = 'XMLRPC Client Error on connecting'; 147 msg = 'XMLRPC Client Error on connecting';
148 } 148 }
149 149
150 logger.warn('XMLRPC Client Error', {methodName: methodName, task: task, err:error}); 150 logger.warn('XMLRPC Client Error', {methodName: methodName, task: task, err:error});
151 151
152 callbackReport(task['requestId'], rc, msg, null, JSON.stringify({methodName: methodName, error: error.toString(), body: error.body})); 152 callbackReport(task['requestId'], rc, msg, null, JSON.stringify({methodName: methodName, error: error.toString(), body: error.body}));
153 return; 153 return;
154 } 154 }
155 155
156 logger.info('Got XMLRPC response from partner for', {methodName: methodName, response_message: value}); 156 logger.info('Got XMLRPC response from partner for', {methodName: methodName, response_message: value});
157 157
158 if (value['RESPONSECODE'] == '94') { 158 if (value['RESPONSECODE'] == '94') {
159 logger.info('Change RC 94 to 68'); 159 logger.info('Change RC 94 to 68');
160 value['RESPONSECODE'] = '68'; 160 value['RESPONSECODE'] = '68';
161 } 161 }
162 162
163 var msg = prefixMessageWithSN(value); 163 var msg = prefixMessageWithSN(value);
164 164
165 callbackReport( 165 callbackReport(
166 task.requestId, value['RESPONSECODE'], msg, null, JSON.stringify({methodName: methodName, response: value}) 166 task.requestId, value['RESPONSECODE'], msg, null, JSON.stringify({methodName: methodName, response: value})
167 ); 167 );
168 }); 168 });
169 } 169 }
170 170
171 function prefixMessageWithSN(data) { 171 function prefixMessageWithSN(data) {
172 172
173 if (data['RESPONSECODE'] != '00') { 173 if (data['RESPONSECODE'] != '00') {
174 return data['MESSAGE']; 174 return data['MESSAGE'];
175 } 175 }
176 176
177 sn = ''; 177 sn = '';
178 178
179 if (data.SN && data.SN.trim()) { 179 if (data.SN && data.SN.trim()) {
180 sn = data['SN'].replace(/ /g, '-').replace(/-*/g, '-').trim(); 180 sn = data['SN'].replace(/ /g, '-');
181 sn = sn.replace(/[\()]/g, '-');
182 sn = sn.replace(/-/g, '-').trim();
181 return 'SN=' + sn + '; ' + data['MESSAGE']; 183 return 'SN=' + sn + '; ' + data['MESSAGE'];
182 } 184 }
183 else if (data['MESSAGE'].search(/^SN=.+;/) == -1) { 185 else if (data['MESSAGE'].search(/^SN=.+;/) == -1) {
184 if (data['SN'] && data['SN'].trim()) { 186 if (data['SN'] && data['SN'].trim()) {
185 sn = data['SN'].trim(); 187 sn = data['SN'].trim();
186 } 188 }
187 else if (config.h2h_out.parse_sn == 'YES') { 189 else if (config.h2h_out.parse_sn == 'YES') {
188 sn = parseSN(data['MESSAGE']); 190 sn = parseSN(data['MESSAGE']);
189 } 191 }
190 192
191 sn = sn.replace(/ /g, '-'); 193 sn = sn.replace(/ /g, '-');
192 194
193 return 'SN=' + sn + '; ' + data['MESSAGE']; 195 return 'SN=' + sn + '; ' + data['MESSAGE'];
194 } 196 }
195 197
196 return data['MESSAGE']; 198 return data['MESSAGE'];
197 } 199 }
198 200
199 function createServer() { 201 function createServer() {
200 202
201 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port); 203 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
202 var serverOptions = { 204 var serverOptions = {
203 port: config.h2h_out.listen_port 205 port: config.h2h_out.listen_port
204 }; 206 };
205 207
206 var server = xmlrpc.createServer(serverOptions); 208 var server = xmlrpc.createServer(serverOptions);
207 209
208 server.on('NotFound', function (method, params) { 210 server.on('NotFound', function (method, params) {
209 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params}); 211 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
210 }); 212 });
211 213
212 server.on('topUpReport', function (err, params, callback) { 214 server.on('topUpReport', function (err, params, callback) {
213 215
214 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params}); 216 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
215 217
216 var paramscount = params.length; 218 var paramscount = params.length;
217 for (var i = 0; i < paramscount; i++) { 219 for (var i = 0; i < paramscount; i++) {
218 var value = params[i]; 220 var value = params[i];
219 221
220 if (value['RESPONSECODE'] == '94') { 222 if (value['RESPONSECODE'] == '94') {
221 logger.info('Change RC 94 to 68'); 223 logger.info('Change RC 94 to 68');
222 value['RESPONSECODE'] = '68'; 224 value['RESPONSECODE'] = '68';
223 } 225 }
224 226
225 var msg = prefixMessageWithSN(value); 227 var msg = prefixMessageWithSN(value);
226 228
227 callbackReport( 229 callbackReport(
228 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value}) 230 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value})
229 ); 231 );
230 } 232 }
231 233
232 callback(null, 'ACK REPORT OK'); 234 callback(null, 'ACK REPORT OK');
233 }) 235 })
234 236
235 } 237 }
236 238
237 function createPlainHttpServer() { 239 function createPlainHttpServer() {
238 logger.info('Creating IRS HTTP server on port ' + config.h2h_out.listen_port); 240 logger.info('Creating IRS HTTP server on port ' + config.h2h_out.listen_port);
239 241
240 var httpServer = http.createServer(function(request, response) { 242 var httpServer = http.createServer(function(request, response) {
241 243
242 var qs = url.parse(request.url, true).query; 244 var qs = url.parse(request.url, true).query;
243 logger.info('Got reverse report from gateway', {qs: qs}); 245 logger.info('Got reverse report from gateway', {qs: qs});
244 246
245 var request_id = qs.clientid; 247 var request_id = qs.clientid;
246 248
247 var rc = irsRc[qs.statuscode] || '68'; 249 var rc = irsRc[qs.statuscode] || '68';
248 250
249 var msg = qs.msg + '. STATUSCODE:' + qs.statuscode; 251 var msg = qs.msg + '. STATUSCODE:' + qs.statuscode;
250 252
251 if (rc == '00' && qs.sn) { 253 if (rc == '00' && qs.sn) {
252 msg = 'SN=' + qs.sn.replace(/ /g, '-').trim() + '; ' + msg; 254 msg = 'SN=' + qs.sn.replace(/ /g, '-').trim() + '; ' + msg;
253 } 255 }
254 256
255 response.end('OK'); 257 response.end('OK');
256 258
257 callbackReport(request_id, rc, msg); 259 callbackReport(request_id, rc, msg);
258 260
259 }); 261 });
260 262
261 httpServer.listen(config.h2h_out.listen_port, function() { 263 httpServer.listen(config.h2h_out.listen_port, function() {
262 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 264 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
263 }); 265 });
264 } 266 }
265 267
266 function getBalanceFromMessage(message, balance_regex) { 268 function getBalanceFromMessage(message, balance_regex) {
267 if (!balance_regex) { 269 if (!balance_regex) {
268 if (config && config.globals && config.globals.balance_regex) { 270 if (config && config.globals && config.globals.balance_regex) {
269 balance_regex = config.globals.balance_regex; 271 balance_regex = config.globals.balance_regex;
270 } 272 }
271 } 273 }
272 274
273 if (!balance_regex) { 275 if (!balance_regex) {
274 return; 276 return;
275 } 277 }
276 278
277 try { 279 try {
278 var re = new RegExp(balance_regex); 280 var re = new RegExp(balance_regex);
279 var matches = message.match(re); 281 var matches = message.match(re);
280 282
281 var result = matches[1]; 283 var result = matches[1];
282 result = result.replace(/\./g, ''); 284 result = result.replace(/\./g, '');
283 result = result.replace(/,/g, ''); 285 result = result.replace(/,/g, '');
284 286
285 287
286 return Number(result); 288 return Number(result);
287 } 289 }
288 catch(err) { 290 catch(err) {
289 return; 291 return;
290 } 292 }
291 } 293 }
292 294
293 function updateBalance(message) { 295 function updateBalance(message) {
294 var balance = getBalanceFromMessage(message); 296 var balance = getBalanceFromMessage(message);
295 if (balance) { 297 if (balance) {
296 logger.info('Balance: ' + balance); 298 logger.info('Balance: ' + balance);
297 aaa.updateBalance(balance); 299 aaa.updateBalance(balance);
298 } 300 }
299 } 301 }
300 302
301 function checkStatus(task) { 303 function checkStatus(task) {
302 304
303 if (Number(config.globals.topup_request_on_check_status)) { 305 if (Number(config.globals.topup_request_on_check_status)) {
304 _topupRequest(task, true); 306 _topupRequest(task, true);
305 return; 307 return;
306 } 308 }
307 309
308 var partnerUrl = url.parse(config.h2h_out.partner); 310 var partnerUrl = url.parse(config.h2h_out.partner);
309 var clientOptions = { 311 var clientOptions = {
310 host: partnerUrl.hostname 312 host: partnerUrl.hostname
311 , port: partnerUrl.port 313 , port: partnerUrl.port
312 , path: partnerUrl.pathname 314 , path: partnerUrl.pathname
313 }; 315 };
314 logger.info('XMLRPC client options:'); 316 logger.info('XMLRPC client options:');
315 logger.info(clientOptions); 317 logger.info(clientOptions);
316 318
317 var client; 319 var client;
318 if (partnerUrl.protocol == 'https:') { 320 if (partnerUrl.protocol == 'https:') {
319 client = xmlrpc.createSecureClient(clientOptions); 321 client = xmlrpc.createSecureClient(clientOptions);
320 } else { 322 } else {
321 client = xmlrpc.createClient(clientOptions); 323 client = xmlrpc.createClient(clientOptions);
322 } 324 }
323 325
324 var methodName = 'topUpInquiry'; 326 var methodName = 'topUpInquiry';
325 327
326 var params = { 328 var params = {
327 REQUESTID: task['requestId'], 329 REQUESTID: task['requestId'],
328 MSISDN: config.h2h_out.userid, 330 MSISDN: config.h2h_out.userid,
329 PIN: config.h2h_out.password, 331 PIN: config.h2h_out.password,
330 NOHP: task['destination'] 332 NOHP: task['destination']
331 }; 333 };
332 334
333 logger.info('Requesting topUpInquiry', {params: params}); 335 logger.info('Requesting topUpInquiry', {params: params});
334 336
335 client.methodCall(methodName, [ params ], function (error, value) { 337 client.methodCall(methodName, [ params ], function (error, value) {
336 // Results of the method response 338 // Results of the method response
337 if (error) { 339 if (error) {
338 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params}); 340 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params});
339 callbackReport( 341 callbackReport(
340 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error}) 342 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error})
341 ); 343 );
342 return; 344 return;
343 } 345 }
344 logger.info('Method response for \'' + methodName, {response: value}); 346 logger.info('Method response for \'' + methodName, {response: value});
345 347
346 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value})); 348 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value}));
347 }); 349 });
348 } 350 }
349 351
350 function start(options) { 352 function start(options) {
351 if (!options) { 353 if (!options) {
352 console.log('Undefined options, terminating....'); 354 console.log('Undefined options, terminating....');
353 process.exit(1); 355 process.exit(1);
354 } 356 }
355 357
356 if (options.config) { 358 if (options.config) {
357 config = options.config; 359 config = options.config;
358 } else { 360 } else {
359 console.log('Undefined options.config, terminating....') 361 console.log('Undefined options.config, terminating....')
360 process.exit(1); 362 process.exit(1);
361 } 363 }
362 364
363 if (options.aaa) { 365 if (options.aaa) {
364 aaa = options.aaa; 366 aaa = options.aaa;
365 _callbackReport = options.aaa.callbackReportWithPushToMongoDb; 367 _callbackReport = options.aaa.callbackReportWithPushToMongoDb;
366 } else { 368 } else {
367 console.log('Undefined options.aaa, terminating....') 369 console.log('Undefined options.aaa, terminating....')
368 process.exit(1); 370 process.exit(1);
369 } 371 }
370 372
371 if (options && options.logger) { 373 if (options && options.logger) {
372 logger = options.logger; 374 logger = options.logger;
373 } else { 375 } else {
374 logger = new winston.Logger({ 376 logger = new winston.Logger({
375 transports: [ 377 transports: [
376 new (winston.transports.Console)() 378 new (winston.transports.Console)()
377 ] 379 ]
378 }); 380 });
379 } 381 }
380 382
381 createRedisClient(config.globals.redis_host, config.globals.redis_port); 383 createRedisClient(config.globals.redis_host, config.globals.redis_port);
382 384
383 if (!Number(config.h2h_out.irs_mode)) { 385 if (!Number(config.h2h_out.irs_mode)) {
384 createServer(); 386 createServer();
385 } 387 }
386 else { 388 else {
387 createPlainHttpServer(); 389 createPlainHttpServer();
388 } 390 }
389 391
390 392
391 var resendDelayOptions = { 393 var resendDelayOptions = {
392 config: config, 394 config: config,
393 topupRequest: checkStatus, 395 topupRequest: checkStatus,
394 logger: logger 396 logger: logger
395 }; 397 };
396 398
397 if (Number(config.globals.topup_request_on_resend_delay)) { 399 if (Number(config.globals.topup_request_on_resend_delay)) {
398 resendDelayOptions.topupRequest = topupRequest; 400 resendDelayOptions.topupRequest = topupRequest;
399 } 401 }
400 402
401 resendDelay.init(resendDelayOptions); 403 resendDelay.init(resendDelayOptions);
402 } 404 }
403 405
404 function parseSN(message, _config) { 406 function parseSN(message, _config) {
405 407
406 if (!_config) { 408 if (!_config) {
407 _config = config; 409 _config = config;
408 } 410 }
409 411
410 var sn_regex = new RegExp(_config.h2h_out.sn_pattern); 412 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
411 var sn_match = message.match(sn_regex); 413 var sn_match = message.match(sn_regex);
412 414
413 if (sn_match <= 0) { 415 if (sn_match <= 0) {
414 logger.info('SN Not found: ' + message); 416 logger.info('SN Not found: ' + message);
415 return ''; 417 return '';
416 } 418 }
417 419
418 var match_index = 0; 420 var match_index = 0;
419 if (_config.h2h_out.sn_match_index) { 421 if (_config.h2h_out.sn_match_index) {
420 match_index = Number(_config.h2h_out.sn_match_index); 422 match_index = Number(_config.h2h_out.sn_match_index);
421 } 423 }
422 424
423 var sn = sn_match[match_index]; 425 var sn = sn_match[match_index];
424 426
425 if (_config.h2h_out.sn_remove_whitespace) { 427 if (_config.h2h_out.sn_remove_whitespace) {
426 sn = sn.replace(/\s/g, ''); 428 sn = sn.replace(/\s/g, '');
427 } 429 }
428 430
429 var sn_remove_patterns = []; 431 var sn_remove_patterns = [];
430 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) { 432 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) {
431 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); 433 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
432 } 434 }
433 var count = sn_remove_patterns.length; 435 var count = sn_remove_patterns.length;
434 436
435 for(var i = 0; i < count; i++) { 437 for(var i = 0; i < count; i++) {
436 438
437 //sn = sn.replace(sn_remove_patterns[i], ''); 439 //sn = sn.replace(sn_remove_patterns[i], '');
438 440
439 var re = new RegExp(sn_remove_patterns[i], 'g'); 441 var re = new RegExp(sn_remove_patterns[i], 'g');
440 sn = sn.replace(re, ''); 442 sn = sn.replace(re, '');
441 } 443 }
442 444
443 //sn = paddingSN(sn, _config); 445 //sn = paddingSN(sn, _config);
444 446
445 return sn.trim(); 447 return sn.trim();
446 } 448 }
447 449
448 function getTaskKey(task, chipInfo) { 450 function getTaskKey(task, chipInfo) {
449 var requestId; 451 var requestId;
450 452
451 if (typeof task === 'string') { 453 if (typeof task === 'string') {
452 requestId = task; 454 requestId = task;
453 } else { 455 } else {
454 try { 456 try {
455 requestId = task.requestId; 457 requestId = task.requestId;
456 } 458 }
457 catch(e) { 459 catch(e) {
458 logger.warn('Something wrong', {task: task}); 460 logger.warn('Something wrong', {task: task});
459 console.trace('Cekidot'); 461 console.trace('Cekidot');
460 process.exit(1); 462 process.exit(1);
461 } 463 }
462 464
463 } 465 }
464 466
465 if (!chipInfo && config && config.globals && config.globals.gateway_name) { 467 if (!chipInfo && config && config.globals && config.globals.gateway_name) {
466 chipInfo = config.globals.gateway_name; 468 chipInfo = config.globals.gateway_name;
467 } 469 }
468 470
469 return chipInfo + '.hitachi.rid:' + requestId; 471 return chipInfo + '.hitachi.rid:' + requestId;
470 } 472 }
471 473
472 474
473 function putTaskToHistory(task, cb) { 475 function putTaskToHistory(task, cb) {
474 if (Number(config.globals.no_dupe_check)) { 476 if (Number(config.globals.no_dupe_check)) {
475 if (cb) { cb(); } 477 if (cb) { cb(); }
476 return; 478 return;
477 } 479 }
478 var key = getTaskKey(task, config.globals.gateway_name); 480 var key = getTaskKey(task, config.globals.gateway_name);
479 logger.verbose('Saving task to history LRU', {key: key, task: task}); 481 logger.verbose('Saving task to history LRU', {key: key, task: task});
480 482
481 try { 483 try {
482 taskHistory.set(key, JSON.parse(JSON.stringify(task))); 484 taskHistory.set(key, JSON.parse(JSON.stringify(task)));
483 } catch (e) { } 485 } catch (e) { }
484 486
485 putTaskToRedis(task, cb); 487 putTaskToRedis(task, cb);
486 } 488 }
487 489
488 function putTaskToRedis(task, cb) { 490 function putTaskToRedis(task, cb) {
489 if (!redisClient) { 491 if (!redisClient) {
490 logger.verbose('Not saving to redis because of undefined redisClient') 492 logger.verbose('Not saving to redis because of undefined redisClient')
491 if (cb) { cb(); } 493 if (cb) { cb(); }
492 return; 494 return;
493 } 495 }
494 496
495 var key = getTaskKey(task, config.globals.gateway_name); 497 var key = getTaskKey(task, config.globals.gateway_name);
496 logger.verbose('Saving task to redis', {key: key, task: task}); 498 logger.verbose('Saving task to redis', {key: key, task: task});
497 499
498 redisClient.set(key, JSON.stringify(task), function() { 500 redisClient.set(key, JSON.stringify(task), function() {
499 redisClient.expire(key, 3600*24*30); 501 redisClient.expire(key, 3600*24*30);
500 if (cb) { 502 if (cb) {
501 cb(); 503 cb();
502 } 504 }
503 }); 505 });
504 } 506 }
505 507
506 function getTaskFromHistory(task, cb) { 508 function getTaskFromHistory(task, cb) {
507 logger.verbose('Getting task from history', {task: task}); 509 logger.verbose('Getting task from history', {task: task});
508 var key = getTaskKey(task, config.globals.gateway_name); 510 var key = getTaskKey(task, config.globals.gateway_name);
509 var archive = taskHistory.get(key); 511 var archive = taskHistory.get(key);
510 512
511 if (archive) { 513 if (archive) {
512 if (cb) { cb(null, archive); } 514 if (cb) { cb(null, archive); }
513 } 515 }
514 else { 516 else {
515 getTaskFromRedis(task, cb); 517 getTaskFromRedis(task, cb);
516 } 518 }
517 } 519 }
518 520
519 function getTaskFromRedis(task, cb) { 521 function getTaskFromRedis(task, cb) {
520 if (!redisClient) { 522 if (!redisClient) {
521 if (cb) { cb(null, null); } 523 if (cb) { cb(null, null); }
522 return; 524 return;
523 } 525 }
524 526
525 var key = getTaskKey(task, config.globals.gateway_name); 527 var key = getTaskKey(task, config.globals.gateway_name);
526 redisClient.get(key, function(err, result) { 528 redisClient.get(key, function(err, result) {
527 if (err) { 529 if (err) {
528 logger.warn('Error retrieving task from redis', {err: err}); 530 logger.warn('Error retrieving task from redis', {err: err});
529 cb(err, null); 531 cb(err, null);
530 return; 532 return;
531 } 533 }
532 534
533 var task; 535 var task;
534 try { 536 try {
535 task = JSON.parse(result); 537 task = JSON.parse(result);
536 } 538 }
537 catch(e) { 539 catch(e) {
538 logger.warn('Exception on parsing redis result as a json', {err: e}); 540 logger.warn('Exception on parsing redis result as a json', {err: e});
539 } 541 }
540 542
541 cb(null, task); 543 cb(null, task);
542 }) 544 })
543 } 545 }
544 546
545 exports.start = start; 547 exports.start = start;
546 exports.topupRequest = topupRequest; 548 exports.topupRequest = topupRequest;
547 exports.getBalanceFromMessage = getBalanceFromMessage; 549 exports.getBalanceFromMessage = getBalanceFromMessage;
548 exports.checkStatus = checkStatus; 550 exports.checkStatus = checkStatus;
549 551