/**
* @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 };
});