Find your people. Pick a challenge. Ship something real. The CreatorCon Hackathon is coming to the Community Pavilion for one epic night. Every skill level, every role welcome. Join us on May 5th and learn more here.

Variable Date no less than 5 business days

booher04
Tera Guru

We have a need to require a requested_completion_date to be at least 5 business days, if you select a date less than 5 business days you get an error and it clears the field.  My question is do I have to write a script include with this or can I write an onChange client script to accomplish this?  The schedule we use is '8-8 weekdays excluding holidays'.  

 

1 ACCEPTED SOLUTION

booher04
Tera Guru

Resolved:

onChange Client Script:

function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}

// Call the GA function
var ga = new GlideAjax('u_userInfoAjax');
ga.addParam('sysparm_name', "getInfo");
ga.addParam('sysparm_date', g_form.getValue('requested_completion_date'));
ga.getXMLAnswer(function(answer){
if(answer == 'true'){
alert('Please select date after 5 business days');
g_form.clearValue('requested_completion_date');
}

});

}

 

Script Include:

var u_userInfoAjax = Class.create();
u_userInfoAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, {

getInfo: function(){

var dateSelected = this.getParameter('sysparm_date');

var nowDateTime = new GlideDateTime();

var days = 5;

//var dur = new GlideDuration(60*60*24*days*1000);
var dur = new GlideDuration(days*43200*1000);

// paste the sys_id of the 8*8 weekday schedule excluding holidays

var schedule = new GlideSchedule('2218ff1bdba8eb40fb6e753a8c96198d'); //8-8 weekdays excluding holidays

var finalTime = schedule.add(nowDateTime, dur,'');

var updatedGdt = new GlideDateTime(dateSelected);

var finalTimeGdt = new GlideDateTime(finalTime);

if(updatedGdt < finalTimeGdt){

return 'true';

}
return 'false';
},

type: 'u_userInfoAjax'

});

View solution in original post

19 REPLIES 19

Hi Booher04,

There was a syntax error in the code. i have fixed it. Could you try it again.

 

Script Include-

 

var ClientDateTimeUtils = Class.create();

 

ClientDateTimeUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {

 

//Takes a Single Date/Time Field and returns its time difference from nowDateTime().

//params = sysparm_fdt (the first date/time field), sysparm_difftype (time based format to return result. See "_calcDateDiff" function comments)


getNowDateTimeDiff: function(){

var firstDT = this.getParameter('sysparm_fdt'); //First Date-Time Field

var diffTYPE = this.getParameter('sysparm_difftype'); // Date-Time Type to return the answer as. Can be second, minute, hour, day

var diff = gs.dateDiff(gs.nowDateTime(), firstDT, true);

var timediff = this._calcDateDiff(diffTYPE, diff);

//return "getNowDateTimeDiff: FIRST DT: " + firstDT + " -DIFFTYPE: " + diffTYPE + " -TIME DIFF: " + timediff;

return timediff;

},

//Private function to calculate the date difference return result in second, minute, hour, day.

_calcDateDiff: function(diffTYPE, seconds){

var thisdiff;

if (diffTYPE == "day"){thisdiff = seconds/86400;}

else if (diffTYPE == "hour"){thisdiff = seconds/3600;}

else if (diffTYPE == "minute"){thisdiff = seconds/60;}

else if (diffTYPE == "second"){thisdiff = seconds;}

else {thisdiff = seconds;}

return thisdiff;
},

});

 

 

Mark Correct and 👍 Helpful based on the impact.

Warm Regards,

Arvind

Ok, it's working for the most part.  The only issue I have now is that it's not calculating the 5 days as 5 business days.  

I have a schedule we currently use '8-8 weekdays excluding holidays'.  Is there a way we can add that into the client script?  Something like this below?

var schedRec = new GlideRecord('cmn_schedule');

schedRec.get('name', '8-5 weekdays');

if (typeof GlideSchedule != 'undefined')

var sched = new GlideSchedule(schedRec.sys_id);

else

var sched = new Packages.com.glide.schedules.Schedule(schedRec.sys_id);

Hi,

Did you update the code and would like to share it?

the code shared earlier works for me

Regards
Ankur

Regards,
Ankur
Certified Technical Architect  ||  10x ServiceNow MVP  ||  ServiceNow Community Leader

