index.js 9.07 KB
/* eslint-disable no-console */
const regexLooperReplace = require('tektrans-lib/regex-looper/replace');
const rcFromMsg = require('komodo-sdk/rc-from-msg');
const organicRc = require('./rc');

if (process.env.DEBUG_IRS_CALCULATE_BASE_BILL_AMOUNT) {
    console.log('DEBUG_IRS_CALCULATE_BASE_BILL_AMOUNT detected');
}

function isInquiryResponseMessage(msg) {
    return (msg || '').indexOf('CEK TAGIHAN') >= 0;
}

function isPaymentResponseMessage(msg) {
    return (msg || '').indexOf('BAYAR TAGIHAN') >= 0;
}

function isPostpaidResponseMessage(msg) {
    return isInquiryResponseMessage(msg) || isPaymentResponseMessage(msg);
}

function getRcFromMessage(msg, customRc) {
    let rc;
    if (customRc && Array.isArray(customRc) && customRc.length) {
        rc = rcFromMsg(msg, customRc);
    }

    if (!rc) {
        rc = rcFromMsg(msg, organicRc);
    }

    return rc;
}

function getPriceFromMessage(msg, rule) {
    if (typeof msg !== 'string') {
        return;
    }

    if (process.env.DEBUG_IRS && !rule) {
        console.log('** IRS.getPriceFromMessage no rule'); // eslint-disable-line no-console
    }

    if (process.env.DEBUG_IRS && rule) {
        console.log('** IRS.getPriceFromMessage rule: ' + JSON.stringify(rule, null, 2)); // eslint-disable-line no-console
    }

    //const pattern = (rule && typeof rule.pattern === 'string') ? rule.pattern : "Harga: ([\\d\\.]+?) ";
    const pattern = (rule && typeof rule.pattern === 'string') ? rule.pattern : "\\d+\\s+-\\s+([\\d,\\.]+)\\s+=";
    const match_idx = (rule && typeof rule.match_idx === 'number') ? rule.match_idx : 1;

    const re = new RegExp(pattern);
    const matches = msg.match(re);
    if (process.env.DEBUG_IRS) {
        console.log('** IRS.getPriceFromMessage msg: "' + msg + '" active_pattern: "' + pattern + '" active_match_idx: ' + match_idx); // eslint-disable-line no-console
        console.log('** IRS.getPriceFromMessage matches:\n' + JSON.stringify(matches)); // eslint-disable-line no-console
    }

    if (matches && matches[match_idx]) {
        const result =  Number(matches[match_idx].replace(/\./g, ''));
        if (process.env.DEBUG_IRS) {
            console.log('** IRS.getPriceFromMessage SUPPLIER-PRICE: ' + result); // eslint-disable-line no-console
        }
        return result;
    }
}

function extractFromMessage(msg, rule) {
    if (typeof msg !== 'string') { return; }

    if (!rule) { return; }

    if (typeof rule !== 'object') {
        return;
    }

    rule.match_idx = Number(rule.match_idx);

    if (!rule.match_idx) {
        rule.match_idx = 1;
    }

    const re = new RegExp(rule.pattern);
    const matches = msg.match(re);
    if (matches && matches[rule.match_idx] && typeof matches[rule.match_idx] === 'string') {
        return matches[rule.match_idx];
    }
}

function getSnFromMessage(msg, rule) {
    if (!rule) {
        rule = {
            pattern: "[: ]S/*N:\\s*(.+?)\\s",
            match_idx: 1
        }
    }

    let sn = extractFromMessage(msg, rule);
    if (!sn || typeof sn !== 'string') { return; }

    return sn.toUpperCase().replace(/[^a-zA-Z0-9:,/]/g, '-').replace(/-+/g, '-').replace(/-*\/-*/g, '/').replace(/^-+/, '').replace(/-+$/, '');
}

function getBalanceFromMessage(msg, rule) {
    if (!rule) {
        rule = {
            pattern: "Saldo: .+? = ([\\d\\.]+) ",
            match_idx: 1
        }
    }

    let result = extractFromMessage(msg, rule);
    if (!result || typeof result !== 'string') { return; }

    return Number(result.replace(/\D/g, ''));
}

function getDetailFromMessage(msg, rule, replacementRules) {
    if (!rule) {
        rule = {
            pattern: " Detail(?: Tagihan)*:\\s*(.+?)\\s+Sisa [Ss]aldo",
            match_idx: 1,
        }
    }

    return (
        regexLooperReplace(extractFromMessage(msg, rule), replacementRules) || ''
    ).trim() || null;
}

function splitPostpaidDetail(str) {
    const retval = (str || '')
        .split('/')
        .map((item) => {
            let [keyword, value] = item.split(/[:=]/);
            keyword = (keyword || '').trim()

            if (keyword === 'N') keyword = 'SN';

            return {
                keyword,
                value: (value || '').trim(),
            };
        })
        .filter((item) => item.keyword.length && item.value.length);
    return retval;
}

