Here we have to design a suitelet page using suitelet script.
/**
* @NApiVersion 2.1
* @NScriptType Suitelet
*/
/*
********************************************************************************************************
*
* Joinbranded-France-NS
*
* JOINF-1804 : Mass Approval of inventory adjustment workflow.
*
* *****************************************************************************************************
*
* Author : Jobin and Jismi IT Services
*
* Date Created: 29 - June - 2023
*
* Created by: Linu Paul, Jobin and Jismi IT Services
*
* Description: In this Suitelet Script, we displayed the Inventory Adjustment Requests from custom record, all of which are in a pending status
* Revision History:
*
* *
* ********************************************************************************************************
*/
define(['N/task', 'N/ui/serverWidget', 'N/search', 'N/file', 'N/record', 'N/runtime', 'N/error'], (task, serverWidget, search, file, record, runtime, error) => {
"use strict";
const INVENTORY_ADJUSTMENT = 20812;
const onRequest = (scriptContext) => {
let currentUser = runtime.getCurrentUser().id;
log.debug("current user", currentUser);
let employeeSearchObj = search.create({
type: "employee",
filters:
[
["internalid", "anyof", currentUser]
],
columns:
[
search.createColumn({ name: "custentity_jj_ia_req_approvers", label: "IA Request approvers" })
]
});
let searchResultCount = employeeSearchObj.runPaged().count;
log.debug("employeeSearchObj result count", searchResultCount);
let checkboxValue;
if (searchResultCount > 0) {
employeeSearchObj.run().each(function (result) {
checkboxValue = result.getValue("custentity_jj_ia_req_approvers");
});
log.debug("checkbox Value", checkboxValue);
}
if (checkboxValue == true) {
try {
let form = serverWidget.createForm({
title: 'Inventory Adjustment Request'
});
if (scriptContext.request.method === 'GET') {
let sublist = form.addSublist({
id: '_jj_sublist',
type: serverWidget.SublistType.LIST,
label: 'View Inventory Adjustment Request'
});
sublist.addField({
id: 'custrecord_jj_tick',
type: serverWidget.FieldType.CHECKBOX,
label: 'Select'
});
sublist.addField({
id: 'internalid',
type: serverWidget.FieldType.TEXT,
label: 'Internal ID',
align: serverWidget.LayoutJustification.RIGHT
});
sublist.addField({
id: 'custrecord_jj_name',
type: serverWidget.FieldType.TEXT,
label: 'Inventory Adjustment Name',
align: serverWidget.LayoutJustification.RIGHT
});
sublist.addField({
id: 'custrecord_jj_subsidiary',
type: serverWidget.FieldType.TEXT,
label: 'Subsidiary',
align: serverWidget.LayoutJustification.RIGHT
});
sublist.addField({
id: 'custrecord_jj_account',
type: serverWidget.FieldType.TEXT,
label: 'Adjustment Account',
align: serverWidget.LayoutJustification.RIGHT
});
sublist.addField({
id: 'custrecord_jj_date',
type: serverWidget.FieldType.DATE,
label: 'Date',
align: serverWidget.LayoutJustification.RIGHT
});
sublist.addField({
id: 'custrecord_jj_status',
type: serverWidget.FieldType.TEXT,
label: 'Status',
align: serverWidget.LayoutJustification.RIGHT
});
sublist.addMarkAllButtons();
form.addSubmitButton({
label: "Submit"
});
let customrecord_jj_inv_adjustment_requestSearchObj = search.create({
type: "customrecord_jj_inv_adjustment_request",
filters:
[
["custrecord_jj_ia_req_status", "anyof", "1"],
"AND",
["formulatext: {custrecord_jj_ia_request.custrecord_jj_ia_req_item}", "isnotempty", ""],
"AND",
["isinactive", "is", "F"],
"AND",
["formulanumeric: case when {custrecord_jj_created_by.altname}={user.altname} then 0 else 1 end", "equalto", "1"]
],
columns:
[
search.createColumn({ name: "internalid", label: "Internal ID" }),
search.createColumn({
name: "name",
sort: search.Sort.ASC,
label: "ID"
}),
search.createColumn({ name: "custrecord_jj_ia_req_subsidiary", label: "SUBSIDIARY " }),
search.createColumn({ name: "custrecord_jj_ia_req_adjustment_account", label: "ADJUSTMENT ACCOUNT " }),
search.createColumn({ name: "custrecord_jj_ia_req_date", label: "Date" }),
search.createColumn({ name: "custrecord_jj_ia_req_status", label: "STATUS" })
]
});
let searchResultCount = customrecord_jj_inv_adjustment_requestSearchObj.runPaged().count;
if (searchResultCount > 0) {
let arr = [];
let obj;
let searchResult = customrecord_jj_inv_adjustment_requestSearchObj.run();
searchResult.each(function (result) {
obj = {};
obj.internalid = result.getValue(searchResult.columns[0]);
obj.custrecord_jj_name = result.getValue(searchResult.columns[1]);
obj.custrecord_jj_subsidiary = result.getText(searchResult.columns[2]);
obj.custrecord_jj_account = result.getText(searchResult.columns[3]);
obj.custrecord_jj_date = result.getValue(searchResult.columns[4]);
obj.custrecord_jj_status = result.getText(searchResult.columns[5]);
arr.push(obj);
return true;
});
//Rendering the array to sublist
for (let j = 0; j < arr.length; j++) {
sublist.setSublistValue({
id: 'internalid',
line: j,
value: arr[j].internalid
});
sublist.setSublistValue({
id: 'custrecord_jj_name',
line: j,
value: arr[j].custrecord_jj_name
});
sublist.setSublistValue({
id: 'custrecord_jj_subsidiary',
line: j,
value: arr[j].custrecord_jj_subsidiary
});
sublist.setSublistValue({
id: 'custrecord_jj_account',
line: j,
value: arr[j].custrecord_jj_account
});
sublist.setSublistValue({
id: 'custrecord_jj_date',
line: j,
value: arr[j].custrecord_jj_date
});
sublist.setSublistValue({
id: 'custrecord_jj_status',
line: j,
value: arr[j].custrecord_jj_status
});
}
}
else {
log.debug("No Inventory Adjustment Request");
}
scriptContext.response.writePage(form);
}
//Post action of Suitelet
else {
let lineCount = scriptContext.request.getLineCount('_jj_sublist');
let contentArray = [];
let suiteUrl = "/app/site/hosting/scriptlet.nl?script=2139&deploy=1"
let suiteLink = "<a href=" + suiteUrl + ">" + "GO BACK</a>"
if (lineCount > 0) {
let ifChecked = 0, adjInternalId;
for (let i = 0; i < lineCount; i++) {
let tempObj = {};
let sublistFieldValue = scriptContext.request.getSublistValue({
group: '_jj_sublist',
name: 'custrecord_jj_tick',
line: i
});
if (sublistFieldValue == "T") {
ifChecked = 1;
adjInternalId = scriptContext.request.getSublistValue({
group: '_jj_sublist',
name: 'internalid',
line: i
});
tempObj.internalid = adjInternalId;
contentArray.push(tempObj);
record.submitFields({
type: 'customrecord_jj_inv_adjustment_request',
id: adjInternalId,
values: {
'custrecord_jj_ia_req_mapreducestatus': 1,
}
});
}
}
let savedFile;
if (ifChecked == 1) {
let content = JSON.stringify(contentArray);
let fileObj = file.create({
name: `Adjst_Inventory_${new Date().getTime}.txt`,
fileType: file.Type.PLAINTEXT,
contents: content,
description: 'Adjust Inventory',
folder: INVENTORY_ADJUSTMENT
});
savedFile = fileObj.save();
let mapReduceScriptId = 'customscript_jj_mr_masaproval_joinf1804';
let mapReduceDeployId = 'customdeploy_jj_mr_masaproval_joinf1804';
let mrTask = task.create({
taskType: task.TaskType.MAP_REDUCE,
scriptId: mapReduceScriptId,
deploymentId: mapReduceDeployId,
params: {
custscript_jj_adjst_records: savedFile,
}
});
let mrTaskId = mrTask.submit()
let taskStatus = task.checkStatus(mrTaskId);
log.debug("Map Reduce Status", taskStatus.status);
let approvedUrl = "https://7036058-sb1.app.netsuite.com/app/common/search/searchresults.nl?searchid=16529&saverun=T&whence="
let approvedLink = "<a href=" + approvedUrl + ">" + "Link to the Approved Custom Records</a>"
scriptContext.response.write('<b><h2> Inventory Adjustment Request Created</h2></b></br>'
+ approvedLink);
}
else {
log.debug("There is no selected records");
scriptContext.response.write('<b><h2> There is No Selected Records to create Inventory Adjustment Request</h2></b></br>'
+ suiteLink);
}
}
else {
log.debug("There is no records to display");
scriptContext.response.write('<b><h2> There is No Records in Pending Approval Status</h2></b></br>'
+ suiteLink);
}
}
}
catch (e) {
log.error("error@request function", e);
return false;
}
}
else {
log.debug("inside else");
let customError = error.create({
name: 'PERMISSION VIOLATION',
message: "You have no permission to view the Inventory Adjustment Request Mass Approval Page ",
notifyOff: false
});
throw customError.message;
}
}
return { onRequest }
});