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}
});