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

453 lines
15 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::CustomerUserList;
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 filter
my $Name = $ParamObject->GetParam( Param => 'Name' ) || '';
my $PreferencesKey = 'UserDashboardCustomerUserListFilter' . $Self->{Name};
$Self->{PrefKey} = 'UserDashboardPref' . $Self->{Name} . '-Shown';
$Self->{PageShown} = $Kernel::OM->Get('Kernel::Output::HTML::Layout')->{ $Self->{PrefKey} }
|| $Self->{Config}->{Limit};
$Self->{StartHit} = int( $ParamObject->GetParam( Param => 'StartHit' ) || 1 );
return $Self;
}
sub Preferences {
my ( $Self, %Param ) = @_;
my @Params = (
{
Desc => Translatable('Shown customer users'),
Name => $Self->{PrefKey},
Block => 'Option',
# Block => 'Input',
Data => {
5 => ' 5',
10 => '10',
15 => '15',
20 => '20',
25 => '25',
},
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)
CacheTTL => undef,
CacheKey => undef,
);
}
sub Run {
my ( $Self, %Param ) = @_;
return if !$Param{CustomerID};
# get customer user object
my $CustomerUserObject = $Kernel::OM->Get('Kernel::System::CustomerUser');
my $CustomerIDs = { $CustomerUserObject->CustomerSearch( CustomerIDRaw => $Param{CustomerID} ) };
# add page nav bar
my $Total = scalar keys %{$CustomerIDs};
# get layout object
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
my $LinkPage = 'Subaction=Element;Name='
. $Self->{Name} . ';'
. 'CustomerID='
. $LayoutObject->LinkEncode( $Param{CustomerID} ) . ';';
my %PageNav = $LayoutObject->PageNavBar(
StartHit => $Self->{StartHit},
PageShown => $Self->{PageShown},
AllHits => $Total || 1,
Action => 'Action=' . $LayoutObject->{Action},
Link => $LinkPage,
AJAXReplace => 'Dashboard' . $Self->{Name},
IDPrefix => 'Dashboard' . $Self->{Name},
AJAX => $Param{AJAX},
);
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserListNavBar',
Data => {
%{ $Self->{Config} },
Name => $Self->{Name},
%PageNav,
},
);
# get config object
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
# check the permission for the SwitchToCustomer feature
if ( $ConfigObject->Get('SwitchToCustomer') ) {
# get group object
my $GroupObject = $Kernel::OM->Get('Kernel::System::Group');
# get the group id which is allowed to use the switch to customer feature
my $SwitchToCustomerGroupID = $GroupObject->GroupLookup(
Group => $ConfigObject->Get('SwitchToCustomer::PermissionGroup'),
);
# get user groups, where the user has the rw privilege
my %Groups = $GroupObject->PermissionUserGet(
UserID => $Self->{UserID},
Type => 'rw',
);
# if the user is a member in this group he can access the feature
if ( $Groups{$SwitchToCustomerGroupID} ) {
$Self->{SwitchToCustomerPermission} = 1;
$LayoutObject->Block(
Name => 'OverviewResultSwitchToCustomer',
);
}
}
# Show add new customer button if:
# - The agent has permission to use the module
# - There are writable customer backends
my $AddAccess;
TYPE:
for my $Permission (qw(ro rw)) {
$AddAccess = $LayoutObject->Permission(
Action => 'AdminCustomerUser',
Type => $Permission,
);
last TYPE if $AddAccess;
}
# Get writable data sources.
my %CustomerSource = $CustomerUserObject->CustomerSourceList(
ReadOnly => 0,
);
if ( $AddAccess && scalar keys %CustomerSource ) {
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserAdd',
Data => {
CustomerID => $Self->{CustomerID},
},
);
$Self->{EditCustomerPermission} = 1;
}
# get the permission for the phone ticket creation
my $NewAgentTicketPhonePermission = $LayoutObject->Permission(
Action => 'AgentTicketPhone',
Type => 'rw',
);
# check the permission for the phone ticket creation
if ($NewAgentTicketPhonePermission) {
$LayoutObject->Block(
Name => 'OverviewResultNewAgentTicketPhone',
);
}
# get the permission for the email ticket creation
my $NewAgentTicketEmailPermission = $LayoutObject->Permission(
Action => 'AgentTicketEmail',
Type => 'rw',
);
# check the permission for the email ticket creation
if ($NewAgentTicketEmailPermission) {
$LayoutObject->Block(
Name => 'OverviewResultNewAgentTicketEmail',
);
}
my @CustomerKeys = sort { lc( $CustomerIDs->{$a} ) cmp lc( $CustomerIDs->{$b} ) } keys %{$CustomerIDs};
@CustomerKeys = splice @CustomerKeys, $Self->{StartHit} - 1, $Self->{PageShown};
for my $CustomerKey (@CustomerKeys) {
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserListRow',
Data => {
%Param,
EditCustomerPermission => $Self->{EditCustomerPermission},
CustomerKey => $CustomerKey,
CustomerListEntry => $CustomerIDs->{$CustomerKey},
},
);
if ( $ConfigObject->Get('ChatEngine::Active') ) {
# Check if agent has permission to start chats with the customer users.
my $EnableChat = 1;
my $ChatStartingAgentsGroup
= $ConfigObject->Get('ChatEngine::PermissionGroup::ChatStartingAgents') || 'users';
my $ChatStartingAgentsGroupPermission = $Kernel::OM->Get('Kernel::System::Group')->PermissionCheck(
UserID => $Self->{UserID},
GroupName => $ChatStartingAgentsGroup,
Type => 'rw',
);
if ( !$ChatStartingAgentsGroupPermission ) {
$EnableChat = 0;
}
if (
$EnableChat
&& !$ConfigObject->Get('ChatEngine::ChatDirection::AgentToCustomer')
)
{
$EnableChat = 0;
}
if ($EnableChat) {
my $VideoChatEnabled = 0;
my $VideoChatAgentsGroup
= $ConfigObject->Get('ChatEngine::PermissionGroup::VideoChatAgents') || 'users';
my $VideoChatAgentsGroupPermission = $Kernel::OM->Get('Kernel::System::Group')->PermissionCheck(
UserID => $Self->{UserID},
GroupName => $VideoChatAgentsGroup,
Type => 'rw',
);
# Enable the video chat feature if system is entitled and agent is a member of configured group.
if ($VideoChatAgentsGroupPermission) {
if ( $Kernel::OM->Get('Kernel::System::Main')->Require( 'Kernel::System::VideoChat', Silent => 1 ) )
{
$VideoChatEnabled = $Kernel::OM->Get('Kernel::System::VideoChat')->IsEnabled();
}
}
my $CustomerEnableChat = 0;
my $ChatAccess = 0;
my $VideoChatAvailable = 0;
my $VideoChatSupport = 0;
# Default status is offline.
my $UserState = Translatable('Offline');
my $UserStateDescription = $LayoutObject->{LanguageObject}->Translate('User is currently offline.');
my $CustomerChatAvailability = $Kernel::OM->Get('Kernel::System::Chat')->CustomerAvailabilityGet(
UserID => $CustomerKey,
);
my $CustomerUserObject = $Kernel::OM->Get('Kernel::System::CustomerUser');
my %CustomerUser = $CustomerUserObject->CustomerUserDataGet(
User => $CustomerKey,
);
$CustomerUser{UserFullname} = $CustomerUserObject->CustomerName(
UserLogin => $CustomerKey,
);
$VideoChatSupport = 1 if $CustomerUser{VideoChatHasWebRTC};
if ( $CustomerChatAvailability == 3 ) {
$UserState = Translatable('Active');
$CustomerEnableChat = 1;
$UserStateDescription = $LayoutObject->{LanguageObject}->Translate('User is currently active.');
$VideoChatAvailable = 1;
}
elsif ( $CustomerChatAvailability == 2 ) {
$UserState = Translatable('Away');
$CustomerEnableChat = 1;
$UserStateDescription
= $LayoutObject->{LanguageObject}->Translate('User was inactive for a while.');
}
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserListRowUserStatus',
Data => {
%CustomerUser,
UserState => $UserState,
UserStateDescription => $UserStateDescription,
},
);
if (
$CustomerEnableChat
&& $ConfigObject->Get('Ticket::Agent::StartChatWOTicket')
)
{
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserListRowChatIcons',
Data => {
%CustomerUser,
VideoChatEnabled => $VideoChatEnabled,
VideoChatAvailable => $VideoChatAvailable,
VideoChatSupport => $VideoChatSupport,
},
);
}
}
}
# get ticket object
my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
my $TicketCountOpen = $TicketObject->TicketSearch(
StateType => 'Open',
CustomerUserLoginRaw => $CustomerKey,
Result => 'COUNT',
Permission => $Self->{Config}->{Permission},
UserID => $Self->{UserID},
CacheTTL => $Self->{Config}->{CacheTTLLocal} * 60,
) || 0;
my $CustomerKeySQL = $Kernel::OM->Get('Kernel::System::DB')->QueryStringEscape( QueryString => $CustomerKey );
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserListRowCustomerUserTicketsOpen',
Data => {
%Param,
Count => $TicketCountOpen,
CustomerKey => $CustomerKey,
CustomerKeySQL => $CustomerKeySQL,
},
);
my $TicketCountClosed = $TicketObject->TicketSearch(
StateType => 'Closed',
CustomerUserLoginRaw => $CustomerKey,
Result => 'COUNT',
Permission => $Self->{Config}->{Permission},
UserID => $Self->{UserID},
CacheTTL => $Self->{Config}->{CacheTTLLocal} * 60,
) || 0;
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserListRowCustomerUserTicketsClosed',
Data => {
%Param,
Count => $TicketCountClosed,
CustomerKey => $CustomerKey,
CustomerKeySQL => $CustomerKeySQL,
},
);
# check the permission for the phone ticket creation
if ($NewAgentTicketPhonePermission) {
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserListNewAgentTicketPhone',
Data => {
%Param,
CustomerKey => $CustomerKey,
CustomerListEntry => $CustomerIDs->{$CustomerKey},
},
);
}
# check the permission for the email ticket creation
if ($NewAgentTicketEmailPermission) {
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserListNewAgentTicketEmail',
Data => {
%Param,
CustomerKey => $CustomerKey,
CustomerListEntry => $CustomerIDs->{$CustomerKey},
},
);
}
if ( $ConfigObject->Get('SwitchToCustomer') && $Self->{SwitchToCustomerPermission} )
{
$LayoutObject->Block(
Name => 'OverviewResultRowSwitchToCustomer',
Data => {
%Param,
Count => $TicketCountClosed,
CustomerKey => $CustomerKey,
},
);
}
}
# show "none" if there are no customers
if ( !%{$CustomerIDs} ) {
$LayoutObject->Block(
Name => 'ContentLargeCustomerUserListNone',
Data => {},
);
}
# check for refresh time
my $Refresh = '';
if ( $Self->{UserRefreshTime} ) {
$Refresh = 60 * $Self->{UserRefreshTime};
my $NameHTML = $Self->{Name};
$NameHTML =~ s{-}{_}xmsg;
# send data to JS
$LayoutObject->AddJSData(
Key => 'CustomerUserListRefresh',
Value => {
%{ $Self->{Config} },
Name => $Self->{Name},
NameHTML => $NameHTML,
RefreshTime => $Refresh,
CustomerID => $Param{CustomerID},
},
);
}
my $Content = $LayoutObject->Output(
TemplateFile => 'AgentDashboardCustomerUserList',
Data => {
%{ $Self->{Config} },
EditCustomerPermission => $Self->{EditCustomerPermission},
Name => $Self->{Name},
},
AJAX => $Param{AJAX},
);
return $Content;
}
1;