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

Ankur - any ideas on this?

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);

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

var schedule = new GlideSchedule('2218ff1bdba8eb40fb6e753a8c96198d');

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'

});

 

Perhaps the calculation of time is off because we use a 12 hour schedule per day vs an 8 or 9 hour?

I marked your answer as helpful. Thank you, the code worked perfectly.

Arvind Singh Ra
Kilo Guru

Hi Booher04,

I have figured out a code on Onchange client script. which is calling a function from a Script Include using GlideAjax

 

Client Scipt: 

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('request_completion_date'); // Pass the variable name here

  g_form.setMandatory('request_completion_date');

  }

  }

 

 

 

Script Include -Client Callable

 

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

Arvind Singh Ra
Kilo Guru

Hi Booher04,

 

Why don't you give a shot to code I posted.

 

Mark Correct and 👍 Helpful based on the impact.

Warm Regards,

Arvind

It gives me an error when I try to save the Script Include.  

Could not save record because of a compile error: JavaScript parse error at line (49) column (1) problem = missing ) after argument list (<refname>; line 49)