eliminate some false laziness in FS::Misc::send_email vs. msg_template/email.pm send_...
[freeside.git] / FS / FS / part_event_condition.pm
index 200d4fc..16f84fa 100644 (file)
@@ -1,13 +1,11 @@
 package FS::part_event_condition;
+use base qw( FS::option_Common );
 
 use strict;
-use vars qw( @ISA $DEBUG @SKIP_CONDITION_SQL );
-use FS::UID qw(dbh);
-use FS::Record qw( qsearch qsearchs );
-use FS::option_Common;
+use vars qw( $DEBUG @SKIP_CONDITION_SQL );
+use FS::UID qw( dbh driver_name );
 use FS::part_event; #for order_conditions_sql...
 
-@ISA = qw( FS::option_Common ); # FS::Record );
 $DEBUG = 0;
 
 @SKIP_CONDITION_SQL = ();
@@ -185,12 +183,20 @@ foreach my $INC ( @INC ) {
     };
     my $mod = $1;
     my $fullmod = "FS::part_event::Condition::$mod";
+    if ( $fullmod =~ /_(Mixin|Common)$/ ) {
+      #warn "skipping $1 class $fullmod\n";
+      next;
+    }
     eval "use $fullmod;";
     if ( $@ ) {
       die "error using $fullmod (skipping): $@\n" if $@;
       #warn "error using $fullmod (skipping): $@\n" if $@;
       #next;
     }
+    if ( $fullmod->disabled ) {
+      warn "$fullmod is disabled; skipping\n";
+      next;
+    }
     #my $full_condition_sql = $fullmod. '::condition_sql';
     my $condition_sql_coderef = sub { $fullmod->condition_sql(@_) };
     my $order_sql_coderef = $fullmod->can('order_sql')
@@ -216,8 +222,7 @@ sub conditions {
   my( $class, $eventtable ) = @_;
   (
     map  { $_ => $conditions{$_} }
-#    sort { $conditions{$a}->{'default_weight'}<=>$conditions{$b}->{'default_weight'} }
-#    sort by ?
+    sort {$conditions{$a}->{'description'} cmp $conditions{$b}->{'description'}}
     $class->all_conditionnames( $eventtable )
   );
 
@@ -236,17 +241,17 @@ sub all_conditionnames {
        keys %conditions
 }
 
-=item join_conditions_sql [ EVENTTABLE ]
+=item join_conditions_sql [ EVENTTABLE [, OPTIONS ] ]
 
 Returns an SQL fragment selecting joining all condition options for an event as
 tables titled "cond_I<conditionname>".  Typically used in conjunction with
-B<where_conditions_sql>.
+B<where_conditions_sql>.  OPTIONS should include 'time', the time to use
+in testing event conditions.
 
 =cut
 
 sub join_conditions_sql {
-  my ( $class, $eventtable ) = @_;
-  my %conditions = $class->conditions( $eventtable );
+  my ( $class, $eventtable, %options ) = @_;
 
   join(' ',
     map {
@@ -255,7 +260,8 @@ sub join_conditions_sql {
           "       AND cond_$_.conditionname = ". dbh->quote($_).
           "     )";
         }
-        keys %conditions
+      map $_->[0], $class->_where_conditions( $eventtable, %options )
+
   );
 
 }
@@ -273,25 +279,38 @@ as passed to freeside-daily), as a UNIX timestamp.
 sub where_conditions_sql {
   my ( $class, $eventtable, %options ) = @_;
 
+  join(' AND ',
+         map { my $conditionname = $_->[0];
+               my $sql = $_->[1];
+               "( cond_$conditionname.conditionname IS NULL OR $sql )";
+             }
+           $class->_where_conditions( $eventtable, %options )
+      );
+}
+
+sub _where_conditions {
+  my ( $class, $eventtable, %options ) = @_;
+
   my $time = $options{'time'};
 
   my %conditions = $class->conditions( $eventtable );
 
-  my $where = join(' AND ',
+  grep { $_->[1] !~ /^\s*true\s*$/i
+         || $conditions{ $_->[0] }->{order_sql}
+       }
     map {
           my $conditionname = $_;
           my $coderef = $conditions{$conditionname}->{condition_sql};
-          my $sql = &$coderef( $eventtable, 'time'=>$time );
-          die "$coderef is not a CODEREF" unless ref($coderef) eq 'CODE';
-          "( cond_$conditionname.conditionname IS NULL OR $sql )";
+          #die "$coderef is not a CODEREF" unless ref($coderef) eq 'CODE';
+          my $sql = &$coderef( $eventtable, 'time'        => $time,
+                                            'driver_name' => driver_name(),
+                             );
+          [ $_, $sql ];
         }
-        grep { my $cond = $_;
-               ! grep { $_ eq $cond } @SKIP_CONDITION_SQL
-             }
-             keys %conditions
-  );
-
-  $where;
+      grep { my $cond = $_;
+             ! grep { $_ eq $cond } @SKIP_CONDITION_SQL
+           }
+        keys %conditions;
 }
 
 =item order_conditions_sql [ EVENTTABLE ]