Scenario: If the bill/journal contains lines that don’t have fixed assets created is greater than 100, The script will create fixed assets with scheduled process. The script will be scheduled for every 1 hour. And the scheduled script will send the email to the bill owner after creating the fixed asset for that bill.
Solution:
For rescheduling, you need to create a custom record. If more than one user attempt to create fixed asset at a time, both attempts should create fixed asset. In usual case, only first attempt will create fixed asset. So if a custom record creates, all attempt’s details will store in this custom record. So using this record you can create fixed asset with all attempts.
//JJ UE FAScheduling.js
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
define(['N/currentRecord', 'N/record', 'N/runtime', 'N/search', 'N/task'],
/**
* @param{currentRecord} currentRecord
* @param{record} record
* @param{runtime} runtime
* @param{search} search
* @param{task} task
*/
(currentRecord, record, runtime, search, task) => {
/**
* Defines the function definition that is executed before record is loaded.
* @param {Object} scriptContext
* @param {Record} scriptContext.newRecord - New record
* @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
* @param {Form} scriptContext.form - Current form
* @param {ServletRequest} scriptContext.request - HTTP request information sent from the browser for a client action only.
* @since 2015.2
*/
const beforeLoad = (scriptContext) => {
}
/**
* Defines the function definition that is executed before record is submitted.
* @param {Object} scriptContext
* @param {Record} scriptContext.newRecord - New record
* @param {Record} scriptContext.oldRecord - Old record
* @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
* @since 2015.2
*/
const beforeSubmit = (scriptContext) => {
}
/**
* Function to convert date to dateString format.
* @param {Date} iDate - Date fieldValue
* @returns {string} res - converted DateString
* @since 2015.2
*/
function convertDate(iDate){
try {
var d = new Date(iDate).getDate()
switch (d) {
case '01' : d = '1'; break;
case '02' : d = '2'; break;
case '03' : d = '3'; break;
case '04' : d = '4'; break;
case '05' : d = '5'; break;
case '06' : d = '6'; break;
case '07' : d = '7'; break;
case '08' : d = '8'; break;
case '09' : d = '9'; break;
default: break;
}
var m = new Date(iDate).getMonth()+1
var y = new Date(iDate).getFullYear()
var res = d+'/'+m+'/'+y
return res;
}
catch (e) {
log.debug("Error in Date function: ",e.name+': '+e.message)
}
}
/**
* Function to check whether the field has an empty value or not.
*
* @param {parameter} parameter - fieldValue
* @returns {boolean} true - if the value is not empty
* @returns {boolean} false - if the value is empty
*
* @since 2015.2
*/
function checkForParameter(parameter) {
try{
if (parameter != "" && parameter != null && parameter != undefined && parameter != "null" && parameter != "undefined" && parameter != " " && parameter != false) {
return true;
}
else {
log.debug("Empty Value found");
return false;
}
}
catch (e) {
log.debug("Error @ empty check Function: ",e.name+' : '+e.message)
}
}
/**
* Function to convert dateString to date 'd/m/yyyy' format.
* @returns {Date} convertedDate - converted Date
* @since 2015.2
*/
function dateCreator(){
try{
//Date operations
var d= new Date();
var m;
if(d.getMonth() == 11){
m= '1'
}
else{
m= d.getMonth()+2
}
var y = (d.getMonth()==11) ? (d.getFullYear()+1) : d.getFullYear()
var dt = '1'+'/'+m+'/'+y
var convertedDate = format.parse({
value: dt,
type: format.Type.DATE
});
return convertedDate
}
catch (e) {
log.debug("Error @ date Creator function: ",e.name+' : '+e.message)
}
}
/**
* Function to list vendor bills / journals which has pending FA lines.
*
* @param {string} id - record ID
* @returns {string} cnt - Count of lines in each record which has no related Records. ie; lines which hasn't Fixed asset
*
* @since 2015.2
*/
function transactionSearch() {
var transactionSearchObj = search.create({
type: "transaction",
filters:
[
["type","anyof","VendBill","Journal"],
"AND",
["custcol_far_trn_relatedasset","anyof","@NONE@"],
"AND",
[["custcol_far_asset_type","noneof","@NONE@"],"OR",["custcol_far_asset_types","noneof","@NONE@"]],
// "AND",
// ["custcol_far_exclude_asset_type","is","F"],
"AND",
["creditamount","isempty",""]
],
columns:
[
search.createColumn({
name: "internalid",
summary: "GROUP",
label: "Internal ID"
}),
search.createColumn({
name: "lineuniquekey",
summary: "COUNT",
label: "Line Unique Key"
}),
search.createColumn({
name: "type",
summary: "GROUP",
label: "Record Type"
})
]
});
var searchResultCount = transactionSearchObj.runPaged().count;
log.debug("transactionSearch result count",searchResultCount);
var resArr = [];
transactionSearchObj.run().each(function(result){
// .run().each has a limit of 4,000 results
var id = result.getValue({
name: "internalid",
summary: "GROUP"
})
var cnt = result.getValue({
name: "lineuniquekey",
summary: "COUNT",
})
var type = result.getValue({
name: "type",
summary: "GROUP"
})
resArr.push({
recId: id,
recType: type,
lCount: cnt
})
return true;
});
log.debug("resArr: ",resArr)
return resArr;
}
function rescheduleScriptandReturn() {
try {
//endrange is the last range of the just finished search.
//Next search range when rescheduled will start from this endRange
log.debug("RESCHEDULING STARTS")
// log.debug("ID: ",id)
var ssTask = task.create({
taskType: task.TaskType.SCHEDULED_SCRIPT,
scriptId: 2109,
deploymentId: "customdeploy_jj_ss_scheduled_script_fa",
// params: {
// custscript_rec_id: id
// // custscript_endrange: endRange
// // custscript_tot_count: n
// }
});
var scriptTaskId = ssTask.submit();
log.debug("RESCHEDULED SCRIPT TASK ID: ", scriptTaskId)
} catch (err) {
log.debug("Error @ rescheduling: ",err.name+": "+err.message)
log.error({
title: 'error on rescheduleScriptandReturn',
details: err
});
}
}
/**
* Defines the function definition that is executed after record is submitted.
* @param {Object} scriptContext
* @param {Record} scriptContext.newRecord - New record
* @param {Record} scriptContext.oldRecord - Old record
* @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
* @since 2015.2
*/
const afterSubmit = (scriptContext) => {
try{
if(scriptContext.type == 'create' || 'edit'){
var rec = scriptContext.newRecord
var recId = rec.id
var recType = rec.type
log.debug("recId: ",recId)
log.debug("recType: ",recType)
var scriptObj = runtime.getCurrentScript();
log.debug('SCRIPT: ' + scriptObj);
if((recType == 'vendorbill') || (recType == 'journalentry')){
var resArr = transactionSearch();
log.debug("RESULT: ",resArr)
log.debug("Length: ",resArr.length)
if(resArr.length>0){
var remaingUsage = scriptObj.getRemainingUsage()
for(var i=0;i<resArr.length;i++){
log.debug('Remaining governance units: ' , remaingUsage);
if (remaingUsage < 500) {
rescheduleScriptandReturn()
}
else {
if (resArr[i].lCount >= 10) {
var faScheduleRec = record.create({
type: 'customrecord_fa_scheduling',
isDynamic: true
})
faScheduleRec.setValue({
fieldId: 'custrecord_fa_schedule_rec_id',
value: resArr[i].recId
})
faScheduleRec.setValue({
fieldId: 'custrecord_fa_schedule_rec_type',
value: resArr[i].recType
})
faScheduleRec.setValue({
fieldId: 'custrecord_fa_schedule_line_count',
value: resArr[i].lCount
})
var savedRecId = faScheduleRec.save()
log.debug("savedRecId: ", savedRecId)
}
}
}
}
}
}
}
catch (e) {
log.debug("Error @ Scheduling After submit: ",e.name+" : "+e.message)
}
}
return {beforeLoad, beforeSubmit, afterSubmit}
});
//JJ SS FAScheduling.js
/**
* @NApiVersion 2.1
* @NScriptType ScheduledScript
*/
define(['N/email', 'N/error', 'N/record', 'N/search','N/runtime','N/currentRecord','N/format'],
/**
* @param{email} email
* @param{error} error
* @param{record} record
* @param{search} search
* @param{runtime} runtime
* @param{currentRecord} currentRecord
* @param{format} format
*/
(email, error, record, search,runtime,currentRecord, format) => {
/**
* Function to check whether the field has an empty value or not.
* @param {parameter} parameter - fieldValue
* @returns {boolean} true - if the value is not empty
* @returns {boolean} false - if the value is empty
*/
function checkForParameter(parameter) {
try{
if (parameter != "" && parameter != null && parameter != undefined && parameter != "null" && parameter != "undefined" && parameter != " " && parameter != false) {
return true;
}
else {
log.debug("Empty Value found");
return false;
}
}
catch (e) {
log.debug("Error @ empty check Function: ",e.name+' : '+e.message)
}
}
/**
* Function to convert dateString to date 'd/m/yyyy' format.
* @returns {Date} convertedDate - converted Date
*/
function dateCreator(){
try{
//Date operations
var d= new Date();
var m;
if(d.getMonth() == 11){
m= '1'
}
else{
m= d.getMonth()+2
}
var y = (d.getMonth()==11) ? (d.getFullYear()+1) : d.getFullYear()
var dt = '1'+'/'+m+'/'+y
var convertedDate = format.parse({
value: dt,
type: format.Type.DATE
});
return convertedDate
}
catch (e) {
log.debug("Error @ date Creator function: ",e.name+' : '+e.message)
}
}
/**
* Function to convert date to dateString format.
* @param {Date} iDate - Date fieldValue
* @returns {string} res - converted DateString
*/
function convertDate(iDate){
try {
var d = new Date(iDate).getDate()
switch (d) {
case '01' : d = '1'; break;
case '02' : d = '2'; break;
case '03' : d = '3'; break;
case '04' : d = '4'; break;
case '05' : d = '5'; break;
case '06' : d = '6'; break;
case '07' : d = '7'; break;
case '08' : d = '8'; break;
case '09' : d = '9'; break;
default: break;
}
var m = new Date(iDate).getMonth()+1
var y = new Date(iDate).getFullYear()
var res = d+'/'+m+'/'+y
return res;
}
catch (e) {
log.debug("Error in Date function: ",e.name+': ',e.message)
}
}
/**
* Function to list vendor bills / journals which has pending FA lines.
* @param {string} id - record ID
* @returns [{obj}] resArr - array of Object, which contains Count of lines, record Id and Record type of each record which has no related Records. ie; lines which hasn't Fixed asset
*/
function transactionSearch() {
var transactionSearchObj = search.create({
type: "transaction",
filters:
[
["type","anyof","VendBill","Journal"],
"AND",
["custcol_far_trn_relatedasset","anyof","@NONE@"],
"AND",
[["custcol_far_asset_type","noneof","@NONE@"],"OR",["custcol_far_asset_types","noneof","@NONE@"]],
// "AND",
// ["custcol_far_exclude_asset_type","is","F"],
"AND",
["creditamount","isempty",""]
],
columns:
[
search.createColumn({
name: "internalid",
summary: "GROUP",
label: "Internal ID"
}),
search.createColumn({
name: "lineuniquekey",
summary: "COUNT",
label: "Line Unique Key"
}),
search.createColumn({
name: "type",
summary: "GROUP",
label: "Record Type"
})
]
});
var searchResultCount = transactionSearchObj.runPaged().count;
log.debug("TRANSACTION SEARCH count",searchResultCount);
var resArr = [];
transactionSearchObj.run().each(function(result){
// .run().each has a limit of 4,000 results
var recType = result.getValue({
name: "type",
summary: "GROUP"
})
var recId = result.getValue({
name: "internalid",
summary: "GROUP"
})
var lCount = result.getValue({
name: "lineuniquekey",
summary: "COUNT"
})
resArr.push({
recType: recType,
recId: recId,
lCount: lCount
})
return true;
});
log.debug("RES ARR: ",resArr)
return resArr
}
function FAScheduling(){
try{
var customrecord_fa_schedulingSearchObj = search.create({
type: "customrecord_fa_scheduling",
filters:
[
["custrecord_fa_schedule_is_created","is","F"]
],
columns:
[
search.createColumn({name: "internalid", sort: search.Sort.ASC, label: "Internal ID"}),
search.createColumn({name: "custrecord_fa_schedule_rec_id", label: "Record ID"}),
search.createColumn({name: "custrecord_fa_schedule_rec_type", label: "Record Type"}),
search.createColumn({name: "custrecord_fa_schedule_line_count", label: "Line Count"}),
search.createColumn({name: "custrecord_fa_schedule_is_created", label: "Created"})
]
});
var searchResultCount = customrecord_fa_schedulingSearchObj.runPaged().count;
log.debug("customrecord_fa_schedulingSearchObj result count",searchResultCount);
var res = []
if(searchResultCount>0) {
customrecord_fa_schedulingSearchObj.run().each(function (result) {
var internalId = result.getValue({name: "internalid"})
var recId = result.getValue({name: "custrecord_fa_schedule_rec_id"})
var recType = result.getValue({name: "custrecord_fa_schedule_rec_type"})
var lineCount = result.getValue({name: "custrecord_fa_schedule_line_count"})
var createStatus = result.getValue({name: "custrecord_fa_schedule_is_created"})
res.push({
internalId: internalId,
recId: recId,
recType: recType,
lineCount: lineCount,
createStatus: createStatus
})
// .run().each has a limit of 4,000 results
return true;
});
}
log.debug("res: ",res)
return res;
}
catch (e) {
log.debug("Error @ FAScheduling: ",e.name+" : "+e.message)
}
}
/**
* Defines the Scheduled script trigger point.
* @param {Object} scriptContext
* @param {string} scriptContext.type - Script execution context. Use values from the scriptContext.InvocationType enum.
* @since 2015.2
*/
const execute = (scriptContext) => {
try{
var param = runtime.getCurrentScript();
var k = param.getParameter({name: 'custscript_email_param'});
log.debug("PARAM: ",k)
FACreation(k)
}
catch (e) {
log.debug("Error @ Scheduled : ",e.name+" : ",+e.message)
}
}
/**
* The function calls functions for Fixed Asset creation in journal and Vendor Bill.
* @param {string} param - ScriptParameter which contains the internal ID of the Email Recipient
*/
function FACreation(param) {
try{
var paramContext = param
journalFACreation(paramContext)
vendorFACreation(paramContext)
}
catch (e) {
log.debug("Error @ FACreation: ",e.name+" : "+e.message)
}
}
/**
* The function creates Fixed Asset for journals.
*/
function journalFACreation(paramContext) {
try{
var jRes = FAScheduling()
if(jRes.length>0) {
var journalRes = jRes.filter(res => res.recType == 'Journal');
var journalFA = [];
if (journalRes.length > 0) {
for (var j = 0; j < journalRes.length; j++) {
log.debug("EXECUTING LINE: ", j)
var custRecId = journalRes[j].internalId
log.debug("custRecId: ", custRecId)
var totalCount = journalRes[j].lineCount
log.debug("TOT COunt: ", totalCount)
if (totalCount >= 10) {
var rec = record.load({
type: 'journalentry',
id: journalRes[j].recId,
isDynamic: true
})
var recId = journalRes[j].recId
var subsidary = rec.getValue({
fieldId: 'subsidiary'
})
var transDate = rec.getValue({
fieldId: 'trandate'
})
var initialFormattedDateString = convertDate(transDate);
var parsedDateStringAsRawDateObject = format.parse({
value: initialFormattedDateString,
type: format.Type.DATE
});
var convertedDate = dateCreator()
//>>>>>>>>>>>>>>>>>>>>>>>>>>>> JOURNAL LINE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//
var lineCount = rec.getLineCount({
sublistId: 'line'
})
log.debug("Journal lineCount: ", lineCount)
if (lineCount > 0) {
for (var i = 0; i < lineCount; i++) {
var jAcc = rec.getSublistValue({
sublistId: 'line',
fieldId: 'account',
line: i
})
var jAsset = rec.getSublistValue({
sublistId: 'line',
fieldId: 'custcol_far_asset_type',
line: i
})
var excludeCheck = rec.getSublistValue({
sublistId: 'line',
fieldId: 'custcol_far_exclude_asset_type',
line: i
})
var jMemo = rec.getSublistValue({
sublistId: 'line',
fieldId: 'memo',
line: i
})
var jAmount = rec.getSublistValue({
sublistId: 'line',
fieldId: 'debit',
line: i
})
var jEmployee = rec.getSublistValue({
sublistId: 'line',
fieldId: 'custcol_far_employee',
line: i
})
var jDepartment = rec.getSublistValue({
sublistId: 'line',
fieldId: 'custcol_assettype_department',
line: i
})
var jClass = rec.getSublistValue({
sublistId: 'line',
fieldId: 'custcol_assettype_class',
line: i
})
var jLocation = rec.getSublistValue({
sublistId: 'line',
fieldId: 'custcol_assettype_location',
line: i
})
var jRelRec = rec.getSublistValue({
sublistId: 'line',
fieldId: 'custcol_far_trn_relatedasset',
line: i
})
//Account Record
var accountRec = record.load({
type: record.Type.ACCOUNT,
id: jAcc,
isDynamic: true
})
var accType = accountRec.getValue({
fieldId: 'accttype'
})
if (accType == 'FixedAsset') { // if the account type is Fixed Asset
if (checkForParameter(jAsset) == true) { // if asset type is not null
log.debug("INSIDE FIRST LOOP: ",jAsset)
// if ((checkForParameter(jRelRec) == false) && (Boolean(excludeCheck) == false)) { // if related record is null and exclude check is false
if (checkForParameter(jRelRec) == false) {
log.debug("INSIDE SECOND LOOP: ", jRelRec)
//Asset type Record
var assettypeRec = record.load({
type: 'customrecord_ncfar_assettype',
id: jAsset,
isDynamic: true
})
var assetDepreciationPeriod = assettypeRec.getValue({
fieldId: 'custrecord_assttype_dep_next_period'
})
var accountingMethod = assettypeRec.getValue({
fieldId: 'custrecord_assettypeaccmethod'
})
if (checkForParameter(jAmount) == true) {
//Creation of Fixed Asset
var FArecord = record.create({
type: 'customrecord_ncfar_asset',
isDynamic: true
})
//NAME
FArecord.setValue({
fieldId: 'altname',
value: jMemo ? jMemo : 'Auto Generated Asset'
})
//ASSET DESCRIPTION
FArecord.setValue({
fieldId: 'custrecord_assetdescr',
value: jMemo ? jMemo : 'Auto Generated Asset'
})
//ASSET TYPE
FArecord.setValue({
fieldId: 'custrecord_assettype',
value: jAsset
})
//ASSET ORIGINAL COST
FArecord.setValue({
fieldId: 'custrecord_assetcost',
value: jAmount
})
//ASSET CURRENT COST
FArecord.setValue({
fieldId: 'custrecord_assetcurrentcost',
value: jAmount
})
//CUSTODIAN
FArecord.setValue({
fieldId: 'custrecord_assetcaretaker',
value: jEmployee
})
//DEPARTMENT
FArecord.setValue({
fieldId: 'custrecord_employee_department',
value: jDepartment
})
//CLASS
FArecord.setValue({
fieldId: 'custrecord_employee_class',
value: jClass
})
//LOCATION
FArecord.setValue({
fieldId: 'custrecord_employee_location',
value: jLocation
})
//SUBSIDIARY
FArecord.setValue({
fieldId: 'custrecord_assetsubsidiary',
value: subsidary
})
//PURCHASE DATE
FArecord.setValue({
fieldId: 'custrecord_assetpurchasedate',
value: parsedDateStringAsRawDateObject
})
//DEPRECIATION START DATE
if (Boolean(assetDepreciationPeriod) == false) {
FArecord.setValue({
fieldId: 'custrecord_assetdeprstartdate',
value: parsedDateStringAsRawDateObject
});
}
if (Boolean(assetDepreciationPeriod) == true) {
FArecord.setValue({
fieldId: 'custrecord_assetdeprstartdate',
value: convertedDate
})
}
//PARENT TRANSACTION
FArecord.setValue({
fieldId: 'custrecord_assetsourcetrn',
value: recId
})
//PARENT TRANSACTION LINE
FArecord.setValue({
fieldId: 'custrecord_assetsourcetrnline',
value: i + 1
})
//RESIDUAL VALUE
FArecord.setValue({
fieldId: 'custrecord_assetresidualvalue',
value: 0.00
})
//DEPRECIATION METHOD
FArecord.setValue({
fieldId: 'custrecord_assetaccmethod',
value: accountingMethod ? accountingMethod : 3
})
//Saving Record
var saved = FArecord.save()
log.debug("jSaved: ", saved)
journalFA.push(saved)
//Setting Related Assets
const updateRec = record.load({
type: 'journalentry',
id: recId,
isDynamic: true
})
updateRec.selectLine({
sublistId: 'line',
line: i
})
updateRec.setCurrentSublistValue({
sublistId: 'line',
fieldId: 'custcol_far_trn_relatedasset',
value: saved,
line: i
})
updateRec.commitLine({
sublistId: 'line'
})
var saved = updateRec.save();
log.debug("saved: ", saved)
log.debug("BEFORE INDEX CONDITION: ", j)
if(j == (journalRes.length-1)) {
var custRec = record.load({
type: 'customrecord_fa_scheduling',
id: custRecId,
isDynamic: true
})
custRec.setValue({
fieldId: 'custrecord_fa_schedule_is_created',
value: true
})
var custSaved = custRec.save();
log.debug("custSaved: ", custSaved)
}
}
}
}
}
}
log.debug("SENDING EMAIL FROM JOURNAL", journalFA)
if (journalFA.length > 0) {
email.send({
// author: paramContext,
// recipients: paramContext,
author: 3316450,
recipients: 3316450,
subject: 'Fixed Asset Created from Journal',
body: 'Hi,' + '\n' + " Fixed Assets" + '\n' + journalFA + "are created from Journal " + '\n'
})
log.debug("SEND EMAIL")
}
}// End of if(journalCount>0)
}
}
}
}
}
catch (e) {
log.debug("Error @ journalFACreation: ", e.name+": "+e.message)
}
}
/**
* The function creates Fixed Asset for Vendor Bills.
*/
function vendorFACreation(paramContext){
try{
var vRes = FAScheduling()
if(vRes.length>0) {
var vendorRes = vRes.filter(res => res.recType == 'VendBill')
log.debug("vendorRes: ", vendorRes)
log.debug("vendorRes LENGTH: ", vendorRes.length)
var vendorFA = [];
if (vendorRes.length > 0) {
for (var j = 0; j < vendorRes.length; j++) {
log.debug("EXECUTING LINE: ", j)
var custRecId = vendorRes[j].internalId
log.debug("custRecId: ", custRecId)
var totalCount = vendorRes[j].lineCount
log.debug("TOT COunt: ", totalCount)
if (totalCount >= 10) {
log.debug("REC ID IN LOOP: ",vendorRes[j].recId)
var rec = record.load({
type: 'vendorbill',
id: vendorRes[j].recId,
isDynamic: true
})
var recId = vendorRes[j].recId
var ex = rec.getLineCount({
sublistId: 'expense'
})
log.debug("EX: ",ex)
var item = rec.getLineCount({
sublistId: 'item'
})
log.debug("ITEM: ",item)
var subsidary = rec.getValue({
fieldId: 'subsidiary'
})
var transDate = rec.getValue({
fieldId: 'trandate'
})
var vendorName = rec.getValue({
fieldId: 'entity'
})
var initialFormattedDateString = convertDate(transDate);
var parsedDateStringAsRawDateObject = format.parse({
value: initialFormattedDateString,
type: format.Type.DATE
});
var convertedDate = dateCreator()
//EXPENSE
if (ex > 0) {
log.debug("INSIDE EXPENSE SUBLIST")
for (var i = 0; i < ex; i++) {
log.debug("INSIDE EXPENSE SUBLIST LOOP: ",i)
var exAcc = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'account',
line: i
})
log.debug("exAcc: ",exAcc)
var exAsset = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'custcol_far_asset_type',
line: i
})
log.debug("exAsset: ",exAsset)
var excludeCheck = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'custcol_far_exclude_asset_type',
line: i
})
var exMemo = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'memo',
line: i
})
log.debug("exMemo: ",exMemo)
var exAmount = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'amount',
line: i
})
log.debug("exAmount: ",exAmount)
var exEmployee = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'custcol_far_employee',
line: i
})
log.debug("exEmployee: ",exEmployee)
var exDepartment = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'custcol_assettype_department',
line: i
})
log.debug("exDepartment: ",exDepartment)
var exClass = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'custcol_assettype_class',
line: i
})
log.debug("exClass: ",exClass)
var exLocation = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'custcol_assettype_location',
line: i
})
log.debug("exLocation: ",exLocation)
var exQty = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'custcol_expense_quantity',
line: i
})
log.debug("exQty: ",exQty)
// var exPurchaseOrder = rec.getSublistValue({
// sublistId: 'purchaseorders',
// fieldId: 'poid',
// line: i
// })
// log.debug("Related PURCHASE ORDER: ",exPurchaseOrder)
var relRec = rec.getSublistValue({
sublistId: 'expense',
fieldId: 'custcol_far_trn_relatedasset',
line: i
})
//Account Record
var accountRec = record.load({
type: record.Type.ACCOUNT,
id: exAcc,
isDynamic: true
})
var accType = accountRec.getValue({
fieldId: 'accttype'
})
if (accType == 'FixedAsset') { // if the account type is Fixed Asset
// if ((checkForParameter(relRec)==false) && (Boolean(excludeCheck) == false)) { // if asset type is not null, So the check value can be either true or false. It doesn't matter for the creation of fixed asset record
if ((checkForParameter(exAsset) == true) && (checkForParameter(relRec) == false)) {
//Asset type Record
var assettypeRec = record.load({
type: 'customrecord_ncfar_assettype',
id: exAsset,
isDynamic: true
})
var assetDepreciationPeriod = assettypeRec.getValue({
fieldId: 'custrecord_assttype_dep_next_period'
})
var accountingMethod = assettypeRec.getValue({
fieldId: 'custrecord_assettypeaccmethod'
})
//Creation of Fixed Asset
var FArecord = record.create({
type: 'customrecord_ncfar_asset',
isDynamic: true
})
//NAME
FArecord.setValue({
fieldId: 'altname',
value: exMemo ? exMemo : 'Auto Generated Asset'
})
//ASSET DESCRIPTION
FArecord.setValue({
fieldId: 'custrecord_assetdescr',
value: exMemo ? exMemo : 'Auto Generated Asset'
})
//ASSET TYPE
FArecord.setValue({
fieldId: 'custrecord_assettype',
value: exAsset
})
//ASSET ORIGINAL COST
FArecord.setValue({
fieldId: 'custrecord_assetcost',
value: exAmount
})
//ASSET CURRENT COST
FArecord.setValue({
fieldId: 'custrecord_assetcurrentcost',
value: exAmount
})
//CUSTODIAN
FArecord.setValue({
fieldId: 'custrecord_assetcaretaker',
value: exEmployee
})
//DEPARTMENT
FArecord.setValue({
fieldId: 'custrecord_employee_department',
value: exDepartment
})
//CLASS
FArecord.setValue({
fieldId: 'custrecord_employee_class',
value: exClass
})
//LOCATION
FArecord.setValue({
fieldId: 'custrecord_employee_location',
value: exLocation
})
//QUANTITY
FArecord.setValue({
fieldId: 'custrecord_ncfar_quantity',
value: exQty ? exQty : 1
})
//SUBSIDIARY
FArecord.setValue({
fieldId: 'custrecord_assetsubsidiary',
value: subsidary
})
//PURCHASE DATE
FArecord.setValue({
fieldId: 'custrecord_assetpurchasedate',
value: parsedDateStringAsRawDateObject
})
//DEPRECIATION START DATE
if (Boolean(assetDepreciationPeriod) == false) {
FArecord.setValue({
fieldId: 'custrecord_assetdeprstartdate',
value: parsedDateStringAsRawDateObject
});
}
if (Boolean(assetDepreciationPeriod) == true) {
FArecord.setValue({
fieldId: 'custrecord_assetdeprstartdate',
value: convertedDate
})
}
//SUPPLIER
FArecord.setValue({
fieldId: 'custrecord_assetsupplier',
value: vendorName
})
//PURCHASE ORDER
FArecord.setValue({
fieldId: 'custrecord_assetpurchaseorder',
value: ''
})
//PARENT TRANSACTION
FArecord.setValue({
fieldId: 'custrecord_assetsourcetrn',
value: recId
})
//PARENT TRANSACTION LINE
FArecord.setValue({
fieldId: 'custrecord_assetsourcetrnline',
value: i + 1
})
//RESIDUAL VALUE
FArecord.setValue({
fieldId: 'custrecord_assetresidualvalue',
value: 0.00
})
//DEPRECIATION METHOD
FArecord.setValue({
fieldId: 'custrecord_assetaccmethod',
value: accountingMethod ? accountingMethod : 3
})
//Saving Record
var saved = FArecord.save()
log.debug("Saved: ", saved)
vendorFA.push(saved)
//Setting Related Assets
const vendRec = record.load({
type: 'vendorbill',
id: recId,
isDynamic: true
})
vendRec.selectLine({
sublistId: 'expense',
line: i
})
vendRec.setCurrentSublistValue({
sublistId: 'expense',
fieldId: 'custcol_far_trn_relatedasset',
value: saved,
line: i
})
vendRec.commitLine({
sublistId: 'expense'
})
var z = vendRec.save();
log.debug("sd: ", z)
log.debug("BEFORE INDEX CONDITION: ", j)
if(j == (vendorRes.length-1)) {
var custRec = record.load({
type: 'customrecord_fa_scheduling',
id: custRecId,
isDynamic: true
})
custRec.setValue({
fieldId: 'custrecord_fa_schedule_is_created',
value: true
})
var custSaved = custRec.save();
log.debug("custSaved: ", custSaved)
}
}
}
}
}// End of if(ex>0)
//ITEM
if (item > 0) {
for (var i = 0; i < item; i++) {
var itmItem = rec.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
})
var itmDescription = rec.getSublistValue({
sublistId: 'item',
fieldId: 'description',
line: i
})
var itmAssetType = rec.getSublistValue({
sublistId: 'item',
fieldId: 'custcol_far_asset_types',
line: i
})
var itmAmount = rec.getSublistValue({
sublistId: 'item',
fieldId: 'amount',
line: i
})
var itmExcludeCheckvalue = rec.getSublistValue({
sublistId: 'item',
fieldId: 'custcol_far_exclude_asset_type',
line: i
})
var itmEmployee = rec.getSublistValue({
sublistId: 'item',
fieldId: 'custcol_far_employee',
line: i
})
var itmDepartment = rec.getSublistValue({
sublistId: 'item',
fieldId: 'custcol_assettype_department',
line: i
})
var itmClass = rec.getSublistValue({
sublistId: 'item',
fieldId: 'custcol_assettype_class',
line: i
})
var itmLocation = rec.getSublistValue({
sublistId: 'item',
fieldId: 'custcol_assettype_location',
line: i
})
var itmRelRec = rec.getSublistValue({
sublistId: 'item',
fieldId: 'custcol_far_trn_relatedasset',
line: i
})
var itmQty = rec.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i
})
log.debug("itmQty: ",itmQty)
var sublists = rec.getSublists()
log.debug("sublists: ",sublists)
// var itmPurchaseOrder = rec.getSublistValue({
// sublistId: 'purchaseorders',
// fieldId: 'poid',
// line: i
// })
// log.debug("Related PURCHASE ORDER: ",itmPurchaseOrder)
// if (checkForParameter(itmRelRec) == false && (Boolean(itmExcludeCheckvalue) == false)) { // check whether the asset type is null ie; checking the account type is Fixed asset
if ((checkForParameter(itmAssetType) == true) && (checkForParameter(itmRelRec) == false)) {
//Asset Type record
var assettypeRec = record.load({
type: 'customrecord_ncfar_assettype',
id: itmAssetType,
isDynamic: true
})
var assetDepreciationPeriod = assettypeRec.getValue({
fieldId: 'custrecord_assttype_dep_next_period'
})
var accountingMethod = assettypeRec.getValue({
fieldId: 'custrecord_assettypeaccmethod'
})
//Creation of Fixed Asset
var FArecord = record.create({
type: 'customrecord_ncfar_asset',
isDynamic: true
})
//NAME
FArecord.setValue({
fieldId: 'altname',
value: itmDescription ? itmDescription : 'Auto Generated Asset'
})
//ASSET DESCRIPTION
FArecord.setValue({
fieldId: 'custrecord_assetdescr',
value: itmDescription ? itmDescription : 'Auto Generated Asset'
})
//ASSET TYPE
FArecord.setValue({
fieldId: 'custrecord_assettype',
value: itmAssetType
})
//ASSET ORIGINAL COST
FArecord.setValue({
fieldId: 'custrecord_assetcost',
value: itmAmount
})
//ASSET CURRENT COST
FArecord.setValue({
fieldId: 'custrecord_assetcurrentcost',
value: itmAmount
})
//CUSTODIAN
FArecord.setValue({
fieldId: 'custrecord_assetcaretaker',
value: itmEmployee
})
//DEPARTMENT
FArecord.setValue({
fieldId: 'custrecord_employee_department',
value: itmDepartment
})
//CLASS
FArecord.setValue({
fieldId: 'custrecord_employee_class',
value: itmClass
})
//LOCATION
FArecord.setValue({
fieldId: 'custrecord_employee_location',
value: itmLocation
})
//QUANTITY
FArecord.setValue({
fieldId: 'custrecord_ncfar_quantity',
value: itmQty ? itmQty : 1
})
//SUBSIDIARY
FArecord.setValue({
fieldId: 'custrecord_assetsubsidiary',
value: subsidary
})
//PURCHASE DATE
FArecord.setValue({
fieldId: 'custrecord_assetpurchasedate',
value: parsedDateStringAsRawDateObject
})
//DEPRECIATION START DATE
if (Boolean(assetDepreciationPeriod) == false) {
FArecord.setValue({
fieldId: 'custrecord_assetdeprstartdate',
value: parsedDateStringAsRawDateObject
});
}
if (Boolean(assetDepreciationPeriod) == true) {
FArecord.setValue({
fieldId: 'custrecord_assetdeprstartdate',
value: convertedDate
})
}
//SUPPLIER
FArecord.setValue({
fieldId: 'custrecord_assetsupplier',
value: vendorName
})
//PURCHASE ORDER
FArecord.setValue({
fieldId: 'custrecord_assetpurchaseorder',
value: ''
})
//PARENT TRANSACTION
FArecord.setValue({
fieldId: 'custrecord_assetsourcetrn',
value: recId
})
//PARENT TRANSACTION LINE
FArecord.setValue({
fieldId: 'custrecord_assetsourcetrnline',
value: i + 1
})
//RESIDUAL VALUE
FArecord.setValue({
fieldId: 'custrecord_assetresidualvalue',
value: 0.00
})
//DEPRECIATION METHOD
FArecord.setValue({
fieldId: 'custrecord_assetaccmethod',
value: accountingMethod ? accountingMethod : 3
})
//Saving Record
var saved = FArecord.save()
log.debug("Item FA Saved: ", saved)
vendorFA.push(saved)
//Setting Related Assets
const vendRec = record.load({
type: 'vendorbill',
id: recId,
isDynamic: true
})
vendRec.selectLine({
sublistId: 'item',
line: i
})
vendRec.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'custcol_far_trn_relatedasset',
value: saved,
line: i
})
vendRec.commitLine({
sublistId: 'item'
})
var z = vendRec.save();
log.debug("Linesd: ", z)
log.debug("BEFORE INDEX CONDITION IN ITEM: ", j)
if(j == (vendorRes.length-1)) {
var custRec = record.load({
type: 'customrecord_fa_scheduling',
id: custRecId,
isDynamic: true
})
custRec.setValue({
fieldId: 'custrecord_fa_schedule_is_created',
value: true
})
var custSaved = custRec.save();
log.debug("custSaved: ", custSaved)
}
}
}// End of for loop
} // End of if(item>0)
}
}
log.debug("SENDING EMAIL FROM VENDOR BILL: ",vendorFA)
if(vendorFA.length>0) {
email.send({
// author: paramContext,
// recipients: paramContext,
author: 3316450,
recipients: 3316450,
subject: 'Fixed Assets created from Vendor Bill',
body: 'Hi,' + '\n' + " Fixed Assets" + '\n ' +vendorFA+ " are created from Vendor Bill "
})
log.debug("SEND EMAIL")
}
}
}
}
catch (e) {
log.debug("Error @ vendorFACreation: ",e.name+": "+e.message)
}
}
return {execute}
});
//JJ CS Validation.js
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
define(['N/currentRecord', 'N/record', 'N/search'],
/**
* @param{currentRecord} currentRecord
* @param{record} record
* @param{search} search
*/
function(currentRecord, record, search) {
/**
* Function to check whether the field has an empty value or not.
* @param {parameter} parameter - fieldValue
* @returns {boolean} true - if the value is not empty
* @returns {boolean} false - if the value is empty
*/
function checkForParameter(parameter) {
try{
if (parameter != "" && parameter != null && parameter != undefined && parameter != "null" && parameter != "undefined" && parameter != " " && parameter != false) {
return true;
}
else {
console.log("Empty Value found");
return false;
}
}
catch (e) {
console.log("Error @ empty check Function: ",e.name+' : '+e.message)
}
}
/**
* Function to be executed when field is slaved.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @param {string} scriptContext.sublistId - Sublist name
* @param {string} scriptContext.fieldId - Field name
*
* @since 2015.2
*/
// function postSourcing(scriptContext) {
// try{
// var rec = scriptContext.currentRecord
// if(scriptContext.sublistId == 'expense' || scriptContext.sublistId == 'item' || scriptContext.sublistId == 'line'){
// rec.setCurrentSublistValue({
// sublistId: scriptContext.sublistId,
// fieldId: 'custcol_far_trn_relatedasset',
// value: null
// })
// return true
// }
// }
// catch (e) {
// console.log("Error @ postSourcing : ",e.name+" : "+e.message)
// }
// }
/**
* Validation function to be executed when sublist line is committed.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @param {string} scriptContext.sublistId - Sublist name
*
* @returns {boolean} Return true if sublist line is valid
*
* @since 2015.2
*/
function validateLine(scriptContext) {
try{
var rec = scriptContext.currentRecord
var recSubsidary = rec.getValue({
fieldId: 'subsidiary'
})
var checkValue = rec.getCurrentSublistValue({
sublistId: scriptContext.sublistId,
fieldId: 'custcol_far_exclude_asset_type'
})
var relatedAsset = rec.getCurrentSublistValue({
sublistId: scriptContext.sublistId,
fieldId: 'custcol_far_trn_relatedasset'
})
if(checkForParameter(relatedAsset)==true){
alert("You can't Edit or Copy a line which has Already Fixed Asset")
return false
}
var employee = rec.getCurrentSublistValue({
sublistId: scriptContext.sublistId,
fieldId: 'custcol_far_employee'
})
console.log("Employee: ",employee)
if(checkForParameter(employee)==true){
var empRec = record.load({
type: record.Type.EMPLOYEE,
id: employee,
isDynamic: true
})
var empDep = empRec.getValue({
fieldId: 'department'
})
console.log("empDep: ",empDep)
var empClass = empRec.getValue({
fieldId: 'class'
})
console.log("empClass: ",empClass)
if(checkForParameter(empDep)==true) {
var depRec = record.load({
type: record.Type.DEPARTMENT,
id: empDep,
isDynamic: true
})
var depInactive = depRec.getValue({
fieldId: 'isinactive'
})
console.log("INACTIVE: ", depInactive)
if (depInactive == true) {
alert("Selected Employee has an inactive Department. Please choose another Employee")
return false;
}
else{
return true
}
}
if(checkForParameter(empDep)==false){
return true;
}
if(checkForParameter(empClass)==true){
var classRec = record.load({
type: record.Type.CLASSIFICATION,
id: empClass,
isDynamic: true
})
var classInactive = classRec.getValue({
fieldId: 'isinactive'
})
console.log("classInactive: ", classInactive)
if (classInactive == true) {
alert("Selected Employee has an inactive Class. Please choose another Employee")
return false;
}
else{
return true
}
}
if(checkForParameter(empClass)==false){
return true;
}
}
var assetType;
//For Vendor Bill
if(scriptContext.sublistId == 'expense'){
var exAcc = rec.getCurrentSublistValue({
sublistId: 'expense',
fieldId: 'account'
})
console.log('exAcc: ',exAcc)
if(checkForParameter(exAcc)==true){
var accRec = record.load({
type: 'account',
id: exAcc,
isDynamic: true
})
var accType = accRec.getValue({
fieldId: 'accttype'
})
console.log('accType: ',accType)
if(accType != 'FixedAsset'){
alert("Selected Account is not a Fixed Asset Type Account. So You can't create Fixed Asset from this account")
// return true;
}
}
}
if(scriptContext.sublistId == 'expense' || 'item'){
var amount = rec.getCurrentSublistValue({
sublistId: scriptContext.sublistId,
fieldId: 'amount'
})
console.log("amount: ",amount)
if(checkForParameter(amount)==true) {
if (Number(amount) < 0) {
alert("You can't provide an amount less than zero")
return false;
}
}
}
if(scriptContext.sublistId == 'line'){
var debit = rec.getCurrentSublistValue({
sublistId: scriptContext.sublistId,
fieldId: 'debit'
})
if(checkForParameter(debit)) {
if (Number(debit) < 0) {
alert("You can't provide an amount less than zero to a debit entry")
return false;
}
}
var credit = rec.getCurrentSublistValue({
sublistId: scriptContext.sublistId,
fieldId: 'credit'
})
if(checkForParameter(credit)) {
if (Number(credit) < 0) {
alert("You can't provide an amount less than zero to a credit entry")
return false;
}
}
}
if(scriptContext.sublistId == 'expense' || 'line'){
assetType = rec.getCurrentSublistValue({
sublistId: scriptContext.sublistId,
fieldId: 'custcol_far_asset_type'
})
if(checkForParameter(assetType)== true){
var atRec = record.load({
type: 'customrecord_ncfar_assettype',
id: assetType,
isDynamic: true
})
var atSubsidary = atRec.getValue({
fieldId: 'custrecord_assettype_subsidiary'
})
if(atSubsidary.includes(recSubsidary)==true){
return true;
}
else{
alert("Subsidiary of Asset type and Bill/Journal should be the same")
return false;
}
}
var jAcc = rec.getCurrentSublistValue({
sublistId: scriptContext.sublistId,
fieldId: 'account'
})
if(checkForParameter(jAcc)==true){
//Account Record
var accountRec = record.load({
type: record.Type.ACCOUNT,
id: jAcc,
isDynamic: true
})
var accType = accountRec.getValue({
fieldId: 'accttype'
})
if(accType == 'FixedAsset'){
// if((checkForParameter(assetType) == false) && (Boolean(checkValue) == false)){
if(checkForParameter(assetType) == false){
// alert(" Invalid Choose. If you want to exclude Fixed Asset please check the Exclude Fixed Asset Checkbox or please provide valid Asset type ")
alert("Invalid Choose. Please Select an Asset type. You can't create Fixed asset without Asset Type")
return false
}
else {
return true
}
}
else{
return true
}
}
}
if(scriptContext.sublistId == 'item'){
assetType = rec.getCurrentSublistValue({
sublistId: scriptContext.sublistId,
fieldId: 'custcol_far_asset_types'
})
if(checkForParameter(assetType)== true){
var atRec = record.load({
type: 'customrecord_ncfar_assettype',
id: assetType,
isDynamic: true
})
var atSubsidary = atRec.getValue({
fieldId: 'custrecord_assettype_subsidiary'
})
if(atSubsidary.includes(recSubsidary)==true){
return true;
}
else{
alert("Subsidiary of Asset type and Bill should be the same")
return false;
}
}
// if((checkForParameter(assetType) == false) && (Boolean(checkValue) == false)){
if(checkForParameter(assetType) == false){
// alert(" Invalid Choose. If you want to exclude Fixed Asset please check the Exclude Fixed Asset Checkbox or please provide valid Asset type ")
alert("Invalid Choose. Please Select an Asset type. You can't create Fixed asset without Asset Type")
return false
}
else {
return true
}
}
}
catch (e) {
console.log("Error @ valiadte Line: ",e.name+" : "+e.message)
}
}
/**
* Validation function to be executed when record is saved.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @returns {boolean} Return true if record is valid
*
* @since 2015.2
*/
function saveRecord(scriptContext) {
try{
console.log("in Save")
return true
}
catch (e) {
console.log("Error @ Save : ",e.name+" : "+e.message)
}
}
return {
// postSourcing: postSourcing,
validateLine: validateLine,
saveRecord: saveRecord
};
});