SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/ticket/assign-controller.js

358 lines
23 KiB
JavaScript

"use strict";
/**
* Created by igor.samulenko on 6/26/2014.
*/
(function () {
'use strict';
angular.module('ticketModule').controller('AssignController', ['$scope', '$modalInstance', 'userModel', 'screenConfigurationModel', 'ticketService', 'assignParams', 'events', 'systemAlertService', '$q', 'i18nService', 'objectValueMapperService',
function ($scope, $modalInstance, userModel, screenConfigurationModel, ticketService, assignParams, events, systemAlertService, $q, i18nService, objectValueMapperService) {
var state = {
processing: false,
isDraft: assignParams.isDraft,
ghostEntity: !!assignParams.ticket.ghostEntity
}, curAssignee, curAssigneeLoginId, curSupportGroup;
$scope.hideTabOnExpression = {
changeManager: false,
changeCoordinator: false
};
$scope.ticket = _.cloneDeep(assignParams.ticket);
$scope.ticketRef = assignParams.ticket;
$scope.isDraft = assignParams.isDraft;
if (assignParams.role) {
$scope[assignParams.role] = true;
$scope['assign' + assignParams.role] = true;
}
else if (assignParams.activeRole) {
$scope[assignParams.activeRole] = true;
}
var selectedAssignee = {
group: $scope.ticket.supportGroup && $scope.ticket.supportGroup.id ? new SupportGroupVO().build($scope.ticket.supportGroup) : {},
person: $scope.ticket.assignee && $scope.ticket.assignee.loginId ? new PersonVO().build($scope.ticket.assignee) : {},
isGroup: $scope.ticket.supportGroup && $scope.ticket.supportGroup.id && !$scope.ticket.assignee.loginId,
autoAssign: false
};
if ($scope.ticket.type === EntityVO.TYPE_INCIDENT || $scope.ticket.type === EntityVO.TYPE_WORKORDER
|| $scope.ticket.type === EntityVO.TYPE_TASK) {
curAssignee = objectValueMapperService.getValueByFieldName('assignee') || objectValueMapperService.getValueByFieldName('assigneeName');
curSupportGroup = objectValueMapperService.getValueByFieldName('assigneeSupportGroups') || objectValueMapperService.getValueByFieldName('supportGroups');
assignParams.ticket.assignee = curAssignee;
assignParams.ticket.supportGroup = curSupportGroup;
selectedAssignee = {
group: curSupportGroup && curSupportGroup.id ? curSupportGroup : selectedAssignee.group,
person: curAssignee && curAssignee.loginId ? curAssignee : selectedAssignee.person,
isGroup: curSupportGroup && curSupportGroup.id && !(curAssignee && curAssignee.loginId) || selectedAssignee.isGroup,
autoAssign: false
};
}
else if ($scope.ticket.type === EntityVO.TYPE_CHANGE) {
curAssignee = objectValueMapperService.getFieldByName('changeCoordinator') || objectValueMapperService.getFieldByName('assigneeName');
curSupportGroup = objectValueMapperService.getFieldByName('changeCoordinatorSupportGroups');
$scope.hideTabOnExpression.changeCoordinator = curAssignee.isReadOnly && curSupportGroup.isReadOnly;
if (curAssignee.assigneeLoginId) {
curAssigneeLoginId = curAssignee.assigneeLoginId;
}
curAssignee = curAssignee.value;
curSupportGroup = curSupportGroup.value;
selectedAssignee = {
group: curSupportGroup && curSupportGroup.id ? curSupportGroup : selectedAssignee.group,
person: curAssignee && curAssignee.loginId ? curAssignee : selectedAssignee.person,
isGroup: curSupportGroup && curSupportGroup.id && curAssignee && !curAssignee.loginId && !curAssigneeLoginId,
autoAssign: false
};
}
var selectedManager = {
group: $scope.ticket.managerGroup && $scope.ticket.managerGroup.id ? new SupportGroupVO().build($scope.ticket.managerGroup) : {},
person: $scope.ticket.manager && $scope.ticket.manager.loginId ? new PersonVO().build($scope.ticket.manager) : {},
isGroup: $scope.ticket.managerGroup && $scope.ticket.managerGroup.id && !$scope.ticket.manager.loginId,
autoAssign: false
};
var currentManager = assignParams.ticket.manager || assignParams.ticket.coordinator, currentManagerGroup = assignParams.ticket.managerGroup || assignParams.ticket.coordinatorGroup;
if ($scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) {
selectedManager = {
group: currentManagerGroup && currentManagerGroup.id ? new SupportGroupVO().build(currentManagerGroup) : {},
person: currentManager && currentManager.loginId ? new PersonVO().build(currentManager) : {},
isGroup: currentManagerGroup && currentManagerGroup.id && !currentManager.loginId,
autoAssign: false
};
}
if ($scope.ticket.type === EntityVO.TYPE_CHANGE) {
var curChangeManager = objectValueMapperService.getFieldByName('changeManager') || objectValueMapperService.getFieldByName('managerName'), curChangeManagerSupportGroup = objectValueMapperService.getFieldByName('changeManagerSupportGroups'), curChangeManagerLoginId;
$scope.hideTabOnExpression.changeManager = curChangeManager.isReadOnly && curChangeManagerSupportGroup.isReadOnly;
if (curChangeManager.assigneeLoginId) {
curChangeManagerLoginId = curChangeManager.assigneeLoginId;
}
curChangeManager = curChangeManager.value;
curChangeManagerSupportGroup = curChangeManagerSupportGroup.value;
selectedManager = {
group: curChangeManagerSupportGroup && curChangeManagerSupportGroup.id ? curChangeManagerSupportGroup : selectedManager.group,
person: curChangeManager && curChangeManager.loginId ? curChangeManager : selectedManager.person,
isGroup: curChangeManagerSupportGroup && curChangeManagerSupportGroup.id && curChangeManager && !curChangeManager.loginId && !curChangeManagerLoginId,
autoAssign: false
};
}
else if ($scope.ticket.type === EntityVO.TYPE_WORKORDER) {
var curRequestManager = objectValueMapperService.getFieldByName('requestManager') || objectValueMapperService.getFieldByName('managerName'), curRequestManagerSupportGroup = objectValueMapperService.getFieldByName('requestManagerSupportGroups');
$scope.hideTabOnExpression.requestManager = curRequestManager && curRequestManager.isReadOnly && curRequestManagerSupportGroup && curRequestManagerSupportGroup.isReadOnly;
if (curRequestManager) {
curRequestManager = curRequestManager.value;
}
if (curRequestManagerSupportGroup) {
curRequestManagerSupportGroup = curRequestManagerSupportGroup.value;
}
selectedManager = {
group: curRequestManagerSupportGroup && curRequestManagerSupportGroup.id ? curRequestManagerSupportGroup : selectedManager.group,
person: curRequestManager && curRequestManager.loginId ? curRequestManager : selectedManager.person,
isGroup: curRequestManagerSupportGroup && curRequestManagerSupportGroup.id && !(curRequestManager && curRequestManager.loginId) || selectedManager.isGroup,
autoAssign: false
};
}
var panel = screenConfigurationModel.getAssignmentPanel($scope.ticket);
var clonedPanel = angular.copy(panel);
var fields = panel.fields || [];
$scope.hideTabs = fields.length === 0 &&
$scope.ticket.type !== EntityVO.TYPE_WORKORDER &&
$scope.ticket.type !== EntityVO.TYPE_CHANGE &&
$scope.ticket.type !== EntityVO.TYPE_PROBLEM &&
$scope.ticket.type !== EntityVO.TYPE_KNOWNERROR;
$scope.groups = [];
var editedFields = clonedPanel.fields || [];
screenConfigurationModel.initFieldValues(editedFields, $scope.ticket);
$scope.customFields = editedFields;
var originalCustomFields = angular.copy(assignParams.ticket.customFields);
function handleFieldFormIsDirty() {
$scope.customFieldFormIsDirty = true;
$scope.customFieldFormIsValid = clonedPanel.isValid();
}
function assigneeCandidateSelected(selection) {
return selection.person.loginId || selection.isGroup;
}
function handleModalFormIsDirty() {
$scope.assignActionForm.$dirty = true;
}
function handleModalBackdropClick() {
$scope.close();
}
$scope.close = function () {
if ($scope.assignActionForm.$dirty) {
var modalInstance = systemAlertService.modal({
title: i18nService.getLocalizedString('common.notification.dirty.title'),
text: i18nService.getLocalizedString('common.notification.dirty.message'),
buttons: [
{
text: i18nService.getLocalizedString('common.labels.yes'),
data: true
},
{
text: i18nService.getLocalizedString('common.labels.no'),
data: false
}
]
});
modalInstance.result.then(function (data) {
if (data) {
assignParams.ticket = _.cloneDeep($scope.ticket);
$modalInstance.dismiss();
}
});
}
else {
assignParams.ticket = _.cloneDeep($scope.ticket);
$modalInstance.dismiss();
}
};
$scope.enableSave = function () {
return (selectedAssignee.person.loginId && selectedAssignee.person.supportGroupId && (!assignParams.ticket.assignee || selectedAssignee.person.loginId !== assignParams.ticket.assignee.loginId || selectedAssignee.person.supportGroupId !== assignParams.ticket.supportGroup.id))
|| (selectedAssignee.isGroup && ((assignParams.ticket.assignee && assignParams.ticket.assignee.id) || (!curSupportGroup || (selectedAssignee.group.id !== curSupportGroup.id))))
|| selectedAssignee.autoAssign
|| (selectedManager.person.loginId && selectedManager.person.supportGroupId && (selectedManager.person.loginId !== (currentManager || {}).loginId || selectedManager.person.supportGroupId !== (currentManagerGroup || {}).id))
|| (selectedManager.isGroup && (currentManager && currentManager.id || (!currentManagerGroup || (selectedManager.group.id !== currentManagerGroup.id))))
|| selectedManager.autoAssign
|| $scope.customFieldFormIsDirty && $scope.customFieldFormIsValid;
};
$scope.submit = function () {
state.processing = true;
var updates = {};
var attributesMap = {};
if (assigneeCandidateSelected(selectedAssignee) && !selectedAssignee.autoAssign) {
if (selectedAssignee.isGroup) {
if (selectedAssignee.group && $scope.ticket.supportGroup) {
if ((selectedAssignee.person.loginId !== $scope.ticket.assignee.loginId) || (selectedAssignee.group.id !== $scope.ticket.supportGroup.id)) {
attributesMap = {
group: selectedAssignee.group.name,
groupId: selectedAssignee.group.id,
company: selectedAssignee.group.company.name,
organization: selectedAssignee.group.organization,
autoAssign: false
};
}
selectedAssignee.person = {};
}
}
else {
if (selectedAssignee.group.id === 'All') {
if (selectedAssignee.person.supportGroups && selectedAssignee.person.supportGroups.length > 0) {
if (selectedAssignee.person.supportGroupId) {
selectedAssignee.group = _.find(selectedAssignee.person.supportGroups, { id: selectedAssignee.person.supportGroupId });
}
selectedAssignee.group = selectedAssignee.group || selectedAssignee.person.supportGroups[0];
}
else if ($scope.ticket.supportGroup && $scope.ticket.supportGroup.id) {
selectedAssignee.group = new SupportGroupVO().build($scope.ticket.supportGroup);
}
}
if (selectedAssignee.person.loginId !== $scope.ticket.assignee.loginId || selectedAssignee.group.id !== $scope.ticket.supportGroup.id) {
attributesMap = {
loginId: selectedAssignee.person.loginId,
fullName: selectedAssignee.person.fullName,
group: selectedAssignee.group && selectedAssignee.group.name ? selectedAssignee.group.name : '',
groupId: selectedAssignee.group && selectedAssignee.group.id ? selectedAssignee.group.id : '',
company: selectedAssignee.group && selectedAssignee.group.company && selectedAssignee.group.company.name ? selectedAssignee.group.company.name : '',
organization: selectedAssignee.group && selectedAssignee.group.organization ? selectedAssignee.group.organization : '',
autoAssign: false
};
}
}
}
else {
attributesMap = {
autoAssign: true
};
selectedAssignee = { person: {}, group: {} };
}
var managerAttributesMap = {};
if (assigneeCandidateSelected(selectedManager) && !selectedManager.autoAssign) {
if (selectedManager.isGroup) {
if ($scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) {
if (selectedManager.group.id !== $scope.ticket.coordinatorGroup.id || (selectedManager.person.loginId !== ($scope.ticket.coordinator && $scope.ticket.coordinator.loginId))) {
managerAttributesMap = {
coordinatorGroup: selectedManager.group.name,
coordinatorCompany: selectedManager.group.company.name,
coordinatorOrganization: selectedManager.group.organization,
coordinatorGroupId: selectedManager.group.id,
coordinatorAutoAssign: false
};
}
}
else {
if ((selectedManager.person.loginId !== ($scope.ticket.manager && $scope.ticket.manager.loginId))
|| (selectedManager.group.id !== ($scope.ticket.managerGroup && $scope.ticket.managerGroup.id))) {
managerAttributesMap = {
managerGroup: selectedManager.group.name,
managerCompany: selectedManager.group.company.name,
managerOrganization: selectedManager.group.organization,
managerGroupId: selectedManager.group.id,
managerAutoAssign: false
};
}
selectedManager.person = {};
}
}
else {
if (selectedManager.group.id === 'All') {
if (selectedManager.person.supportGroups && selectedManager.person.supportGroups.length > 0) {
if (selectedManager.person.supportGroupId) {
selectedManager.group = _.find(selectedManager.person.supportGroups, { id: selectedManager.person.supportGroupId });
}
selectedManager.group = selectedManager.group || selectedManager.person.supportGroups[0];
}
else if (currentManagerGroup && currentManagerGroup.id) {
selectedManager.group = new SupportGroupVO().build(currentManagerGroup);
}
}
if ($scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) {
managerAttributesMap = {
coordinatorLoginId: selectedManager.person.loginId,
coordinatorFullName: selectedManager.person.fullName,
coordinatorGroup: selectedManager.group.name,
coordinatorCompany: selectedManager.group.company.name,
coordinatorOrganization: selectedManager.group.organization,
coordinatorGroupId: selectedManager.group.id,
coordinatorAutoAssign: false
};
}
else {
managerAttributesMap = {
managerLoginId: selectedManager.person.loginId,
managerFullName: selectedManager.person.fullName,
managerGroup: selectedManager.group.name,
managerCompany: selectedManager.group.company.name,
managerOrganization: selectedManager.group.organization,
managerGroupId: selectedManager.group.id,
managerAutoAssign: false
};
}
}
}
else {
managerAttributesMap = ($scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) ? { coordinatorAutoAssign: true } : { managerAutoAssign: true };
}
updates = _.merge(attributesMap, managerAttributesMap);
if (fields.length) {
var changes = screenConfigurationModel.collectChanges($scope.customFields, originalCustomFields);
if (_.size(changes)) {
updates = _.merge(updates, { customFields: changes });
}
}
var updateFn = state.isDraft ? $q.when : ticketService.update;
updateFn($scope.ticket.id, $scope.ticket.type, updates).then(function (results) {
var response = {
originalObject: results,
autoAssign: updates.autoAssign,
assignee: (results && results.assignee) || selectedAssignee.person,
group: selectedAssignee.group,
managerAutoAssign: updates.managerAutoAssign,
manager: selectedManager.person,
managerGroup: selectedManager.group,
coordinatorAutoAssign: updates.coordinatorAutoAssign
};
response.group.assignedToGroup = selectedAssignee.isGroup;
response.managerGroup.assignedToGroup = selectedManager.isGroup;
if (!state.isDraft && !_.isEmpty(results)) {
response.accessMappings = results.accessMappings || {};
response.status = results.status || {};
response.changes = results.customFields || {};
if (updates.autoAssign) {
response.assignee = results.assignee || {};
response.group = results.supportGroup || {};
}
if (updates.coordinatorAutoAssign) {
response.manager = results.coordinator;
response.managerGroup = results.coordinatorGroup;
}
if (updates.managerAutoAssign) {
response.manager = results.manager;
response.managerGroup = results.managerGroup;
}
}
else if (state.isDraft && !_.isUndefined(updates.customFields)) {
response.changes = updates.customFields;
}
response.group.persons = [];
if (updates.customFields) {
_.forOwn(updates.customFields, function (val, key) {
if (typeof response.changes[key] === 'undefined') {
response.changes[key] = '';
}
});
}
$modalInstance.close(response);
}).finally(function () {
state.processing = false;
});
};
$scope.$on(events.FIELD_FORM_IS_DIRTY, handleFieldFormIsDirty);
$scope.$on(events.MODAL_FORM_IS_DIRTY, handleModalFormIsDirty);
$scope.$on(events.MODAL_BACKDROP_CLICK, handleModalBackdropClick);
$scope.selectedAssignee = selectedAssignee;
$scope.selectedManager = selectedManager;
$scope.state = state;
//Set $dirty true for the first time the blade is loaded.
setTimeout(function () {
if ($scope.assignActionForm) {
$scope.assignActionForm.$dirty = false;
}
}, 0);
}
]);
})();