Change transfer case functionality

rafas_10
Tera Guru

Hi everyone, I hope you are doing well!

 

I have a requirement to change a little bit the OOB Tranfer case functionality.

Transfer case UI page: https://(your instance name).service-now.com/sys_ui_page.do?sys_id=452f10e42f131200b3c9a310c18c9511&sysparm_record_target=sys_ui_page&sysparm_record_row=3&sysparm_record_rows=6&sysparm_record_list=nameCONTAINStransf%5EORDERBYname

 

HTML:
<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
	<g:ui_form id="transfer_case_dialog">
		<script src="scripts/heisenberg/heisenberg_all.js" />
		<g:requires name="styles/heisenberg/heisenberg_all.css" includes="true" />
		<j:set var="jvar_sys_id" value="${sysparm_sys_id}" />
		<j:set var="jvar_table_name" value="${sysparm_table_name}" />
		<g:evaluate jelly="true">
			var subjectPerson = jelly.sysparm_subject_person;
			var services = new sn_hr_core.hr_CaseCreation().getServicesForUser(subjectPerson || '', true);
			var servicesString = JSON.stringify(services);
		</g:evaluate>
		<script>
			var services = '${JS:servicesString}';
		</script>
		<div class="col-md-12" style="color:tomato; text-align:center; font-weight:bold; margin-bottom:8px; font-size:larger;">
			${gs.getMessage("Warning!")}
		</div>
		<div class="col-md-12" style="margin-bottom:12px;">
			${gs.getMessage("The current case and its child tasks will be closed.")}
		</div>
		<div class="vsplit col-md-12 form-group form-horizontal">
			<div class="col-md-3 text-right" style="padding-left:3px;">
				<g:form_label for="service_select">
					${gs.getMessage("Transfer case to")}
				</g:form_label>
			</div>
			<div class="col-md-9" style="padding-left:14px">
				<input id="service_input" class="select2 form-control"/>
			</div>
		</div>
		<footer id="okCancel" class="modal-footer">
			<input type="hidden" id="task_sys_id" name="task_sys_id" value="${sysparm_sys_id}" aria-hidden="true"></input>
			<input type="hidden" id="task_table_name" name="task_table_name" value="${sysparm_table_name}" aria-hidden="true"></input>
			<input type="hidden" id="selected_service" name="selected_service" value="" aria-hidden="true"></input>
			<button onclick="return submitCancel();" id="cancel" class="btn btn-default">
				${gs.getMessage('Cancel')}
			</button>
			<button id="ok" class="btn btn-primary" onclick="return submitOk(); ">
				${gs.getMessage('Ok')}
			</button>
		 </footer>
	</g:ui_form>
</j:jelly>

Client script:
var serviceCategories = JSON.parse(services);

var sanitizeDisplay = function(text) {
	return $j("<div>").html(text).html();
};

// Service input select2
var localPageSize = 50;
$j("#service_input").select2({
	// Use AJAX functions for local pagination
	allowClear: true,
	ajax: {
		quietMillis: 250,
		data: function(searchTerm, page) {
			return {
				term: searchTerm,
				page: page-1
			};
		},
		transport: function(response) {
			var q = response.data;
			var results = [];

			var total = -1;
			var start = q.page * localPageSize;
			var end = (q.page + 1) * localPageSize;

			for (var i = 0; i < serviceCategories.length; i++) {
				var children = serviceCategories[i].children.filter(function(opt) {
					var matched = !q.term || opt.display.toLowerCase().indexOf(q.term.toLowerCase()) >= 0 || (opt.parent && opt.parent.toLowerCase().indexOf(q.term.toLowerCase()) >= 0);
					if (matched) {
						total++;
						if (total >= start && total < end) // Option within page bounds
							return matched;

						return false;
					}
					return false;
				});

				if (children.length > 0) {
					results.push({
						display: serviceCategories[i].display,
						children: children
					});
				}
			}

			response.success.apply(this, [{
				results: results,
				more: total > end
			}]);

			return true;
		},
		// Specify how data returned should be processed.
		results: function(response, page) {
			return response;
		}
	},
	formatSelection: function(item) {
		return sanitizeDisplay(item.display);
	},
	formatResult: function(item) {
		return sanitizeDisplay(item.display);
	},
	id: function(item) {
		return item.sys_id;
	},
	initSelection: function (element, callback) {
		var serviceFormId = 'sys_display.' + g_form.getTableName() + '.hr_service';
		var displayValue = g_form.getElement(serviceFormId).value;
		callback(
				{
					sys_id : g_form.getValue('hrService'),
					display: displayValue
				}
			);
	},
	placeholder: sanitizeDisplay('${gs.getMessage("Select a service")}')
});

