Commit 04671bba9f73e07b78f690177da56872669342e1

Authored by Adhidarma Hadiwinoto
1 parent bc5bcfea87
Exists in master

pendingLimit

Showing 1 changed file with 21 additions and 5 deletions Inline Diff

partner-kospinjasa.js
1 var winston = require('winston'); 1 var winston = require('winston');
2 var soap = require('soap'); 2 var soap = require('soap');
3 var crypto = require('crypto'); 3 var crypto = require('crypto');
4 var strftime = require('strftime'); 4 var strftime = require('strftime');
5 var fs = require("fs"); 5 var fs = require("fs");
6 var http = require("http"); 6 var http = require("http");
7 var url = require("url"); 7 var url = require("url");
8 var mongoClient = require('mongodb').MongoClient; 8 var mongoClient = require('mongodb').MongoClient;
9 var moment = require('moment'); 9 var moment = require('moment');
10 10
11 process.chdir(__dirname); 11 process.chdir(__dirname);
12 12
13 var max_retry = 10; 13 var max_retry = 10;
14 var sleep_before_retry = 5000; 14 var sleep_before_retry = 5000;
15 15
16 var config; 16 var config;
17 var matrix; 17 var matrix;
18 var callbackReport; 18 var callbackReport;
19 var aaa; 19 var aaa;
20 var logger; 20 var logger;
21 var options; 21 var options;
22 var mongodb; 22 var mongodb;
23 23
24
25 function start(_config, _callbackReport, options) { 24 function start(_config, _callbackReport, options) {
26 config = _config; 25 config = _config;
27 callbackReport = _callbackReport 26 callbackReport = _callbackReport
28 27
29 if (options && options.aaa) { 28 if (options && options.aaa) {
30 aaa = options.aaa; 29 aaa = options.aaa;
31 } 30 }
32 31
33 if (options && options.logger) { 32 if (options && options.logger) {
34 logger = options.logger; 33 logger = options.logger;
35 } else { 34 } else {
36 logger = new winston.Logger({ 35 logger = new winston.Logger({
37 transports: [ 36 transports: [
38 new (winston.transports.Console)() 37 new (winston.transports.Console)()
39 ] 38 ]
40 }); 39 });
41 } 40 }
42 41
43 if (options && options.matrix) { 42 if (options && options.matrix) {
44 matrix = options.matrix; 43 matrix = options.matrix;
45 } 44 }
46 45
47 initMongoClient(); 46 initMongoClient();
48 } 47 }
49 48
50 function callbackReportWrapper(requestId, responseCode, message, dontIncrement) { 49 function callbackReportWrapper(requestId, responseCode, message, dontIncrement) {
51 callbackReport(requestId, responseCode, message); 50 callbackReport(requestId, responseCode, message);
52 51
53 if (dontIncrement) { 52 if (dontIncrement) {
54 return; 53 return;
55 } 54 }
56 55
57 try { 56 try {
58 aaa.incrementStrikeStatus(responseCode); 57 aaa.incrementStrikeStatus(responseCode);
59 } catch(err) { 58 } catch(err) {
60 logger.warn("Gagal aaa.incrementStrikeStatus: " + err); 59 logger.warn("Gagal aaa.incrementStrikeStatus: " + err);
61 } 60 }
62 } 61 }
63 62
64 function initMongoClient() { 63 function initMongoClient() {
65 if (!config || !config.mongodb || !config.mongodb.url) { 64 if (!config || !config.mongodb || !config.mongodb.url) {
66 return; 65 return;
67 } 66 }
68 67
69 try { 68 try {
70 var url = config.mongodb.url; 69 var url = config.mongodb.url;
71 70
72 mongoClient.connect(url, function(err, db) { 71 mongoClient.connect(url, function(err, db) {
73 if (err) { 72 if (err) {
74 logger.warn('Failed to connect to mongodb', {err: err}); 73 logger.warn('Failed to connect to mongodb', {err: err});
75 return; 74 return;
76 } 75 }
77 mongodb = db; 76 mongodb = db;
78 logger.info('MongoDB connected'); 77 logger.info('MongoDB connected');
79 }); 78 });
80 } 79 }
81 catch(err) { 80 catch(err) {
82 logger.warn('Exception when connecting to mongodb', {err: err, url: url}); 81 logger.warn('Exception when connecting to mongodb', {err: err, url: url});
83 } 82 }
84 } 83 }
85 84
86 function insertTaskToMongoDb(task) { 85 function insertTaskToMongoDb(task) {
87 if (!isMongoReady()) { return; } 86 if (!isMongoReady()) { return; }
88 87
89 task.supplier = config.globals.gateway_name; 88 task.supplier = config.globals.gateway_name;
90 task.rc = '68'; 89 task.rc = '68';
91 90
92 try { 91 try {
93 mongodb.collection(config.mongodb.collection).insertOne(task); 92 mongodb.collection(config.mongodb.collection).insertOne(task);
94 } 93 }
95 catch(err) { 94 catch(err) {
96 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task}); 95 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task});
97 } 96 }
98 } 97 }
99 98
100 function pushResponseToMongoDb(task, response, rc) { 99 function pushResponseToMongoDb(task, response, rc) {
101 if (!isMongoReady()) { return; } 100 if (!isMongoReady()) { return; }
102 101
103 102
104 try { 103 try {
105 if (!response.ts) { 104 if (!response.ts) {
106 response.ts = strftime('%Y-%m-%d %H:%M:%S', new Date()); 105 response.ts = strftime('%Y-%m-%d %H:%M:%S', new Date());
107 } 106 }
108 107
109 mongodb.collection(config.mongodb.collection).updateOne( 108 mongodb.collection(config.mongodb.collection).updateOne(
110 {requestId: task.requestId}, 109 {requestId: task.requestId},
111 { 110 {
112 $set: { 111 $set: {
113 lastResponse: response, 112 lastResponse: response,
114 supplier: config.globals.gateway_name, 113 supplier: config.globals.gateway_name,
115 rc: rc 114 rc: rc
116 }, 115 },
117 $push: { 116 $push: {
118 responses: response 117 responses: response
119 } 118 }
120 }, 119 },
121 function(err, result) { 120 function(err, result) {
122 if (err) { 121 if (err) {
123 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response}); 122 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response});
124 return; 123 return;
125 } 124 }
126 } 125 }
127 ); 126 );
128 } 127 }
129 catch(err) { 128 catch(err) {
130 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response}); 129 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response});
131 } 130 }
132 } 131 }
133 132
134 function isMongoReady() { 133 function isMongoReady() {
135 if (!config.mongodb) { return; } 134 if (!config.mongodb) { return; }
136 if (!config.mongodb.collection) { return; } 135 if (!config.mongodb.collection) { return; }
137 if (!mongodb) { return; } 136 if (!mongodb) { return; }
138 137
139 return true; 138 return true;
140 } 139 }
141 140
142 function topupRequest(task, retry) { 141 function topupRequest(task, retry) {
143 if (config && config.globals && config.globals.reject_on_pending_count && matrix && matrix.strikeStatus && matrix.strikeStatus.pending) { 142
144 if (parseInt(config.globals.reject_on_pending_count) <= matrix.strikeStatus.pending) { 143 try {
145 callbackReport(task.requestId, '13', 'Reject trx karena pending terlalu banyak'); 144 if (config && config.globals && config.globals.reject_on_pending_count && matrix && matrix.strikeStatus && matrix.strikeStatus.pending) {
146 return; 145
146 var pendingCount = matrix.strikeStatus.pending;
147 var pendingLimitCount = parseInt(config.globals.reject_on_pending_count);
148
149 if (pendingLimitCount <= matrix.strikeStatus.pending) {
150
151 logger.warn(
152 'Reject trx karena pending terlalu banyak',
153 {pendingCount: pendingCount, pendingLimitCount: pendingLimitCount}
154 );
155
156 callbackReport(task.requestId, '13', 'Reject trx karena pending terlalu banyak');
157 return;
158 }
147 } 159 }
148 } 160 }
161 catch(err) {
162 logger.warn("Exception saat periksa pendingLimit: " + err);
163 }
164
149 165
150 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss'); 166 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss');
151 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD'); 167 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD');
152 168
153 insertTaskToMongoDb(task); 169 insertTaskToMongoDb(task);
154 saldoCheck(billpayment, task); 170 saldoCheck(billpayment, task);
155 } 171 }
156 172
157 function saldoCheck(callback, task) { 173 function saldoCheck(callback, task) {
158 174
159 var params = { 175 var params = {
160 userName: config.h2h_out.userid, 176 userName: config.h2h_out.userid,
161 productCode: '00000' , 177 productCode: '00000' ,
162 terminal: 'H2HIPN10', 178 terminal: 'H2HIPN10',
163 transactionType: '61', 179 transactionType: '61',
164 reff: Math.ceil( Math.random() * 99999999 ), 180 reff: Math.ceil( Math.random() * 99999999 ),
165 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date()) 181 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
166 } 182 }
167 183
168 params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password); 184 params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password);
169 185
170 soap.createClient(config.h2h_out.partner, function(err, soapClient) { 186 soap.createClient(config.h2h_out.partner, function(err, soapClient) {
171 187
172 if (err) { 188 if (err) {
173 189
174 var errorMessage = 'Error creating soap client for saldoCheck: ' + err; 190 var errorMessage = 'Error creating soap client for saldoCheck: ' + err;
175 191
176 logger.warn(errorMessage, {err: err}); 192 logger.warn(errorMessage, {err: err});
177 callbackReportWrapper(task.requestId, '40', errorMessage); 193 callbackReportWrapper(task.requestId, '40', errorMessage);
178 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40'); 194 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40');
179 195
180 return; 196 return;
181 } 197 }
182 198
183 logger.info('Requesting to service', {url: config.h2h_out.partner, params: params}); 199 logger.info('Requesting to service', {url: config.h2h_out.partner, params: params});
184 soapClient.apih2h.apih2hPort.saldoCheck({ inputSaldo: params }, function(err, result) { 200 soapClient.apih2h.apih2hPort.saldoCheck({ inputSaldo: params }, function(err, result) {
185 201
186 logger.verbose( 202 logger.verbose(
187 'Got saldoCheck response', 203 'Got saldoCheck response',
188 { 204 {
189 lastEndpoint: soapClient.lastEndpoint, 205 lastEndpoint: soapClient.lastEndpoint,
190 lastRequest: soapClient.lastRequest, 206 lastRequest: soapClient.lastRequest,
191 lastMessage: soapClient.lastMessage, 207 lastMessage: soapClient.lastMessage,
192 lastResponse: soapClient.lastResponse, 208 lastResponse: soapClient.lastResponse,
193 } 209 }
194 ); 210 );
195 211
196 if (err) { 212 if (err) {
197 var errorMessage = 'Error requesting saldoCheck: ' + err; 213 var errorMessage = 'Error requesting saldoCheck: ' + err;
198 214
199 logger.warn(errorMessage, {err: err}); 215 logger.warn(errorMessage, {err: err});
200 callbackReportWrapper(task.requestId, '40', errorMessage); 216 callbackReportWrapper(task.requestId, '40', errorMessage);
201 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40'); 217 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40');
202 } 218 }
203 219
204 var balance; 220 var balance;
205 logger.verbose('saldoCheck result', {result: result}); 221 logger.verbose('saldoCheck result', {result: result});
206 222
207 try { 223 try {
208 balance = result.outputParameter.bit61.$value; 224 balance = result.outputParameter.bit61.$value;
209 } 225 }
210 catch(e) { 226 catch(e) {
211 balance = 'UNKNOWN'; 227 balance = 'UNKNOWN';
212 } 228 }
213 229
214 230
215 if (task) { 231 if (task) {
216 callback(task, balance); 232 callback(task, balance);
217 } 233 }
218 }); 234 });
219 }); 235 });
220 236
221 } 237 }
222 238
223 function billpayment(task, balance) { 239 function billpayment(task, balance) {
224 240
225 var terminalSuffix = Math.ceil( Math.random() * 20 ) + 10; 241 var terminalSuffix = Math.ceil( Math.random() * 20 ) + 10;
226 var remoteProduct = task.remoteProduct.split(','); 242 var remoteProduct = task.remoteProduct.split(',');
227 243
228 var params = { 244 var params = {
229 userName: config.h2h_out.userid, 245 userName: config.h2h_out.userid,
230 productCode: remoteProduct[0] , 246 productCode: remoteProduct[0] ,
231 terminal: 'H2HIPN' + terminalSuffix, 247 terminal: 'H2HIPN' + terminalSuffix,
232 transactionType: '50', 248 transactionType: '50',
233 billNumber: createBillNumber(task.destination), 249 billNumber: createBillNumber(task.destination),
234 amount: remoteProduct[1], 250 amount: remoteProduct[1],
235 bit61: createBillNumber(task.destination), 251 bit61: createBillNumber(task.destination),
236 reff: task.requestId, 252 reff: task.requestId,
237 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date()) 253 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
238 } 254 }
239 255
240 var signature = createSignature(params, config.h2h_out.password); 256 var signature = createSignature(params, config.h2h_out.password);
241 params.signature = signature; 257 params.signature = signature;
242 258
243 soap.createClient(config.h2h_out.partner, function(err, soapClient) { 259 soap.createClient(config.h2h_out.partner, function(err, soapClient) {
244 260
245 var _params = { 261 var _params = {
246 userName: params.userName, 262 userName: params.userName,
247 signature: params.signature, 263 signature: params.signature,
248 productCode: params.productCode, 264 productCode: params.productCode,
249 terminal: params.terminal, 265 terminal: params.terminal,
250 transactionType: params.transactionType, 266 transactionType: params.transactionType,
251 billNumber: params.billNumber, 267 billNumber: params.billNumber,
252 amount: params.amount, 268 amount: params.amount,
253 bit61: params.bit61, 269 bit61: params.bit61,
254 reff: params.reff, 270 reff: params.reff,
255 timeStamp: params.timeStamp 271 timeStamp: params.timeStamp
256 } 272 }
257 273
258 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params}); 274 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params});
259 275
260 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) { 276 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) {
261 logger.verbose( 277 logger.verbose(
262 'Got response', 278 'Got response',
263 { 279 {
264 lastEndpoint: soapClient.lastEndpoint, 280 lastEndpoint: soapClient.lastEndpoint,
265 lastRequest: soapClient.lastRequest, 281 lastRequest: soapClient.lastRequest,
266 lastMessage: soapClient.lastMessage, 282 lastMessage: soapClient.lastMessage,
267 lastResponse: soapClient.lastResponse, 283 lastResponse: soapClient.lastResponse,
268 } 284 }
269 ); 285 );
270 286
271 if (err) { 287 if (err) {
272 var errorMessage = 'Error requesting service: ' + err; 288 var errorMessage = 'Error requesting service: ' + err;
273 289
274 logger.warn(errorMessage, {err: err}); 290 logger.warn(errorMessage, {err: err});
275 callbackReportWrapper(task.requestId, '68', errorMessage); 291 callbackReportWrapper(task.requestId, '68', errorMessage);
276 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: soapClient.lastResponse}, '68'); 292 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: soapClient.lastResponse}, '68');
277 293
278 return; 294 return;
279 } 295 }
280 296
281 topupResponseHandler(task, result, balance, soapClient.lastResponse); 297 topupResponseHandler(task, result, balance, soapClient.lastResponse);
282 }); 298 });
283 }); 299 });
284 } 300 }
285 301
286 function topupResponseHandler(task, response, balance, rawResponse) { 302 function topupResponseHandler(task, response, balance, rawResponse) {
287 var st24rc = '68'; 303 var st24rc = '68';
288 var st24message = response.outputParameter.resultDesc.$value; 304 var st24message = response.outputParameter.resultDesc.$value;
289 305
290 var resultCode = parseInt(response.outputParameter.resultCode.$value); 306 var resultCode = parseInt(response.outputParameter.resultCode.$value);
291 var bit39 = parseInt(response.outputParameter.bit39.$value); 307 var bit39 = parseInt(response.outputParameter.bit39.$value);
292 308
293 var sn = ''; 309 var sn = '';
294 310
295 if ( resultCode == 1 ) { 311 if ( resultCode == 1 ) {
296 // product disabled 312 // product disabled
297 st24rc = '13'; 313 st24rc = '13';
298 } 314 }
299 else if ( resultCode == 2 ) { 315 else if ( resultCode == 2 ) {
300 // prodcode disable 316 // prodcode disable
301 st24rc = '13'; 317 st24rc = '13';
302 } 318 }
303 else if ( resultCode == 3 ) { 319 else if ( resultCode == 3 ) {
304 // duplicate reff 320 // duplicate reff
305 st24rc = '55'; 321 st24rc = '55';
306 } 322 }
307 else if ( resultCode == 4 ) { 323 else if ( resultCode == 4 ) {
308 // not enough balance 324 // not enough balance
309 st24rc = '40'; 325 st24rc = '40';
310 } 326 }
311 else if ( resultCode == 5 ) { 327 else if ( resultCode == 5 ) {
312 // username blocked 328 // username blocked
313 st24rc = '40'; 329 st24rc = '40';
314 } 330 }
315 else if ( resultCode == 6 ) { 331 else if ( resultCode == 6 ) {
316 // not exists username 332 // not exists username
317 st24rc = '40'; 333 st24rc = '40';
318 } 334 }
319 else if ( resultCode == 11 ) { 335 else if ( resultCode == 11 ) {
320 // invalid request 336 // invalid request
321 st24rc = '40' 337 st24rc = '40'
322 } 338 }
323 else if ( resultCode == 12 ) { 339 else if ( resultCode == 12 ) {
324 // no route to host 340 // no route to host
325 st24rc = '40' 341 st24rc = '40'
326 } 342 }
327 else if ( resultCode == 13 ) { 343 else if ( resultCode == 13 ) {
328 // invalid signature 344 // invalid signature
329 st24rc = '40' 345 st24rc = '40'
330 } 346 }
331 else if ( bit39 == 6 ) { 347 else if ( bit39 == 6 ) {
332 st24rc = '40'; 348 st24rc = '40';
333 st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H'; 349 st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H';
334 } 350 }
335 else if ( bit39 == 12 ) { 351 else if ( bit39 == 12 ) {
336 st24rc = '40'; 352 st24rc = '40';
337 st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid'; 353 st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid';
338 } 354 }
339 else if ( bit39 == 13 ) { 355 else if ( bit39 == 13 ) {
340 st24rc = '13'; 356 st24rc = '13';
341 st24message = 'Invalid voucher nominal'; 357 st24message = 'Invalid voucher nominal';
342 } 358 }
343 else if ( bit39 == 14 ) { 359 else if ( bit39 == 14 ) {
344 st24rc = '14'; 360 st24rc = '14';
345 st24message = 'MSISDN tidak ditemukan'; 361 st24message = 'MSISDN tidak ditemukan';
346 } 362 }
347 else if ( bit39 == 30 ) { 363 else if ( bit39 == 30 ) {
348 st24rc = '40'; 364 st24rc = '40';
349 st24message = 'Format Error'; 365 st24message = 'Format Error';
350 } 366 }
351 else if ( bit39 == 31 ) { 367 else if ( bit39 == 31 ) {
352 st24rc = '40'; 368 st24rc = '40';
353 st24message = 'Kode bank tidak terdaftar'; 369 st24message = 'Kode bank tidak terdaftar';
354 } 370 }
355 else if ( bit39 == 63 ) { 371 else if ( bit39 == 63 ) {
356 st24rc = '40'; 372 st24rc = '40';
357 st24message = 'Reversal denied'; 373 st24message = 'Reversal denied';
358 } 374 }
359 else if ( bit39 == 68 ) { 375 else if ( bit39 == 68 ) {
360 st24rc = '68'; 376 st24rc = '68';
361 st24message = 'Transaksi sedang dalam proses'; 377 st24message = 'Transaksi sedang dalam proses';
362 } 378 }
363 else if ( bit39 == 69 ) { 379 else if ( bit39 == 69 ) {
364 st24rc = '68'; 380 st24rc = '68';
365 st24message = 'Respon Ok lebih dari 24 detik'; 381 st24message = 'Respon Ok lebih dari 24 detik';
366 } 382 }
367 else if ( bit39 == 70 ) { 383 else if ( bit39 == 70 ) {
368 st24rc = '13'; 384 st24rc = '13';
369 st24message = 'Voucher out of stock'; 385 st24message = 'Voucher out of stock';
370 } 386 }
371 else if ( bit39 == 79 ) { 387 else if ( bit39 == 79 ) {
372 st24rc = '14'; 388 st24rc = '14';
373 st24message = 'Phone number is blocked by Telkomsel'; 389 st24message = 'Phone number is blocked by Telkomsel';
374 } 390 }
375 else if ( bit39 == 81 ) { 391 else if ( bit39 == 81 ) {
376 st24rc = '14'; 392 st24rc = '14';
377 st24message = 'Phone number is expired'; 393 st24message = 'Phone number is expired';
378 } 394 }
379 else if ( bit39 == 89 ) { 395 else if ( bit39 == 89 ) {
380 st24rc = '40'; 396 st24rc = '40';
381 st24message = 'Link to billing provider is down'; 397 st24message = 'Link to billing provider is down';
382 } 398 }
383 else if ( bit39 == 91 ) { 399 else if ( bit39 == 91 ) {
384 st24rc = '40'; 400 st24rc = '40';
385 st24message = 'Database problem'; 401 st24message = 'Database problem';
386 } 402 }
387 else if ( bit39 == 92 ) { 403 else if ( bit39 == 92 ) {
388 st24rc = '40'; 404 st24rc = '40';
389 st24message = 'Unable to route transaction'; 405 st24message = 'Unable to route transaction';
390 } 406 }
391 else if ( bit39 == 94 ) { 407 else if ( bit39 == 94 ) {
392 st24rc = '40'; 408 st24rc = '40';
393 st24message = 'Duplicate reversal request'; 409 st24message = 'Duplicate reversal request';
394 } 410 }
395 else if ( resultCode == 0 && bit39 == 0) { 411 else if ( resultCode == 0 && bit39 == 0) {
396 412
397 try { 413 try {
398 sn = response.outputParameter.bit61.$value.substring(43); 414 sn = response.outputParameter.bit61.$value.substring(43);
399 } 415 }
400 catch(e) { 416 catch(e) {
401 sn = ''; 417 sn = '';
402 } 418 }
403 419
404 st24message = 'SN=' + sn + '; ' + st24message; 420 st24message = 'SN=' + sn + '; ' + st24message;
405 st24rc = '00'; 421 st24rc = '00';
406 } 422 }
407 423
408 var message = 424 var message =
409 response.outputParameter.resultCode.$value 425 response.outputParameter.resultCode.$value
410 + " " + response.outputParameter.resultDesc.$value 426 + " " + response.outputParameter.resultDesc.$value
411 + "; BIT39: " + response.outputParameter.bit39.$value 427 + "; BIT39: " + response.outputParameter.bit39.$value
412 ; 428 ;
413 429
414 if (response.outputParameter.resultDesc.$value != st24message) { 430 if (response.outputParameter.resultDesc.$value != st24message) {
415 var message = message + " " + st24message; 431 var message = message + " " + st24message;
416 } 432 }
417 433
418 message = message + ' -- Prev Balance: ' + balance; 434 message = message + ' -- Prev Balance: ' + balance;
419 435
420 var parsedResponse = { 436 var parsedResponse = {
421 productCode: response.outputParameter.productCode.$value, 437 productCode: response.outputParameter.productCode.$value,
422 terminal: response.outputParameter.terminal.$value, 438 terminal: response.outputParameter.terminal.$value,
423 transactionType: response.outputParameter.transactionType.$value, 439 transactionType: response.outputParameter.transactionType.$value,
424 billNumber: response.outputParameter.billNumber.$value, 440 billNumber: response.outputParameter.billNumber.$value,
425 amount: response.outputParameter.amount.$value, 441 amount: response.outputParameter.amount.$value,
426 bit61: response.outputParameter.bit61.$value, 442 bit61: response.outputParameter.bit61.$value,
427 reff: response.outputParameter.reff.$value, 443 reff: response.outputParameter.reff.$value,
428 timeStamp: response.outputParameter.timeStamp.$value, 444 timeStamp: response.outputParameter.timeStamp.$value,
429 resultCode: response.outputParameter.resultCode.$value, 445 resultCode: response.outputParameter.resultCode.$value,
430 resultDesc: response.outputParameter.resultDesc.$value, 446 resultDesc: response.outputParameter.resultDesc.$value,
431 bit39: response.outputParameter.bit39.$value, 447 bit39: response.outputParameter.bit39.$value,
432 prevBalance: balance, 448 prevBalance: balance,
433 sn: sn, 449 sn: sn,
434 st24message: st24message, 450 st24message: st24message,
435 } 451 }
436 452
437 var combinedMessage = ''; 453 var combinedMessage = '';
438 454
439 Object.keys(parsedResponse).forEach(function(key,index) { 455 Object.keys(parsedResponse).forEach(function(key,index) {
440 combinedMessage += key + ': ' + parsedResponse[key] + '; ' 456 combinedMessage += key + ': ' + parsedResponse[key] + '; '
441 }); 457 });
442 combinedMessage = combinedMessage.trim(); 458 combinedMessage = combinedMessage.trim();
443 459
444 parsedResponse.MESSAGE = combinedMessage; 460 parsedResponse.MESSAGE = combinedMessage;
445 461
446 logger.info('Got result: ' + message, {response: response}); 462 logger.info('Got result: ' + message, {response: response});
447 callbackReportWrapper(task.requestId, st24rc, st24message + ' -- Prev Balance: ' + balance); 463 callbackReportWrapper(task.requestId, st24rc, st24message + ' -- Prev Balance: ' + balance);
448 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: rawResponse, parsed: parsedResponse}, st24rc); 464 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: rawResponse, parsed: parsedResponse}, st24rc);
449 } 465 }
450 466
451 function createSignature(params, password) { 467 function createSignature(params, password) {
452 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); 468 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
453 var plain = 469 var plain =
454 params.userName 470 params.userName
455 + passwordHash 471 + passwordHash
456 + params.productCode 472 + params.productCode
457 + params.terminal 473 + params.terminal
458 + params.transactionType 474 + params.transactionType
459 + params.billNumber 475 + params.billNumber
460 + params.amount 476 + params.amount
461 + params.reff 477 + params.reff
462 + params.timeStamp; 478 + params.timeStamp;
463 479
464 return crypto.createHash('sha1').update(plain).digest().toString('hex'); 480 return crypto.createHash('sha1').update(plain).digest().toString('hex');
465 } 481 }
466 482
467 function createSignatureForSaldoCheck(params, password) { 483 function createSignatureForSaldoCheck(params, password) {
468 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); 484 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
469 var plain = 485 var plain =
470 params.userName 486 params.userName
471 + passwordHash 487 + passwordHash
472 + params.productCode 488 + params.productCode
473 + params.terminal 489 + params.terminal
474 + params.transactionType 490 + params.transactionType
475 + params.reff 491 + params.reff
476 + params.timeStamp; 492 + params.timeStamp;
477 493
478 return crypto.createHash('sha1').update(plain).digest().toString('hex'); 494 return crypto.createHash('sha1').update(plain).digest().toString('hex');
479 } 495 }
480 496
481 function createBillNumber(destination) { 497 function createBillNumber(destination) {
482 return ("0000000000000" + destination).slice(-13); 498 return ("0000000000000" + destination).slice(-13);
483 } 499 }
484 500
485 exports.start = start; 501 exports.start = start;
486 exports.topupRequest = topupRequest; 502 exports.topupRequest = topupRequest;
487 exports.createSignature = createSignature; 503 exports.createSignature = createSignature;
488 exports.createBillNumber = createBillNumber; 504 exports.createBillNumber = createBillNumber;