144 lines
4.8 KiB
Perl
144 lines
4.8 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::NavBar::CustomerTicketProcess;
|
|
|
|
use parent 'Kernel::Output::HTML::Base';
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Kernel::System::VariableCheck qw(:all);
|
|
|
|
our @ObjectDependencies = (
|
|
'Kernel::Config',
|
|
'Kernel::System::Cache',
|
|
'Kernel::System::Ticket',
|
|
'Kernel::System::ProcessManagement::Process',
|
|
);
|
|
|
|
sub Run {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# get config object
|
|
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
|
|
|
# get process management configuration
|
|
my $FrontendModuleConfig = $ConfigObject->Get('CustomerFrontend::Module')->{CustomerTicketProcess};
|
|
my $FrontendNavigationConfig = $ConfigObject->Get('CustomerFrontend::Navigation')->{CustomerTicketProcess};
|
|
|
|
# check if the registration config is valid
|
|
return if !IsHashRefWithData($FrontendModuleConfig);
|
|
return if !IsHashRefWithData($FrontendNavigationConfig);
|
|
return if !IsArrayRefWithData( $FrontendNavigationConfig->{'002-ProcessManagement'} );
|
|
|
|
my $NameForID = $FrontendNavigationConfig->{'002-ProcessManagement'}->[0]->{Name};
|
|
my $NameForHidden = $NameForID;
|
|
$NameForID =~ s/[ &;]//ig;
|
|
|
|
# check if the module name is valid
|
|
return if !$NameForID;
|
|
|
|
my $DisplayMenuItem;
|
|
|
|
# check the cache
|
|
my $CacheKey = 'ProcessManagement::UserID' . $Self->{UserID} . '::DisplayMenuItem';
|
|
|
|
# get cache object
|
|
my $CacheObject = $Kernel::OM->Get('Kernel::System::Cache');
|
|
|
|
my $Cache = $CacheObject->Get(
|
|
Type => 'ProcessManagement_Process',
|
|
Key => $CacheKey,
|
|
);
|
|
|
|
# set the cache value to show or hide the menu item (if value exists)
|
|
if ( $Cache && ref $Cache eq 'SCALAR' ) {
|
|
$DisplayMenuItem = ${$Cache};
|
|
}
|
|
|
|
# otherwise determine the value by quering the process object
|
|
else {
|
|
|
|
$DisplayMenuItem = 0;
|
|
my $Processes = $ConfigObject->Get('Process');
|
|
|
|
# avoid error messages when there is no processes and call ProcessList
|
|
if ( IsHashRefWithData($Processes) ) {
|
|
|
|
# get process list
|
|
my $ProcessList = $Kernel::OM->Get('Kernel::System::ProcessManagement::Process')->ProcessList(
|
|
ProcessState => ['Active'],
|
|
Interface => ['CustomerInterface'],
|
|
);
|
|
|
|
# prepare process list for ACLs, use only entities instead of names, convert from
|
|
# P1 => Name to P1 => P1. As ACLs should work only against entities
|
|
my %ProcessListACL = map { $_ => $_ } sort keys %{$ProcessList};
|
|
|
|
# get ticket object
|
|
my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
|
|
|
|
# validate the ProcessList with stored ACLs
|
|
my $ACL = $TicketObject->TicketAcl(
|
|
ReturnType => 'Process',
|
|
ReturnSubType => '-',
|
|
Data => \%ProcessListACL,
|
|
CustomerUserID => $Self->{UserID},
|
|
);
|
|
|
|
if ( IsHashRefWithData($ProcessList) && $ACL ) {
|
|
|
|
# get ACL results
|
|
my %ACLData = $TicketObject->TicketAclData();
|
|
|
|
# recover process names
|
|
my %ReducedProcessList = map { $_ => $ProcessList->{$_} } sort keys %ACLData;
|
|
|
|
# replace original process list with the reduced one
|
|
$ProcessList = \%ReducedProcessList;
|
|
}
|
|
|
|
# set the value to show or hide the menu item (based in process list)
|
|
if ( IsHashRefWithData($ProcessList) ) {
|
|
$DisplayMenuItem = 1;
|
|
}
|
|
}
|
|
|
|
# get the cache TTL (in seconds)
|
|
my $CacheTTL = int( $Kernel::OM->Get('Kernel::Config')->Get('Process::NavBar::CacheTTL') || 900 );
|
|
|
|
# set cache
|
|
$CacheObject->Set(
|
|
Type => 'ProcessManagement_Process',
|
|
Key => $CacheKey,
|
|
Value => \$DisplayMenuItem,
|
|
TTL => $CacheTTL,
|
|
);
|
|
}
|
|
|
|
# return nothing to display the menu item
|
|
return if $DisplayMenuItem;
|
|
|
|
# frontend module is enabled but there is no selectable process, then remove the menu entry
|
|
my $NavBarName = $FrontendModuleConfig->{NavBarName};
|
|
my $Priority = sprintf( '%07d', $FrontendNavigationConfig->{'002-ProcessManagement'}->[0]->{Prio} );
|
|
|
|
my %Return = %{ $Param{NavBarModule}->{Sub} };
|
|
|
|
# remove CustomerTicketProcess from the TicketMenu
|
|
delete $Return{$NavBarName}->{$Priority};
|
|
|
|
# remove CustomerTicketProcess from the Menu if set outside of the TicketMenu, see bug #11393
|
|
delete $Param{NavBarModule}->{$Priority};
|
|
|
|
return ( Sub => \%Return );
|
|
}
|
|
|
|
1;
|