X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FCondition%2FStatusChange.pm;h=55fe2347fefe7afbbe2f2c7ad4dc6e37d903b028;hb=b8988e1d3ac75af63c85e8563e57701030315a9e;hp=dba3b7a20bcfa930331528deb8c647415a747f15;hpb=fc6209f398899f0211cfcedeb81a3cd65e04a941;p=freeside.git diff --git a/rt/lib/RT/Condition/StatusChange.pm b/rt/lib/RT/Condition/StatusChange.pm index dba3b7a20..55fe2347f 100644 --- a/rt/lib/RT/Condition/StatusChange.pm +++ b/rt/lib/RT/Condition/StatusChange.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) @@ -49,30 +49,95 @@ package RT::Condition::StatusChange; use base 'RT::Condition'; use strict; +use warnings; +=head2 DESCRIPTION -=head2 IsApplicable +This condition check passes if the current transaction is a status change. -If the argument passed in is equivalent to the new value of -the Status Obj +The argument can be used to apply additional conditions on old and new values. + +If argument is empty then the check passes for any change of the status field. + +If argument is equal to new value then check is passed. This is behavior +is close to RT 3.8 and older. For example, setting the argument to 'resolved' means +'fire scrip when status changed from any to resolved'. + +The following extended format is supported: + + old: comma separated list; new: comma separated list + +For example: + + old: open; new: resolved + +You can omit old or new part, for example: + + old: open + + new: resolved + +You can specify multiple values, for example: + + old: new, open; new: resolved, rejected + +Status sets ('initial', 'active' or 'inactive') can be used, for example: + + old: active; new: inactive + + old: initial, active; new: resolved =cut sub IsApplicable { my $self = shift; - if (($self->TransactionObj->Field eq 'Status') and - ($self->Argument eq $self->TransactionObj->NewValue())) { - return(1); - } + my $txn = $self->TransactionObj; + my ($type, $field) = ($txn->Type, $txn->Field); + return 0 unless $type eq 'Status' || ($type eq 'Set' && $field eq 'Status'); + + my $argument = $self->Argument; + return 1 unless $argument; + + my $new = $txn->NewValue || ''; + return 1 if $argument eq $new; + + # let's parse argument + my ($old_must_be, $new_must_be) = ('', ''); + if ( $argument =~ /^\s*old:\s*(.*);\s*new:\s*(.*)\s*$/i ) { + ($old_must_be, $new_must_be) = ($1, $2); + } + elsif ( $argument =~ /^\s*new:\s*(.*)\s*$/i ) { + $new_must_be = $1; + } + elsif ( $argument =~ /^\s*old:\s*(.*)\s*$/i ) { + $old_must_be = $1; + } else { - return(undef); + $RT::Logger->error("Argument '$argument' is incorrect.") + unless RT::Lifecycle->Load('')->IsValid( $argument ); + return 0; + } + + my $lifecycle = $self->TicketObj->QueueObj->Lifecycle; + if ( $new_must_be ) { + return 0 unless grep lc($new) eq lc($_), + map {m/^(initial|active|inactive)$/i? $lifecycle->Valid(lc $_): $_ } + grep defined && length, + map { s/^\s+//; s/\s+$//; $_ } + split /,/, $new_must_be; + } + if ( $old_must_be ) { + my $old = lc($txn->OldValue || ''); + return 0 unless grep $old eq lc($_), + map {m/^(initial|active|inactive)$/i? $lifecycle->Valid(lc $_): $_ } + grep defined && length, + map { s/^\s+//; s/\s+$//; $_ } + split /,/, $old_must_be; } + return 1; } -eval "require RT::Condition::StatusChange_Vendor"; -die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/StatusChange_Vendor.pm}); -eval "require RT::Condition::StatusChange_Local"; -die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/StatusChange_Local.pm}); +RT::Base->_ImportOverlays(); 1;