- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-15-2024 06:40 AM
Hi All,
I have below requirement,
"To achieve the automation of transitioning a story's state from "Post Release Validation" to "Complete" exactly 14 working days after it enters the "Post Release Validation" state using a Scheduled Job in ServiceNow while ensuring the job does not run on weekends"
I have tried to use below script but weekends also scheduled job running , could you please suggest me what's wrong in below script
Thanks in advance!!
Regards,
Pampa
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-15-2024 02:13 PM
Hi @pampapathi1 ,
The issue in the script is in the logic within the getBusinessDays function and how it handles weekends.
In the context of JavaScript Date.getDay(), the days of the week are:
Sunday: 0
Monday: 1
Tuesday: 2
Wednesday: 3
Thursday: 4
Friday: 5
Saturday: 6
Source for the above- https://www.w3schools.com/jsref/jsref_getday.asp
Please find the updated script-
// Query records in the "Post Release Validation" state in rm_story table
var gr = new GlideRecord('rm_story');
gr.addQuery('state', -11); // Query for records in "Post Release Validation" state
gr.query();
// Define the threshold for automatic transition (14 working days)
var thresholdDays = 14;
gs.log('Story submitted days: ' + thresholdDays);
// Function to calculate business days between two dates, excluding weekends
function getBusinessDays(startDate, endDate) {
var days = 0;
var current = new GlideDateTime(startDate);
var end = new GlideDateTime(endDate);
while (current.before(end) || current.equals(end)) {
var dayOfWeek = current.getDayOfWeek();
if (dayOfWeek != 6 && dayOfWeek != 0) { // Check if it's not Saturday (6) or Sunday (0)
days++;
}
current.addDays(1);
}
return days;
}
// Loop through each record found
while (gr.next()) {
// Calculate business days since the state was set to 'Post Release Validation'
var startDateTime = gr.sys_created_on; // Assuming sys_created_on is the relevant date/time field
gs.log('Post release validation: ' + startDateTime);
var now = new GlideDateTime();
gs.log('Now: ' + now);
var elapsedBusinessDays = getBusinessDays(startDateTime, now); // Calculate business days between startDateTime and now
gs.log('Calculating business days: ' + elapsedBusinessDays);
// Check if the record has been in "Post Release Validation" state for 14 working days
if (elapsedBusinessDays >= thresholdDays) {
gs.log('Story ' + gr.number + ' has exceeded 14 working days in post release validation state.');
gr.state = 3; // Assuming 'Complete' is represented by state 3
gr.update();
gs.log('State updated to Complete for rm_story record: ' + gr.number);
}
}
Changed dayOfWeek != 6 && dayOfWeek != 7(In your script)
to dayOfWeek != 6 && dayOfWeek != 0 (In the updated script)
If my response has resolved your query, please consider giving it a thumbs up and marking it as the correct answer!
Thanks & Regards,
Sanjay Kumar
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-18-2024 01:16 AM - edited 06-18-2024 01:19 AM
Hi @Community Alums ,
I checked the date today for testing purpose but the story completes without checking the condition.( I tested today like the weekend but didn't skip tuesday =2)
Could you please check the bold text below.
// Query records in the "Post Release Validation" state in rm_story table
var gr = new GlideRecord('rm_story');
gr.addQuery('state', -11); // Query for records in "Post Release Validation" state
gr.query();
// Define the threshold for automatic transition (14 working days)
var thresholdDays = 1;
gs.log('Story submitted days: ' + thresholdDays);
// Function to calculate business days between two dates, excluding weekends
function getBusinessDays(startDate, endDate) {
var days = 0;
gs.log('days:'+days);
var current = new GlideDateTime(startDate);
gs.log('current:'+current);
var end = new GlideDateTime(endDate);
gs.log('end:'+end);
while (current.before(end) || current.equals(end)) {
var dayOfWeek = current.getDayOfWeek();
gs.log('day of week:'+dayOfWeek);
//if (dayOfWeek != 6 && dayOfWeek != 0) { // Check if it's not Saturday (6) or Sunday (0)
if (dayOfWeek != 2){
days++;
}
current.addDays(1);
}
return days;
}
// Loop through each record found
while (gr.next()) {
// Calculate business days since the state was set to 'Post Release Validation'
var startDateTime = gr.sys_updated_on;
// Assuming sys_created_on is the relevant date/time field
gs.log('Post release validation: ' + startDateTime);
var now = new GlideDateTime();
gs.log('Now: ' + now);
var elapsedBusinessDays = getBusinessDays(startDateTime, now); // Calculate business days between startDateTime and now
gs.log('elapsedbd:'+elapsedBusinessDays);
gs.log('Calculating business days: ' + elapsedBusinessDays);
// Check if the record has been in "Post Release Validation" state for 14 working days
if (elapsedBusinessDays >= thresholdDays) {
gs.log('Story ' + gr.number + ' has exceeded 14 working days in post release validation state.');
gr.state = 3; // Assuming 'Complete' is represented by state 3
gr.update();
gs.log('State updated to Complete for rm_story record: ' + gr.number);
}
}
Could you please suggest on above code.
Regards,
Pampa
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-18-2024 10:19 AM
Try the following in scripts background:
var cdt = new GlideDateTime();
gs.info('DateTime: ' + cdt + ', dayOfWeek: ' + cdt.getDayOfWeek());
for (i = 0; i < 7; i++) {
cdt.addDays(-1);
gs.info('DateTime: ' + cdt + ', dayOfWeek: ' + cdt.getDayOfWeek());
}
And see that Saturday = 6 and Sunday = 7 in Servicenow.
*** Script: DateTime: 2024-06-18 17:17:27, dayOfWeek: 2
*** Script: DateTime: 2024-06-17 17:17:27, dayOfWeek: 1
*** Script: DateTime: 2024-06-16 17:17:27, dayOfWeek: 7
*** Script: DateTime: 2024-06-15 17:17:27, dayOfWeek: 6
*** Script: DateTime: 2024-06-14 17:17:27, dayOfWeek: 5
*** Script: DateTime: 2024-06-13 17:17:27, dayOfWeek: 4
*** Script: DateTime: 2024-06-12 17:17:27, dayOfWeek: 3
*** Script: DateTime: 2024-06-11 17:17:27, dayOfWeek: 2