Files
scripts/Perl OTRS/Kernel/System/LinkObject/Ticket.pm
2024-10-14 00:08:40 +02:00

601 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::System::LinkObject::Ticket;
use strict;
use warnings;
use Kernel::System::VariableCheck qw(:all);
our @ObjectDependencies = (
'Kernel::Config',
'Kernel::System::Log',
'Kernel::System::Ticket',
);
=head1 NAME
Kernel::System::LinkObject::Ticket
=head1 DESCRIPTION
Ticket backend for the ticket link object.
=head1 PUBLIC INTERFACE
=head2 new()
Don't use the constructor directly, use the ObjectManager instead:
my $LinkObjectTicketObject = $Kernel::OM->Get('Kernel::System::LinkObject::Ticket');
=cut
sub new {
my ( $Type, %Param ) = @_;
# allocate new hash for object
my $Self = {};
bless( $Self, $Type );
return $Self;
}
=head2 LinkListWithData()
fill up the link list with data
$Success = $LinkObject->LinkListWithData(
LinkList => $HashRef,
IgnoreLinkedTicketStateTypes => 0|1, # (optional) default 0
UserID => 1,
);
=cut
sub LinkListWithData {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Argument (qw(LinkList UserID)) {
if ( !$Param{$Argument} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Argument!",
);
return;
}
}
# check link list
if ( ref $Param{LinkList} ne 'HASH' ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => 'LinkList must be a hash reference!',
);
return;
}
# get ticket object
my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
# get config, which ticket state types should not be included in linked tickets overview
my @IgnoreLinkedTicketStateTypes = @{
$Kernel::OM->Get('Kernel::Config')->Get('LinkObject::IgnoreLinkedTicketStateTypes')
// []
};
my %IgnoreLinkTicketStateTypesHash;
map { $IgnoreLinkTicketStateTypesHash{$_}++ } @IgnoreLinkedTicketStateTypes;
for my $LinkType ( sort keys %{ $Param{LinkList} } ) {
for my $Direction ( sort keys %{ $Param{LinkList}->{$LinkType} } ) {
TICKETID:
for my $TicketID ( sort keys %{ $Param{LinkList}->{$LinkType}->{$Direction} } ) {
# get ticket data
my %TicketData = $TicketObject->TicketGet(
TicketID => $TicketID,
UserID => $Param{UserID},
DynamicFields => 0,
);
# remove id from hash if ticket can not get
if ( !%TicketData ) {
delete $Param{LinkList}->{$LinkType}->{$Direction}->{$TicketID};
next TICKETID;
}
# if param is set, remove entries from hash with configured ticket state types
if (
$Param{IgnoreLinkedTicketStateTypes}
&& $IgnoreLinkTicketStateTypesHash{ $TicketData{StateType} }
)
{
delete $Param{LinkList}->{$LinkType}->{$Direction}->{$TicketID};
next TICKETID;
}
# add ticket data
$Param{LinkList}->{$LinkType}->{$Direction}->{$TicketID} = \%TicketData;
}
}
}
return 1;
}
=head2 ObjectPermission()
checks read permission for a given object and UserID.
$Permission = $LinkObject->ObjectPermission(
Object => 'Ticket',
Key => 123,
UserID => 1,
);
=cut
sub ObjectPermission {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Argument (qw(Object Key UserID)) {
if ( !$Param{$Argument} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Argument!",
);
return;
}
}
return $Kernel::OM->Get('Kernel::System::Ticket')->TicketPermission(
Type => 'ro',
TicketID => $Param{Key},
UserID => $Param{UserID},
);
}
=head2 ObjectDescriptionGet()
return a hash of object descriptions
Return
%Description = (
Normal => "Ticket# 1234455",
Long => "Ticket# 1234455: The Ticket Title",
);
%Description = $LinkObject->ObjectDescriptionGet(
Key => 123,
Mode => 'Temporary', # (optional)
UserID => 1,
);
=cut
sub ObjectDescriptionGet {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Argument (qw(Object Key UserID)) {
if ( !$Param{$Argument} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Argument!",
);
return;
}
}
# create description
my %Description = (
Normal => 'Ticket',
Long => 'Ticket',
);
return %Description if $Param{Mode} && $Param{Mode} eq 'Temporary';
# get ticket
my %Ticket = $Kernel::OM->Get('Kernel::System::Ticket')->TicketGet(
TicketID => $Param{Key},
UserID => $Param{UserID},
DynamicFields => 0,
);
return if !%Ticket;
my $ParamHook = $Kernel::OM->Get('Kernel::Config')->Get('Ticket::Hook') || 'Ticket#';
$ParamHook .= $Kernel::OM->Get('Kernel::Config')->Get('Ticket::HookDivider') || '';
# create description
%Description = (
Normal => $ParamHook . "$Ticket{TicketNumber}",
Long => $ParamHook . "$Ticket{TicketNumber}: $Ticket{Title}",
);
return %Description;
}
=head2 ObjectSearch()
return a hash list of the search results
Returns:
$SearchList = {
NOTLINKED => {
Source => {
12 => $DataOfItem12,
212 => $DataOfItem212,
332 => $DataOfItem332,
},
},
};
$SearchList = $LinkObject->ObjectSearch(
SubObject => 'Bla', # (optional)
SearchParams => $HashRef, # (optional)
UserID => 1,
);
=cut
sub ObjectSearch {
my ( $Self, %Param ) = @_;
# check needed stuff
if ( !$Param{UserID} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => 'Need UserID!',
);
return;
}
# set default params
$Param{SearchParams} ||= {};
# set focus
my %Search;
if ( $Param{SearchParams}->{TicketFulltext} ) {
$Search{Fulltext} = '*' . $Param{SearchParams}->{TicketFulltext} . '*';
}
if ( $Param{SearchParams}->{TicketTitle} ) {
$Search{Title} = '*' . $Param{SearchParams}->{TicketTitle} . '*';
}
if ( IsArrayRefWithData( $Param{SearchParams}->{ArchiveID} ) ) {
if ( $Param{SearchParams}->{ArchiveID}->[0] eq 'AllTickets' ) {
$Search{ArchiveFlags} = [ 'y', 'n' ];
}
elsif ( $Param{SearchParams}->{ArchiveID}->[0] eq 'NotArchivedTickets' ) {
$Search{ArchiveFlags} = ['n'];
}
elsif ( $Param{SearchParams}->{ArchiveID}->[0] eq 'ArchivedTickets' ) {
$Search{ArchiveFlags} = ['y'];
}
}
# get ticket object
my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
# search the tickets
my @TicketIDs = $TicketObject->TicketSearch(
%{ $Param{SearchParams} },
%Search,
Limit => 50,
Result => 'ARRAY',
ConditionInline => 1,
ContentSearchPrefix => '*',
ContentSearchSuffix => '*',
FullTextIndex => 1,
OrderBy => 'Down',
SortBy => 'Age',
UserID => $Param{UserID},
);
my %SearchList;
TICKETID:
for my $TicketID (@TicketIDs) {
# get ticket data
my %TicketData = $TicketObject->TicketGet(
TicketID => $TicketID,
UserID => $Param{UserID},
DynamicFields => 0,
);
next TICKETID if !%TicketData;
# add ticket data
$SearchList{NOTLINKED}->{Source}->{$TicketID} = \%TicketData;
}
return \%SearchList;
}
=head2 LinkAddPre()
link add pre event module
$True = $LinkObject->LinkAddPre(
Key => 123,
SourceObject => 'Ticket',
SourceKey => 321,
Type => 'Normal',
State => 'Valid',
UserID => 1,
);
or
$True = $LinkObject->LinkAddPre(
Key => 123,
TargetObject => 'Ticket',
TargetKey => 321,
Type => 'Normal',
State => 'Valid',
UserID => 1,
);
=cut
sub LinkAddPre {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Argument (qw(Key Type State UserID)) {
if ( !$Param{$Argument} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Argument!",
);
return;
}
}
return 1 if $Param{State} eq 'Temporary';
return 1;
}
=head2 LinkAddPost()
link add pre event module
$True = $LinkObject->LinkAddPost(
Key => 123,
SourceObject => 'Ticket',
SourceKey => 321,
Type => 'Normal',
State => 'Valid',
UserID => 1,
);
or
$True = $LinkObject->LinkAddPost(
Key => 123,
TargetObject => 'Ticket',
TargetKey => 321,
Type => 'Normal',
State => 'Valid',
UserID => 1,
);
=cut
sub LinkAddPost {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Argument (qw(Key Type State UserID)) {
if ( !$Param{$Argument} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Argument!",
);
return;
}
}
return 1 if $Param{State} eq 'Temporary';
# get ticket object
my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
if ( $Param{SourceObject} && $Param{SourceObject} eq 'Ticket' && $Param{SourceKey} ) {
# lookup ticket number
my $TicketNumber = $TicketObject->TicketNumberLookup(
TicketID => $Param{SourceKey},
UserID => $Param{UserID},
);
# add ticket history entry
$TicketObject->HistoryAdd(
TicketID => $Param{Key},
CreateUserID => $Param{UserID},
HistoryType => 'TicketLinkAdd',
Name => "\%\%$TicketNumber\%\%$Param{SourceKey}\%\%$Param{Key}",
);
return 1;
}
if ( $Param{TargetObject} && $Param{TargetObject} eq 'Ticket' && $Param{TargetKey} ) {
# lookup ticket number
my $TicketNumber = $TicketObject->TicketNumberLookup(
TicketID => $Param{TargetKey},
UserID => $Param{UserID},
);
# add ticket history entry
$TicketObject->HistoryAdd(
TicketID => $Param{Key},
CreateUserID => $Param{UserID},
HistoryType => 'TicketLinkAdd',
Name => "\%\%$TicketNumber\%\%$Param{TargetKey}\%\%$Param{Key}",
);
return 1;
}
return 1;
}
=head2 LinkDeletePre()
link delete pre event module
$True = $LinkObject->LinkDeletePre(
Key => 123,
SourceObject => 'Ticket',
SourceKey => 321,
Type => 'Normal',
State => 'Valid',
UserID => 1,
);
or
$True = $LinkObject->LinkDeletePre(
Key => 123,
TargetObject => 'Ticket',
TargetKey => 321,
Type => 'Normal',
State => 'Valid',
UserID => 1,
);
=cut
sub LinkDeletePre {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Argument (qw(Key Type State UserID)) {
if ( !$Param{$Argument} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Argument!",
);
return;
}
}
return 1 if $Param{State} eq 'Temporary';
return 1;
}
=head2 LinkDeletePost()
link delete post event module
$True = $LinkObject->LinkDeletePost(
Key => 123,
SourceObject => 'Ticket',
SourceKey => 321,
Type => 'Normal',
State => 'Valid',
UserID => 1,
);
or
$True = $LinkObject->LinkDeletePost(
Key => 123,
TargetObject => 'Ticket',
TargetKey => 321,
Type => 'Normal',
State => 'Valid',
UserID => 1,
);
=cut
sub LinkDeletePost {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Argument (qw(Key Type State UserID)) {
if ( !$Param{$Argument} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Argument!",
);
return;
}
}
return 1 if $Param{State} eq 'Temporary';
# get ticket object
my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
if ( $Param{SourceObject} && $Param{SourceObject} eq 'Ticket' && $Param{SourceKey} ) {
# lookup ticket number
my $TicketNumber = $TicketObject->TicketNumberLookup(
TicketID => $Param{SourceKey},
UserID => $Param{UserID},
);
# add ticket history entry
$TicketObject->HistoryAdd(
TicketID => $Param{Key},
CreateUserID => $Param{UserID},
HistoryType => 'TicketLinkDelete',
Name => "\%\%$TicketNumber\%\%$Param{SourceKey}\%\%$Param{Key}",
);
return 1;
}
if ( $Param{TargetObject} && $Param{TargetObject} eq 'Ticket' && $Param{TargetKey} ) {
# lookup ticket number
my $TicketNumber = $TicketObject->TicketNumberLookup(
TicketID => $Param{TargetKey},
UserID => $Param{UserID},
);
# add ticket history entry
$TicketObject->HistoryAdd(
TicketID => $Param{Key},
CreateUserID => $Param{UserID},
HistoryType => 'TicketLinkDelete',
Name => "\%\%$TicketNumber\%\%$Param{TargetKey}\%\%$Param{Key}",
);
return 1;
}
return 1;
}
1;
=head1 TERMS AND CONDITIONS
This software is part of the OTRS project (L<https://otrs.org/>).
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 L<https://www.gnu.org/licenses/gpl-3.0.txt>.
=cut