Project Task Auto Population In Timesheet

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}

    });

Leave a comment

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