partner-scrappingkisel.js 5.9 KB
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 winston = require('winston');

var config;
var logger;
var aaa;

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

var logTag = __filename.split('/').reverse()[0];

function topupRequest(task) {
    var options = {
        url: config.h2h_out.partner,
        qs: {
            reqid: task['requestId'],
            msisdn: task['destination'],
            product: task['remoteProduct']
        }
    };
    logger.info('HTTP request to partner', {request_options: options});
    
    if (aaa) {
        aaa.incrementTrxCount();
        aaa.incrementActiveTrxCount();
    }

    request(options, function (error, response, body) {
        if (aaa) {
            aaa.decrementActiveTrxCount();
        }
        
        if (config.globals.active_requests_count == undefined) {
            config.globals.active_requests_count = 0;
        } else {
            config.globals.active_requests_count--;
        }
        
        if (error || response.statusCode != 200) {
            logger.warn(logTag + ': Gateway Error');
            callbackReport(task['requestId'], '40', 'Gateway Error');
            return;
        } 

        logger.info('Got supplier response', {response_body: body});

        xml2js(body, function (err, result) {
            if (err) {
                callbackReport(task['requestId'], '40', body);
                return;
            } 
                
            logger.info('Got result from partner', {result: 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 == "Unable to route transaction") {
                
                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) {
                    logger.info('OUT OF STOCK: ' + task['product']);
                    config.globals.products = productsWithout(task['product']);
                }
                
                response_code = '00';
                
                message = 'SN=' + kode_voucher + '; ' + product + ' ' + destination + ' ref_num: ' + ref_num + ' kode_voucher: ' + kode_voucher + ' sisa stock: ' + stock + ' unit';
            }
            
            logger.info('Message to AAA: ' + message);
            callbackReport(task['requestId'], response_code, message);
        });
    });
}

function start(_config, _callbackReport, options) {
    config = _config;
    callbackReport = _callbackReport;
    
    if (options && options.aaa) {
            aaa = options.aaa;
    }
    
    if (options && options.logger) {
        logger = options.logger;
    } else {
        logger = new winston.Logger({
            transports: [
              new (winston.transports.Console)()
            ]
        });
    }
}

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) {
            var value = stock[1].replace(/[,\.]/g, '');
            return parseInt(value);
        }
    }
    
    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;