httppulsakita.js 6.62 KB
var url = require('url');
var math = require('mathjs');
var request = require('request');
var xml = require("xml2js").parseString;
var winston = require('winston');

var logger;
var config;
var callbackReport;
var aaa;

var max_retry = 15;
var sleep_before_retry = 60 * 1000;

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

function parseSN(message, _config) {
    
    if (!_config) {
        _config = config;
    }
    
    var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
    var sn_match = message.match(sn_regex);
        
    if (sn_match <= 0) {
        logger.info('SN Not found: ' + message);
        return '';
    }
    
    var sn = sn_match[0];
    var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
    
    var count = sn_remove_patterns.length;
    
    for(var i = 0; i < count; i++) {
        sn = sn.replace(sn_remove_patterns[i], '');
    }
    
    return sn.trim();
}

function topupRequest(task, retry) {
    /*
    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);
    }
    */
    
    
    if (retry === undefined) {
        retry = max_retry;
    }
    
    var params = {
        userid: config.h2h_out.userid,
        pwd: config.h2h_out.password,
        memberreff: task['requestId'],
        produk: task['remoteProduct'],
        tujuan: task['destination']
    };
    logger.info('Creating http request to gateway', {params: params});
    
    request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) {
        
        /*
        config.globals.active_requests_count--;
        */

        if (err) {
            logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err);
            
            callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier. ' + err);
            return;
        }
        
        logger.verbose('Got response from gateway ', {response_body: httpResponseBody});
        
        if (httpResponseBody.indexOf('502 Proxy Error') >= 0) {
            logger.warn('Proxy error', {task: task, params: params});
            callbackReport(task['requestId'], '91', '502 Proxy error');
            return;
        }
        
        xml(httpResponseBody, function(err, result) {
            if (err) {
                logger.warn('Gagal parsing XML respon server', {task: task, params: params});
                //topupRequest(task, retry - 1);
                callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server');
                return;
            } 
            
            logger.info('Response Data:', {result: result});
            
            var message = result.respon.pesan[0].replace(/\n/g, ' ');
            
            var response_code = '68';
            try {
                response_code = result.respon.response_code[0].replace(/^00/, '');
            } 
            catch(rc_error_on_parse) {
                
                logger.warn('respon.response_code tidak terdefinisi, gunakan respon.rc');
                response_code = result.respon.rc[0].replace(/^00/, '');
                
            }
            
            if (response_code == '54' || response_code == '68') {
                logger.warn('Mendapat status pending / suspect', {task: task, params: params});
                if (retry) {
                    callbackReport(task['requestId'], '68', message + '. Sistem akan mengirim advise dalam waktu ' + sleep_before_retry + ' ms.');
                    
                    setTimeout(function() {
                        
                        logger.info('Sending advice', {task: task});
                        
                        task['remoteProduct'] = 'ADVPLN';
                        topupRequest(task, retry - 1);
                        
                    }, sleep_before_retry);
                    
                } else {
                    logger.warn('Max retries exceeded', {task: task});
                    callbackReport(task['requestId'], '40', message + '. Max retries exceeded');
                }
                return;
            }
            
            var token = '';
            if (result.respon.token) {
                token = result.respon.token[0];
            }
            
            var data_pelanggan = 'NO-DATA';
            if (result.respon.data) {
                
                try {
                    var _data_pelanggan = result.respon.data[0].replace(/ /g, '-');
                    var fields = _data_pelanggan.split('/');
                    
                    data_pelanggan = [
                        fields[0], fields[1], fields[2], fields[3]
                    ].join('/');
                }
                catch(err) {
                    logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan});
                }
                
                
            }
            
            if (response_code == '00') {
                
                var sn = "";
                
                if (config.h2h_out.parse_sn == 'YES') {                    
                    sn = parseSN(message);
                } else if (token && data_pelanggan) {
                    sn = token + '/' + data_pelanggan;
                }
                
                message = 'SN=' + sn + '; ' + 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 parseResult(message) {
    var data;
    xml(message, function(err, result) {
        data = result;
    });
    return data;
}

exports.start = start;
exports.topupRequest = topupRequest;
exports.parseResult = parseResult;
exports.parseSN = parseSN;