Name

global.RankConfigurationUtil

Description

No description available

Script

var RankConfigurationUtil = Class.create();
RankConfigurationUtil.prototype = {
  initialize: function(gr) {
  	this.gr = gr;
  	this.tableLabel = GlideMetaData.getTableLabel(this.gr.getValue('table'));
  	this.columnLabel = GlideMetaData.getTableFieldLabel(this.gr.getValue('table'), this.gr.getValue('column'));
  },
  
  areTableAndColumnNamesValid: function() {
  	//check duplicate record
  	var rankGr = new GlideRecord('rank_configuration');
  	rankGr.addQuery('table', this.gr.getValue('table'));
  	rankGr.addQuery('column', this.gr.getValue('column'));
  	rankGr.addQuery('sys_id', '!=', this.gr.getValue('sys_id'));
  	rankGr.query();
  	if(rankGr.next()) {
  		gs.addErrorMessage(gs.getMessage("An entry for {0} [{1}] with {2} already exists.", [this.tableLabel, this.gr.getValue('table'), this.columnLabel]));
  		return false;
  	}
  	
  	//check parent tables
  	var parentList = GlideDBObjectManager.get().getTables(this.gr.table);
  	var tableArr = [];
  	for(var i = 0; i < parentList.size(); i++) {
  		var table = String(parentList.get(i));
  		if(table != this.gr.getValue('table'))
  			tableArr.push(String(parentList.get(i)));
  	}
  	var parentGr = new GlideRecord('rank_configuration');
  	parentGr.addQuery('column', this.gr.getValue('column'));
  	parentGr.addQuery('table', 'IN', tableArr.join(','));
  	parentGr.addQuery('include_tables', 'CONTAINS', this.gr.getValue('table'));
  	parentGr.setLimit(1);
  	parentGr.query();
  	if(parentGr.next()) {
  		var parentLabel =  GlideMetaData.getTableLabel(parentGr.getValue('table'));
  		var parentColumnLabel = GlideMetaData.getTableFieldLabel(parentGr.getValue('table'), parentGr.getValue('column'));
  		gs.addErrorMessage(gs.getMessage("Rank configuration for {0} with {1} is already included in its parent table configuration: {2} with {3}", [this.tableLabel, this.columnLabel, parentLabel, parentColumnLabel]));
  		return false;
  	}
  	
  	return true;
  },
  
  isIncludeTablesValid: function(previousTableName) {
  	this._trimIncludeTables();
  	
  	if(!this._validateIncludeTableList()) {
  		gs.addErrorMessage(gs.getMessage('The Include Tables field must contain only the child tables of {0} [{1}]', [this.tableLabel, this.gr.getValue('table')])); 
  		return false;
  	}
  
  	var childRankConfig = this._findChildConfigRecord();
  	if(JSUtil.notNil(childRankConfig)) { 
  		gs.addErrorMessage(gs.getMessage("Rank configuration record for {0} already exists. Remove it from the Include Tables field.", [childRankConfig.getValue('table')]));
  		return false;
  	}
  	
  	var otherRankConfig = this._findOtherRankConfigs(previousTableName);
  	if(JSUtil.notNil(otherRankConfig)) {
  		var otherRankConfigLabel = GlideMetaData.getTableLabel(otherRankConfig.getValue('table'));
  		var currentIncludeTables = this.gr.getValue('include_tables').split(',');
  		var otherIncludeTables = otherRankConfig.getValue('include_tables').split(',');
  		var repeatedTablesArray = currentIncludeTables.filter(function(table) {
  			return otherIncludeTables.indexOf(table) !== -1;
  		});
  		var repeatedTables = repeatedTablesArray.join(',');
  		gs.addErrorMessage(gs.getMessage("Rank configuration of {0} [{1}] table already includes {2}.", [otherRankConfigLabel, otherRankConfig.getValue('table'), repeatedTables]));
  		return false;
  	}
  	
  	return true;
  },
  
  _findOtherRankConfigs: function(previousTableName) {
  	var includeTables = this.gr.getValue('include_tables').split(',');
  	var rankGr =  new GlideRecord('rank_configuration');
  	rankGr.addQuery('table', '!=', previousTableName);
  	rankGr.addQuery('column', this.gr.getValue('column'));
  	var qc = rankGr.addQuery('include_tables', 'CONTAINS', includeTables[0]);
  	
  	for(var i = 1; i < includeTables.length; i++) {
  		qc.addOrCondition('include_tables', 'CONTAINS', includeTables[i]);
  	}
  	rankGr.query();
  	if(rankGr.next()) 
  		return rankGr;
  	
  	return null;
  },
  
  _findChildConfigRecord: function() {
  	var childGr = new GlideRecord('rank_configuration');
  	childGr.addQuery('column', this.gr.getValue('column'));
  	childGr.addQuery('table', 'IN', this.gr.getValue('include_tables'));
  	childGr.setLimit(1);
  	childGr.query();
  	if(childGr.next()) 
  		return childGr;
  	
  	return null;
  },
  	
  _validateIncludeTableList: function() {
  	var childList = GlideDBObjectManager.get().getTableExtensions(this.gr.getValue('table'));
  	var childTables = [];
  	var includeTables = this.gr.getValue('include_tables').split(',');
  	for(var i = 0; i < childList.size(); i++) {
  		var table = String(childList.get(i));
  		childTables.push(table);
  	}
  	for(i = 0; i < includeTables.length; i++) {
  		if(childTables.indexOf(includeTables[i]) < 0)  
  			return false;
  	}
  	return true;
  },
  
  validateRankConfig: function(sysClassName, rankTable, rankColumn) {
  	var rankGr = new GlideRecord('rank_configuration');
  	rankGr.addQuery('table', rankTable);
  	rankGr.addQuery('column', rankColumn);
  	if(sysClassName != rankTable){
  		rankGr.addQuery('include_tables', 'CONTAINS', sysClassName).addOrCondition('include_all_child_tables', true);
  		
  	}
  	rankGr.query();
  	if(rankGr.next())
  		return true;
  	
  	return false;
  },
  
  _trimIncludeTables: function() {
  	var includeTables = this.gr.getValue('include_tables').split(',');
  	var arr = [];
  	for(var i = 0; i < includeTables.length; i++) {
  		var table = includeTables[i].trim();
  		if(JSUtil.notNil(table))
  			arr.push(table);
  	}
  	this.gr.setValue('include_tables', arr.join(','));
  },

  type: 'RankConfigurationUtil'
};

Sys ID

727ebd265b80230036c32c1cf0f91aff

Offical Documentation

Official Docs: