Name

global.PlannedTaskDatesCalculator

Description

This Dates calculator are used to planned task in the Exclusion list

Script

var PlannedTaskDatesCalculator = Class.create();
PlannedTaskDatesCalculator.prototype = {
  initialize: function() {
  },

  process: function (_current) {
      PPMDebug.log("Into PlannedTaskDatesCalculator.process -> " + _current.getValue("sys_id"));
      if(JSUtil.notNil(_current)) {
          this.calculatePlanned(_current);
          this.calculateActuals(_current);
      }
  },

  calculatePlanned: function (_current) {
      PPMDebug.log("Into PlannedTaskDatesCalculator.calculatePlanned -> " + _current.getValue("sys_id"));
      var startDateChanges = _current.start_date.changes();
      var endDateChanges = _current.end_date.changes();
      var durationChanges = _current.duration.changes();
      PPMDebug.log("startDateChanges -> " + startDateChanges + " | endDateChanges -> " + endDateChanges 
          + " | durationChanges -> " + durationChanges);
      // For the initial task creates, if there are duration changes, Take duration precedence over end_date
      var defaultDurationValue = this.getGlideDuration(_current.getElement('duration').getED().getDefault(), true);
      var currentDurationValue = this.getGlideDuration(_current.getValue('duration'));
      PPMDebug.log("defaultDurationValue -> " + defaultDurationValue + " | currentDurationValue -> " + defaultDurationValue);
      // Ignore if javascript - incase?
      if(_current.operation() == 'insert' && currentDurationValue.compareTo(defaultDurationValue) == 0) {
          var duration = this.calculateDuration(_current.getValue("start_date"), _current.getValue("end_date"));
          _current.setValue("duration", duration);
      } else if(startDateChanges && endDateChanges && durationChanges) {
          var endDate = this.calculateEndDate(_current.getValue("start_date"), _current.getValue("duration"));
          _current.setValue("end_date", endDate);
      } else if((startDateChanges && endDateChanges) || endDateChanges) {
          var duration = this.calculateDuration(_current.getValue("start_date"), _current.getValue("end_date"));
          _current.setValue("duration", duration);
      } else if (durationChanges || startDateChanges) {
          var endDate = this.calculateEndDate(_current.getValue("start_date"), _current.getValue("duration"));
          _current.setValue("end_date", endDate);
      }
  },

  calculateActuals: function (_current) {
      PPMDebug.log("Into PlannedTaskDatesCalculator.calculateActuals -> " + _current.getValue("sys_id"));
      var workStartChanges = _current.work_start.changes();
      var workEndChanges = _current.work_end.changes();
      var workDurationChanges = _current.work_duration.changes();
      PPMDebug.log("workStartChanges -> " + workStartChanges + " | workEndChanges -> " + workEndChanges 
          + " | workDurationChanges -> " + workDurationChanges);
      if((workStartChanges && workEndChanges) || workEndChanges) {
          var duration = this.calculateDuration(_current.getValue("work_start"), _current.getValue("work_end"));
          _current.setValue("work_duration", duration);
      } else if (workDurationChanges || workStartChanges) {
          var endDate = this.calculateEndDate(_current.getValue("work_start"), _current.getValue("work_duration"));
          _current.setValue("work_end", endDate);
      }
  },

  calculateDuration: function (startDate, endDate) {
      PPMDebug.log("Into PlannedTaskDatesCalculator.calculateDuration -> " + startDate + " | " + endDate);
      if(JSUtil.notNil(startDate) && JSUtil.notNil(endDate)) {
          var startDateTime = new GlideDateTime(startDate);
          var endDateTime = new GlideDateTime(endDate);
          var duration = GlideDateTime.subtract(startDateTime, endDateTime);
          PPMDebug.log("Duration -> " + duration);
           return duration.getValue();
      }
  },

  calculateEndDate: function (startDate, duration) {
      PPMDebug.log("Into PlannedTaskDatesCalculator.calculateEndDate -> " + startDate + " | " + duration);
      if(JSUtil.notNil(startDate)) {
          var endDateTime = new GlideDateTime(startDate);
          var glideDuration = new GlideDuration(0);
          if(JSUtil.notNil(duration))
              glideDuration.setValue(duration);
          endDateTime.add(glideDuration.getNumericValue());
          PPMDebug.log("endDateTime -> " + endDateTime);
          return endDateTime.getValue();
      }
  },

  getGlideDuration: function (value, display) {
      PPMDebug.log("Into PlannedTaskDatesCalculator.getGlideDuration -> " + value);
      var glideDuration = new GlideDuration(0);
      if(JSUtil.notNil(value)) {
          if(display) {
              glideDuration.setDisplayValue(value);
          } else {
              glideDuration.setValue(value);
          }
      }
      PPMDebug.log("Into PlannedTaskDatesCalculator.getGlideDuration - Return -> " + glideDuration);
      return glideDuration;
  },

  type: 'PlannedTaskDatesCalculator'
};

Sys ID

a7e739e59f221300730e5bb0657fcf8a

Offical Documentation

Official Docs: