- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-08-2022 11:40 PM
I have a scheduled job below which will send email every 5, 10,15.....years. Here we want to implement leap year too.
Like user joined on 29th feb 2012 which was leap year and he should receive 5 years completion email on 29th feb 2017 but since 2017 was not leap year, hence there was no 29th feb 2017 and no email trigger. Now, we are in 2022 which is not a leap year and email should trigger to almost 70+ employee on 29th feb which will not get trigger as per code below.
We need to trigger email on next available date which is 1st march 2022. How can we adjust below code to calculate leap year too?
***********
function autoEmail() {
var i;
for (i = 5; i < 40; i= i+5) {
var gdt = new GlideDateTime();
gdt.addYearsUTC(-i);
var queryTime = gdt.getDate();
var gr = new GlideRecord('sn_hr_core_profile');
gr.addQuery('user.u_business_unit', 'US');
gr.addQuery('u_joining_date', queryTime);
gr.query();
while(gr.next()) {
if (gr.user.email.toString() == ""){
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.manager.toString());
}else{
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.toString());
}
gs.info("Employee : "+ gr.user.name + " completed year "+i);
}}}
Solved! Go to Solution.
- Labels:
-
Scripting and Coding
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-23-2022 03:47 AM
Hi,
There was small mistake in code, please try below,
function autoEmail() {
var i;
for (i = 5; i < 40; i= i+5) {
var gdt_today=new GlideTime();
gdt_today.addDaysUTC(-1);
var currentMonth=gdt_today.getMonthLocalTime();
var currentDay=gdt_today.getDayOfMonthLocalTime();
var gdt = new GlideDateTime();
gdt.addYearsUTC(-i);
gdt.addDaysUTC(-1);
var month = gdt.getMonthLocalTime();
var date = gdt.getDayOfMonthLocalTime();
if(month==2 && date==29){
if(!(currentMonth==2 && currentDay==29)){
queryTime = gdt.getDate();
}
}
else{
gdt.addDaysUTC(1);
queryTime = gdt.getDate();
}
var gr = new GlideRecord('sn_hr_core_profile');
gr.addQuery('user.u_business_unit', 'US');
gr.addQuery('u_joining_date', queryTime);
gr.query();
while(gr.next()) {
if (gr.user.email.toString() == ""){
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.manager.toString());
}else{
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.toString());
}
gs.info("Employee : "+ gr.user.name + " completed year "+i);
}}}
Please mark this as Correct or Helpful if it helps.
Thanks and Regards,
Abhijit
Regards,
Abhijit
ServiceNow MVP
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-23-2022 03:33 AM
I tested with putting below date but not working, I put 2024-02-29 it trigger email and when I put 2024-03-01 then again it trigger email.
function autoEmail() {
var i;
for (i = 5; i < 40; i= i+5) {
var gdt_today=new GlideTime("2024-02-29 00:00:00");
gdt_today.addDaysUTC(-1);
var currentMonth=gdt.getMonthLocalTime();
var currentDay=gdt.getDayOfMonthLocalTime();
var gdt = new GlideDateTime("2024-02-29 00:00:00");
gdt.addYearsUTC(-i);
gdt.addDaysUTC(-1);
var month = gdt.getMonthLocalTime();
var date = gdt.getDayOfMonthLocalTime();
if(month==2 && date==29){
if(!(currentMonth==2 && currentDay==29)){
queryTime = gdt.getDate();
}
}
else{
gdt.addDaysUTC(1);
queryTime = gdt.getDate();
}
var gr = new GlideRecord('sn_hr_core_profile');
gr.addQuery('user.u_business_unit', 'US');
gr.addQuery('u_joining_date', queryTime);
gr.query();
while(gr.next()) {
if (gr.user.email.toString() == ""){
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.manager.toString());
}else{
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.toString());
}
gs.info("Employee : "+ gr.user.name + " completed year "+i);
}}}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-23-2022 03:47 AM
Hi,
There was small mistake in code, please try below,
function autoEmail() {
var i;
for (i = 5; i < 40; i= i+5) {
var gdt_today=new GlideTime();
gdt_today.addDaysUTC(-1);
var currentMonth=gdt_today.getMonthLocalTime();
var currentDay=gdt_today.getDayOfMonthLocalTime();
var gdt = new GlideDateTime();
gdt.addYearsUTC(-i);
gdt.addDaysUTC(-1);
var month = gdt.getMonthLocalTime();
var date = gdt.getDayOfMonthLocalTime();
if(month==2 && date==29){
if(!(currentMonth==2 && currentDay==29)){
queryTime = gdt.getDate();
}
}
else{
gdt.addDaysUTC(1);
queryTime = gdt.getDate();
}
var gr = new GlideRecord('sn_hr_core_profile');
gr.addQuery('user.u_business_unit', 'US');
gr.addQuery('u_joining_date', queryTime);
gr.query();
while(gr.next()) {
if (gr.user.email.toString() == ""){
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.manager.toString());
}else{
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.toString());
}
gs.info("Employee : "+ gr.user.name + " completed year "+i);
}}}
Please mark this as Correct or Helpful if it helps.
Thanks and Regards,
Abhijit
Regards,
Abhijit
ServiceNow MVP
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-23-2022 04:05 AM
I tried GlideDateTime() but still 2 emails trigger
function autoEmail() {
var i;
for (i = 5; i < 40; i= i+5) {
var gdt_today=new GlideDateTime("2024-02-29 00:00:00");
gdt_today.addDaysUTC(-1);
var currentMonth=gdt_today.getMonthLocalTime();
var currentDay=gdt_today.getDayOfMonthLocalTime();
var gdt = new GlideDateTime("2024-02-29 00:00:00");
gdt.addYearsUTC(-i);
gdt.addDaysUTC(-1);
var month = gdt.getMonthLocalTime();
var date = gdt.getDayOfMonthLocalTime();
if(month==2 && date==29){
if(!(currentMonth==2 && currentDay==29)){
queryTime = gdt.getDate();
}
}
else{
gdt.addDaysUTC(1);
queryTime = gdt.getDate();
}
var gr = new GlideRecord('sn_hr_core_profile');
gr.addQuery('user.u_business_unit', 'US');
gr.addQuery('u_joining_date', queryTime);
gr.query();
while(gr.next()) {
if (gr.user.email.toString() == ""){
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.manager.toString());
}else{
gs.eventQueue('sn_hr_core.completion_milestone',gr,i,gr.user.toString());
}
gs.info("Employee : "+ gr.user.name + " completed year "+i);
}}}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-23-2022 04:34 AM
Hi,
For testing purpose I tried below code in background script, it provides me your expected output.
Script :
var gdt_today=new GlideDateTime("2024-02-29 00:00:01");
gdt_today.addDaysUTC(-1);
var currentMonth=gdt_today.getMonthLocalTime();
var currentDay=gdt_today.getDayOfMonthLocalTime();
var gdt = new GlideDateTime("2024-02-29 00:00:01");
gdt.addYearsUTC(-20);
gdt.addDaysLocalTime(-1);
var month = gdt.getMonthLocalTime();
var date = gdt.getDayOfMonthLocalTime();
if(month==2 && date==29){
if(!(currentMonth==2 && currentDay==29)){
queryTime = gdt.getDate();
}
}
else{
gdt.addDaysLocalTime(1);
queryTime = gdt.getDate();
}
gs.print(queryTime);
Output :
Script :
var gdt_today=new GlideDateTime("2024-03-01 00:00:01");
gdt_today.addDaysUTC(-1);
var currentMonth=gdt_today.getMonthLocalTime();
var currentDay=gdt_today.getDayOfMonthLocalTime();
var gdt = new GlideDateTime("2024-03-01 00:00:01");
gdt.addYearsUTC(-20);
gdt.addDaysLocalTime(-1);
var month = gdt.getMonthLocalTime();
var date = gdt.getDayOfMonthLocalTime();
if(month==2 && date==29){
if(!(currentMonth==2 && currentDay==29)){
queryTime = gdt.getDate();
}
}
else{
gdt.addDaysLocalTime(1);
queryTime = gdt.getDate();
}
gs.print(queryTime);
Output :
I don't see any problem here, sometimes your current time zone also affects output (not sure though).
Please mark this as Correct or Helpful if it helps.
Thanks and Regards,
Abhijit
Regards,
Abhijit
ServiceNow MVP
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-23-2022 08:41 AM
after
var gdt_today=new GlideDateTime("2024-02-29 00:00:00");
there will be
var queryTime = gdt_today.getDate();
this works now.
Thanks