Creating New Change Type > Adding new states

Brendan Hallida
Kilo Guru

Hi all,

I created a new change type (minor) using this tutorial, and then used this tutorial to add my own states.

The States I have added for this test is:

  1. Develop and Implement in UAT (8)
  2. Test in UAT (12)

 

The issue I am having is that when I go to the change, When it is at New, the new state of 'Develop and Implement in UAT' is not available.

It is probably worth noting that the change request here was heavily modified by the implementer, and the OOB states (Draft, Assess etc) have been removed as part of the implementation before my time.

Below are the two script includes edited as per the tutorial.  Any clues where I am going wrong?

Thanks in Advance!

ChangeRequestStateHandler

var ChangeRequestStateHandler = Class.create();

// All references to statehandler constants should be through this class ChangeRequestStateHandler
ChangeRequestStateHandler.DRAFT = ChangeRequestStateHandlerSNC.DRAFT;
ChangeRequestStateHandler.ASSESS = ChangeRequestStateHandlerSNC.ASSESS;
ChangeRequestStateHandler.AUTHORIZE = ChangeRequestStateHandlerSNC.AUTHORIZE;
ChangeRequestStateHandler.SCHEDULED = ChangeRequestStateHandlerSNC.SCHEDULED;
ChangeRequestStateHandler.IMPLEMENT = ChangeRequestStateHandlerSNC.IMPLEMENT;
ChangeRequestStateHandler.REVIEW = ChangeRequestStateHandlerSNC.REVIEW;
ChangeRequestStateHandler.CLOSED = ChangeRequestStateHandlerSNC.CLOSED;
ChangeRequestStateHandler.CANCELED = ChangeRequestStateHandlerSNC.CANCELED;
ChangeRequestStateHandler.DEVELOP_AND_IMPLEMENT_IN_UAT = "develop_and_implement_in_uat";
ChangeRequestStateHandler.TEST_IN_UAT = "test_in_uat";

ChangeRequestStateHandler.prototype = Object.extendsObject(ChangeRequestStateHandlerSNC, {
	MINOR:"minorv2",
	initialize: function(changeRequestGr) {
		ChangeRequestStateHandlerSNC.prototype.initialize.call(this, changeRequestGr);
		this.STATE_NAMES["8"] = ChangeRequestStateHandler.DEVELOP_AND_IMPLEMENT_IN_UAT;
		this.STATE_NAMES["12"] = ChangeRequestStateHandler.TEST_IN_UAT;
	},
	_resetModel: function() {
		this._model = null;
		var type = this._gr.getValue('type') + "";
		
		if (type == this.NORMAL || type == this.STANDARD || type == this.EMERGENCY)
			ChangeRequestStateHandlerSNC.prototype._resetModel.call(this);
		else if (type == this.MINOR)
			this._model = new ChangeRequestStateModel_minor(this._gr);
	},
	type: "ChangeRequestStateHandler"
});

ChangeRequestStateModel_minor 

var ChangeRequestStateModel_minor = Class.create();
ChangeRequestStateModel_normal.prototype = Object.extendsObject(ChangeRequestStateModelCust_minor, {
	draft: {
		nextState: [ "develop_and_implement_in_uat" ],
		
		develop_and_implement_in_uat: {
			moving: function() {
				return this.toDevelopuat_moving();
			},
			
			canMove: function() {
				return this.toDevelopuat_canMove();
			}
		},
		
		canceled: {
			moving: function() {
				return this.toCanceled_moving();
			},
			
			canMove: function() {
				return this.toCanceled_canMove();
			}
		}
	},
	
	develop_and_implement_in_uat: {
		nextState: [ "test_in_uat" ],
		
		test_in_uat: {
			moving: function() {
				return this.toTestuat_moving();
			},
			
			canMove: function() {
				return this.toTestuat_canMove();
			}
		},
		
		canceled: {
			moving: function() {
				return this.toCanceled_moving();
			},
			
			canMove: function() {
				return this.toCanceled_canMove();
			}
		}
	},
	
	authorize: {
		nextState: [ "scheduled" ],
		
		draft: {
			moving: function() {
				return this.toDraft_moving();
			},
			
			canMove: function() {
				return this.toDraft_canMove();
			}
		},
		
		scheduled: {
			moving: function() {
				return this.toScheduled_moving();
			},
			
			canMove: function() {
				return this.toScheduled_canMove();
			}
		},
		
		canceled: {
			moving: function() {
				return this.toCanceled_moving();
			},
			
			canMove: function() {
				return this.toCanceled_canMove();
			}
		}
	},
	
	scheduled: {
		nextState: [ "implement" ],
		
		implement: {
			moving: function() {
				return this.toImplement_moving();
			},
			canMove: function() {
				return this.toImplement_canMove();
			}
		},
		
		canceled: {
			moving: function() {
				return this.toCanceled_moving();
			},
			
			canMove: function() {
				return this.toCanceled_canMove();
			}
		}
	},
	
	implement: {
		nextState: [ "review" ],
		
		review: {
			moving: function() {
				return this.toReview_moving();
			},
			
			canMove: function() {
				return this.toReview_canMove();
			}
		},
		
		canceled: {
			moving: function() {
				return this.toCanceled_moving();
			},
			
			canMove: function() {
				return this.toCanceled_canMove();
			}
		}
	},
	
	review: {
		nextState: [ "closed" ],
		
		closed: {
			moving: function() {
				return this.toClosed_moving();
			},
			
			canMove: function() {
				return this.toClosed_canMove();
			}
		},
		
		canceled: {
			moving: function() {
				return this.toCanceled_moving();
			},
			
			canMove: function() {
				return this.toCanceled_canMove();
			}
		}
	},
	
	closed: {},
		
		canceled: {},
			
			toDevelopuat_moving: function() {
				return true;
			},
			
			toDevelopuat_canMove: function() {
				return true;
			},
			
			toTestuat_moving: function() {
				return true;
			},
			
			toTestuat_canMove: function() {
				return true;
			},
			
			type: "ChangeRequestStateModel_minor"
		});

 

 

 

 

