Adam Weaver
02/24/2025, 3:03 PMNickSuite
02/24/2025, 3:13 PMAdam Weaver
02/24/2025, 3:15 PMNickSuite
02/24/2025, 3:15 PMAdam Weaver
02/24/2025, 3:17 PMNickSuite
02/24/2025, 3:17 PMAdam Weaver
02/24/2025, 4:12 PMbattk
02/24/2025, 7:37 PMAdam Weaver
02/24/2025, 7:42 PM/**
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
define(['N/record', 'N/log'], (record, log) => {
const afterSubmit = (context) => {
// Process only on CREATE or EDIT events
if (context.type !== context.UserEventType.CREATE &&
context.type !== context.UserEventType.EDIT) {
return;
}
const salesOrder = context.newRecord;
const lineCount = salesOrder.getLineCount({ sublistId: 'item' });
let workOrderCreated = false;
let createdWorkOrderId = null;
for (let i = 0; i < lineCount; i++) {
// Retrieve the assembly item from the "item" field
const assemblyItemId = salesOrder.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
});
// Retrieve the Sales Order line's quantity from the "quantity" field
const salesOrderLineQuantity = salesOrder.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i
});
if (!assemblyItemId) {
log.error('Missing Assembly Item', 'Sales Order line ' + i + ' does not have a valid assembly item.');
continue;
}
try {
// Load the Assembly Item record to access its components
const assemblyItemRecord = record.load({
type: record.Type.ASSEMBLY_ITEM,
id: assemblyItemId,
isDynamic: false
});
// Get the number of components in the assembly item
const componentCount = assemblyItemRecord.getLineCount({ sublistId: 'component' });
let workOrderNeeded = false;
// Loop through each component to check if it meets criteria
for (let j = 0; j < componentCount; j++) {
// Get the unit of measure (assumed to be in the "units" field)
const unit = assemblyItemRecord.getSublistValue({
sublistId: 'component',
fieldId: 'units',
line: j
});
// Get the component quantity
const componentQty = assemblyItemRecord.getSublistValue({
sublistId: 'component',
fieldId: 'quantity',
line: j
});
// If the unit is 'Gal' and the component quantity is over 50, flag for work order creation
if (unit === 'Gal' && componentQty > 50) {
workOrderNeeded = true;
break;
}
}
// If criteria met, create a Work Order
if (workOrderNeeded) {
try {
const workOrder = record.create({
type: record.Type.WORK_ORDER,
isDynamic: true
});
workOrder.setValue({
fieldId: 'assemblyitem',
value: assemblyItemId
});
workOrder.setValue({
fieldId: 'quantity',
value: salesOrderLineQuantity
});
// Optionally, set additional fields (e.g., location) here
createdWorkOrderId = workOrder.save();
log.debug('Work Order Created', 'Work Order ID: ' + createdWorkOrderId +
' created for Assembly Item ID: ' + assemblyItemId);
workOrderCreated = true;
} catch (createErr) {
log.error('Error Creating Work Order', 'Sales Order line ' + i + ': ' + createErr.message);
}
}
} catch (loadErr) {
log.error('Error Loading Assembly Item', 'Sales Order line ' + i + ': ' + loadErr.message);
}
}
// If a Work Order was created, update the Sales Order custom field with its number
if (workOrderCreated && createdWorkOrderId) {
try {
record.submitFields({
type: salesOrder.type,
id: salesOrder.id,
values: {
custbodycustbody_work_order_id: createdWorkOrderId
}
});
log.debug('Sales Order Updated', 'Custom field updated with Work Order ID: ' + createdWorkOrderId);
} catch (updateErr) {
log.error('Error Updating Sales Order', 'Sales Order ID ' + salesOrder.id + ': ' + updateErr.message);
}
}
};
return { afterSubmit };
});
battk
02/24/2025, 7:43 PMbattk
02/24/2025, 7:43 PMAdam Weaver
02/24/2025, 7:44 PMbattk
02/24/2025, 7:44 PMAdam Weaver
02/24/2025, 7:44 PMAdam Weaver
02/24/2025, 7:45 PMbattk
02/24/2025, 7:45 PMAdam Weaver
02/24/2025, 7:46 PMAdam Weaver
02/24/2025, 7:47 PMbattk
02/24/2025, 7:49 PMbattk
02/24/2025, 7:51 PMbattk
02/24/2025, 7:51 PMbattk
02/24/2025, 7:52 PMAdam Weaver
02/24/2025, 7:53 PMbattk
02/24/2025, 7:55 PMbattk
02/24/2025, 7:56 PMAdam Weaver
02/24/2025, 7:57 PM