package FS::part_event_condition;
use strict;
-use vars qw( @ISA $DEBUG );
-use FS::UID qw(dbh);
+use vars qw( @ISA $DEBUG @SKIP_CONDITION_SQL );
+use FS::UID qw( dbh driver_name );
use FS::Record qw( qsearch qsearchs );
use FS::option_Common;
use FS::part_event; #for order_conditions_sql...
@ISA = qw( FS::option_Common ); # FS::Record );
$DEBUG = 0;
+@SKIP_CONDITION_SQL = ();
+
=head1 NAME
FS::part_event_condition - Object methods for part_event_condition records
};
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')
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 )
);
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 {
" AND cond_$_.conditionname = ". dbh->quote($_).
" )";
}
- keys %conditions
+ map $_->[0], $class->_where_conditions( $eventtable, %options )
+
);
}
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 ];
}
- keys %conditions
- );
-
- $where;
+ grep { my $cond = $_;
+ ! grep { $_ eq $cond } @SKIP_CONDITION_SQL
+ }
+ keys %conditions;
}
=item order_conditions_sql [ EVENTTABLE ]