- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-05-2023 05:05 AM
Hi all,
We have a requirement which has a 3 strike rule implementation , where when the task state changes to 'pending' and pending reading reason is 'Waiting for user information' then 4 reminder emails has to trigger with the 7 days gap, this is implemented in the below script. Also even after all 4 reminders we need to have a 7 days gap, in this last 7 days gap (total 4 days gap) if still the state is pending then the task should get set to 'Closed incomplete' automatically
The concern is:
1)Suppose 2 reminder emails are sent then in the 7 days gap the state of the task is changed to other state from pending then the 3rd and 4th email should not trigger, basically need to stop the business rule
2) After all 4 reminders we need to have a 7 days gap, in this last 7 days gap (total 4 days gap) if still the state is pending then the task should get set to 'Closed incomplete' automatically
Note: The implementation need to be with a business rule only
below is the script
(function executeRule(current, previous /*null when async*/ ) {
// Add your code here
var gdt = new GlideDateTime();
var parm1 = gs.getUserID();
var parm2 = current.request.requested_for;
var loc = current.request.requested_for.location.u_flat_country.name;
var req_user = [];
req_user.push(current.request.requested_for.email, current.request.requested_for.manager.email);
var parm_2 = req_user.toString();
gs.log("@reminder check parm's: " + parm1 + " - " + parm2 + " - " + parm_2);
/*first reminder*/
gdt.addDaysUTC(7);
var firstReminder = gdt;
gs.log("@firstReminder: " + firstReminder);
if (loc == 'United Kingdom of Great Britain and Northern Ireland (the)') {
gs.eventQueueScheduled("Reminder.one.for.purchase.task", current, parm1, parm2, firstReminder);
} else if (loc == 'France') {
gs.eventQueueScheduled("Reminder.one.purchase.task.FR", current, parm1, parm2, firstReminder);
} else if (loc == 'Germany') {
gs.eventQueueScheduled("Reminder.1st.purchase.task.DE", current, parm1, parm2, firstReminder);
} else if (loc == 'Spain') {
gs.eventQueueScheduled("Reminder.1st.purchase.task.ES", current, parm1, parm2, firstReminder);
}
/* end of first reminder*/
/*second reminder*/
gdt.addDaysUTC(7);
var secondReminder = gdt;
gs.log("@secondReminder: " + secondReminder);
if(current.state == -5) {
if (loc == 'United Kingdom of Great Britain and Northern Ireland (the)') {
gs.eventQueueScheduled("send.reminder.second.purchase.task", current, parm1, parm_2, secondReminder);
} else if (loc == 'France') {
gs.eventQueueScheduled("Reminder.two.purchase.task.FR", current, parm1, parm_2, secondReminder);
} else if (loc == 'Germany') {
gs.eventQueueScheduled("Reminder.2nd.purchase.task.DE", current, parm1, parm_2, secondReminder);
} else if (loc == 'Spain') {
gs.eventQueueScheduled("Reminder.2nd.purchase.task.ES", current, parm1, parm_2, secondReminder);
}
}
/*end of second reminder*/
/*third reminder*/
gdt.addDaysUTC(7);
var thirdReminder = gdt;
gs.log("@thirdReminder: " + thirdReminder);
if (current.state == -5) {
if (loc == 'United Kingdom of Great Britain and Northern Ireland (the)') {
gs.eventQueueScheduled("send.reminder.third.purchase.task", current, parm1, parm_2, thirdReminder);
} else if (loc == 'France') {
gs.eventQueueScheduled("Reminder.3rd.purchase.task.FR", current, parm1, parm_2, thirdReminder);
} else if (loc == 'Germany') {
gs.eventQueueScheduled("Reminder.3rd.purchase.task.DE", current, parm1, parm_2, thirdReminder);
} else if (loc == 'Spain') {
gs.eventQueueScheduled("Reminder.3rd.purchase.task.ES", current, parm1, parm_2, thirdReminder);
}
}
/*end of third reminder*/
/*final reminder*/
gdt.addDaysUTC(7);
var finalReminder = gdt;
gs.log("@finalReminder: " + finalReminder);
if (loc == 'United Kingdom of Great Britain and Northern Ireland (the)') {
gs.eventQueueScheduled("Reminder.final.purchase.task.UK", current, parm1, parm_2, finalReminder);
} else if (loc == 'France') {
gs.eventQueueScheduled("Reminder.final.purchase.task.FR", current, parm1, parm_2, finalReminder);
} else if (loc == 'Germany') {
gs.eventQueueScheduled("Reminder.final.purchase.task.DE", current, parm1, parm_2, finalReminder);
} else if (loc == 'Spain') {
gs.eventQueueScheduled("Reminder.final.purchase.task.ES", current, parm1, parm_2, finalReminder);
}
/*end of final reminder*/
//current.state = '4';
//current.update();
})(current, previous);
Thanks in advace
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-05-2023 10:50 AM
Hi @William08
Try this
// Get the current date and time
var now = new GlideDateTime();
// Calculate the start of the next quarter
var startOfNextQuarter = new GlideDateTime();
startOfNextQuarter.setMonthUTC(now.getMonthUTC() + 3);
startOfNextQuarter.setDayUTC(1);
startOfNextQuarter.setHourUTC(0);
startOfNextQuarter.setMinuteUTC(0);
startOfNextQuarter.setSecondUTC(0);
// Query for contracts with payments due in the next quarter
var contractGr = new GlideRecord('your_contract_table');
contractGr.addQuery('payment_due_date', '>=', startOfNextQuarter);
contractGr.addQuery('payment_due_date', '<', startOfNextQuarter.addDays(-30));
contractGr.query();
while (contractGr.next()) {
// Check if the contract is still in a pending state before sending the reminder
if (contractGr.getValue('state_field') == 'pending') {
// Trigger notification logic here
gs.eventQueue('contract.payment.reminder', contractGr, 'your_notification_script_include');
}
}
Please mark as accepted solution & hit helpful button
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-05-2023 05:51 AM
Hi @William08 ,
To implement the 3-strike rule with a 7-day gap for reminders and automatically close the task if still pending after all reminders, you can make the following adjustments to your business rule script. Please note that this solution assumes that you already have the necessary events and business rules set up for reminders.
(function executeRule(current, previous /*null when async*/ ) {
// Add your code here
var gdt = new GlideDateTime();
var loc = current.request.requested_for.location.u_flat_country.name;
/*first reminder*/
gdt.addDaysUTC(7);
var firstReminder = gdt;
scheduleReminder("Reminder.one.for.purchase.task", parm1, parm2, firstReminder, loc);
/*second reminder*/
gdt.addDaysUTC(7);
var secondReminder = gdt;
if (current.state == -5) {
scheduleReminder("send.reminder.second.purchase.task", parm1, parm_2, secondReminder, loc);
}
/*third reminder*/
gdt.addDaysUTC(7);
var thirdReminder = gdt;
if (current.state == -5) {
scheduleReminder("send.reminder.third.purchase.task", parm1, parm_2, thirdReminder, loc);
}
/*final reminder*/
gdt.addDaysUTC(7);
var finalReminder = gdt;
scheduleReminder("Reminder.final.purchase.task.UK", parm1, parm_2, finalReminder, loc);
// Auto-close task after 4 reminders with a 7-day gap
gdt.addDaysUTC(7);
var autoCloseTime = gdt;
if (current.state == -5) {
gs.eventQueueScheduled("AutoClose.purchase.task", current, parm1, parm_2, autoCloseTime);
}
function scheduleReminder(eventName, parm1, parm2, reminderTime, location) {
if (location == 'United Kingdom of Great Britain and Northern Ireland (the)') {
gs.eventQueueScheduled(eventName, current, parm1, parm2, reminderTime);
} else if (location == 'France') {
gs.eventQueueScheduled(eventName + ".FR", current, parm1, parm2, reminderTime);
} else if (location == 'Germany') {
gs.eventQueueScheduled(eventName + ".DE", current, parm1, parm2, reminderTime);
} else if (location == 'Spain') {
gs.eventQueueScheduled(eventName + ".ES", current, parm1, parm2, reminderTime);
}
}
})(current, previous);
Please mark as accepted solution & helpful if it suffice your requirement & helped you.
BR, Sohith
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-05-2023 09:46 AM
Hi @Sohithanjan G ,
Thanks for helping,
But if we change the state from pending to work in progress is should not send the reminder.
Means if the second reminder is sent and in between 7 days for third reminder if i change it to some other state other than pending it should not send the third reminder please help
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-05-2023 10:50 AM
Hi @William08
Try this
// Get the current date and time
var now = new GlideDateTime();
// Calculate the start of the next quarter
var startOfNextQuarter = new GlideDateTime();
startOfNextQuarter.setMonthUTC(now.getMonthUTC() + 3);
startOfNextQuarter.setDayUTC(1);
startOfNextQuarter.setHourUTC(0);
startOfNextQuarter.setMinuteUTC(0);
startOfNextQuarter.setSecondUTC(0);
// Query for contracts with payments due in the next quarter
var contractGr = new GlideRecord('your_contract_table');
contractGr.addQuery('payment_due_date', '>=', startOfNextQuarter);
contractGr.addQuery('payment_due_date', '<', startOfNextQuarter.addDays(-30));
contractGr.query();
while (contractGr.next()) {
// Check if the contract is still in a pending state before sending the reminder
if (contractGr.getValue('state_field') == 'pending') {
// Trigger notification logic here
gs.eventQueue('contract.payment.reminder', contractGr, 'your_notification_script_include');
}
}
Please mark as accepted solution & hit helpful button