Commit 9330f4fe805b3bc784fe0d4187fa0408c4836abc

Authored by Adhidarma Hadiwinoto
1 parent d5ec362d6f
Exists in master

perbaikan sn dengan spasi

Showing 1 changed file with 8 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 = '';
178
177 if (data['MESSAGE'].search(/^SN=.+;/) == -1) { 179 if (data['MESSAGE'].search(/^SN=.+;/) == -1) {
178 if (data['SN'] && data['SN'].trim()) { 180 if (data['SN'] && data['SN'].trim()) {
181 sn = data['SN'].trim();
179 return 'SN=' + data['SN'].trim() + '; ' + data['MESSAGE']; 182 return 'SN=' + data['SN'].trim() + '; ' + data['MESSAGE'];
180 } 183 }
181 else if (config.h2h_out.parse_sn == 'YES') { 184 else if (config.h2h_out.parse_sn == 'YES') {
182 return 'SN=' + parseSN(data['MESSAGE']) + '; ' + data['MESSAGE']; 185 sn = parseSN(data['MESSAGE']);
183 } 186 }
187
188 sn = sn.replace(/ /g, '-');
189
190 return 'SN=' + sn + '; ' + data['MESSAGE'];
184 } 191 }
185 192
186 return data['MESSAGE']; 193 return data['MESSAGE'];
187 } 194 }
188 195
189 function createServer() { 196 function createServer() {
190 197
191 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port); 198 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
192 var serverOptions = { 199 var serverOptions = {
193 port: config.h2h_out.listen_port 200 port: config.h2h_out.listen_port
194 }; 201 };
195 202
196 var server = xmlrpc.createServer(serverOptions); 203 var server = xmlrpc.createServer(serverOptions);
197 204
198 server.on('NotFound', function (method, params) { 205 server.on('NotFound', function (method, params) {
199 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params}); 206 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
200 }); 207 });
201 208
202 server.on('topUpReport', function (err, params, callback) { 209 server.on('topUpReport', function (err, params, callback) {
203 210
204 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params}); 211 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
205 212
206 var paramscount = params.length; 213 var paramscount = params.length;
207 for (var i = 0; i < paramscount; i++) { 214 for (var i = 0; i < paramscount; i++) {
208 var value = params[i]; 215 var value = params[i];
209 216
210 if (value['RESPONSECODE'] == '94') { 217 if (value['RESPONSECODE'] == '94') {
211 logger.info('Change RC 94 to 68'); 218 logger.info('Change RC 94 to 68');
212 value['RESPONSECODE'] = '68'; 219 value['RESPONSECODE'] = '68';
213 } 220 }
214 221
215 var msg = prefixMessageWithSN(value); 222 var msg = prefixMessageWithSN(value);
216 223
217 callbackReport( 224 callbackReport(
218 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value}) 225 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value})
219 ); 226 );
220 } 227 }
221 228
222 callback(null, 'ACK REPORT OK'); 229 callback(null, 'ACK REPORT OK');
223 }) 230 })
224 231
225 } 232 }
226 233
227 function createPlainHttpServer() { 234 function createPlainHttpServer() {
228 logger.info('Creating IRS HTTP server on port ' + config.h2h_out.listen_port); 235 logger.info('Creating IRS HTTP server on port ' + config.h2h_out.listen_port);
229 236
230 var httpServer = http.createServer(function(request, response) { 237 var httpServer = http.createServer(function(request, response) {
231 238
232 var qs = url.parse(request.url, true).query; 239 var qs = url.parse(request.url, true).query;
233 logger.info('Got reverse report from gateway', {qs: qs}); 240 logger.info('Got reverse report from gateway', {qs: qs});
234 241
235 var request_id = qs.clientid; 242 var request_id = qs.clientid;
236 243
237 var rc = irsRc[qs.statuscode] || '68'; 244 var rc = irsRc[qs.statuscode] || '68';
238 245
239 var msg = qs.msg + '. STATUSCODE:' + qs.statuscode; 246 var msg = qs.msg + '. STATUSCODE:' + qs.statuscode;
240 247
241 if (rc == '00' && qs.sn) { 248 if (rc == '00' && qs.sn) {
242 msg = 'SN=' + qs.sn.trim() + '; ' + msg; 249 msg = 'SN=' + qs.sn.trim() + '; ' + msg;
243 } 250 }
244 251
245 response.end('OK'); 252 response.end('OK');
246 253
247 callbackReport(request_id, rc, msg); 254 callbackReport(request_id, rc, msg);
248 255
249 }); 256 });
250 257
251 httpServer.listen(config.h2h_out.listen_port, function() { 258 httpServer.listen(config.h2h_out.listen_port, function() {
252 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 259 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
253 }); 260 });
254 } 261 }
255 262
256 function getBalanceFromMessage(message, balance_regex) { 263 function getBalanceFromMessage(message, balance_regex) {
257 if (!balance_regex) { 264 if (!balance_regex) {
258 if (config && config.globals && config.globals.balance_regex) { 265 if (config && config.globals && config.globals.balance_regex) {
259 balance_regex = config.globals.balance_regex; 266 balance_regex = config.globals.balance_regex;
260 } 267 }
261 } 268 }
262 269
263 if (!balance_regex) { 270 if (!balance_regex) {
264 return; 271 return;
265 } 272 }
266 273
267 try { 274 try {
268 var re = new RegExp(balance_regex); 275 var re = new RegExp(balance_regex);
269 var matches = message.match(re); 276 var matches = message.match(re);
270 277
271 var result = matches[1]; 278 var result = matches[1];
272 result = result.replace(/\./g, ''); 279 result = result.replace(/\./g, '');
273 result = result.replace(/,/g, ''); 280 result = result.replace(/,/g, '');
274 281
275 282
276 return Number(result); 283 return Number(result);
277 } 284 }
278 catch(err) { 285 catch(err) {
279 return; 286 return;
280 } 287 }
281 } 288 }
282 289
283 function updateBalance(message) { 290 function updateBalance(message) {
284 var balance = getBalanceFromMessage(message); 291 var balance = getBalanceFromMessage(message);
285 if (balance) { 292 if (balance) {
286 logger.info('Balance: ' + balance); 293 logger.info('Balance: ' + balance);
287 aaa.updateBalance(balance); 294 aaa.updateBalance(balance);
288 } 295 }
289 } 296 }
290 297
291 function checkStatus(task) { 298 function checkStatus(task) {
292 299
293 if (Number(config.globals.topup_request_on_check_status)) { 300 if (Number(config.globals.topup_request_on_check_status)) {
294 _topupRequest(task, true); 301 _topupRequest(task, true);
295 return; 302 return;
296 } 303 }
297 304
298 var partnerUrl = url.parse(config.h2h_out.partner); 305 var partnerUrl = url.parse(config.h2h_out.partner);
299 var clientOptions = { 306 var clientOptions = {
300 host: partnerUrl.hostname 307 host: partnerUrl.hostname
301 , port: partnerUrl.port 308 , port: partnerUrl.port
302 , path: partnerUrl.pathname 309 , path: partnerUrl.pathname
303 }; 310 };
304 logger.info('XMLRPC client options:'); 311 logger.info('XMLRPC client options:');
305 logger.info(clientOptions); 312 logger.info(clientOptions);
306 313
307 var client; 314 var client;
308 if (partnerUrl.protocol == 'https:') { 315 if (partnerUrl.protocol == 'https:') {
309 client = xmlrpc.createSecureClient(clientOptions); 316 client = xmlrpc.createSecureClient(clientOptions);
310 } else { 317 } else {
311 client = xmlrpc.createClient(clientOptions); 318 client = xmlrpc.createClient(clientOptions);
312 } 319 }
313 320
314 var methodName = 'topUpInquiry'; 321 var methodName = 'topUpInquiry';
315 322
316 var params = { 323 var params = {
317 REQUESTID: task['requestId'], 324 REQUESTID: task['requestId'],
318 MSISDN: config.h2h_out.userid, 325 MSISDN: config.h2h_out.userid,
319 PIN: config.h2h_out.password, 326 PIN: config.h2h_out.password,
320 NOHP: task['destination'] 327 NOHP: task['destination']
321 }; 328 };
322 329
323 logger.info('Requesting topUpInquiry', {params: params}); 330 logger.info('Requesting topUpInquiry', {params: params});
324 331
325 client.methodCall(methodName, [ params ], function (error, value) { 332 client.methodCall(methodName, [ params ], function (error, value) {
326 // Results of the method response 333 // Results of the method response
327 if (error) { 334 if (error) {
328 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params}); 335 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params});
329 callbackReport( 336 callbackReport(
330 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error}) 337 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error})
331 ); 338 );
332 return; 339 return;
333 } 340 }
334 logger.info('Method response for \'' + methodName, {response: value}); 341 logger.info('Method response for \'' + methodName, {response: value});
335 342
336 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value})); 343 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value}));
337 }); 344 });
338 } 345 }
339 346
340 function start(options) { 347 function start(options) {
341 if (!options) { 348 if (!options) {
342 console.log('Undefined options, terminating....'); 349 console.log('Undefined options, terminating....');
343 process.exit(1); 350 process.exit(1);
344 } 351 }
345 352
346 if (options.config) { 353 if (options.config) {
347 config = options.config; 354 config = options.config;
348 } else { 355 } else {
349 console.log('Undefined options.config, terminating....') 356 console.log('Undefined options.config, terminating....')
350 process.exit(1); 357 process.exit(1);
351 } 358 }
352 359
353 if (options.aaa) { 360 if (options.aaa) {
354 aaa = options.aaa; 361 aaa = options.aaa;
355 _callbackReport = options.aaa.callbackReportWithPushToMongoDb; 362 _callbackReport = options.aaa.callbackReportWithPushToMongoDb;
356 } else { 363 } else {
357 console.log('Undefined options.aaa, terminating....') 364 console.log('Undefined options.aaa, terminating....')
358 process.exit(1); 365 process.exit(1);
359 } 366 }
360 367
361 if (options && options.logger) { 368 if (options && options.logger) {
362 logger = options.logger; 369 logger = options.logger;
363 } else { 370 } else {
364 logger = new winston.Logger({ 371 logger = new winston.Logger({
365 transports: [ 372 transports: [
366 new (winston.transports.Console)() 373 new (winston.transports.Console)()
367 ] 374 ]
368 }); 375 });
369 } 376 }
370 377
371 createRedisClient(config.globals.redis_host, config.globals.redis_port); 378 createRedisClient(config.globals.redis_host, config.globals.redis_port);
372 379
373 if (!Number(config.h2h_out.irs_mode)) { 380 if (!Number(config.h2h_out.irs_mode)) {
374 createServer(); 381 createServer();
375 } 382 }
376 else { 383 else {
377 createPlainHttpServer(); 384 createPlainHttpServer();
378 } 385 }
379 386
380 387
381 var resendDelayOptions = { 388 var resendDelayOptions = {
382 config: config, 389 config: config,
383 topupRequest: checkStatus, 390 topupRequest: checkStatus,
384 logger: logger 391 logger: logger
385 }; 392 };
386 393
387 if (Number(config.globals.topup_request_on_resend_delay)) { 394 if (Number(config.globals.topup_request_on_resend_delay)) {
388 resendDelayOptions.topupRequest = topupRequest; 395 resendDelayOptions.topupRequest = topupRequest;
389 } 396 }
390 397
391 resendDelay.init(resendDelayOptions); 398 resendDelay.init(resendDelayOptions);
392 } 399 }
393 400
394 function parseSN(message, _config) { 401 function parseSN(message, _config) {
395 402
396 if (!_config) { 403 if (!_config) {
397 _config = config; 404 _config = config;
398 } 405 }
399 406
400 var sn_regex = new RegExp(_config.h2h_out.sn_pattern); 407 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
401 var sn_match = message.match(sn_regex); 408 var sn_match = message.match(sn_regex);
402 409
403 if (sn_match <= 0) { 410 if (sn_match <= 0) {
404 logger.info('SN Not found: ' + message); 411 logger.info('SN Not found: ' + message);
405 return ''; 412 return '';
406 } 413 }
407 414
408 var match_index = 0; 415 var match_index = 0;
409 if (_config.h2h_out.sn_match_index) { 416 if (_config.h2h_out.sn_match_index) {
410 match_index = Number(_config.h2h_out.sn_match_index); 417 match_index = Number(_config.h2h_out.sn_match_index);
411 } 418 }
412 419
413 var sn = sn_match[match_index]; 420 var sn = sn_match[match_index];
414 421
415 if (_config.h2h_out.sn_remove_whitespace) { 422 if (_config.h2h_out.sn_remove_whitespace) {
416 sn = sn.replace(/\s/g, ''); 423 sn = sn.replace(/\s/g, '');
417 } 424 }
418 425
419 var sn_remove_patterns = []; 426 var sn_remove_patterns = [];
420 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) { 427 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) {
421 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); 428 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
422 } 429 }
423 var count = sn_remove_patterns.length; 430 var count = sn_remove_patterns.length;
424 431
425 for(var i = 0; i < count; i++) { 432 for(var i = 0; i < count; i++) {
426 433
427 //sn = sn.replace(sn_remove_patterns[i], ''); 434 //sn = sn.replace(sn_remove_patterns[i], '');
428 435
429 var re = new RegExp(sn_remove_patterns[i], 'g'); 436 var re = new RegExp(sn_remove_patterns[i], 'g');
430 sn = sn.replace(re, ''); 437 sn = sn.replace(re, '');
431 } 438 }
432 439
433 //sn = paddingSN(sn, _config); 440 //sn = paddingSN(sn, _config);
434 441
435 return sn.trim(); 442 return sn.trim();
436 } 443 }
437 444
438 function getTaskKey(task, chipInfo) { 445 function getTaskKey(task, chipInfo) {
439 var requestId; 446 var requestId;
440 447
441 if (typeof task === 'string') { 448 if (typeof task === 'string') {
442 requestId = task; 449 requestId = task;
443 } else { 450 } else {
444 try { 451 try {
445 requestId = task.requestId; 452 requestId = task.requestId;
446 } 453 }
447 catch(e) { 454 catch(e) {
448 logger.warn('Something wrong', {task: task}); 455 logger.warn('Something wrong', {task: task});
449 console.trace('Cekidot'); 456 console.trace('Cekidot');
450 process.exit(1); 457 process.exit(1);
451 } 458 }
452 459
453 } 460 }
454 461
455 if (!chipInfo && config && config.globals && config.globals.gateway_name) { 462 if (!chipInfo && config && config.globals && config.globals.gateway_name) {
456 chipInfo = config.globals.gateway_name; 463 chipInfo = config.globals.gateway_name;
457 } 464 }
458 465
459 return chipInfo + '.hitachi.rid:' + requestId; 466 return chipInfo + '.hitachi.rid:' + requestId;
460 } 467 }
461 468
462 469
463 function putTaskToHistory(task, cb) { 470 function putTaskToHistory(task, cb) {
464 if (Number(config.globals.no_dupe_check)) { 471 if (Number(config.globals.no_dupe_check)) {
465 if (cb) { cb(); } 472 if (cb) { cb(); }
466 return; 473 return;
467 } 474 }
468 var key = getTaskKey(task, config.globals.gateway_name); 475 var key = getTaskKey(task, config.globals.gateway_name);
469 logger.verbose('Saving task to history LRU', {key: key, task: task}); 476 logger.verbose('Saving task to history LRU', {key: key, task: task});
470 477
471 try { 478 try {
472 taskHistory.set(key, JSON.parse(JSON.stringify(task))); 479 taskHistory.set(key, JSON.parse(JSON.stringify(task)));
473 } catch (e) { } 480 } catch (e) { }
474 481
475 putTaskToRedis(task, cb); 482 putTaskToRedis(task, cb);
476 } 483 }
477 484
478 function putTaskToRedis(task, cb) { 485 function putTaskToRedis(task, cb) {
479 if (!redisClient) { 486 if (!redisClient) {
480 logger.verbose('Not saving to redis because of undefined redisClient') 487 logger.verbose('Not saving to redis because of undefined redisClient')
481 if (cb) { cb(); } 488 if (cb) { cb(); }
482 return; 489 return;
483 } 490 }
484 491
485 var key = getTaskKey(task, config.globals.gateway_name); 492 var key = getTaskKey(task, config.globals.gateway_name);
486 logger.verbose('Saving task to redis', {key: key, task: task}); 493 logger.verbose('Saving task to redis', {key: key, task: task});
487 494
488 redisClient.set(key, JSON.stringify(task), function() { 495 redisClient.set(key, JSON.stringify(task), function() {
489 redisClient.expire(key, 3600*24*30); 496 redisClient.expire(key, 3600*24*30);
490 if (cb) { 497 if (cb) {
491 cb(); 498 cb();
492 } 499 }
493 }); 500 });
494 } 501 }
495 502
496 function getTaskFromHistory(task, cb) { 503 function getTaskFromHistory(task, cb) {
497 logger.verbose('Getting task from history', {task: task}); 504 logger.verbose('Getting task from history', {task: task});
498 var key = getTaskKey(task, config.globals.gateway_name); 505 var key = getTaskKey(task, config.globals.gateway_name);
499 var archive = taskHistory.get(key); 506 var archive = taskHistory.get(key);
500 507
501 if (archive) { 508 if (archive) {
502 if (cb) { cb(null, archive); } 509 if (cb) { cb(null, archive); }
503 } 510 }
504 else { 511 else {
505 getTaskFromRedis(task, cb); 512 getTaskFromRedis(task, cb);
506 } 513 }
507 } 514 }
508 515
509 function getTaskFromRedis(task, cb) { 516 function getTaskFromRedis(task, cb) {
510 if (!redisClient) { 517 if (!redisClient) {
511 if (cb) { cb(null, null); } 518 if (cb) { cb(null, null); }
512 return; 519 return;
513 } 520 }
514 521
515 var key = getTaskKey(task, config.globals.gateway_name); 522 var key = getTaskKey(task, config.globals.gateway_name);
516 redisClient.get(key, function(err, result) { 523 redisClient.get(key, function(err, result) {
517 if (err) { 524 if (err) {
518 logger.warn('Error retrieving task from redis', {err: err}); 525 logger.warn('Error retrieving task from redis', {err: err});
519 cb(err, null); 526 cb(err, null);
520 return; 527 return;
521 } 528 }
522 529
523 var task; 530 var task;
524 try { 531 try {
525 task = JSON.parse(result); 532 task = JSON.parse(result);
526 } 533 }
527 catch(e) { 534 catch(e) {
528 logger.warn('Exception on parsing redis result as a json', {err: e}); 535 logger.warn('Exception on parsing redis result as a json', {err: e});
529 } 536 }
530 537
531 cb(null, task); 538 cb(null, task);
532 }) 539 })
533 } 540 }
534 541
535 exports.start = start; 542 exports.start = start;
536 exports.topupRequest = topupRequest; 543 exports.topupRequest = topupRequest;
537 exports.getBalanceFromMessage = getBalanceFromMessage; 544 exports.getBalanceFromMessage = getBalanceFromMessage;
538 exports.checkStatus = checkStatus; 545 exports.checkStatus = checkStatus;
539 546