Catalog integration via Scripted REST API

attanhes
Tera Guru

I have a catalog item integrated with a scripted REST API, following guidance from a community post @Ankur Bawiskar . The test integration functions as expected, and REQ and RITM tickets are created successfully. However, the issue arises as reference fields are not being populated when requests are created.

 

 

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

var reqbody = request.body.dataString;

try{
var parser = new global.JSON();
var parsedData = parser.decode(reqbody);

var requestedFor = parsedData.requested_for;
var requestedBy = parsedData.requested_by;
var startDate = parsedData.start_date;
var endDate = parsedData.end_date;

var cartId = GlideGuid.generate(null);
var cart = new Cart(cartId);

// give here the sys_id of the catalog item under which those variables are present

// you can query sys_user and get the value and then set those reference variables
	
var grUser = new GlideRecord('sys_user');
grUser.get('requested_for',requestedFor);

var item = cart.addItem('c916f905db70c6105330be32f39619dd', 1);

//fill in the variables on the request item form
cart.setVariable(item,"requested_for", requestedFor);
cart.setVariable(item,"requested_by", requestedBy);
cart.setVariable(item,"start_date", startDate);
cart.setVariable(item,"end_date", endDate);

var rc = cart.placeOrder();

// rc is the request number; you can query RITM table and get the RITM number

var reqNumber = rc.number;

var ritm = new GlideRecord('sc_req_item');
ritm.get('request.number', reqNumber);
var ritmNumber = ritm.number;

var res = {};
res["status"] = "Success";
res["requestNumber"] = reqNumber;
res["requestItemNumber"] = ritmNumber;
//response.setBody(JSON.stringify(res));
response.setBody(res);

}
catch(ex){
//var rest = {};
res["status"] = "Error";
res["message"] = ex.message;
response.setBody(JSON.stringify(res));

	//result.result = "Failed with error: " + err.toString();
//response.setStatus(500);
		//gs.eventQueue()
}

})(request, response);

 

 

Json data format comes as in below, both users are existing in the plafom.

 

 

{ 
'sysparm_id': 'c916f905db70c6105330be32f39619dd',
'sysparm_quantity': '1',
'variables': {
'requested_for' : 'Abel Tuter',
'requested_by' : 'Fred Luddy,
'end_date' : '25/03/2024',
'start_date' : '18/03/2024'
}
}

 

 

attanhes_0-1709709947402.png

 

 

Can someone please tell me as why that requested_for reference does not auto fill when request create throughh rest API?

1 ACCEPTED SOLUTION

attanhes
Tera Guru

I am adding my fulll code here in if case anyone wants to take advantage. Also, I endup mapping REQ requested for dictionary same as requested_for variable value.

 

 

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    var reqbody = request.body.dataString;

    try {
        var parser = new global.JSON();
        var parsedData = parser.decode(reqbody);

        var requestedFor = parsedData.requested_for;
        var requestedBy = parsedData.requested_by;
        var startDate = parsedData.start_date;
        var endDate = parsedData.end_date;

        var cartId = GlideGuid.generate(null);
        var cart = new Cart(cartId);

        // Query the sys_user table to get the requested for user details
        var grUser = new GlideRecord('sys_user');
        //grUser.addQuery('user_name', requestedFor); // Assuming requestedFor is the username
		grUser.addQuery('name', requestedFor); // Assuming requestedFor is the username
        grUser.query();
        if (grUser.next()) {
            var requestedForSysId = grUser.sys_id.toString(); // Get the sys_id of the user
        }

        var item = cart.addItem('c916f905db70c6105330be32f39619dd', 1);

        // Set the variables on the request item form
        cart.setVariable(item, "requested_for", requestedForSysId); // Set the sys_id of the user
        cart.setVariable(item, "requested_by", requestedBy);
        cart.setVariable(item, "start_date", startDate);
        cart.setVariable(item, "end_date", endDate);

        var rc = cart.placeOrder();
        var reqNumber = rc.number;

        // Update the "Requested For" field on the REQ record
        var reqRecord = new GlideRecord('sc_request');
        if (reqRecord.get('number', reqNumber)) {
            reqRecord.setValue('requested_for', requestedForSysId); // Set the sys_id of the user
            reqRecord.update();
        }

        // Fetch the RITM number for response
        var ritm = new GlideRecord('sc_req_item');
        ritm.addQuery('request', reqNumber);
        ritm.query();
        if (ritm.next()) {
            var ritmNumber = ritm.number;
        }

        var res = {};
        res["status"] = "Success";
        res["requestNumber"] = reqNumber;
        res["requestItemNumber"] = ritmNumber;
        response.setBody(res);
    } catch (ex) {
        var res = {};
        res["status"] = "Error";
        res["message"] = ex.message;
        response.setBody(res);
        response.setStatus(500);
    }

})(request, response);

 

 

 

Jason format should be

 

 

 

{
"sysparm_id": "c916f905db70c6105330be32f39619dd",
"sysparm_quantity": "1",
  "requested_for": "Fred Luddy ",
  "requested_by": "Abel Tuter,
  "start_date": "2024-03-06",
  "end_date": "2024-03-10"
}

 

 

 

 

 

View solution in original post

6 REPLIES 6

Tai Vu
Kilo Patron
Kilo Patron

Hi @attanhes 

The issue arises as reference fields are not being populated when requests are created.

Since these variables are in Reference type. The requestedFor and requestedBy in your script should be the user's sys_id instead of name.

cart.setVariable(item,"requested_for", requestedFor); //the user's sys_id
cart.setVariable(item,"requested_by", requestedBy); //the user's sys_id

 

Cheers,

Tai Vu

Harish KM
Kilo Patron
Kilo Patron

HI @attanhes the below requested_by and requested_for must be the sysid of the user, else you need to glide user table and match the name and return the sysid of the user and then map on the variables

{
'sysparm_id': 'c916f905db70c6105330be32f39619dd',
'sysparm_quantity': '1',
'variables': {
'requested_for' : 'Abel Tuter', // requires sysid
'requested_by' : 'Fred Luddy,//requires sysid
'end_date' : '25/03/2024',
'start_date' : '18/03/2024'
}
}

Regards
Harish

attanhes
Tera Guru

Thankfully ChatGPT corrected my code.  I misconfigured  the Glide reference.

 

// Query the sys_user table to get the requested for user details
        var grUser = new GlideRecord('sys_user');
        grUser.addQuery('user_name', requestedFor); // Assuming requestedFor is the username
        grUser.query();
        if (grUser.next()) {
            var requestedForSysId = grUser.sys_id.toString(); // Get the sys_id of the user
        }

 

Hi @attanhes that's what I meant in my reply you need to query user table , match the name and return the sysid and then do the mapping to the variables

Regards
Harish