Skip to content

Commit f409e84

Browse files
Indra-kolgekmxo
andauthored
Daily IT Metrics report email (#2278)
* Add daily summary email script for incidents * README.md This README provides details on the daily summary email job, including its use case, recipients, and purpose. * Update script.js Fixing Breach Time field name --------- Co-authored-by: Carlos Camacho <56931121+kmxo@users.noreply.github.com>
1 parent 6863578 commit f409e84

File tree

2 files changed

+111
-0
lines changed

2 files changed

+111
-0
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Use Case: Daily Summary Notification Email
2+
This scheduled job sends a daily email to a specific IT group with a quick summary of important IT service metrics, including:
3+
Number of open incidents
4+
Pending approvals
5+
SLAs breached today
6+
High priority incidents (P1/P2)
7+
Incidents unassigned for more than 24 hours
8+
9+
Who receives it?
10+
Active members of a designated ServiceNow group (like Incident Management or IT Operations).
11+
12+
Why?
13+
To give IT teams and managers daily visibility into workload, critical issues, and bottlenecks so they can act quickly and keep service running smoothly.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
(function() {
2+
var groupName = 'Incident Management';
3+
var emailFrom = 'no-reply@yourcompany.com';
4+
var emailSubject = 'ServiceNow Daily Summary';
5+
6+
var todayStart = new GlideDateTime();
7+
todayStart.setDisplayValue(gs.beginningOfToday());
8+
9+
var dayAgo = new GlideDateTime();
10+
dayAgo.addDaysUTC(-1);
11+
12+
// Open Incidents (not closed)
13+
var grOpenInc = new GlideAggregate('incident');
14+
grOpenInc.addAggregate('COUNT');
15+
grOpenInc.addQuery('state', '!=', '7');
16+
grOpenInc.query();
17+
grOpenInc.next();
18+
var openIncidents = grOpenInc.getAggregate('COUNT');
19+
20+
// Pending Approvals
21+
var grApprovals = new GlideAggregate('sysapproval_approver');
22+
grApprovals.addAggregate('COUNT');
23+
grApprovals.addQuery('state', 'requested');
24+
grApprovals.query();
25+
grApprovals.next();
26+
var pendingApprovals = grApprovals.getAggregate('COUNT');
27+
28+
// SLAs Breached Today
29+
var grSLA = new GlideAggregate('task_sla');
30+
grSLA.addAggregate('COUNT');
31+
grSLA.addQuery('planned_end_time', '>=', todayStart); //Breach time is the field Label
32+
grSLA.addQuery('stage', 'breached');
33+
grSLA.query();
34+
grSLA.next();
35+
var breachedSLAs = grSLA.getAggregate('COUNT');
36+
37+
// High Priority Incidents (P1 & P2 open)
38+
var grHighPri = new GlideAggregate('incident');
39+
grHighPri.addAggregate('COUNT');
40+
grHighPri.addQuery('priority', 'IN', '1,2');
41+
grHighPri.addQuery('state', '!=', '7');
42+
grHighPri.query();
43+
grHighPri.next();
44+
var highPriorityOpen = grHighPri.getAggregate('COUNT');
45+
46+
// Incidents unassigned > 24 hours
47+
var grUnassigned = new GlideAggregate('incident');
48+
grUnassigned.addAggregate('COUNT');
49+
grUnassigned.addQuery('assigned_to', 'ISEMPTY');
50+
grUnassigned.addQuery('opened_at', '<=', dayAgo);
51+
grUnassigned.addQuery('state', '!=', '7');
52+
grUnassigned.query();
53+
grUnassigned.next();
54+
var unassignedOld = grUnassigned.getAggregate('COUNT');
55+
56+
var emailBody = '';
57+
emailBody += ' *ServiceNow Daily Summary (' + gs.nowDate() + ')*\n\n';
58+
emailBody += '• Open Incidents: ' + openIncidents + '\n';
59+
emailBody += '• Pending Approvals: ' + pendingApprovals + '\n';
60+
emailBody += '• SLAs Breached Today: ' + breachedSLAs + '\n';
61+
emailBody += '• High Priority Incidents (P1/P2): ' + highPriorityOpen + '\n';
62+
emailBody += '• Unassigned Incidents > 24h: ' + unassignedOld + '\n';
63+
emailBody += '\n';
64+
var recipients = [];
65+
66+
var group = new GlideRecord('sys_user_group');
67+
if (group.get('name', groupName)) {
68+
var m2m = new GlideRecord('sys_user_grmember');
69+
m2m.addQuery('group', group.sys_id);
70+
m2m.query();
71+
while (m2m.next()) {
72+
var user = m2m.user.getRefRecord();
73+
if (user.active && user.email) {
74+
recipients.push(user.email.toString());
75+
}
76+
}
77+
} else {
78+
gs.error('Group "' + groupName + '" not found. No emails sent.');
79+
return;
80+
}
81+
82+
if (recipients.length === 0) {
83+
gs.info('No active users with email found in group "' + groupName + '". No emails sent.');
84+
return;
85+
}
86+
87+
for (var i = 0; i < recipients.length; i++) {
88+
var email = new GlideRecord('sys_email');
89+
email.initialize();
90+
email.type = 'send-ready';
91+
email.recipients = recipients[i];
92+
email.from = emailFrom;
93+
email.subject = emailSubject;
94+
email.body = emailBody;
95+
email.insert();
96+
}
97+
98+
})();

0 commit comments

Comments
 (0)