X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FAction%2FAutoOpen.pm;h=1204cd7b265caeb8e6a1a70adbb1d39f3cfd55ce;hb=44dd00a3ff974a17999e86e64488e996edc71e3c;hp=b99b214744b0ff93d78eda131cc0a7b4f19d4b80;hpb=b5c4237a34aef94976bc343c8d9e138664fc3984;p=freeside.git diff --git a/rt/lib/RT/Action/AutoOpen.pm b/rt/lib/RT/Action/AutoOpen.pm index b99b21474..1204cd7b2 100644 --- a/rt/lib/RT/Action/AutoOpen.pm +++ b/rt/lib/RT/Action/AutoOpen.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2019 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) @@ -46,54 +46,68 @@ # # END BPS TAGGED BLOCK }}} -# This Action will open the BASE if a dependent is resolved. package RT::Action::AutoOpen; use strict; use warnings; - use base qw(RT::Action); =head1 DESCRIPTION -Opens a ticket unless it's allready open, but only unless transaction -L. +This action automatically moves a ticket to an active status. + +Status is not changed if there is no active statuses in the lifecycle. + +Status is not changed if the current status is first active for ticket's status +lifecycle. For example if ticket's status is 'processing' and active statuses are +'processing', 'on hold' and 'waiting' then status is not changed, but for ticket +with status 'on hold' other rules are checked. + +Status is not changed if it's in the list of C statuses for the +current scheme and creator of the current transaction +is one of the ticket's requestors. -Doesn't open a ticket if message's head has field C with -C substring. +Status is not changed if message's head has field C with C +substring. + +Status is set to the first possible active status. If the ticket's +status is C then RT finds all possible transitions from C +status and selects first one that results in the ticket having an +active status. =cut sub Prepare { my $self = shift; - # if the ticket is already open or the ticket is new and the message is more mail from the - # requestor, don't reopen it. + my $ticket = $self->TicketObj; + my $next = $ticket->FirstActiveStatus; + return 1 unless defined $next; - my $status = $self->TicketObj->Status; - return undef if $status eq 'open'; - return undef if $status eq 'new' && $self->TransactionObj->IsInbound; + # no change if the ticket is in initial status and the message is a mail + # from a requestor + return 1 if $ticket->LifecycleObj->IsInitial($ticket->Status) + && $self->TransactionObj->IsInbound; if ( my $msg = $self->TransactionObj->Message->First ) { - return undef if ($msg->GetHeader('RT-Control') || '') =~ /\bno-autoopen\b/i; + return 1 if ($msg->GetHeader('RT-Control') || '') =~ /\bno-autoopen\b/i; } + $self->{'set_status_to'} = $next; + return 1; } sub Commit { my $self = shift; - my $oldstatus = $self->TicketObj->Status; - $self->TicketObj->__Set( Field => 'Status', Value => 'open' ); - $self->TicketObj->_NewTransaction( - Type => 'Status', - Field => 'Status', - OldValue => $oldstatus, - NewValue => 'open', - Data => 'Ticket auto-opened on incoming correspondence' - ); + return 1 unless my $new_status = $self->{'set_status_to'}; + my ($val, $msg) = $self->TicketObj->SetStatus( $new_status ); + unless ( $val ) { + $RT::Logger->error( "Couldn't auto-open ticket: ". $msg ); + return 0; + } return 1; }