Advanced Reference Qualifier not working

Ryan S
Kilo Sage

Hi all. Working in a domain separated environment and have a requirement for the 'Assigned_To' field to be filtered based on the user being in 2 sys_user_group--the selected 'Assignment_Group' as well as another Visibility group. I've tried:

1. background script with hardcoded sys_ids. It works. I get the expected result which returns 1 user

2. all code in reference qualifier: Doesn't work. I get a list of all users

3. reference qualifier calling script include. Doesn't work. I get no users returned.

Assuming #3 is best approach, I've put that code below for review.

 

Assigned_To reference qualifier:

 

javascript: new AssignedToReferenceQualifier().getAssignedTo(current.company.sys_id,current.company.sys_domain,current.assignment_group.sys_id)

 

 

 

Script Include:

 

var AssignedToReferenceQualifier = Class.create();
AssignedToReferenceQualifier.prototype = {
    initialize: function() {
    },
	getAssignedTo: function(myCompany, myDomain, myGroup) {
//query the Group Visibility Domain table to find the Visibility Group that grants access to the company's domain
    var visibilityGroup = new GlideRecord('sys_user_group_visibility');
    visibilityGroup.addQuery('sys_domain', myDomain);
	visibilityGroup.addQuery('group.name', 'CONTAINS', myCompany);
    visibilityGroup.query();
    while (visibilityGroup.next()) {
		var groupSysID = visibilityGroup.group;
		gs.info(groupSysID);
	}
//now that we have the Visibility, we can filter the group membership table for the members of this group
    var userVisArray = [];
    var groupMembers = new GlideRecord('sys_user_grmember');
    groupMembers.addQuery('group',groupSysID);
    groupMembers.query();
	while(groupMembers.next()) {
		userVisArray.push(groupMembers.user.toString());
	}
	var membershipResults = [];
	var strLength = userVisArray.length;
//now that we have members that are part of the Visibility group, confirm they are also part of the selected assignment group
	var userAssignArray = [];
	for(var i = 0; i < strLength; i++){
		var userID = userVisArray[i];
		gs.info(userID);
		var grMember = new GlideRecord('sys_user_grmember');
		grMember.addQuery('user',userID);
		grMember.addQuery('group',myGroup);
		grMember.query();
		while(grMember.next()){
			userAssignArray.push(grMember.user.toString());
		}
	}
	return 'sys_idIN' + userAssignArray.join(',');
    },
    type: 'AssignedToReferenceQualifier'
};

 

1 ACCEPTED SOLUTION

Hi @Ryan S Please find the updated code - 

var AssignedToReferenceQualifier = Class.create();
AssignedToReferenceQualifier.prototype = {
    initialize: function() {},
    getAssignedTo: function(myCompany, myDomain, myGroup) {
        //only apply to specific groups, for now just going based on certain value in Group Name field
        var gr = new GlideRecord('sys_user_group');
        gr.addQuery('sys_id', myGroup);
        gr.addQuery('name', 'CONTAINS', '');
        gr.query();
        if (gr.next()) {
            //query the Group Visibility Domain table to find the Visibility Group that grants access to the company's domain
            var visibilityGroup = new GlideRecord('sys_user_group_visibility');
            visibilityGroup.addQuery('sys_domain', myDomain);
            visibilityGroup.addQuery('group.name', 'CONTAINS', myCompany);
            visibilityGroup.query();
            while (visibilityGroup.next()) {
                var groupSysID = visibilityGroup.group;
            }
            //now that we have the Visibility, we can filter the group membership table for the members of this group
            var userVisArray = [];
            var groupMembers = new GlideRecord('sys_user_grmember');
            groupMembers.addQuery('group', groupSysID);
            groupMembers.query();
            while (groupMembers.next()) {
                userVisArray.push(groupMembers.user.toString());
            }
            var membershipResults = [];
            var strLength = userVisArray.length;
            //now that we have members that are part of the Visibility group, confirm they are also part of the selected assignment group
            var userAssignArray = [];
            for (var i = 0; i < strLength; i++) {
                var userID = userVisArray[i];
                var grMember = new GlideRecord('sys_user_grmember');
                grMember.addQuery('user', userID);
                grMember.addQuery('group', myGroup);
                grMember.query();
                while (grMember.next()) {
                    userAssignArray.push(grMember.user.toString());
                }
            }
            return 'sys_idIN' + userAssignArray.join(',');
        } else {
            var groupMembersArray = [];
            var grMembers = new GlideRecord('sys_user_grmember');
            grMembers.addQuery('group', myGroup);
            grMembers.query();
            while (grMembers.next()) {
                groupMembersArray.push(grMembers.user.toString());
            }
            return 'sys_idIN' + groupMembersArray.join(',');
        }

    },
    type: 'AssignedToReferenceQualifier'
};

 first return statement should be inside the 'if' block.

View solution in original post

12 REPLIES 12

Vishal Jaswal
Giga Sage

Hello @Ryan S 


updated ref qual:

 

 


javascript&colon; new AssignedToReferenceQualifier().getAssignedTo('company_sys_id', 'domain_sys_id', 'group_sys_id');


Updated Script Include:

 

var AssignedToReferenceQualifier = Class.create();
AssignedToReferenceQualifier.prototype = {
initialize: function() {},
getAssignedTo: function(myCompany, myDomain, myGroup) {
var userAssignArray = [];

// Query Group Visibility Domain table
var visibilityGroup = new GlideRecord('sys_user_group_visibility');
visibilityGroup.addQuery('sys_domain', myDomain);
visibilityGroup.addQuery('group.name', 'CONTAINS', myCompany);
visibilityGroup.query();

while (visibilityGroup.next()) {
var groupSysID = visibilityGroup.group.toString();

// Query Group Membership
var groupMembers = new GlideRecord('sys_user_grmember');
groupMembers.addQuery('group', groupSysID);
groupMembers.query();

while (groupMembers.next()) {
var userID = groupMembers.user.toString();

// validate user is part of assignment group
var grMember = new GlideRecord('sys_user_grmember');
grMember.addQuery('user', userID);
grMember.addQuery('group', myGroup);
grMember.query();

while (grMember.next()) {
userAssignArray.push(grMember.user.toString());
}
}
}

return 'sys_idIN' + userAssignArray.join(',');
},
type: 'AssignedToReferenceQualifier'
};


Hope that helps!

GopikaP
Mega Sage

Hi @Ryan S , I see that you are passing company sys id, from the reference qualifier call and, in the script include - 

visibilityGroup.addQuery('group.name', 'CONTAINS', myCompany); // here myCompany variable contains sys_id of the company, but you are quering name here

getAssignedTo: function(myCompany, myDomain, myGroup) {
//query the Group Visibility Domain table to find the Visibility Group that grants access to the company's domain
    var visibilityGroup = new GlideRecord('sys_user_group_visibility');
    visibilityGroup.addQuery('sys_domain', myDomain);
	visibilityGroup.addQuery('group.name', 'CONTAINS', myCompany); // here myCompany variable contains sys_id, but you are quering name here
    visibilityGroup.query();
    while (visibilityGroup.next()) {
		var groupSysID = visibilityGroup.group;

That was it! Thank you.

If you found my answer helpful, please consider marking it as correct.