Name

global.AjaxPlannedTaskDateUtil

Description

No description available

Script

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

  getEndDate: function() {
      var sysparmStartDate = this.getParameter('sysparm_start_date');
      var sysparmDuration = this.getParameter('sysparm_duration');

      if (!this.isValidDate(sysparmStartDate)) {
          this.sendResponse('error', 'start_date');
          return;
      }

      if (!this.isValidDuration(sysparmDuration)) {
          this.sendResponse('error', 'duration');
          return;
      }

      var end_date = this._calculateEndDate(sysparmStartDate, sysparmDuration);

      var result = this.newItem('result');
      result.setAttribute('status', 'success');
  	result.setAttribute('answer', end_date);
  },

  isValidPositiveDuration: function(duration) {
      return duration.indexOf('-') < 0;
  },
  
  recalculate: function(current) {
  	if (!current.isNewRecord() && current.end_date.changes())
  		this._setMaxEndDate(current);
  	else
  		this.updateEndDate(current);
  	
  	var duration = new GlideDuration(current.end_date.dateNumericValue() - current.start_date.dateNumericValue());
  	current.setValue('duration', duration.getValue());
  },
  
  updateEndDate: function(current) {
  	var startDate = current.getValue('start_date');
  	var endDate = new GlideDateTime();
  	endDate.setValue(startDate);
  	endDate.addSeconds(current.duration.dateNumericValue() / 1000);
  	current.setValue('end_date', endDate.getValue());
  	this._setMaxEndDate(current);
  },
  
  _setMaxEndDate: function(current) {
  	var maxEndDateFromChildren = this._getMaxEndDateFromChildren(current.getValue('sys_id'));
  	if (maxEndDateFromChildren) {
  		var dateTime = new GlideDateTime();
  		dateTime.setValue(maxEndDateFromChildren);
  		if (dateTime.getNumericValue() > current.end_date.dateNumericValue())
  			current.setValue('end_date', dateTime.getValue());
  	}
  },
  
  _getMaxEndDateFromChildren: function(sysId) {
  	var gr = new GlideRecord('planned_task');
  	gr.addQuery('parent', sysId);
  	gr.setLimit(1);
  	gr.orderByDesc('end_date');
  	gr.query();
  	
  	if (gr.next())
  		return gr.getValue('end_date');
  	
  	return null;
  },

  _calculateEndDate: function(startDate, duration) {
      var dur;
      var end_date;

      startDate = this.getInternalDateFormat(startDate);

      if (!this.isValidPositiveDuration(duration)) {
          return startDate;
      }

      dur = new GlideDuration(0);
      dur.setDisplayValue(duration);
      end_date = new GlideDateTime();
      end_date.setDisplayValueInternal(startDate);
      end_date.addSeconds(dur.getNumericValue() / 1000);

      return end_date.getDisplayValue();
  },

  _calculateDuration: function(startDate, endDate) {
      var startDateInternal = this.getInternalDateFormat(startDate);
      var endDateInternal = this.getInternalDateFormat(endDate);
      var start = new GlideDateTime();
  	start.setDisplayValueInternal(startDateInternal);
      var end = new GlideDateTime();
  	end.setDisplayValueInternal(endDateInternal);
      var duration = GlideDateTime.subtract(start, end);
      return duration.getDurationValue();
  },

  getDuration: function() {
      var result;
      var resp = {};
      var sysparmStartDate = this.getParameter('sysparm_start_date');
      var sysparmEndDate = this.getParameter('sysparm_end_date');

      if (!this.isValidDate(sysparmStartDate)) {
          this.sendResponse('error', 'start_date');
          return;
      }

      if (!this.isValidDate(sysparmEndDate)) {
          this.sendResponse('error', 'end_date');
          return;
      }

      var duration = this._calculateDuration(sysparmStartDate, sysparmEndDate);

      result = this.newItem('result');
      result.setAttribute('status', 'success');
      result.setAttribute('answer', duration);
  },

  getInternalDateFormat: function(displayValue) {
      var dateTime = new GlideDateTime();
      dateTime.setDisplayValue(displayValue);
      if (dateTime.isValid())
          return dateTime.getDisplayValueInternal();
      else {
          var dt = new GlideDateTime();
          return dt.getDisplayValueInternal();
      }
  },

  isValidDate: function(displayValue) {
      var dateTime = new GlideDateTime();
      dateTime.setDisplayValue(displayValue);
      return dateTime.isValid();
  },

  isValidDuration: function(displayValue) {
      var duration = new GlideDuration();
      duration.setDisplayValue(displayValue);
      return duration.isValid();
  },

  sendResponse: function(status, column, answer, message) {
      var result = this.newItem("result");
      result.setAttribute("column", column);
      result.setAttribute("status", status);
      if (answer)
          result.setAttribute("answer", answer);
      if (message)
          result.setAttribute("message", message);
  },

  type: 'AjaxPlannedTaskDateUtil'
});

Sys ID

17f3f86787030300b9392c7c87cb0bb9

Offical Documentation

Official Docs: