RX Status Change in Auto-Ship

Map reduce script powered by saved search, to set RX Status in line record based on date range set.

/**
 *@NApiVersion 2.x
 *@NScriptType MapReduceScript
 */
 define(['N/search', 'N/record', 'N/runtime','./moment.js'], function(search, record, runtime, moment) {

    const TYPE_AUTO_SHIP_LINE     = 'customrecord_vv_autoship_record';
    const FLD_RX_STATUS           = 'custrecord_vv_autoship_rxorderstatus';

    const RX_FIELD_OBJ = {
        FLD_RX_END_STATUS: 'custrecord_vv_rx_auto_change_status',
        FLD_RX_START_DATE: 'custrecord_vv_rx_status_start_date',
        FLD_RX_END_DATE: 'custrecord_vv_rx_status_end_date',
        FLD_RX_CHANGE_DATA: 'custrecord_vv_rx_status_change_data'
    }
    
    const TZ_OFFSET   = 2   // PST (server time) - CST (VV timezone)
    const CUTOFF_9AM  = 11  // 9 am + TZ_OFFSET

    function getInputData() {
        
        var scriptObj = runtime.getCurrentScript();
    	var searchId = scriptObj.getParameter({name: 'custscript_vv_autoship_search'});
    	
        return search.load({
            id: searchId
        });	
    }

    function map(context) {
        
        var autoShipRecId = context.key;
        var autoShipRxData = JSON.parse(context.value);

        var rxStatusEndDate = autoShipRxData.values["custrecord_vv_rx_status_end_date"];
        var rxStatusEnd = autoShipRxData.values["custrecord_rx_status_end.CUSTRECORD_VV_RX_AUTO_CHANGE_STATUS"].value;
        log.debug( "rxStatusEndDate", rxStatusEndDate )
        
        if(!autoShipRecId || !rxStatusEnd || !rxStatusEndDate) return;

        /* Check if date is within 15 minutes
            get Hour compare with current hour
            if 15mins, change
        */
       var dateDiffObj = {
                autoShipId: autoShipRecId,
                date1: moment(new Date()).format("MM/DD/YYYY hh:mm"),     
                date2: moment(rxStatusEndDate).format("MM/DD/YYYY hh:mm") 
        }

        var date1 = new Date();
        var date2 = new Date( rxStatusEndDate );
 
        var currHour = date2.getHours() * 1 + TZ_OFFSET;
        log.debug( "currHour", currHour )
        
        dateDiffObj['hourDiff'] = getTimeDifference(date1, date2, 'HOURS');
        dateDiffObj['timeDiff'] = getTimeDifference(date1, date2, 'MINUTES');
        dateDiffObj['toProcess'] = (dateDiffObj.hourDiff <= 1 && dateDiffObj.timeDiff <= 15) || currHour < CUTOFF_9AM;

        log.debug('dateDiffObj', JSON.stringify(dateDiffObj));
        
        if(dateDiffObj.toProcess === false || !dateDiffObj.toProcess) return; // SKIP
        
        var autoShipRec = record.load({
            type: TYPE_AUTO_SHIP_LINE,
            id: autoShipRecId
        })
        
        // Auto Change Status
        autoShipRec.setValue({
            fieldId: FLD_RX_STATUS,
            value: rxStatusEnd
        });

        for(var rxStatusFld in RX_FIELD_OBJ) {
            autoShipRec.setValue({
                fieldId: RX_FIELD_OBJ[rxStatusFld],
                value: ''
            });
        }

        autoShipRec.save();

    }

    function getTimeDifference(date1, date2, timeUnit) {

        var timeDiff = 0;
        var res = Math.abs(date1 - date2) / 1000;
        switch(timeUnit) {
            case 'DAYS'     : timeDiff = Math.floor(res / 86400); break;
            case 'HOURS'    : timeDiff = Math.floor(res / 3600) % 24; break;
            case 'MINUTES'  : timeDiff = Math.floor(res / 60) % 60; break;
        }

        return timeDiff;
    }

    return {
        getInputData: getInputData,
        map: map
    }
});

Leave a comment

Your email address will not be published. Required fields are marked *