The client would like to create a customization that will close the item lines in the purchase order that are not received and create a new purchase order for the unreceived items.
We can create a user event script that can be deployed in the Item receipt
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
/*******************************************************************
* UserEvent Script
****************************************************************
*
* Date: 25/12/2022
*
* Author: Jobin and Jismi IT Services LLP
*
* REVISION HISTORY
*
* Revision 1.0
*
* Description: Auto PO creation and item line closing
*
* Revision 2.0
*
*
***************************************************************/
define(['N/email', 'N/file', 'N/record', 'N/search','N/ui/serverWidget','N/format'],
/**
* @param{email} email
* @param{file} file
* @param{record} record
* @param{search} search
*/
(email, file, record, search,serverWidget,format) => {
let poorderLine;
let poCount;
let itemArray = [];
let newItemArray=[];
let itemDataArray=[];
let closedItemArray=[];
/**
* @description the fuctcion to remove null value from the array
* @param array - array containing elements
*/
function removeNull(newItemArray) {
try {
return newItemArray.filter(element => {
return element !== null;
});
} catch (e) {
log.debug("error @removeNull function", e)
}
}
/**
* @description the fuctcion to close line item in PO
* @param newObjRec - new po record
* @param i - line to close
*/
function closeLineItem(poRecord, i) {
try {
poRecord.setSublistValue({
sublistId: 'item',
fieldId: 'isclosed',
value: true,
line: i,
ignoreFieldChange: true
})
} catch (e) {
log.error("error @ function closeLineItem", e)
}
}
/**
* @description the fuctcion to insert new item line to PO
* @param a - array containing elements
* @param newObjRec - new po record
*/
function addItemLines(newPoOrder,newItemArray) {
try {
let arr = removeNull(newItemArray)
log.debug("arr", arr)
for (let i = 0; i < arr.length; i++) {
//set value to item line item field
// newPoOrder.selectNewLine({sublistId: 'item', line: i});
newPoOrder.setSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i,
value: arr[i].itemName
});
newPoOrder.setSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i,
value: arr[i].quantity
});
// newPoOrder.commitLine({sublistId: 'item'});
}
let newObjRecId = newPoOrder.save({
enableSourcing:true,
ignoreMandatoryFields:true
});
log.debug("newObjRecId", newObjRecId)
return newObjRecId;
} catch (e) {
log.error("error @addItemLines function", e)
}
}
function purchaseOrderDetails(poRecordsId){
try {
let itemArray=[]
let purchaseorderSearchObj = search.create({
type: "purchaseorder",
filters:
[
["type","anyof","PurchOrd"],
"AND",
["internalid","anyof",poRecordsId],
"AND",
["mainline","is","T"]
],
columns:
[
search.createColumn({
name: "internalid",
join: "vendor",
label: "Internal ID"
}),
search.createColumn({
name: "trandate", label: "Date"
}),
search.createColumn({name: "currency", label: "Currency"}),
search.createColumn({
name: "internalid",
join: "location",
label: "Internal ID"
}),
search.createColumn({name: "exchangerate", label: "Exchange Rate"}),
search.createColumn({name: "custbody_bil_type", label: "BILL TYPE"}),
search.createColumn({name: "custbody_purchase_remarks", label: "Remarks"}),
search.createColumn({name: "subsidiary", label: "Subsidiary"})
]
});
let searchResultCount = purchaseorderSearchObj.runPaged().count;
log.debug("purchaseorderSearchObj result count",searchResultCount);
let itemObj = {}
if (searchResultCount > 0){
purchaseorderSearchObj.run().each(function(result){
// .run().each has a limit of 4,000 results
//return true;
itemObj.memberId = result.getValue({
name: "internalid",
join: "vendor",
label: "Internal ID"
}),
itemObj.memberDate = result.getValue({
name: "trandate",
label: "Date"
}),
itemObj.memberCurrency = result.getValue({
name: "currency",
label: "Currency"
})
itemObj.memberLocation = result.getValue({
name: "internalid",
join: "location",
label: "Internal ID"
})
itemObj.memberExcRate = result.getValue({
name: "exchangerate",
label: "Exchange Rate"
})
itemObj.memberBillType = result.getValue({
name: "custbody_bil_type",
label: "BILL TYPE"
})
itemObj.memberRemarks = result.getValue({
name: "custbody_purchase_remarks",
label: "Remarks"
})
itemObj.memberSub = result.getValue({
name: "subsidiary",
label: "Subsidiary"
})
return true;
});
log.debug("itemObj",itemObj)
return itemObj;
}
}catch (e) {
log.debug("error @ search function", e)
}
}
/**
* Defines the function definition that is executed before record is loaded.
* @param {Object} scriptContext
* @param {Record} scriptContext.newRecord - New record
* @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
* @param {Form} scriptContext.form - Current form
* @param {ServletRequest} scriptContext.request - HTTP request information sent from the browser for a client action only.
* @since 2015.2
*/
const beforeLoad = (scriptContext) => {
try {
if (scriptContext.type === 'create') {
let recObj = scriptContext.newRecord;
let poRecordId = recObj.getText({fieldId: 'createdfrom'})
let poRecIntId = recObj.getValue({fieldId: 'createdfrom'})
let form = scriptContext.form;
// add a custom button in IR record
scriptContext.form.addButton({
id: 'custpage_item_receive',
label: 'REJECT ITEM RECEIVING',
functionName: "createRejectReason('" + poRecordId + "','" + poRecIntId + "')"
});
//scriptContext.form.clientScriptModulePath='/SuiteScripts/JJ CL Cust Button Redirect MAMS-44.js';
scriptContext.form.clientScriptFileId = 16274
}
} catch (e) {
log.error("error @ before load function", 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{
let contextMode = scriptContext.type;
if (contextMode === scriptContext.UserEventType.CREATE) {
let irRecord = scriptContext.newRecord;
//check whether the checkbox is checked in the IR record
let isCheckedClosePO = irRecord.getValue({fieldId: 'custbody_jj_closing_po'})
if (isCheckedClosePO === true) {
// load the PO
let poRecordsId = irRecord.getValue({fieldId: 'createdfrom'})
log.debug("poRecordsId", poRecordsId)
let poRecord = record.load({
type: record.Type.PURCHASE_ORDER,
id: poRecordsId,
//isDynamic: true,
});
let transnDate=poRecord.getText({fieldId:'trandate'})
log.debug("transnDate2", new Date(transnDate))
poCount = poRecord.getLineCount({sublistId: 'item'});
// loop through the PO item lines
let i;
for ( i = 0; i < poCount; i++) {
let poItemId = poRecord.getSublistValue({sublistId: 'item', fieldId: 'item', line: i})
poorderLine = poRecord.getSublistValue({fieldId: 'orderline', sublistId: 'item', line: i})
let poQnty = poRecord.getSublistValue({sublistId: 'item', fieldId: 'quantity', line: i})
log.debug("poQnty", poQnty)
let poQntyRecevd = poRecord.getSublistValue({
sublistId: 'item',
fieldId: 'quantityreceived',
line: i
})
log.debug("poQntyRecevd", poQntyRecevd)
let closedPO = poRecord.getSublistValue({
sublistId: 'item',
fieldId: 'isclosed',
line: i
})
log.debug("closedPO", closedPO)
// set the line item to 'closed' if quantity received is zero
if (poQntyRecevd == 0 && closedPO == false)
{
let itemData = {
itemName: poItemId,
quantity: poQnty,
};
itemArray.push(itemData)
log.debug("itemArray", itemArray)
closeLineItem(poRecord, i)
}
else
if (poQntyRecevd == 0 && closedPO == true){
let itemData = {
itemName: poItemId,
quantity: poQnty,
};
closedItemArray.push(itemData)
log.debug("closedItemArray", closedItemArray)
}
else {
// close the PO item line and add new line for received quantity if the received quantity is less than
// actual quantity, also create new PO for rest of the items
if (poQnty > poQntyRecevd) {
let newPOQnty = poQnty - poQntyRecevd;
log.debug("newPOQnty", newPOQnty)
let itemData = {
itemName: poItemId,
quantity: newPOQnty,
};
itemDataArray.push(itemData)
log.debug("itemDataArray", itemDataArray)
poRecord.setSublistValue({
sublistId: "item",
fieldId: "quantity",
value: poQntyRecevd,
line: i
});
// close the item line if the quantity>quantityreceived
// closeLineItem(poRecord, i)
}
}
}
// add new item line to the PO record with new quantity if quantity>quantityReceived
for (let k = 0; k < itemDataArray.length; k++) {
var lineCount = poRecord.getLineCount({sublistId: 'item'});
poRecord.setSublistValue({
sublistId: "item",
fieldId: "item",
value: itemDataArray[k].itemName,
line: lineCount,
});
poRecord.setSublistValue({
sublistId: "item",
fieldId: "quantity",
value: itemDataArray[k].quantity,
line: lineCount
});
closeLineItem(poRecord, lineCount)
}
poRecord.save({
enableSourcing: true,
ignoreMandatoryFields: true,
})
let newPoItemDetails=purchaseOrderDetails(poRecordsId)
log.debug("newPoItemDetails",newPoItemDetails)
let newPoOrder=record.create({
type: record.Type.PURCHASE_ORDER,
})
newPoOrder.setValue({fieldId:'entity',value:newPoItemDetails.memberId})
// newPoOrder.setValue({fieldId:'trandate',value:})
let parsedDate=format.parse({value:newPoItemDetails.memberDate, type: format.Type.DATE})
newPoOrder.setValue({fieldId:'trandate',value:parsedDate})
newPoOrder.setValue({fieldId:'currency',value:newPoItemDetails.memberCurrency})
newPoOrder.setValue({fieldId:'location',value:newPoItemDetails.memberLocation})
newPoOrder.setValue({fieldId:'exchangerate',value:newPoItemDetails.memberExcRate})
newPoOrder.setValue({fieldId:'custbody_bil_type',value:newPoItemDetails.memberBillType})
if(newPoItemDetails.memberRemarks){
newPoOrder.setValue({fieldId:'custbody_purchase_remarks',value:newPoItemDetails.memberRemarks})
}
newPoOrder.setValue({fieldId:'subsidiary',value:newPoItemDetails.memberSub})
//newPoOrder.setValue({fieldId:'entity',value:newPoItemDetails.memberAddr})
newItemArray=itemArray.concat(itemDataArray);
log.debug("newItemArray", newItemArray)
var newobjRecId = addItemLines(newPoOrder,newItemArray)
log.debug("newobjRecId", newobjRecId)
record.submitFields({
type: record.Type.PURCHASE_ORDER,
id: poRecordsId,
values: {
'custbody_jj_childpo':newobjRecId
},
options: {
enableSourcing: false,
ignoreMandatoryFields: true
}
});
let id = record.submitFields({
type: record.Type.PURCHASE_ORDER,
id: newobjRecId,
values: {
'currency': newPoItemDetails.memberCurrency,
'location': newPoItemDetails.memberLocation,
'custbody_jj_createdpo':poRecordsId
},
options: {
enableSourcing: false,
ignoreMandatoryFields: true
}
});
log.debug("id", id)
}
}
}catch (e) {
log.error("error @ after submit",e)
}
}
return {beforeLoad, afterSubmit}
});