Commit b87a0679e5b27f52a49633b33712d2c5b1a07638

Authored by Adhidarma Hadiwinoto
1 parent 89c3ecab54
Exists in master

typo

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