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

249 lines
6.9 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::UserOutOfOffice;
use strict;
use warnings;
use Kernel::Language qw(Translatable);
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} );
}
# get param object
my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');
# get current start-hit and preferences
my $Name = $ParamObject->GetParam( Param => 'Name' ) || '';
my $PreferencesKey = 'UserDashboardUserOutOfOffice' . $Self->{Name};
$Self->{PrefKey} = 'UserDashboardPref' . $Self->{Name} . '-Shown';
$Self->{PageShown} = $Kernel::OM->Get('Kernel::Output::HTML::Layout')->{ $Self->{PrefKey} }
|| $Self->{Config}->{Limit} || 10;
$Self->{StartHit} = int( $ParamObject->GetParam( Param => 'StartHit' ) || 1 );
$Self->{CacheKey} = $Self->{Name};
return $Self;
}
sub Preferences {
my ( $Self, %Param ) = @_;
my @Params = (
{
Desc => Translatable('Shown'),
Name => $Self->{PrefKey},
Block => 'Option',
Data => {
5 => ' 5',
10 => '10',
15 => '15',
20 => '20',
25 => '25',
30 => '30',
35 => '35',
40 => '40',
45 => '45',
50 => '50',
},
SelectedID => $Self->{PageShown},
Translation => 0,
},
);
return @Params;
}
sub Config {
my ( $Self, %Param ) = @_;
return (
%{ $Self->{Config} },
# remember, do not allow to use page cache
# (it's not working because of internal filter)
CacheKey => undef,
CacheTTL => undef,
);
}
sub Run {
my ( $Self, %Param ) = @_;
# get config settings
my $SortBy = $Self->{Config}->{SortBy} || 'UserFullname';
# get cache object
my $CacheObject = $Kernel::OM->Get('Kernel::System::Cache');
# check cache
my $OutOfOffice = $CacheObject->Get(
Type => 'Dashboard',
Key => $Self->{CacheKey},
);
# get session info
my $CacheUsed = 1;
if ( !$OutOfOffice ) {
$CacheUsed = 0;
$OutOfOffice = {
User => {},
UserCount => 0,
UserData => {},
};
# get user object
my $UserObject = $Kernel::OM->Get('Kernel::System::User');
my %UserList = $UserObject->SearchPreferences(
Key => 'OutOfOffice',
Value => 1,
);
USERID:
for my $UserID ( sort keys %UserList ) {
next USERID if !$UserID;
# get user data
my %Data = $UserObject->GetUserData(
UserID => $UserID,
NoOutOfOffice => 1,
Valid => 1,
);
next USERID if !%Data;
my $CurSystemDateTimeObject = $Kernel::OM->Create('Kernel::System::DateTime');
my $CreateOutOfOfficeDTObject = sub {
my $Type = shift;
my $DTString = sprintf(
'%04d-%02d-%02d ' . ( $Type eq 'End' ? '23:59:59' : '00:00:00' ),
$Data{"OutOfOffice${Type}Year"}, $Data{"OutOfOffice${Type}Month"},
$Data{"OutOfOffice${Type}Day"}
);
return $Kernel::OM->Create(
'Kernel::System::DateTime',
ObjectParams => {
String => $DTString,
},
);
};
my $OOOStartDTObject = $CreateOutOfOfficeDTObject->('Start');
my $OOOEndDTObject = $CreateOutOfOfficeDTObject->('End');
next USERID if $OOOStartDTObject > $CurSystemDateTimeObject
|| $OOOEndDTObject < $CurSystemDateTimeObject;
$Data{OutOfOfficeUntil} = $OOOEndDTObject->ToString();
# remember user and data
$OutOfOffice->{User}->{ $Data{UserID} } = $Data{$SortBy};
$OutOfOffice->{UserCount}++;
$OutOfOffice->{UserData}->{ $Data{UserID} } = \%Data;
}
}
# do not show widget if there are no users out-of-office
return if !$OutOfOffice->{UserCount};
# set cache
if ( !$CacheUsed && $Self->{Config}->{CacheTTLLocal} ) {
$CacheObject->Set(
Type => 'Dashboard',
Key => $Self->{CacheKey},
Value => $OutOfOffice,
TTL => $Self->{Config}->{CacheTTLLocal} * 60,
);
}
# get layout object
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
# add page nav bar if needed
my $Total = $OutOfOffice->{UserCount} || 0;
if ( $OutOfOffice->{UserCount} > $Self->{PageShown} ) {
my $LinkPage = 'Subaction=Element;Name=' . $Self->{Name} . ';';
my %PageNav = $LayoutObject->PageNavBar(
StartHit => $Self->{StartHit},
PageShown => $Self->{PageShown},
AllHits => $Total || 1,
Action => 'Action=' . $LayoutObject->{Action},
Link => $LinkPage,
WindowSize => 5,
AJAXReplace => 'Dashboard' . $Self->{Name},
IDPrefix => 'Dashboard' . $Self->{Name},
AJAX => $Param{AJAX},
);
$LayoutObject->Block(
Name => 'ContentSmallTicketGenericNavBar',
Data => {
%{ $Self->{Config} },
Name => $Self->{Name},
%PageNav,
},
);
}
# show data
my %OutOfOfficeUser = %{ $OutOfOffice->{User} };
my %OutOfOfficeData = %{ $OutOfOffice->{UserData} };
my $Count = 0;
my $Limit = $LayoutObject->{ $Self->{PrefKey} } || $Self->{Config}->{Limit};
USERID:
for my $UserID ( sort { $OutOfOfficeUser{$a} cmp $OutOfOfficeUser{$b} } keys %OutOfOfficeUser )
{
$Count++;
next USERID if !$UserID;
next USERID if $Count < $Self->{StartHit};
last USERID if $Count >= ( $Self->{StartHit} + $Self->{PageShown} );
$LayoutObject->Block(
Name => 'ContentSmallUserOutOfOfficeRow',
Data => $OutOfOfficeData{$UserID},
);
}
my $Content = $LayoutObject->Output(
TemplateFile => 'AgentDashboardUserOutOfOffice',
Data => {
%{ $Self->{Config} },
Name => $Self->{Name},
},
AJAX => $Param{AJAX},
);
return $Content;
}
1;