Scheduled job for reminder

Hafsa1
Mega Sage

I have written this scheduled job which will send reminder notification every 2 days.

like 

1st reminder every 2 days

2nd reminder every 4 days

3rd reminder every 6 days

 

But issue is coming on weekend. We are running this only on weekdays with condition. Now if in between weekend is coming then sometimes reminder don't trigger. How to correct this?

 

 

var reminder = new GlideRecord('sysapproval_approver');
reminder.addEncodedQuery("state=requested^source_table=sn_customerservice_north_america_procurement");
reminder.query();
while (reminder.next()) {

    var bdtActual = new GlideDateTime(reminder.sys_created_on);
    var date = bdtActual.getDate();
    var bdtNow = new GlideDate();
    var days, difference;
    difference = GlideDate.subtract(date, bdtNow);
    days = difference.getDayPart();
    difference.getDayPart();

    if (days % 2 === 0 && days > 1 && days < 3) {
        gs.eventQueue('sn_customerservice.reminder1', reminder, reminder.approver);
    } else if (days % 2 === 0 && days > 3 && days < 6) {
        gs.eventQueue('sn_customerservice.reminder2', reminder, reminder.approver);
    } else if (days % 2 === 0 && days > 5 && days < 7) {
        gs.eventQueue('sn_customerservice.reminder3', reminder, reminder.approver);
    }
}
1 ACCEPTED SOLUTION

Nilesh Pol
Tera Guru

@Hafsa1 

ou need to adjust your logic to exclude weekends from the day count. Instead of counting calendar days, count business days (weekdays only).

verify with following updated script:

 

var reminder = new GlideRecord('sysapproval_approver');
reminder.addEncodedQuery("state=requested^source_table=sn_customerservice_north_america_procurement");
reminder.query();

while (reminder.next()) {
var createdDate = new GlideDateTime(reminder.sys_created_on);
var today = new GlideDateTime();
var businessDays = getBusinessDaysBetween(createdDate, today);

if (businessDays == 2) {
gs.eventQueue('sn_customerservice.reminder1', reminder, reminder.approver);
} else if (businessDays == 4) {
gs.eventQueue('sn_customerservice.reminder2', reminder, reminder.approver);
} else if (businessDays == 6) {
gs.eventQueue('sn_customerservice.reminder3', reminder, reminder.approver);
}
}

// Function to count only business days (excluding weekends)
function getBusinessDaysBetween(startDate, endDate) {
var count = 0;
var tempDate = new GlideDateTime(startDate);
while (tempDate.before(endDate)) {
var dayOfWeek = tempDate.getDayOfWeek(); // 1 = Monday, 7 = Sunday
if (dayOfWeek != 6 && dayOfWeek != 7) { // Skip Saturday (6) and Sunday (7)
count++;
}
tempDate.addDays(1);
}
return count;
}

View solution in original post

2 REPLIES 2

Nilesh Pol
Tera Guru

@Hafsa1 

ou need to adjust your logic to exclude weekends from the day count. Instead of counting calendar days, count business days (weekdays only).

verify with following updated script:

 

var reminder = new GlideRecord('sysapproval_approver');
reminder.addEncodedQuery("state=requested^source_table=sn_customerservice_north_america_procurement");
reminder.query();

while (reminder.next()) {
var createdDate = new GlideDateTime(reminder.sys_created_on);
var today = new GlideDateTime();
var businessDays = getBusinessDaysBetween(createdDate, today);

if (businessDays == 2) {
gs.eventQueue('sn_customerservice.reminder1', reminder, reminder.approver);
} else if (businessDays == 4) {
gs.eventQueue('sn_customerservice.reminder2', reminder, reminder.approver);
} else if (businessDays == 6) {
gs.eventQueue('sn_customerservice.reminder3', reminder, reminder.approver);
}
}

// Function to count only business days (excluding weekends)
function getBusinessDaysBetween(startDate, endDate) {
var count = 0;
var tempDate = new GlideDateTime(startDate);
while (tempDate.before(endDate)) {
var dayOfWeek = tempDate.getDayOfWeek(); // 1 = Monday, 7 = Sunday
if (dayOfWeek != 6 && dayOfWeek != 7) { // Skip Saturday (6) and Sunday (7)
count++;
}
tempDate.addDays(1);
}
return count;
}

Robert H
Mega Sage

Hello @Hafsa1 ,

 

I would recommend that, if possible, you change the job to run daily, including on weekends.

Otherwise there will always be a risk of something missed due to different time zones (for example, Saturday morning in India would still be Friday in the USA), daylight saving time switches, etc. It would be very tricky to accommodate all these cases in the script.

 

If the script runs every day it can be as simple as this:

 

var reminder = new GlideRecord('change_request');
reminder.query();

var bdtNow = new GlideDateTime();
while (reminder.next()) {
    var bdtActual = new GlideDateTime(reminder.sys_created_on);
    var days = GlideDateTime.subtract(bdtActual, bdtNow).getDayPart();
    var event = '';
    switch (days.toString()) {
        case '2': event = 'sn_customerservice.reminder1'; break;
        case '4': event = 'sn_customerservice.reminder2'; break;
        case '6': event = 'sn_customerservice.reminder3';
    }
    if (event) {
		gs.eventQueue(event, reminder, reminder.approver);
    }
}

 

Regards,

Robert