import rt 3.2.2
[freeside.git] / rt / lib / RT / Scrips_Overlay.pm
index d201480..2f395ff 100644 (file)
@@ -1,8 +1,14 @@
-# BEGIN LICENSE BLOCK
+# {{{ BEGIN BPS TAGGED BLOCK
 # 
 # 
-# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC 
+#                                          <jesse@bestpractical.com>
 # 
 # 
-# (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
 # 
 # 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
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 # General Public License for more details.
 # 
 # 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:
+# 
+# (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 LICENSE BLOCK
+# }}} END BPS TAGGED BLOCK
 =head1 NAME
 
   RT::Scrips - a collection of RT Scrip objects
 =head1 NAME
 
   RT::Scrips - a collection of RT Scrip objects
@@ -129,40 +151,172 @@ sub Next {
 }
 # }}}
 
 }
 # }}}
 
+=head2 Apply
+
+Run through the relevant scrips. 
+
+=cut
+
 sub Apply {
 sub Apply {
-    my ($self, %args) = @_;
+    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
 
     #We're really going to need a non-acled ticket for the scrips to work
-    my ($TicketObj, $TransactionObj);
+    $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;
 
 
-    if ( ($TicketObj = $args{'TicketObj'}) ) {
-        $TicketObj->CurrentUser($self->CurrentUser);
+    }
+
+    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 {
     }
     else {
-        $TicketObj = RT::Ticket->new($self->CurrentUser);
-        $TicketObj->Load( $args{'Ticket'} )
-            || $RT::Logger->err("$self couldn't load ticket $args{'Ticket'}\n");
+        $self->{'TicketObj'} = RT::Ticket->new( $self->CurrentUser );
+        $self->{'TicketObj'}->Load( $args{'Ticket'} )
+          || $RT::Logger->err("$self couldn't load ticket $args{'Ticket'}\n");
     }
 
     }
 
-    if ( ($TransactionObj = $args{'TransactionObj'}) ) {
-        $TransactionObj->CurrentUser($self->CurrentUser);
+    if ( ( $self->{'TransactionObj'} = $args{'TransactionObj'} ) ) {
+        $self->{'TransactionObj'}->CurrentUser( $self->CurrentUser );
     }
     else {
     }
     else {
-        $TransactionObj = RT::Transaction->new($self->CurrentUser);
-        $TransactionObj->Load( $args{'Transaction'} )
-            || $RT::Logger->err("$self couldn't load transaction $args{'Transaction'}\n");
+        $self->{'TransactionObj'} = RT::Transaction->new( $self->CurrentUser );
+        $self->{'TransactionObj'}->Load( $args{'Transaction'} )
+          || $RT::Logger->err( "$self couldn't load transaction $args{'Transaction'}\n");
     }
     }
+} 
 
 
-    # {{{ Deal with Scrips
+# }}}
 
 
-    $self->LimitToQueue( $TicketObj->QueueObj->Id )
-        ;                                  #Limit it to  $Ticket->QueueObj->Id
-    $self->LimitToGlobal()
-        unless $TicketObj->QueueObj->Disabled;    # or to "global"
+# {{{ 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->Limit(FIELD => "Stage", VALUE => $args{'Stage'});
 
 
+    $self->LimitToQueue( $self->{'TicketObj'}->QueueObj->Id )
+      ;    #Limit it to  $Ticket->QueueObj->Id
+    $self->LimitToGlobal()
+      unless $self->{'TicketObj'}->QueueObj->Disabled;    # or to "global"
+
+    $self->Limit( FIELD => "Stage", VALUE => $args{'Stage'} );
 
     my $ConditionsAlias = $self->NewAlias('ScripConditions');
 
 
     my $ConditionsAlias = $self->NewAlias('ScripConditions');
 
@@ -180,7 +334,8 @@ sub Apply {
         OPERATOR        => 'LIKE',
         VALUE           => $args{'Type'},
         ENTRYAGGREGATOR => 'OR',
         OPERATOR        => 'LIKE',
         VALUE           => $args{'Type'},
         ENTRYAGGREGATOR => 'OR',
-    ) if $args{'Type'};
+      )
+      if $args{'Type'};
 
     # Or where the scrip applies to any transaction
     $self->Limit(
 
     # Or where the scrip applies to any transaction
     $self->Limit(
@@ -191,18 +346,10 @@ sub Apply {
         ENTRYAGGREGATOR => 'OR',
     );
 
         ENTRYAGGREGATOR => 'OR',
     );
 
-    #Iterate through each script and check it's applicability.
-    while ( my $Scrip = $self->Next() ) {
-        $Scrip->Apply (TicketObj => $TicketObj,
-                        TransactionObj => $TransactionObj);
-    }
-
-    $TicketObj->CurrentUser( $TicketObj->OriginalUser );
-    $TransactionObj->CurrentUser( $TransactionObj->OriginalUser );
-
-    # }}}
+    $RT::Logger->debug("Found ".$self->Count. " scrips");
 }
 
 }
 
+# }}}
 
 1;
 
 
 1;