#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
use strict;
use warnings;
-
use base qw(RT::Action);
=head1 DESCRIPTION
-Opens a ticket unless it's allready open, but only unless transaction
-L<RT::Transaction/IsInbound is inbound>.
+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<initial> 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<RT-Control> with
-C<no-autoopen> substring.
+Status is not changed if message's head has field C<RT-Control> with C<no-autoopen>
+substring.
+
+Status is set to the first possible active status. If the ticket's
+status is C<Stalled> then RT finds all possible transitions from C<Stalled>
+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;
}
-eval "require RT::Action::AutoOpen_Vendor";
-die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/AutoOpen_Vendor.pm});
-eval "require RT::Action::AutoOpen_Local";
-die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/AutoOpen_Local.pm});
+RT::Base->_ImportOverlays();
1;