require(['N/search'], function (search) {
const checkForParameter = (parameter, parameterName) => {
if (parameter !== "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null"
&& parameter !== "undefined" && parameter !== " " && parameter !== 'false') {
return true;
}
else {
if (parameterName)
//log.debug('Empty Value found', 'Empty Value for parameter ' + parameterName);
return false;
}
};
const dataSets = {
/**
* @description Object referencing NetSuite Saved Search
* @typedef {Object} SearchObj
* @property {Object[]} filters - Filters Array in Search
* @property {Object[]} columns - Columns Array in Search
*/
/**
* @description to format Saved Search column to key-value pair where each key represents each columns in Saved Search
* @param {Search} savedSearchObj
* @param {void|String} priorityKey
* @returns {Object.<String,SearchObj.columns>}
*/
fetchSavedSearchColumn(savedSearchObj, priorityKey) {
let columns = savedSearchObj.columns;
let columnsData = {}, columnName = '';
columns.forEach((result, counter) => {
columnName = '';
if (result[priorityKey]) {
columnName += result[priorityKey];
}
else {
if (result.summary)
columnName += result.summary + '__';
if (result.formula)
columnName += result.formula + '__';
if (result.join)
columnName += result.join + '__';
columnName += result.name + '__' + counter?.toString();
}
columnsData[columnName] = result;
});
return columnsData;
},
/**
* @description Representing each result in Final Saved Search Format
* @typedef formattedEachSearchResult
* @type {{value:any,text:any}}
*/
/**
* @description to fetch and format the single saved search result. ie, Search result of a single row containing both text and value for each columns
* @param {Object[]} searchResult contains search result of a single row
* @param {Object.<String,SearchObj.columns>} columns
* @returns {Object.<String,formattedEachSearchResult>|{}}
*/
formatSingleSavedSearchResult(searchResult, columns) {
let responseObj = {};
for (let column in columns)
responseObj[column] = {
value: searchResult.getValue(columns[column]),
text: searchResult.getText(columns[column])
};
return responseObj;
},
/**
* @description to iterate over and initiate format of each saved search result
* @param {Object} param
* @param {SearchObj} param.searchObj
* @param {void|Object.<String,SearchObj.columns>} param.columns
* @param {number} param.PAGE_INDEX
* @param {number} param.PAGE_SIZE
* @returns {[]|Object[]}
*/
iterateSavedSearch({ searchObj, columns, PAGE_INDEX = 1, PAGE_SIZE = 1000 }) {
if (!checkForParameter(searchObj))
return false;
if (!checkForParameter(columns))
columns = dataSets.fetchSavedSearchColumn(searchObj);
let response = [];
let searchPageRanges;
try {
searchPageRanges = searchObj.runPaged({
pageSize: Number.isInteger(Number(PAGE_SIZE)) ? parseInt(Number(PAGE_SIZE)?.toString()) : 1000 //Default Page Size
});
}
catch (err) {
return Number.isInteger(PAGE_INDEX) ? {
pageInfo: {
pageLength: 1,
pageIndex: 1,
isLastPage: true
},
lines: []
} : [];
}
if (searchPageRanges.pageRanges.length < 1)
return Number.isInteger(PAGE_INDEX) ? {
pageInfo: {
pageLength: 1,
pageIndex: 1,
isLastPage: true
},
lines: []
} : [];
let pageRangeLength = searchPageRanges.pageRanges.length;
const pageIndexRangeRectifier = function (value, pageRange) {
if (!Number.isInteger(Number(value)))
return 1;
if ((Number(value) - 1) <= 0)
return 1;
if ((Number(value) - 1) >= Number(pageRange))
return Number(pageRange);
return Number(value);
};
if (Number.isInteger(PAGE_INDEX))
searchPageRanges.fetch({
index: pageIndexRangeRectifier(PAGE_INDEX, pageRangeLength) - 1
}).data.forEach(function (result) {
response.push(dataSets.formatSingleSavedSearchResult(result, columns));
});
else
for (let pageIndex = 0; pageIndex < pageRangeLength; pageIndex++)
searchPageRanges.fetch({
index: pageIndex
}).data.forEach(function (result) {
response.push(dataSets.formatSingleSavedSearchResult(result, columns));
});
return Number.isInteger(PAGE_INDEX) ? {
pageInfo: {
pageLength: pageRangeLength,
pageIndex: Number(pageIndexRangeRectifier(PAGE_INDEX, pageRangeLength)),
isLastPage: Number(pageIndexRangeRectifier(PAGE_INDEX, pageRangeLength)) >= Number(pageRangeLength) ? true : false
},
lines: response
} : response;
}
};
let searchObj = search.create({
type: "custrecord",//Add type here
filters:
[
["inactive", "is", "F"]
],
columns:
[
search.createColumn({ name: "internalid", label: "InternalId" }),
]
});
let searchDetails = dataSets.iterateSavedSearch({
searchObj: searchObj,
columns: dataSets.fetchSavedSearchColumn(searchObj, 'label'),
PAGE_INDEX: null,
PAGE_SIZE: 1000,
});
console.log('searchDetails', searchDetails);
});