# -- # 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::PostMaster::Reject; use strict; use warnings; our @ObjectDependencies = ( 'Kernel::System::DynamicField', 'Kernel::System::DynamicField::Backend', 'Kernel::System::Log', 'Kernel::System::Ticket', 'Kernel::System::Ticket::Article', ); sub new { my ( $Type, %Param ) = @_; # allocate new hash for object my $Self = {}; bless( $Self, $Type ); # get parser object $Self->{ParserObject} = $Param{ParserObject} || die "Got no ParserObject!"; # Get communication log object. $Self->{CommunicationLogObject} = $Param{CommunicationLogObject} || die "Got no CommunicationLogObject!"; return $Self; } sub Run { my ( $Self, %Param ) = @_; # check needed stuff for (qw(TicketID InmailUserID GetParam Tn AutoResponseType)) { if ( !$Param{$_} ) { $Self->{CommunicationLogObject}->ObjectLog( ObjectLogType => 'Message', Priority => 'Error', Key => 'Kernel::System::PostMaster::Reject', Value => "Need $_!", ); return; } } my %GetParam = %{ $Param{GetParam} }; # get ticket object my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket'); # get ticket data my %Ticket = $TicketObject->TicketGet( TicketID => $Param{TicketID}, DynamicFields => 0, ); my $Comment = $Param{Comment} || ''; my $Lock = $Param{Lock} || ''; my $AutoResponseType = $Param{AutoResponseType} || ''; my $ArticleObject = $Kernel::OM->Get('Kernel::System::Ticket::Article'); my $ArticleBackendObject = $ArticleObject->BackendForChannel( ChannelName => 'Email', ); # Check if X-OTRS-SenderType exists, if not set default 'customer'. if ( !$ArticleObject->ArticleSenderTypeLookup( SenderType => $GetParam{'X-OTRS-SenderType'} ) ) { $Self->{CommunicationLogObject}->ObjectLog( ObjectLogType => 'Message', Priority => 'Error', Key => 'Kernel::System::PostMaster::Reject', Value => "Can't find valid SenderType '$GetParam{'X-OTRS-SenderType'}' in DB, take 'customer'", ); $GetParam{'X-OTRS-SenderType'} = 'customer'; } $Self->{CommunicationLogObject}->ObjectLog( ObjectLogType => 'Message', Priority => 'Debug', Key => 'Kernel::System::PostMaster::Reject', Value => "Going to create new article for TicketID '$Param{TicketID}'.", ); # do db insert my $ArticleID = $ArticleBackendObject->ArticleCreate( TicketID => $Param{TicketID}, IsVisibleForCustomer => $GetParam{'X-OTRS-IsVisibleForCustomer'} // 1, SenderType => $GetParam{'X-OTRS-SenderType'}, From => $GetParam{From}, ReplyTo => $GetParam{ReplyTo}, To => $GetParam{To}, Cc => $GetParam{Cc}, Subject => $GetParam{Subject}, MessageID => $GetParam{'Message-ID'}, InReplyTo => $GetParam{'In-Reply-To'}, References => $GetParam{'References'}, ContentType => $GetParam{'Content-Type'}, Body => $GetParam{Body}, UserID => $Param{InmailUserID}, HistoryType => 'FollowUp', HistoryComment => "\%\%$Param{Tn}\%\%$Comment", AutoResponseType => $AutoResponseType, OrigHeader => \%GetParam, ); if ( !$ArticleID ) { $Self->{CommunicationLogObject}->ObjectLog( ObjectLogType => 'Message', Priority => 'Error', Key => 'Kernel::System::PostMaster::Reject', Value => "Article could not be created!", ); return; } $Self->{CommunicationLogObject}->ObjectLookupSet( ObjectLogType => 'Message', TargetObjectType => 'Article', TargetObjectID => $ArticleID, ); $Self->{CommunicationLogObject}->ObjectLog( ObjectLogType => 'Message', Priority => 'Debug', Key => 'Kernel::System::PostMaster::Reject', Value => "Reject Follow up Ticket!", ); my %CommunicationLogSkipAttributes = ( Body => 1, Attachment => 1, ); ATTRIBUTE: for my $Attribute ( sort keys %GetParam ) { next ATTRIBUTE if $CommunicationLogSkipAttributes{$Attribute}; my $Value = $GetParam{$Attribute}; next ATTRIBUTE if !( defined $Value ) || !( length $Value ); $Self->{CommunicationLogObject}->ObjectLog( ObjectLogType => 'Message', Priority => 'Debug', Key => 'Kernel::System::PostMaster::Reject', Value => "$Attribute: $Value", ); } # write plain email to the storage $ArticleBackendObject->ArticleWritePlain( ArticleID => $ArticleID, Email => $Self->{ParserObject}->GetPlainEmail(), UserID => $Param{InmailUserID}, ); # write attachments to the storage for my $Attachment ( $Self->{ParserObject}->GetAttachments() ) { $ArticleBackendObject->ArticleWriteAttachment( Filename => $Attachment->{Filename}, Content => $Attachment->{Content}, ContentType => $Attachment->{ContentType}, ContentID => $Attachment->{ContentID}, ContentAlternative => $Attachment->{ContentAlternative}, Disposition => $Attachment->{Disposition}, ArticleID => $ArticleID, UserID => $Param{InmailUserID}, ); } # get dynamic field objects my $DynamicFieldObject = $Kernel::OM->Get('Kernel::System::DynamicField'); my $DynamicFieldBackendObject = $Kernel::OM->Get('Kernel::System::DynamicField::Backend'); # dynamic fields my $DynamicFieldList = $DynamicFieldObject->DynamicFieldList( Valid => 0, ResultType => 'HASH', ObjectType => 'Article', ); # set dynamic fields for Article object type DYNAMICFIELDID: for my $DynamicFieldID ( sort keys %{$DynamicFieldList} ) { next DYNAMICFIELDID if !$DynamicFieldID; next DYNAMICFIELDID if !$DynamicFieldList->{$DynamicFieldID}; my $Key = 'X-OTRS-FollowUp-DynamicField-' . $DynamicFieldList->{$DynamicFieldID}; if ( defined $GetParam{$Key} && length $GetParam{$Key} ) { # get dynamic field config my $DynamicFieldGet = $DynamicFieldObject->DynamicFieldGet( ID => $DynamicFieldID, ); $DynamicFieldBackendObject->ValueSet( DynamicFieldConfig => $DynamicFieldGet, ObjectID => $ArticleID, Value => $GetParam{$Key}, UserID => $Param{InmailUserID}, ); $Self->{CommunicationLogObject}->ObjectLog( ObjectLogType => 'Message', Priority => 'Debug', Key => 'Kernel::System::PostMaster::Reject', Value => "Article DynamicField update via '$Key'! Value: $GetParam{$Key}.", ); } } # reverse dynamic field list my %DynamicFieldListReversed = reverse %{$DynamicFieldList}; # set free article text my %Values = ( 'X-OTRS-FollowUp-ArticleKey' => 'ArticleFreeKey', 'X-OTRS-FollowUp-ArticleValue' => 'ArticleFreeText', ); for my $Item ( sort keys %Values ) { for my $Count ( 1 .. 16 ) { my $Key = $Item . $Count; if ( defined $GetParam{$Key} && length $GetParam{$Key} && $DynamicFieldListReversed{ $Values{$Item} . $Count } ) { # get dynamic field config my $DynamicFieldGet = $DynamicFieldObject->DynamicFieldGet( ID => $DynamicFieldListReversed{ $Values{$Item} . $Count }, ); if ($DynamicFieldGet) { my $Success = $DynamicFieldBackendObject->ValueSet( DynamicFieldConfig => $DynamicFieldGet, ObjectID => $ArticleID, Value => $GetParam{$Key}, UserID => $Param{InmailUserID}, ); } $Self->{CommunicationLogObject}->ObjectLog( ObjectLogType => 'Message', Priority => 'Debug', Key => 'Kernel::System::PostMaster::Reject', Value => "TicketKey$Count: Article DynamicField (ArticleKey) update via '$Key'! Value: $GetParam{$Key}.", ); } } } $Self->{CommunicationLogObject}->ObjectLog( ObjectLogType => 'Message', Priority => 'Notice', Key => 'Kernel::System::PostMaster::Reject', Value => "Reject FollowUp Article to Ticket [$Param{Tn}] created " . "(TicketID=$Param{TicketID}, ArticleID=$ArticleID). $Comment" ); return 1; } 1;