Name

global.ProgramRecalculationConstraints

Description

No description available

Script

var ProgramRecalculationConstraints = Class.create();
ProgramRecalculationConstraints.prototype = Object.extendsObject(BaseRecalculationConstraints, {

  projects: function(programRecord) {
      if(!gs.tableExists("pm_project"))
          return null;
      var gr = new GlideRecord('pm_project');
      gr.addQuery('top_program', programRecord.getValue('sys_id'));
      gr.query();
  	return gr;
  },

  demands: function(programRecord) {
      if(!gs.tableExists("dmn_demand"))
          return null;
      var gr = new GlideRecord('dmn_demand');
      gr.addQuery('primary_program', programRecord.getValue('sys_id'));
      gr.query();
  	return gr;
  },
  
  programTasks: function(programRecord, current) {
      if(!gs.tableExists("pm_program_task"))
          return null;
      var gr = new GlideRecord('pm_program_task');
      gr.addQuery('parent', programRecord.getValue('sys_id'));
  	if (current)
  		gr.addQuery('sys_id','!=',current.sys_id);
      gr.query();
  	return gr;		
  },

  hasProjectsDemands: function(programRecord) {
      var projectsGr = this.projects(programRecord);
      if( projectsGr !== null && projectsGr.getRowCount() > 0) return true;
      var demandsGr = this.demands(programRecord);
      return demandsGr !== null && demandsGr.getRowCount() > 0;
  },
  
  hasProgramTasks:function(programRecord) {
      var programTasksGr = this.programTasks(programRecord);
      return programTasksGr !== null && programTasksGr.getRowCount() > 0;	
  },	

  leastStartDate: function(gr, column, leastStartDate) {
      var leastStart = leastStartDate;
  	if (gr === null)
  		return leastStart;
      while(gr.next()) {
          var startDate = gr.getValue(column);
          if(JSUtil.notNil(startDate)) {
              var gdt = new GlideDateTime(startDate);
              if(gdt.compareTo(leastStartDate) < 0) {
                  leastStart = gdt;
              }
          }
      }
      return leastStart;
  },
  
  maxDate: function(gr, column, baseDate) {
  	var maxDate = baseDate;
  	if (gr === null)
  		return maxDate;
  	while ( gr.next() ) {
  		var date = gr.getValue(column);
  		if(JSUtil.notNil(date)) {
              var gdt = new GlideDateTime(date);
              if(gdt.compareTo(maxDate) > 0)
                  maxDate = gdt;
          }
  	}
  	return maxDate;
  }, 

  getLeastStartDate: function(programRecord) {
      var leastStartDate = new GlideDateTime(programRecord.getValue('start_date'));
      var projectsGr = this.projects(programRecord);
      leastStartDate = this.leastStartDate(projectsGr, 'start_date', leastStartDate);
      var demandsGr = this.demands(programRecord);
      leastStartDate = this.leastStartDate(demandsGr, 'start_date', leastStartDate);
      var programTasksGr = this.programTasks(programRecord);
      leastStartDate = this.leastStartDate(programTasksGr, 'start_date', leastStartDate);		
      return leastStartDate;
  },
  
  getLeastEndDate: function(programRecord, current) {
  	var leastEndDate = new GlideDateTime(programRecord.getValue('end_date'));
      var projectsGr = this.projects(programRecord);
      leastEndDate = this.maxDate(projectsGr, 'end_date', leastEndDate);
      var demandsGr = this.demands(programRecord);
      leastEndDate = this.maxDate(demandsGr, 'requested_by', leastEndDate);
      var programTasksGr = this.programTasks(programRecord, current);
      leastEndDate = this.maxDate(programTasksGr, 'end_date', leastEndDate);		
      return leastEndDate;
  },

  getConstraints: function(programRecord, current) {
      //gs.info('Into ProgramRecalculationConstraints '+this.hasProjectsDemands(programRecord));
      var recalculationConstraint = new SNC.RecalculationConstraint();
      if(this.hasProjectsDemands(programRecord) || this.hasProgramTasks(programRecord)) {
          var leastStartDate = this.getLeastStartDate(programRecord);
          recalculationConstraint.addNodeMaxStartDateConstraint(programRecord.getValue('sys_id'), leastStartDate.getValue(), 'soft');
          //gs.info('Program has projects and demands, Attaching the Least Start Date to the constraint: ' + leastStartDate);
  		
  		var leastEndDate = this.getLeastEndDate(programRecord, current);
          recalculationConstraint.addNodeLeastEndDateConstraint(programRecord.getValue('sys_id'), leastEndDate.getValue(), 'soft');
      }
      return recalculationConstraint;
  },

  type: 'ProgramRecalculationConstraints'
});

Sys ID

cc8e27719f301200598a5bb0657fcf63

Offical Documentation

Official Docs: