X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FScrips_Overlay.pm;h=0f606c884c1d57351ae436aab184d60b936be3a0;hp=46e31c2a8778a34e50df3117fdb21c9946656cfe;hb=673b9a458d9138523026963df6fa3b4683e09bae;hpb=0ebeec96313dd7edfca340f01f8fbbbac1f4aa1d diff --git a/rt/lib/RT/Scrips_Overlay.pm b/rt/lib/RT/Scrips_Overlay.pm index 46e31c2a8..0f606c884 100644 --- a/rt/lib/RT/Scrips_Overlay.pm +++ b/rt/lib/RT/Scrips_Overlay.pm @@ -1,8 +1,14 @@ -# BEGIN LICENSE BLOCK +# BEGIN BPS TAGGED BLOCK {{{ # -# Copyright (c) 1996-2003 Jesse Vincent +# COPYRIGHT: +# +# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC +# # -# (Except where explictly superceded by other copyright notices) +# (Except where explicitly superseded by other copyright notices) +# +# +# LICENSE: # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -14,13 +20,30 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# Unless otherwise specified, all modifications, corrections or -# extensions to this work which alter its source code become the -# property of Best Practical Solutions, LLC when submitted for -# inclusion in the work. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# # +# CONTRIBUTION SUBMISSION POLICY: # -# END LICENSE BLOCK +# (The following paragraph is not intended to limit the rights granted +# to you to modify and distribute this software under the terms of +# the GNU General Public License and is only of importance to you if +# you choose to contribute your changes and enhancements to the +# community by submitting them to Best Practical Solutions, LLC.) +# +# By intentionally submitting any modifications, corrections or +# derivatives to this work, or any other work intended for use with +# Request Tracker, to Best Practical Solutions, LLC, you confirm that +# you are the copyright holder for those contributions and you grant +# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +# royalty-free, perpetual, license to use, copy, create derivative +# works based on those contributions, and sublicense and distribute +# those contributions and any derivatives thereof. +# +# END BPS TAGGED BLOCK }}} + =head1 NAME RT::Scrips - a collection of RT Scrip objects @@ -43,6 +66,9 @@ ok (require RT::Scrips); =cut + +package RT::Scrips; + use strict; no warnings qw(redefine); @@ -129,5 +155,208 @@ sub Next { } # }}} +=head2 Apply + +Run through the relevant scrips. + +=cut + +sub Apply { + my $self = shift; + + my %args = ( TicketObj => undef, + Ticket => undef, + Transaction => undef, + TransactionObj => undef, + Stage => undef, + Type => undef, + @_ ); + + $self->Prepare(%args); + $self->Commit(); + +} + +=head2 Commit + +Commit all of this object's prepared scrips + +=cut + +sub Commit { + my $self = shift; + + + foreach my $scrip (@{$self->Prepared}) { + + $scrip->Commit( TicketObj => $self->{'TicketObj'}, + TransactionObj => $self->{'TransactionObj'} ); + } +} + + +=head2 Prepare + +Only prepare the scrips, returning an array of the scrips we're interested in +in order of preparation, not execution + +=cut + +sub Prepare { + my $self = shift; + my %args = ( TicketObj => undef, + Ticket => undef, + Transaction => undef, + TransactionObj => undef, + Stage => undef, + Type => undef, + @_ ); + + #We're really going to need a non-acled ticket for the scrips to work + $self->_SetupSourceObjects( TicketObj => $args{'TicketObj'}, + Ticket => $args{'Ticket'}, + TransactionObj => $args{'TransactionObj'}, + Transaction => $args{'Transaction'} ); + + + $self->_FindScrips( Stage => $args{'Stage'}, Type => $args{'Type'} ); + + + #Iterate through each script and check it's applicability. + while ( my $scrip = $self->Next() ) { + + next + unless ( $scrip->IsApplicable( + TicketObj => $self->{'TicketObj'}, + TransactionObj => $self->{'TransactionObj'} + ) ); + + #If it's applicable, prepare and commit it + next + unless ( $scrip->Prepare( TicketObj => $self->{'TicketObj'}, + TransactionObj => $self->{'TransactionObj'} + ) ); + push @{$self->{'prepared_scrips'}}, $scrip; + + } + + return (@{$self->Prepared}); + +}; + +=head2 Prepared + +Returns an arrayref of the scrips this object has prepared + + +=cut + +sub Prepared { + my $self = shift; + return ($self->{'prepared_scrips'} || []); +} + + +# {{{ sup _SetupSourceObjects + +=head2 _SetupSourceObjects { TicketObj , Ticket, Transaction, TransactionObj } + +Setup a ticket and transaction for this Scrip collection to work with as it runs through the +relevant scrips. (Also to figure out which scrips apply) + +Returns: nothing + +=cut + + +sub _SetupSourceObjects { + + my $self = shift; + my %args = ( + TicketObj => undef, + Ticket => undef, + Transaction => undef, + TransactionObj => undef, + @_ ); + + if ( ( $self->{'TicketObj'} = $args{'TicketObj'} ) ) { + $self->{'TicketObj'}->CurrentUser( $self->CurrentUser ); + } + else { + $self->{'TicketObj'} = RT::Ticket->new( $self->CurrentUser ); + $self->{'TicketObj'}->Load( $args{'Ticket'} ) + || $RT::Logger->err("$self couldn't load ticket $args{'Ticket'}\n"); + } + + if ( ( $self->{'TransactionObj'} = $args{'TransactionObj'} ) ) { + $self->{'TransactionObj'}->CurrentUser( $self->CurrentUser ); + } + else { + $self->{'TransactionObj'} = RT::Transaction->new( $self->CurrentUser ); + $self->{'TransactionObj'}->Load( $args{'Transaction'} ) + || $RT::Logger->err( "$self couldn't load transaction $args{'Transaction'}\n"); + } +} + +# }}} + +# {{{ sub _FindScrips; + +=head2 _FindScrips + +Find only the apropriate scrips for whatever we're doing now + +=cut + +sub _FindScrips { + my $self = shift; + my %args = ( + Stage => undef, + Type => undef, + @_ ); + + + $self->LimitToQueue( $self->{'TicketObj'}->QueueObj->Id ) + ; #Limit it to $Ticket->QueueObj->Id + $self->LimitToGlobal(); + # or to "global" + + $self->Limit( FIELD => "Stage", VALUE => $args{'Stage'} ); + + my $ConditionsAlias = $self->NewAlias('ScripConditions'); + + $self->Join( + ALIAS1 => 'main', + FIELD1 => 'ScripCondition', + ALIAS2 => $ConditionsAlias, + FIELD2 => 'id' + ); + + #We only want things where the scrip applies to this sort of transaction + # TransactionBatch stage can define list of transaction + foreach( split /\s*,\s*/, ($args{'Type'} || '') ) { + $self->Limit( + ALIAS => $ConditionsAlias, + FIELD => 'ApplicableTransTypes', + OPERATOR => 'LIKE', + VALUE => $_, + ENTRYAGGREGATOR => 'OR', + ) + } + + # Or where the scrip applies to any transaction + $self->Limit( + ALIAS => $ConditionsAlias, + FIELD => 'ApplicableTransTypes', + OPERATOR => 'LIKE', + VALUE => "Any", + ENTRYAGGREGATOR => 'OR', + ); + + $RT::Logger->debug("Found ".$self->Count. " scrips"); +} + +# }}} + 1;