453 lines
15 KiB
Perl
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;
|