879 lines
53 KiB
JavaScript
879 lines
53 KiB
JavaScript
"use strict";
|
|
(function () {
|
|
'use strict';
|
|
angular.module('ticketModule')
|
|
.controller('EditStatusController', ['$scope', '$modalInstance', 'editStatusParams', 'ticketModel', 'metadataModel', 'categoriesService', '$q', 'knowledgeArticleModel', 'systemAlertService', 'permissionModel', 'roles', 'searchModel', 'searchService', 'ticketService', 'fieldValidationModel', '$filter', '$state', 'i18nService', 'events', 'assetModel',
|
|
function ($scope, $modalInstance, editStatusParams, ticketModel, metadataModel, categoriesService, $q, knowledgeArticleModel, systemAlertService, permissionModel, roles, searchModel, searchService, ticketService, fieldValidationModel, $filter, $state, i18nService, events, assetModel) {
|
|
var isSingle = editStatusParams.actionItems.length === 1, id = editStatusParams.actionItems[0].id, type = editStatusParams.actionItems[0].type, state = {
|
|
processing: true,
|
|
updatingStatus: false,
|
|
loadingSupportPersons: false,
|
|
loadingSupportGroups: false,
|
|
loadingAssigneeGroups: false,
|
|
tooManySupportCompanies: false,
|
|
tooManyAssigneeCompanies: false,
|
|
tooManySupportOrganizations: false,
|
|
tooManyAssigneeOrganizations: false,
|
|
tooManySupportGroups: false,
|
|
tooManyAssigneeGroups: false
|
|
}, selected = {
|
|
status: {},
|
|
statusReason: {},
|
|
milestone: {},
|
|
resolutionNote: '',
|
|
worknote: '',
|
|
manager: {},
|
|
group: {},
|
|
targetDate: '',
|
|
isDisabled: false,
|
|
assignee: {},
|
|
assigneeGroup: {}
|
|
}, originalTicket, milestoneStatus, milestoneMetadata;
|
|
$scope.isOptional = {
|
|
managerGroup: false,
|
|
manager: false,
|
|
targetDate: false,
|
|
coordinatorGroup: false,
|
|
coordinator: false,
|
|
assigneeGroup: false,
|
|
assignee: false
|
|
};
|
|
$scope.companies = [];
|
|
$scope.coordinatorCompany = {};
|
|
$scope.assigneeCompany = {};
|
|
$scope.coordinatorOrganizations = [];
|
|
$scope.coordinatorOrganization = {};
|
|
$scope.assigneeOrganizations = [];
|
|
$scope.assigneeOrganization = {};
|
|
$scope.showUpdateWarningForRequired = false;
|
|
if (!isSingle) {
|
|
$scope.isOptional = {
|
|
managerGroup: true,
|
|
manager: true,
|
|
targetDate: true,
|
|
coordinatorGroup: true,
|
|
coordinator: true,
|
|
assigneeGroup: true,
|
|
assignee: true
|
|
};
|
|
_.each(editStatusParams.actionItems, function (ticket) {
|
|
switch (type) {
|
|
case EntityVO.TYPE_CHANGE:
|
|
if ($scope.isOptional.manager && ticket.changeManager && ticket.changeManager.fullName === "") {
|
|
$scope.isOptional.manager = false;
|
|
}
|
|
if ($scope.isOptional.managerGroup && ticket.changeManagerGroup && ticket.changeManagerGroup.name === "") {
|
|
$scope.isOptional.managerGroup = false;
|
|
}
|
|
if (!$scope.showUpdateWarningForRequired && ((ticket.changeManager && ticket.changeManager.fullName) || (ticket.changeManagerGroup && ticket.changeManagerGroup.name))) {
|
|
$scope.showUpdateWarningForRequired = true;
|
|
}
|
|
break;
|
|
case EntityVO.TYPE_PROBLEM:
|
|
if ($scope.isOptional.targetDate && ticket.targetDate === "") {
|
|
$scope.isOptional.targetDate = false;
|
|
}
|
|
if ($scope.isOptional.coordinator && ticket.problemCoordinator && ticket.problemCoordinator.fullName === "") {
|
|
$scope.isOptional.coordinator = false;
|
|
}
|
|
if ($scope.isOptional.coordinatorGroup && ticket.problemCoordinatorGroup && ticket.problemCoordinatorGroup.name === "") {
|
|
$scope.isOptional.coordinatorGroup = false;
|
|
}
|
|
if ($scope.isOptional.assignee && ticket.assignee && ticket.assignee.fullName === "") {
|
|
$scope.isOptional.assignee = false;
|
|
}
|
|
if ($scope.isOptional.assigneeGroup && ticket.supportGroup && ticket.supportGroup.name === "") {
|
|
$scope.isOptional.assigneeGroup = false;
|
|
}
|
|
if (!$scope.showUpdateWarningForRequired && ((ticket.problemCoordinator && ticket.problemCoordinator.fullName) || (ticket.problemCoordinatorGroup && ticket.problemCoordinatorGroup.name) || (ticket.assignee && ticket.assignee.fullName) || (ticket.supportGroup && ticket.supportGroup.name))) {
|
|
$scope.showUpdateWarningForRequired = true;
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
$scope.state = state;
|
|
$scope.selected = selected;
|
|
$scope.isReopen = editStatusParams.isReopen;
|
|
$scope.allowLocationCompany = (type === EntityVO.TYPE_INCIDENT);
|
|
$scope.isDraft = editStatusParams.isDraft;
|
|
$scope.needResolutionNote = function () {
|
|
return (type === EntityVO.TYPE_INCIDENT) && ~[EntityVO.STATUS_CLOSED, EntityVO.STATUS_RESOLVED].indexOf(selected.status.name.toLowerCase());
|
|
};
|
|
$scope.isSaveButtonDisabled = function () {
|
|
return ($scope.needResolutionNote() && selected.resolutionNote === '') || (selected.status.statusReasons && _.isEmpty(selected.statusReason) && $scope.isFieldRequired('statusReason')) ? true : false;
|
|
};
|
|
$scope.checkStatusSwitcherIsDisabled = function (type, ticketType) {
|
|
var noSwitchStatuses = ['Pending', 'Cancelled', 'Closed', 'Rejected'], currentStatusIndex, nextStatusIndex, nextStatus;
|
|
if (ticketType !== 'release') {
|
|
currentStatusIndex = _.findIndex($scope.availableStatuses, function (status) {
|
|
return status.index === $scope.selected.status.index;
|
|
});
|
|
}
|
|
else {
|
|
currentStatusIndex = _.findIndex($scope.availableMilestoneStatuses, function (status) {
|
|
return status.index === $scope.selected.milestone.index;
|
|
});
|
|
}
|
|
if (currentStatusIndex !== -1 && ticketType !== 'release') {
|
|
if (type === 'prev') {
|
|
return ((currentStatusIndex === 0) ||
|
|
noSwitchStatuses.indexOf($scope.selected.status.name) >= 0);
|
|
}
|
|
else if (type === 'next') {
|
|
if (((ticketType === 'change' &&
|
|
($scope.availableStatuses[currentStatusIndex].name === 'Implementation In Progress' ||
|
|
$scope.availableStatuses[currentStatusIndex].name === 'Planning In Progress')) ||
|
|
(ticketType === 'problem' || ticketType === 'knownerror')) &&
|
|
$scope.availableStatuses[currentStatusIndex + 1] &&
|
|
($scope.availableStatuses[currentStatusIndex + 1].name === 'Pending' ||
|
|
$scope.availableStatuses[currentStatusIndex + 1].name === 'Cancelled')) {
|
|
nextStatusIndex = parseInt(currentStatusIndex + 2);
|
|
nextStatus = $scope.availableStatuses[nextStatusIndex] || {};
|
|
}
|
|
else {
|
|
nextStatusIndex = parseInt(currentStatusIndex + 1);
|
|
nextStatus = $scope.availableStatuses[nextStatusIndex] || {};
|
|
}
|
|
if ($scope.selected.status.name === 'Completed' && nextStatus.name === 'Closed') {
|
|
return (noSwitchStatuses.indexOf($scope.selected.status.name) >= 0);
|
|
}
|
|
else {
|
|
return (noSwitchStatuses.indexOf(nextStatus.name) >= 0 ||
|
|
noSwitchStatuses.indexOf($scope.selected.status.name) >= 0);
|
|
}
|
|
}
|
|
}
|
|
if (currentStatusIndex !== -1 && ticketType === 'release') {
|
|
if (type === 'prev') {
|
|
return (currentStatusIndex === 0);
|
|
}
|
|
else if (type === 'next') {
|
|
nextStatusIndex = parseInt(currentStatusIndex + 1);
|
|
if ($scope.availableMilestoneStatuses[nextStatusIndex] === undefined) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
$scope.switchState = function (direction, ticketType) {
|
|
var currentStatusIndex, switchToState = {}, prevStatusIndex, nextStatusIndex;
|
|
if (ticketType !== 'release') {
|
|
currentStatusIndex = _.findIndex($scope.availableStatuses, function (status) {
|
|
return status.index === $scope.selected.status.index;
|
|
});
|
|
}
|
|
else {
|
|
currentStatusIndex = _.findIndex($scope.availableMilestoneStatuses, function (status) {
|
|
return status.index === $scope.selected.milestone.index;
|
|
});
|
|
}
|
|
if (currentStatusIndex !== -1) {
|
|
if (direction === 'prev') {
|
|
if ((ticketType === 'change' || ticketType === 'problem') &&
|
|
$scope.availableStatuses[currentStatusIndex].name === 'Completed') {
|
|
prevStatusIndex = currentStatusIndex !== 0 ? parseInt(currentStatusIndex - 2) : 0;
|
|
}
|
|
else {
|
|
prevStatusIndex = currentStatusIndex !== 0 ? parseInt(currentStatusIndex - 1) : 0;
|
|
}
|
|
if (ticketType === 'release') {
|
|
switchToState = $scope.availableMilestoneStatuses[prevStatusIndex] || {};
|
|
}
|
|
else {
|
|
switchToState = $scope.availableStatuses[prevStatusIndex] || {};
|
|
}
|
|
}
|
|
else if (direction === 'next') {
|
|
if (((ticketType === 'change' && ($scope.availableStatuses[currentStatusIndex].name === 'Implementation In Progress'
|
|
|| $scope.availableStatuses[currentStatusIndex].name === 'Planning In Progress')) || ticketType === 'problem')
|
|
&& $scope.availableStatuses[currentStatusIndex + 1] &&
|
|
$scope.availableStatuses[currentStatusIndex + 1].name === 'Pending') {
|
|
nextStatusIndex = parseInt(currentStatusIndex + 2);
|
|
}
|
|
else {
|
|
nextStatusIndex = parseInt(currentStatusIndex + 1);
|
|
}
|
|
if (ticketType === 'release') {
|
|
switchToState = $scope.availableMilestoneStatuses[nextStatusIndex] || {};
|
|
}
|
|
else {
|
|
switchToState = $scope.availableStatuses[nextStatusIndex] || {};
|
|
}
|
|
}
|
|
}
|
|
if (ticketType !== 'release') {
|
|
$scope.changeStatus(switchToState, ticketType);
|
|
}
|
|
else {
|
|
selected.status = {};
|
|
$scope.changeMileStone(switchToState, ticketType);
|
|
}
|
|
};
|
|
$scope.changeMileStone = function (status, ticketType, onStatusLoad) {
|
|
selected.milestone = status;
|
|
$scope.availableStatuses = {};
|
|
if (onStatusLoad) {
|
|
selected.status = {};
|
|
}
|
|
//$scope.ticket.milestone = status.name;
|
|
var milestoneStatusValues = [];
|
|
_.forEach(milestoneStatus, function (key) {
|
|
if (key.milestone === status.name) {
|
|
milestoneStatusValues.push(key);
|
|
}
|
|
});
|
|
$scope.availableStatuses = _.filter(milestoneMetadata.statuses, function (status) {
|
|
return _.findIndex(milestoneStatusValues, { 'status': status.name }) !== -1;
|
|
});
|
|
};
|
|
$scope.changeStatus = function (status, ticketType) {
|
|
selected.status = status;
|
|
selected.statusReason = {};
|
|
$scope.ticket.status.value = status.name;
|
|
$scope.showDates = $scope.isFieldRequired('scheduledStartDate') || $scope.isFieldRequired('actualStartDate');
|
|
if ($scope.isFieldRequired('manager') &&
|
|
originalTicket.manager && !originalTicket.manager.loginId) {
|
|
$scope.noChangeManagerLoginId = true;
|
|
}
|
|
else {
|
|
$scope.noChangeManagerLoginId = false;
|
|
}
|
|
$scope.fixScheduledDates = ticketType === 'change' && selected.status.name === 'Scheduled For Review'
|
|
&& (($scope.ticket.scheduledStartDate && $scope.ticket.scheduledStartDate.valueOf() < $scope.ticket.earliestStartDate)
|
|
|| ($scope.ticket.scheduledEndDate && $scope.ticket.scheduledEndDate.valueOf() < $scope.ticket.earliestStartDate));
|
|
if (ticketType && ticketType === 'change' && $scope.ticket.status.value === 'Completed') {
|
|
selected.statusReason = _.find(status.statusReasons, { name: 'Final Review Required' });
|
|
}
|
|
$scope.editStatusForm.$dirty = true;
|
|
};
|
|
$scope.$watch('ticket.scheduledStartDate', function () {
|
|
if ($scope.ticket && $scope.ticket.type === 'change'
|
|
&& selected.status.name === 'Scheduled For Review' && $scope.ticket.scheduledStartDate) {
|
|
checkIfValidDates();
|
|
}
|
|
});
|
|
$scope.$watch('ticket.scheduledEndDate', function () {
|
|
if ($scope.ticket && $scope.ticket.type === 'change'
|
|
&& selected.status.name === 'Scheduled For Review' && $scope.ticket.scheduledStartTime) {
|
|
checkIfValidDates();
|
|
}
|
|
});
|
|
$scope.$watch('ticket.scheduledStartTime', function () {
|
|
if ($scope.ticket && $scope.ticket.type === 'change'
|
|
&& selected.status.name === 'Scheduled For Review' && $scope.ticket.scheduledEndDate) {
|
|
checkIfValidDates();
|
|
}
|
|
});
|
|
$scope.$watch('ticket.scheduledEndTime', function () {
|
|
if ($scope.ticket && $scope.ticket.type === 'change'
|
|
&& selected.status.name === 'Scheduled For Review' && $scope.ticket.scheduledEndTime) {
|
|
checkIfValidDates();
|
|
}
|
|
});
|
|
$scope.changeStatusReason = function (statusReason) {
|
|
selected.statusReason = statusReason;
|
|
$scope.editStatusForm.$dirty = true;
|
|
};
|
|
$scope.updateGroup = function (group) {
|
|
selected.group = group;
|
|
$scope.state.loadingSupportPersons = true;
|
|
var role = "";
|
|
if ($scope.ticket.type === EntityVO.TYPE_CHANGE) {
|
|
role = 'role=changemanager';
|
|
}
|
|
else if ($scope.ticket.type === EntityVO.TYPE_PROBLEM) {
|
|
role = 'role=problemcoordinator';
|
|
}
|
|
$scope.editStatusForm.$dirty = true;
|
|
return ticketService.getGroupMembers(group.id, role).then(function (response) {
|
|
$scope.state.loadingSupportPersons = false;
|
|
$scope.supportGroupPersons = response.results;
|
|
$scope.updateManager(null);
|
|
});
|
|
};
|
|
$scope.updateManager = function (manager) {
|
|
selected.manager = manager;
|
|
$scope.editStatusForm.$dirty = true;
|
|
};
|
|
$scope.updateAssigneeGroup = function (group) {
|
|
selected.assigneeGroup = group;
|
|
$scope.state.loadingAssignees = true;
|
|
$scope.editStatusForm.$dirty = true;
|
|
return ticketService.getGroupMembers(group.id, "").then(function (response) {
|
|
$scope.state.loadingAssignees = false;
|
|
$scope.assignees = response.results;
|
|
$scope.updateAssignee(null);
|
|
});
|
|
};
|
|
$scope.updateAssignee = function (assignee) {
|
|
selected.assignee = assignee;
|
|
$scope.editStatusForm.$dirty = true;
|
|
};
|
|
$scope.isFieldRequired = function (field) {
|
|
if (field === 'statusReason') {
|
|
if ($scope.ticket.type === EntityVO.TYPE_INCIDENT || $scope.ticket.type === EntityVO.TYPE_CHANGE || $scope.ticket.type === EntityVO.TYPE_RELEASE || $scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_TASK || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) {
|
|
return fieldValidationModel.isFieldRequired($scope.ticket.type, $scope.ticket.status.value, $scope.ticket.timing, field);
|
|
}
|
|
//for defect SW00512588 and SW00523488
|
|
else if ($scope.ticket.type === EntityVO.TYPE_WORKORDER || $scope.ticket.type === EntityVO.TYPE_ACTIVITY) {
|
|
return false;
|
|
}
|
|
else {
|
|
return true;
|
|
}
|
|
}
|
|
//only show when moving from a status where it's not required to a status where it's required
|
|
return fieldValidationModel.isFieldRequired($scope.ticket.type, $scope.ticket.status.value, $scope.ticket.timing, field)
|
|
&& !fieldValidationModel.isFieldRequired($scope.ticket.type, originalTicket.status.value, $scope.ticket.timing, field);
|
|
};
|
|
$scope.close = function () {
|
|
if ($scope.editStatusForm.$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) {
|
|
$modalInstance.dismiss();
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
$modalInstance.dismiss();
|
|
}
|
|
};
|
|
$scope.submit = function () {
|
|
state.updatingStatus = true;
|
|
var ids, statusData, updateFn;
|
|
ids = _.map(editStatusParams.actionItems, function (item) {
|
|
return {
|
|
uuid: item.id,
|
|
type: item.type
|
|
};
|
|
});
|
|
statusData = {
|
|
status: selected.status.name,
|
|
statuslabel: selected.status.label
|
|
};
|
|
if (!_.isEmpty(selected.statusReason)) {
|
|
statusData.statusReason = selected.statusReason.name;
|
|
}
|
|
if (!_.isEmpty(selected.milestone)) {
|
|
statusData.milestone = selected.milestone.name;
|
|
}
|
|
if (selected.resolutionNote) {
|
|
statusData.resNote = selected.resolutionNote;
|
|
}
|
|
var resCat = categoriesService.collectValues($scope.resCategories, $scope.ticket).resCategorizations;
|
|
if (resCat && resCat.length) {
|
|
statusData.resCategorizations = resCat;
|
|
}
|
|
var categories = categoriesService.collectValues($scope.categories, $scope.ticket).categorizations;
|
|
if (categories && categories.length) {
|
|
statusData.categorizations = categories;
|
|
}
|
|
if (selected.worknote) {
|
|
statusData.worknote = selected.worknote;
|
|
}
|
|
if ($scope.ticket.type === EntityVO.TYPE_CHANGE) {
|
|
if ($scope.showDates) {
|
|
var scheduledStart = originalTicket.scheduledStartDate === null ? 0 : originalTicket.scheduledStartDate.valueOf(), scheduledEnd = originalTicket.scheduledEndDate === null ? 0 : originalTicket.scheduledEndDate.valueOf(), actualStart = originalTicket.actualStartDate === null ? 0 : originalTicket.actualStartDate.valueOf(), actualEnd = originalTicket.actualEndDate === null ? 0 : originalTicket.actualEndDate.valueOf(), targetDate = originalTicket.targetDate === null ? 0 : originalTicket.targetDate.valueOf();
|
|
if ($scope.ticket.scheduledStartDate !== null && scheduledStart !== $scope.ticket.scheduledStartDate.valueOf()) {
|
|
statusData.scheduledStartDate = moment($scope.ticket.scheduledStartDate).valueOf();
|
|
}
|
|
if ($scope.ticket.scheduledEndDate !== null && scheduledEnd !== $scope.ticket.scheduledEndDate.valueOf()) {
|
|
statusData.scheduledEndDate = moment($scope.ticket.scheduledEndDate).valueOf();
|
|
}
|
|
if ($scope.ticket.actualStartDate !== null && actualStart !== $scope.ticket.actualStartDate.valueOf()) {
|
|
statusData.actualStartDate = moment($scope.ticket.actualStartDate).valueOf();
|
|
}
|
|
if ($scope.ticket.actualEndDate !== null && actualEnd !== $scope.ticket.actualEndDate.valueOf()) {
|
|
statusData.actualEndDate = moment($scope.ticket.actualEndDate).valueOf();
|
|
}
|
|
if ($scope.ticket.targetDate !== null && targetDate !== $scope.ticket.targetDate.valueOf()) {
|
|
statusData.targetDate = moment($scope.ticket.targetDate).valueOf();
|
|
}
|
|
}
|
|
if ($scope.isFieldRequired('managerGroup')) {
|
|
if (selected.manager.loginId !== originalTicket.manager.loginId) {
|
|
statusData.managerLoginId = selected.manager.loginId;
|
|
statusData.managerFullName = selected.manager.fullName;
|
|
}
|
|
if (selected.group.name !== originalTicket.managerGroup.name) {
|
|
statusData.managerGroup = selected.group.name;
|
|
statusData.managerOrganization = selected.group.organization;
|
|
statusData.managerCompany = selected.group.company && selected.group.company.name;
|
|
}
|
|
}
|
|
}
|
|
else if ($scope.ticket.type === EntityVO.TYPE_PROBLEM) {
|
|
if (selected.targetDate) {
|
|
statusData.targetDate = moment(selected.targetDate).valueOf();
|
|
}
|
|
statusData.coordinatorLoginId = selected.manager ? selected.manager.loginId : undefined;
|
|
statusData.coordinatorFullName = selected.manager ? selected.manager.fullName : undefined;
|
|
statusData.coordinatorGroupId = selected.group ? selected.group.id : undefined;
|
|
statusData.coordinatorGroup = selected.group ? selected.group.name : undefined;
|
|
statusData.coordinatorOrganization = selected.group ? selected.group.organization : undefined;
|
|
statusData.coordinatorCompany = (selected.group && selected.group.company) ? selected.group.company.name : undefined;
|
|
statusData.group = selected.assigneeGroup ? selected.assigneeGroup.name : undefined;
|
|
statusData.groupId = selected.assigneeGroup ? selected.assigneeGroup.id : undefined;
|
|
statusData.organization = selected.assigneeGroup ? selected.assigneeGroup.organization : undefined;
|
|
statusData.company = (selected.assigneeGroup && selected.assigneeGroup.company) ? selected.assigneeGroup.company.name : undefined;
|
|
if (selected.assignee) {
|
|
statusData.fullName = selected.assignee.fullName;
|
|
statusData.loginId = selected.assignee.loginId;
|
|
}
|
|
}
|
|
else if ($scope.ticket.type === EntityVO.TYPE_INCIDENT) {
|
|
statusData.modifyAllFlag = "Yes";
|
|
}
|
|
var actionData = _.cloneDeep(statusData);
|
|
if (editStatusParams.isReopen) {
|
|
delete actionData.status;
|
|
delete actionData.statuslabel;
|
|
delete actionData.resNote;
|
|
}
|
|
updateFn = editStatusParams.isDraft ? $q.when : ticketModel.updateStatus;
|
|
return updateFn(ids, actionData, $scope.ticket.type).then(function (response) {
|
|
if (!editStatusParams.isDraft && !_.isEmpty(response)) {
|
|
statusData.updatedTickets = response;
|
|
}
|
|
if ($scope.ticket.type === EntityVO.TYPE_PROBLEM && statusData.status === 'Completed' && statusData.statusReason === 'Known Error') {
|
|
if ($scope.ticket.hasInitiatesRelation) {
|
|
showPKECreateConfirmationDialog().then(function (result) {
|
|
if (result) {
|
|
createRelatedDraft(EntityVO.TYPE_KNOWNERROR, 'draftKnownerror', RelationItemVO.TYPE_INITIATEDBY);
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
createRelatedDraft(EntityVO.TYPE_KNOWNERROR, 'draftKnownerror', RelationItemVO.TYPE_INITIATEDBY);
|
|
}
|
|
}
|
|
$modalInstance.close(statusData);
|
|
}).catch(function (error) {
|
|
// if error is blank close modal without error message
|
|
(error && error.data && error.data.error) ? $modalInstance.dismiss(error.data.error)
|
|
: $modalInstance.dismiss();
|
|
}).finally(function () {
|
|
state.updatingStatus = false;
|
|
});
|
|
};
|
|
function createRelatedDraft(type, state, relationship) {
|
|
ticketModel.cache.draft = {
|
|
type: type
|
|
};
|
|
ticketModel.cache.relatedDraft = {
|
|
type: type,
|
|
fromType: $scope.ticket.type,
|
|
id: $scope.ticket.id,
|
|
fromContext: $scope.ticket,
|
|
relationship: relationship
|
|
};
|
|
$state.go(state);
|
|
}
|
|
function showPKECreateConfirmationDialog() {
|
|
var modal = systemAlertService.modal({
|
|
type: 'info',
|
|
title: $filter('i18n')('common.notification.dirty.title'),
|
|
text: $filter('i18n')('create.knownerror.draft.problem'),
|
|
buttons: [
|
|
{
|
|
text: $filter('i18n')('common.button.yes'),
|
|
data: true
|
|
},
|
|
{
|
|
text: $filter('i18n')('common.button.no'),
|
|
data: false
|
|
}
|
|
]
|
|
});
|
|
return modal.result;
|
|
}
|
|
function getTimestamp(date, time) {
|
|
time = time ? moment(time) : moment(date);
|
|
return moment(date).set('hours', time.get('hours')).set('minutes', time.get('minutes')).format('X') * 1000;
|
|
}
|
|
function checkIfValidDates() {
|
|
var scheduledStartTime = getTimestamp($scope.ticket.scheduledStartDate, $scope.ticket.scheduledStartTime), scheduledEndTime = getTimestamp($scope.ticket.scheduledEndDate, $scope.ticket.scheduledEndTime);
|
|
$scope.fixScheduledDates = $scope.ticket && $scope.ticket.type === 'change'
|
|
&& selected.status.name === 'Scheduled For Review'
|
|
&& (scheduledStartTime < $scope.ticket.earliestStartDate || scheduledEndTime < $scope.ticket.earliestStartDate
|
|
|| scheduledEndTime < scheduledStartTime);
|
|
}
|
|
function handleModalBackdropClick() {
|
|
$scope.close();
|
|
}
|
|
$scope.$on(events.MODAL_BACKDROP_CLICK, handleModalBackdropClick);
|
|
var getEntryPromise;
|
|
if (type === EntityVO.TYPE_KNOWLEDGE) {
|
|
getEntryPromise = knowledgeArticleModel.getKnowledgeArticleById(id, false, true);
|
|
}
|
|
else if ($scope.isDraft) {
|
|
getEntryPromise = $q.when(editStatusParams.actionItems[0]);
|
|
}
|
|
else {
|
|
getEntryPromise = ticketModel.getTicket(id, type);
|
|
}
|
|
var availableStatusPromise;
|
|
if (type === EntityVO.TYPE_CHANGE || type === EntityVO.TYPE_RELEASE || type === EntityVO.TYPE_PROBLEM || type === EntityVO.TYPE_KNOWNERROR) {
|
|
availableStatusPromise = ticketModel.getAvailableStatuses(id, type);
|
|
}
|
|
else {
|
|
availableStatusPromise = $q.when(1);
|
|
}
|
|
function getSupportGroupsFromAllCompany(role, customerCompany, locationCompany, isAssignee) {
|
|
var organizationName = isAssignee ? ($scope.assigneeOrganization && $scope.assigneeOrganization.name)
|
|
|| ($scope.selected.assigneeGroup && $scope.selected.assigneeGroup.organization) || '' : ($scope.coordinatorOrganization && $scope.coordinatorOrganization.name)
|
|
|| ($scope.selected.group && $scope.selected.group.organization) || '';
|
|
return searchModel.getAssigneeSupportGroupsForCompanyAndOrg('', organizationName, role, null, customerCompany, locationCompany)
|
|
.then(function (result) {
|
|
result.supportGroups = _.uniqBy(result.supportGroups, function (group) {
|
|
return group.id;
|
|
});
|
|
result.supportGroups = _.sortBy(result.supportGroups, function (group) {
|
|
return group.name;
|
|
});
|
|
if (role) {
|
|
state.tooManySupportGroups = result.exceedsChunkSize;
|
|
}
|
|
else {
|
|
state.tooManyAssigneeGroups = result.exceedsChunkSize;
|
|
}
|
|
var groupArr = [];
|
|
_.forEach(result.supportGroups, function (group) {
|
|
if (group.id !== 'All') {
|
|
if (groupArr.indexOf(group.name) === -1) {
|
|
groupArr.push(group.name);
|
|
}
|
|
else {
|
|
var filteredGroups = _.filter(result.supportGroups, { name: group.name });
|
|
_.forEach(filteredGroups, function (filteredGroup) {
|
|
filteredGroup.duplicate = true;
|
|
});
|
|
}
|
|
}
|
|
});
|
|
return result.supportGroups;
|
|
});
|
|
}
|
|
$scope.getSupportGroupsForAllCompanyByName = function (name, group) {
|
|
var customerCompany = null, locationCompany = null, organizationName = '';
|
|
customerCompany = $scope.ticket.customer ? $scope.ticket.customer.company.name : $scope.ticket.company ? $scope.ticket.company.name : '';
|
|
if (($scope.ticket.type === EntityVO.TYPE_TASK || $scope.ticket.type === EntityVO.TYPE_CHANGE) && $scope.ticket.id && $scope.ticket.company) {
|
|
locationCompany = $scope.ticket.company.name;
|
|
}
|
|
else {
|
|
locationCompany = $scope.ticket.location ? $scope.ticket.location.companyName : null;
|
|
}
|
|
if (group === 'supportGroup') {
|
|
$scope.state.loadingSupportGroups = true;
|
|
organizationName = ($scope.coordinatorOrganization && $scope.coordinatorOrganization.name) || '';
|
|
}
|
|
else if (group === 'assigneeGroup') {
|
|
$scope.state.loadingAssigneeGroups = true;
|
|
organizationName = ($scope.assigneeOrganization && $scope.assigneeOrganization.name) || '';
|
|
}
|
|
var groupsPromise = searchModel.getAssigneeSupportGroupsForCompanyAndOrgByName('', organizationName, name, null, customerCompany, locationCompany);
|
|
return groupsPromise.then(function (result) {
|
|
$scope.state.loadingSupportGroups = false;
|
|
$scope.state.loadingAssigneeGroups = false;
|
|
return { list: result.supportGroups, exceedsChunkSize: result.exceedsChunkSize };
|
|
});
|
|
};
|
|
$q.all([metadataModel.getMetadataByType(type), getEntryPromise, availableStatusPromise])
|
|
.then(function (resultArray) {
|
|
originalTicket = resultArray[1];
|
|
var i, metaData = resultArray[0], validStatuses = resultArray[2], emptyCount = {
|
|
'schedule': 0,
|
|
'actual': 0
|
|
};
|
|
//SW00522514 fixed for canclled case only for change and release
|
|
if (originalTicket.isInApproval && (type === EntityVO.TYPE_CHANGE || type === EntityVO.TYPE_RELEASE)) {
|
|
selected.status = (isSingle || type === EntityVO.TYPE_CHANGE) ? _.find(metaData.statuses, { name: 'Cancelled' }) : {};
|
|
selected.isDisabled = false;
|
|
if (isSingle && type === EntityVO.TYPE_RELEASE) {
|
|
validStatuses = _.find(validStatuses, { status: 'Cancelled' });
|
|
}
|
|
}
|
|
else {
|
|
selected.status = (isSingle || type === EntityVO.TYPE_CHANGE) ? _.find(metaData.statuses, { name: ((editStatusParams.actionItems[0].status && editStatusParams.actionItems[0].status.value) || originalTicket.status.value) }) : {};
|
|
}
|
|
selected.milestone = (isSingle) ? _.find(metaData.milestones, { name: originalTicket.milestone }) : {};
|
|
// selected.status = (isSingle || type === EntityVO.TYPE_CHANGE) ? _.find(metaData.statuses, { name: originalTicket.status.value }) : {};
|
|
selected.statusReason = !_.isEmpty(selected.status) ? _.find(selected.status.statusReasons, { name: ((editStatusParams.actionItems[0].status && editStatusParams.actionItems[0].status.reason) || originalTicket.status.reason) }) : {};
|
|
selected.statusReason = (!_.isEmpty(selected.statusReason) && !isSingle && type === EntityVO.TYPE_CHANGE) ? {} : selected.statusReason;
|
|
// SW00541615 - if multiple tickets selected for status update, resolutionNote of first ticket will be
|
|
// sent as update param for all selected tickets
|
|
selected.resolutionNote = (editStatusParams.actionItems[0].resolutionNote || originalTicket.resolution) && isSingle ? (editStatusParams.actionItems[0].resolutionNote || originalTicket.resolution) : '';
|
|
if (!isSingle && type === EntityVO.TYPE_CHANGE) {
|
|
$scope.showChangeUpdateWarning = true;
|
|
$scope.isChangeScheduleDatesRequired = false;
|
|
$scope.isChangeActualDatesRequired = false;
|
|
for (i = 0; i < editStatusParams.actionItems.length; i++) {
|
|
if (!$scope.isChangeScheduleDatesRequired && (editStatusParams.actionItems[i].scheduledEndDate === "" || editStatusParams.actionItems[i].scheduledStartDate === "")) {
|
|
$scope.isChangeScheduleDatesRequired = true;
|
|
}
|
|
if (!$scope.isChangeActualDatesRequired && (editStatusParams.actionItems[i].actualEndDate === "" || editStatusParams.actionItems[i].actualStartDate === "")) {
|
|
$scope.isChangeActualDatesRequired = true;
|
|
}
|
|
if ((editStatusParams.actionItems[i].scheduledEndDate === "" && editStatusParams.actionItems[i].scheduledStartDate === "")) {
|
|
emptyCount.schedule++;
|
|
}
|
|
if ((editStatusParams.actionItems[i].actualEndDate === "" && editStatusParams.actionItems[i].actualStartDate === "")) {
|
|
emptyCount.actual++;
|
|
}
|
|
}
|
|
if (emptyCount.schedule === editStatusParams.actionItems.length || emptyCount.actual === editStatusParams.actionItems.length) {
|
|
$scope.showChangeUpdateWarning = false;
|
|
}
|
|
}
|
|
else {
|
|
$scope.isChangeScheduleDatesRequired = true;
|
|
$scope.isChangeActualDatesRequired = true;
|
|
}
|
|
if (type === EntityVO.TYPE_WORKORDER && editStatusParams.isDraft) {
|
|
$scope.availableStatuses = _.reject(metaData.statuses, { isValidForCreate: false });
|
|
}
|
|
else if (selected.status && selected.status.invalidStatusTransitions && selected.status.invalidStatusTransitions.length) {
|
|
$scope.availableStatuses = _.filter(metaData.statuses, function (status) {
|
|
return ~_.indexOf(selected.status.invalidStatusTransitions, status.name) ? false : true;
|
|
});
|
|
}
|
|
else if (selected.status && selected.status.validKnowledgeTransitions) {
|
|
if (selected.status.validKnowledgeTransitions.length) {
|
|
$scope.availableStatuses = _.filter(metaData.statuses, function (status) {
|
|
return _.find(selected.status.validKnowledgeTransitions, { validStatus: status.name });
|
|
});
|
|
}
|
|
else {
|
|
$scope.availableStatuses = [];
|
|
}
|
|
}
|
|
else if (type === EntityVO.TYPE_CHANGE || ((type === EntityVO.TYPE_PROBLEM || type === EntityVO.TYPE_KNOWNERROR) && !editStatusParams.isDraft)) {
|
|
$scope.availableStatuses = _.filter(metaData.statuses, function (status) {
|
|
return validStatuses.indexOf(status.name) !== -1;
|
|
});
|
|
}
|
|
else if (type === EntityVO.TYPE_RELEASE && !editStatusParams.isDraft) {
|
|
milestoneStatus = validStatuses;
|
|
milestoneMetadata = metaData;
|
|
$scope.availableMilestoneStatuses = _.filter(metaData.milestones, function (milestone) {
|
|
return _.findIndex(validStatuses, { 'milestone': milestone.name }) !== -1;
|
|
});
|
|
$scope.changeMileStone(selected.milestone, 'release');
|
|
}
|
|
else if (type === EntityVO.TYPE_PROBLEM && editStatusParams.isDraft) {
|
|
$scope.availableStatuses = _.reject(metaData.statuses, { isValidForCreate: false });
|
|
}
|
|
else {
|
|
$scope.availableStatuses = metaData.statuses;
|
|
}
|
|
$scope.ticket = angular.copy(originalTicket);
|
|
if (originalTicket.resCategorizations) {
|
|
$scope.resCategories = angular.copy(categoriesService.populateCategories(originalTicket.resCategorizations, metaData));
|
|
}
|
|
if (originalTicket.categorizations) {
|
|
//omit the resolution product categories from $scope.categories list as these are already available under $scope.resCategories
|
|
//ResCategories were appended to the categories list in ticket controller to show them on the ticket details page
|
|
//resolution categories are also already added in ticket controller
|
|
var categories = _.filter(originalTicket.categorizations, function (category) {
|
|
return category.name !== 'resolutionProduct' && category.name !== 'resolution';
|
|
});
|
|
$scope.categories = angular.copy(categoriesService.populateCategories(categories, metaData));
|
|
}
|
|
state.processing = false;
|
|
if (type === EntityVO.TYPE_CHANGE) {
|
|
if (isSingle) {
|
|
selected.manager = originalTicket.manager;
|
|
selected.group = originalTicket.managerGroup;
|
|
ticketService.getGroupMembers(selected.group.id, "role=changemanager").then(function (response) {
|
|
$scope.supportGroupPersons = response.results;
|
|
});
|
|
}
|
|
else {
|
|
$scope.ticket.scheduledStartDate = null;
|
|
$scope.ticket.scheduledEndDate = null;
|
|
$scope.ticket.actualStartDate = null;
|
|
$scope.ticket.actualEndDate = null;
|
|
}
|
|
searchService.getSupportGroupsList({ companyName: $scope.ticket.company.name, organization: ($scope.selected.group && $scope.selected.group.organization) || '', role: 'changemanager' }).then(function (response) {
|
|
$scope.coordinatorSupportGroups = response.supportGroups;
|
|
});
|
|
if ($scope.isFieldRequired('manager') &&
|
|
originalTicket.manager && !originalTicket.manager) {
|
|
$scope.noChangeManagerLoginId = true;
|
|
}
|
|
else {
|
|
$scope.noChangeManagerLoginId = false;
|
|
}
|
|
}
|
|
else if (type === EntityVO.TYPE_PROBLEM) {
|
|
if (isSingle) {
|
|
selected.manager = _.isEmpty(originalTicket.coordinator) || !originalTicket.coordinator.id ? null : originalTicket.coordinator;
|
|
selected.targetDate = _.isUndefined(originalTicket.targetDate) ? null : originalTicket.targetDate;
|
|
selected.assignee = _.isEmpty(originalTicket.assignee) || !originalTicket.assignee.id ? null : originalTicket.assignee;
|
|
if (!_.isEmpty(originalTicket.coordinatorGroup) && originalTicket.coordinatorGroup.name) {
|
|
selected.group = originalTicket.coordinatorGroup;
|
|
ticketService.getGroupMembers(selected.group.id, "role=problemcoordinator").then(function (response) {
|
|
$scope.supportGroupPersons = response.results;
|
|
});
|
|
}
|
|
else {
|
|
selected.group = null;
|
|
}
|
|
if (!_.isEmpty(originalTicket.supportGroup) && originalTicket.supportGroup.name) {
|
|
selected.assigneeGroup = originalTicket.supportGroup;
|
|
ticketService.getGroupMembers(selected.assigneeGroup.id, "").then(function (response) {
|
|
$scope.assignees = response.results;
|
|
});
|
|
}
|
|
else {
|
|
selected.assigneeGroup = null;
|
|
}
|
|
}
|
|
else {
|
|
selected.targetDate = null;
|
|
selected.manager = null;
|
|
selected.assignee = null;
|
|
selected.group = null;
|
|
selected.assigneeGroup = null;
|
|
}
|
|
var customerCompany = $scope.ticket.customer ? $scope.ticket.customer.company.name : $scope.ticket.company ? $scope.ticket.company.name : '', locationCompany = $scope.ticket.location ? $scope.ticket.location.companyName : null;
|
|
getCompanies('problemcoordinator').then(function () {
|
|
$scope.coordinatorCompany = originalTicket.coordinatorGroup.company;
|
|
$scope.assigneeCompany = originalTicket.assignee.company;
|
|
getSupportOrganizationsForCompany($scope.coordinatorCompany.name, 'problemcoordinator', null, locationCompany, null, null)
|
|
.then(function (response) {
|
|
$scope.coordinatorOrganizations = response;
|
|
$scope.coordinatorOrganization = { name: originalTicket.coordinatorGroup.organization };
|
|
});
|
|
getSupportOrganizationsForCompany($scope.assigneeCompany.name, null, null, locationCompany, null, null)
|
|
.then(function (response) {
|
|
$scope.assigneeOrganizations = response;
|
|
$scope.assigneeOrganization = { name: originalTicket.supportGroup.organization };
|
|
});
|
|
});
|
|
getSupportGroupsFromAllCompany('problemcoordinator', customerCompany, locationCompany, false).then(function (response) {
|
|
$scope.coordinatorSupportGroups = response;
|
|
});
|
|
getSupportGroupsFromAllCompany(null, customerCompany, locationCompany, true).then(function (response) {
|
|
$scope.assigneeGroups = response;
|
|
});
|
|
}
|
|
});
|
|
function getCompanies(role) {
|
|
var options, customerCompany = $scope.ticket.customer ? $scope.ticket.customer.company.name : $scope.ticket.company ? $scope.ticket.company.name : '';
|
|
if (!customerCompany) {
|
|
customerCompany = $scope.ticket.selectedCompany;
|
|
}
|
|
options = { customerCompany: customerCompany };
|
|
if ($scope.ticket.locationCompany && $scope.ticket.locationCompany.name) {
|
|
options.locationCompany = $scope.ticket.locationCompany.name;
|
|
}
|
|
else if (($scope.ticket.type === EntityVO.TYPE_TASK || $scope.ticket.type === EntityVO.TYPE_CHANGE) && $scope.ticket.id && $scope.ticket.company) {
|
|
options.locationCompany = $scope.ticket.company.name;
|
|
}
|
|
if (role) {
|
|
options.role = role;
|
|
}
|
|
return searchModel.getAssigneeSupportCompanies(options).then(function (companies) {
|
|
state.tooManySupportCompanies = companies.exceedsChunkSize;
|
|
state.tooManyAssigneeCompanies = companies.exceedsChunkSize;
|
|
$scope.companies = _.cloneDeep(companies.objects);
|
|
});
|
|
}
|
|
$scope.getCompaniesByName = function (name) {
|
|
return searchModel.getCompaniesByText(name).then(function (response) {
|
|
return response.companies;
|
|
});
|
|
};
|
|
$scope.getSupportOrganizationsByTextAndCompany = function (searchText, company) {
|
|
var companyName;
|
|
if (company === 'coordinatorCompany') {
|
|
companyName = ($scope.coordinatorCompany && $scope.coordinatorCompany.name) || '';
|
|
}
|
|
else if (company === 'assigneeCompany') {
|
|
companyName = ($scope.assigneeCompany && $scope.assigneeCompany.name) || '';
|
|
}
|
|
return searchModel.getSupportOrganizationsByTextAndCompany(searchText, companyName).then(function (response) {
|
|
if (company === 'coordinatorCompany') {
|
|
state.tooManySupportOrganizations = response.exceedsChunkSize;
|
|
}
|
|
else if (company === 'assigneeCompany') {
|
|
state.tooManyAssigneeOrganizations = response.exceedsChunkSize;
|
|
}
|
|
return response.organizations;
|
|
});
|
|
};
|
|
$scope.selectCoordinatorCompany = function (company) {
|
|
$scope.coordinatorCompany = company;
|
|
var locationCompany = $scope.ticket.location ? $scope.ticket.location.companyName : null;
|
|
getSupportOrganizationsForCompany(company.name, 'problemcoordinator', null, locationCompany, null, null)
|
|
.then(function (response) {
|
|
$scope.coordinatorOrganizations = response;
|
|
});
|
|
};
|
|
$scope.selectAssigneeCompany = function (company) {
|
|
var locationCompany = $scope.ticket.location ? $scope.ticket.location.companyName : null;
|
|
$scope.assigneeCompany = company;
|
|
getSupportOrganizationsForCompany(company.name, null, null, locationCompany, null, null)
|
|
.then(function (response) {
|
|
$scope.assigneeOrganizations = response;
|
|
});
|
|
};
|
|
$scope.selectCoordinatorOrganization = function (organization) {
|
|
var locationCompany = $scope.ticket.location ? $scope.ticket.location.companyName : null;
|
|
$scope.coordinatorOrganization = organization;
|
|
getSupportGroupsForCompanyAndOrg($scope.coordinatorCompany, organization, '', null, locationCompany, null, null)
|
|
.then(function (response) {
|
|
$scope.coordinatorSupportGroups = response;
|
|
});
|
|
};
|
|
$scope.selectAssigneeOrganization = function (organization) {
|
|
var locationCompany = $scope.ticket.location ? $scope.ticket.location.companyName : null;
|
|
$scope.assigneeOrganization = organization;
|
|
getSupportGroupsForCompanyAndOrg($scope.assigneeCompany, organization, '', null, locationCompany, null, null)
|
|
.then(function (response) {
|
|
$scope.assigneeGroups = response;
|
|
});
|
|
};
|
|
function getSupportOrganizationsForCompany(companyName, role, customerCompany, locationCompany, ownerCompany, primaryCompany) {
|
|
return searchModel.getSupportOrganizationsByCompany(companyName, null, role, customerCompany, locationCompany, ownerCompany, primaryCompany)
|
|
.then(function (response) {
|
|
if (role) {
|
|
state.tooManySupportOrganizations = response.exceedsChunkSize;
|
|
}
|
|
else {
|
|
state.tooManyAssigneeOrganizations = response.exceedsChunkSize;
|
|
}
|
|
return response.organizations;
|
|
});
|
|
}
|
|
function getSupportGroupsForCompanyAndOrg(company, organization, role, customerCompany, locationCompany, ownerCompany, primaryCompany) {
|
|
return searchModel.getSupportGroupsForCompanyAndOrg(company.name, organization.id === 'All' ? '' : organization.name, role, null, customerCompany, locationCompany, ownerCompany, primaryCompany)
|
|
.then(function (response) {
|
|
if (role) {
|
|
state.tooManySupportGroups = response.exceedsChunkSize;
|
|
}
|
|
else {
|
|
state.tooManyAssigneeGroups = response.exceedsChunkSize;
|
|
}
|
|
return response.supportGroups;
|
|
});
|
|
}
|
|
}]);
|
|
})();
|