Name

global.ProjectParentValidator

Description

Project Parent Validator for Project Diagnosis

Script

var ProjectParentValidator = Class.create();
ProjectParentValidator.prototype = {
  initialize: function(projectData) {
      this.projectData = projectData;
  	var plannedTaskRecalculationExclusion = new PlannedTaskRecalculationExclusion();
      this.excludedTables = plannedTaskRecalculationExclusion.getExclusions();
      this.invalidTasksWithEmptyParents = [];
      this.tasksWithInvalidParents = [];
      this.validateEmptyParents();
      this.validateInvalidParents();
  },
  
  validateEmptyParents: function() {
      var tasks = this.projectData.getTasks();
      var taskSysIdes = tasks['sys_ids'];
      var topTaskId = this.projectData.getTopTaskId();
      var gr = new GlideRecord("planned_task");
      gr.addQuery("top_task", topTaskId);
      gr.addQuery("sys_id", "!=",  topTaskId);
      if(JSUtil.notNil(this.excludedTables))
          gr.addQuery("sys_class_name", "NOT IN", this.excludedTables);
      gr.addEncodedQuery("^parentISEMPTY");
      gr.query();
      PPMDebug.log("validateEmptyParents Tasks -> " + gr.getRowCount() + " -> " + gr.getEncodedQuery());
      while(gr.next()) {
          this.invalidTasksWithEmptyParents.push({
              sys_id: gr.getValue("sys_id"),
              number: gr.getValue("number"),
              short_description: gr.getValue("short_description"),
              parent: gr.getValue("parent"),
              top_task: gr.getValue("top_task")
          });
      }
  },
  
  validateInvalidParents: function() {
      var topTaskId = this.projectData.getTopTaskId();
      var gr = new GlideRecord("planned_task");
      gr.addQuery("top_task", topTaskId);
      gr.addQuery("sys_id", "!=",  topTaskId);
      gr.addNotNullQuery('parent');
  	if(JSUtil.notNil(this.excludedTables))
  		gr.addQuery("sys_class_name", "NOT IN", this.excludedTables);
      gr.query();
      PPMDebug.log("validateInvalidParents Tasks -> " + gr.getRowCount() + " -> " + gr.getEncodedQuery());
      var allTasksByTopTask = {};
      var allParents = {};
      while ( gr.next() ) {
          allTasksByTopTask[gr.getValue('sys_id')] = '1';
          allParents[gr.getValue('parent')] = '1';
      }
      for ( var parent in allParents ) {
          if ( JSUtil.nil(allTasksByTopTask[parent]) && parent != topTaskId ) {
              gr = new GlideRecord('planned_task');
              gr.addQuery('top_task', topTaskId);
              gr.addQuery('parent', parent);
              gr.query();
              while ( gr.next() ) {
                  var obj = {
                      sys_id: gr.getValue("sys_id"),
                      number: gr.getValue("number"),
                      short_description: gr.getValue("short_description"),
                      parent: gr.getDisplayValue("parent")
                  };
                  if ( JSUtil.nil(gr.getDisplayValue('parent')) )
                      obj.parent = gr.getValue('parent');
                  else
                      obj.parent = gr.getDisplayValue('parent');
                  this.tasksWithInvalidParents.push(obj);
              }
          }
      }
  },
  
  getInvalidTasksWithEmptyParents: function() {
      return this.invalidTasksWithEmptyParents;
  },
  
  getTasksWithInvalidParents: function() {
      return this.tasksWithInvalidParents;
  },
  
  
  hasEmptyParents: function() {
      if ( this.invalidTasksWithEmptyParents.length == 0 )
          return false;
      else
          return true;
  },
  
  hasInvalidParents: function() {
      if ( this.tasksWithInvalidParents.length == 0 )
          return false;
      else
          return true;
  },
  
  type: 'ProjectParentValidator'
};

Sys ID

769f81cf9f31220088265bb0657fcf80

Offical Documentation

Official Docs: