"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.isReadOnly && curRequestManagerSupportGroup.isReadOnly; curRequestManager = curRequestManager.value; 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 || selectedAssignee.autoAssign || (selectedManager.person.loginId && selectedManager.person.supportGroupId && (selectedManager.person.loginId !== (currentManager || {}).loginId || selectedManager.person.supportGroupId !== (currentManagerGroup || {}).id)) || selectedManager.isGroup || 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); } ]); })();