var fs = require('fs'); var https = require('https'); var http = require('http'); var url = require('url'); var request = require('request'); var xml2js = require('xml2js').parseString; var strftime = require('strftime'); var math = require('mathjs'); var config; var httpServer; process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; var logTag = __filename.split('/').reverse()[0]; function topupRequest(task) { if (config.globals.requests_count == undefined) { config.globals.requests_count = 1; } else { config.globals.requests_count++; } if (config.globals.active_requests_count == undefined) { config.globals.active_requests_count = 1; } else { config.globals.active_requests_count++; } if (config.globals.max_active_requests_count == undefined) { config.globals.max_active_requests_count = config.globals.active_requests_count; } else { config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); } var options = { url: config.h2h_out.partner, qs: { reqid: task['requestId'], msisdn: task['destination'], product: task['remoteProduct'] } }; console.log(options); request(options, function (error, response, body) { if (config.globals.active_requests_count == undefined) { config.globals.active_requests_count = 0; } else { config.globals.active_requests_count--; } if (error || response.statusCode != 200) { console.log(logTag + ': Gateway Error'); callbackReport(task['requestId'], '40', 'Gateway Error'); return; } console.log(logTag + ': Supplier response:'); console.log(body); xml2js(body, function (err, result) { if (err) { callbackReport(task['requestId'], '40', body); return; } console.log(result); var response_code = '68'; var message = result.trx_response.info[0].trim(); if (message == 'Error Parsing') { response_code = '40'; } else if (message == 'Stock is not available') { response_code = '40'; } else if (message == 'Undefined error') { response_code = '40'; } else if (message == "Phone number's not found") { response_code = '14'; } else if (message == "Phone number is expired") { response_code = '14'; } else if (message == "Duplicate transaction") { response_code = '55'; } else if (message == "Link Provider down") { response_code = '91'; } else if (message == "TRANSAKSI SUKSES !!!") { var destination = result.trx_response.msisdn.join(' ').trim(); destination = destination.replace(' - ', ''); var product = result.trx_response.product.join(' ').trim(); var ref_num = result.trx_response.ref_num.join(' ').trim(); var harga = result.trx_response.harga.join(' ').trim(); var kode_voucher = result.trx_response.kode_voucher.join(' ').trim(); var stocks = result.trx_response.stock.join(' ').trim(); var stock = parseStock(stocks, product); if (stock == 0) { console.log('OUT OF STOCK: ' + task['product']); config.globals.products = productsWithout(task['product']); } response_code = '00'; message = 'SN=' + kode_voucher + '; ' + product + ' ' + destination + ' ' + harga + ' ref_num: ' + ref_num + ' kode_voucher: ' + kode_voucher + ' sisa stock: ' + stock + ' unit'; } console.log('Message to AAA: ' + message); callbackReport(task['requestId'], response_code, message); }); }); } function start(_config, _callbackReport) { config = _config; callbackReport = _callbackReport } function stockKeyword(product_desc) { var keywords = product_desc.match(/\s\d+K$/); if (!keywords) { return; } if (keywords.length < 1) { return; } return keywords[0].trim(); } function parseStock(stocks, product_desc) { product_keyword = stockKeyword(product_desc); var _stocks = stocks.split('; '); count = _stocks.length; for (var i = 0; i < count; i++) { var stock = _stocks[i].split(' = '); if (stock.length < 2) { continue; } if (stock[0] == product_keyword) { return parseInt(stock[1]); } } return 0; } function productsWithout(to_be_removed, products) { if (products === undefined) { products = config.globals.products; } if (products.search(/^,/) == -1) { products = ',' + products; } if (products.search(/,$/) == -1) { products = products + ','; } products = products.replace(/\s+/, ''); products = products.replace(/,+/, ','); products = products.replace(',' + to_be_removed + ',' , ','); products = products.replace(/^,/, ''); products = products.replace(/,$/, ''); return products; } exports.start = start; exports.topupRequest = topupRequest; exports.stockKeyword = stockKeyword; exports.parseStock = parseStock; exports.productsWithout = productsWithout;