- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-05-2017 08:40 AM
On our sys_user table, we have a few custom fields:
u_hire_date - this is the user's last hire date
u_new_hire_ticket_generated - this is a checkbox that indicates whether a new hire ticket has been generated
So, there is a scheduled job that runs every 10 minutes that looks to see if there are any new hires (hire date is less than 7 days in the future) who have not had a new hire ticket generated (it then generates the ticket and checks the box).
The issue that we have is when he import our user records daily, sometimes a person is rehired, in which case their u_hire_date field is updated to some future date. So I am trying to write an After Update Business Rule on the sys_user table that looks for two things:
- the u_new_hire_ticket_generated is checked
- the u_hire_date field is more than 7 days in the future
If both of those conditions are true, it should clear the check out of the u_new_hire_ticket_generated checkbox, so when the u_hire_date field is exactly 7 days in the future, our scheduled job will generated a new hire ticket for them. However, I am unable to get my script in my Business Rule to work (I actually wouldn't need a script if the Filter Conditions on the When to Run tab had an "more than 7 days in the future" options, but alas, it doesn't).
Here is my script attempt:
(function executeRule(current, previous /*null when async*/) {
// Add your code here
var chkDate = new Date();
chkDate.setDate(chkDate() + 7); /*days*/
if ((current.u_new_hire_ticket_generated=='TRUE') && (current.u_hire_date > chkDate)) {
current.u_new_hire_ticket_generated='FALSE';
}
})(current, previous);
Can anyone see where I went wrong?
Solved! Go to Solution.
- Labels:
-
Scripting and Coding
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-06-2017 09:23 AM
Oops.. fat finger in my code:
Where you had this:
var futureDate = new GlideDate();
gs.addInfoMessage("Before calc: " + futureDate);
futureDate = futureDate.addDaysLocalTime(7);
gs.addInfoMessage("After calc: " + futureDate);
Change to:
var futureDate = new GlideDate();
gs.addInfoMessage("Before calc: " + futureDate);
futureDate.addDaysLocalTime(7);
gs.addInfoMessage("After calc: " + futureDate);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-05-2017 08:51 AM
You're mixing and matching date objects.
On line 4, you're using a JS date, but SN doesn't use/convert it's date/date-time fields to JS Date objects.
Changing your comparison to gs.dateDiff() should work for you:
(function executeRule(current, previous /*null when async*/) {
var futureDate = new GlideDateTime(); // or GlideDate, depending on what field type "u_hire_date" is
futureDate.addDaysLocalTime(7);
var dateDiffCalc = gs.dateDiff(current.u_hire_date.getDisplayValue(), futureDate.getDisplayValue(), true);
if (current.u_new_hire_ticket_generated == true && dateDiffCalc > 0) {
current.u_new_hire_ticket_generated = false;
}
})(current, previous);
gs.dateDiff documentation here: https://developer.servicenow.com/app.do#!/api_doc?v=helsinki&id=r_GS-dateDiff_S_S_B
https://developer.servicenow.com/app.do#!/api_doc?v=helsinki&id=r_GS-dateDiff_S_S_B
[EDIT] Updated fat finger in my code
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-05-2017 09:03 AM
Believe it or not, I tried something similar to that first that didn't work. I used GlideDateTime and addDaysLocal, but it didn't work. I did not use DateDiff though.
So, I checked, and u_hire_date is just a Date, so I used your GlideDate option. However, when I tested it out, it did not seem to work. I am not sure why it isn't working.
I have seen funkiness as it applies to checkboxes and whether or not TRUE/FALSE should be enclosed in single quotes or not, so I tried both ways.
But, still no luck.
Any other ideas?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-05-2017 09:12 AM
Ah yes, I missed that.
When you set checkbox values, set them like this (and case matters, too):
current.u_new_hire_ticket_generated = false;
The same goes for checking your condition:
if (current.u_new_hire_ticket_generated == true && dateDiff > 0)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-05-2017 09:19 AM
Unfortunately, it still doesn't seem to be working.
Here is the latest version of the code, with the changes we discussed:
(function executeRule(current, previous /*null when async*/) {
var futureDate = new GlideDate();
futureDate = futureDate.addDaysLocalTime(7);
var dateDiff = gs.dateDiff(current.u_hire_date.getDisplayValue(), futureDate.getDisplayValue(), true);
if (current.u_new_hire_ticket_generated==true && dateDiff > 0) {
current.u_new_hire_ticket_generated=false;
}
})(current, previous);