SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/problem/create-problem-controller.js

403 lines
21 KiB
JavaScript
Raw 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('createProblemModule')
.controller('CreateProblemController', ['$scope', '$modal', '$state', 'userModel', '$filter', 'searchModel', 'events', 'createTicketModel',
'screenConfigurationModel', 'ticketModel', 'i18nService', 'systemAlertService', 'categoriesService', '$q',
'metadataModel', 'ticketActionService', 'fieldValidationModel', 'configurationModel', '$timeout',
function ($scope, $modal, $state, userModel, $filter, searchModel, events, createTicketModel, screenConfigurationModel, ticketModel, i18nService, systemAlertService, categoriesService, $q, metadataModel, ticketActionService, fieldValidationModel, configurationModel, $timeout) {
if (!configurationModel.isServerApplicationEnabled(EntityVO.TYPE_PROBLEM)) {
$state.go('unauthorized');
return;
}
$scope.currentDate = new Date();
var problem = {
type: EntityVO.TYPE_PROBLEM,
autoAssign: true,
coordinatorAutoAssign: true,
customFields: {}
};
$scope.datePickerOptions = {
startingDay: configurationModel.getWeekStartingDay(),
'show-weeks': false,
minDate: moment().year(1970).month(0).date(2),
maxDate: moment().year(2038).month(0).date(18)
};
var problemMetadata = {};
function init() {
$scope.state = {
dataIsLoading: true,
tooManyCompanies: false,
assigneeLoading: true,
initialLoading: true
};
$scope.selections = {};
$scope.siteOptions = {
company: {
visible: false,
attribute: 'companyName'
},
region: {
attribute: 'region'
},
siteGroup: {
attribute: 'siteGroup'
},
site: {
attribute: 'name'
}
};
$scope.formContainsInvalidFields = createTicketModel.formContainsInvalidFields;
createTicketModel.currentTicket = problem;
$scope.problem = problem;
$scope.problem.autoAssign = true;
$scope.problem.coordinatorAutoAssign = true;
$scope.problemMetadata = problemMetadata;
$scope.loggedInUserId = userModel.decodedUserId || userModel.userId;
$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_PROBLEM), basicDataPromise = ticketModel.getDraft(EntityVO.TYPE_PROBLEM);
$q.all([metadataPromise, basicDataPromise]).then(function (responses) {
var data = responses[1];
angular.extend(problemMetadata, responses[0]);
if (_.includes(problemMetadata && problemMetadata.requiredOOTBObjectName, 'desc')) {
$scope.isDescRequired = true;
$scope.isNew = true;
}
else {
$scope.isDescRequired = false;
}
problemMetadata.statuses = _.reject(problemMetadata.statuses, { isValidForCreate: false });
problem.selectedStatus = _.head(problemMetadata.statuses);
$scope.updateStatusReason();
problem.selectedImpact = _.last(problemMetadata.impacts);
problem.selectedUrgency = _.last(problemMetadata.urgencies);
problem.investigationDriver = _.head(problemMetadata.investigationDrivers);
problem.id = data.id;
problem.displayId = data.displayId;
problem.categorizations = data.categorizations;
problem.accessMappings = data.accessMappings;
problem.company = data.company;
problem.supportGroup = data.supportGroup ? data.supportGroup : {};
problem.coordinatorGroup = data.coordinatorGroup ? data.coordinatorGroup : {};
problem.type = data.type;
problem.location = data.location ? data.location : {};
problem.location.companyName = data.company.name;
if (data.status && data.status.value) {
problem.selectedStatus = _.head(_.filter(problemMetadata.statuses, { name: data.status.value }));
$scope.updateStatusReason();
}
if (data.coordinator) {
problem.coordinator = data.coordinator;
$scope.problem.coordinatorAutoAssign = false;
}
else {
problem.coordinator = {};
}
if (data.assignee) {
problem.assignee = data.assignee;
$scope.problem.autoAssign = false;
}
else {
problem.assignee = {};
}
$scope.state.assigneeLoading = false;
getRootCause(null, data.categorizations);
})
.finally(function () {
$scope.state.dataIsLoading = false;
$scope.state.initialLoading = false;
});
var customFieldLabelsPromise = screenConfigurationModel
.loadScreenConfigurationAndCustomFieldLabels(ScreenConfigurationVO.prototype.PROBLEM_DETAILS_SCREEN, EntityVO.TYPE_PROBLEM);
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;
});
$q.all([metadataPromise, basicDataPromise, userPromise, customFieldLabelsPromise, searchCompanyPromise]).then(function () {
problem.allCategories = _.cloneDeep(categoriesService.populateCategories(problem.categorizations, problemMetadata));
var fields = screenConfigurationModel.getEditableFieldsForScreen(ScreenConfigurationVO.prototype.PROBLEM_DETAILS_SCREEN);
$scope.customFields = angular.copy(fields);
});
}
$scope.getList = function (type, term) {
if (type === 'service' || type === 'asset') {
return createTicketModel.getList(type, term, EntityVO.TYPE_PROBLEM).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.problem.company = userdata.company;
$scope.problem.location = {};
$scope.problem.location.companyName = $scope.problem.company.name;
$scope.company = _.cloneDeep($scope.problem.company);
};
$scope.updateCompany = function (value) {
var newCompany = value;
showCompanyChangeDialog().then(function (result) {
if (result) {
$scope.problem.company = newCompany;
$scope.$broadcast(events.CLEAR_FOUNDATION_SERVICE, $scope.problem.company);
$scope.$broadcast(events.CLEAR_CATEGORY_DETAILS, $scope.problem.company);
$scope.problem.location.companyName = $scope.problem.company.name;
problem.selectedService = '';
problem.selectedAsset = '';
if (!$scope.problem.coordinatorAutoAssign) {
problem.coordinator = {};
}
if (!$scope.problem.autoAssign) {
problem.assignee = {};
}
}
else {
$scope.company = $scope.problem.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.problem.companyChange.warning'),
buttons: [
{
text: $filter('i18n')('common.button.yes'),
data: true
},
{
text: $filter('i18n')('common.button.no'),
data: false
}
]
});
return modal.result;
}
$scope.$watch('problem.selectedService', function () {
if (problem && _.isObject(problem.selectedService)) {
problem.impactedService = problem.selectedService;
$scope.$emit(events.AFFECTED_SERVICE_UPDATED, problem.selectedService);
}
});
$scope.$watch('problem.company', function () {
$scope.updatePriority();
});
$scope.updatePriority = function () {
if (problem.company && problem.selectedImpact && problem.selectedUrgency) {
ticketModel.getPriority(problem.company.name, problem.selectedImpact.name, problem.selectedUrgency.name, EntityVO.TYPE_PROBLEM).then(function (data) {
problem.calculatedPriority = _.find(problemMetadata.priorities, { name: data });
if (!problem.calculatedPriority) {
systemAlertService.error({
text: $filter('i18n')('ticket.calculationError.calculatedPriority'),
clear: false
});
}
});
}
};
$scope.clearSelectedService = function () {
problem.selectedService = '';
};
$scope.clearSelectedAsset = function () {
problem.selectedAsset = '';
};
$scope.assign = function ($event) {
handleAssignment($event);
};
$scope.assignToMe = function ($event, role) {
var assigneeRole = role;
var assigneeSupportGroup = problem.supportGroup;
if (role === 'ticketassignee') {
assigneeRole = '';
}
else if (role === 'problemcoordinator') {
assigneeSupportGroup = problem.coordinatorGroup;
}
var locationCompany = null, customerCompany, primaryCompany = problem.company;
primaryCompany = primaryCompany ? primaryCompany.name : '';
customerCompany = (problem.customer && problem.customer.company) ? problem.customer.company.name : (problem.company ? problem.company.name : '');
locationCompany = problem.locationCompany ? problem.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) {
problem.ghostEntity = true;
ticketActionService.showAssignDialog(problem, 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, thumbnail: person.thumbnail, thumbnailMime: person.thumbnailMime };
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, thumbnail: person.thumbnail, thumbnailMime: person.thumbnailMime };
response.group = { id: person.supportGroupId, name: person.supportGroup, organization: person.organization, company: person.company };
}
completeAssignment(response);
}
function completeAssignment(result) {
if (result.autoAssign) {
clearAssignment();
}
else if (result.group) {
problem.autoAssign = false;
problem.assignee = result.assignee;
problem.supportGroup = result.group;
}
if (result.coordinatorAutoAssign) {
clearCoordinator();
}
else if (result.managerGroup) {
problem.coordinatorAutoAssign = false;
problem.coordinator = result.manager;
problem.coordinatorGroup = result.managerGroup;
}
}
$scope.createProblem = function () {
$scope.state.dataIsLoading = true;
problem.summary = problem.summary.replace(/\u00a0/g, ' ');
var initialCategorizations = _.cloneDeep(problem.categorizations);
problem.categorizations = categoriesService.collectValues(problem.allCategories, $scope.problem).categorizations;
createTicketModel.createProblem().then(function (error) {
if (error) {
$scope.state.dataIsLoading = false;
problem.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(problem.selectedStatus.name.toLowerCase());
};
$scope.isFieldRequired = function (field) {
var selectedStatus = $scope.problem.selectedStatus ? $scope.problem.selectedStatus.name : "";
return fieldValidationModel.isFieldRequired(EntityVO.TYPE_PROBLEM, selectedStatus, "", field);
};
function isFormDirty() {
return $scope.createProblemForm.$dirty || !_.isEmpty(problem.attachments);
}
function initAlertForDirtyForm() {
$scope.$on('$stateChangeStart', function (event, toState, toParams) {
if (isFormDirty() && toState.name !== EntityVO.TYPE_PROBLEM) {
event.preventDefault();
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: {
stateName: toState.name,
stateParams: toParams
}
},
{
text: i18nService.getLocalizedString('common.labels.no')
}
]
});
modalInstance.result.then(function (data) {
if (!_.isEmpty(data)) {
createTicketModel.currentTicket = problem = {};
$scope.createProblemForm.$setPristine();
$state.transitionTo(data.stateName, data.stateParams);
}
});
}
});
}
function clearAssignment() {
problem.autoAssign = true;
problem.assignee = {};
problem.supportGroup = {};
}
function clearCoordinator() {
problem.coordinatorAutoAssign = true;
problem.coordinator = {};
problem.coordinatorGroup = {};
}
$scope.updateStatusReason = function () {
if (!_.isEmpty(problem.selectedStatus.statusReasons) && $scope.isFieldRequired('statusReason')) {
problem.selectedStatusReason = _.head(problem.selectedStatus.statusReasons);
}
else {
problem.selectedStatusReason = {};
}
};
function getRootCause(event, data) {
var params = {};
params.depends = categoriesService.buildCategoriesForRootCause(data, problem.allCategories);
params.depends.productManufacturer = null;
var company = $scope.company && $scope.company.name ? { name: $scope.company.name } : null;
ticketModel.getRootCause(params, company).then(function (response) {
if (response) {
$scope.selections.rootCause = response;
}
});
}
$scope.$on(events.TICKET_UPDATE_ROOTCAUSE, getRootCause);
init();
}
]);
})();