Files
scripts/Perl OTRS/Kernel/Output/HTML/Dashboard/Stats.pm
2024-10-14 00:08:40 +02:00

283 lines
8.4 KiB
Perl

# --
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --
package Kernel::Output::HTML::Dashboard::Stats;
use strict;
use warnings;
use Kernel::System::VariableCheck qw(:all);
use Kernel::System::Stats;
use Kernel::Output::HTML::Statistics::View;
our $ObjectManagerDisabled = 1;
sub new {
my ( $Type, %Param ) = @_;
# allocate new hash for object
my $Self = {%Param};
bless( $Self, $Type );
# get needed parameters
for my $Needed (qw(Config Name UserID)) {
die "Got no $Needed!" if ( !$Self->{$Needed} );
}
# Settings
$Self->{PrefKeyStatsConfiguration} = 'UserDashboardStatsStatsConfiguration' . $Self->{Name};
return $Self;
}
sub Preferences {
my ( $Self, %Param ) = @_;
# get StatID
my $StatID = $Self->{Config}->{StatID};
my $Stat = $Kernel::OM->Get('Kernel::System::Stats')->StatsGet( StatID => $StatID );
# get the object name
if ( $Stat->{StatType} eq 'static' ) {
$Stat->{ObjectName} = $Stat->{File};
}
# if no object name is defined use an empty string
$Stat->{ObjectName} ||= '';
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
my $UserObject = $Kernel::OM->Get('Kernel::System::User');
# check if the user has preferences for this widget
my %Preferences = $UserObject->GetPreferences(
UserID => $Self->{UserID},
);
my $StatsSettings;
if ( $Preferences{ $Self->{PrefKeyStatsConfiguration} } ) {
$StatsSettings = $Kernel::OM->Get('Kernel::System::JSON')->Decode(
Data => $Preferences{ $Self->{PrefKeyStatsConfiguration} },
);
}
my %Format = %{ $Kernel::OM->Get('Kernel::Config')->Get('Stats::Format') || {} };
my %FilteredFormats;
for my $Key ( sort keys %Format ) {
$FilteredFormats{$Key} = $Format{$Key} if $Key =~ m{^D3}smx;
}
my @Errors;
my %GetParam = eval {
$Kernel::OM->Get('Kernel::Output::HTML::Statistics::View')->StatsParamsGet(
Stat => $Stat,
UserGetParam => $StatsSettings,
UserID => $Self->{UserID},
);
};
if ( $@ || ref $@ eq 'ARRAY' ) {
@Errors = @{$@};
}
# Fetch the stat again as StatsParamGet might have modified it in between.
$Stat = $Kernel::OM->Get('Kernel::System::Stats')->StatsGet(
StatID => $StatID,
UserID => $Self->{UserID},
);
my $StatsParamsWidget = $Kernel::OM->Get('Kernel::Output::HTML::Statistics::View')->StatsParamsWidget(
Stat => $Stat,
UserGetParam => $StatsSettings,
Formats => \%FilteredFormats,
UserID => $Self->{UserID},
);
# This indicates that there are configuration errors in the statistic.
# In that case we show a warning in Run() and no configuration here.
if ( !$StatsParamsWidget ) {
return;
}
my $SettingsHTML = $LayoutObject->Output(
TemplateFile => 'AgentDashboardStatsSettings',
Data => {
%{$Stat},
Errors => \@Errors,
JSONFieldName => $Self->{PrefKeyStatsConfiguration},
NamePref => $Self->{Name},
StatsParamsWidget => $StatsParamsWidget,
},
);
my @Params = (
{
Desc => 'Stats Configuration',
Name => $Self->{PrefKeyStatsConfiguration},
Block => 'RawHTML',
HTML => $SettingsHTML,
},
);
return @Params;
}
sub Config {
my ( $Self, %Param ) = @_;
return (
%{ $Self->{Config} }
);
}
sub Run {
my ( $Self, %Param ) = @_;
my $StatID = $Self->{Config}->{StatID};
my %Preferences = $Kernel::OM->Get('Kernel::System::User')->GetPreferences(
UserID => $Self->{UserID},
);
my $StatsSettings = {};
# get JSON object
my $JSONObject = $Kernel::OM->Get('Kernel::System::JSON');
if ( $Preferences{ $Self->{PrefKeyStatsConfiguration} } ) {
$StatsSettings = $JSONObject->Decode(
Data => $Preferences{ $Self->{PrefKeyStatsConfiguration} },
);
}
my $Stat = $Kernel::OM->Get('Kernel::System::Stats')->StatsGet( StatID => $StatID );
my $StatConfigurationValid = $Kernel::OM->Get('Kernel::Output::HTML::Statistics::View')->StatsConfigurationValidate(
Stat => $Stat,
Errors => {},
UserID => $Self->{UserID},
);
my $StatParametersValid;
eval {
$Kernel::OM->Get('Kernel::Output::HTML::Statistics::View')->StatsParamsGet(
Stat => $Stat,
UserGetParam => $StatsSettings,
UserID => $Self->{UserID},
);
$StatParametersValid = 1;
};
my $CachedData;
if ( $StatConfigurationValid && $StatParametersValid ) {
$CachedData = $Kernel::OM->Get('Kernel::System::Stats')->StatsResultCacheGet(
StatID => $StatID,
UserGetParam => $StatsSettings,
UserID => $Self->{UserID},
);
}
my $Format = $StatsSettings->{Format};
if ( !$Format ) {
my $Stat = $Kernel::OM->Get('Kernel::System::Stats')->StatsGet(
StatID => $StatID,
UserID => $Self->{UserID},
);
STATFORMAT:
for my $StatFormat ( @{ $Stat->{Format} || [] } ) {
if ( $StatFormat =~ m{^D3}smx ) {
$Format = $StatFormat;
last STATFORMAT;
}
}
}
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
# check permission for AgentStatistics
my $StatsReg = $Kernel::OM->Get('Kernel::Config')->Get('Frontend::Module')->{'AgentStatistics'};
my $AgentStatisticsFrontendPermission = 0;
if ( !$StatsReg->{GroupRo} && !$StatsReg->{Group} ) {
$AgentStatisticsFrontendPermission = 1;
}
else {
my $GroupObject = $Kernel::OM->Get('Kernel::System::Group');
TYPE:
for my $Type (qw(GroupRo Group)) {
my $StatsGroups = ref $StatsReg->{$Type} eq 'ARRAY' ? $StatsReg->{$Type} : [ $StatsReg->{$Type} ];
GROUP:
for my $StatsGroup ( @{$StatsGroups} ) {
next GROUP if !$StatsGroup;
next GROUP if !$GroupObject->PermissionCheck(
UserID => $Self->{UserID},
GroupName => $StatsGroup,
Type => 'ro',
);
$AgentStatisticsFrontendPermission = 1;
last TYPE;
}
}
}
my $StatsResultDataJSON = $LayoutObject->JSONEncode(
Data => $CachedData,
NoQuotes => 1,
);
my $StatsFormatJSON = $LayoutObject->JSONEncode(
Data => $Format,
NoQuotes => 1,
);
# send data to JS
$LayoutObject->AddJSData(
Key => 'StatsData' . $StatID,
Value => {
Name => $Self->{Name},
Format => $StatsFormatJSON,
StatResultData => $StatsResultDataJSON,
Preferences => $Preferences{ 'GraphWidget' . $Self->{Name} } || '{}',
MaxXaxisAttributes => $Kernel::OM->Get('Kernel::Config')->Get('Stats::MaxXaxisAttributes'),
},
);
if ( $Self->{UserRefreshTime} ) {
my $Refresh = 60 * $Self->{UserRefreshTime};
$LayoutObject->AddJSData(
Key => 'WidgetRefreshStat' . $StatID,
Value => {
Name => $Self->{Name},
NameHTML => $Self->{Name},
RefreshTime => $Refresh,
},
);
}
my $Content = $LayoutObject->Output(
TemplateFile => 'AgentDashboardStats',
Data => {
Name => $Self->{Name},
StatConfigurationValid => $StatConfigurationValid,
StatParametersValid => $StatParametersValid,
StatResultData => $CachedData,
Stat => $Stat,
Format => $Format,
AgentStatisticsFrontendPermission => $AgentStatisticsFrontendPermission,
Preferences => $Preferences{ 'GraphWidget' . $Self->{Name} } || '{}',
},
AJAX => $Param{AJAX},
);
return $Content;
}
1;