Steve Honey
02/02/2022, 9:07 AMLuiz Morais
02/02/2022, 9:52 AMSteve Honey
02/02/2022, 10:03 AMLuiz Morais
02/02/2022, 10:47 AMLuiz Morais
02/02/2022, 10:48 AMbattk
02/02/2022, 11:04 AMbattk
02/02/2022, 11:04 AMSteve Honey
02/03/2022, 10:06 AM/**
* @NApiVersion 2.x
* @NScriptType MapReduceScript
*/
define(['N/runtime', 'N/search', 'N/record', 'N/log'], function (runtime, search, record, log) {
var scriptObj = runtime.getCurrentScript();
const LOCATIONS_IDS = scriptObj.getParameter({ name: 'custscript_location_ids' }).split(',');
const WIP_DATE_FIELD_ID = scriptObj.getParameter({ name: 'custscript_wip_date_item_field' });
function getInputData() {
log.audit({
title: 'Script Started',
details: 'Script Started'
});
var purchaseorderSearchObj = search.create({
type: "purchaseorder",
filters:
[
["type", "anyof", "PurchOrd"],
"AND",
["mainline", "is", "F"],
"AND",
["item.type", "anyof", "InvtPart"],
"AND",
["location", "anyof", LOCATIONS_IDS],
"AND",
["item.inventorylocation", "anyof", LOCATIONS_IDS],
"AND",
["custbody_estimated_arrival_ocean", "isnotempty", ""],
"AND",
["status", "anyof", "PurchOrd:B"],
"AND",
["item.internalid", "anyof", "208199"],
"AND",
["sum(item.locationquantityavailable)", "notgreaterthan", "0"],
"AND",
["sum(item.locationquantityonorder)", "greaterthan", "0"]
],
columns:
[
search.createColumn({
name: "internalid",
join: "item",
summary: "GROUP",
sort: search.Sort.ASC,
label: "item_id"
}),
search.createColumn({
name: "locationquantitybackordered",
join: "item",
summary: "SUM",
label: "backordered"
}),
search.createColumn({
name: "internalid",
summary: "GROUP",
label: "tran_id"
}),
search.createColumn({
name: "custbody_estimated_arrival_ocean",
summary: "GROUP",
sort: search.Sort.ASC,
label: "wip_date"
}),
search.createColumn({
name: "quantity",
summary: "MAX",
label: "po_qty"
})
]
});
return purchaseorderSearchObj;
}
function map(context) {
searchResult = JSON.parse(context.value);
log.debug({
title: 'map:Key',
details: context.key
});
log.debug({
title: 'map:Item ID',
details: searchResult.values['GROUP(internalid.item)'].value
});
var yearNum = parseInt(searchResult.values['GROUP(custbody_estimated_arrival_ocean)'].split('/')[0]);
var monthNum = parseInt(searchResult.values['GROUP(custbody_estimated_arrival_ocean)'].split('/')[1]);
var index = yearNum + monthNum;
context.write({
key: searchResult.values['GROUP(internalid.item)'].value + ':' + searchResult.values['SUM(locationquantitybackordered.item)'],
value: index + ':' + searchResult.values['GROUP(custbody_estimated_arrival_ocean)'] + ':' + searchResult.values['MAX(quantity)']
})
}
function reduce(context) {
log.debug({
title: 'reduce:Key',
details: context.key
});
log.debug({
title: 'reduce:Values',
details: context.values
});
var itemId = context.key.split(":")[0];
var backOrderedQty = context.key.split(":")[1];
log.debug({
title: 'reduce:itemId',
details: itemId
});
log.debug({
title: 'reduce:backOrderedQty',
details: backOrderedQty
});
var wipDate = 'soldout';
var runningOnOrderQty = 0;
for (var i = 0; i < context.values.length; i++) {
var poWipDate = context.values[i].split(":")[1];
var poQty = parseInt(context.values[i].split(":")[2]);
log.debug({
title: 'reduce:poQty',
details: poQty
});
log.debug({
title: 'reduce:poWipDate',
details: poWipDate
});
runningOnOrderQty = runningOnOrderQty + poQty;
if (runningOnOrderQty > backOrderedQty) {
wipDate = poWipDate;
break;
}
}
log.debug({
title: 'reduce:wipDate',
details: wipDate
});
var poIndex = i + 1;
log.audit({
title: 'reduce:wipDate result',
details: 'item: ' + itemId + ' will have wip date of ' + wipDate + ' from PO ' + poIndex + ' of ' + context.values.length + ' POs found.'
});
context.write({
key: itemId,
value: wipDate
});
}
function summarize(context) {
var itemsProcessed = 0;
var itemsUpdated = 0;
context.output.iterator().each(function (key, value) {
itemsProcessed++;
log.debug({
title: 'summarize:Key',
details: key
});
log.debug({
title: 'summarize:Value',
details: value
});
var itemObj = record.load({
type: record.Type.INVENTORY_ITEM,
id: key
});
var currentWipDate = itemObj.getText({
fieldId: 'custitem_wip_us'
});
log.debug({
title: 'summarize:currentWipDate',
details: currentWipDate
});
if (value != 'soldout' && currentWipDate != value) {
itemObj.setValue({
fieldId: WIP_DATE_FIELD_ID,
value: new Date(value)
});
itemObj.save({
enableSourcing: false,
ignoreMandatoryFields: true
});
itemsUpdated++;
} else if (currentWipDate && value == 'soldout') {
itemObj.setValue({
fieldId: WIP_DATE_FIELD_ID,
value: null
});
itemObj.save({
enableSourcing: false,
ignoreMandatoryFields: true
});
itemsUpdated++;
}
return true;
});
log.audit({
title: 'Total Items Evaluated',
details: itemsProcessed
});
log.audit({
title: 'Total Items Updated',
details: itemsUpdated
});
log.audit({
title: 'Usage units consumed',
details: context.usage
});
log.audit({
title: 'Concurrency',
details: context.concurrency
});
log.audit({
title: 'Number of yields',
details: context.yields
});
}
return {
getInputData: getInputData,
map: map,
reduce: reduce,
summarize: summarize
};
});
battk
02/03/2022, 10:42 AMbattk
02/03/2022, 10:43 AMbattk
02/03/2022, 10:44 AMbattk
02/03/2022, 10:47 AMSteve Honey
02/03/2022, 9:16 PM