Automatically Allocating Subsidiaries and Currencies to Newly Created Entities in NetSuite

This topic covers how to automate the allocation of all active subsidiaries and currencies to newly created entity records (such as customers, vendors, leads, or prospects) in NetSuite using a User Event Script. The script ensures that when a new entity record is created, it is automatically associated with all relevant subsidiaries and currencies defined in the system.

Key Concepts:

  1. User Event Script: A NetSuite script that runs automatically in response to specific events on records, such as when a record is created, edited, or deleted. This script specifically triggers after a new entity record is created.
  2. Subsidiaries: Subsidiaries represent different legal entities under the same parent company. This script ensures that all subsidiaries are associated with a new entity record if the Subsidiaries feature is enabled in NetSuite.
  3. Currencies: Currencies represent the various monetary units that the entity can transact in. This script associates all active currencies with the new entity.
  4. Script Execution Flow:
  • The script first checks whether the Subsidiaries feature is enabled in the current NetSuite environment.
  • It retrieves all active subsidiaries and currencies in the system.
  • It checks the newly created entity record for any existing subsidiaries and currencies.
  • The script then identifies which subsidiaries and currencies are not already associated with the entity.
  • The script adds the missing subsidiaries and currencies to the entity’s record.
  • Finally, the entity record is saved with the updated subsidiaries and currencies.
  1. Error Handling: The script includes error handling to log any issues that occur during execution, ensuring that any unexpected errors are captured for troubleshooting.

Benefits:

  • Automation: This script automates a repetitive task, ensuring consistency and saving time for users.
  • Comprehensive Coverage: Ensures that all relevant subsidiaries and currencies are assigned to new entities, preventing manual errors or omissions.
  • Scalability: The script is scalable, meaning it can handle the addition of new subsidiaries and currencies without requiring changes to the code.

Code:

/**
 * @NApiVersion 2.1
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */
/*******************************************************************************************************
 * TRUST BRIDGE GLOBAL FOUNDATION
 *
 * TRUST-3615 Add all subsidiaries under the 'Subsidiaries' subtab upon the creation of a new emtity record.
 *
 ******************************************************************************************************
 * 
 *
 * AUTHOR: JOBIN AND JISMI IT SERVICES LLP
 * DATE CREATED: 29/11/2023
 * DESCRIPTION: UE SCRIPT TO ALLOCATE ALL THE CURRENCIES AND SUBSIDIARIES FOR NEWLY CREATED DONORS AND CHARITIES
 * CREATED BY: Gopinath
 * 
 * REVISON HISTORY
 * TRUST-3617 | Combine the scripts that set subsidiaries and currencies.| 04 DECEMBER 2023 | JENCY WILSON
 *
 *
 ******************************************************************************/


