From 833cfe5c9938d33c3e6b97ed610c25a7afa6eb04 Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Thu, 13 Sep 2018 13:02:25 -0700 Subject: [PATCH] Optimize "Customer has a referring customer" condition, RT#74452 --- FS/FS/part_event/Condition.pm | 16 ++++++++++++++++ FS/FS/part_event/Condition/has_referral_custnum.pm | 21 +++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) 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; -- 2.11.0