Requirement
We need to populate the corresponding project task in the timesheet when the user selects the project. The population will only take place if the project has one project task.
Solution
We can create a client script and a suitelet script to populate the project task. When a project is selected in a time item then correspondingly the project task will be populated . This is done using a client script field change entry point.
A suitelet script is used here to overcome the permission issues that may arise here related with the project and project task.
Clientscript.js
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
define(['N/currentRecord', 'N/record', 'N/runtime', 'N/search', "N/https", 'N/url'],
/**
* @param{currentRecord} currentRecord
* @param{record} record
* @param{runtime} runtime
* @param{search} search
* @param{https} https
* @param{url} url
*/
function (currentRecord, record, runtime, search, https, url) {
/**
* Function to be executed when field is changed.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @param {string} scriptContext.sublistId - Sublist name
* @param {string} scriptContext.fieldId - Field name
* @param {number} scriptContext.lineNum - Line number. Will be undefined if not a sublist or matrix field
* @param {number} scriptContext.columnNum - Line number. Will be undefined if not a matrix field
*
* @since 2015.2
*/
function fieldChanged(scriptContext) {
try {
//When sublist id is timeitem
if (scriptContext.sublistId === 'timeitem') {
//When field id is customer
if (scriptContext.fieldId === 'customer') {
//Get current record
var currentRec = scriptContext.currentRecord
console.log('currentRec', currentRec)
//Get current customer id
var custId = currentRec.getCurrentSublistValue({
sublistId: 'timeitem',
fieldId: 'customer',
// line:line
})
console.log('custId', custId)
if(checkForParameter(custId)) {
var output = url.resolveScript({
scriptId: 796,
deploymentId: 'customdeploy_jj_sl_prjt_tsk_ppltn_aq3339',
returnExternalUrl: false,
params: {
'custscriptcust_id': custId,
}
}
)
https.post.promise({
url: output,
body: 'Body',
headers: {"Content-Type": "application/json"}
})
.then(function (response) {
var body = JSON.parse(response.body)
var taskId = body.values[0].values["projectTask.internalid"][0].value
log.debug('srchRes', taskId)
log.debug({
title: 'Response',
details: body
})
currentRec.setCurrentSublistValue({
sublistId: 'timeitem',
fieldId: 'casetaskevent',
value: taskId
})
});
}
}
}
}
// }
catch (e) {
console.log('Error@FieldChanged', e)
}
}
function checkForParameter(parameter) {
if (parameter !== "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null" && parameter !== "undefined" && parameter !== " " && parameter !== 'false') {
return true;
}
}
return {
fieldChanged: fieldChanged,
};
});
Suitelet.js
/**
* @NApiVersion 2.1
* @NScriptType Suitelet
*/
define(['N/record', 'N/redirect', 'N/search', 'N/ui/serverWidget'],
/**
* @param{record} record
* @param{redirect} redirect
* @param{search} search
* @param{serverWidget} serverWidget
*/
(record, redirect, search, serverWidget) => {
/**
* Defines the Suitelet script trigger point.
* @param {Object} scriptContext
* @param {ServerRequest} scriptContext.request - Incoming request
* @param {ServerResponse} scriptContext.response - Suitelet response
* @since 2015.2
*/
const onRequest = (scriptContext) => {
try {
log.debug('In sutie;et')
var custId = scriptContext.request.parameters.custscriptcust_id;
log.debug('custId',custId)
//Job search to retrieve project tasks of a project
var jobSearchObj = search.create({
type: "job",
filters:
[
["internalid", "anyof", custId]
],
columns:
[
search.createColumn({name: "internalid", label: "Internal ID"}),
search.createColumn({
name: "internalid",
join: "projectTask",
label: "Internal ID"
}),
search.createColumn({
name: "title",
join: "projectTask",
label: "Name"
})
]
});
var searchResult = jobSearchObj.run().getRange({
start: 0,
end: 1000
});
log.debug("jobSearchObj result count", searchResult);
log.debug('searchResult', searchResult.length)
//Return only if the project has only one project task
if (searchResult.length === 1) {
scriptContext.response.write(JSON.stringify({values: searchResult}))
//return searchResult
} else {
return 0
}
} catch (e) {
log.debug('Error@OnRequest',e)
}
}
return {onRequest}
});