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