# -- # 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). 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. =cut