function onChange(control, oldValue, newValue, isLoading) {

if (isLoading || newValue == '') {

return;

}

var cdt = newValue; //The date field

var dttype = 'day'; //this can be day, hour, minute, second. By default it will return seconds.

g_form.hideFieldMsg('due_date');

var ajax = new GlideAjax('ClientDateTimeUtils');

ajax.addParam('sysparm_name','getNowDateTimeDiff');

ajax.addParam('sysparm_fdt', cdt);

ajax.addParam('sysparm_difftype', dttype);

ajax.getXML(doSomething);

function doSomething(response){

var answer = response.responseXML.documentElement.getAttribute("answer");

//alert(answer);

if(answer<0 || answer<5){

g_form.showFieldMsg('due_date', "Date should be more than 5 working days from today " , 'error');

//alert('Change value');

alert("Date should be more than 5 working days from today.");

g_form.clearValue('requested_completion_date'); // Pass the variable name here

g_form.setMandatory('requested_completion_date');

}

}}

CLIENT SCRIPT:

var ClientDateTimeUtils = Class.create();
ClientDateTimeUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {

//Takes a Single Date/Time Field and returns its time difference from nowDateTime().
//params = sysparm_fdt (the first date/time field), sysparm_difftype (time based format to return result. See "_calcDateDiff" function comments)
getNowDateTimeDiff: function(){
var firstDT = this.getParameter('sysparm_fdt'); //First Date-Time Field
var diffTYPE = this.getParameter('sysparm_difftype'); // Date-Time Type to return the answer as. Can be second, minute, hour, day
var diff = gs.dateDiff(gs.nowDateTime(), firstDT, true);
var timediff = this._calcDateDiff(diffTYPE, diff);
//return "getNowDateTimeDiff: FIRST DT: " + firstDT + " -DIFFTYPE: " + diffTYPE + " -TIME DIFF: " + timediff;
return timediff;
},

//Diff the amount of time between two different Date/Time fields
//params = sysparm_fdt (the first date/time field), sysparm_sdt (second date/time field), sysparm_difftype (time based format to return result. See "_calcDateDiff" function comments)
getDateTimeDiff: function(){
var firstDT = this.getParameter('sysparm_fdt'); //First Date-Time Field
var secondDT = this.getParameter('sysparm_sdt'); // Second Date-Time Field
var diffTYPE = this.getParameter('sysparm_difftype'); // Date-Time Type to return the answer as. Can be second, minute, hour, day
var diff = gs.dateDiff(firstDT, secondDT, true);
var timediff = this._calcDateDiff(diffTYPE, diff);
//return "getDateTimeDiff: FIRST DT: " + firstDT + " -SECOND DT: " + secondDT + " -DIFFTYPE: " + diffTYPE + " -TIME DIFF: " + timediff;
return timediff;
},

//Takes your date/time field and returns the amount of time before now. A positive is time before now, a negative number is after now.
//params = sysparm_fdt (the first date/time field), sysparm_difftype (time based format to return result. See "_calcDateDiff" function comments)
getDateTimeBeforeNow: function(){
var firstDT = this.getParameter('sysparm_fdt'); //First Date-Time Field
var diffTYPE = this.getParameter('sysparm_difftype'); // Date-Time Type to return the answer as. Can be second, minute, hour, day
var diff = gs.dateDiff(firstDT, gs.nowDateTime(), true);
var timediff = this._calcDateDiff(diffTYPE, diff);
//return "getDateTimeBeforeNow: FIRST DT: " + firstDT + " -DIFFTYPE: " + diffTYPE + " -TIME DIFF: " + timediff;
return timediff;
},

//Returns true if it is before now, and false if it is after now.
//params = sysparm_fdt (the first date/time field)
getDateTimeBeforeNowBool: function(){
var firstDT = this.getParameter('sysparm_fdt'); //First Date-Time Field
var diff = gs.dateDiff(firstDT, gs.nowDateTime(), true);
var answer = '';
if (diff >= 0){answer = 'true';}
else {answer = 'false';}
return answer;
},

//Returns the Date/Time of right now.
getNowDateTime: function(){
var now = gs.nowDateTime(); //Now Date/Time
return now;
},

//Returns the Date right now.
getNowDate: function(){
var now = GlideDate(); //Now Date
return now.getLocalDate();
},

//Returns the Time of right now.
getNowTime: function(){
var now = GlideTime(); //Now Time
var modnow = now.getLocalTime().toString().split(' ');
return modnow[1];
},

//Takes a date/time field and adds time to it.
//params = sysparm_fdt (the first date/time field), sysparm_addtype (type of time to add - second, minute, hour, day, week, month, year), sysparm_addtime (amount of time to add based on the type).
addDateTimeAmount: function(){
var firstDT = this.getParameter('sysparm_fdt'); //First Date-Time Field
var addTYPE = this.getParameter('sysparm_addtype'); //What to add - second (addSeconds()), minute (need to add conversion), hour (need to add conversion), day (addDays()), week (addWeeks()), month (addMonths()), year (addYears())
var addTIME = this.getParameter('sysparm_addtime'); //How much time to add
var day = GlideDateTime(firstDT);

if(addTYPE == 'second'){day.addSeconds(addTIME);}
else if (addTYPE == 'minute'){day.addSeconds(addTIME*60);}
else if (addTYPE == 'hour'){day.addSeconds(addTIME*(60*60));}
else if (addTYPE == 'day'){day.addDays(addTIME);}
else if (addTYPE == 'week'){day.addWeeks(addTIME);}
else if (addTYPE == 'month'){day.addMonths(addTIME);}
else if (addTYPE == 'year'){day.addYears(addTIME);}
else {day.addDays(addTIME);}

//return "First Date: " + firstDT + " -Time to Add: " + addTIME + " -Add Type: " + addTYPE + " -Added Time: " + day;
return day;
},

//Takes a glide date field and adds time to it.
//params = sysparm_fdt (the first date/time field), sysparm_addtype (type of time to add - day, week, month, year),sysparm_addtime (amount of time to add based on the type).
addDateAmount: function(){
var firstDT = this.getParameter('sysparm_fdt'); //First Date Field
var addTYPE = this.getParameter('sysparm_addtype'); //What to add - day (addDays()), week (addWeeks()), month (addMonths()), year (addYears())
var addTIME = this.getParameter('sysparm_addtime'); //How much time to add
var day = GlideDate();
day.setValue(firstDT);

if(addTYPE == 'day'){day.addDays(addTIME);}
else if (addTYPE == 'week'){day.addWeeks(addTIME);}
else if (addTYPE == 'month'){day.addMonths(addTIME);}
else if (addTYPE == 'year'){day.addYears(addTIME);}
else {day.addDays(addTIME);}

//return "First Date: " + firstDT + " -Time to Add: " + addTIME + " -Add Type: " + addTYPE + " -Added Time: " + day;
return day;
},

addTimeAmount: function(){
var firstDT = this.getParameter('sysparm_fdt'); //First Date-Time Field
var addTYPE = this.getParameter('sysparm_addtype'); //What
var addTIME = this.getParameter('sysparm_addtime'); //How much time to add
var time = GlideTime();
time.setValue(firstDT);

if(addTYPE == 'second'){time.addSeconds(addTIME);}
else if (addTYPE == 'minute'){time.addSeconds(addTIME*60);}
else if (addTYPE == 'hour'){time.addSeconds(addTIME*(60*60));}
else {time.addSeconds(addTIME);}

var modtime = time.toString().split(' ');
//return "First Date: " + firstDT + " -Time to Add: " + addTIME + " -Add Type: " + addTYPE + " -Added Time: " + time;
return modtime[1];
},

//Private function to calculate the date difference return result in second, minute, hour, day.
_calcDateDiff: function(diffTYPE, seconds){
var thisdiff;
if (diffTYPE == "day"){thisdiff = seconds/86400;}
else if (diffTYPE == "hour"){thisdiff = seconds/3600;}
else if (diffTYPE == "minute"){thisdiff = seconds/60;}
else if (diffTYPE == "second"){thisdiff = seconds;}
else {thisdiff = seconds;}
return thisdiff;
}


});

 