define(['N/record', 'N/search', 'N/runtime'],


    function (record, search, runtime) {


        let HAS_SUBSIDIARY = false;


        /*****************************************************************************************
        Apply try and catch
        *****************************************************************************************/
        function applyTryCatch(DATA_OBJ, NAME) {
            function tryCatch(myfunction, key) {
                return function () {
                    try {
                        return myfunction.apply(this, arguments);
                    } catch (e) {
                        log.error("error in " + key, e);
                        return false;
                    }
                };
            }
            for (let key in DATA_OBJ) {
                if (typeof DATA_OBJ[key] === "function") {
                    DATA_OBJ[key] = tryCatch(DATA_OBJ[key], NAME + "." + key);
                }
            }
        }


        /*****************************************************************************************
        To check whether a value exists in parameter
        *****************************************************************************************/
        function checkForParameter(parameter, parameterName) {
            if (parameter !== "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null" && parameter !== "undefined" && parameter != " " && parameter !== 'false') {
                return true;
            } else {
                if (parameterName)
                    log.debug('Empty Value found', 'Empty Value for parameter ' + parameterName);
                return false;
            }
        }


        /*****************************************************************************************
        //Search functions listed        
         *****************************************************************************************/
        let dataSet = {
            /*****************************************************************************************
            Fetch all subsidiaries defined in the system
             *****************************************************************************************/
            getAllSubsidiaries: function () {


                try {


                    allSubsidiaryArray = [];
                    let subsidiarySearchObj = search.create({
                        type: "subsidiary",
                        filters: [
                            ["isinactive", "is", "F"]
                        ],
                        columns: [
                            search.createColumn({
                                name: "name",
                                sort: search.Sort.ASC,
                                label: "Name"
                            }), //name
                            search.createColumn({
                                name: "internalid",
                                label: "Internal ID"
                            }) //internal id
                        ]
                    });
                    subsidiarySearchObj.run().each(function (result) {
                        allSubsidiaryArray.push(result.getValue(subsidiarySearchObj.columns[1]));
                        return true;
                    });
                    return allSubsidiaryArray;
                } catch (e) {
                    log.debug('error@getAllSubsidiaries', e);
                    log.error('error@getAllSubsidiaries', e);
                    return [];


                }
            },
            /*****************************************************************************************
            Fetch all currencies defined in the system
             *****************************************************************************************/
            getAllCurrencies: function () {


                try {


                    allCurrencyArray = [];
                    let currencySearchObj = search.create({
                        type: "currency",
                        filters: [
                            ["isinactive", "is", "F"]
                        ],
                        columns: [
                            search.createColumn({
                                name: "name",
                                sort: search.Sort.ASC,
                                label: "Name"
                            }), //name
                            search.createColumn({ name: "internalid", label: "Internal ID" }) //internal id
                        ]
                    });
                    currencySearchObj.run().each(function (result) {
                        allCurrencyArray.push(result.getValue(currencySearchObj.columns[1]));
                        return true;
                    });
                    return allCurrencyArray;
                } catch (e) {
                    log.debug('error@getAllCurrencies', e);
                    log.error('error@getAllCurrencies', e);
                    return [];
                }


            },
        }
        applyTryCatch(dataSet, 'dataSet');


        /*****************************************************************************************
        Main Function
        *****************************************************************************************/
        return {
            /*****************************************************************************************
                /**
             * Function definition to be triggered before record is loaded.
             *
             * @param {Object} scriptContext
             * @param {Record} scriptContext.newRecord - New record
             * @param {Record} scriptContext.oldRecord - Old record
             * @param {string} scriptContext.type - Trigger type
             * @Since 2015.2
             *
            *****************************************************************************************/


            afterSubmit: function (scriptContext) {
                try {
                    HAS_SUBSIDIARY = runtime.isFeatureInEffect('SUBSIDIARIES');
                    log.debug('HAS_SUBSIDIARY', HAS_SUBSIDIARY);


                    let currentSubsidiaries = []; //Array to store current subsidiaries allocated for the entity
                    let currentCurrencies = []; //Array to store current currencies allocated for the entity
                    let SubsidiaryCount;
                    let allSubsidiaries;


                    let currentEvent = scriptContext.type; //event type
                    let currentRecordType = scriptContext.newRecord.type; //record type
                    let currentRecordId = scriptContext.newRecord.id; //record if


                    //Event should be create and verify the record type(revison: added lead,prospect types)
                    if ((currentEvent == scriptContext.UserEventType.CREATE) && (currentRecordType == 'customer' || currentRecordType == 'vendor' || currentRecordType == 'lead' || currentRecordType == 'prospect')) {//changed 'create' to scriptContext.userEventType.CREATE
                        let entityRecord = record.load({ type: currentRecordType, id: currentRecordId, isDynamic: true, });


                        if (checkForParameter(HAS_SUBSIDIARY)) {
                            SubsidiaryCount = entityRecord.getLineCount({ sublistId: 'submachine' }); //subsidiary line count
                            allSubsidiaries = dataSet.getAllSubsidiaries(); //retrieve all subsidiaries defined in system
                        }


                        let CurrencyCount = entityRecord.getLineCount({ sublistId: 'currency' }); //currency line count
                        log.debug('CurrencyCount123', CurrencyCount);
                        let allCurrencies = dataSet.getAllCurrencies(); //retrieve all currencies defined in system


                        let fileteredSubsidiaires = [];
                        let fileteredCurrencies = [];


                        if (checkForParameter(HAS_SUBSIDIARY)) {
                            //insert current subsidiaries into array
                            if (checkForParameter(SubsidiaryCount)) {


                                for (let i = 0; i < SubsidiaryCount; i++) {
                                    currentSubsidiaries.push(entityRecord.getSublistValue({ sublistId: 'submachine', fieldId: 'subsidiary', line: i }))
                                }
                                log.debug('currentSubsidiaries', currentSubsidiaries);
                                //create filtered array
                                fileteredSubsidiaires = allSubsidiaries.filter(function (el) { return currentSubsidiaries.indexOf(el) < 0 });
                                log.debug('fileteredSubsidiaires', fileteredSubsidiaires);


                                //appending values into sublist
                                if (checkForParameter(fileteredSubsidiaires) && fileteredSubsidiaires.length) {
                                    for (let i = 0; i < fileteredSubsidiaires.length; i++) {
                                        entityRecord.selectNewLine({ sublistId: 'submachine' });
                                        entityRecord.setCurrentSublistValue({ sublistId: 'submachine', fieldId: 'subsidiary', value: fileteredSubsidiaires[i], });
                                        entityRecord.commitLine({ sublistId: 'submachine' });
                                    }
                                } else
                                    log.debug('No filtered subsidiaries to allocate');
                            }
                        }


                        //insert current currencies into array
                        if (checkForParameter(CurrencyCount)) {


                            for (let i = 0; i < CurrencyCount; i++) {
                                currentCurrencies.push(entityRecord.getSublistValue({ sublistId: 'currency', fieldId: 'currency', line: i }))
                            }
                            log.debug('allCurrencies', allCurrencies);
                            log.debug('currentCurrencies', currentCurrencies);
                            //create filtered array
                            fileteredCurrencies = allCurrencies.filter(function (el) { return currentCurrencies.indexOf(el) < 0 });
                            log.debug('fileteredCurrencies', fileteredCurrencies);


                            //appending values into sublist
                            if (checkForParameter(fileteredCurrencies) && fileteredCurrencies.length) {
                                for (let i = 0; i < fileteredCurrencies.length; i++) {
                                    entityRecord.selectNewLine({ sublistId: 'currency' });
                                    entityRecord.setCurrentSublistValue({ sublistId: 'currency', fieldId: 'currency', value: fileteredCurrencies[i], });
                                    entityRecord.commitLine({ sublistId: 'currency' });
                                }
                            } else
                                log.debug('No filtered currencies to allocate');
                        }


                        //save record


                        if (checkForParameter(HAS_SUBSIDIARY)) {
                            if (checkForParameter(fileteredCurrencies.length) || checkForParameter(fileteredSubsidiaires.length)) {
                                let EntityRecordId = entityRecord.save({ enableSourcing: 'false', ignoreMandatoryFields: 'false' });
                            }
                        } else {
                            if (checkForParameter(fileteredCurrencies.length)) {
                                let EntityRecordId = entityRecord.save({ enableSourcing: 'false', ignoreMandatoryFields: 'false' });
                            }
                        }
                    }


                } catch (e) {
                    log.debug('error@main', e);
                    log.error('error@main', e)
                }
            }
        }
    });

Leave a comment

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