1 ACCEPTED SOLUTION

You can try to add new STATE_NAMES on ChangeRequestStateHandler  

this.STATE_NAMES["1"] = ChangeRequestStateHandler.DRAFT;

Then try again. 

 

View solution in original post

31 REPLIES 31

Yeah. You are missing all the functions here.

 ToDeveloUATMoving etc.. You can either define these functions or remove them from ChangeRequestStateModel_minor as suggested by Jack

 

This thread has almost all the steps.

https://community.servicenow.com/community?id=community_question&sys_id=26030fa1dbd8dbc01dcaf3231f96...


Please mark this response as correct or helpful if it assisted you with your question.

SanjivMeher
Kilo Patron
Kilo Patron

Ok. I think we are close. Printing the state value now

 

var ChangeRequestStateHandler = Class.create();

// All references to statehandler constants should be through this class ChangeRequestStateHandler
ChangeRequestStateHandler.DRAFT = ChangeRequestStateHandlerSNC.DRAFT;
ChangeRequestStateHandler.ASSESS = ChangeRequestStateHandlerSNC.ASSESS;
ChangeRequestStateHandler.AUTHORIZE = ChangeRequestStateHandlerSNC.AUTHORIZE;
ChangeRequestStateHandler.SCHEDULED = ChangeRequestStateHandlerSNC.SCHEDULED;
ChangeRequestStateHandler.IMPLEMENT = ChangeRequestStateHandlerSNC.IMPLEMENT;
ChangeRequestStateHandler.REVIEW = ChangeRequestStateHandlerSNC.REVIEW;
ChangeRequestStateHandler.CLOSED = ChangeRequestStateHandlerSNC.CLOSED;
ChangeRequestStateHandler.CANCELED = ChangeRequestStateHandlerSNC.CANCELED;
ChangeRequestStateHandler.DEVELOP_AND_IMPLEMENT_IN_UAT = "develop_and_implement_in_uat";
ChangeRequestStateHandler.TEST_IN_UAT = "test_in_uat";

ChangeRequestStateHandler.prototype = Object.extendsObject(ChangeRequestStateHandlerSNC, {
	MINOR:"minorv2",
	initialize: function(changeRequestGr) {
		ChangeRequestStateHandlerSNC.prototype.initialize.call(this, changeRequestGr);
		this.STATE_NAMES["8"] = ChangeRequestStateHandler.DEVELOP_AND_IMPLEMENT_IN_UAT;
		this.STATE_NAMES["12"] = ChangeRequestStateHandler.TEST_IN_UAT;
	},
	_resetModel: function() {
		this._model = null;
		var type = this._gr.getValue('type') + "";
		
		if (type == this.NORMAL || type == this.STANDARD || type == this.EMERGENCY)
			ChangeRequestStateHandlerSNC.prototype._resetModel.call(this);
		else if (type == this.MINOR)
{
gs.log('Inside Else If');
			this._model = new ChangeRequestStateModel_minor(this._gr);
gs.log('Next State for Draft is '+this._model['draft'].nextState);
}
	},
	type: "ChangeRequestStateHandler"
});

Please mark this response as correct or helpful if it assisted you with your question.

Hey,

looks like we have a a bit of development here

find_real_file.png

I just reproduce you issue on my personal instance:

- Add new type: label: "Minor" - value: "minorv2"

- Add new state: label "Develop And Implement In UAT" - value "99"

- Reused your class ChangeRequestStateHandler, ChangeRequestStateModel_minor, ChangeRequestStateModelCust_minor

And I see it works well.

Could you check again your state choice list & type choice list?

 

find_real_file.png

Yeah its odd, it is working fine in my personal instance as well.

 

find_real_file.png

 

find_real_file.png