Change transfer case functionality
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-16-2024 05:06 AM
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