We create a button in the PO record for ‘Submit for Approval’ using workflow. When we click the button, user got the Email for approve or reject the PO. In Email, user got 2 options, one for Accept and other for reject. If user clicks the Accept link, the status of the Po record will change to Approved. Otherwise, Status will change to Rejected. One new button is visible in the PO record for Resubmit for workflow . When it clicks ,it repeats same procedure again

Suitelet Script
/**
* @NApiVersion 2.1
* @NScriptType Suitelet
*/
//var CLIENT_SCRIPT_FILE_ID = 2645;
define (['N/ui/serverWidget', 'N/record', 'N/action', 'N/auth', 'N/cache', 'N/config', 'N/email', 'N/error', 'N/file', 'N/format', 'N/http', 'N/https', 'N/record', 'N/redirect', 'N/render', 'N/runtime', 'N/search', 'N/ui/dialog', 'N/ui/message', 'N/url'],
/**
* @param{action} action
* @param{auth} auth
* @param{cache} cache
* @param{config} config
* @param{currentRecord} currentRecord
* @param{email} email
* @param{error} error
* @param{file} file
* @param{format} format
* @param{http} http
* @param{https} https
* @param{record} record
* @param{redirect} redirect
* @param{render} render
* @param{runtime} runtime
* @param{search} search
* @param{dialog} dialog
* @param{message} message
* @param{url} url
*/
(serverWidget, record, action, auth, cache, config, email, error, file, format, http, https, redirect, render, runtime, search, dialog, message, url) => {
/**
* Defines the Suitelet script trigger point.
* @param {Object} scriptContext
* @param {ServerRequest} scriptContext.request - Incoming request
* @param {ServerResponse} scriptContext.response - Suitelet response
* @since 2015.2
*/
const onRequest = (context) => {
if (context.request.method === 'GET') {
var approverType = context.request.parameters.type_status;
log.debug("Approver:", approverType);
var po_id = context.request.parameters.po_id;
log.debug("ID: ", po_id);
var po_id = context.request.parameters.po_id;
log.debug("ID: ", po_id);
var approver_id = context.request.parameters.approver_id;
log.debug("Email: ", approver_id);
var approverType = context.request.parameters.type_status;
log.debug("Approver:", approverType);
//load the purchase order
log.debug("PO load");
var objRecord = record.load({
type: record.Type.PURCHASE_ORDER,
id: po_id
});
log.debug("PO Load Id", objRecord);
log.debug("PO loaad and saved in objrecord");
var value = objRecord.getValue({
fieldId: 'approvalstatus'
});
log.debug("Value get:",value);
//In 'approval_status' custom field is already set to be 'Approve'
if (value == '2') {
log.debug("approve");
var form = serverWidget.createForm({
title: 'The Purchase Order has been approved.'
});
}
//If 'approval_status' custom field is already set to be Rejected
else if (value == '3') {
log.debug("Reject");
var form = serverWidget.createForm({
title: 'The Purchase Order has been Rejected.'
});
}
else {
log.debug("PendingApproval")
if (approverType == 'approve') {
log.debug("Entering into Approve");
var form = serverWidget.createForm({
title: 'Do you want to approve purchase order?'
});
form.clientScriptFileId = 2645 //as noted in step 1
var field = form.addField({
id: 'custpage_poid',
type: serverWidget.FieldType.TEXT,
label: 'PO number'
});
field.defaultValue = po_id;
log.debug("field po id: ", field);
field.updateDisplayType({
displayType: serverWidget.FieldDisplayType.HIDDEN
});
var poApproverId = form.addField({
id: 'custpage_approverid',
type: serverWidget.FieldType.TEXT,
label: 'Approver Id'
});
poApproverId.defaultValue = approver_id;
log.debug("PO Approver Id",poApproverId);
poApproverId.updateDisplayType({
displayType: serverWidget.FieldDisplayType.HIDDEN
});
var poType = form.addField({
id: 'custpage_approvertype',
type: serverWidget.FieldType.TEXT,
label: 'Type'
});
poType.defaultValue = approverType;
log.debug("Potype=",poType);
poType.updateDisplayType({
displayType: serverWidget.FieldDisplayType.HIDDEN
});
form.addSubmitButton({
label: 'Confirm'
});
form.addButton({
id: 'custbutton_cancel',
label: 'Cancel',
functionName: 'cancelPo'
});
} else {
log.debug("Entering into Rejected form")
var form = serverWidget.createForm({
title: 'Do you want to reject the purchase order?'
});
form.clientScriptFileId = 2645 //as noted in step 1
// form.clientScriptFileId = CLIENT_SCRIPT_FILE_ID;
var field = form.addField({
id: 'custpage_poid',
type: serverWidget.FieldType.TEXT,
label: 'PO number'
});
field.defaultValue = po_id;
log.debug("field PO num",field);
field.updateDisplayType({
displayType: serverWidget.FieldDisplayType.HIDDEN
});
var poApproverId = form.addField({
id: 'custpage_approverid',
type: serverWidget.FieldType.TEXT,
label: 'Approver Id'
});
poApproverId.defaultValue = approver_id;
log.debug("APproverId",poApproverId);
poApproverId.updateDisplayType({
displayType: serverWidget.FieldDisplayType.HIDDEN
});
var poType = form.addField({
id: 'custpage_approvertype',
type: serverWidget.FieldType.TEXT,
label: 'Type'
});
log.debug("potype: ",poType);
poType.defaultValue = approverType ;
poType.updateDisplayType({
displayType: serverWidget.FieldDisplayType.HIDDEN
});
form.addSubmitButton({
label: 'Confirm'
})
form.addButton({
id: 'custbutton_cancel',
label: 'Cancel',
functionName: 'cancelPo'
});
}
}
context.response.writePage(form);
}
//action on click of the submit button
if (context.request.method === 'POST') {
log.debug("Parameter passing", context.request.parameters);
var po_id = context.request.parameters.custpage_poid;
log.debug("PO ID Number: ", po_id);
var approver_id = context.request.parameters.custpage_approverid;
log.debug("Email: ",approver_id);
var approver_Type = context.request.parameters.custpage_approvertype;
log.debug("Approver1:", approver_Type);
if (approver_Type == "approve") {
log.debug("Field changed to approve");
var otherId = record.submitFields({
type: record.Type.PURCHASE_ORDER,
id: Number(po_id),
values: {
'approvalstatus': '2',
'custbody_cl_approver_clgc_721': approver_id
}
});
var objRecordvalue = record.load({
type: record.Type.PURCHASE_ORDER,
id: po_id
});
log.debug('objRecordValue',objRecordvalue);
var tranid = objRecordvalue.getValue({
fieldId: 'tranid'
});
log.debug("tranid: ",tranid);
var createdby = objRecordvalue.getValue({
fieldId: 'custbody_cl_createdby_clgc_721'
});
log.debug("createdby: ",createdby);
var EmployeeId = objRecordvalue.getText({
fieldId: 'custbody_cl_approver_clgc_721'
});
log.debug("EmployeeId: ",EmployeeId);
log.debug('objRecordValue',objRecordvalue);
log.debug("otherId", otherId);
var form = serverWidget.createForm({
title: 'The Purchase Order has been Approved.'
});
}
else{
log.debug("field changed to rejected");
var otherId = record.submitFields({
type: record.Type.PURCHASE_ORDER,
id: po_id,
values: {
'approvalstatus': '3'
}
});
var objRecordvalue = record.load({
type: record.Type.PURCHASE_ORDER,
id: po_id
});
log.debug('objRecordValue',objRecordvalue);
var tranid = objRecordvalue.getValue({
fieldId: 'tranid'
});
log.debug("tranid: ",tranid);
var createdby = objRecordvalue.getValue({
fieldId: 'custbody_cl_createdby_clgc_721'
});
log.debug("createdby: ",createdby);
log.debug("otherId", otherId);
var form = serverWidget.createForm({
title: 'The Purchase Order has been Rejected.'
});
}
context.response.writePage(form);
}
}
return {
onRequest: onRequest
}
});
Client Script
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
define(['N/action', 'N/currentRecord', 'N/error', 'N/http', 'N/https', 'N/log', 'N/record', 'N/runtime', 'N/search', 'N/ui/dialog', 'N/ui/message', 'N/url'],
/**
* @param{action} action
* @param{currentRecord} currentRecord
* @param{error} error
* @param{file} file
* @param{http} http
* @param{https} https
* @param{log} log
* @param{record} record
* @param{runtime} runtime
* @param{search} search
* @param{dialog} dialog
* @param{message} message
* @param{url} url
*/
function(action, currentRecord, error, http, https, log, record, runtime, search, dialog, message, url) {
/**
* Function to be executed after page is initialized.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @param {string} scriptContext.mode - The mode in which the record is being accessed (create, copy, or edit)
*
* @since 2015.2
*/
function pageInit(scriptContext) {
}
function cancelPo() {
try {
window.close();
} catch (e) {
console.log("error@cancelPo",e)
}
}
return {
pageInit: pageInit,
cancelPo: cancelPo
};
});
Approval Procee- bill and PO.docx