SmartIT_Extensions/BMC/smart-it-full/scripts/app/chart/chart-model.js

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;
}
]);
}());