In certain situations, handling more items than initially specified in a purchase order can pose a challenge within NetSuite. To address this, a customization involves adding a special field to the Item receipt. This field allows users to input the over-received quantity. Consequently, the quantity specified in this custom field will update the corresponding Item quantity in the Purchase order. Users can then create an item receipt for this excess quantity and generate a Vendor bill that includes these additional items.
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
/*************************************************************************************************************************
* BigRig Group
* Epic: BRGC-94
*
* BRGC-174 : Over Receiving Handling
*
*********************************************************************************************************************
*
* Author: Jobin & Jismi IT Services
*
* Date Created : 14-December-2023
*
* Description :This is a user event to sccript to update the PO if over received the items
*
* REVISION HISTORY
*
* @version 1.0 BRGC-174 : 14-December-2023 : Created the initial build by JJ0053
**************************************************************************************************************************/
define(['N/record'],
/**
* @param{record} record
*/
(record) => {
//Allowed Subsidiaries
const SUBSIDIARIES = [16];
/**
* Function defined to do the subsidiary restriction
* @param {*} subsidiary
* @returns
*/
function subsidiaryCheck(subsidiary) {
try {
if (SUBSIDIARIES.includes(Number(subsidiary)))
return true;
return false;
} catch (e) {
console.log('error@subsidiaryCheck', e);
}
}
/**
* function defined to fetch the Over received quantity from the Purchase order
* @param {record Object} newRecObj
* @returns {object}
*/
function getOverQty(newRecObj) {
try {
let lineCount = newRecObj.getLineCount({ sublistId: 'item' });
let overQtyObj = {};
for (let i = 0; i < lineCount; i++) {
let received = newRecObj.getSublistValue({ sublistId: 'item', fieldId: 'itemreceive', line: i });
let overQty = newRecObj.getSublistValue({ sublistId: 'item', fieldId: 'custcol_jj_over_received_qty', line: i });
let orderLine = newRecObj.getSublistValue({ sublistId: 'item', fieldId: 'orderline', line: i });
if (received == true && overQty && overQty > 0) {
overQtyObj[orderLine] = overQty;
}
}
return overQtyObj;
} catch (e) {
log.error('error@getOverQty', e);
return {};
}
}
/**
* function defined to update the purchase order quantity according to the over received quantity
* @param {record object} newRecObj
* @param {object} overQtyObj
*/
function updatePoItemQty(newRecObj, overQtyObj) {
try {
let poId = newRecObj.getValue({ fieldId: 'createdfrom' });
let soRecObj = record.load({
type: 'purchaseorder',
id: poId,
isDynamic: true
});
for (let key in overQtyObj) {
let lineNumber = soRecObj.findSublistLineWithValue({
sublistId: 'item',
fieldId: 'line',
value: key
});
if (lineNumber != -1) {
soRecObj.selectLine({ sublistId: 'item', line: lineNumber });
let qty = soRecObj.getCurrentSublistValue({ sublistId: 'item', fieldId: 'quantity' })
let newQty = (Number(qty) + Number(overQtyObj[key])).toFixed(2);
soRecObj.setCurrentSublistValue({ sublistId: 'item', fieldId: 'quantity', value: newQty });
soRecObj.commitLine({ sublistId: 'item' });
}
}
let id = soRecObj.save({
enableSourcing: false,
ignoreMandatoryFields: true
});
log.debug('id', id);
} catch (e) {
log.error('error@updatePoItemQty', e);
}
}
/**
* Defines the function definition that is executed after record is submitted.
* @param {Object} scriptContext
* @param {Record} scriptContext.newRecord - New record
* @param {Record} scriptContext.oldRecord - Old record
* @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
* @since 2015.2
*/
const afterSubmit = (scriptContext) => {
try {
if (scriptContext.type == 'create') {//Only when the IR is being created
let newRecObj = scriptContext.newRecord;
let subsidiary = newRecObj.getValue({ fieldId: 'subsidiary' });
if (subsidiaryCheck(subsidiary)) {//subsidiary check
let createdFrom = newRecObj.getText({ fieldId: 'createdfrom' });
if (createdFrom.includes("Purchase Order")) {// only if the IR is created from PO
let overQtyObj = getOverQty(newRecObj);
log.debug('overQtyObj', overQtyObj);
updatePoItemQty(newRecObj, overQtyObj);
}
}
}
} catch (e) {
log.error('error@afterSubmit', e);
}
}
return { afterSubmit }
});