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

321 lines
11 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::CustomerUser::GenericTicket;
use parent 'Kernel::Output::HTML::Base';
use strict;
use warnings;
use Kernel::System::VariableCheck qw(IsArrayRefWithData);
our $ObjectManagerDisabled = 1;
sub Run {
my ( $Self, %Param ) = @_;
# get layout object
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
# don't show ticket search links in the print views
if ( $LayoutObject->{Action} =~ m{Print$}smx ) {
return;
}
# lookup map
my %Lookup = (
Types => {
Object => 'Kernel::System::Type',
Return => 'TypeIDs',
Input => 'Type',
Method => 'TypeLookup',
},
Queues => {
Object => 'Kernel::System::Queue',
Return => 'QueueIDs',
Input => 'Queue',
Method => 'QueueLookup',
},
States => {
Object => 'Kernel::System::State',
Return => 'StateIDs',
Input => 'State',
Method => 'StateLookup',
},
Priorities => {
Object => 'Kernel::System::Priority',
Return => 'PriorityIDs',
Input => 'Priority',
Method => 'PriorityLookup',
},
Locks => {
Object => 'Kernel::System::Lock',
Return => 'LockIDs',
Input => 'Lock',
Method => 'LockLookup',
},
Services => {
Object => 'Kernel::System::Service',
Return => 'ServiceIDs',
Input => 'Name',
Method => 'ServiceLookup',
},
SLAs => {
Object => 'Kernel::System::SLA',
Return => 'SLAIDs',
Input => 'Name',
Method => 'SLALookup',
},
);
# get all attributes
my %TicketSearch = ();
my @Params = split /;/, $Param{Config}->{Attributes};
STRING:
for my $String (@Params) {
next STRING if !$String;
my ( $Key, $Value ) = split /=/, $String;
# do lookups
if ( $Lookup{$Key} ) {
next STRING if !$Kernel::OM->Get('Kernel::System::Main')->Require( $Lookup{$Key}->{Object} );
my $Object = $Lookup{$Key}->{Object}->new( %{$Self} );
my $Method = $Lookup{$Key}->{Method};
$Value = $Object->$Method( $Lookup{$Key}->{Input} => $Value );
$Key = $Lookup{$Key}->{Return};
}
# build link and search attributes
if ( $Key =~ /IDs$/ ) {
if ( !$TicketSearch{$Key} ) {
$TicketSearch{$Key} = [$Value];
}
else {
push @{ $TicketSearch{$Key} }, $Value;
}
}
elsif ( !defined $TicketSearch{$Key} ) {
$TicketSearch{$Key} = $Value;
}
elsif ( !ref $TicketSearch{$Key} ) {
my $ValueTmp = $TicketSearch{$Key};
$TicketSearch{$Key} = [$ValueTmp];
}
else {
push @{ $TicketSearch{$Key} }, $Value;
}
}
# build URL
# note:
# "special characters" in customer id have to be escaped, so that DB::QueryCondition works
my $CustomerIDRaw = $Param{Data}->{UserCustomerID};
my $Action = $Param{Config}->{Action};
my $Subaction = $Param{Config}->{Subaction};
my $URL = $LayoutObject->{Baselink} . "Action=$Action;Subaction=$Subaction";
$URL .= ';CustomerIDRaw=' . $LayoutObject->LinkEncode($CustomerIDRaw);
for my $Key ( sort keys %TicketSearch ) {
if ( ref $TicketSearch{$Key} eq 'ARRAY' ) {
for my $Value ( @{ $TicketSearch{$Key} } ) {
$URL .= ';' . $Key . '=' . $LayoutObject->LinkEncode($Value);
}
}
else {
$URL .= ';' . $Key . '=' . $LayoutObject->LinkEncode( $TicketSearch{$Key} );
}
}
if ( defined $Param{Config}->{CustomerUserLogin} && $Param{Config}->{CustomerUserLogin} ) {
my $CustomerUserLoginEscaped = $Kernel::OM->Get('Kernel::System::DB')->QueryStringEscape(
QueryString => $Param{Data}->{UserLogin},
);
$TicketSearch{CustomerUserLogin} = $CustomerUserLoginEscaped;
$URL .= ';CustomerUserLoginRaw='
. $LayoutObject->LinkEncode($CustomerUserLoginEscaped);
}
my $StateObject = $Kernel::OM->Get('Kernel::System::State');
# replace StateType to StateIDs for the count numbers in customer information links
if ( $TicketSearch{StateType} ) {
my @StateIDs;
if ( $TicketSearch{StateType} eq 'Open' ) {
@StateIDs = $StateObject->StateGetStatesByType(
Type => 'Viewable',
Result => 'ID',
);
}
elsif ( $TicketSearch{StateType} eq 'Closed' ) {
my %ViewableStateOpenLookup = $StateObject->StateGetStatesByType(
Type => 'Viewable',
Result => 'HASH',
);
my %StateList = $StateObject->StateList( UserID => $Self->{UserID} );
for my $Item ( sort keys %StateList ) {
if ( !$ViewableStateOpenLookup{$Item} ) {
push @StateIDs, $Item;
}
}
}
# current ticket state type
else {
@StateIDs = $StateObject->StateGetStatesByType(
StateType => $TicketSearch{StateType},
Result => 'ID',
);
}
# merge with StateIDs
if ( @StateIDs && IsArrayRefWithData( $TicketSearch{StateIDs} ) ) {
my %StateIDs = map { $_ => 1 } @StateIDs;
@StateIDs = grep { exists $StateIDs{$_} } @{ $TicketSearch{StateIDs} };
}
if (@StateIDs) {
$TicketSearch{StateIDs} = \@StateIDs;
}
}
my %TimeMap = (
ArticleCreate => 'ArticleTime',
TicketCreate => 'Time',
TicketChange => 'ChangeTime',
TicketLastChange => 'LastChangeTime',
TicketClose => 'CloseTime',
TicketEscalation => 'EscalationTime',
);
for my $TimeType ( sort keys %TimeMap ) {
# get create time settings
if ( !$TicketSearch{ $TimeMap{$TimeType} . 'SearchType' } ) {
# do nothing with time stuff
}
elsif ( $TicketSearch{ $TimeMap{$TimeType} . 'SearchType' } eq 'TimeSlot' ) {
for my $Key (qw(Month Day)) {
$TicketSearch{ $TimeType . 'TimeStart' . $Key }
= sprintf( "%02d", $TicketSearch{ $TimeType . 'TimeStart' . $Key } );
$TicketSearch{ $TimeType . 'TimeStop' . $Key }
= sprintf( "%02d", $TicketSearch{ $TimeType . 'TimeStop' . $Key } );
}
if (
$TicketSearch{ $TimeType . 'TimeStartDay' }
&& $TicketSearch{ $TimeType . 'TimeStartMonth' }
&& $TicketSearch{ $TimeType . 'TimeStartYear' }
)
{
$TicketSearch{ $TimeType . 'TimeNewerDate' } = $TicketSearch{ $TimeType . 'TimeStartYear' } . '-'
. $TicketSearch{ $TimeType . 'TimeStartMonth' } . '-'
. $TicketSearch{ $TimeType . 'TimeStartDay' }
. ' 00:00:00';
}
if (
$TicketSearch{ $TimeType . 'TimeStopDay' }
&& $TicketSearch{ $TimeType . 'TimeStopMonth' }
&& $TicketSearch{ $TimeType . 'TimeStopYear' }
)
{
$TicketSearch{ $TimeType . 'TimeOlderDate' } = $TicketSearch{ $TimeType . 'TimeStopYear' } . '-'
. $TicketSearch{ $TimeType . 'TimeStopMonth' } . '-'
. $TicketSearch{ $TimeType . 'TimeStopDay' }
. ' 23:59:59';
}
}
elsif ( $TicketSearch{ $TimeMap{$TimeType} . 'SearchType' } eq 'TimePoint' ) {
if (
$TicketSearch{ $TimeType . 'TimePoint' }
&& $TicketSearch{ $TimeType . 'TimePointStart' }
&& $TicketSearch{ $TimeType . 'TimePointFormat' }
)
{
my $Time = 0;
if ( $TicketSearch{ $TimeType . 'TimePointFormat' } eq 'minute' ) {
$Time = $TicketSearch{ $TimeType . 'TimePoint' };
}
elsif ( $TicketSearch{ $TimeType . 'TimePointFormat' } eq 'hour' ) {
$Time = $TicketSearch{ $TimeType . 'TimePoint' } * 60;
}
elsif ( $TicketSearch{ $TimeType . 'TimePointFormat' } eq 'day' ) {
$Time = $TicketSearch{ $TimeType . 'TimePoint' } * 60 * 24;
}
elsif ( $TicketSearch{ $TimeType . 'TimePointFormat' } eq 'week' ) {
$Time = $TicketSearch{ $TimeType . 'TimePoint' } * 60 * 24 * 7;
}
elsif ( $TicketSearch{ $TimeType . 'TimePointFormat' } eq 'month' ) {
$Time = $TicketSearch{ $TimeType . 'TimePoint' } * 60 * 24 * 30;
}
elsif ( $TicketSearch{ $TimeType . 'TimePointFormat' } eq 'year' ) {
$Time = $TicketSearch{ $TimeType . 'TimePoint' } * 60 * 24 * 365;
}
if ( $TicketSearch{ $TimeType . 'TimePointStart' } eq 'Before' ) {
# more than ... ago
$TicketSearch{ $TimeType . 'TimeOlderMinutes' } = $Time;
}
elsif ( $TicketSearch{ $TimeType . 'TimePointStart' } eq 'Next' ) {
# within next
$TicketSearch{ $TimeType . 'TimeNewerMinutes' } = 0;
$TicketSearch{ $TimeType . 'TimeOlderMinutes' } = -$Time;
}
else {
# within last ...
$TicketSearch{ $TimeType . 'TimeOlderMinutes' } = 0;
$TicketSearch{ $TimeType . 'TimeNewerMinutes' } = $Time;
}
}
}
}
my $Count = $Kernel::OM->Get('Kernel::System::Ticket')->TicketSearch(
# result (required)
%TicketSearch,
CustomerIDRaw => $CustomerIDRaw,
CacheTTL => 60 * 2,
Result => 'COUNT',
Permission => 'ro',
UserID => $Self->{UserID},
) || 0;
my $CSSClass = $Param{Config}->{CSSClassNoOpenTicket};
if ($Count) {
$CSSClass = $Param{Config}->{CSSClassOpenTicket};
}
my $IconName = $Param{Config}->{IconNameNoOpenTicket};
if ($Count) {
$IconName = $Param{Config}->{IconNameOpenTicket};
}
# generate block
$LayoutObject->Block(
Name => 'CustomerItemRow',
Data => {
%{ $Param{Config} },
CSSClass => $CSSClass,
Extension => " ($Count)",
URL => $URL,
IconName => $IconName,
},
);
return 1;
}
1;