Name

global.CertificationUtilities

Description

Functions for Certification actions

Script

var CertificationUtilities = Class.create();
CertificationUtilities.prototype = {
  initialize: function() {
  },
  
  rollupTaskState: function(certTask) {
  	var instance = new GlideRecord("cert_instance");
  	instance.get(certTask.cert_instance);
  	
      var task = new GlideRecord("cert_task");
      task.addQuery("cert_instance", certTask.cert_instance);
      task.query();
      
      var closed_complete = 0;
      var closed_incomplete = 0;
      var cancelled = 0;
  	var wip = 0;
      
      while (task.next()) {
          if (task.state == 3)
              closed_complete++;
          else if ( task.state == 4)
              closed_incomplete++;
          else if (task.state == 7)
              cancelled++;
  		else
  			return;
  			// found work in progress, returning
      }


      if (closed_incomplete > 0)
          instance.state = 4;
      else if (closed_incomplete == 0 && closed_complete > 0) {
          instance.state = 3;
  		if (instance.completed.nil())
  			instance.completed = gs.nowDateTime();
  	}
      else if (closed_incomplete == 0 && closed_complete == 0)
          instance.state = 7;
      
      instance.update();
  },
  
  cleanupInvalidDataCertElements: function(task) {
  	// Get the records that are being certified
  	var record = this._getCertifyingRecords(task);

  	// Collect the sys ids
  	var sysIds = [];
  	while(record.next())
  		sysIds.push(record.getUniqueValue());

  	// Get all of the certification elements that
  	// are certifying a record with an id that is not
  	// in the collection (in other words, the record
  	// has been deleted, but the cert element remains)
  	var elem = new GlideRecord('cert_element');
  	elem.addQuery('cert_task', task.sys_id + '');
  	elem.addQuery('sys_id', '!=', task.sys_id + '');
  	elem.addQuery('id', 'NOT IN', sysIds);
  	elem.query();

  	// Delete cert elements for invalid records and archived records. Archived record table name starts with "ar_"
  	while(elem.next()) {
  		var doc = new GlideRecord(elem.table + '');
  		if(!doc.get(elem.id + '') || elem.table.toLowerCase().startsWith("ar_")){
  			elem.deleteRecord();
  		}	
  	}

  	var total = this._getCertificationTotal(task);	
  	var pending = this._getCertificationPending(task);
  	if (total == 0)
  		total = pending;

  	if (total == 0)
  		task.percent_complete = 0;
  	else
  		task.percent_complete = (1 - (pending / total)) * 100;

  	if (pending == 0) {
  		task.state = 3; // Closed Complete
  		task.active = false;
  		gs.addInfoMessage(gs.getMessage('Closing Certification Task: {0} - all Certification Elements complete', task.getDisplayValue()));
  	} else {
  		task.state = 2; // Work in Progress
  		task.active = true;
  	}
  	task.update();
  },
  
  _getCertificationTotal: function(task) {
  	var ga = new GlideAggregate("cert_element");
  	ga.addQuery("cert_task", task.sys_id + '');
  	ga.addAggregate("COUNT");
  	ga.query();
  	var total = 0;
  	if (ga.next())
  		total = ga.getAggregate("COUNT");

  	return total;
  },
  
  _getCertificationPending: function(task) {
  	var ga = new GlideAggregate("cert_element");
  	ga.addQuery("cert_task", task.sys_id + '');
  	ga.addQuery("state", "Pending");
  	ga.addAggregate("COUNT");
  	ga.query();
  	var pending = 0;
  	if (ga.next())
  		pending = ga.getAggregate("COUNT");

  	return pending;
  },
  
  _getCertifyingRecords: function(task) {
  	var joinTable = task.cert_schedule.table + '';
  	var joinQuery = '';

  	if (task.cert_schedule.filter + '' != '')
  		joinQuery = task.cert_schedule.filter.filter_condition + '';

  	var record = new GlideRecord(joinTable);
  	if (joinQuery != '')
  		record.addQuery(joinQuery);
  	record.query();
  	return record;
  },
  
  
  type: 'CertificationUtilities'
};

Sys ID

c09c69034701300042bd757f2ede27af

Offical Documentation

Official Docs: