Name

sn_change_cab.CABAgendaItemSNC

Description

ServiceNow logic for CAB Agenda Item

Script

var CABAgendaItemSNC = Class.create();
CABAgendaItemSNC.prototype = Object.extendsObject(sn_change_cab.CAB, {
  generateFutureItemNotifications: function() {
  	if (!this._gr || !this._gr.getUniqueValue())
  		return;
  	
  	var agendaItemGr = new GlideRecord(CAB.AGENDA_ITEM);
  	agendaItemGr.addQuery("cab_meeting", this._gr.cab_meeting);
  	agendaItemGr.addQuery("order", ">", this._gr.order);
  	agendaItemGr.addQuery("state", "pending");
  	agendaItemGr.setLimit(this._gr.cab_meeting.notification_lead_time);
  	agendaItemGr.orderBy("order");
  	agendaItemGr.query();
  	
  	while (agendaItemGr.next()) {
  		agendaItemGr.notification_sent = true;
  		agendaItemGr.update();
  	}
  },

  isPending: function() {
  	return this._gr.state+"" == "pending";
  },
  
  setPending: function() {
  	this._gr.state = "pending";
  },
  
  pending: function() {
  	this.setPending();
  	this.update();
  },
  
  canDemote: function() {
  	if (!this.isInProgress() && !this.isPaused())
  		return false;

  	return true;
  },
  
  demote: function(elapsedTime, order) {
  	this.setPending();
  	if (!isNaN(elapsedTime))
  		this._gr.elapsed_time = new GlideDuration(elapsedTime);
  	if (!isNaN(order))
  		this._gr.order = order;
  	this.update();
  },
  
  isInProgress: function() {
  	return this._gr.state+"" == "in_progress";
  },
  
  setInProgress: function() {
  	this._gr.state = "in_progress";
  },
  
  inProgress: function() {
  	this.setInProgress();
  	this.update();
  },
  	
  isPaused: function() {
  	return this._gr.state+"" == "paused";
  },
  
  setPause: function(elapsedTime) {
  	this._gr.state = "paused";
  	if (!isNaN(elapsedTime))
  		this._gr.elapsed_time = new GlideDuration(elapsedTime);
  },
  
  pause: function(elapsedTime) {
  	this.setPause(elapsedTime);
  	this.update();
  },
  
  isComplete: function() {
  	return this._gr.state+"" == "complete";
  },
  
  setComplete: function(elapsedTime) {
  	this._gr.state = "complete";
  	if (!isNaN(elapsedTime))
  		this._gr.elapsed_time = new GlideDuration(elapsedTime);
  },
  
  complete: function(elapsedTime) {
  	this.setComplete(elapsedTime);
  	this.update();
  },
  
  isNoDecision: function() {
  	return this._gr.state+"" == "no_decision";
  },
  
  setNoDecision: function(elapsedTime) {
  	this._gr.state = "no_decision";
  	if (!isNaN(elapsedTime))
  		this._gr.elapsed_time = new GlideDuration(elapsedTime);
  },
  
  noDecision: function(elapsedTime) {
  	this.setNoDecision(elapsedTime);
  	this.update();
  },

  isDecisionPending: function() {
  	return this._gr.decision.nil();
  },
  
  isPreApproved: function() {
  	return this._gr.decision+"" == "preapproved";
  },
  
  setPreApproved: function() {
  	this._gr.decision = "preapproved";
  },
  
  preApproved: function() {
  	this.setPreApproved();
  	this.update();
  },
  
  isApproved: function() {
  	return this._gr.decision+"" == "approved";
  },
  
  setApproved: function() {
  	this._gr.decision = "approved";
  },
  
  approve: function() {
  	this.setApproved();
  	this.update();
  },
  
  isRejected: function() {
  	return this._gr.decision+"" == "rejected";
  },
  
  setRejected: function() {
  	this._gr.decision = "rejected";
  },
  
  reject: function() {
  	this.setRejected();
  	this.update();
  },
  
  addDecisionToMeetingNotes: function(decision, userName) {
  	decision = decision || (this._gr.state +"" === CAB.AGENDA_STATE.NO_DECISION ?
  		this._gr.getDisplayValue("state") : this._gr.getDisplayValue("decision"));
  	userName = userName || this._gs.getUserDisplayName();
  
  	var message = "<p>" +
  		gs.getMessage("(CAB Automation) - {0} - {1} - {2} - {3} - {4}", [
  			this._gr.task.getDisplayValue(),
  			decision,
  			userName,
  			new GlideDateTime().getUserFormattedLocalTime(),
  			this._gs.getSession().getTimeZoneName()
  		]) +
  		"</p>";
  	
  	var meetingGr = this._gr.cab_meeting.getRefRecord();
  	meetingGr.meeting_notes = meetingGr.meeting_notes.nil() ? message : meetingGr.getDisplayValue("meeting_notes") + message;
  	meetingGr.update();
  },
  
  refreshAttendeesFromTaskData: function(fieldData) {
  	if (!this._gr || !this._gr.getUniqueValue() || !fieldData || (typeof fieldData !== "object"))
  		return;

  	var fieldNames = Object.keys(fieldData);
  	for (var i = 0; i < fieldNames.length; i++) {
  		var fieldName = fieldNames[i];
  		var fieldValues = fieldData[fieldName];
  		if (fieldValues.previousValue)
  			this.removeAttendee(fieldValues.previousValue);

  		if (fieldValues.currentValue) {
  			var attendeeGr = this.addAttendee(fieldValues.currentValue);
  			if (attendeeGr && fieldName == "cab_delegate")
  				gs.eventQueue("sn_change_cab.change_request.delegate",
  							  this._gr,
  							  this._gr.task.cab_delegate);
  		}
  	}
  },
  
  refreshAttendees: function() {
  	if (!this._gr || !this._gr.getUniqueValue())
  		return;

  	var gotPrevious = false;
  	if (previous != null && previous.getUniqueValue() == this._gr.getUniqueValue())
  		gotPrevious = true;
  	
  	for (var i = 0; i < CABAgendaItem.TASK_FIELDS_FOR_ATTENDEES.length; i++) {
  		var fieldName = CABAgendaItem.TASK_FIELDS_FOR_ATTENDEES[i];

  		if (gotPrevious && !previous.task[fieldName].nil())
  			this.removeAttendee("" + previous.task[fieldName]);
  		if (!this._gr.task[fieldName].nil())
  			this.addAttendee("" + this._gr.task[fieldName]);
  	}
  },
  
  // Called when an agenda item is deleted
  removeTaskFromAttendees: function() {
  	if (!this._gr || !this._gr.getUniqueValue())
  		return;

  	/* First remove any automatically added attendees if the only agenda item
  	   they are attending for is this one */
  	var attendeeGr = new GlideRecord(CAB.ATTENDEE);
  	attendeeGr.addQuery("cab_meeting", "=", this._gr.cab_meeting);
  	attendeeGr.addQuery("reason", CAB.REASON.ATTENDEE);
  	attendeeGr.addQuery("attending_for_tasks", "CONTAINS", this._gr.getValue("task"));
  	attendeeGr.addQuery("added", "auto");
  	attendeeGr.query();
  	while (attendeeGr.next()) {
  		if (attendeeGr.getValue('attending_for_tasks') === this._gr.getValue("task")) 
  			attendeeGr.deleteRecord();
  	}
  	
  	/* Now find amd update any other attendees who have this task listed in their "attending_for_tasks" field */
  	attendeeGr.initialize();
  	attendeeGr.addQuery("cab_meeting", "=", this._gr.cab_meeting);
  	attendeeGr.addQuery("reason", [CAB.REASON.CAB_MANAGER, CAB.REASON.CAB_BOARD, CAB.REASON.ATTENDEE]);
  	attendeeGr.addQuery("attending_for_tasks", "CONTAINS", this._gr.getValue("task"));
  	attendeeGr.query();
  	
  	while (attendeeGr.next()) {
  		var cabAttendee = new CABAttendee(attendeeGr);
  		cabAttendee.updateAttendingForTasks([{"action": "remove", "taskId": this._gr.getValue("task")}]);

  		if (cabAttendee.canBeDeleted())
  			attendeeGr.deleteRecord();
  		else
  			cabAttendee.update();
  		
  	}
  },
  
  removeAttendee: function(userId) {
  	if (!this._gr || !this._gr.getUniqueValue())
  		return;
  	
  	if (!userId)
  		return;

  	var attendeeGr = new GlideRecord(CAB.ATTENDEE);
  	attendeeGr.addQuery("cab_meeting", this._gr.cab_meeting);
  	attendeeGr.addQuery("attendee", userId);
  	attendeeGr.query();

  	if (!attendeeGr.next())
  		return;
  	
  	var attendee = new CABAttendee(attendeeGr);
  	attendee.updateAttendingForTasks([{"action": "remove", "taskId": this._gr.getValue("task")}]);
  	if (attendee.canBeDeleted())
  		attendeeGr.deleteRecord();
  	else
  		attendee.update();
  },
  
  addAttendee: function(userId) {
  	if (!this._gr || !this._gr.getUniqueValue())
  		return;
  	
  	if (!userId)
  		return;

  	var attendeeGr = new GlideRecord(CAB.ATTENDEE);
  	attendeeGr.addQuery("cab_meeting", this._gr.cab_meeting);
  	attendeeGr.addQuery("attendee", userId);
  	attendeeGr.query();
  	
  	var attendee;
  	if (!attendeeGr.next()) {
  		attendee = CABAttendee.newAttendee(userId);
  		attendee.setValue("cab_meeting", this._gr.cab_meeting);
  		attendee.setValue("reason", CAB.REASON.ATTENDEE);
  		attendee.setValue("attending_for_tasks", this._gr.getValue("task"));
  		attendee.setValue("added", "auto");
  		attendee.insertUpdate();
  		return attendee.getGlideRecord();
  	} else {		
  		attendee = new CABAttendee(attendeeGr);
  		attendee.updateAttendingForTasks([{"action": "add", "taskId": this._gr.getValue("task")}]);
  		if (!attendee.getGlideRecord().attending_for_tasks.changes())
  			return;
  		
  		attendee.update();
  		return attendee.getGlideRecord();
  	}
  },
  	
  updateAttendeesTasks: function(attendeeGr, taskUpdates) {
  	if (!attendeeGr || !taskUpdates)
  		return;
  	
  	var cabAttendee = new CABAttendee(attendeeGr);
  	cabAttendee.updateAttendingForTasks(taskUpdates);
  	if (cabAttendee.canBeDeleted())
  		attendeeGr.deleteRecord();
  	else
  		cabAttendee.update();
  },
  
  // check if an agenda item has auto-added attendee for the meeting.
  hasAutoAddedAttendee: function() {
  	var attendeeGr = new GlideRecord(CAB.ATTENDEE);
  	attendeeGr.addQuery("cab_meeting", "=", this._gr.cab_meeting);
  	attendeeGr.addQuery("reason", CAB.REASON.ATTENDEE);
  	attendeeGr.addQuery("attending_for_tasks", "CONTAINS", this._gr.getValue("task"));
  	attendeeGr.addQuery("added", "auto");
  	attendeeGr.query();
  	if (attendeeGr.next()) 
  		return true;
  	
  	return false;
  },
  
  /**
   * Overloads the base toJS to provide change task information as part of the agneda item
   *
   * includeTaskJS: Adds task.record JS to the returned agenda item
   * includeSPForm: Adds task._form (SPForm model) to the returned agenda item
   */
  toJS: function(includeTaskJS, includeSPForm) {
  	var agendaItemJS = this._toJS(this._gr);

  	// If it couldn't be read by the user return nothing.
  	if (!agendaItemJS)
  		return null;

  	//If we're supressing task JS conversion return straight away
  	if (!includeTaskJS)
  		return agendaItemJS;
  	
  	if (!this._gr.task.nil()) {
  		var cabTask =  new CABChangeRequest(this._gr.task.getRefRecord());
  		var changeForm = cabTask.toSPForm();
  		
  		var dotWalkFields = [];
  		dotWalkFields = Object.keys(changeForm._fields).filter(function(fieldName) {
  			if (fieldName.indexOf(".") !== -1)
  				return true;
  					
  			return false;
  		});
  		
  		agendaItemJS.task.record = cabTask.toJS(true, dotWalkFields);
  		
  		if (includeSPForm)
  			agendaItemJS.task._form = changeForm;
  	}

  	return agendaItemJS;
  },
  
  updateCABDate: function() {
  	if (!this._gr || !this._gr.getUniqueValue())
  		return;
  		
  	var taskRecord = this._gr.task;
  	var cab_meetingRecord = this._gr.cab_meeting;
  	
  	if ( taskRecord.nil() || cab_meetingRecord.nil() )
  		return;
  	
  	var changeRequest = new global.ChangeRequest(taskRecord.getRefRecord());		
  	var start = cab_meetingRecord.getRefRecord().getValue("start");
  	changeRequest.setValue("cab_date_time",start);
  	changeRequest.update();
  },

  getTaskReferenceQualifier: function() {
  	var refQualifier = 'sys_class_name=change_request^ORsys_class_name=std_change_proposal';

  	if (!this._gr ||
  		!this._gr.getValue("cab_meeting") ||
  		gs.getProperty('sn_change_cab.com.snc.change_management.cab.check_duplicated_agenda_item', 'false') === 'false')
  		return refQualifier;

  	var agendaItemTaskIdsObj = new CABMeeting(current.cab_meeting.getRefRecord()).getAgendaItemTaskIds();
  	var taskIdList = Object.keys(agendaItemTaskIdsObj);
  	//get task value from DB as current.task could have been modified at client side
  	var aiGr = new GlideRecord('cab_agenda_item');
  	if (aiGr.get(this._gr.getUniqueValue())) {
  		var currentAiTaskIndex = taskIdList.indexOf(aiGr.getValue('task'));
  		if (currentAiTaskIndex !== -1)
  			taskIdList.splice(currentAiTaskIndex, 1);
  	}

  	if (taskIdList.length > 0)
  		return refQualifier + '^sys_idNOT IN' + taskIdList.join();

  	return refQualifier;
  },

  getMeetingReferenceQualifier: function() {
  	if (!this._gr ||
  		!this._gr.getValue("task") ||
  		gs.getProperty('sn_change_cab.com.snc.change_management.cab.check_duplicated_agenda_item', 'false') === 'false')
  		return "";

  	var meetingIdList = [];
  	var aiGr = new GlideRecord('cab_agenda_item');
  	aiGr.addQuery('task', this._gr.getValue("task"));
  	aiGr.addQuery('sys_id', '!=', this._gr.getUniqueValue());
  	aiGr.query();
  	while (aiGr.next())
  		meetingIdList.push(aiGr.getValue('cab_meeting'));

  	if (meetingIdList.length > 0)
  		return 'sys_idNOT IN' + meetingIdList.join();

  	return '';
  },

  type: 'CABAgendaItemSNC'
});

CABAgendaItemSNC.newAgendaItem = function(changeRequest) {
  var aIGr = new GlideRecord(sn_change_cab.CAB.AGENDA_ITEM);
  // Check if we have a ChangeRequest or GlideRecord object
  var changeRef = changeRequest;
  if (changeRequest && changeRequest.type=="ChangeRequest")
  	changeRef = changeRequest.getGlideRecord();
  
  if (changeRef && typeof changeRef.getRowCount == "function")
  	aIGr.task = changeRef.getUniqueValue();

  return new sn_change_cab.CABAgendaItem(aIGr);
};

Sys ID

961466f3eb32120034d1eeea1206fe2a

Offical Documentation

Official Docs: