Map/Reduce Script to Update Landed Cost In IR record using CSV Custom Import

The client needs to update the landed cost template at line level in IR record using a CSV file. We have created a map/reduce script to update the values.

/**
 * @NApiVersion 2.1
 * @NScriptType MapReduceScript
 */
define(['N/file', 'N/record', 'N/search','/SuiteScripts/papaparse.min.js'],
    /**
 * @param{file} file
 * @param{record} record
 * @param{search} search
 */
    (file, record, search,papa) => {
        /**
         * Defines the function that is executed at the beginning of the map/reduce process and generates the input data.
         * @param {Object} inputContext
         * @param {boolean} inputContext.isRestarted - Indicates whether the current invocation of this function is the first
         *     invocation (if true, the current invocation is not the first invocation and this function has been restarted)
         * @param {Object} inputContext.ObjectRef - Object that references the input data
         * @typedef {Object} ObjectRef
         * @property {string|number} ObjectRef.id - Internal ID of the record instance that contains the input data
         * @property {string} ObjectRef.type - Type of the record instance that contains the input data
         * @returns {Array|Object|Search|ObjectRef|File|Query} The input data to use in the map/reduce process
         * @since 2015.2
         */

        const getInputData = (inputContext) => {
            try{
                let csvFile = file.load({id: 1118269});
                let fileContents = csvFile.getContents();
                let dataFile=papa.parse(fileContents,{
                    header:true,
                skipEmptyLines:true
               }).data;
               log.debug("val",dataFile)   
               return dataFile;      
            }
            catch(e){
                log.error("error@getInput",e)
            }
        }

        function findLandedCost(name){
            try{
                var customrecord_scm_lc_profileSearchObj = search.create({
                    type: "customrecord_scm_lc_profile",
                    filters:
                    [
                       ["name","is", name]
                    ],
                    columns:
                    [
                       search.createColumn({
                          name: "name",
                          sort: search.Sort.ASC,
                          label: "Name"
                       }),
                       search.createColumn({name: "internalid", label: "Internal ID"})
                    ]
                 });
                 var searchResultCount = customrecord_scm_lc_profileSearchObj.runPaged().count;
                let internalId;
                if(searchResultCount>0){
                    customrecord_scm_lc_profileSearchObj.run().each(function(result){
                        internalId = result.getValue({name: "internalid", label: "Internal ID"});
                        //return true;
                     });
                }
                return internalId;
            }
            catch(e){
                log.error("error@findLandedCost",e)
                return "";
            }
        }
        function countryCheck(code){
            try{
                var customrecord_cseg_geographySearchObj = search.create({
                    type: "customrecord_cseg_geography",
                    filters:
                    [
                       ["custrecord_country_two_letter_iso","is",code]
                    ],
                    columns:
                    [
                       search.createColumn({
                          name: "name",
                          sort: search.Sort.ASC,
                          label: "Name"
                       }),
                       search.createColumn({name: "scriptid", label: "Script ID"}),
                       search.createColumn({name: "custrecord_country_two_letter_iso", label: "Short Code"})
                    ]
                 });
                 var searchResultCount = customrecord_cseg_geographySearchObj.runPaged().count;
                 let countryName=""
                 //log.debug("customrecord_cseg_geographySearchObj result count",searchResultCount);
                 if(searchResultCount>0){
                    customrecord_cseg_geographySearchObj.run().each(function(result){
                        countryName = result.getValue({
                            name: "name",
                            sort: search.Sort.ASC,
                            label: "Name"
                        })
                     });
                 }
                 return countryName;
                 
            }
            catch(e){
                log.error("error@countryCheck",e)
                return ""
            }
        }

      

        /**
         * Defines the function that is executed when the reduce entry point is triggered. This entry point is triggered
         * automatically when the associated map stage is complete. This function is applied to each group in the provided context.
         * @param {Object} reduceContext - Data collection containing the groups to process in the reduce stage. This parameter is
         *     provided automatically based on the results of the map stage.
         * @param {Iterator} reduceContext.errors - Serialized errors that were thrown during previous attempts to execute the
         *     reduce function on the current group
         * @param {number} reduceContext.executionNo - Number of times the reduce function has been executed on the current group
         * @param {boolean} reduceContext.isRestarted - Indicates whether the current invocation of this function is the first
         *     invocation (if true, the current invocation is not the first invocation and this function has been restarted)
         * @param {string} reduceContext.key - Key to be processed during the reduce stage
         * @param {List<String>} reduceContext.values - All values associated with a unique key that was passed to the reduce stage
         *     for processing
         * @since 2015.2
         */
        const reduce = (reduceContext) => {
            let jsonObject=JSON.parse(reduceContext.values);
            

            let internalId= jsonObject["Internal ID"]
           
                let curRec= record.load({
                    type: record.Type.ITEM_RECEIPT,
                    id: parseInt(internalId),
                    isDynamic: false,
                });
                
                let lineCount=curRec.getLineCount({sublistId: 'item'});
                let itemCSV= jsonObject["Item ASIN"];
               
                for(let i=0; i< lineCount; i++){
                    
                    let item= curRec.getSublistValue({
                        sublistId : 'item',
                        fieldId: 'custcol_jj_item_asin_lc',
                        line: i
                    });
                    
                    if(itemCSV == item){
                        let geography = curRec.getSublistText({
                            sublistId : 'item',
                            fieldId : 'cseg_geography_display',
                            line: i
                        });

                        let geographyCSV= jsonObject["Country check"];
                        
                        let geographyName = countryCheck(geographyCSV);
                        let landedCost =curRec.getSublistValue({
                            sublistId : 'item',
                            fieldId: 'custcol_jj_lc_template_peritem',
                            line : i
                        })
                        if(geography == geographyName && (!landedCost)){
                            let landedCostCSV= jsonObject["LCT to Apply"];
                            let landedCsotInternalId= findLandedCost(landedCostCSV)
                            curRec.setSublistValue({
                                sublistId: 'item',
                                fieldId: 'custcol_jj_lc_template_peritem',
                                line: i,
                                value: landedCsotInternalId
                            });
                        }
                    }
                }
                curRec.save();
            //}
        }


        /**
         * Defines the function that is executed when the summarize entry point is triggered. This entry point is triggered
         * automatically when the associated reduce stage is complete. This function is applied to the entire result set.
         * @param {Object} summaryContext - Statistics about the execution of a map/reduce script
         * @param {number} summaryContext.concurrency - Maximum concurrency number when executing parallel tasks for the map/reduce
         *     script
         * @param {Date} summaryContext.dateCreated - The date and time when the map/reduce script began running
         * @param {boolean} summaryContext.isRestarted - Indicates whether the current invocation of this function is the first
         *     invocation (if true, the current invocation is not the first invocation and this function has been restarted)
         * @param {Iterator} summaryContext.output - Serialized keys and values that were saved as output during the reduce stage
         * @param {number} summaryContext.seconds - Total seconds elapsed when running the map/reduce script
         * @param {number} summaryContext.usage - Total number of governance usage units consumed when running the map/reduce
         *     script
         * @param {number} summaryContext.yields - Total number of yields when running the map/reduce script
         * @param {Object} summaryContext.inputSummary - Statistics about the input stage
         * @param {Object} summaryContext.mapSummary - Statistics about the map stage
         * @param {Object} summaryContext.reduceSummary - Statistics about the reduce stage
         * @since 2015.2
         */
        const summarize = (summaryContext) => {

        }

        return {getInputData,  reduce, summarize}

    });

Leave a comment

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