X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_event%2FCondition%2Fbalance_age.pm;h=701dafdfe9ab640e8792cc5c1661b5af5f666f74;hb=9795489fc19bf7be914d95a0c8dba71361ea327e;hp=94f231ec14cbb0c4b9a0ee0d6d6c889ed610e79a;hpb=9509e5bfb7f9331303153cac24d7bfecbe2ea9f1;p=freeside.git diff --git a/FS/FS/part_event/Condition/balance_age.pm b/FS/FS/part_event/Condition/balance_age.pm index 94f231ec1..701dafdfe 100644 --- a/FS/FS/part_event/Condition/balance_age.pm +++ b/FS/FS/part_event/Condition/balance_age.pm @@ -1,13 +1,50 @@ package FS::part_event::Condition::balance_age; -require 5.006; use strict; -use Time::Local qw(timelocal_nocheck); - use base qw( FS::part_event::Condition ); sub description { 'Customer balance age'; } +=item check_options OPTIONS + +Validate options + +=cut + +my $duration_rx = qr/^(\d+)$/; +my $unit_rx = qr/^[wmdh]$/; +my $both_rx = qr/^(\d+)([wmdh])/; + +sub check_options { + my ($self, $options) = @_; + + my $age = $options->{age}; + my $age_units = $options->{age_units}; + + return "Invalid (age) must be defined: $age" + unless( defined $age ); + + # over-ride possibly inaccurate unit indicator + if( $age =~ /$both_rx/ ){ + $age = $1; + $age_units = $2; + } + + return "Invalid (age_units) must be defined: $age_units" + unless defined $age_units; + + return "Invalid (age) must be integer: $age" + unless( $age =~ /$duration_rx/ ); + + return "Invalid (age) must be non-zero: $age" + if ( $age == 0 ); + + return( "Invalid (age_units) must be m/w/d/h: $age_units" ) + unless( $age_units =~ /$unit_rx/i ); + + return ''; +} + sub option_fields { ( 'balance' => { 'label' => 'Balance over', @@ -28,52 +65,24 @@ sub condition { my $over = $self->option('balance'); $over = 0 unless length($over); - #false laziness w/cust_bill_age - my $time = $opt{'time'}; - my $age = $self->option('age'); - $age = '0m' unless length($age); - - my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($time) )[0,1,2,3,4,5]; - if ( $age =~ /^(\d+)m$/i ) { - $mon -= $1; - until ( $mon >= 0 ) { $mon += 12; $year--; } - } elsif ( $age =~ /^(\d+)y$/i ) { - $year -= $1; - } elsif ( $age =~ /^(\d+)w$/i ) { - $mday -= $1 * 7; - } elsif ( $age =~ /^(\d+)d$/i ) { - $mday -= $1; - } elsif ( $age =~ /^(\d+)h$/i ) { - $hour -= $hour; - } else { - die "unparsable age: $age"; - } - my $age_date = timelocal_nocheck($sec,$min,$hour,$mday,$mon,$year); + my $age = $self->option_age_from('age', $opt{'time'} ); - $cust_main->balance_date($age_date) > $over; + $cust_main->balance_date($age) > $over; } sub condition_sql { my( $class, $table, %opt ) = @_; - my $time = $opt{'time'}; - - my $over = $class->condition_sql_option('balance'); - my $age = $class->condition_sql_option('age'); - my $age_sql = - "$time - EXTRACT( EPOCH FROM REPLACE( $age, 'm', 'mon')::interval )"; + my $over = $class->condition_sql_option('balance'); + my $age = $class->condition_sql_option_age_from('age', $opt{'time'}); - my $balance_sql = FS::cust_main->balance_date_sql( $age_sql ); - - "$balance_sql > $over"; + my $balance_sql = FS::cust_main->balance_date_sql( $age ); + "$balance_sql > CAST( $over AS DECIMAL(10,2) )"; } sub order_sql { - my( $class ) = @_; - - my $age = $class->condition_sql_option('age'); - "EXTRACT( EPOCH FROM REPLACE( $age, 'm', 'mon')::interval )"; + shift->condition_sql_option_age('age'); } sub order_sql_weight {