init III
This commit is contained in:
452
Perl OTRS/Kernel/Output/HTML/Dashboard/CustomerUserList.pm
Normal file
452
Perl OTRS/Kernel/Output/HTML/Dashboard/CustomerUserList.pm
Normal file
@@ -0,0 +1,452 @@
|
||||
# --
|
||||
# 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;
|
||||
Reference in New Issue
Block a user