Deleting Unwanted Rebate records from Invoice

/**
 * @NApiVersion 2.1
 * @NScriptType MapReduceScript
 */
define(['N/file', 'N/record', 'N/search','./papaparse.min.js'],
    /**
 * @param{file} file
 * @param{record} record
 * @param{search} search
 */
    (file, record, search,pappa) => {


        function getinvoiceDetails(invoiceId){
            try{
                let invoiceSearchObj = search.create({
                    type: "invoice",
                    filters:
                    [
                       ["type","anyof","CustInvc"], 
                       "AND", 
                       ["numbertext","is",invoiceId], 
                       "AND", 
                       ["mainline","is","T"]
                    ],
                    columns:
                    [
                       search.createColumn({name: "internalid", label: "Internal ID"})
                    ]
                 });
                 let internalId="";
                 invoiceSearchObj.run().each(function(result){
                    internalId = result.getValue({name: "internalid"});
                    return true;
                 });
                 return internalId;
            }
            catch(e){
                log.error("error@getinvoiceDetails",e)
                return "";
            }
        }
        /**
         * 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: 868817});
                let fileContents = csvFile.getContents();
                let dataFile=pappa.parse(fileContents,{
                    header:true,
                    skipEmptyLines:true
               }).data;
               log.debug("val",dataFile)   
               return dataFile;  
            }
            catch(e){
                log.error("Error in getInputData", e)
            }
        }

        /**
         * Defines the function that is executed when the map entry point is triggered. This entry point is triggered automatically
         * when the associated getInputData stage is complete. This function is applied to each key-value pair in the provided
         * context.
         * @param {Object} mapContext - Data collection containing the key-value pairs to process in the map stage. This parameter
         *     is provided automatically based on the results of the getInputData stage.
         * @param {Iterator} mapContext.errors - Serialized errors that were thrown during previous attempts to execute the map
         *     function on the current key-value pair
         * @param {number} mapContext.executionNo - Number of times the map function has been executed on the current key-value
         *     pair
         * @param {boolean} mapContext.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} mapContext.key - Key to be processed during the map stage
         * @param {string} mapContext.value - Value to be processed during the map stage
         * @since 2015.2
         */

        const map = (mapContext) => {
            try{
                let searchResult = JSON.parse(mapContext.value);
                log.debug("searchResult",searchResult["Document Number"]);

                mapContext.write({
                    key: searchResult["Document Number"],
                    value: searchResult
                });
                
            }
            catch(e){
                log.error("error@Map",e)
            }
        }

        /**
         * 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) => {
            try{

                //if(reduceContext.key == 'INVDUB4616'){
                let internalId = getinvoiceDetails(reduceContext.key);
                
                log.debug("internalId",internalId);
                let invoiceRecord = record.load({type: record.Type.INVOICE, id: internalId});
                let createdFromId = invoiceRecord.getValue({fieldId: "createdfrom"});
                let createdFrom =  record.load({type: 'salesorder', id: createdFromId});
                let createdLineCount =  createdFrom.getLineCount({sublistId: "item"});
                let invoiceLineCount = invoiceRecord.getLineCount({sublistId: "item"});

                for(let i=0; i<invoiceLineCount; i++){
                    let orderLine =  invoiceRecord.getSublistValue({sublistId: "item", fieldId: "orderline", line: i});
                    let rebateAmount = invoiceRecord.getSublistValue({sublistId: "item", fieldId: "custcol_nsts_rm_purchase_rebate", line: i});

                    if(parseFloat(rebateAmount)>0){
                        for(let j=0; j<createdLineCount; j++){
                            let createdLine =  createdFrom.getValue({sublistId: 'item', fieldId: 'line', line: j});

                            if(orderLine == createdLine){
                                let rebateAmountCreated = createdFrom.getSublistValue({sublistId: "item", fieldId: "custcol_nsts_rm_purchase_rebate", line: j});
                                let totalRebate = createdFrom.getSublistValue({ sublistId: 'item', fieldId: 'custcol_nsts_rm_purchase_rebate_total', line: j });
                                let rebateSelected =  createdFrom.getSublistValue({ sublistId: 'item', fieldId: 'custcol_nsts_rm_selected_rebates', line: j });
                                let gpAmount = createdFrom.getSublistValue({ sublistId: 'item', fieldId: 'custcol_nsts_rm_gpamt_after_rebate', line: j });
                                let gpPercent = createdFrom.getSublistValue({ sublistId: 'item', fieldId: 'custcol_nsts_rm_gppct_after_rebate', line: j });


                                invoiceRecord.getSublistValue({ sublistId: 'item', fieldId: 'custcol_nsts_rm_purchase_rebate_total', line: j, value:  parseFloat(totalRebate)});
                                invoiceRecord.getSublistValue({ sublistId: 'item', fieldId: 'custcol_nsts_rm_selected_rebates', line: j, value: rebateSelected});
                                invoiceRecord.getSublistValue({ sublistId: 'item', fieldId: 'custcol_nsts_rm_gpamt_after_rebate', line: j, value: parseFloat(gpAmount) });
                                invoiceRecord.getSublistValue({ sublistId: 'item', fieldId: 'custcol_nsts_rm_gppct_after_rebate', line: j, value: parseFloat(gpPercent) });
                                invoiceRecord.getSublistValue({ sublistId: 'item', fieldId: 'custcol_nsts_rm_purchase_rebate', line: j, value: parseFloat(rebateAmountCreated) });


                            }
                        }
                    }
                }
                invoiceRecord.save();
            //}
            }
            catch(e){
                log.error("error@Reduce",e)
            }
        }


        /**
         * 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, map, reduce, summarize}

    });

Leave a comment

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