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  ||  9x 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