A popup notification will show while saving sales orders if any items are in backorder. The check box field called “In Active BO Popup Notification” will be created for the employee record. If the check box was checked then the back order popup notification will not show for the employee.
The popup notification has the following details for back-ordered items:
- Item code
- Qty Ordered
- Qty back ordered
/**
* @NApiVersion 2.1
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
/*******************************************************************************
* Flowco Ltd t/a Waterworks
******************************************************************************
* Date: 22 December 2022
* Author: Jobin & Jismi IT Services LLP
* Script Description: The client script is for the button action and Back order Items Alert message.
*
******************************************************************************/
define(['N/currentRecord', 'N/url', 'N/runtime', 'N/ui/dialog', 'N/record', 'N/search', 'N/ui/message'],
/**
* @param{currentRecord} currentRecord
* @param{url} url
* @param{runtime} runtime
* @param{dialog} dialog
* @param{record} record
* @param{search} search
* @param{message} message
*/
function (currentRecord, url, runtime, dialog, record, search, message) {
let mode;
/**
* Function to be executed after page is initialized.
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @param {string} scriptContext.mode - The mode in which the record is being accessed (create, copy, or edit)
* @since 2015.2
*/
function pageInit(scriptContext) {
mode = scriptContext.mode;
}
/**
* Validation function to be executed when record is saved.
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @returns {boolean} Return true if record is valid
* @since 2015.2
*/
function saveRecord(scriptContext) {
try {
let currentUser = runtime.getCurrentUser().id;
let fieldLookUp = search.lookupFields({
type: record.Type.EMPLOYEE,
id: currentUser,
columns: ['custentity_jj_active_bo_notification']
});
let inactiveAlert = fieldLookUp.custentity_jj_active_bo_notification;
if (inactiveAlert === true) {
let text = '';
let BOQty;
let currentRecord = scriptContext.currentRecord;
let itemLineCount = currentRecord.getLineCount({sublistId: 'item'});
if(mode ==='create' || mode ==='edit') {
for (let i = 0; i < itemLineCount; i++) {
let itemType = currentRecord.getSublistValue({sublistId: 'item', fieldId: 'itemtype', line: i});
if (itemType !== "OthCharge") {
let OrdQty = parseInt(currentRecord.getSublistValue({sublistId: 'item', fieldId: 'quantity', line: i}));
let availableQty = currentRecord.getSublistValue({sublistId:'item',fieldId:'quantityavailable',line:i});
BOQty = OrdQty - availableQty;
if (BOQty > 0) {
let item = currentRecord.getSublistValue({sublistId: 'item', fieldId: 'item_display', line: i});
let itemArr = item.toString().split(':', 2);
if (itemArr.length === 2) {
item = itemArr[1];
} else {
item = itemArr[0];
}
text += 'Item: "' + item + '" Ord.Qty: "' + OrdQty + '" BO Qty: "' + BOQty + '"\n';
}
}
}
}
else if(mode ==='copy') {
let ItemArr = [];
for (let i = 0; i < itemLineCount; i++) {
let itemObj ={};
let itemType = currentRecord.getSublistValue({sublistId: 'item', fieldId: 'itemtype', line: i});
if (itemType !== "OthCharge") {
let itemId = currentRecord.getSublistValue({sublistId: 'item', fieldId: 'item', line: i});
let OrdQty = parseInt(currentRecord.getSublistValue({sublistId: 'item', fieldId: 'quantity', line: i}));
let itemLocation = currentRecord.getSublistValue({sublistId: 'item', fieldId: 'location', line: i});
let item = currentRecord.getSublistValue({sublistId: 'item', fieldId: 'item_display', line: i});
itemObj.itemId = itemId;
itemObj.item = item;
itemObj.OrdQty = OrdQty;
itemObj.itemLocation = itemLocation;
itemObj.i=i
ItemArr.push(itemObj);
}
}
text = itemAvailableQuantity(ItemArr,currentRecord);
}
if (text) {
let r = confirm("The following Items are Back Ordered...\n\n" + text);
if (r) {
return true;
} else {
return false;
}
}
}
return true;
} catch (e) {
log.error({title: "error@saveRecord", details: e});
}
}
/**
*
* @param currentLine
* @param item
* @param currentRecord
* @param availableQty
* @returns {number}
*/
function checkSameItems(currentLine, item, currentRecord, availableQty) {
try {
let lineNumber = currentRecord.findSublistLineWithValue({
sublistId: 'item',
fieldId: 'item',
value: item
});
if (lineNumber < currentLine && lineNumber >= 0) {
let orderedQty = parseInt(currentRecord.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: lineNumber
}));
availableQty = availableQty - orderedQty
if (availableQty < 0) {
availableQty = 0;
}
}
return availableQty;
} catch (e) {
log.error({title: "error@checkSameItems", details: e});
}
}
/**
*
* @param ItemArr
* @param currentRecord
* @returns {*}
*/
function itemAvailableQuantity(ItemArr,currentRecord) {
try {
let filterArr =[];
let text ='';
for (let i = 0; i < ItemArr.length; i++) {
let a = [["internalid","anyof",ItemArr[i].itemId],"AND",["location","anyof",ItemArr[i].itemLocation]];
filterArr.push(a);
if(ItemArr.length - 1 !== i){
let d = "OR";
filterArr.push(d);
}
}
let itemSearchObj = search.create({
type: "item",
filters:filterArr,
columns:
[
search.createColumn({name: "quantityavailable", label: "Available"}),
search.createColumn({name: "internalid", label: "Internal ID"})
]
});
itemSearchObj.run().each(function (result) {
let itemId = result.getValue({name: "internalid", label: "Internal ID"});
let availableQty = result.getValue({name: "quantityavailable", label: "Available"});
if (!availableQty) {
availableQty = 0;
}
let obj ={};
for (let i = 0; i < ItemArr.length; i++) {
let item1 = ItemArr[i].itemId;
if(itemId === item1){
obj = ItemArr[i];
}
}
let BOQty = obj.OrdQty - checkSameItems(obj.i, itemId, currentRecord, availableQty);
if (BOQty > 0) {
let item =obj.item;
let itemArr = item.toString().split(':', 2);
if (itemArr.length === 2) {
item = itemArr[1];
} else {
item = itemArr[0];
}
text += 'Item: "' + item + '" Ord.Qty: "' + obj.OrdQty + '" BO Qty: "' + BOQty + '"\n';
}
return true;
});
return text;
} catch (e) {
log.error({title: "error@itemAvailableQuantity", details: e});
}
}
return {
pageInit: pageInit,
saveRecord: saveRecord,
};
});