Skip to content

Commit 55efc05

Browse files
authored
Check Group dependency (#2313)
* README.md * Create uiaction.js * Create uipage.js
1 parent d4de02f commit 55efc05

File tree

3 files changed

+253
-0
lines changed

3 files changed

+253
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
Easily assess where a user group is used across your ServiceNow instance — before you retire, modify, or repurpose it.
2+
3+
This solution adds a UI Action to the sys_user_group form that opens a clean, dynamic UI Page showing all the dependencies across modules like Tasks, Script Includes, Business Rules, Workflows, Catalog Items, Reports, and more.
4+
5+
Key Features:
6+
7+
• One-click access to group dependency insights
8+
9+
• Displays usage across 10+ key modules
10+
11+
• Modular architecture using UI Page, Script Include, and client-side UI Action
12+
13+
• Easily extensible to include custom tables or rules
14+
15+
16+
Use Cases:
17+
18+
• Pre-deactivation impact checks for groups
19+
20+
• Governance and cleanup tasks
21+
22+
• Platform documentation and audit support
23+
24+
• Extensible framework for users, catalog items, or roles
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
This script should be placed in the UI action on the table sys_user_group form view.
3+
This UI action should be marked as client.
4+
Use popupDependency() function in the Onclick field.
5+
condition - gs.hasRole('admin')
6+
*/
7+
8+
function popupDependency() {
9+
var groupSysId = gel('sys_uniqueValue').value;
10+
var gdw = new GlideDialogWindow('display_group_dependency_list');
11+
gdw.setTitle('Group Dependency');
12+
gdw.setPreference('sysparm_group', groupSysId);
13+
gdw.render();
14+
}
Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
3+
4+
<j:set var="jvar_group_sysid" value="${sysparm_group}"/>
5+
<g:evaluate jelly="true">
6+
var groupSysId = trim(jelly.sysparm_group);
7+
var groupName = '';
8+
var taskRecords = 0;
9+
var reportRecords = 0;
10+
var workflowRecords = 0;
11+
var workflowVersions = '';
12+
var scriptIncludeRecords = 0;
13+
var businessRulesRecords = 0;
14+
var clientScriptRecords = 0;
15+
var maintainItemRecords = 0;
16+
var businessServiceRecords=0;
17+
var systemPropertiesRecords=0;
18+
var avaiforGroupsRecords = 0;
19+
var grACLRecords = 0;
20+
21+
var grGroupName = new GlideRecord('sys_user_group');
22+
if (grGroupName.get('sys_id', groupSysId)) {
23+
groupName = grGroupName.name;
24+
}
25+
26+
// TASK
27+
var grTask = new GlideRecord("task");
28+
grTask.addEncodedQuery('sys_created_onRELATIVEGE@month@ago@9^assignment_group.sys_id='+groupSysId+'^active=true^GROUPBYsys_class_name^ORDERBYsys_created_on');
29+
grTask.query();
30+
taskRecords = grTask.getRowCount();
31+
32+
// REPORTS
33+
var grReport = new GlideRecord("sys_report");
34+
grReport.addEncodedQuery('filterLIKE'+groupSysId+'^ORfilterLIKEE'+groupName);
35+
grReport.query();
36+
reportRecords = grReport.getRowCount();
37+
38+
39+
// WORKFLOWS
40+
var grWFActivity = new GlideRecord('wf_activity');
41+
grWFActivity.addQuery('sys_id', 'IN', getWfActivities(groupSysId, groupName));
42+
grWFActivity.addQuery('workflow_version.published', 'true');
43+
grWFActivity.query();
44+
while (grWFActivity.next()) {
45+
46+
47+
var grh = new GlideRecord("wf_workflow_version");
48+
grh.addEncodedQuery("sys_id=" + grWFActivity.workflow_version.sys_id);
49+
grh.query();
50+
while (grh.next()) {
51+
52+
workflowVersions += grWFActivity.workflow_version.sys_id + ',';
53+
}
54+
}
55+
workflowRecords = getCount(workflowVersions);
56+
if(workflowRecords == 1){
57+
var sci = sciWorkflow(grh.workflow.sys_id.toString());
58+
if(sci){
59+
workflowRecords =0;
60+
workflowVersions ='';
61+
}
62+
}
63+
64+
function sciWorkflow(workflow){
65+
var gr12 = new GlideRecord("sc_cat_item");
66+
gr12.addEncodedQuery("active=false^workflow="+workflow);
67+
gr12.query();
68+
if (gr12.next()) {
69+
return true;
70+
}
71+
}
72+
73+
function getCount(sysid){
74+
var gr = new GlideRecord('wf_workflow_version');
75+
gr.addQuery('sys_id','IN',sysid);
76+
gr.query();
77+
return gr.getRowCount();
78+
}
79+
80+
function getWfActivities(group_id, group_name) {
81+
var grVariables = new GlideRecord('sys_variable_value');
82+
grVariables.addEncodedQuery('valueLIKE'+group_name+'^ORvalueLIKE'+group_id+'^document=wf_activity');
83+
grVariables.query();
84+
var results = [];
85+
while (grVariables.next()) {
86+
results.push(grVariables.document_key + '');
87+
}
88+
return results;
89+
}
90+
91+
// SCRIPT INCLUDES
92+
var grScriptInclude = new GlideRecord("sys_script_include");
93+
grScriptInclude.addEncodedQuery('scriptLIKE'+groupSysId+'^ORscriptLIKE'+groupName+'^active=true');
94+
grScriptInclude.query();
95+
scriptIncludeRecords = grScriptInclude.getRowCount();
96+
97+
// BUSINESS RULES
98+
var grBusinessRules = new GlideRecord("sys_script");
99+
grBusinessRules.addEncodedQuery('active=true^scriptLIKE'+groupName+'^ORscriptLIKE'+groupSysId);
100+
grBusinessRules.query();
101+
businessRulesRecords = grBusinessRules.getRowCount();
102+
103+
// CLIENT SCRIPT
104+
var grClientScript = new GlideRecord("sys_script_client");
105+
grClientScript.addEncodedQuery('sys_class_name=sys_script_client^active=true^scriptLIKE'+groupName+'^ORscriptLIKE'+groupSysId);
106+
grClientScript.query();
107+
clientScriptRecords = grClientScript.getRowCount();
108+
109+
110+
// MAINTAIN ITEMS (CATALOG ITEMS)
111+
var grMaintainItems = new GlideRecord("sc_cat_item");
112+
grMaintainItems.addEncodedQuery('u_approval_group_1='+groupSysId+'^ORu_approval_group_2='+groupSysId+'^ORgroup='+groupSysId+'^ORu_fulfillment_group_2='+groupSysId+'^active=true');
113+
grMaintainItems.query();
114+
maintainItemRecords = grMaintainItems.getRowCount();
115+
116+
//CMDB CI's
117+
118+
var grBusinessServices = new GlideRecord('cmdb_ci');
119+
grBusinessServices.addEncodedQuery('install_status!=7^change_control='+groupSysId+'^ORsupport_group='+groupSysId)
120+
grBusinessServices.query();
121+
businessServiceRecords= grBusinessServices.getRowCount();
122+
123+
//System Properties
124+
var grsysProperties = new GlideRecord('sys_properties');
125+
grsysProperties.addEncodedQuery('valueLIKE'+groupSysId);
126+
grsysProperties.query();
127+
systemPropertiesRecords = grsysProperties.getRowCount();
128+
129+
//Available for Groups
130+
var grAvaiForGroups = new GlideRecord("sc_cat_item_group_mtom");
131+
grAvaiForGroups.addEncodedQuery('sc_cat_item.active=true^sc_avail_group='+ groupSysId);
132+
133+
grAvaiForGroups.query();
134+
avaiforGroupsRecords = grAvaiForGroups.getRowCount();
135+
136+
//Available for Notifications
137+
var grAvaiForNotifications = new GlideRecord("sysevent_email_action");
138+
grAvaiForNotifications.addEncodedQuery('active=true^conditionLIKE'+ groupSysId +'^ORrecipient_groupsLIKE'+ groupSysId + '^ORadvanced_conditionLIKE'+ groupSysId);
139+
140+
grAvaiForNotifications.query();
141+
NotificationRecords = grAvaiForNotifications.getRowCount();
142+
143+
//ACL for Groups
144+
145+
var grACL = new GlideRecord("sys_security_acl");
146+
grACL.addEncodedQuery('scriptLIKE' + groupName + '^ORscriptLIKE' + groupSysId + '^ORconditionLIKE' + groupName + '^ORconditionLIKE' + groupSysId + '^active=true');
147+
grACL.query();
148+
grACLRecords = grACL.getRowCount();
149+
150+
</g:evaluate>
151+
152+
<table width="500px">
153+
<tr style="font-weight:bold">
154+
<td>Module</td>
155+
<td>Records</td>
156+
<td>Details</td>
157+
</tr><tr class="breadcrumb" >
158+
<td>TASK</td>
159+
<td>${taskRecords}</td>
160+
<td>
161+
<a href="task_list.do?sysparm_query=sys_created_onRELATIVEGE%40month%40ago%409%5Eassignment_group.sys_id%3D${groupSysId}%5Eactive%3Dtrue%5EGROUPBYsys_class_name%5EORDERBYsys_created_on" target="blank">View records</a>
162+
</td>
163+
</tr><tr>
164+
<td>Workflows</td>
165+
<td>${workflowRecords}</td>
166+
<td><a href="wf_workflow_version_list.do?sysparm_query=sys_idIN${workflowVersions}" target="blank">View records</a></td>
167+
</tr><tr class="breadcrumb">
168+
<td>Reports</td>
169+
<td>${reportRecords}</td>
170+
<td><a href="sys_report_list.do?sysparm_query=filterLIKE${groupSysId}%5EORfilterLIKEE${groupName}" target="blank">View records</a></td>
171+
</tr><tr class="breadcrumb">
172+
<td>Catalog Items</td>
173+
<td>${maintainItemRecords}</td>
174+
<td><a href="sc_cat_item_list.do?sysparm_query=u_approval_group_1%3D${groupSysId}%5EORu_approval_group_2%3D${groupSysId}%5EORgroup%3D${groupSysId}%5EORu_fulfillment_group_2%3D${groupSysId}%5Eactive%3Dtrue" target="blank">View records</a></td>
175+
<!--/tr><tr>
176+
<td>Script Includes</td>
177+
<td>${scriptIncludeRecords}</td>
178+
<td><a href="sys_script_include_list.do?sysparm_query=scriptLIKE${groupSysId}%5EORscriptLIKE${groupName}%5Eactive%3Dtrue" target="blank">View records</a></td>
179+
</tr><tr>
180+
<td>Business Rules</td>
181+
<td>${businessRulesRecords}</td>
182+
<td><a href="sys_script_list.do?sysparm_query=active%3Dtrue%5EscriptLIKE${groupName}%5EORscriptLIKE${groupSysId}" target="blank">View records</a></td>
183+
</tr><tr class="breadcrumb" >
184+
<td>Client Scripts</td>
185+
<td>${clientScriptRecords}</td>
186+
<td><a href="sys_script_client_list.do?sysparm_query=sys_class_name%3Dsys_script_client%5Eactive%3Dtrue%5EscriptLIKE${groupName}%5EORscriptLIKE${groupSysId}" target="blank">View records</a></td>
187+
</tr><tr class="breadcrumb" >
188+
<td>Configuration Items</td>
189+
<td>${businessServiceRecords}</td>
190+
<td><a href="cmdb_ci_list.do?sysparm_query=change_control%3D${groupSysId}%5EORsupport_group%3D${groupSysId}%5Einstall_status!%3D7" target="blank">View records</a></td>
191+
</tr><tr class="breadcrumb" >
192+
<td>System Properties</td>
193+
<td>${systemPropertiesRecords}</td>
194+
<td><a href="sys_properties_list.do?sysparm_query=valueLIKE${groupSysId}" target="blank">View records</a></td>
195+
</tr>
196+
<tr class="breadcrumb" >
197+
<td>Available for Groups</td>
198+
<td>${avaiforGroupsRecords}</td>
199+
<td><a href="sc_cat_item_group_mtom_list.do?sysparm_query=sc_cat_item.sys_class_name%3Dsc_cat_item%5EORsc_cat_item.sys_class_name%3Dsc_cat_item_producer%5EORsc_cat_item.sys_class_name%3Dstd_change_record_producer%5Esc_cat_item.active%3Dtrue%5Esc_avail_group%3D${groupSysId}" target="blank">View records</a></td>
200+
</tr>
201+
<tr class="breadcrumb" >
202+
<td>Notifications</td>
203+
<td>${NotificationRecords}</td>
204+
<td><a href="sysevent_email_action_list.do?sysparm_query=active%3Dtrue%5EconditionLIKE${groupSysId}%5EORrecipient_groupsLIKE${groupSysId}%5EORadvanced_conditionLIKE${groupSysId}" target="blank">View records</a></td>
205+
</tr>
206+
207+
<tr class="breadcrumb" >
208+
<td>Access Controls (ACL)</td>
209+
<td>${grACLRecords}</td>
210+
<td><a href="sys_security_acl_list.do?sysparm_query=scriptLIKE${groupName}%5EORscriptLIKE${groupSysId}%5Eactive%3Dtrue%5ENQconditionLIKE${groupName}%5EORconditionLIKE${groupSysId}%5Eactive%3Dtrue" target="blank">View records</a></td>
211+
</tr>
212+
</table>
213+
<input type="hidden" id="sysparm_group" value="${sysparm_group} - ${taskRecords} "/>
214+
215+
</j:jelly>

0 commit comments

Comments
 (0)