Suitelet script to perform approver actions coming from webstore approval system

/**

 * @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 }

 

     });

 

Leave a comment

Your email address will not be published. Required fields are marked *