Link device return and leaver ticket to single request
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
16 hours ago
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
0 REPLIES 0
