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:
- 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.
- 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.
- Currencies: Currencies represent the various monetary units that the entity can transact in. This script associates all active currencies with the new entity.
- 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.
- 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)
}
}
}
});