Name

global.DocumentManagement

Description

Holds some pieces of logic that may be used in different part of the plugin.

Script

var DocumentManagement = Class.create();

//document states
DocumentManagement.draft = "draft"; 
DocumentManagement.active = "active";
DocumentManagement.inactive = "inactive";
DocumentManagement.cancelled = "cancelled";

//Prefix given to a given document
DocumentManagement.prefix_copy = "Copy ";

//revisions stages
DocumentManagement.awaiting_review = "awaiting_review";
DocumentManagement.published = "published";
DocumentManagement.retired = "retired";
DocumentManagement.rejected = "rejected";
DocumentManagement.approved = "approved";


DocumentManagement.prototype = {
  initialize : function() {
  	this.documentManagementDB = new DocumentManagementDB();
  },

  generateRevisionName : function(documentId) {
  	var document = this.documentManagementDB.getDocumentById(documentId,true);

  	var revisionName = "";

  	var separator = document.name_format.separator;
  	var components = this.documentManagementDB.getComponentIdsByNameFormatId(document.name_format);

  	for ( var i = 0; i < components.length; i++) {
  		component = this.documentManagementDB.getComponentById(components[i]);
  		if (component.value == "revision") {
  			revisionName += this.getNextRevisionNumber(documentId);
  		} else if (component.value.indexOf("document") >= 0) {
  			revisionName += eval(component.value);
  		}

  		if (i < (components.length - 1)) 
  			revisionName += separator;
  	}

  	return revisionName;

  },

  getNextRevisionNumber : function(documentId) {
  	var document = this.documentManagementDB.getDocumentById(documentId,true);
  	var latestRevision = this.documentManagementDB.getLatestRevisionByDocument(documentId);

  	if (!document.auto_increment_revision && latestRevision)
  		return latestRevision.revision_number;

  	if (latestRevision) {
  		var revisionNumberArray = latestRevision.revision_number.split(".");
  		if(parseInt(revisionNumberArray[(revisionNumberArray.length - 1)]) >= 9){
  			revisionNumberArray[(revisionNumberArray.length - 1)] = 0;
  			if(parseInt(revisionNumberArray[(revisionNumberArray.length - 2)]) >= 9 && revisionNumberArray.length == 3){
  				revisionNumberArray[(revisionNumberArray.length - 2)] = 0;
  				revisionNumberArray[(revisionNumberArray.length - 3)] = parseInt(revisionNumberArray[(revisionNumberArray.length - 3)])+ 1;
  			} else{		
  		    	revisionNumberArray[(revisionNumberArray.length - 2)] = parseInt(revisionNumberArray[(revisionNumberArray.length - 2)]) + 1 ;			   		  
  		}
  		} else{
  			revisionNumberArray[(revisionNumberArray.length - 1)] = parseInt(revisionNumberArray[(revisionNumberArray.length - 1)]) + 1;
  		}
  		var dot = "";
  		var nextRevisionNumber = "";
  		for ( var i = 0; i < revisionNumberArray.length; i++) {
  			if (i > 0)
  				dot = ".";
  			nextRevisionNumber += dot + revisionNumberArray[i];
  		}
  		return nextRevisionNumber;
  	}
  	return document.revision_format;
  },

  checkOutDocument : function(documentId, revisionId, userId) {
  	var document = this.documentManagementDB.getDocumentById(documentId);
  	if (!document.checked_out_by) {
  		document.checked_out_by = userId;
  		this.documentManagementDB.updateDocument(document);
  		this.checkOutRevision(revisionId, userId);
  		return true;
  	}
  	return false;
  },

  checkInDocument : function(revisionObject, userId) {
  	var documentGR = this.documentManagementDB.getDocumentById(revisionObject.document, true);
  	if ((documentGR.checked_out_by == userId)|| gs.getUser().hasRole("document_management_admin")) {
  		documentGR.setValue("checked_out_by", "NULL");
  		documentGR.update();
  		this.clearRevisionsCheckedOutByField(revisionObject.document, userId);
  		return true;
  	}
  	return false;
  },

  checkOutRevision : function(revisionId, userId) {
  	var revision = this.documentManagementDB.getRevisionById(revisionId);
  	revision.checked_out_by = userId;
  	this.documentManagementDB.updateRevision(revision);
  	return true;
  },

  clearRevisionsCheckedOutByField : function(documentId) {
  	var revisions = this.documentManagementDB.getRevisionsByDocumentId(documentId);
  	for ( var i = 0; i < revisions.length; i++) {
  		var currentRevision = revisions[i];
  		if (currentRevision.checked_out_by) {
  			currentRevision.checked_out_by = "NULL";
  			this.documentManagementDB.updateRevision(currentRevision);
  		}
  	}
  },

  copyDocument : function(sourceDocumentId) {
  	var sourceDocumentGR = this.documentManagementDB.getDocumentById(sourceDocumentId, true);
  	sourceDocumentGR.sys_id = null;
  	sourceDocumentGR.number = getNextObjNumberPadded();
  	sourceDocumentGR.name = DocumentManagement.prefix_copy + sourceDocumentGR.name;
  	sourceDocumentGR.state = this.draft;
  	sourceDocumentGR.checked_out_by = null;
  	newDocumentId = sourceDocumentGR.insert();
      
  	if (newDocumentId) {
  		var sourceDocumentLatestRevision = this.documentManagementDB.getLatestRevisionByDocument(sourceDocumentId);

  		var revision = new Object();
  		revision.name = sourceDocumentLatestRevision.name;
  		revision.revision = sourceDocumentLatestRevision.revision;
  		revision.document = newDocumentId;
  		revision.revision_number = sourceDocumentLatestRevision.revision_number;
  		revision.note = sourceDocumentLatestRevision.note;

  		revision.sys_id = this.documentManagementDB.insertRevision(revision);

  		GlideSysAttachment.copy(
  				this.documentManagementDB.document_revision_table,
  				sourceDocumentLatestRevision.sys_id,
  				this.documentManagementDB.document_revision_table,
  				revision.sys_id);
  		
  		var attch  = new GlideRecord("sys_attachment");
  		attch.addQuery("table_sys_id", revision.sys_id);
  		attch.addQuery("table_name",this.documentManagementDB.document_revision_table);
  		attch.query();
  		attch.next();
  		revision.attachment = attch.getValue("sys_id");
  		this.documentManagementDB.updateRevision(revision);
  		
  		return newDocumentId;
  	}
  	
  	return false;
  },

  publishRevision : function(revisionId) {
  	
  	var workflow = new Workflow();
  	
  	var revision = this.documentManagementDB.getRevisionById(revisionId);
  	revision.stage = "published";
  	this.documentManagementDB.updateRevision(revision);
  	 
  	var revisions = this.documentManagementDB.getRevisionsByDocumentId(revision.document);
  	
  	for(var i=0; i<revisions.length; i++){
  		if(revisions[i].sys_id == revision.sys_id)
  			continue;
  		
  		var revisionGR = this.documentManagementDB.getRevisionById(revisions[i].sys_id, true);
  		workflow.cancel(revisionGR);
  		
  		revisionGR.setValue("stage",DocumentManagement.retired);
  		revisionGR.update();
  	}
  },
  
  

  type : "DocumentManagement"
};

DocumentManagement.canRevisionBeSubmitted = function(documentGR) {
  if(documentGR.stage=="draft" && (documentGR.checked_out_by=="" || documentGR.checked_out_by==gs.getUserID()))
  	return true;
  return false;
};

DocumentManagement.doesDocumentHavePublishedRevision = function(documentId) {
  var db = new DocumentManagementDB();
  var revision = db.getPublishedRevisionByDocument(documentId);
  if (revision)
  	return true;
  else
  	return false;
};

DocumentManagement.doesDocumentHaveRevision = function(documentId) {
  var db = new DocumentManagementDB();
  var revisions = db.getRevisionsByDocumentId(documentId);
  if (revisions.length>0)
  	return true;
  else
  	return false;
};

DocumentManagement.isLatestRevision = function(revisionId, documentId) {
  var db = new DocumentManagementDB();
  var latestRevision = db.getLatestRevisionByDocument(documentId);
  if (latestRevision.sys_id == revisionId)
  	return true;
  else
  	return false;
};

Sys ID

4e25dcd60a0a2c3e505d974f3207ec1f

Offical Documentation

Official Docs: