/**
* @NApiVersion 2.1
* @NScriptType Suitelet
*/
‘use strict;’
define([‘N/record’, ‘N/email’, ‘N/search’],
(record, email, search) => {
/***
* Function to capitalize the first lettor of customer name
* @param customerName : customer name as sring
*/
function capitalizeFirstLetters(customerName) {
try{
// Split the input string into an array of words
const words = customerName.toLowerCase().split(‘ ‘);
// Capitalize the first letter of each word
for (let i = 0; i < words.length; i++) {
words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1);
}
// Join the words back into a single string
const result = words.join(‘ ‘);
return result;
}catch(e){
log.error(“error@capitalizeFirstLetters”, e)
return false
}
}
/***
* Function to check if the sales order exist in NetSuite
* @param : internal id of sales order
*/
function getSalesOrder(internalId) {
try {
var salesorderSearchObj = search.create({
type: “salesorder”,
filters:
[
[“type”, “anyof”, “SalesOrd”],
“AND”,
[“internalid”, “anyof”, internalId],
“AND”,
[“mainline”, “is”, “T”]
],
columns:
[
search.createColumn({ name: “tranid”, label: “Document Number” })
]
});
var searchResultCount = salesorderSearchObj.runPaged().count;
log.debug(“salesorderSearchObj result count”, searchResultCount);
if (searchResultCount > 0) {
return true;
}
} catch (e) {
log.error(“error@getSalesOrder”, e)
return false;
}
}
/***
* Function to approve orders
* @param soRecord: sales order record object
* @param scriptContext: scriptContext
* @param customerName: Customer name
* @param documentNumber: Document number
* @param customerId: customer Id
*
*/
function approveOrders(scriptContext, soRecord, customerName, documentNumber, customerId, custEmail) {
try {
let responseObj;
soRecord.setValue({
fieldId: ‘custbody_jj_approval_status’,
value: ‘2’
});
let reviewOrder= soRecord.getValue({
fieldId:‘custbodyprocessed’
})
if (reviewOrder == true) {
soRecord.setValue({
fieldId: ‘orderstatus’,
value: “B”
});
}
soRecord.save({
ignoreMandatoryFields: true
});
let emailSubject = ‘SME Order Approval Request Approved’
let emailBody = “Hello “ + customerName + “,” + “<br/>” + ” Your order approval request “ + documentNumber + ” has been approved.” + “You can log in to your account to see details “ + “<a href=’https://www.smeincusa.com/’>https://www.smeincusa.com</a>” + “<br/>” + “Thank you.”
sendEmail(customerId, emailSubject, emailBody, custEmail)
responseObj = {
“code”: 200,
“status”: “Approved”,
“message”: “Order has been approved”
}
scriptContext.response.write(JSON.stringify(responseObj));
} catch (e) {
responseObj = {
“code”: 400,
“status”: “Not Approved”,
“message”: “Order not approved”
}
scriptContext.response.write(JSON.stringify(responseObj));
}
}
/***
* Function to approve orders
* @param soRecord: sales order record object
* @param scriptContext: scriptContext
* @param requestParams: request parameters
* @param customerName: customer name
* @param documentNumber: document number
* @param customerId: customer id
*/
function rejectOrders(scriptContext, soRecord, requestParams, customerName, documentNumber, customerId, custEmail) {
try {
let responseObj;
soRecord.setValue({
fieldId: ‘custbody_jj_approval_status’,
value: ‘3’
})
soRecord.setValue({
fieldId: ‘custbody_jj_rejection_reason’,
value: requestParams.rejection_reason
});
let lineCount = soRecord.getLineCount({
sublistId: ‘item’
});
for (let i = 0; i < lineCount; i++) {
soRecord.setSublistValue({
sublistId: ‘item’,
fieldId: ‘isclosed’,
line: i,
value: true
});
}
soRecord.save({
ignoreMandatoryFields: true
});
emailSubject = ‘SME Order Approval Request Declined’
if (requestParams.rejection_reason) {
emailBody = “Hello “ + customerName + “,” + “<br/>” + “Your Order Approval request “ + documentNumber + ” was declined.” + “<br/>” + “Reason for decline:” + requestParams.rejection_reason + “<br/>” + “You can log in to your account to see details “ + “<a href=’https://www.smeincusa.com/’>https://www.smeincusa.com</a>” + “<br/>” + “Thank you.”
} else {
emailBody = “Hello “ + customerName + “,” + “<br/>” + ” Your Order Approval request” + documentNumber + ” was declined.” + “<br/>” + “Reason for decline:Not specified.” + “<br/>” + “You can log in to your account to see details “ + “<a href=’https://www.smeincusa.com/’>https://www.smeincusa.com</a>” + “<br/>” + “Thank you.”
}
sendEmail(customerId, emailSubject, emailBody, custEmail)
responseObj = {
“code”: 200,
“status”: “Rejected”,
“reason”: requestParams.rejection_reason
}
scriptContext.response.write(JSON.stringify(responseObj));
} catch (e) {
responseObj = {
“code”: 400,
“status”: “Not Rejected”,
“message”: “Order cannot be rejected”
}
scriptContext.response.write(JSON.stringify(responseObj));
}
}
/***
* Function to remove items
* @param soRecord: sales order record object
* @param scriptContext: scriptContext
* @param requestParams: request parameters
*/
function removeItems(scriptContext, soRecord, requestParams) {
try {
let responseObj;
let removeSku = requestParams.sku
let findLine= soRecord.findSublistLineWithValue({
sublistId: ‘item’,
fieldId: ‘item’,
value: removeSku
});
// Remove the item line
soRecord.removeLine({
sublistId: ‘item’,
line: findLine
});
// Save the changes to the sales order
soRecord.save({
ignoreMandatoryFields: true
});
responseObj = {
“code”: 200,
“status”: “Item Removed”,
“message”: “Item removed from the sales order”
}
scriptContext.response.write(JSON.stringify(responseObj));
} catch (e) {
responseObj = {
“code”: 400,
“status”: “Item cannot removed”,
“message”:“Item cannot be removed from the sales order”
}
scriptContext.response.write(JSON.stringify(responseObj));
}
}
/***
* Function to add items
* @param soRecord: sales order record object
* @param scriptContext: scriptContext
* @param requestParams: request parameters
*/
function addItems(scriptContext, soRecord, requestParams) {
try {
let responseObj;
let lineCount = soRecord.getLineCount({
sublistId: ‘item’
});
let internalId = getItem(requestParams.itemid)
let existingItem = false;
let addSKU = requestParams.itemid
let updateQuantity = requestParams.quantity
for (let i = lineCount – 1; i >= 0; i—) {
// Get the SKU of the item in the current line
let lineSku = soRecord.getSublistValue({
sublistId: ‘item’,
fieldId: ‘custcolsme_inv_sku’,
line: i
});
let lineQty = soRecord.getSublistValue({
sublistId: ‘item’,
fieldId: ‘quantity’,
line: i
});
let qtyUpdate = Number(updateQuantity) + Number(lineQty)
// Check if the SKU matches
if (lineSku == addSKU) {
soRecord.setSublistValue({
sublistId: ‘item’,
fieldId: ‘quantity’,
line: i,
value: qtyUpdate
});
existingItem = true;
break;
}
}
if (existingItem == false) {
// Add the new item line
soRecord.insertLine({
sublistId: ‘item’,
line: lineCount
});
// Set the SKU and quantity for the new line
soRecord.setSublistValue({
sublistId: ‘item’,
fieldId: ‘item’,
line: lineCount,
value: internalId
});
soRecord.setSublistValue({
sublistId: ‘item’,
fieldId: ‘quantity’,
line: lineCount,
value: requestParams.quantity
});
}
// Save the changes to the sales order
soRecord.save({
ignoreMandatoryFields: true
});
responseObj = {
“code”: 200,
“status”: “Item Added”,
“message”: “Item has been added successfully”
}
scriptContext.response.write(JSON.stringify(responseObj));
} catch (e) {
responseObj = {
“code”:400,
“status”: “Cannot add the item”,
“message”: “Item cannot be added to the sales order”
}
scriptContext.response.write(JSON.stringify(responseObj));
}
}
/****
* Function to update item
* @param soRecord: sales order record object
* @param scriptContext: scriptContext
* @param requestParams: request parameters
*/
function updateItem(scriptContext, soRecord, requestParams) {
try {
let responseObj;
let updateSku = getItem(requestParams.itemid)
log.debug(“updateSku”, updateSku)
let updateQuantity = requestParams.quantity
log.debug(“updateQuantity”, updateQuantity)
let findLine= soRecord.findSublistLineWithValue({
sublistId: ‘item’,
fieldId: ‘item’,
value: updateSku
});
soRecord.setSublistValue({
sublistId: ‘item’,
fieldId: ‘quantity’,
line: findLine,
value: updateQuantity
});
// Save the changes to the sales order
soRecord.save({
ignoreMandatoryFields: true
});
responseObj = {
“code”: 200,
“status”: “Updated the item quantity”,
“message”: “Successfully Updated the item quantity”
}
scriptContext.response.write(JSON.stringify(responseObj));
} catch (e) {
responseObj = {
“code”:400,
“status”: “Cannot update the quantity”,
“message”:“Cannot updated the item quantity”
}
scriptContext.response.write(JSON.stringify(responseObj));
}
}
/***
* Function to get the item
* @param: item SKU: SKU of the item
*/
function getItem(itemSKU) {
try{
let itemSearchObj = search.create({
type: “item”,
filters:
[
[“name”, “is”, itemSKU]
],
columns:
[
search.createColumn({ name: “internalid”, label: “Internal ID” })
]
});
let itemId;
itemSearchObj.run().each(function (result) {
itemId = result.getValue({ name: “internalid”, label: “Internal ID” })
});
return itemId
}catch{
log.error(“error@getItem”, e)
return false
}
}
/****
* Function to send emails to customers
* @param customerId: Customer internal id
* @param emailSubject: email subject
* @param emailBody: emailb] body
*
*/
function sendEmail(customerId, emailSubject, emailBody, custEmail) {
try{
if(custEmail){
email.send({
author: 29101,
recipients: custEmail,
subject: emailSubject,
body: emailBody,
bcc:[‘ordernow@smeincusa.com’],
relatedRecords: {
entityId: customerId,
}
});
}
}catch{
log.error(“error@sendEmail”, e)
return false
}
}
/***
* Function to perform actions on sales order based on the request from webstore
* @param actionRequired: action request from webstore
* @param soRecord: sales order record object
* @param scriptContext: scriptContext
* @param requestParams: request parameters
* @param customerName: Customer name
* @param documentNumber: document number
* @param customerId: Customer’s internal Id
*/
function actionsOnSalesOrder(scriptContext, requestParams, actionRequired, soRecord, customerName, documentNumber, customerId, custEmail) {
try {
switch (actionRequired) {
case “Approve”:
approveOrders(scriptContext, soRecord, customerName, documentNumber, customerId, custEmail)
break;
case “Reject”:
rejectOrders(scriptContext, soRecord, requestParams, customerName, documentNumber, customerId, custEmail)
break;
case “Remove”:
removeItems(scriptContext, soRecord, requestParams)
break;
case “Add”:
addItems(scriptContext, soRecord, requestParams)
break;
case “Update”:
updateItem(scriptContext, soRecord, requestParams)
break;
default:
log.debug(“not a valid action”)
break;
}
} catch (e) {
log.error(“error@actionsOnSalesOrder”, e)
}
}
/**
* 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 = (scriptContext) => {
try {
if (scriptContext.request.method == “POST”) {
let requestParams = scriptContext.request.parameters
log.debug(“requestParams”, requestParams)
let internalId = requestParams.SO_Id
let actionRequired = requestParams.Action
log.debug(“actionRequired”, actionRequired)
let soExist = getSalesOrder(internalId)
if (soExist == true) {
let soRecord = record.load({
type: record.Type.SALES_ORDER,
id: internalId
});
let documentNumber = soRecord.getValue({
fieldId: ‘tranid’
})
let customerId = soRecord.getValue({
fieldId: ‘entity’
});
let custName = soRecord.getValue({
fieldId: ‘custbody_ava_customercompanyname’
})
let custEmail= soRecord.getValue({
fieldId:’email’
})
let customerName = capitalizeFirstLetters(custName)
actionsOnSalesOrder(scriptContext, requestParams, actionRequired, soRecord, customerName, documentNumber, customerId, custEmail)
}
}
} catch (e) {
log.error(“error@onRequest”, e)
}
}
return { onRequest }
});