"use strict"; (function () { 'use strict'; angular.module('chartModule') .factory('chartModel', ['chartService', 'configurationModel', '$q', '$filter', function (chartService, configurationModel, $q, $filter) { var self = { incidentBacklogDateRange: '30', workorderBacklogDateRange: '30', requestBacklogDateRange: '30', statsCompany: '', statsPerspective: 'myGroups', incidentStatsDataCache: {}, workorderStatsDataCache: {}, requestStatsDataCache: {}, statsConfig: {} }; self.getChartStatisticsData = function (ticketType, chartTypes, companies, supportGroups, days) { if (!_.isEmpty(self[ticketType + 'StatsDataCache'])) { return $q.when(self[ticketType + 'StatsDataCache']); } else if (self[ticketType + 'StatsDataRetrieving']) { return self[ticketType + 'StatsDataPromise']; } self[ticketType + 'StatsDataRetrieving'] = true; self[ticketType + 'StatsDataPromise'] = self.fetchData(ticketType, chartTypes, companies, supportGroups, days); return self[ticketType + 'StatsDataPromise']; }; self.fetchData = function (ticketType, chartTypes, companies, supportGroups, days) { return chartService.getChartStatisticsData(ticketType, chartTypes, companies, supportGroups, days) .then(function (response) { self[ticketType + 'StatsDataCache'][ticketType + 'AreaLineChartData'] = []; for (var i = 0; i < response.objects.length; i++) { if (response.objects[i].name === (ticketType + '-kpi')) { self[ticketType + 'StatsDataCache'][ticketType + 'KeyPerformanceData'] = transformKeyPerformanceData(response.objects[i].statsMetrics); } if (response.objects[i].name === (ticketType + '-open')) { self[ticketType + 'StatsDataCache'][ticketType + 'MultiBarChartData'] = transformMultiBarChartData(response.objects[i].statsMetrics, ticketType); } if (response.objects[i].name === (ticketType + '-backlog-all')) { self[ticketType + 'StatsDataCache'][ticketType + 'AreaLineChartData'].push(transformAreaLineChartData('all', '#66CCFF', response.objects[i].statsMetrics)); } if (response.objects[i].name === (ticketType + '-backlog-critical')) { self[ticketType + 'StatsDataCache'][ticketType + 'AreaLineChartData'].push(transformAreaLineChartData('critical', '#FF4500', response.objects[i].statsMetrics)); } } }) .finally(function () { self[ticketType + 'StatsDataRetrieving'] = false; }); }; self.getChangeData = function (companies, supportGroups) { self.statsConfig = configurationModel.get('change.dashboardStats'); var metricRequestStats = _.map(self.statsConfig, function (stat) { return { name: stat.name }; }); return self.fetchChangeData(companies, supportGroups, metricRequestStats); }; self.fetchChangeData = function (companies, supportGroups, stats) { return chartService.getChangeData(companies, supportGroups, stats) .then(function (resultStats) { _.forEach(self.statsConfig, function (stat) { var resultStat = _.find(resultStats, { name: stat.name }); stat.value = resultStat ? resultStat.value : 0; }); }); }; self.clearCache = function (ticketType) { self[ticketType + 'StatsDataCache'] = {}; }; function transformKeyPerformanceData(data) { var transformedData = {}; for (var i = 0; i < data.length; i++) { if (data[i].name === 'First-Call Resolutions') { transformedData.firstCallData = { value: $filter('number')(data[i].value) + '%', status: getResolutionStatus(data[i].value) }; } else if (data[i].name === 'On-Time Completions') { transformedData.onTimeData = { value: $filter('number')(data[i].value) + '%', status: getResolutionStatus(data[i].value) }; } else if (data[i].name === 'Resolutions Accepted' || data[i].name === 'Completion Accepted') { transformedData.acceptedData = { value: $filter('number')(data[i].value) + '%', status: getResolutionStatus(data[i].value) }; } else if (data[i].name === 'Scheduled Work Orders') { transformedData.scheduledData = { value: $filter('number')(data[i].value) + '%', status: getResolutionStatus(data[i].value) }; } } return transformedData; } function getResolutionStatus(resolutionValue) { var resolutionStatus = ''; if (resolutionValue >= 80) { resolutionStatus = 'good'; } else if (resolutionValue >= 60 && resolutionValue < 80) { resolutionStatus = 'average'; } else if (resolutionValue < 60) { resolutionStatus = 'bad'; } return resolutionStatus; } function transformMultiBarChartData(data, ticketType) { var transformedData = []; for (var i = 0; i < data.length; i++) { var obj = { key: '', values: [] }; obj.key = $filter('localizeLabel')(data[i].name, ticketType === EntityVO.TYPE_SERVICEREQUEST ? EntityVO.TYPE_URGENCY : EntityVO.TYPE_PRIORITY, ticketType); for (var j = 0; j < data[i].value.length; j++) { var childObj = []; childObj.push($filter('localizeLabel')(data[i].value[j].name, EntityVO.TYPE_STATUS, ticketType) || data[i].value[j].name); childObj.push(data[i].value[j].value); obj.values.push(childObj); } transformedData.push(obj); } return transformedData; } function transformAreaLineChartData(key, color, data) { var obj = { key: $filter('i18n')('chart.area.backlog.' + key), area: true, color: color, values: [] }; for (var i = 0; i < data.length; i++) { var childObj = []; childObj.push(data[i].name); childObj.push(data[i].value); obj.values.push(childObj); } return obj; } return self; } ]); }());