X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_credit.pm;h=3044af7ea07ca6e15409e9ea7782d619ad47035e;hb=243ec8f6a0ef59759f1398967faa561a43b1dff5;hp=7e55dca80c26573c38d3030e294e0e2f03d73d2d;hpb=231db9f6d724c329e5fb45c79931f8248323e588;p=freeside.git diff --git a/FS/FS/cust_credit.pm b/FS/FS/cust_credit.pm index 7e55dca80..3044af7ea 100644 --- a/FS/FS/cust_credit.pm +++ b/FS/FS/cust_credit.pm @@ -1,14 +1,23 @@ package FS::cust_credit; use strict; -use vars qw( @ISA ); -use FS::UID qw( getotaker ); +use vars qw( @ISA $conf $unsuspendauto ); +use FS::UID qw( dbh getotaker ); use FS::Record qw( qsearch qsearchs ); use FS::cust_main; use FS::cust_refund; +use FS::cust_credit_bill; @ISA = qw( FS::Record ); +#ask FS::UID to run this stuff for us later +$FS::UID::callback{'FS::cust_credit'} = sub { + + $conf = new FS::Conf; + $unsuspendauto = $conf->exists('unsuspendauto'); + +}; + =head1 NAME FS::cust_credit - Object methods for cust_credit records @@ -68,6 +77,48 @@ sub table { 'cust_credit'; } Adds this credit to the database ("Posts" the credit). If there is an error, returns the error, otherwise returns false. +=cut + +sub insert { + my $self = shift; + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $cust_main = qsearchs( 'cust_main', { 'custnum' => $self->custnum } ); + my $old_balance = $cust_main->balance; + + my $error = $self->SUPER::insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "error inserting $self: $error"; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + #false laziness w/ cust_credit::insert + if ( $unsuspendauto && $old_balance && $cust_main->balance <= 0 ) { + my @errors = $cust_main->unsuspend; + #return + # side-fx with nested transactions? upstack rolls back? + warn "WARNING:Errors unsuspending customer ". $cust_main->custnum. ": ". + join(' / ', @errors) + if @errors; + } + #eslaf + + ''; + +} + =item delete Currently unimplemented. @@ -109,6 +160,8 @@ sub check { ; return $error if $error; + return "amount must be > 0 " if $self->amount <= 0; + return "Unknown customer" unless qsearchs( 'cust_main', { 'custnum' => $self->custnum } ); @@ -121,36 +174,70 @@ sub check { =item cust_refund -Returns all refunds (see L) for this credit. +Depreciated. See the cust_credit_refund method. + +#Returns all refunds (see L) for this credit. =cut sub cust_refund { + use Carp; + croak "FS::cust_credit->cust_pay depreciated; see ". + "FS::cust_credit->cust_credit_refund"; + #my $self = shift; + #sort { $a->_date <=> $b->_date } + # qsearch( 'cust_refund', { 'crednum' => $self->crednum } ) + #; +} + +=item cust_credit_refund + +Returns all refund applications (see L) for this credit. + +=cut + +sub cust_credit_refund { + my $self = shift; + sort { $a->_date <=> $b->_date } + qsearch( 'cust_credit_refund', { 'crednum' => $self->crednum } ) + ; +} + +=item cust_credit_bill + +Returns all application to invoices (see L) for this +credit. + +=cut + +sub cust_credit_bill { my $self = shift; sort { $a->_date <=> $b->_date } - qsearch( 'cust_refund', { 'crednum' => $self->crednum } ) + qsearch( 'cust_credit_bill', { 'crednum' => $self->crednum } ) ; } =item credited Returns the amount of this credit that is still outstanding; which is -amount minus all refunds (see L). +amount minus all refund applications (see L) and +applications to invoices (see L). =cut sub credited { my $self = shift; my $amount = $self->amount; - $amount -= $_->refund foreach ( $self->cust_refund ); - $amount; + $amount -= $_->amount foreach ( $self->cust_credit_refund ); + $amount -= $_->amount foreach ( $self->cust_credit_bill ); + sprintf( "%.2f", $amount ); } =back =head1 VERSION -$Id: cust_credit.pm,v 1.6 2001-04-23 19:50:07 ivan Exp $ +$Id: cust_credit.pm,v 1.14 2002-01-24 16:58:47 ivan Exp $ =head1 BUGS @@ -158,7 +245,8 @@ The delete method. =head1 SEE ALSO -L, L, L, schema.html from the base +L, L, L, +L L, schema.html from the base documentation. =cut