142 lines
7.5 KiB
JavaScript
142 lines
7.5 KiB
JavaScript
"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));
|
|
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;
|
|
}
|
|
]);
|
|
}());
|