- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-20-2024 11:17 AM - edited ‎03-20-2024 12:13 PM
I have a requirement where I need the task called CMDB, once created, in the workflow to assign the planned end date with two more days to the planned start date, but not count weekends.
I have a business rule programmed where it takes the value of the due date field of the task creation and places it in the planned completion date field, but I cannot get the two additional days to be reflected without counting weekends
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-22-2024 10:19 AM
Hi @Paulo Campos Ch,
You posted BR has an Action that sets the planned_start_date to the due_date, and also has "Advanced" check, but you didn't post your script. You should use one means and not both. The following BR script can do what you want:
(function executeRule(current, previous /*null when async*/) {
// Add your code here
var dateValue = current.planned_start_date;
gs.info("CalcEndDate: planned_start_date = " + dateValue);
var daysToAdd = 2;
var newDate = new GlideDateTime(dateValue);
// Add days
newDate.addDays(daysToAdd);
// Check if start date is in the schedule (8-5 weekdays excluding holidays)
var sched = new GlideSchedule();
sched.load('090eecae0a0a0b260077e1dfa71da828');
var startDate = new GlideDateTime(dateValue);
gs.info('CalcEndDate: checking if start date: ' + startDate + ' is in schedule');
if (!sched.isInSchedule(startDate)) {
gs.info('CalcEndDate: Start date is not in schedule! Using day-of-week.');
var dayOfWeek = newDate.getDayOfWeekLocalTime();
switch (dayOfWeek) {
case 6:
newDate.addDays(2); //Saturday
break;
case 7:
newDate.addDays(1); // Sunday
break;
}
}
else {
// Check if new date is in the schedule (8-5 weekdays excluding holidays)
gs.info('CalcEndDate: checking if ' + newDate + ' is in schedule');
while (!sched.isInSchedule(newDate)) {
gs.info('CalcEndDate: ' + newDate + ' is not in schedule');
newDate.addDays(1);
}
}
current.planned_end_date = newDate;
gs.info("CalcEndDate: due_date: " + dateValue + ", daysToadd: " + daysToAdd + ", newDate = " + newDate);
})(current, previous);
Remove the 'Set field value' "Action" and let the script determine the new value. Provided you want to avoid non-work hours and holidays too. If that is not a goal, then use the logic in the "if" block above that just checks day-of-week. (And remove any gs.info() lines used to debug if you like.)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-20-2024 11:49 AM - edited ‎03-20-2024 11:51 AM
Try using the "8-5 weekdays" schedule, the table is 'cmn_schedule'. And refer to:
Post your BR definition and script, then folks here can assist.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-22-2024 10:19 AM
Hi @Paulo Campos Ch,
You posted BR has an Action that sets the planned_start_date to the due_date, and also has "Advanced" check, but you didn't post your script. You should use one means and not both. The following BR script can do what you want:
(function executeRule(current, previous /*null when async*/) {
// Add your code here
var dateValue = current.planned_start_date;
gs.info("CalcEndDate: planned_start_date = " + dateValue);
var daysToAdd = 2;
var newDate = new GlideDateTime(dateValue);
// Add days
newDate.addDays(daysToAdd);
// Check if start date is in the schedule (8-5 weekdays excluding holidays)
var sched = new GlideSchedule();
sched.load('090eecae0a0a0b260077e1dfa71da828');
var startDate = new GlideDateTime(dateValue);
gs.info('CalcEndDate: checking if start date: ' + startDate + ' is in schedule');
if (!sched.isInSchedule(startDate)) {
gs.info('CalcEndDate: Start date is not in schedule! Using day-of-week.');
var dayOfWeek = newDate.getDayOfWeekLocalTime();
switch (dayOfWeek) {
case 6:
newDate.addDays(2); //Saturday
break;
case 7:
newDate.addDays(1); // Sunday
break;
}
}
else {
// Check if new date is in the schedule (8-5 weekdays excluding holidays)
gs.info('CalcEndDate: checking if ' + newDate + ' is in schedule');
while (!sched.isInSchedule(newDate)) {
gs.info('CalcEndDate: ' + newDate + ' is not in schedule');
newDate.addDays(1);
}
}
current.planned_end_date = newDate;
gs.info("CalcEndDate: due_date: " + dateValue + ", daysToadd: " + daysToAdd + ", newDate = " + newDate);
})(current, previous);
Remove the 'Set field value' "Action" and let the script determine the new value. Provided you want to avoid non-work hours and holidays too. If that is not a goal, then use the logic in the "if" block above that just checks day-of-week. (And remove any gs.info() lines used to debug if you like.)