Remove Sales Order button from Quote if each and every item with the quantity is already created for sales order. After creating a sales Order for every item quantity from a quote, no need to show the sales order button in quote.
For that created a custom column in item sublist for storing the value for line id. Since no value is found in quote and sales order to uniquely identify each line of sales order from quote.
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
define(['N/record', 'N/search'],
/**
* @param{record} record
* @param{search} search
*/
(record, search) => {
/**
* Function to check whether all items in lineId with quantity is already selected in salesorder
* @param {*} internalID
* @param {*} quoteItemQuantities
*
*/
function createSavedSearch(internalID, quoteItemQuantities) {
try {
var salesorderSearchObj = search.create({
type: "salesorder",
filters:
[
["type", "anyof", "SalesOrd"],
"AND",
["createdfrom", "anyof", internalID],
"AND",
["taxline", "is", "F"],
"AND",
["mainline", "is", "F"],
"AND",
["shipping", "is", "F"]
],
columns:
[
search.createColumn({
name: "quantity",
summary: "SUM",
label: "Quantity"
}),
search.createColumn({
name: "custcol_jj_quote_number",
summary: "GROUP",
label: "Quote Line Number"
}),
search.createColumn({
name: "item",
summary: "GROUP",
label: "Item"
})
]
});
var salesOrderQuantities = {};
salesorderSearchObj.run().each(function (result) {
var itemId = result.getValue({
name: "item",
summary: "GROUP",
label: "Item"
});
var quantitySum = parseFloat(result.getValue({
name: "quantity",
summary: "SUM",
label: "Quantity"
}));
// custom column storing the line id
var quoteNumber = result.getValue({
name: "custcol_jj_quote_number",
summary: "GROUP",
label: "Quote Line Number"
});
log.debug('Item ' + quoteNumber + ' has ' + quantitySum + ' quantity');
if (!salesOrderQuantities[itemId]) {
salesOrderQuantities[itemId] = {};
}
salesOrderQuantities[itemId][quoteNumber] = quantitySum;
return true; // Continue to next result
});
var allQuantitiesFulfilled = Object.keys(quoteItemQuantities).every(function (itemId) {
return Object.keys(quoteItemQuantities[itemId]).every(function (quoteNumber) {
log.debug('Checking item ' + itemId + ' and quote number ' + quoteNumber);
return (salesOrderQuantities[itemId] && (salesOrderQuantities[itemId][quoteNumber] || 0) >= quoteItemQuantities[itemId][quoteNumber]);
});
});
return { allQuantitiesFulfilled };
} catch (error) {
log.debug('Error in createSavedSearch function', error);
return { allQuantitiesFulfilled: false };
}
}
/**
* 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') {
var currentRecord = scriptContext.newRecord;
var internalID = currentRecord.id
var quoteItemQuantities = {};
var estimateItemQuantity = {};
var lineCount = currentRecord.getLineCount({ sublistId: 'item' });
for (var i = 0; i < lineCount; i++) {
var itemId = currentRecord.getSublistValue({ sublistId: 'item', fieldId: 'item', line: i });
var quantity = currentRecord.getSublistValue({ sublistId: 'item', fieldId: 'quantity', line: i });
let quoteNumber = currentRecord.getSublistValue({ sublistId: 'item', fieldId: 'custcol_jj_quote_number', line: i });
if (!quoteItemQuantities[itemId]) {
quoteItemQuantities[itemId] = {};
}
if (!quoteItemQuantities[itemId][quoteNumber]) {
quoteItemQuantities[itemId][quoteNumber] = 0;
}
quoteItemQuantities[itemId][quoteNumber] += quantity;
}
var searchResults = createSavedSearch(internalID, quoteItemQuantities, estimateItemQuantity);
if (searchResults.allQuantitiesFulfilled) {
log.debug('All Items Added in SO');
scriptContext.form.getButton('createsalesord').isHidden = true;
}
}
} catch (error) {
log.debug('error at BeforeLoad', error)
return
}
}
/**
* 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 currentRecord = record.load({
type: 'estimate',
id: scriptContext.newRecord.id
})
let lineCount = currentRecord.getLineCount({ sublistId: 'item' });
for (let i = 0; i < lineCount; i++) {
let lineId = currentRecord.getSublistValue({ sublistId: 'item', fieldId: 'line', line: i });
log.debug('line id is', lineId);
let linesID = currentRecord.getSublistValue({ sublistId: 'item', fieldId: 'custcol_jj_quote_number', line: i });
if (!linesID) {
currentRecord.setSublistValue({
sublistId: 'item',
fieldId: 'custcol_jj_quote_number',
line: i,
value: lineId
}); //setting the value for custcolumn from the lineId
}
}
currentRecord.save();
} catch (e) {
log.debug('error@AfterSubmit', e);
}
}
return {
beforeLoad: beforeLoad,
afterSubmit: afterSubmit
}
});