X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fcust_main.pm;h=bd1f212b36b36841dacbbb6637e6f50ffca2f3a4;hp=682b43d95c088cdd672cb0e33d4d6223b2469391;hb=42ac86258bce00f5e7fa2db7e375c4a344295a15;hpb=aa7b51c0794f6a61e522fbba978f6c64446d8696 diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 682b43d95..bd1f212b3 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -28,6 +28,7 @@ use FS::part_referral; use FS::cust_main_county; use FS::agent; use FS::cust_main_invoice; +use FS::cust_credit_bill; use FS::prepay_credit; @ISA = qw( FS::Record ); @@ -1238,6 +1239,57 @@ sub total_owed { sprintf( "%.2f", $total_bill ); } +=item apply_credits + +Applies (see L) unapplied credits (see L)to outstanding invoice balances in cronological order and returns the value +of any remaining unapplied credits available for refund (see L). + +=cut + +sub apply_credits { + my $self = shift; + + return 0 unless $self->total_credited; + + my @credits = sort { $b->_date <=> $a->_date} (grep { $_->credited > 0 } + qsearch('cust_credit', { 'custnum' => $self->custnum } ) ); + + my @invoices = sort { $a->_date <=> $b->_date} (grep { $_->owed > 0 } + qsearch('cust_bill', { 'custnum' => $self->custnum } ) ); + + my $credit; + + foreach my $cust_bill ( @invoices ) { + my $amount; + + if (!(defined $credit) || $credit->credited == 0) { + $credit = pop @credits; + last unless defined $credit; + } + + if ($cust_bill->owed >= $credit->credited) { + $amount=$credit->credited; + }else{ + $amount=$cust_bill->owed; + } + + my $cust_credit_bill = new FS::cust_credit_bill ( { + 'crednum' => $credit->crednum, + 'invnum' => $cust_bill->invnum, + 'amount' => $amount, + '_date' => time, + } ); + my $error = $cust_credit_bill->insert; + die $error if $error; + + redo if ($cust_bill->owed > 0); + + } + + return $self->total_credited; +} + + =item total_credited Returns the total credits (see L) for this customer. @@ -1398,7 +1450,7 @@ sub rebuild_fuzzyfiles { =head1 VERSION -$Id: cust_main.pm,v 1.22 2001-08-28 14:34:14 ivan Exp $ +$Id: cust_main.pm,v 1.25 2001-09-01 22:28:51 jeff Exp $ =head1 BUGS @@ -1415,8 +1467,6 @@ CyberCash v2 forces us to define some variables in package main. There should probably be a configuration file with a list of allowed credit card types. -CyberCash is the only processor. - No multiple currency support (probably a larger project than just this module). =head1 SEE ALSO