"use strict"; /** * Created by ygowtham on 7/23/2015. */ (function () { 'use strict'; angular.module('createTicketModule') .controller('CreateKnownErrorController', ['$scope', '$modal', '$state', '$q', '$filter', 'userModel', 'searchModel', 'events', 'createTicketModel', 'ticketModel', 'systemAlertService', 'metadataModel', 'ticketActionService', 'categoriesService', 'screenConfigurationModel', 'configurationModel', '$timeout', function ($scope, $modal, $state, $q, $filter, userModel, searchModel, events, createTicketModel, ticketModel, systemAlertService, metadataModel, ticketActionService, categoriesService, screenConfigurationModel, configurationModel, $timeout) { if (!configurationModel.isServerApplicationEnabled(EntityVO.TYPE_KNOWNERROR)) { $state.go('unauthorized'); return; } $scope.currentDate = new Date(); var ke = { type: EntityVO.TYPE_KNOWNERROR, autoAssign: true, coordinatorAutoAssign: true, customFields: {}, targetDateDatePicker: { open: false } }; var keMetadata = {}; function init() { $scope.state = { dataIsLoading: true, tooManyCompanies: false, assigneeLoading: true, initialLoading: true }; $scope.datePickerOptions = { startingDay: configurationModel.getWeekStartingDay(), 'show-weeks': false, minDate: moment().year(1970).month(0).date(2), maxDate: moment().year(2038).month(0).date(18) }; $scope.selections = {}; $scope.siteOptions = { company: { visible: false, attribute: 'companyName' }, region: { attribute: 'region' }, siteGroup: { attribute: 'siteGroup' }, site: { attribute: 'name' } }; $scope.formContainsInvalidFields = createTicketModel.formContainsInvalidFields; createTicketModel.currentTicket = ke; $scope.ke = ke; $scope.keMetadata = keMetadata; $scope.loggedInUserId = userModel.decodedUserId || userModel.userId; $scope.isNew = true; $scope.company = {}; if (userModel.userFullData.availableForAssignment) { $scope.availableForAssignment = userModel.userFullData.availableForAssignment; } else { userModel.getFullCurrentUserData().then(function () { $scope.availableForAssignment = userModel.userFullData.availableForAssignment; }); } initAlertForDirtyForm(); var metadataPromise = metadataModel.getMetadataByType(EntityVO.TYPE_KNOWNERROR), basicDataPromise = ticketModel.getDraft(EntityVO.TYPE_KNOWNERROR); $q.all([metadataPromise, basicDataPromise]).then(function (responses) { var data = responses[1]; angular.extend(keMetadata, responses[0]); ke.selectedStatus = _.head(keMetadata.statuses); $scope.updateStatusReason(); ke.selectedImpact = _.last(keMetadata.impacts); ke.selectedUrgency = _.last(keMetadata.urgencies); ke.selectedViewAccess = _.last(keMetadata.viewAccesses); ke.id = data.id; ke.displayId = data.displayId; ke.categorizations = data.categorizations; ke.accessMappings = data.accessMappings; ke.company = data.company; ke.supportGroup = data.supportGroup ? data.supportGroup : {}; ke.coordinatorGroup = data.coordinatorGroup ? data.coordinatorGroup : {}; ke.type = data.type; ke.location = data.location ? data.location : {}; if (data.coordinator) { ke.coordinator = data.coordinator; $scope.ke.coordinatorAutoAssign = false; } else { ke.coordinator = {}; } if (data.assignee) { ke.assignee = data.assignee; $scope.ke.autoAssign = false; } else { ke.assignee = {}; } $scope.state.assigneeLoading = false; }) .finally(function () { $scope.state.dataIsLoading = false; $scope.state.initialLoading = false; }); var userPromise = userModel.getFullCurrentUserData().then(function () { $scope.setCompany(userModel.userFullData); }); var searchCompanyPromise = searchModel.getOperatingCompanies(null, -1).then(function (response) { $scope.selections.companies = _.cloneDeep(response.companies); $scope.state.tooManyCompanies = response.exceedsChunkSize; }); var customFieldLabelsPromise = screenConfigurationModel .loadScreenConfigurationAndCustomFieldLabels(ScreenConfigurationVO.prototype.KNOWN_ERROR_DETAILS_SCREEN, EntityVO.TYPE_KNOWNERROR); $q.all([metadataPromise, basicDataPromise, userPromise, customFieldLabelsPromise, searchCompanyPromise]).then(function () { ke.allCategories = _.cloneDeep(categoriesService.populateCategories(ke.categorizations, keMetadata)); var fields = screenConfigurationModel.getEditableFieldsForScreen(ScreenConfigurationVO.prototype.KNOWN_ERROR_DETAILS_SCREEN); $scope.customFields = angular.copy(fields); getRootCause(null, ke.categorizations); }); } $scope.getList = function (type, term) { if (type === 'service' || type === 'asset') { return createTicketModel.getList(type, term, EntityVO.TYPE_KNOWNERROR).then(function (response) { if (type === 'service') { $scope.exceedsChunkSizeService = response.exceedsChunkSize; $scope.isTooltipOpenService = true; } else if (type === 'asset') { $scope.exceedsChunkSizeAsset = response.exceedsChunkSize; $scope.isTooltipOpenAsset = true; } $timeout(function () { $scope.isTooltipOpenService = false; $scope.isTooltipOpenAsset = false; }, 10000); return response.objects; }); } else { return createTicketModel.getList(type, term); } }; $scope.onInputFocusBlur = function () { $scope.isTooltipOpenService = false; $scope.isTooltipOpenAsset = false; }; $scope.setCompany = function (userdata) { $scope.ke.company = userdata.company; $scope.ke.location = {}; $scope.ke.location.companyName = $scope.ke.company.name; $scope.company = _.cloneDeep($scope.ke.company); }; $scope.updateCompany = function () { showCompanyChangeDialog().then(function (result) { if (result) { $scope.ke.company = _.cloneDeep($scope.company); $scope.$broadcast(events.CLEAR_FOUNDATION_SERVICE, $scope.ke.company); $scope.$broadcast(events.CLEAR_CATEGORY_DETAILS, $scope.ke.company); $scope.ke.location.companyName = $scope.ke.company.name; ke.selectedService = ''; ke.selectedAsset = ''; if (!$scope.ke.coordinatorAutoAssign) { ke.coordinator = {}; } if (!ke.autoAssign) { ke.assignee = {}; } } else { $scope.company = $scope.ke.company; } }); }; $scope.getCompaniesByName = function (name) { return searchModel.getCompaniesByText(name).then(function (response) { return { list: response.companies, exceedsChunkSize: response.exceedsChunkSize }; }); }; function showCompanyChangeDialog() { var modal = systemAlertService.modal({ type: 'info', title: $filter('i18n')('common.notification.dirty.title'), text: $filter('i18n')('create.knownerror.companyChange.warning'), buttons: [ { text: $filter('i18n')('common.button.yes'), data: true }, { text: $filter('i18n')('common.button.no'), data: false } ] }); return modal.result; } $scope.$watch('ke.company', function () { $scope.updatePriority(); }); $scope.updatePriority = function () { if (ke.company && ke.selectedImpact && ke.selectedUrgency) { ticketModel.getPriority(ke.company.name, ke.selectedImpact.name, ke.selectedUrgency.name, EntityVO.TYPE_KNOWNERROR).then(function (data) { ke.calculatedPriority = _.find(keMetadata.priorities, { name: data }); if (!ke.calculatedPriority) { systemAlertService.error({ text: $filter('i18n')('ticket.​calculationError.calculatedPriority'), clear: false }); } }); } }; $scope.clearAssignment = function () { ke.autoAssign = true; ke.assignee = {}; ke.supportGroup = {}; }; $scope.clearCoordinator = function () { ke.coordinatorAutoAssign = true; ke.coordinator = {}; ke.coordinatorGroup = {}; }; $scope.clearSelectedService = function () { ke.selectedService = ''; }; $scope.clearSelectedAsset = function () { ke.selectedAsset = ''; }; $scope.assign = function ($event) { handleAssignment($event); }; $scope.assignToMe = function ($event, role) { var assigneeRole = role; var assigneeSupportGroup = ke.supportGroup; if (role === 'ticketassignee') { assigneeRole = ''; } else if (role === 'problemcoordinator') { assigneeSupportGroup = ke.coordinatorGroup; } var locationCompany = null, customerCompany, primaryCompany = ke.company; primaryCompany = primaryCompany ? primaryCompany.name : ''; customerCompany = (ke.customer && ke.customer.company) ? ke.customer.company.name : (ke.company ? ke.company.name : ''); locationCompany = ke.locationCompany ? ke.locationCompany.name : null; ticketModel.getTicketAssigneePersonsBySearchText(assigneeRole, customerCompany, locationCompany, null, primaryCompany, null).then(function (persons) { persons = _.uniqBy(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) { updateAssignment(person, assigneeRole); } else { handleAssignment($event, role); } }); }; function handleAssignment($event, role) { ke.ghostEntity = true; ticketActionService.showAssignDialog(ke, true, role).result.then(function (result) { completeAssignment(result); $event.currentTarget.focus(); }, function () { $event.currentTarget.focus(); }); } function updateAssignment(person, role) { var response = {}; if (role === 'problemcoordinator') { response.manager = { id: person.id, loginId: person.loginId, fullName: person.fullName, thumbnailMime: person.thumbnailMime, thumbnail: person.thumbnail }; response.managerGroup = { id: person.supportGroupId, name: person.supportGroup, organization: person.organization, company: person.company }; } else { response.assignee = { id: person.id, loginId: person.loginId, fullName: person.fullName, thumbnailMime: person.thumbnailMime, thumbnail: person.thumbnail }; response.group = { id: person.supportGroupId, name: person.supportGroup, organization: person.organization, company: person.company }; } completeAssignment(response); } function completeAssignment(result) { if (result.autoAssign) { $scope.clearAssignment(); } else if (result.group) { $scope.ke.autoAssign = false; $scope.ke.assignee = result.assignee; $scope.ke.supportGroup = result.group; } if (result.coordinatorAutoAssign) { $scope.clearCoordinator(); } else if (result.managerGroup) { $scope.ke.coordinatorAutoAssign = false; $scope.ke.coordinator = result.manager; $scope.ke.coordinatorGroup = result.managerGroup; } } $scope.createKE = function () { $scope.state.dataIsLoading = true; ke.summary = ke.summary.replace(/\u00a0/g, ' '); var initialCategorizations = _.cloneDeep(ke.categorizations); ke.categorizations = categoriesService.collectValues(ke.allCategories, $scope.ke).categorizations; createTicketModel.createKE().then(function (error) { if (error) { $scope.state.dataIsLoading = false; ke.categorizations = _.cloneDeep(initialCategorizations); systemAlertService.error({ text: error, clear: true }); } }); }; $scope.cancel = function () { $state.go('dashboard'); }; $scope.needResolutionNote = function () { return ~[EntityVO.STATUS_CLOSED, EntityVO.STATUS_RESOLVED].indexOf(ke.selectedStatus.name.toLowerCase()); }; function isFormDirty() { return $scope.createKnownerrorForm.$dirty || !_.isEmpty(ke.attachments); } function initAlertForDirtyForm() { $scope.$on('$stateChangeStart', function (event, toState, toParams) { if (isFormDirty() && toState.name !== EntityVO.TYPE_KNOWNERROR) { event.preventDefault(); var modalInstance = systemAlertService.modal({ title: $filter('i18n')('common.notification.dirty.title'), text: $filter('i18n')('common.notification.dirty.message'), buttons: [ { text: $filter('i18n')('common.labels.yes'), data: { stateName: toState.name, stateParams: toParams } }, { text: $filter('i18n')('common.labels.no') } ] }); modalInstance.result.then(function (data) { if (!_.isEmpty(data)) { createTicketModel.currentTicket = ke = {}; $scope.createKnownerrorForm.$setPristine(); $state.transitionTo(data.stateName, data.stateParams); } }); } }); } $scope.updateStatusReason = function () { if (!_.isEmpty(ke.selectedStatus.statusReasons)) { ke.selectedStatusReason = _.head(ke.selectedStatus.statusReasons); } }; $scope.openDatePicker = function (calendar) { calendar.open = true; }; $scope.updateDateTime = function (key) { if (key) { // if ((broadcast[key + 'Date'] && !broadcast[key + 'Time']) || (!broadcast[key + 'Date'] && broadcast[key + 'Time'])) { // broadcast[key + 'Time'] = _.clone(broadcast[key + 'Date']); // } } }; function getRootCause(event, data) { var params = {}; var company = { name: $scope.ke.company.name }; params.depends = categoriesService.buildCategoriesForRootCause(data, $scope.keMetadata.allCategories); params.depends.productManufacturer = null; ticketModel.getRootCause(params, company).then(function (response) { if (response) { $scope.selections.rootCause = response; } }); } $scope.$watch('ke.selectedService', function () { if ($scope.ke && _.isObject($scope.ke.selectedService)) { $scope.ke.impactedService = $scope.ke.selectedService; $scope.$emit(events.AFFECTED_SERVICE_UPDATED, $scope.ke.selectedService); } }); $scope.$on(events.TICKET_UPDATE_ROOTCAUSE, getRootCause); init(); } ]); })();