Name

global.ProjectRecalculateAJAX

Description

Ajax Helper for Project Recalculate

Script

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

  json: function () {
      return (new JSON());
  },

  recalculate: function () {
      var topTaskId = this.getParameter("sysparm_sys_id");
      gs.eventQueue('pm_project.recalculate', "pm_project", topTaskId, topTaskId);
      gs.info("recalculate topTaskId -> " + topTaskId);
      var eventId = this.getEventId('pm_project.recalculate', "pm_project", topTaskId);
      gs.info("eventId -> " + eventId);
      return this.respond(eventId);
  },
  
  checkCycles: function() {
      var topTaskId = this.getParameter('sysparm_sys_id');
      var cycleDetector = new CycleDetector();
      cycleDetector.processProject(topTaskId);
      var result = {};
      if ( cycleDetector.isCyclic() ) {
          var tasks = cycleDetector.getCyclicTasks();
          result = { status: true, tasks: tasks };
      }
      else {                      
          result = { status: false };         
      }
      return this.json().encode(result);
  },
  
  validateParents: function() {
      var topTaskId = this.getParameter('sysparm_sys_id');
      var projectData = new ProjectData(topTaskId);
      var parentValidator = new ProjectParentValidator(projectData);
      var tasksWithEmptyParents = [];
      var tasksWithInvalidParents = [];
      var status = '';
      if ( parentValidator.hasEmptyParents() ) {
          status += '_empty_parents';
          tasksWithEmptyParents = parentValidator.getInvalidTasksWithEmptyParents();
      }
      if ( parentValidator.hasInvalidParents() ) {
          status += '_invalid_parents';
          tasksWithInvalidParents = parentValidator.getTasksWithInvalidParents();         
      }
      if ( status == '' )
          status = 'valid';
      var result = {
          status: status,
          tasksWithEmptyParents: tasksWithEmptyParents,
          tasksWithInvalidParents: tasksWithInvalidParents
      };
      return this.json().encode(result);
  },

  getEventId: function (name, table, topTaskId) {
      var gr = this.getEvent(name, table, topTaskId);
      if(JSUtil.notNil(gr)) 
          return gr.getValue("sys_id");
  },

  getEvent: function (name, table, topTaskId) {
       var gr = new GlideRecord("sysevent");
       gr.addQuery("name", name);
       gr.addQuery("table", table);
       gr.addQuery("param1", topTaskId);
       gr.orderByDesc("sys_created_on");
       gr.query();
       if(gr.next())
          return gr;
  },

  respond: function (eventId) {
      var result = {status: false,
                  message: "Unable to recalculate"
              };
      if(JSUtil.notNil(eventId)) {
          result = { status: true,
                  event_id: eventId,
                  message: "Recalculation has been triggered"
              };
      } 
      gs.info(this.json().encode(result));
      return this.json().encode(result);
  },

  checkIfSessionComplete: function () {
      var topTaskSysId = this.getParameter("sysparm_sys_id");
      var eventId = this.getParameter("sysparm_event_id");
      gs.info("checkIfSessionComplete eventId -> " + eventId);
      var gr = new GlideRecord("sysevent");
      if(gr.get(eventId)) {
          if(gr.getValue("state") == 'processed') {
              gs.info("checkIfSessionComplete -> Event Processed!");
              return true;
          }
      }
      gs.info("checkIfSessionComplete -> Event NOT Processed!");
      return false;
  },


  loadLatestTasks: function () {
      var topTaskSysId = this.getParameter("sysparm_sys_id");
      gs.info("latestTasks topTaskSysId -> " + topTaskSysId);
      var tasks = [];
      var topTask = new GlideRecord("planned_task");
      if(topTask.get(topTaskSysId)) {
          var startDate = topTask.getValue("start_date");
          var gr = new GlideRecord("planned_task");
          gr.addQuery("top_task", topTaskSysId);
          gr.addQuery("start_date", startDate);
          gr.query();
          gs.info("Tasks query -> " + gr.getRowCount() + " - " + gr.getEncodedQuery() );
          while(gr.next()) {
              tasks.push({
                    sys_id: gr.getValue("sys_id"),
                    number: gr.getValue("number"),
                    short_description: gr.getValue("short_description"),
                    start_date: gr.getDisplayValue("start_date"),
                    end_date: gr.getDisplayValue("end_date"),
                    work_start: gr.getDisplayValue("work_start"),
                    work_end: gr.getDisplayValue("work_end"),
            });
          }
      }
      var result = { status: true,
                  tasks: tasks
              };
      gs.info("Tasks ->" + this.json().encode(result));
      return this.json().encode(result);
  },

  checkRedunantRelations: function() {
      var topTaskId = this.getParameter('sysparm_sys_id');
      var redundantRelationChecker = new RedundantRelationsChecker();
      var redudantRelations = redundantRelationChecker.checkRelations(topTaskId);
      var result = {};
      if ( JSUtil.notNil(redudantRelations) && redudantRelations.length > 0) {
          result = { status: true, relations: redudantRelations };
      }
      else {                      
          result = { status: false };         
      }
      return this.json().encode(result);
  },

  type: 'ProjectRecalculateAJAX'
});

Sys ID

ce37d6939f75220088265bb0657fcff1

Offical Documentation

Official Docs: