use strict;
use vars qw( @ISA );
use FS::UID qw( getotaker );
-use FS::Record qw( qsearchs );
+use FS::Record qw( qsearch qsearchs );
use FS::cust_main;
+use FS::cust_refund;
+use FS::cust_credit_bill;
@ISA = qw( FS::Record );
=head1 DESCRIPTION
-An FS::cust_credit object represents a credit. FS::cust_credit inherits from
+An FS::cust_credit object represents a credit; the equivalent of a negative
+B<cust_bill> record (see L<FS::cust_bill>). FS::cust_credit inherits from
FS::Record. The following fields are currently supported:
=over 4
=item amount - amount of the credit
-=item credited - how much of this credit that is still outstanding, which is
-amount minus all refunds (see L<FS::cust_refund>).
-
=item _date - specified as a UNIX timestamp; see L<perlfunc/"time">. Also see
L<Time::Local> and L<Date::Parse> for conversion functions.
Adds this credit to the database ("Posts" the credit). If there is an error,
returns the error, otherwise returns false.
-When adding new invoices, credited must be amount (or null, in which case it is
-automatically set to amount).
-
-=cut
-
-sub insert {
- my $self = shift;
-
- my $error;
- return $error if $error = $self->ut_money('credited')
- || $self->ut_money('amount');
-
- $self->credited($self->amount) if $self->credited == 0
- || $self->credited eq '';
- return "credited != amount!"
- unless $self->credited == $self->amount;
-
- $self->SUPER::insert;
-}
-
=item delete
Currently unimplemented.
=item replace OLD_RECORD
-Replaces the OLD_RECORD with this one in the database. If there is an error,
-returns the error, otherwise returns false.
-
-Only credited may be changed. Credited is normally updated by creating and
-inserting a refund (see L<FS::cust_refund>).
+Credits may not be modified; there would then be no record the credit was ever
+posted.
=cut
sub replace {
- my ( $new, $old ) = ( shift, shift );
-
- return "Can't change custnum!" unless $old->custnum == $new->custnum;
- #return "Can't change date!" unless $old->_date eq $new->_date;
- return "Can't change date!" unless $old->_date == $new->_date;
- return "Can't change amount!" unless $old->amount == $new->amount;
- return "(New) credited can't be > (new) amount!"
- if $new->credited > $new->amount;
-
- $new->SUPER::replace($old);
+ return "Can't modify credit!"
}
=item check
|| $self->ut_number('custnum')
|| $self->ut_numbern('_date')
|| $self->ut_money('amount')
- || $self->ut_money('credited')
|| $self->ut_textn('reason');
;
return $error if $error;
''; #no error
}
+=item cust_refund
+
+Depreciated. See the cust_credit_refund method.
+
+#Returns all refunds (see L<FS::cust_refund>) 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<FS::cust_credit_refund>) 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<FS::cust_credit_bill>) for this
+credit.
+
+=cut
+
+sub cust_credit_bill {
+ my $self = shift;
+ sort { $a->_date <=> $b->_date }
+ qsearch( 'cust_credit_bill', { 'crednum' => $self->crednum } )
+ ;
+}
+
+=item credited
+
+Returns the amount of this credit that is still outstanding; which is
+amount minus all refund applications (see L<FS::cust_credit_refund>) and
+applications to invoices (see L<FS::cust_credit_bill>).
+
+=cut
+
+sub credited {
+ my $self = shift;
+ my $amount = $self->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.1 1999-08-04 09:03:53 ivan Exp $
+$Id: cust_credit.pm,v 1.11 2001-09-02 07:49:52 ivan Exp $
=head1 BUGS
=head1 SEE ALSO
-L<FS::Record>, L<FS::cust_refund>, L<FS::cust_bill>, schema.html from the base
+L<FS::Record>, L<FS::cust_credit_refund>, L<FS::cust_refund>,
+L<FS::cust_credit_bill> L<FS::cust_bill>, schema.html from the base
documentation.
=cut