To streamline the process of managing sales orders in relation to project completion, we have developed a User Event Script for NetSuite. This script ensures that whenever a project’s status is updated to “Closed,” the corresponding sales order is automatically closed. By leveraging a custom field (custentity_jj_sales_order_id) on the project record, the script identifies the related sales order, verifies that all line items are closed, and updates the sales order status accordingly. This automation reduces manual effort, minimizes errors, and ensures accurate and timely status updates for sales orders based on project completion.
/**
* @NApiVersion 2.x
* @NScriptType UserEventScript
*/
define([‘N/log’, ‘N/record’],
/**
* @param{log} log
* @param{record} record
*/
(log, record) => {
/**
* Defines the function definition that is executed after the record is submitted.
* @param {Object} scriptContext – The context in which the script is executed.
* @param {Record} scriptContext.newRecord – The new version of the record.
* @param {Record} scriptContext.oldRecord – The old version of the record.
* @param {string} scriptContext.type – The trigger type; use values from the context.UserEventType enum.
* @since 2015.2
*/
const afterSubmit = (scriptContext) => {
try {
if (scriptContext.type !== scriptContext.UserEventType.EDIT) {
return;
}
const newRecord = scriptContext.newRecord;
const projectStatus = newRecord.getText(‘entitystatus’);
if (projectStatus === ‘Closed’) {
const salesOrderId = newRecord.getValue(‘custentity_jj_sales_order_id’);
if (salesOrderId) {
closeSalesOrder(salesOrderId);
} else {
log.error(‘Sales Order ID is not found on the project record.’);
}
}
} catch (e) {
log.error(‘Error in afterSubmit function’, e.toString());
}
}
/**
* Closes the sales order and its line items.
* @param {number} salesOrderId – The internal ID of the sales order to close.
*/
const closeSalesOrder = (salesOrderId) => {
try {
let salesOrderRecord = record.load({
type: record.Type.SALES_ORDER,
id: salesOrderId
});
const lineCount = salesOrderRecord.getLineCount({ sublistId: ‘item’ });
let allItemsClosed = true;
for (let i = 0; i < lineCount; i++) {
const isClosed = salesOrderRecord.getSublistValue({
sublistId: ‘item’,
fieldId: ‘isclosed’,
line: i
});
if (!isClosed) {
salesOrderRecord.setSublistValue({
sublistId: ‘item’,
fieldId: ‘isclosed’,
line: i,
value: true
});
}
allItemsClosed = allItemsClosed && salesOrderRecord.getSublistValue({
sublistId: ‘item’,
fieldId: ‘isclosed’,
line: i
});
}
/** @description Assuming ‘B’ is the status for closed orders */
if (allItemsClosed) {
salesOrderRecord.setValue({
fieldId: ‘orderstatus’,
value: ‘B’
});
const saveId = salesOrderRecord.save();
} else {
const saveId = salesOrderRecord.save();
}
} catch (e) {
log.error(‘Error closing sales order’, e.toString());
}
}
return { afterSubmit }
});