X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_bill_event.pm;h=36afed04043eac3abc75fce6d52d12b996331d4e;hb=80511cb4158b98db01deec317e5408675487bc6e;hp=7b981391e4777cefc12f5d6cc6674c58ec71cd2e;hpb=684a478c0f88e5bf6d1d3f32f4618089146b5709;p=freeside.git diff --git a/FS/FS/cust_bill_event.pm b/FS/FS/cust_bill_event.pm index 7b981391e..36afed040 100644 --- a/FS/FS/cust_bill_event.pm +++ b/FS/FS/cust_bill_event.pm @@ -3,10 +3,11 @@ package FS::cust_bill_event; use strict; use vars qw( @ISA $DEBUG ); use FS::Record qw( qsearch qsearchs ); +use FS::cust_main_Mixin; use FS::cust_bill; use FS::part_bill_event; -@ISA = qw(FS::Record); +@ISA = qw(FS::cust_main_Mixin FS::Record); $DEBUG = 0; @@ -37,18 +38,30 @@ currently supported: =over 4 -=item eventnum - primary key +=item eventnum -=item invnum - invoice (see L) +Primary key -=item eventpart - event definition (see L) +=item invnum -=item _date - specified as a UNIX timestamp; see L. Also see +Invoice (see L) + +=item eventpart + +Event definition (see L) + +=item _date + +Specified as a UNIX timestamp; see L. Also see L and L for conversion functions. -=item status - event status: B or B +=item status -=item statustext - additional status detail (i.e. error message) +Event status: B or B + +=item statustext + +Additional status detail (i.e. error message) =back @@ -70,6 +83,13 @@ points to. You can ask the object for a copy with the I method. sub table { 'cust_bill_event'; } +sub cust_linked { $_[0]->cust_main_custnum; } +sub cust_unlinked_msg { + my $self = shift; + "WARNING: can't find cust_main.custnum ". $self->custnum. + ' (cust_bill.invnum '. $self->invnum. ')'; +} + =item insert Adds this record to the database. If there is an error, returns the error, @@ -115,15 +135,16 @@ sub check { || $self->ut_number('eventpart') || $self->ut_number('_date') || $self->ut_enum('status', [qw( done failed )]) - || $self->ut_textn('statustext') + || $self->ut_anything('statustext') ; + return "Unknown eventpart ". $self->eventpart + unless my $part_bill_event = + qsearchs( 'part_bill_event' ,{ 'eventpart' => $self->eventpart } ); + return "Unknown invnum ". $self->invnum unless qsearchs( 'cust_bill' ,{ 'invnum' => $self->invnum } ); - return "Unknown eventpart ". $self->eventpart - unless qsearchs( 'part_bill_event' ,{ 'eventpart' => $self->eventpart } ); - $self->SUPER::check; } @@ -165,6 +186,94 @@ sub retry { $self->replace($old); } +=item retryable + +Changes the statustext of this event to B, rendering it +retriable (should retry be called). + +=cut + +sub retriable { + my $self = shift; + return '' unless $self->status eq 'done'; + my $old = ref($self)->new( { $self->hash } ); + $self->statustext('retriable'); + $self->replace($old); +} + +=item search_sql_where HASHREF + +Class method which returns an SQL WHERE fragment to search for parameters +specified in HASHREF. Valid parameters are + +=over 4 + +=item agentnum + +=item beginning + +An epoch date setting a lower bound for _date values + +=item ending + +An epoch date setting a upper bound for _date values + +=item failed + +Limits the search to failed events if true + +=item payby + +Requires that the search be JOIN'd to part_bill_event # Bug? + +=item invnum + +=item currentuser + +Specifies the user for agent virtualization + +=back + +=cut + +sub search_sql_where { + my ($class, $params) = @_; + my @search = (); + + push @search, "agentnum = ". $params->{agentnum} if $params->{agentnum}; + + push @search, "cust_bill_event._date >= ". $params->{beginning} + if $params->{beginning}; + push @search, "cust_bill_event._date <= ". $params->{ending} + if $params->{ending}; + + push @search, "statustext != ''", + "statustext IS NOT NULL", + "statustext != 'N/A'" + if $params->{failed}; + + push @search, "part_bill_event.payby = '". $params->{payby}. "'" + if $params->{payby}; + + push @search, "cust_bill_event.invnum = '". $params->{invnum}. "'" + if $params->{invnum}; + + my $currentuser = $params->{currentuser} || $params->{CurrentUser}; + if ($currentuser) { + my $access_user = qsearchs('access_user', { username => $currentuser }); + if ($access_user) { + push @search, $access_user->agentnums_sql; + }else{ + push @search, "1=0"; + } + }else{ + push @search, $FS::CurrentUser::CurrentUser->agentnums_sql; + } + + join(' AND ', @search ); + +} + =back =head1 SUBROUTINES @@ -206,24 +315,21 @@ sub process_re_X { re_X( $method, - $param->{'beginning'}, - $param->{'ending'}, - $param->{'failed'}, + $param, $job, ); } sub re_X { - my($method, $beginning, $ending, $failed, $job) = @_; + my($method, $param, $job) = @_; - my $where = " WHERE plan LIKE 'send%'". - " AND cust_bill_event._date >= $beginning". - " AND cust_bill_event._date <= $ending"; - $where .= " AND statustext != '' AND statustext IS NOT NULL" - if $failed; + my $where = FS::cust_bill_event->search_sql_where($param); + $where = " WHERE plan LIKE 'send%'". ( $where ? " AND $where" : "" ); - my $from = 'LEFT JOIN part_bill_event USING ( eventpart )'; + my $from = 'LEFT JOIN part_bill_event USING ( eventpart )'. + 'LEFT JOIN cust_bill USING ( invnum )'. + 'LEFT JOIN cust_main USING ( custnum )'; my @cust_bill_event = qsearch( 'cust_bill_event', {}, '', $where, '', $from );