Name

global.PlannedTask

Description

No description available

Script

var PlannedTask = Class.create();
PlannedTask.prototype = {
  initialize: function(gr) {
      PPMDebug.log('PT Constructor ' + gr.getValue('sys_id'));
      this.gr = gr;
  },

  isShadowTask: function() {
      return JSUtil.notNil(this.gr.getValue('orig_sys_id'));
  },

  getValue: function(col) {
      PPMDebug.log('getValue of ' + col);
      return this.gr.getValue(col);
  },

  deleteRecord: function(workflow) {
      this.gr.setWorkflow(workflow);
      this.gr.deleteRecord();
  },

  hasMoreThanOneIncomingRelation: function() {
      var gr = new GlideRecord('planned_task_rel_planned_task');
      gr.addQuery('child', this.gr.getValue('sys_id'));
      gr.query();
      return gr.getRowCount() > 1;
  },

  hasMoreThanOneOutgoingRelation: function() {
      var gr = new GlideRecord('planned_task_rel_planned_task');
      gr.addQuery('parent', this.gr.getValue('sys_id'));
      gr.query();
      return gr.getRowCount() > 1;
  },

  maxWbsOrder: function(parentGr) {
      var ga = new GlideAggregate('planned_task');
      ga.addAggregate("MAX", 'wbs_order');
      ga.addQuery('parent', parentGr.getValue("sys_id"));
      ga.setGroup(false);
      ga.query();
      if (ga.next())
          return ga.getAggregate("MAX", 'wbs_order');
      return '0';
  },

  createTasks: function(taskId, tableName, quantity, createRelationship, plannedStartDate) {
      PPMDebug.log("Into PlannedTask.createTasks -> " + taskId + " | " + tableName + " | " +
          quantity + " | " + createRelationship + " | " + plannedStartDate);
      var tasks = [];
      var startDate = null;
      var parentTask = new GlideRecord('planned_task');
      parentTask.get(taskId);
      this.updateParentTaskToASAPIfItsSNLTOrStartOn(parentTask);
      parentTask.get(taskId);
      var maxWbsOrderUnderParent = this.maxWbsOrder(parentTask);
      PPMDebug.log("Into PlannedTask.createTasks - maxWbsOrderUnderParent -> " + maxWbsOrderUnderParent);
      var maxWbsOrder = JSUtil.notNil(maxWbsOrderUnderParent) ? parseInt(maxWbsOrderUnderParent) : 0;
      var parentWbs = parentTask.getValue("wbs");
      var domainId = parentTask.getValue("sys_domain");
      var parentTaskStartDate = new GlideDateTime(parentTask.getValue("start_date"));
      var isStartOn = false;
      var projCurrency;
      if (parentTask.instanceOf('pm_project') || parentTask.instanceOf('pm_project_task')) {
          var projectGr = new GlideRecord(tableName);
          projectGr.get(taskId);
          projCurrency = projectGr.getValue('project_currency');
      }

      PPMDebug.log("Into PlannedTask.createTasks - parentTaskStartDate -> " + parentTaskStartDate +
          " | plannedStartDate -> " + plannedStartDate);
      if (plannedStartDate) {
          startDate = new GlideDateTime();
          startDate.setDisplayValueInternal(plannedStartDate);
          if (!startDate.isValid()) {
              startDate = parentTask.start_date.getGlideObject();
          }
      } else {
          startDate = parentTask.start_date.getGlideObject();
      }
      // If the Parent Task is Pending/Open - Allow startOn
      var plannedTaskStateUtil = new PlannedTaskStateUtil(parentTask);
      var stateBucket = plannedTaskStateUtil.getBucketForState(parentTask.state);
      if (stateBucket == PlannedTaskStateUtil.PENDING_STATES ||
          stateBucket == PlannedTaskStateUtil.OPEN_STATES) {
          isStartOn = parentTaskStartDate.compareTo(startDate) != 0;
          if (parentTask.top_task.calculation_type == "manual")
              isStartOn = true;
      } else if (parentTask.top_task.calculation_type == "manual") {
          isStartOn = true;
      }

      var projectTaskTable = SNC.PPMConfig.getProjectTaskTable(tableName);
  	var isDSPluginActive = typeof global.DataSeparatorGlobalUtil !== "undefined" && global.DataSeparatorGlobalUtil.isDataSeparatorPluginActive();
      // Else default reset the dates - parent start date
      PPMDebug.log("Into PlannedTask.createTasks - isStartOn -> " + isStartOn);
      for (var i = 0; i < quantity; i++) {
          var newTask = new GlideRecord(projectTaskTable);
          var wbsOrder = String(maxWbsOrder + i + 1);
          newTask.short_description = 'Auto created task ' + (i + 1);
          if (createRelationship) {
              if (isStartOn) {
                  if (parentTask.top_task.calculation_type == "manual" || i == 0) {
                      newTask.time_constraint = "start_on";
                  } else
                      newTask.time_constraint = "asap";
              } else
                  newTask.time_constraint = "asap";
          } else {
              if (isStartOn) {
                  newTask.time_constraint = "start_on";
              } else
                  newTask.time_constraint = "asap";
          }

          if (newTask.time_constraint != "asap")
              newTask.constraint_date = startDate;
          if (JSUtil.notNil(projCurrency))
              newTask.project_currency = projCurrency;
          newTask.start_date = startDate;
          newTask.end_date.getGlideObject().setNumericValue(startDate.getNumericValue() + 86400000);
          newTask.duration.setDateNumericValue(86400000);
          newTask.schedule_start_date = newTask.start_date;
          newTask.schedule_end_date = newTask.end_date;
          newTask.parent = parentTask.sys_id;
          newTask.state = -5;
          newTask.sys_domain = domainId;
          newTask.wbs_order = wbsOrder;
          newTask.wbs = JSUtil.notNil(parentWbs) ? parentWbs + "." + wbsOrder : wbsOrder;
          PPMDebug.log(newTask.short_description + " -> " + newTask.wbs + " | " + newTask.wbs_order + " | " + newTask.time_constraint + " | " +
              newTask.start_date + " | " + newTask.end_date + " | " + newTask.duration);
          this.updateAttribute(parentTask, newTask, ['top_task', 'top_program', 'top_portfolio', 'sub_tree_root']);
          if(isDSPluginActive && projectGr.data_separation_groups)
  			newTask.data_separation_groups = projectGr.data_separation_groups;
  		newTask.setWorkflow(false);
          tasks[i] = newTask.insert();
      }

      if (tasks.length > 1 && createRelationship) {
          for (var i = 0; i < tasks.length - 1; i++) {
              var relationRecord = new GlideRecord(PmTableConstants.PLANNED_TASK_REL);
              relationRecord.parent = tasks[i];
              relationRecord.child = tasks[i + 1];
              relationRecord.type = "33a57d3d0a0a0b7b00819e4d4402fb14"; // Predecessor Of :: Successor Of
              relationRecord.sub_type = "fs";
              relationRecord.sys_domain = domainId;
              relationRecord.parent_top_task = parentTask.getValue("top_task");
              relationRecord.child_top_task = parentTask.getValue("top_task");
              relationRecord.setWorkflow(false);
              relationRecord.insert();
          }
      }

      if (parentTask.getValue("rollup") != '1') {
          parentTask.setValue("rollup", 1);
          parentTask.setWorkflow(false);
          parentTask.update();
      }

      if (tasks[0]) {
          this.updateParentState(projectTaskTable, tasks[0]);
          this.rollupPercentComplete(projectTaskTable, tasks[0]);
      }

      var api = new SNC.PlannedTaskAPI();
      api.recalculateWithDirtyTasks(parentTask.getValue("top_task"), tasks.join(','));

      return taskId;
  },

  updateParentTaskToASAPIfItsSNLTOrStartOn: function(parentTask) {
      PPMDebug.log('into updateParentTaskToASAPIfItsSNLTOrStartOn');
      var timeConstraint = parentTask.getValue('time_constraint');
      var isSNLT = JSUtil.notNil(timeConstraint) && timeConstraint === 'snlt';
      var canChangeStartOnParent = this._canChangeStartOnParentToASAP(parentTask);
      if (isSNLT || canChangeStartOnParent) {
          var refreshedTask = new GlideRecord('planned_task');
          refreshedTask.get(parentTask.getValue('sys_id'));
          refreshedTask.setValue('time_constraint', 'asap');
          refreshedTask.update();
      }
  },

  _canChangeStartOnParentToASAP: function(parentTask) {
      PPMDebug.log('into _canChangeStartOnParentToASAP, evaluating ' + parentTask.getUniqueValue());
      var timeConstraint = parentTask.getValue('time_constraint');
      var isStartOn = JSUtil.notNil(timeConstraint) && timeConstraint === 'start_on';
      var hasChildren = parentTask.getValue('roll_up') === 'false';
      var parentCannotBeStartOnBehavior = PlannedTaskUtilsV2.getParentStartOnBehavior(parentTask);
      var isAutomaticProject = parentTask.top_task.calculation_type == "automatic";
      return isStartOn && parentCannotBeStartOnBehavior && !hasChildren && isAutomaticProject;
  },

  updateAttribute: function(parentTask, newTask, columns) {
      for (var i = 0; i < columns.length; i++) {
          if (JSUtil.notNil(parentTask.getValue(columns[i]))) {
              newTask.setValue(columns[i], parentTask.getValue(columns[i]));
          }
      }
  },

  updateParentState: function(table, taskId) {
      PPMDebug.log("Into PlannedTask.updateParentState -> " + table + " | " + taskId);
      // load the first task and set the parent state accordingly
      var task = new GlideRecord(table);
      if (task.get(taskId)) {
          // PlannedTaskUtilsV2.setParentState(task, false); // not updating the immediate parent

          PlannedTask.setOrigSysId(taskId);

          var parent = new GlideRecord("planned_task");
          if (!parent.get(task.parent))
              return;

          var siblings = function() {
              var gr = new GlideRecord('planned_task');
              gr.addQuery('parent', task.parent);
              gr.addNullQuery('orig_sys_id');
              gr.addQuery('sys_id', '!=', task.sys_id);
              gr.query();
              return gr;
          };

          var stateUtil = new PlannedTaskStateManagement(task, parent, siblings);
          var state = stateUtil.manageStateChange(false);
          PPMDebug.log("Into PlannedTask.updateParentState: Parent State -> " + state);
          if (state != parent.getValue('state')) {
              parent.setValue('state', state);
              parent.update();
          }

          PlannedTask.resetOrigSysId(taskId);
      }
  },

  rollupPercentComplete: function(projectTaskTable, taskId) {
      PPMDebug.log("Into PlannedTask.rollupPercentComplete -> " + projectTaskTable + " | " + taskId);

      // load the first task and rollup percent complete
      var task = new GlideRecord(projectTaskTable);
      if (!task.get(taskId))
          return;

      var parent = new GlideRecord("planned_task");
      if (!parent.get(task.parent))
          return;

      var rollupAPI = new RollupAPI();
      rollupAPI.rollup(task, 'percent_complete', true);
  },

  type: 'PlannedTask'
};

// Check origSysId in global context 
PlannedTask.setOrigSysId = function(taskId) {
  // Set the origSysId to current stop trigger parent changes
  if (typeof origSysId == 'undefined' || origSysId == null) {
      if (JSUtil.notNil(taskId))
          origSysId = taskId;
  }
}

PlannedTask.resetOrigSysId = function(taskId) {
  // Reset the origSysId to current stop trigger parent changes
  if (typeof origSysId !== 'undefined' && origSysId !== null) {
      if (origSysId == taskId)
          origSysId = null;
  }
}

Sys ID

acfea0e30bc32200acc30e7363673a08

Offical Documentation

Official Docs: