Automatic call For Online Orders (Map Reduce Script)

Set up call backs for customers who have not been assigned a sales rep. These would be customers who have placed an online (web order) and have not communicated with a sales rep. 

Map Reduce Script

/**
 * @NApiVersion 2.1
 * @NScriptType MapReduceScript
 */
define(['N/search','N/record'],
    
    (search,record) => {

        const getInputData = (inputContext) => {
                try{
                    
                        var salesorderSearchObj = search.create({
                            type: "salesorder",
                            filters:
                                [
                                    ["type","anyof","SalesOrd"],
                                    "AND",
                                    ["mainline","is","T"],
                                    "AND",
                                    ["name","anyof","218374"],
                                    "AND",
                                    ["custbody1","isnotempty",""],
                                    "AND",
                                    [["salesrep","anyof","@NONE@"],"AND",["customermain.salesrep","anyof","@NONE@"]],
                                    "AND",
                                    ["custbody_jj_auto_call_weborder","is","F"],
                                    "AND",
                                    ["datecreated","on","today"]

                                ],
                            columns:
                                [
                                    search.createColumn({
                                        name: "entity",
                                        sort: search.Sort.ASC,
                                        label: "name"
                                    }),
                                    search.createColumn({
                                        name: "internalid",
                                        label: "internalid"
                                    }),
                                    search.createColumn({
                                        name: "custentitycustomer_rating",
                                        join: "customerMain",
                                        label: "Customer Rating"
                                    }),

                                    search.createColumn({
                                        name: "tranid",
                                        label: "Document Number"
                                    })


                                ]
                        });

                        var searchResultCount = salesorderSearchObj.runPaged().count;
                        log.debug("salesorderSearchObj result count",searchResultCount);
                        var tempObject = {};
                        salesorderSearchObj.run().each(function(result){
                            // .run().each has a limit of 4,000 results
                                    var entity = result.getText({
                                        name: 'entity',
                                        sort: search.Sort.ASC,
                                        label: "Name"
                                    });
                                    var sointernalid = result.getValue({
                                            name: 'internalid',
                                            label: "SO internalid"
                                    });
                                    var rating = result.getValue({
                                                name: "custentitycustomer_rating",
                                                join: "customerMain",
                                                label: "Customer Rating"
                                        });
                                    var soDocumentNumber = result.getValue({
                                        name: "tranid",
                                        label: "Document Number"
                                    });

                                    var searchItemObj = {sointernalid:sointernalid,rating:rating,soDocumentNumber:soDocumentNumber};
                                    tempObject[entity] ? tempObject[entity].push(searchItemObj) : tempObject[entity] = [searchItemObj];
                                    
                                    return true;
                        });

                            return tempObject;
                }
                catch (e) {
                        log.debug('errr@getinput', e);
                        log.error('ERROR', JSON.stringify(e));
                }
        }

        function salesRepSearch(){
            log.debug("inside employee search",true);
            var employeeSearchObj = search.create({
                type: "employee",
                filters:
                    [
                        ["salesrep","is","T"],
                        "AND",
                        ["isinactive","is","F"]
                    ],
                columns:
                    [
                        search.createColumn({
                            name: "internalid",
                            summary: "GROUP",
                            label: "Internal ID"
                        })

                    ]
            });
            var searchResultCount = employeeSearchObj.runPaged().count;
            var saleObj = {};
            log.debug("employeeSearchObj result count",searchResultCount);
            employeeSearchObj.run().each(function(result){
                var internalID = result.getValue({name: "internalid",summary: "GROUP", label: "Internal ID"});
                saleObj[internalID] = 0;
                return true;
            });
            
            return saleObj;

        }

        function phonecallSearch(salesrepVal){
            var phonecallSearchObj = search.create({
                type: "phonecall",
                filters:
                    [
                        ["status","anyof","SCHEDULED"],
                        "AND",
                        ["employee.salesrep","is","T"]
                    ],
                columns:
                        [
                            search.createColumn({
                                name: "assigned",
                                summary: "GROUP",
                                label: "Organizer"
                            }),
                            search.createColumn({
                                name: "internalid",
                                summary: "COUNT",
                                label: "Internal ID"
                            })

                    ]
            });
            var phoneCallArr = [];
            var searchResultCount = phonecallSearchObj.runPaged().count;
            log.debug("phonecallSearchObj result count",searchResultCount);

            phonecallSearchObj.run().each(function(result){

                var assigned = result.getValue({name: "assigned",summary: "GROUP", label: "Organizer"});

                salesrepVal[assigned]= Number(result.getValue({name: "internalid",summary: "COUNT", label: "Internal ID"}));

                return true;
            });
            return salesrepVal;

        }


        /************ Reduce *************/
        const reduce = (reduceContext) => {
                //reduce function

                try {
                        log.debug("inside reduce function","true");
                        var processData = JSON.parse(reduceContext.values[0]);
                        var ratingVal = processData[0].rating;
                        var sointernalid = processData[0].sointernalid;
                        log.debug("rating Value",ratingVal);
                        if(reduceContext.key){
                            var salesrepVal = salesRepSearch();
                            var phoneCallDetails = phonecallSearch(salesrepVal);
                            log.debug("salesrep with phone call count",phoneCallDetails);
                            var sortableDetails = Object.entries(phoneCallDetails)
                                .sort(([,a],[,b]) => a-b)
                            log.debug("sortableDetails",sortableDetails);
                            var resultedSalesRep = sortableDetails[0][0];
                            log.debug("resultedSalesRep",resultedSalesRep);
                            var call = record.create({
                                type: record.Type.PHONE_CALL,
                                isDynamic: true
                            });
                            var orderMessage = "Document Number of the Weborders: \r\n ";
                            call.setValue('title', "Follow-up call for Weborder customer");
                            call.setValue('assigned',resultedSalesRep );
                            for(var key = 0;key < processData.length; key++){
                                var orderId = processData[key].soDocumentNumber;
                                log.debug("orderId",orderId);
                                if(key == processData.length-1)
                                    orderMessage += orderId
                                    else
                                        orderMessage += orderId +"\r\n ";
                            }

                            call.setValue('message', orderMessage);

                            var callId = call.save();
                            log.debug('Call record created successfully', 'Id: ' + callId);
                            for(var key = 0;key < processData.length; key++) {
                                var objRecord = record.submitFields({
                                    type: record.Type.SALES_ORDER,
                                    id: processData[key].sointernalid,
                                    values: {
                                        //salesrep : resultedSalesRep
                                        custbody_jj_auto_call_weborder: true
                                    },
                                    options: {
                                        enableSourcing: false,
                                        ignoreMandatoryFields: true
                                    }
                                });
                            }
                        }
                        
                }
                catch (err) {
                        log.debug("err@reduce", err);
                        log.error('ERROR', JSON.stringify(e));
                }
                
        }
        const summarize = (summaryContext) => {

        }

        return {getInputData, reduce, summarize}

    });

Leave a comment

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