SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/known-error/create-knownerror-controlle...

394 lines
19 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

"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();
}
]);
})();