538 lines
27 KiB
JavaScript
538 lines
27 KiB
JavaScript
"use strict";
|
|
(function () {
|
|
'use strict';
|
|
angular.module('myitsmApp')
|
|
.service('ticketActionService', ['$modal', '$filter', '$q', '$timeout', '$state', 'events', 'emailModel', 'followService', 'systemAlertService', 'ticketModel', 'metadataModel', 'screenConfigurationModel', 'relationModel', 'srdModel', '$log', 'objectValueMapperService',
|
|
function ($modal, $filter, $q, $timeout, $state, events, emailModel, followService, systemAlertService, ticketModel, metadataModel, screenConfigurationModel, relationModel, srdModel, $log, objectValueMapperService) {
|
|
/**
|
|
* Shows action blade with "Assign" dialog
|
|
*
|
|
* @param ticket
|
|
* @param isDraft
|
|
* @returns {*}
|
|
*/
|
|
this.showAssignDialog = function (ticket, isDraft, role, activeRole) {
|
|
if (!ticket.assignee) {
|
|
ticket.assignee = {
|
|
customFields: {}
|
|
};
|
|
}
|
|
return $modal.open({
|
|
templateUrl: 'views/common/assign-action-blade.html',
|
|
controller: 'AssignController',
|
|
windowClass: 'action-blade',
|
|
keyboard: 'custom',
|
|
backdrop: 'custom',
|
|
resolve: {
|
|
assignParams: function () {
|
|
return {
|
|
ticket: ticket,
|
|
isDraft: isDraft,
|
|
role: role,
|
|
activeRole: activeRole
|
|
};
|
|
}
|
|
}
|
|
});
|
|
};
|
|
/**
|
|
* Shows action blade with "Assign" dialog
|
|
*
|
|
* @param selectedItems
|
|
* @returns {*}
|
|
*/
|
|
this.showBulkAssignDialog = function (selectedItems) {
|
|
return $modal.open({
|
|
templateUrl: 'views/common/bulk-assign-action-blade.html',
|
|
controller: 'BulkAssignController',
|
|
windowClass: 'action-blade',
|
|
backdrop: 'custom',
|
|
resolve: {
|
|
assignParams: function () {
|
|
return {
|
|
selectedItems: selectedItems
|
|
};
|
|
}
|
|
}
|
|
});
|
|
};
|
|
this.showShareDialog = function (tickets) {
|
|
return $modal.open({
|
|
templateUrl: 'views/common/share-action-blade.html',
|
|
controller: 'ShareController',
|
|
windowClass: 'action-blade',
|
|
resolve: {
|
|
shareParams: function () {
|
|
return {
|
|
actionItems: _.isArray(tickets) ? tickets : [tickets]
|
|
};
|
|
}
|
|
}
|
|
});
|
|
};
|
|
this.showEditStatusDialog = function (tickets, isDraft, isReopen) {
|
|
return $modal.open({
|
|
templateUrl: 'views/ticket/edit-status-action-blade.html',
|
|
windowClass: 'action-blade',
|
|
controller: 'EditStatusController',
|
|
keyboard: 'custom',
|
|
backdrop: 'custom',
|
|
resolve: {
|
|
editStatusParams: function () {
|
|
return {
|
|
actionItems: _.isArray(tickets) ? tickets : [tickets],
|
|
isDraft: isDraft,
|
|
isReopen: isReopen
|
|
};
|
|
}
|
|
}
|
|
});
|
|
};
|
|
this.showLinkDialog = function (tickets, isDraft) {
|
|
return $modal.open({
|
|
templateUrl: 'views/ticket/link-item-action-blade.html',
|
|
windowClass: 'action-blade',
|
|
controller: 'LinkController',
|
|
resolve: {
|
|
linkParams: function () {
|
|
return {
|
|
selectedItems: tickets,
|
|
isDraft: isDraft,
|
|
linkFromTicketConsole: true
|
|
};
|
|
}
|
|
}
|
|
});
|
|
};
|
|
this.showPlansEditDialog = function (metadata, ticket) {
|
|
return $modal.open({
|
|
templateUrl: 'views/change/documents-action-blade.html',
|
|
windowClass: 'action-blade',
|
|
controller: 'EditChangeRequestPlansController',
|
|
resolve: {
|
|
planEditParams: function () {
|
|
return {
|
|
metadata: metadata,
|
|
ticket: ticket
|
|
};
|
|
}
|
|
}
|
|
});
|
|
};
|
|
this.share = function (ticket) {
|
|
if (ticket.type === EntityVO.TYPE_SERVICEREQUEST || ticket.type === EntityVO.TYPE_SBEREQUEST) {
|
|
this.showShareDialog(ticket).result.then(function () {
|
|
$('.profile-action-bar__item-link').focus();
|
|
}, function () {
|
|
$('.profile-action-bar__item-link').focus();
|
|
});
|
|
}
|
|
else {
|
|
emailModel.createEmail([ticket]);
|
|
}
|
|
};
|
|
this.follow = function (ticket) {
|
|
return followService.follow(ticket);
|
|
};
|
|
this.unfollow = function (ticket) {
|
|
return followService.unfollow(ticket);
|
|
};
|
|
this.showPrintDialog = function ($event, ticket, relationCounters, feed, metadata, screenLayout) {
|
|
var ticketPrintDialog = $modal.open({
|
|
templateUrl: 'views/common/print-action-blade.html',
|
|
controller: 'PrintController',
|
|
windowClass: 'action-blade',
|
|
size: 'extra-lg',
|
|
resolve: {
|
|
params: function () {
|
|
return {
|
|
entity: ticket,
|
|
relationCounters: relationCounters,
|
|
feed: feed,
|
|
metadata: metadata,
|
|
screenLayout: screenLayout
|
|
};
|
|
}
|
|
}
|
|
});
|
|
ticketPrintDialog.result.finally(function () {
|
|
$event.currentTarget.focus();
|
|
});
|
|
};
|
|
this.confirmAction = function (ticket, action, scope) {
|
|
var confirmActionPromise = $q.defer();
|
|
if (ticket.type === EntityVO.TYPE_INCIDENT && action === EntityVO.ACTION_REOPEN) {
|
|
this.showEditStatusDialog(ticket, false, true).result.then(function (statusData) {
|
|
return ticketModel.refreshStatus(ticket.id, ticket.type, statusData);
|
|
}).then(function () {
|
|
confirmActionPromise.resolve();
|
|
});
|
|
}
|
|
else if (ticket.type === EntityVO.TYPE_SERVICEREQUEST && action === EntityVO.ACTION_CANCEL) {
|
|
var modalInstance = systemAlertService.modal({
|
|
title: $filter('i18n')('common.notification.delete.title'),
|
|
text: $filter('i18n')('action.' + action + '.confirm', [$filter('i18n')('common.labels.' + ticket.type)]),
|
|
buttons: [
|
|
{
|
|
text: $filter('i18n')('common.notification.delete.button1'),
|
|
data: true
|
|
},
|
|
{
|
|
text: $filter('i18n')('common.notification.delete.button2'),
|
|
data: false
|
|
}
|
|
]
|
|
});
|
|
var ticketActionServiceContext = this;
|
|
modalInstance.result.then(function (data) {
|
|
if (data) {
|
|
ticketActionServiceContext.applyAction(ticket, action, scope);
|
|
}
|
|
});
|
|
}
|
|
return confirmActionPromise.promise;
|
|
};
|
|
this.applyAction = function (ticket, action, scope) {
|
|
var data = {};
|
|
scope.state.processing = true;
|
|
ticketModel.applyAction(ticket.id, ticket.type, action, data).then(function (response) {
|
|
if (!_.isEmpty(response)) {
|
|
data = response[0].items[0];
|
|
if (ticket.type === EntityVO.TYPE_INCIDENT) {
|
|
if (action === EntityVO.ACTION_REOPEN) {
|
|
$state.go(EntityVO.TYPE_INCIDENT, { id: data.id });
|
|
$timeout(function () {
|
|
systemAlertService.success({
|
|
text: $filter('i18n')('ticket.notification.reopen.message', data.displayId + ': ' + data.summary),
|
|
hide: 10000
|
|
});
|
|
}, 100);
|
|
}
|
|
}
|
|
else if (ticket.type === EntityVO.TYPE_SERVICEREQUEST) {
|
|
if (action === EntityVO.ACTION_REOPEN || action === EntityVO.ACTION_CANCEL) {
|
|
ticket.status = angular.copy(data.status);
|
|
ticketModel.refreshSLA(ticket);
|
|
scope.$emit(events.TICKET_PROFILE_RESEND_EVENT, { eventName: events.REFRESH_ACTIVITY_FEED });
|
|
}
|
|
else if (action === EntityVO.ACTION_REQUESTAGAIN) {
|
|
if (data.isCrossLaunchSubmitted) {
|
|
srdModel.launchAIF(true, // createNew
|
|
false, // historyBackOnCancel
|
|
scope, data.requestTemplateTitle, data.crossLaunchURLCreate, ticket.customer.loginId, ticket.contact ? ticket.contact.loginId : null);
|
|
}
|
|
else {
|
|
ticketModel.cache.draft = new ServiceRequestVO().build(data);
|
|
$state.go('draftServicerequest');
|
|
}
|
|
}
|
|
}
|
|
else if (ticket.type === EntityVO.TYPE_CHANGE) {
|
|
ticket = new ChangeVO().build(response[0].items[0]);
|
|
ticket.plans = angular.copy(ticket.plans);
|
|
scope.$emit(events.AFTER_SAVED_CHANGES, ticket);
|
|
}
|
|
else if (ticket.type === EntityVO.TYPE_RELEASE) {
|
|
ticket = new ReleaseVO().build(response[0].items[0]);
|
|
ticket.plans = angular.copy(ticket.plans);
|
|
scope.basicData = ticket;
|
|
if (ticketModel.cache && ticketModel.cache[ticket.id]) {
|
|
_.extend(ticketModel.cache[ticket.id], ticket);
|
|
}
|
|
}
|
|
var statusField = objectValueMapperService.getFieldByName(ticket.type === EntityVO.TYPE_TASK ? 'taskStatus' : 'status'), memberName = ticket.type === EntityVO.TYPE_TASK ? 'taskStatus' : 'status';
|
|
scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: statusField && statusField.name, memberName: memberName });
|
|
}
|
|
}).finally(function () {
|
|
scope.state.processing = false;
|
|
});
|
|
};
|
|
this.assign = function ($event, singleEditMode, ticket, scope, activeRole) {
|
|
//SW00523909 added check for release type only
|
|
if (ticket.type === EntityVO.TYPE_RELEASE) {
|
|
ticket.assignee = ticket.coordinator;
|
|
ticket.supportGroup = ticket.coordinatorGroup;
|
|
}
|
|
if (singleEditMode) {
|
|
handleAssignmentWithoutSaving(ticket, null, this, scope, activeRole);
|
|
}
|
|
else {
|
|
handleAssignment($event, ticket, null, this, scope, activeRole);
|
|
}
|
|
};
|
|
this.assignToMe = function ($event, role, singleEditMode, ticket, scope) {
|
|
var assigneeRole = role;
|
|
var assigneeSupportGroup = ticket.supportGroup || {};
|
|
var ticketActionServiceContext = this;
|
|
if (role === 'ticketassignee') {
|
|
if (ticket.type === EntityVO.TYPE_WORKORDER) {
|
|
assigneeRole = 'workorderassignee';
|
|
}
|
|
else {
|
|
assigneeRole = '';
|
|
}
|
|
}
|
|
else if (role === 'workordermanager' || role === 'changemanager') {
|
|
assigneeSupportGroup = ticket.managerGroup;
|
|
}
|
|
else if (role === 'problemcoordinator' || role === 'releasecoordinator') {
|
|
assigneeSupportGroup = ticket.coordinatorGroup;
|
|
}
|
|
if (ticket.type === EntityVO.TYPE_ACTIVITY) {
|
|
assigneeRole = "";
|
|
}
|
|
scope.state.AssignToMeIsLoading = true;
|
|
ticketModel.getTicketAssigneePersons(ticket.type, assigneeRole).then(function (persons) {
|
|
persons = _.unique(persons.results, function (person) {
|
|
return person.loginId && person.supportGroupId;
|
|
});
|
|
var person = persons.length === 1 ? persons[0] : _.find(persons, { supportGroupId: assigneeSupportGroup.id });
|
|
if (person && person.loginId) {
|
|
if (singleEditMode) {
|
|
if (['workordermanager', 'changemanager'].indexOf(role) !== -1) {
|
|
_.assign(ticket, {
|
|
manager: {
|
|
id: person.id,
|
|
loginId: person.loginId,
|
|
fullName: person.fullName,
|
|
supportGroup: person.supportGroup,
|
|
groupId: person.supportGroupId,
|
|
company: person.company,
|
|
organization: person.organization
|
|
},
|
|
managerGroup: {
|
|
id: person.supportGroupId,
|
|
name: person.supportGroup,
|
|
organization: person.organization,
|
|
company: person.company
|
|
}
|
|
});
|
|
}
|
|
else if (['problemcoordinator', 'releasecoordinator'].indexOf(role) !== -1) {
|
|
_.assign(ticket, {
|
|
coordinator: {
|
|
id: person.id,
|
|
loginId: person.loginId,
|
|
fullName: person.fullName,
|
|
supportGroup: person.supportGroup,
|
|
groupId: person.supportGroupId,
|
|
company: person.company,
|
|
organization: person.organization
|
|
},
|
|
coordinatorGroup: {
|
|
id: person.supportGroupId,
|
|
name: person.supportGroup,
|
|
organization: person.organization,
|
|
company: person.company
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
_.assign(ticket, {
|
|
assignee: {
|
|
id: person.id,
|
|
loginId: person.loginId,
|
|
fullName: person.fullName,
|
|
supportGroup: person.supportGroup,
|
|
groupId: person.supportGroupId,
|
|
company: person.company,
|
|
organization: person.organization
|
|
},
|
|
group: {
|
|
id: person.supportGroupId,
|
|
name: person.supportGroup,
|
|
organization: person.organization,
|
|
company: person.company
|
|
}
|
|
});
|
|
}
|
|
ticket.autoAssign = false;
|
|
notifyAboutAssignmentUpdate(ticket, ticket, scope, role, true);
|
|
}
|
|
else {
|
|
updateAssignment(person, assigneeRole, ticket, scope);
|
|
}
|
|
}
|
|
else {
|
|
singleEditMode ? handleAssignmentWithoutSaving(ticket, role, ticketActionServiceContext, scope, role) : handleAssignment($event, ticket, role, ticketActionServiceContext, scope);
|
|
}
|
|
}).finally(function () {
|
|
scope.state.AssignToMeIsLoading = false;
|
|
});
|
|
};
|
|
function updateAssignment(person, role, ticket, scope) {
|
|
scope.state.processing = true;
|
|
var attributesMap = {};
|
|
if (role === 'problemcoordinator') {
|
|
attributesMap = {
|
|
coordinatorLoginId: person.loginId,
|
|
coordinatorFullName: person.fullName,
|
|
coordinatorGroup: person.supportGroup,
|
|
coordinatorCompany: person.company.name,
|
|
coordinatorOrganization: person.organization,
|
|
coordinatorGroupId: person.supportGroupId,
|
|
coordinatorAutoAssign: false
|
|
};
|
|
}
|
|
else if (role === 'workordermanager' || role === 'changemanager') {
|
|
attributesMap = {
|
|
managerLoginId: person.loginId,
|
|
managerFullName: person.fullName,
|
|
managerGroup: person.supportGroup,
|
|
managerCompany: person.company.name,
|
|
managerOrganization: person.organization,
|
|
managerGroupId: person.supportGroupId,
|
|
managerAutoAssign: false
|
|
};
|
|
}
|
|
else {
|
|
attributesMap = {
|
|
loginId: person.loginId,
|
|
fullName: person.fullName,
|
|
group: person.supportGroup,
|
|
groupId: person.supportGroupId,
|
|
company: person.company.name,
|
|
organization: person.organization,
|
|
autoAssign: false
|
|
};
|
|
}
|
|
ticketModel.update(ticket.id, ticket.type, attributesMap).then(function (results) {
|
|
if (_.isUndefined(results.data)) {
|
|
var response = {};
|
|
if (ticket.type === EntityVO.TYPE_RELEASE) {
|
|
response = {
|
|
assignee: results.coordinator,
|
|
group: results.supportGroup || results.coordinatorGroup,
|
|
manager: results.manager || results.coordinator,
|
|
managerGroup: results.managerGroup || results.coordinatorGroup,
|
|
status: results.status,
|
|
accessMappings: results.accessMappings
|
|
};
|
|
}
|
|
else {
|
|
response = {
|
|
assignee: results.assignee,
|
|
group: results.supportGroup,
|
|
manager: results.manager || results.coordinator,
|
|
managerGroup: results.managerGroup || results.coordinatorGroup,
|
|
status: results.status,
|
|
accessMappings: results.accessMappings
|
|
};
|
|
}
|
|
completeAssignment(response, ticket, scope);
|
|
}
|
|
else {
|
|
systemAlertService.error({
|
|
text: results.data.error,
|
|
clear: true
|
|
});
|
|
}
|
|
}).finally(function () {
|
|
scope.state.processing = false;
|
|
});
|
|
}
|
|
function handleAssignment($event, ticket, role, ticketActionServiceContext, scope, activeRole) {
|
|
ticketActionServiceContext.showAssignDialog(_.cloneDeep(ticket), false, role, activeRole).result.then(function (result) {
|
|
completeAssignment(result, ticket, scope);
|
|
$event.currentTarget.focus();
|
|
}, function () {
|
|
$event.currentTarget.focus();
|
|
});
|
|
}
|
|
function handleAssignmentWithoutSaving(ticket, role, ticketActionServiceContext, scope, activeRole) {
|
|
ticketActionServiceContext.showAssignDialog(_.cloneDeep(ticket), true, role, activeRole).result.then(function (result) {
|
|
notifyAboutAssignmentUpdate(result, ticket, scope, activeRole);
|
|
}, function (e) {
|
|
$log.error('Could not assign ticket properly. ', e, ticket);
|
|
});
|
|
}
|
|
function completeAssignment(result, ticket, scope) {
|
|
if (result.originalObject && result.originalObject.constructor.name === ticket.constructor.name) {
|
|
ticket = _.extend(result.originalObject, ticket);
|
|
}
|
|
ticket.assignee = result.assignee;
|
|
ticket.supportGroup = result.group;
|
|
if (ticket.supportGroup) {
|
|
delete ticket.supportGroup.assignedToGroup;
|
|
}
|
|
if (!ticket.coordinatorGroup) {
|
|
ticket.coordinatorGroup = {};
|
|
}
|
|
if (!ticket.coordinator) {
|
|
ticket.coordinator = {};
|
|
}
|
|
ticket.manager = result.manager;
|
|
ticket.managerGroup = result.managerGroup;
|
|
if (ticket.managerGroup) {
|
|
delete ticket.managerGroup.assignedToGroup;
|
|
}
|
|
ticket.accessMappings = result.accessMappings;
|
|
ticket.status = result.status;
|
|
if (ticket.type === EntityVO.TYPE_RELEASE) {
|
|
ticket.coordinator = result.assignee;
|
|
}
|
|
if (ticket.type === EntityVO.TYPE_PROBLEM || ticket.type === EntityVO.TYPE_KNOWNERROR) {
|
|
ticket.coordinator = result.manager;
|
|
ticket.coordinatorGroup = result.managerGroup;
|
|
}
|
|
else {
|
|
ticket.coordinator.fullName = result.assignee ? result.assignee.fullName : '';
|
|
ticket.coordinatorGroup.name = result.group ? result.group.name : '';
|
|
}
|
|
screenConfigurationModel.updateTicketData(ticket, result.changes);
|
|
if (ticketModel.cache && ticketModel.cache[ticket.id]) {
|
|
_.extend(ticketModel.cache[ticket.id], ticket);
|
|
}
|
|
var targetPanelId = screenConfigurationModel.composePanelId(ticket.type, 'Assignment');
|
|
console.log('target panel id : ' + targetPanelId);
|
|
scope.$broadcast(events.REFRESH_FIELD_VALUES, { panelId: targetPanelId });
|
|
scope.$broadcast(events.AFTER_SAVED_CHANGES, ticket);
|
|
scope.$broadcast(events.TICKET_ASSIGNEES_UPDATED, ticket, true);
|
|
//Fix for SW00537558
|
|
scope.$broadcast(events.TICKET_ASSIGNEES_UPDATED_FROM_BLADE, ticket, true);
|
|
}
|
|
/**
|
|
* This method is handling assignment updates when single edit mode is on.
|
|
* @param {Object} changes
|
|
*/
|
|
function notifyAboutAssignmentUpdate(changes, ticket, scope, assigneeRole, fromAssignToMe) {
|
|
ticket.assignee = changes.assignee;
|
|
ticket.supportGroup = changes.group || changes.supportGroup;
|
|
ticket.manager = changes.manager;
|
|
ticket.managerGroup = changes.managerGroup;
|
|
ticket.coordinator = ticket.coordinator || {};
|
|
ticket.coordinator.fullName = changes.assignee ? changes.assignee.fullName : '';
|
|
ticket.coordinatorGroup = ticket.coordinatorGroup || {};
|
|
ticket.coordinatorGroup.name = changes.group ? changes.group.name : '';
|
|
if (ticket.type === EntityVO.TYPE_RELEASE) {
|
|
ticket.coordinator.id = changes.assignee.id;
|
|
}
|
|
if (ticket.type === EntityVO.TYPE_PROBLEM || ticket.type === EntityVO.TYPE_KNOWNERROR) {
|
|
ticket.coordinator = changes.manager;
|
|
ticket.coordinatorGroup = changes.managerGroup;
|
|
}
|
|
if (changes.autoAssign) {
|
|
ticket.assignee = {
|
|
autoAssign: true
|
|
};
|
|
ticket.supportGroup = {};
|
|
}
|
|
if (changes.managerAutoAssign) {
|
|
ticket.manager = {
|
|
managerAutoAssign: true
|
|
};
|
|
ticket.managerGroup = {};
|
|
}
|
|
if (changes.coordinatorAutoAssign) {
|
|
ticket.coordinator = {
|
|
coordinatorAutoAssign: true
|
|
};
|
|
ticket.coordinatorGroup = {};
|
|
}
|
|
scope.$broadcast(events.TICKET_ASSIGNEES_UPDATED, _.cloneDeep(ticket), false, assigneeRole, fromAssignToMe);
|
|
//Fix for SW00537558
|
|
scope.$broadcast(events.TICKET_ASSIGNEES_UPDATED_FROM_BLADE, ticket, true);
|
|
}
|
|
}]);
|
|
})();
|