X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fcust_event_fee.pm;h=1896b52c912c96bf54577781bcbe737aff13d736;hp=d924485e7d5a66429f7ee3e3072e71c0727dab11;hb=bb7e827141c9ed68f30765c9ca2ddcd1d760ad2d;hpb=503507828dad55cc3bcdf5e45148dd09007e8bf9 diff --git a/FS/FS/cust_event_fee.pm b/FS/FS/cust_event_fee.pm index d924485e7..1896b52c9 100644 --- a/FS/FS/cust_event_fee.pm +++ b/FS/FS/cust_event_fee.pm @@ -1,8 +1,9 @@ package FS::cust_event_fee; +use base qw( FS::cust_main_Mixin FS::Record FS::FeeOrigin_Mixin ); use strict; -use base qw( FS::Record ); -use FS::Record qw( qsearch qsearchs ); +use FS::Record qw( qsearch dbh ); +use FS::cust_event; =head1 NAME @@ -27,8 +28,8 @@ FS::cust_event_fee - Object methods for cust_event_fee records An FS::cust_event_fee object links a billing event that charged a fee (an L) to the resulting invoice line item (an -L object). FS::cust_event_fee inherits from FS::Record. -The following fields are currently supported: +L object). FS::cust_event_fee inherits from FS::Record +and FS::FeeOrigin_Mixin. The following fields are currently supported: =over 4 @@ -72,6 +73,36 @@ otherwise returns false. Delete this record from the database. +=cut + +sub delete { + my $self = shift; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $cust_bill_pkg = $self->cust_bill_pkg; + if ( $cust_bill_pkg ) { + my $error = $cust_bill_pkg->delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + my $error = $self->SUPER::delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + ''; + +} + =item replace OLD_RECORD Replaces the OLD_RECORD with this one in the database. If there is an error, @@ -85,9 +116,6 @@ and replace methods. =cut -# the check method should currently be supplied - FS::Record contains some -# data checking routines - sub check { my $self = shift; @@ -109,17 +137,14 @@ sub check { =over 4 -=item by_cust CUSTNUM[, PARAMS] - -Finds all cust_event_fee records belonging to the customer CUSTNUM. Currently -fee events can be cust_main or cust_bill events; this will return both. +=item _by_cust CUSTNUM[, PARAMS] -PARAMS can be additional params to pass to qsearch; this really only works -for 'hashref' and 'order_by'. +See L. This is the implementation for +event-triggered fees. =cut -sub by_cust { +sub _by_cust { my $class = shift; my $custnum = shift or return; my %params = @_; @@ -145,16 +170,158 @@ sub by_cust { extra_sql => "$where eventtable = 'cust_bill' ". "AND cust_bill.custnum = $custnum", %params + }), + qsearch({ + table => 'cust_event_fee', + addl_from => 'JOIN cust_event USING (eventnum) ' . + 'JOIN part_event USING (eventpart) ' . + 'JOIN cust_pay_batch ON (cust_event.tablenum = cust_pay_batch.paybatchnum)', + extra_sql => "$where eventtable = 'cust_pay_batch' ". + "AND cust_pay_batch.custnum = $custnum", + %params + }), + qsearch({ + table => 'cust_event_fee', + addl_from => 'JOIN cust_event USING (eventnum) ' . + 'JOIN part_event USING (eventpart) ' . + 'JOIN cust_pkg ON (cust_event.tablenum = cust_pkg.pkgnum)', + extra_sql => "$where eventtable = 'cust_pkg' ". + "AND cust_pkg.custnum = $custnum", + %params }) } - +=item cust_bill + +See L. This version simply returns the event +object if the event is an invoice event. + +=cut + +sub cust_bill { + my $self = shift; + my $object = $self->cust_event->cust_X; + if ( $object->isa('FS::cust_bill') ) { + return $object; + } else { + return ''; + } +} + +=item cust_pkg + +See L. This version simply returns the event +object if the event is a package event. + +=cut + +sub cust_pkg { + my $self = shift; + my $object = $self->cust_event->cust_X; + if ( $object->isa('FS::cust_pkg') ) { + return $object; + } else { + return ''; + } +} + +=item search_sql_where + +=cut + +sub search_sql_where { + my($class, $param) = @_; + + my $where = FS::cust_event->search_sql_where( $param ); + + if ( $param->{'billpkgnum'} eq 'NULL' ) { + $where .= ' AND billpkgnum IS NULL'; + } elsif ( $param->{'billpkgnum'} eq 'NOT NULL' ) { + $where .= ' AND billpkgnum IS NOT NULL'; + } + + $where; + +} + +=item join_sql + +=cut + +sub join_sql { + #my $class = shift; + + ' LEFT JOIN cust_event USING (eventnum) + LEFT JOIN cust_bill_pkg USING (billpkgnum) + LEFT JOIN cust_bill AS fee_cust_bill USING (invnum) + LEFT JOIN part_fee ON (cust_event_fee.feepart = part_fee.feepart ) + '. FS::cust_event->join_sql(); + +} + +=back + +=head1 SUBROUTINES + +=over 4 + +=item process_delete + +=cut + +sub process_delete { + my( $job, $param ) = @_; + + my $search_sql = FS::cust_event_fee->search_sql_where($param); + my $where = $search_sql ? " WHERE $search_sql" : ''; + + my @cust_event_fee = qsearch({ + 'table' => 'cust_event_fee', + 'addl_from' => FS::cust_event_fee->join_sql(), + 'hashref' => {}, + 'extra_sql' => $where, + }); + + my( $num, $last, $min_sec ) = (0, time, 5); #progresbar foo + foreach my $cust_event_fee ( @cust_event_fee ) { + + my $error = $cust_event_fee->delete; + die $error if $error; + + if ( $job ) { #progressbar foo + $num++; + if ( time - $min_sec > $last ) { + my $error = $job->update_statustext( + int( 100 * $num / scalar(@cust_event_fee) ) + ); + die $error if $error; + $last = time; + } + } + + } + +} + +sub _upgrade_schema { + my ($class, %opts) = @_; + + my $sql = ' + DELETE FROM cust_event_Fee WHERE NOT EXISTS + ( SELECT 1 FROM cust_event WHERE cust_event.eventnum = cust_event_fee.eventnum ) + '; + + my $sth = dbh->prepare($sql) or die dbh->errstr; + $sth->execute or die $sth->errstr; + ''; +} + =head1 BUGS =head1 SEE ALSO -L, L, L +L, L, L =cut