Welcome to Community Week 2025! Join us to learn, connect, and be recognized as we celebrate the spirit of Community and the power of AI. Get the details  

Link device return and leaver ticket to single request

Aparna Gurav
Tera Contributor

Hello 

I need to link the device return and leaver requests into a single request. Previously, separate requests were being created — one for the leaver and another for the device return when the termination date changed. I’ve updated the business rule and script include to combine both RITMs into a single request, but it’s not working as expected. It currently creates a single request for the leaver RITM only, without adding the device return RITM. can you please review the business rule and script include below and suggest the solution

business rule

(function executeRule(current, previous /*null when async*/ ) {

        var userID = current.getUniqueValue();
        var userName = current.getDisplayValue('name');
        var userLocation = current.getValue('location');
        var userTitle = current.getValue('title');
        var userManager = current.getValue('manager');
        var userDepartment = current.getValue('department');
        var terminationDate = current.getValue('u_ad_termination_date');

        var cmdbQuery = 'sys_class_name=cmdb_ci_handheld_computing^ORsys_class_name=cmdb_ci_computer^operational_status!=6^assigned_to=' + userID;
        var catItemDeviceReturn = gs.getProperty('spr_device_return_cat_item_id'); // Device Return
        var catItemLeavers = gs.getProperty('spr_leavers_cat_item_id'); // Leavers Request

        var justification = 'Device return ticket automatically created for leaver: ' + userName;
        var leaverRITMquery = 'cat_item=' + catItemLeavers + '^stateIN-5,1,2^request.requested_for=' + userID;

        // Build Device Return details
        var deviceReturnDetails = {
            requestedForID: userID,
            requestedForString: userName,
            location: userLocation,
            cmdbQuery: cmdbQuery,
            catItem: catItemDeviceReturn,
            justification: justification
        };

        // Build Leaver Request details
        var leaversDetails = {
            requestedForID: userID,
            requestedForString: userName,
            location: userLocation,
            catItem: catItemLeavers,
            additional_comments: 'Leaver ticket automatically generated by user account deactivation',
            title: userTitle,
            department: userDepartment,
            manager: userManager,
            leaving_date: terminationDate
        };

        if (!gs.nil(userID)) {
            try {
                var openedRequest = new SPR_Auto_Create_Request_Repo();

                // Check if Leaver Request already exists
                var leaverRequestExists = openedRequest.requestExists(
                    leaversDetails.requestedForID,
                    leaversDetails.catItem,
                    leaverRITMquery
                );

                if (!leaverRequestExists) {

                    // combined REQ -leaver and device return
                    var combinedRequestStatus = openedRequest.createCombinedREQ(leaversDetails, deviceReturnDetails);

                    if (combinedRequestStatus) {
                        gs.log('SPR Auto Create Requests for Leaver: Combined Request successfully created for ' + userName);
                    } else {
                        gs.log('SPR Auto Create Requests for Leaver: Failed to create combined Request for ' + userName);
                    }

                } else {
                    gs.log('SPR Auto Create Requests for Leaver: Leaver Request already exists for ' + userName);
                }

            } catch (error) {
                gs.log(
                    'SPR Auto Create Requests for Leaver:' + '\n' +
                    'Requested For: ' + userName + '\n' +
                    'Error while auto creating combined requests: ' + error.message
                );
            }
        }
    

})(current, previous);


Script Include

var SPR_Auto_Create_Request_Repo = Class.create();
SPR_Auto_Create_Request_Repo.prototype = {
    initialize: function() {},

    conditionCheck: function(reason_for_request) {

        if (reason_for_request && reason_for_request != 'Order for stock') {
            return true;
        }

        return false;
    },


     // Creates one REQ with multiple RITMs
    createCombinedREQ: function(leaverObj, deviceObj) {
        try {
            var cartID = gs.generateGUID();
            var cart = new sn_sc.CartJS(cartID);

            // Add Leaver RITM
            var leaverVars = {
                requested_for: leaverObj.requestedForID,
                job_title: leaverObj.title,
                manager: leaverObj.manager,
                location: leaverObj.location,
                department: leaverObj.department,
                additional_comments: leaverObj.additional_comments
            };

            if (leaverObj.leaving_date)
                leaverVars.leaving_date = leaverObj.leaving_date.toString();

            cart.addToCart({
                sysparm_id: leaverObj.catItem,
                sysparm_quantity: '1',
                variables: leaverVars
            });

            // Add Device Return RITMs (for each assigned device)
            var devices = this.getRequestedForComputers(deviceObj.cmdbQuery);
            if (devices && devices.length > 0) {
                for (var i = 0; i < devices.length; i++) {
                    var devVars = {
                        requested_for: deviceObj.requestedForID,
                        location: deviceObj.location,
                        device_to_be_returned: devices[i],
                        justification: deviceObj.justification
                    };

                    cart.addToCart({
                        sysparm_id: deviceObj.catItem,
                        sysparm_quantity: '1',
                        variables: devVars
                    });
                }
            } else {
                gs.log('No devices found for user: ' + deviceObj.requestedForString);
            }

            // Checkout once → single REQ with multiple RITMs
            var checkoutInfo = cart.checkoutCart();
            gs.log('Combined REQ created for ' + leaverObj.requestedForString + ': ' + JSON.stringify(checkoutInfo));

            return true;

        } catch (e) {
            gs.log('Error in createCombinedREQ: ' + e.message);
            return false;
        }
    },

    getRequestedForComputers: function(cmdbQuery) {


        var cmdbComputers = new GlideRecord('cmdb_ci_computer');
        var deviceArr = [];
        cmdbComputers.addEncodedQuery(cmdbQuery);
        cmdbComputers.query();
        while (cmdbComputers.next()) {

            deviceArr.push(cmdbComputers.getUniqueValue());
        }
        if (deviceArr.length > 0) {

            return deviceArr;
        } else {
            return null;
        }

    },

    
    //Check if RITM already exists based on the passed ritmQuery

    requestExists: function(requestedFor, catItem, ritmQuery) {
        var ritmGR = new GlideRecord('sc_req_item');
        ritmGR.addEncodedQuery(ritmQuery);
        ritmGR.query();
        if (ritmGR.next()) {

            return true;
        } else
            return false;
    },

    //Return RITM link

    getRITMlink: function(ritmID) {

        var instanceName = gs.getProperty('instance_name');

        if (ritmID) {

            // Fetch the Requested Item (RITM) record
            var ritmGR = new GlideRecord('sc_req_item');
            if (ritmGR.get(ritmID)) {
                var ritmNumber = ritmGR.number;

                return 'https://' + instanceName + '.service-now.com/sp?id=ticket&table=sc_req_item&sys_id=' + ritmID;
            }
        }
    },

    type: 'SPR_Auto_Create_Request_Repo'
};


Output

AparnaGurav_0-1762333299739.png

 

 

0 REPLIES 0