From: Ivan Kohler Date: Thu, 13 Sep 2018 20:02:25 +0000 (-0700) Subject: Optimize "Customer has a referring customer" condition, RT#74452 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=833cfe5c9938d33c3e6b97ed610c25a7afa6eb04;hp=5e2b0a5efb81642e86f7704a528767c2ea2961ca Optimize "Customer has a referring customer" condition, RT#74452 --- diff --git a/FS/FS/part_event/Condition.pm b/FS/FS/part_event/Condition.pm index d1d519683..9900acaa9 100644 --- a/FS/FS/part_event/Condition.pm +++ b/FS/FS/part_event/Condition.pm @@ -533,6 +533,22 @@ sub condition_sql_option_integer { " AS $integer )"; } +=item condition_sql_option_money OPTION + +As I, but cast the option value to DECIMAL so that +comparison to other monetary values is type-correct. + +=cut + +sub condition_sql_option_money { + my ($class, $option ) = @_; + + 'CAST( + COALESCE('. $class->condition_sql_option($option). + " ,'0') ". + " AS DECIMAL(10,2) )"; +} + =head1 NEW CONDITION CLASSES A module should be added in FS/FS/part_event/Condition/ which implements the diff --git a/FS/FS/part_event/Condition/has_referral_custnum.pm b/FS/FS/part_event/Condition/has_referral_custnum.pm index 007ce4548..a56e3faec 100644 --- a/FS/FS/part_event/Condition/has_referral_custnum.pm +++ b/FS/FS/part_event/Condition/has_referral_custnum.pm @@ -60,19 +60,20 @@ sub condition { sub condition_sql { my( $class, $table, %opt ) = @_; + my $active_sql = FS::cust_main->active_sql; + $active_sql =~ s/cust_main.custnum/cust_main.referral_custnum/; + + my $under = $class->condition_sql_option_money('balance'); + my $age = $class->condition_sql_option_age_from('age', $opt{'time'}); - my $balance_sql = FS::cust_main->balance_sql( $age ); - my $balance_date_sql = FS::cust_main->balance_date_sql; - my $active_sql = FS::cust_main->active_sql; - $balance_sql =~ s/cust_main.custnum/cust_main.referral_custnum/; + my $balance_date_sql = FS::cust_main->balance_date_sql($age); $balance_date_sql =~ s/cust_main.custnum/cust_main.referral_custnum/; - $active_sql =~ s/cust_main.custnum/cust_main.referral_custnum/; - - my $sql = "cust_main.referral_custnum IS NOT NULL". - " AND (".$class->condition_sql_option('active')." IS NULL OR $active_sql)". - " AND ($balance_date_sql <= $balance_sql)"; + my $bal_sql = "$balance_date_sql <= $under"; - return $sql; + "cust_main.referral_custnum IS NOT NULL + AND (". $class->condition_sql_option('active'). " IS NULL OR $active_sql) + AND (". $class->condition_sql_option('check_bal'). " IS NULL OR $bal_sql ) + "; } 1;