Commit 29fa652434a8d62ab393e4ad45608e247074236e

Authored by Adhidarma Hadiwinoto
1 parent cb87e54773
Exists in master

salin task sebelum insert ke mongodb

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