Hi there,

 

I have tweak the code little bit:

 

Client Script:

 

function onChange(control, oldValue, newValue, isLoading) {

    if (isLoading || newValue == '') {

          return;

    }

    //Type appropriate comment here, and begin script below

 

var cdt = newValue; //The date field

  var dttype = 'day'; //this can be day, hour, minute, second. By default it will return seconds.

g_form.hideFieldMsg('due_date');

 

var day = new GlideAjax('ClientDateTimeUtils');

  day.addParam('sysparm_name','getDateDifferenceExcWeekends');

  day.addParam('sysparm_fdt', cdt);

  day.addParam('sysparm_difftype', dttype);

  day.getXML(checkDay);

 

  function checkDay(response){

  var answer = response.responseXML.documentElement.getAttribute("answer");

// alert(answer);

  if(answer == 'Sunday' || answer == 'Saturday'){

g_form.showFieldMsg('due_date', "Date should not be on Weekends " , 'error');

// alert("Date should not be in Weekend");

  g_form.clearValue('due_date'); // Pass the variable name here

  g_form.setMandatory('due_date');

  }

else

{

var ajax = new GlideAjax('ClientDateTimeUtils');

  ajax.addParam('sysparm_name','getNowDateTimeDiff');

  ajax.addParam('sysparm_fdt', cdt);

  ajax.addParam('sysparm_difftype', dttype);

 ajax.getXML(doSomething);

 

  function doSomething(response){

  var answer = response.responseXML.documentElement.getAttribute("answer");

  //alert(answer);

  if(answer<0 || answer<5){

  g_form.showFieldMsg('due_date', "Date should be more than 5 working days from today " , 'error');

  //alert('Change value');

// alert("Date should be more than 5 working days from today.");

  g_form.clearValue('due_date'); // Pass the variable name here

  g_form.setMandatory('due_date');

  }

  }

}

  }

 

 

Script Include: 

 

var ClientDateTimeUtils = Class.create();

ClientDateTimeUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {

 

  //Takes a Single Date/Time Field and returns its time difference from nowDateTime().

 

  //params = sysparm_fdt (the first date/time field), sysparm_difftype (time based format to return result. See "_calcDateDiff" function comments)

 

  getNowDateTimeDiff: function(){

 

  var firstDT = this.getParameter('sysparm_fdt'); //First Date-Time Field

 

  var diffTYPE = this.getParameter('sysparm_difftype'); // Date-Time Type to return the answer as. Can be second, minute, hour, day

 

  var diff = gs.dateDiff(gs.nowDateTime(), firstDT, true);

 

  var timediff = this._calcDateDiff(diffTYPE, diff);

 

  //return "getNowDateTimeDiff: FIRST DT: " + firstDT + " -DIFFTYPE: " + diffTYPE + " -TIME DIFF: " + timediff;

 

  return timediff;

 

  },

 

 

 

  //Private function to calculate the date difference return result in second, minute, hour, day.

 

  _calcDateDiff: function(diffTYPE, seconds){

 

  var thisdiff;

 

  if (diffTYPE == "day"){thisdiff = seconds/86400;}

 

  else if (diffTYPE == "hour"){thisdiff = seconds/3600;}

 

  else if (diffTYPE == "minute"){thisdiff = seconds/60;}

 

  else if (diffTYPE == "second"){thisdiff = seconds;}

 

  else {thisdiff = seconds;}

 

  return thisdiff;

 

  },

 

 

 

getDateDifferenceExcWeekends: function(){

 

  //Make Sure that start and end are GlideDateTime Objects

 

  var firstDT = this.getParameter('sysparm_fdt');

 

  var gdt = new GlideDateTime(firstDT);

 

  var days = gdt.getDayOfWeekLocalTime();

 

  //var days = firstDT.getGlideObject().getDayOfWeek();

 

  gs.log('Days is: '+days);

 

  var day;

 

  if (days == 1) {

 

  day = 'Monday';

 

  } else if (days == 2) {

 

  day = 'Tuesday';

 

  } else if (days == 3) {

 

  day = 'Wednesday';

 

  } else if (days == 4) {

 

  day = 'Thursday';

 

  } else if (days == 5) {

 

  day = 'Friday';

 

  } else if (days == 6) {

 

  day = 'Saturday';

 

  } else {

 

  day = "Sunday";

 

  }

  return day;

  }

 

  });

 

Mark Correct and 👍 Helpful based on the impact.

Warm Regards,

Arvind