$j("#service_input").val(g_form.getValue("hr_service")).trigger('change');

function submitCancel() {
	GlideDialogWindow.get().destroy();
	return false;
}

var submittedTransfer = false;
function submitOk() {
	if (submittedTransfer)
		return false;
	submittedTransfer = true;
	$j("#selected_service").val($j("#service_input").select2('val'));
	return true;
}

Processing script:
(function(_this) {
	var originalTask = new GlideRecord(task_table_name);
	if (!originalTask.get(task_sys_id)) {
		gs.addErrorMessage(gs.getMessage("Could not find original case"));
		return;
	}
	var service = new GlideRecord("sn_hr_core_service");
	if (!service.get(selected_service)) {
		gs.addErrorMessage(gs.getMessage("Could not find selected service"));
		return;
	}

	// Create new case
	var newTask = new GlideRecord(service.topic_detail.topic_category.coe);
	newTask.hr_service = selected_service;
	newTask.transferred_from = task_sys_id;
	newTask.comments = gs.getMessage("Case was transferred from {0}", [originalTask.number]);
	originalTask.transferred_to = newTask.getUniqueValue();
	// Copy fields from original case
	var ignoredFields = ["assignment_group", "assigned_to", "closed_at", "closed_by", "close_notes", "employee_percent_complete", "fulfillment_instructions", "hr_service", "number", "payload", "priority", "pdf_template", "skills", "sla", "sla_suspended", "sla_suspended_for", "sla_suspended_on", "sla_suspended_reason", "state", "submitter_can_cancel", "task_percent_complete", "template", "template_invoked", "topic_category", "topic_detail", "transferred_from", "transferred_to", "workflow", "workflow_invoked"];
	var fields = originalTask.getElements();
	for (var i = 0; i < fields.length; i++) {
		var fieldName = fields[i].getName();
		if (!fieldName.startsWith("sys_") && ignoredFields.indexOf(fieldName) == -1 && newTask.isValidField(fieldName))
			newTask[fieldName] = originalTask[fieldName];
	}
	
	if (service.template.toString())
		new sn_hr_core.hr_TemplateUtils().applyBefore(service.template.toString(), newTask);
	
	if (!newTask.insert()) {
		gs.addErrorMessage(gs.getMessage("Failed to insert a new case"));
		return;
	}

	// Cancel original case (customised) - status changed to closed and updated the completion code)
	originalTask.state = 3;
	originalTask.u_completion_code = 'Transferred to other Category or HR service';
	originalTask.comments = gs.getMessage("Case was cancelled and transferred to {0}", [newTask.number]);
	if (!originalTask.update()) {
		gs.addErrorMessage(gs.getMessage("Failed to close original case"));
		return;
	}

	// Copy attachments from original case
	var attachments = new GlideSysAttachment().copy(task_table_name, task_sys_id, newTask.getRecordClassName(), newTask.getUniqueValue());
	if (attachments.length > 0) {
		newTask.get(newTask.getUniqueValue());
		newTask.comments = gs.getMessage("File attachments were copied from {0}", [originalTask.number]);
		newTask.update();
	}

	gs.addInfoMessage(gs.getMessage("Case was transferred from {0}", [originalTask.number]));
	response.sendRedirect(newTask.getRecordClassName() + ".do?sysparm_query=sys_id=" + newTask.getUniqueValue());
})(this);

 

Transfer case UI action:

https://(your instance name).service-now.com/sys_ui_action.do?sys_id=c83e5ca42f131200b3c9a310c18c959d&sysparm_record_target=sys_ui_action&sysparm_record_row=1&sysparm_record_rows=14&sysparm_record_list=nameCONTAINStransf%5EORDERBYDESCsys_updated_on

function transferCase() {
	var sysId = g_form.getUniqueValue();
	var dialogClass = GlideModal ? GlideModal : GlideDialogWindow;
	var dialog = new dialogClass('sn_hr_core_Transfer Case');
	dialog.setTitle(getMessage('Transfer Case'));
	dialog.setPreference('sysparm_sys_id', sysId);
	dialog.setPreference('sysparm_table_name', g_form.getTableName());
	dialog.setPreference('sysparm_subject_person', g_form.getValue('subject_person'));
	dialog.render();
	
}

The functionality I'm trying to achieve is:

We maintain the same look and feel and functionality of the HR Services appearing, but instead Transfering the case, it creates a child case associated with the current case(parent).

 

How can I modify this to make this functionality achievable ?

 

I tried a lot of things but could get a result.

 

Thank you if you can help!

Sérgio 

0 REPLIES 0