"use strict"; (function () { 'use strict'; angular.module('myitsmApp') .controller('ApproversDialogController', ['$scope', 'changeApprovalParams', 'approvalModel', 'systemAlertService', '$timeout', 'searchModel', '$q', 'i18nService', 'events', '$rootScope', 'configurationModel', function ($scope, changeApprovalParams, approvalModel, systemAlertService, $timeout, searchModel, $q, i18nService, events, $rootScope, configurationModel) { var state = { loadingApprovers: false, loadingApproverSearch: false, loadingCompanies: false, loadingOrganizations: false, loadingGroups: false, tooManyCompanies: false, tooManyOrganizations: false, tooManySupportGroups: false }, allOrganizations = { name: i18nService.getLocalizedString('assignBlade.organization.all'), id: 'All' }; $scope.state = state; $scope.addApproverAllowed = changeApprovalParams.addApproverAllowed; $scope.ticketType = changeApprovalParams.type; $scope.showClosedTabDefault = changeApprovalParams.showClosedTabDefault; $scope.approverSelected = false; $scope.approver = {}; $scope.assigneeCompany = {}; $scope.assigneeOrganization = {}; $scope.assigneeGroup = null; $scope.companies = []; $scope.organizations = []; $scope.groups = []; $scope.showMailstopOnPersoncard = configurationModel.showMailstopOnPersoncard; $scope.showPhoneNumOnPersonCard = configurationModel.showPhoneNumOnPersonCard; if (!changeApprovalParams.approvalList) { refreshApprovalList(); } else { $scope.closedList = processClosedList(changeApprovalParams.approvalList.closed); $scope.openList = processOpenList(changeApprovalParams.approvalList.open); } $scope.$watch('approver.model', function (newValue) { $scope.approverSelected = _.isObject(newValue); }); $scope.enableSearchApprover = function () { $scope.showSearchApprover = true; $scope.showSearchApprovalGroup = false; }; $scope.enableSearchApprovalGroup = function () { $scope.showSearchApprover = false; $scope.showSearchApprovalGroup = true; $scope.getApproverSupportCompanies(); }; $scope.getApproverByText = function (searchText) { return approvalModel.getApproverByText(searchText); }; $scope.getApproverSupportCompanies = function () { state.loadingCompanies = true; return searchModel.getApproverSupportCompanies(null, null, $scope.ticketType).then(function (companies) { state.loadingCompanies = false; if (companies.length >= searchModel.companyChunkSize) { $scope.companies = []; state.tooManyCompanies = true; } else { $scope.companies = _.cloneDeep(companies); state.tooManyCompanies = false; } }); }; $scope.getApproverSupportCompaniesByName = function (searchText) { return searchModel.getApproverSupportCompanies(searchText, null, $scope.ticketType).then(function (companies) { $scope.companies = _.cloneDeep(companies); }); }; function getApproverSupportOrganizations() { state.loadingOrganizations = true; return searchModel.getApproverSupportOrganizations(null, $scope.assigneeCompany.name, null, $scope.ticketType) .then(function (organizations) { state.loadingOrganizations = false; if (organizations.length >= searchModel.organizationChunkSize) { state.tooManyOrganizations = true; return []; } if (organizations.length && organizations[0].id !== 'All') { organizations.unshift(allOrganizations); } state.tooManyOrganizations = false; return organizations; }); } $scope.getApproverSupportOrganizationsByName = function (searchText) { return searchModel.getApproverSupportOrganizations(searchText, $scope.assigneeCompany.name, null, $scope.ticketType); }; function getApproverSupportGroups() { state.loadingGroups = true; return searchModel.getApproverSupportGroups(null, $scope.assigneeCompany.name, $scope.assigneeOrganization.id === 'All' ? null : $scope.assigneeOrganization.name, null, $scope.ticketType) .then(function (groups) { state.loadingGroups = false; state.tooManySupportGroups = groups.exceedsChunkSize; return groups.supportGroups; }); } $scope.getApproverSupportGroupsByName = function (searchText) { return searchModel.getApproverSupportGroups(searchText, $scope.assigneeCompany.name, $scope.assigneeOrganization.id === 'All' ? null : $scope.assigneeOrganization.name, null, $scope.ticketType) .then(function (response) { return response.supportGroups; }); }; $scope.selectCompany = function (company) { $scope.assigneeCompany = company; $scope.organizations = []; $scope.assigneeOrganization = allOrganizations; $scope.groups = []; $scope.assigneeGroup = null; var promises = []; if ($scope.assigneeCompany.name) { promises.push(getApproverSupportOrganizations()); promises.push(getApproverSupportGroups()); } $q.all(promises).then(function (results) { $scope.organizations = results[0]; $scope.groups = results[1]; }); }; $scope.selectOrganization = function (organization) { $scope.assigneeOrganization = organization; $scope.groups = []; $scope.assigneeGroup = null; getApproverSupportGroups() .then(function (results) { $scope.groups = results; }); }; $scope.selectGroup = function (group) { $scope.assigneeGroup = group; }; $scope.addApprover = function () { if (!_.isObject($scope.approver.model) || !$scope.approver.model.loginId) { return; } $scope.state.loadingApprovers = true; approvalModel.addApprover('addApprover', $scope.approver.model.loginId, changeApprovalParams.id, changeApprovalParams.type, changeApprovalParams.statusValue) .then(handleAddApprover) .finally(function () { $scope.state.loadingApprovers = false; }); }; $scope.addApprovalGroup = function () { $scope.state.loadingApprovers = true; approvalModel.addApprover('addApproverGroup', $scope.assigneeGroup.id, changeApprovalParams.id, changeApprovalParams.type, changeApprovalParams.statusValue) .then(handleAddApprover) .finally(function () { $scope.state.loadingApprovers = false; }); }; function handleAddApprover(response) { if (response && response.statusInfo && response.statusInfo.number === 2000) { $timeout(function () { refreshApprovalList(); }, 500); } else { systemAlertService.error({ text: response && response.statusInfo && response.statusInfo.message, clear: false }); } } function refreshApprovalList() { $scope.state.loadingApprovers = true; approvalModel.getListOfApprovers(changeApprovalParams, true) .then(function (approversList) { if (approversList && approversList.approvalList) { $scope.closedList = processClosedList(approversList.approvalList.closed); $scope.openList = processOpenList(approversList.approvalList.open); $rootScope.$broadcast(events.REFRESH_APPROVAL_LIST, { ignoreCache: false }); } }) .finally(function () { $scope.state.loadingApprovers = false; }); } function processClosedList(list) { var closedList = [], groupedByAlternateList = {}; _.forEach(list, function (item) { var itemCopy = _.cloneDeep(item); if (!itemCopy.alternateApprover) { closedList.push(itemCopy); return; } if (!groupedByAlternateList[itemCopy.signatureId]) { itemCopy.approvedFor = [itemCopy.approver.fullName]; itemCopy.approver = itemCopy.alternateApprover; groupedByAlternateList[itemCopy.signatureId] = itemCopy; } else { groupedByAlternateList[itemCopy.signatureId].approvedFor.push(itemCopy.approver.fullName); } }); return closedList.concat(_.values(groupedByAlternateList)); } function processOpenList(list) { var groupedOpenList = { "singleApprovers": [], "multipleApprovers": [] }; var openList = _.groupBy(list, 'signatureId'); _.forEach(openList, function (value) { if (value.length < 2) { groupedOpenList.singleApprovers = groupedOpenList.singleApprovers.concat(value); } else { groupedOpenList.multipleApprovers.push(value); } }); return groupedOpenList; } }]); })();