X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FAction%2FAutoOpen.pm;h=06721b7c42fa0d7dde0d56386f13ef209aa6f1e2;hb=31f3763747b82764bb019cfab5b2a2945fc9a99d;hp=b99b214744b0ff93d78eda131cc0a7b4f19d4b80;hpb=75162bb14b3e38d66617077843f4dfdcaf09d5c4;p=freeside.git diff --git a/rt/lib/RT/Action/AutoOpen.pm b/rt/lib/RT/Action/AutoOpen.pm index b99b21474..06721b7c4 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-2015 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) @@ -51,49 +51,64 @@ 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->QueueObj->Lifecycle->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; }