Workflow Action Script for Creating Inventory Adjustment Record

/**
 * @NApiVersion 2.1
 * @NScriptType WorkflowActionScript
 */
/*************************************************************************************************************************
 * CLIENTNAME:
 * JOIN BRANDED
 * JOINF-1797 Inventory Adjustment Approval workflow action script
 * JOINF-1802 Validations in Inventory Adjustment Creation Script
 * **********************************************************************************************************************
 * Author: Jobin & Jismi IT Services LLP
 * Script Description : This Script is  to create inventory adjustment record and validations.
 * Date created : 29/06/2023
 *
 * REVISION HISTORY
 *
 * Revision 1.0 ${29/06/2023} created
 *
 *
 **************************************************************************************************************************/
define(['N/record', 'N/search', 'N/email', 'N/url'],
    /**
     * @param{record} record
     * @param{search} search
     * @param{email} email
     * @param{url} url
     */
    (record, search, email, url) => {


        /**
         * Function for check for parameter
         * @param {*} parameter 
         * @returns {boolean}
         */

        const checkForParameter = function checkForParameter(parameter) {

            try {
                if (parameter !== "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null" && parameter !== "undefined" && parameter !== " " && parameter !== 'false' && parameter !== 0 && parameter !== '0') {
                    return true;
                }
            }
            catch (err) {
                console.log("error@checkParameter", err)
                return false
            }
        }

        /**
         * The serach is used to get the child record Adjustmnet Details
         * @param {*} currentRecordId 
         * @returns []
         */
        function searchAdjustmentDetails(currentRecordId) {
            try {
                let customrecord_jj_ia_req_adjustmentsSearchObj = search.create({
                    type: "customrecord_jj_ia_req_adjustments",
                    filters:
                        [
                            ["isinactive", "is", "F"],
                            "AND",
                            ["custrecord_jj_ia_request.internalid", "anyof", currentRecordId],
                            "AND",
                            ["custrecord_jj_ia_request.isinactive", "is", "F"]
                        ],
                    columns:
                        [
                            search.createColumn({ name: "custrecord_jj_ia_req_item", label: "ITEM" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_item_alias_search", label: "ITEM ALIAS SEARCH" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_item_class", label: "Class" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_item_alias_sku", label: "ITEM ALIAS SKU" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_item_department", label: "DEPARTMENT" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_description", label: "Description" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_location", label: "Location" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_units", label: "UNITS" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_adjust_qty_by", label: "ADJUST QTY BY" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_item_geography", label: "GEOGRAPHY" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_item_sales_channel", label: "SALES CHANNEL" }),
                            search.createColumn({ name: "custrecord_jj_ia_req_expiration_date", label: "EXPIRATION DATE" })
                        ]
                });
                let searchResultCount = customrecord_jj_ia_req_adjustmentsSearchObj.runPaged().count;
                let resultArray = []
                if (searchResultCount > 0) {
                    customrecord_jj_ia_req_adjustmentsSearchObj.run().each(function (result) {
                        let resultObject = {}
                        resultObject.item = result.getValue({
                            name: "custrecord_jj_ia_req_item", label: "ITEM"
                        });
                        resultObject.itemAlias = result.getValue({
                            name: "custrecord_jj_ia_req_item_alias_search", label: "ITEM ALIAS SEARCH"
                        });
                        resultObject.class = result.getValue({
                            name: "custrecord_jj_ia_req_item_class", label: "Class"
                        });
                        resultObject.itemAliasSku = result.getValue({
                            name: "custrecord_jj_ia_req_item_alias_sku", label: "ITEM ALIAS SKU"
                        });
                        resultObject.department = result.getValue({
                            name: "custrecord_jj_ia_req_item_department", label: "DEPARTMENT"
                        });
                        resultObject.description = result.getValue({
                            name: "custrecord_jj_ia_req_description", label: "Description"
                        });
                        resultObject.location = result.getValue({
                            name: "custrecord_jj_ia_req_location", label: "Location"
                        });
                        resultObject.units = result.getValue({
                            name: "custrecord_jj_ia_req_units", label: "UNITS"
                        });
                        resultObject.adjustQuantity = result.getValue({
                            name: "custrecord_jj_ia_req_adjust_qty_by", label: "ADJUST QTY BY"
                        });
                        resultObject.geography = result.getValue({
                            name: "custrecord_jj_ia_req_item_geography", label: "GEOGRAPHY"
                        });
                        resultObject.salesChannel = result.getValue({
                            name: "custrecord_jj_ia_req_item_sales_channel", label: "SALES CHANNEL"
                        });
                        resultObject.expiryDate = result.getValue({
                            name: "custrecord_jj_ia_req_expiration_date", label: "EXPIRATION DATE"
                        })
                        resultArray.push(resultObject)
                        return true;
                    });
                    return resultArray
                }
                else {
                    return []
                }

            }
            catch (err) {
                log.error("error@searchAdjustmentDetails", err)
                return []
            }
        }

        /**
         * Function to Create Inventory Adjustment Record
         * @param {*} currentRecord 
         * @returns {integer}
         */
        function createInventoryAdjustment(currentRecord) {
            try {
                let currentRecordId = currentRecord.id
                let customerName = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_customer'
                })
                let subsidiaryValue = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_subsidiary'
                })
                let adjustmentLocation = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_adjustment_location'
                })
                let adjustmentAccount = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_adjustment_account'
                })
                let departmentValue = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_department'
                })
                let classValue = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_class'
                })
                let geographyValue = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_geography'
                })
                let salesChannel = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_sales_channel'
                })
                let dateValue = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_date'
                });
                let estCost = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_estimate_ttl_value'
                })
                let memoValue = currentRecord.getValue({
                    fieldId: 'custrecord_jj_ia_req_memo'
                })
                let adjustmentRecordData = searchAdjustmentDetails(currentRecordId)
                let inventoryAdjustRecord = record.create({
                    type: record.Type.INVENTORY_ADJUSTMENT,
                    isDynamic: true
                });
                if (checkForParameter(subsidiaryValue)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'subsidiary',
                        value: subsidiaryValue
                    });
                }
                if (checkForParameter(customerName)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'customer',
                        value: customerName
                    });
                }
                if (checkForParameter(adjustmentLocation)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'adjlocation',
                        value: adjustmentLocation
                    });
                }
                if (checkForParameter(adjustmentAccount)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'account',
                        value: adjustmentAccount
                    });
                }
                if (checkForParameter(departmentValue)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'department',
                        value: departmentValue
                    });
                }
                if (checkForParameter(classValue)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'class',
                        value: classValue
                    });
                }
                if (checkForParameter(geographyValue)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'cseg_geography',
                        value: geographyValue
                    });
                }
                if (checkForParameter(salesChannel)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'cseg_saleschannel',
                        value: salesChannel
                    });
                }

                if (checkForParameter(dateValue)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'trandate',
                        value: dateValue
                    });
                }

                if (checkForParameter(memoValue)) {
                    inventoryAdjustRecord.setValue({
                        fieldId: 'memo',
                        value: memoValue
                    });
                }
                inventoryAdjustRecord.setValue({
                    fieldId: 'custbody_jj_created_frm_rqst',
                    value: currentRecordId
                });

                if (adjustmentRecordData.length > 0) {

                    for (let i = 0; i < adjustmentRecordData.length; i++) {
                        inventoryAdjustRecord.setCurrentSublistValue({
                            sublistId: 'inventory',
                            fieldId: 'item',
                            value: adjustmentRecordData[i].item,
                            line: i
                        });
                        inventoryAdjustRecord.setCurrentSublistValue({
                            sublistId: 'inventory',
                            fieldId: 'custcoljj_combined_item_alias_new',
                            value: adjustmentRecordData[i].itemAlias,
                            line: i
                        });
                        inventoryAdjustRecord.setCurrentSublistValue({
                            sublistId: 'inventory',
                            fieldId: 'custcol_jj_item_alias',
                            value: adjustmentRecordData[i].itemAliasSku,
                            line: i
                        });
                        inventoryAdjustRecord.setCurrentSublistValue({
                            sublistId: 'inventory',
                            fieldId: 'location',
                            value: adjustmentRecordData[i].location,
                            line: i
                        });
                        inventoryAdjustRecord.setCurrentSublistValue({
                            sublistId: 'inventory',
                            fieldId: 'adjustqtyby',
                            value: adjustmentRecordData[i].adjustQuantity,
                            line: i
                        });
                        inventoryAdjustRecord.setCurrentSublistValue({
                            sublistId: 'inventory',
                            fieldId: 'department',
                            value: adjustmentRecordData[i].department,
                            line: i
                        });
                        inventoryAdjustRecord.setCurrentSublistValue({
                            sublistId: 'inventory',
                            fieldId: 'class',
                            value: adjustmentRecordData[i].class,
                            line: i
                        });
                        inventoryAdjustRecord.setCurrentSublistValue({
                            sublistId: 'inventory',
                            fieldId: 'cseg_geography',
                            value: adjustmentRecordData[i].geography,
                            line: i
                        });
                        inventoryAdjustRecord.setCurrentSublistValue({
                            sublistId: 'inventory',
                            fieldId: 'cseg_saleschannel',
                            value: adjustmentRecordData[i].salesChannel,
                            line: i
                        });
                        if (checkForParameter(adjustmentRecordData[i].expiryDate)) {
                            inventoryAdjustRecord.setCurrentSublistValue({
                                sublistId: 'inventory',
                                fieldId: 'cseg_saleschannel',
                                value: adjustmentRecordData[i].expiryDate,
                                line: i
                            });
                        }

                        inventoryAdjustRecord.commitLine({
                            sublistId: 'inventory'
                        });
                    }

                    let recordId = inventoryAdjustRecord.save({
                        enableSourcing: true,
                        ignoreMandatoryFields: true
                    });

                    return recordId

                }
            }
            catch (err) {
                log.error("error@createInventoryAdjustment", err)
                return false

            }
        }


        /**
         * Defines the WorkflowAction script trigger point.
         * @param {Object} scriptContext
         * @param {Record} scriptContext.newRecord - New record
         * @param {Record} scriptContext.oldRecord - Old record
         * @param {string} scriptContext.workflowId - Internal ID of workflow which triggered this action
         * @param {string} scriptContext.type - Event type
         * @param {Form} scriptContext.form - Current form that the script uses to interact with the record
         * @since 2016.1
         */
        const onAction = (scriptContext) => {
            try {

                let currentRecord = scriptContext.newRecord;
                let currentRecordId = currentRecord.id
                let createdBy = currentRecord.getValue({
                    fieldId: 'custrecord_jj_created_by'
                })
                let createdName = currentRecord.getText({
                    fieldId: 'custrecord_jj_created_by'
                })
                let recordName = currentRecord.getValue({
                    fieldId: 'name'
                })
                let inventoryRecord = createInventoryAdjustment(currentRecord)
                if (checkForParameter(inventoryRecord)) {
                    let custRecordId = record.submitFields({
                        type: 'customrecord_jj_inv_adjustment_request',
                        id: currentRecordId,
                        values: {
                            'custrecord_jj_inventry_record': inventoryRecord,
                            'custrecord_jj_ia_req_status': 2

                        }
                    });
                }

                let link = url.resolveRecord({
                    recordType: record.Type.INVENTORY_ADJUSTMENT,
                    recordId: inventoryRecord,
                    isEditMode: false
                });
                let recLink = '<a href="https://7036058-sb1.app.netsuite.com/' + link + '" > View Record </a>'
                let emailSubject = 'Inventory Adjustment Record Approved -' + recordName
                let emailBody = 'Hi ' + createdName + ',' + '<br/>' + '<br/>' + 'The Inventory Adjustment Request' + recordName + ' has been approved. Here is a link to the Inventory Adjustment created :' + recLink + '<br/>' + '<br/>' + 'Thank you'
                email.send({
                    author: 14108,
                    recipients: createdBy,
                    subject: emailSubject,
                    body: emailBody,
                    relatedRecords: {
                        customRecord: {
                            id: currentRecordId,
                            recordType: 'customrecord_jj_inv_adjustment_request'
                        }
                    }
                });

            }
            catch (err) {
                log.error("error@onAction", err)
            }
        }

        return { onAction };
    });

Leave a comment

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