function calculateBaseBillAmountAuto(detailSplitted, customKeywords, productKeyval) {
    const tagihanAsliKeyvalKeywords = (productKeyval && productKeyval.KEYWORD_TAGASLI) ? productKeyval.KEYWORD_TAGASLI.split(/ *, */)
        : null;

    const keywords = (tagihanAsliKeyvalKeywords && Array.isArray(tagihanAsliKeyvalKeywords) && tagihanAsliKeyvalKeywords.length && tagihanAsliKeyvalKeywords)
        || customKeywords
        || ['TAGIHANASLI', 'TAGIHAN', 'DENDA', 'RPPREMI', 'BIAYA'];

    let retval = 0;
    let detailCount = (detailSplitted || []).length;

    for (let i = 0; i < detailCount; i += 1) {
        const item = detailSplitted[i];
        if (keywords.indexOf(item.keyword.toUpperCase()) >= 0) {
            const value = (item.value || '').trim().replace(/^rp */i, '').replace(/\./g, '');
            retval += Number(value) || 0;
        }
    }

    return retval;
}

function calculateBaseBillAmount(detailSplitted, customKeywords, productKeyval, billCount) {
    if (
        !productKeyval
        || !productKeyval.KEYWORD_TOTALTAG
        || (!productKeyval.KEYWORD_ADMINFEE && !productKeyval.ADMINFEE)
    ) {
        if (process.env.DEBUG_IRS_CALCULATE_BASE_BILL_AMOUNT) {
            console.log(`=========== 0D299D07 using calculateBaseBillAmountAuto KEYWORD_TOTALTAG=${productKeyval.KEYWORD_TOTALTAG} KEYWORD_KEYWORD_ADMINFEE=${productKeyval.KEYWORD_ADMINFEE} KEYWORD_ADMINFEE=${productKeyval.ADMINFEE}`);
        }
        return calculateBaseBillAmountAuto(detailSplitted, customKeywords, productKeyval, billCount);
    }

    const billCountOrDefault = billCount || 1;

    const totalTagihanKeyword = productKeyval.KEYWORD_TOTALTAG;
    if (!totalTagihanKeyword) return 0;

    const totalTagihanItem = detailSplitted.find((item) => (item.keyword || '').toUpperCase() === totalTagihanKeyword.toUpperCase());
    const totalTagihanValue = Number(
        ((totalTagihanItem && totalTagihanItem.value) || '')
            .trim()
            .replace(/^rp */i, '')
            .replace(/\./g, '')
    );

    if (!totalTagihanValue) {
        if (process.env.DEBUG_IRS_CALCULATE_BASE_BILL_AMOUNT) {
            console.log('=========== MISSING totalTagihanValue D7282FA7');
        }

        return 0;
    }

    const defaultAdminFee = Number(productKeyval.ADMINFEE || '');

    const adminFeeKeyword = productKeyval.KEYWORD_ADMINFEE;
    if (!adminFeeKeyword && defaultAdminFee) {
        if (process.env.DEBUG_IRS_CALCULATE_BASE_BILL_AMOUNT) {
           // eslint-disable-next-line no-console
           console.log('======== TOTAL TAGIHAN VALUE - (DEFAULT ADMIN FEE * BILL COUNT) D35E56AD') ;
        }
        return totalTagihanValue - (defaultAdminFee * billCountOrDefault);
    }

    if (!adminFeeKeyword) {
        if (process.env.DEBUG_IRS_CALCULATE_BASE_BILL_AMOUNT) {
            // eslint-disable-next-line no-console
            console.log('======== Missing adminFeeKeyword');
        }

        return 0;
    }

    const adminFeeItem = detailSplitted.find((item) => (item.keyword || '').toUpperCase() === adminFeeKeyword.toUpperCase());
    if (process.env.DEBUG_IRS_CALCULATE_BASE_BILL_AMOUNT) {
        // eslint-disable-next-line no-console
        console.log(`======== adminFeeItem: ${adminFeeKeyword}`, adminFeeItem);
    }
    const adminFeeValue = Number((adminFeeItem.value || '').trim().replace(/^rp */i, '').replace(/\./g, ''));
    if (!adminFeeValue) return 0;

    return totalTagihanValue - (adminFeeValue * billCountOrDefault);
}

/**
 * get bill count using number of occurence of spliter
 * @date 2020-10-02
 * @param {Object} detailSplitted
 * @param {string} customKeyword
 * @returns {number}
 */
function getBillCountUsingCounter(detailSplitted, customKeyword) {
    if (!detailSplitted) return 0;

    return ((customKeyword && detailSplitted[customKeyword]) || '').split(',').length;
}

/**
 * get bill count from splitted detail
 * @date 2020-10-02
 * @param {Object} detailSplitted
 * @param {string} [customKeyword]
 * @returns {number}
 */
function getBillCount(detailSplitted, customKeyword) {
    if (!detailSplitted) return 0;

    return Number(
        (
            (customKeyword && detailSplitted[customKeyword])
            || detailSplitted['JMLBLN']
            || ''
        ).replace(/\D+$/g, '')
    ) || 0;
}

exports.getRcFromMessage = getRcFromMessage;
exports.getPriceFromMessage = getPriceFromMessage;
exports.getSnFromMessage = getSnFromMessage;
exports.getBalanceFromMessage = getBalanceFromMessage;
exports.isInquiryResponseMessage = isInquiryResponseMessage;
exports.isPaymentResponseMessage = isPaymentResponseMessage;
exports.isPostpaidResponseMessage = isPostpaidResponseMessage;
exports.getDetailFromMessage = getDetailFromMessage;
exports.splitPostpaidDetail = splitPostpaidDetail;
exports.calculateBaseBillAmount = calculateBaseBillAmount;
exports.getBillCount = getBillCount;
exports.getBillCountUsingCounter = getBillCountUsingCounter;