X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=FS%2FFS%2FCron%2Fbill.pm;h=b31880927d1df69a345f89fb933786b927afe6f7;hb=cd3ed01671d5e1f9332c494abbf4bb110aabe1e3;hp=27011c69fea8dd5d650d59b14539cf89c0fd25bd;hpb=bd1336161b9c25b93001cb785193efde6f3ef0d2;p=freeside.git diff --git a/FS/FS/Cron/bill.pm b/FS/FS/Cron/bill.pm index 27011c69f..b31880927 100644 --- a/FS/FS/Cron/bill.pm +++ b/FS/FS/Cron/bill.pm @@ -5,8 +5,9 @@ use vars qw( @ISA @EXPORT_OK ); use Exporter; use Date::Parse; use DBI 1.33; #The "clone" method was added in DBI 1.33. -use FS::UID qw(dbh); +use FS::UID qw( dbh driver_name ); use FS::Record qw( qsearch qsearchs ); +use FS::Misc::DateTime qw( day_end ); use FS::queue; use FS::cust_main; use FS::part_event; @@ -56,14 +57,20 @@ sub bill { my $cursor_dbh = dbh->clone; - $cursor_dbh->do( - "DECLARE cron_bill_cursor CURSOR FOR ". - " SELECT custnum FROM cust_main WHERE ". bill_where( %opt ) - ) or die $cursor_dbh->errstr; + my $select = 'SELECT custnum FROM cust_main WHERE '. bill_where( %opt ); + + unless ( driver_name =~ /^mysql/ ) { + $cursor_dbh->do( "DECLARE cron_bill_cursor CURSOR FOR $select" ) + or die $cursor_dbh->errstr; + } while ( 1 ) { - my $sth = $cursor_dbh->prepare('FETCH 100 FROM cron_bill_cursor'); #mysql? + my $sql = (driver_name =~ /^mysql/) + ? $select + : 'FETCH 100 FROM cron_bill_cursor'; + + my $sth = $cursor_dbh->prepare($sql); $sth->execute or die $sth->errstr; @@ -120,6 +127,8 @@ sub bill { } + last if driver_name =~ /^mysql/; + } $cursor_dbh->commit or die $cursor_dbh->errstr; @@ -147,6 +156,15 @@ sub bill { # # -l: debugging level +=item bill_where + +Internal function. Returns a WHERE clause to select the set of customers who +have actionable packages (no setup date, or bill date in the past, or expire +or adjourn dates in the past) or events (does a complete where_conditions_sql +scan). + +=cut + sub bill_where { my( %opt ) = @_; @@ -161,7 +179,7 @@ sub bill_where { push @search, "cust_main.payby = '". $opt{'p'}. "'" if $opt{'p'}; - push @search, "cust_main.agentnum = ". $opt{'a'} + push @search, "cust_main.agentnum IN ( ". $opt{'a'}. " ) " if $opt{'a'}; #it would be useful if i recognized $opt{g} / $not_pkgpart... @@ -176,6 +194,8 @@ sub bill_where { # generate where_pkg/where_event search clause ### + my $billtime = day_end($time); + # select * from cust_main where my $where_pkg = <<"END"; EXISTS( @@ -187,22 +207,26 @@ sub bill_where { OR ( start_date IS NOT NULL AND start_date <= $^T ) ) ) - OR bill IS NULL OR bill <= $time + OR bill IS NULL OR bill <= $billtime OR ( expire IS NOT NULL AND expire <= $^T ) OR ( adjourn IS NOT NULL AND adjourn <= $^T ) ) ) END + #some false laziness w/cust_main::Billing due_cust_event my $where_event = join(' OR ', map { my $eventtable = $_; + # joins and where clauses to test event conditions my $join = FS::part_event_condition->join_conditions_sql( $eventtable ); my $where = FS::part_event_condition->where_conditions_sql( $eventtable, 'time'=>$time, ); $where = $where ? "AND $where" : ''; + # test to return all applicable part_events (defined on this eventtable, + # not disabled, check_freq correct, and all event conditions true) my $are_part_event = "EXISTS ( SELECT 1 FROM part_event $join WHERE check_freq = '$check_freq' @@ -215,8 +239,11 @@ END if ( $eventtable eq 'cust_main' ) { $are_part_event; } else { - "EXISTS ( SELECT 1 FROM $eventtable - WHERE cust_main.custnum = $eventtable.custnum + my $cust_join = FS::part_event->eventtables_cust_join->{$eventtable} + || ''; + my $custnum = FS::part_event->eventtables_custnum->{$eventtable}; + "EXISTS ( SELECT 1 FROM $eventtable $cust_join + WHERE cust_main.custnum = $custnum AND $are_part_event ) ";