"use strict"; (function () { 'use strict'; angular.module('ticketModule') .service('ticketService', ['$resource', '$http', 'systemAlertService', '$q', 'slaCalculatorService', 'approvalService', '$filter', '$state', function ($resource, $http, systemAlertService, $q, slaCalculatorService, approvalService, $filter, $state) { var resource = $resource('', {}, { assignTickets: { url: '/smartit/rest/bulkupdate/assignee/', method: 'POST', isArray: true }, bulkUpdate: { url: '/smartit/rest/v2/bulkupdate/all', method: 'POST', isArray: true }, getBasicInformation: { url: '/smartit/rest/:type/:id', method: 'GET', isArray: true }, getBasicInformation_v2: { url: '/smartit/rest/v2/:type/:id', method: 'GET', isArray: true }, getARMessageInformation: { url: '/smartit/rest/ticket/:type/:id', method: 'GET', isArray: true }, getAttachmentsInfo: { url: '/smartit/rest/attachment/info/:type/:id', method: 'GET', isArray: true }, updateStatus: { url: '/smartit/rest/:type/status/:id', method: 'PUT', isArray: false }, update: { url: '/smartit/rest/:type/all/:id', method: 'PUT', isArray: true }, update_v2: { url: '/smartit/rest/v2/:type/all/:id', method: 'PUT', isArray: true }, getDraft: { url: '/smartit/rest/:type/draft', method: 'GET', isArray: true }, getDraft_v2: { url: '/smartit/rest/v2/:type/draft', method: 'GET', isArray: true }, getDraft_v3: { url: '/smartit/rest/v3/:type/draft', method: 'GET', isArray: true }, getDraft_WO_v2: { url: '/smartit/rest/v2/workorder/draft', method: 'POST', isArray: true }, saveDraft: { url: '/smartit/rest/:type', method: 'POST', isArray: true }, saveDraft_v2: { url: '/smartit/rest/v2/:type', method: 'POST', isArray: true }, getPriority: { url: '/smartit/rest/:type/calculatepriority', method: 'GET', isArray: true }, getChangePriority: { url: '/smartit/rest/change/calculatepriority', method: 'GET', isArray: true }, getChangeRiskRules: { url: '/smartit/rest/change/config/changerules', method: 'GET', isArray: true }, getIncidentRules: { url: '/smartit/rest/incident/config/rules', method: 'GET', isArray: true }, getReleasePriority: { url: '/smartit/rest/release/calculatepriority', method: 'GET', isArray: true }, getReleaseRisk: { url: '/smartit/rest/release/:id/calculateRisk', method: 'GET', isArray: false }, getGroupMembers: { url: '/smartit/rest/person/supportgrouppersons/:groupId?:params', method: 'GET', isArray: true }, getSupportGroupPersons: { url: '/smartit/rest/person/supportgrouppersons', method: 'GET', isArray: true }, applyAction: { url: '/smartit/rest/:type/action/:action/:id', method: 'POST', isArray: true }, getAvailableStatuses: { url: '/smartit/rest/:type/availablestatuses/:id', method: 'GET', isArray: true }, getTaskPhases: { url: '/smartit/rest/change/taskphases', method: 'GET', isArray: true }, getDraftForRelated: { url: '/smartit/rest/ticket/create/:type/from/:fromType/:id', method: 'POST', isArray: true }, getRelatedDraftFromAsset: { url: '/smartit/rest/ticket/create/:type/from/asset', method: 'POST', isArray: true }, saveImpactedAreas: { method: 'POST', isArray: false, url: '/smartit/rest/impactedarea/:type/:id' }, getRootCause: { method: 'GET', isArray: true, url: '/smartit/rest/category/problem/rootcause/rootcauseList' }, getImpactAnalysis: { method: 'GET', isArray: true, url: '/smartit/rest/asset/impact/:type/:id?returnRelationships=true' }, getImpactAnalysisMock: { method: 'GET', isArray: true, url: 'mocks/impact-analysis-large.json' }, getImpactAnalysisStatus: { method: 'GET', isArray: true, url: '/smartit/rest/asset/impactjob/:type/:id' }, impactAnalysisAction: { method: 'POST', isArray: true, url: '/smartit/rest/asset/impactjob/:type/:id' }, getAssigneeSupportGroupPersons: { url: '/smartit/rest/person/assignment/supportgrouppersons', method: 'POST', isArray: true }, getRecentlyUsedChangeTemplates: { url: '/smartit/rest/change/recentTemplate', method: 'POST', isArray: true }, getRecentlyUsedReleaseTemplates: { url: '/smartit/rest/release/recentTemplate', method: 'POST', isArray: true }, getURLforTaskFlow: { url: '/smartit/rest/task/taskFlowURL/:id', method: 'POST', isArray: false, responseType: 'text', transformResponse: function (data) { var flowURL = data; data = {}; data.url = flowURL; return data; } }, getVendorInfo: { url: '/smartit/rest/mcsm/:type/remedy/:displayId', // url: 'mocks/mcsm.json', method: 'GET', isArray: false }, copyChange: { url: '/smartit/rest/ticket/create/change/from/change/:ticketId', method: 'POST', isArray: true }, getGUIDByDisplayID: { url: '/smartit/rest/:type/displayid/:id', method: 'GET', isArray: true } }); function _encodeObjectValues(object) { _.forEach(object, function (value, key) { if (_.isString(value)) { object[key] = encodeURIComponent(value); } else if (_.isObject(value)) { _encodeObjectValues(value); } }); } this.assignTickets = function (props) { return resource.assignTickets(props).$promise; }; function showNotesAndWarning(messageInfos) { _.forEach(messageInfos, function (messageInfo) { if (messageInfo.type === "Note") { systemAlertService.info({ text: messageInfo.message, hide: 15000 }); } else if (messageInfo.type === "Warning") { systemAlertService.warning({ text: messageInfo.message, hide: 15000 }); } }); } this.getARMessageInformation = function (id, type) { return resource.getARMessageInformation({ id: id, type: type }).$promise.then(function (response) { showNotesAndWarning(response[0].items[0]); }); }; this.getBasicInformation = function (id, type) { var fn = type === EntityVO.TYPE_INCIDENT ? resource.getBasicInformation_v2 : resource.getBasicInformation; return fn({ id: id, type: type }).$promise.then(function (response) { var ticket = transformResponse(type, response[0].items[0]); ticket.syncTime = response[0].syncTime; return ticket; }); }; this.getDraft = function (type, templateId, summary, companyName, customer) { var fn = type === EntityVO.TYPE_INCIDENT ? resource.getDraft_v3 : resource.getDraft; var params = { type: type }; if (templateId) { params.templateId = templateId; } if (summary) { params.draftSummary = summary; } if (companyName) { params.companyName = companyName; } if (customer) { params.customerId = customer.loginId; } return fn(params).$promise.then(function (response) { return transformResponse(type, response[0].items[0]); }); }; this.getDraftWorkOrder = function (type, templateId, summary, data) { //SW00525630 check for WO case only var fn = resource.getDraft_WO_v2; var params = { type: type }; if (templateId) { params.templateId = templateId; } if (summary) { params.summary = summary; } if (data) { if (data.contact) { params.contact = data.contact; } if (data.customer) { params.customer = data.customer; } if (data.template) { params.templateName = data.template.name; } } return fn(params).$promise.then(function (response) { return transformResponse(type, response[0].items[0]); }); }; function transformResponse(type, response) { var dataObject = response; if (type === EntityVO.TYPE_TASK) { dataObject = new TaskVO().build(dataObject); } else if (type === EntityVO.TYPE_INCIDENT) { dataObject = new IncidentVO().build(dataObject); } else if (type === EntityVO.TYPE_WORKORDER) { dataObject = new WorkOrderVO().build(dataObject); } else if (type === EntityVO.TYPE_SERVICEREQUEST) { dataObject = new ServiceRequestVO().build(dataObject); approvalService.getApprovals(dataObject); } else if (type === EntityVO.TYPE_SBEREQUEST) { dataObject = new SbeRequestVO().build(dataObject); } else if (type === EntityVO.TYPE_OUTAGE) { dataObject = new OutageVO().build(dataObject); } else if (type === EntityVO.TYPE_CHANGE) { dataObject = new ChangeVO().build(dataObject); } else if (type === EntityVO.TYPE_RELEASE) { dataObject = new ReleaseVO().build(dataObject); } else if (type === EntityVO.TYPE_ACTIVITY) { dataObject = new ActivityVO().build(dataObject); } else if (type === EntityVO.TYPE_KNOWNERROR) { dataObject = new KnownErrorVO().build(dataObject); } else if (type === EntityVO.TYPE_PROBLEM) { dataObject = new ProblemVO().build(dataObject); } else if (type === EntityVO.TYPE_KNOWLEDGE) { dataObject = new KnowledgeArticleVO().build(dataObject); } else if (type === EntityVO.TYPE_DLP) { dataObject = new DLPVO().build(dataObject); } if (dataObject.status && dataObject.serviceTargets && dataObject.serviceTargets.length > 0) { slaCalculatorService.processServiceTarget(dataObject, dataObject.serviceTargets); } return dataObject; } this.getAttachmentsInfo = function (id, type) { return resource.getAttachmentsInfo({ id: id, type: type }).$promise .then(function (responce) { if (responce[0].items.length) { return responce[0].items; } return []; }); }; this.updateStatus = function (ids, statusData) { return resource.bulkUpdate({ ids: ids, attributeValueMap: statusData }).$promise.then(function (response) { var transFormedResponse = []; for (var i = 0; i < ids.length; i++) { var statusInfo = response[0].items[i].statusInfo; if (statusInfo && statusInfo.type === 'Warning') { systemAlertService.warning({ text: statusInfo.message, hide: 10000 }); } if (statusInfo && statusInfo.type === 'Failure') { systemAlertService.error({ text: statusInfo.message, clear: false }); } else { transFormedResponse.push(transformResponse(ids[i].type, response[0].items[i].responseObject)); } } if (transFormedResponse.length === 0) { throw ""; } return transFormedResponse; }); }; this.update = function (id, type, data, doNotShowErrorMsg) { var fn = type === EntityVO.TYPE_INCIDENT ? resource.update_v2 : resource.update; return fn({ id: id, type: type }, data).$promise.then(function (result) { if (result[0].items[0].statusInfo && result[0].items[0].statusInfo.type === 'Warning' && result[0].items[0].statusInfo.number !== 3000) { systemAlertService.warning({ text: result[0].items[0].statusInfo.message }); if (result[0].items[0].responseObject) { return transformResponse(type, result[0].items[0].responseObject); } } else if (result[0].items[0].responseObject) { return transformResponse(type, result[0].items[0].responseObject); } else if (result[0].items[0].statusInfo && result[0].items[0].statusInfo.number === 3000) { systemAlertService.modal({ title: $filter('i18n')('common.notification.dirty.title'), text: result[0].items[0].statusInfo.message, type: 'warning', buttons: [ { text: $filter('i18n')('common.button.continue') } ] }).result.then(function () { $state.go('dashboard'); }); } return {}; }).catch(function (err) { //Added this flag doNotShowErrorMsg, as we do not want to display the error message as part of this defect fix SW00559519. if (!doNotShowErrorMsg) { systemAlertService.error({ text: err.data.error, clear: false }); } return $q.reject(err); }); }; this.editHeader = function (id, type, headerData) { return this.update(id, type, headerData); }; this.editCustomerCard = function (id, type, data) { return this.update(id, type, data); }; this.saveDraft = function (type, params) { var fn = type === EntityVO.TYPE_INCIDENT ? resource.saveDraft_v2 : resource.saveDraft; return fn({ type: type }, params).$promise.then(function (result) { return result[0].items[0]; }); }; this.saveQuickTicketDraft = function (type, params) { var fn = type === EntityVO.TYPE_INCIDENT ? resource.saveDraft_v2 : resource.saveDraft; var criteria = { quickCreateMode: true }; return fn({ type: type, criteria: criteria }, params).$promise.then(function (result) { return result[0].items[0]; }); }; this.getPriority = function (companyName, impact, urgency, type) { return resource.getPriority({ type: type, companyName: companyName, impact: impact, urgency: urgency }).$promise.then(function (response) { return response[0].items[0] || []; }); }; this.getChangePriority = function (companyName, impact, urgency) { return resource.getChangePriority({ companyName: companyName, impact: impact, urgency: urgency }).$promise.then(function (response) { return response[0].items[0] || []; }); }; this.getChangeRiskRules = function (companyName) { //change company name variable return resource.getChangeRiskRules({ companyName: companyName }).$promise.then(function (response) { return response[0].items[0] || []; }); }; this.getIncidentRules = function (companyName) { //change company name variable return resource.getIncidentRules({ companyName: companyName }).$promise.then(function (response) { return response[0].items[0] || []; }); }; this.getReleasePriority = function (companyName, impact, urgency) { return resource.getReleasePriority({ companyName: companyName, impact: impact, urgency: urgency }).$promise.then(function (response) { return response[0].items[0] || []; }); }; this.getReleaseRisk = function (releaseId) { return resource.getReleaseRisk({ id: releaseId }).$promise.then(function (response) { return response; }); }; this.getGroupMembers = function (id, params) { return resource.getGroupMembers({ groupId: id, params: params, thumbnail: true }).$promise.then(function (result) { return handleSupportGroupPersons(result[0].items[0].objects, true); }); }; this.getAssigneeSupportGroupPersons = function (company, organization, personName, personLoginId, role, chunkSize, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany, available, fromBlade) { var inputParams = { companyName: company }, urlParams = {}; //inputParams.thumbnail = true; //to be enabled when thumbnail is supported if (organization) { inputParams.organization = organization; } if (personName) { urlParams.searchText = personName; } if (personLoginId) { inputParams.personLoginId = decodeURIComponent(personLoginId); } if (role) { inputParams.role = role; } if (chunkSize) { urlParams.chunkInfo = { startIndex: 0, chunkSize: chunkSize }; } if (customerCompany) { inputParams.customerCompany = customerCompany; } if (locationCompany) { inputParams.locationCompany = locationCompany; } if (angular.isDefined(ownerCompany)) { inputParams.ownerCompany = ownerCompany; } if (primaryCompany) { inputParams.primaryCompany = primaryCompany; } if (authorCompany) { inputParams.authorCompany = authorCompany; } inputParams.available = available; return resource.getAssigneeSupportGroupPersons(urlParams, inputParams).$promise .then(function (result) { if (!_.isUndefined(fromBlade) && fromBlade) { return handleSupportGroupPersonsForBlade(result[0].items[0].objects, result[0].items[0].totalMatches, result[0].items[0].exceedsChunkSize); } return handleSupportGroupPersons(result[0].items[0].objects, result[0].items[0].exceedsChunkSize); }); }; this.getPersonsBySupportCompanyAndOrg = function (company, organization, personName, role, chunkSize, customerCompany, locationCompany, ownerCompany, primaryCompany, fromBlade) { var inputParams = { companyName: company, thumbnail: true }; if (organization) { inputParams.organization = organization; } if (personName) { inputParams.personText = personName; } if (role) { inputParams.role = role; } if (chunkSize) { inputParams.chunkInfo = { startIndex: 0, chunkSize: chunkSize }; } if (customerCompany) { inputParams.customerCompany = customerCompany; } if (locationCompany) { inputParams.locationCompany = locationCompany; } if (angular.isDefined(ownerCompany)) { inputParams.ownerCompany = ownerCompany; } if (primaryCompany) { inputParams.primaryCompany = primaryCompany; } return resource.getSupportGroupPersons(inputParams).$promise .then(function (result) { if (!_.isUndefined(fromBlade) && fromBlade) { return handleSupportGroupPersonsForBlade(result[0].items[0].objects, result[0].items[0].totalMatches, result[0].items[0].exceedsChunkSize); } else { return handleSupportGroupPersons(result[0].items[0].objects, result[0].items[0].exceedsChunkSize); } }); }; this.getAssigneeBySupportGroupId = function (supportGroupId, personName, personLoginId, customerCompany, role, chunkSize, available, primaryCompany, locationCompany, ownerCompany, authorCompany, fromBlade) { var inputParams = { supportGroupId: supportGroupId }, urlParams = {}; //inputParams.thumbnail = true //to be enabled when thumbnail is supported if (personName) { urlParams.searchText = personName; } if (personLoginId) { inputParams.personLoginId = personLoginId; } if (customerCompany) { inputParams.customerCompany = customerCompany; } if (locationCompany) { inputParams.locationCompany = locationCompany; } if (angular.isDefined(ownerCompany)) { inputParams.ownerCompany = ownerCompany; } if (angular.isDefined(authorCompany)) { inputParams.authorCompany = authorCompany; } if (role) { inputParams.role = role; } if (chunkSize) { urlParams.chunkInfo = { startIndex: 0, chunkSize: chunkSize }; } if (primaryCompany) { inputParams.primaryCompany = primaryCompany; } inputParams.available = available; return resource.getAssigneeSupportGroupPersons(urlParams, inputParams).$promise .then(function (result) { if (!_.isUndefined(fromBlade) && fromBlade) { return handleSupportGroupPersonsForBlade(result[0].items[0].objects, result[0].items[0].totalMatches, result[0].items[0].exceedsChunkSize); } return handleSupportGroupPersons(result[0].items[0].objects, result[0].items[0].exceedsChunkSize); }); }; this.getPersonsBySupportGroupId = function (supportGroupId, personName, role, chunkSize, fromBlade) { var inputParams = { supportGroupId: supportGroupId, thumbnail: true }; if (personName) { inputParams.personText = personName; } if (role) { inputParams.role = role; } if (chunkSize) { inputParams.chunkInfo = { startIndex: 0, chunkSize: chunkSize }; } return resource.getSupportGroupPersons(inputParams).$promise .then(function (result) { if (!_.isUndefined(fromBlade) && fromBlade) { return handleSupportGroupPersonsForBlade(result[0].items[0].objects, result[0].items[0].totalMatches, result[0].items[0].exceedsChunkSize); } return handleSupportGroupPersons(result[0].items[0].objects, result[0].items[0].exceedsChunkSize); }); }; function handleSupportGroupPersonsForBlade(result, totalMatches, exceedsChunkSize) { var supportPersonList = result.map(function (person) { return new PersonVO().build(person); }); var results; results = _.uniqBy(supportPersonList, function (supportPerson) { return supportPerson.loginId + '*' + supportPerson.supportGroupId; }); var searchResult = {}; searchResult.results = results; searchResult.totalMatches = totalMatches; searchResult.exceedsChunkSize = exceedsChunkSize; return searchResult; } function handleSupportGroupPersons(result, exceedsChunkSize) { var supportPersonList = result.map(function (person) { return new PersonVO().build(person); }); var results; results = _.uniqBy(supportPersonList, function (supportPerson) { return supportPerson.loginId + '*' + supportPerson.supportGroupId; }); var searchResult = {}; searchResult.results = results; searchResult.exceedsChunkSize = exceedsChunkSize; return searchResult; } this.applyAction = function (id, type, action, data) { return resource.applyAction({ id: id, type: type, action: action }, data).$promise; }; this.getAvailableStatuses = function (id, type) { return resource.getAvailableStatuses({ id: id, type: type }).$promise.then(function (response) { return response[0].items || []; }); }; this.getTaskPhases = function (params) { return resource.getTaskPhases(params).$promise .then(function (response) { return response[0].items; }); }; this.getDraftForRelated = function (type, fromType, id, templateId) { //passing empty data to POST call - for params to get replaced in the url var params = { id: id, fromType: fromType, type: type }; if (templateId) { params.templateId = templateId; } return resource.getDraftForRelated(params, {}).$promise.then(function (response) { return transformResponse(type, response[0].items[0]); }); }; this.getRelatedDraftFromAsset = function (type, asset, templateId) { var params = { type: type }; if (templateId) { params.templateId = templateId; } delete asset.accessMappings; delete asset.allCategories; delete asset.lifecycleDates; return resource.getRelatedDraftFromAsset(params, asset).$promise.then(function (response) { return transformResponse(type, response[0].items[0]); }); }; this.saveImpactedAreas = function (id, type, params) { return resource.saveImpactedAreas({ id: id, type: type }, params).$promise; }; this.deleteImpactedAreas = function (id, type, params) { return $http({ method: 'DELETE', headers: { 'Content-Type': 'application/json' }, url: '/smartit/rest/impactedarea/' + type + '/' + id, data: params }) .catch(function (err) { systemAlertService.error({ text: err.data && (err.data.defaultMessage || err.data.error), clear: false }); return $q.reject(err); }); }; this.getRootCause = function (params) { return resource .getRootCause({ criteria: params }) .$promise.then(function (response) { var rootCause = []; for (var i = 0; i < response[0].items[0].length; i++) { rootCause.push({ name: response[0].items[0][i], label: response[0].items[0][i] }); } return rootCause; }); }; this.getImpactAnalysisVisualisationData = function (type, id) { return resource.getImpactAnalysis({ id: id, type: type }).$promise; //return resource.getImpactAnalysisMock().$promise; }; this.getImpactAnalysisStatus = function (id, type) { return resource.getImpactAnalysisStatus({ id: id, type: type }).$promise.then(function (response) { return response[0].items[0] || []; }); }; this.impactAnalysisAction = function (id, type, params) { return resource.impactAnalysisAction({ id: id, type: type }, params).$promise.then(function (response) { return response[0].items[0] || []; }); }; this.getRecentlyUsedChangeTemplates = function (templateList) { return resource.getRecentlyUsedChangeTemplates({ 'templateList': templateList }).$promise; }; this.getRecentlyUsedReleaseTemplates = function (templateList) { return resource.getRecentlyUsedReleaseTemplates({ 'templateList': templateList }).$promise; }; this.getURLforTaskFlow = function (id, params) { return resource.getURLforTaskFlow({ id: id }, params).$promise; }; this.getVendorInfo = function (displayId, type) { return resource.getVendorInfo({ displayId: displayId, type: type }).$promise.then(function (response) { return response && response.tickets || []; }); }; this.copyChange = function (ticketId, params) { return resource.copyChange({ ticketId: ticketId }, params).$promise.then(function (response) { return transformResponse('change', response[0].items[0]); }); }; this.getGUIDByDisplayID = function (type, id) { return resource.getGUIDByDisplayID({ type: type, id: id }).$promise.then(function (response) { return response[0].items[0] && response[0].items[0].id || undefined; }); }; }]); }());