package FS::cust_bill;
use strict;
-use vars qw( @ISA $conf $invoice_template );
+use vars qw( @ISA $conf $invoice_template $money_char );
use vars qw( $invoice_lines @buf ); #yuck
use Date::Format;
use Text::Template;
#ask FS::UID to run this stuff for us later
$FS::UID::callback{'FS::cust_bill'} = sub {
+
$conf = new FS::Conf;
+
+ $money_char = $conf->config('money_char') || '$';
+
my @invoice_template = $conf->config('invoice_template')
or die "cannot load config file invoice_template";
$invoice_lines = 0;
=head1 DESCRIPTION
-An FS::cust_bill object represents an invoice. FS::cust_bill inherits from
-FS::Record. The following fields are currently supported:
+An FS::cust_bill object represents an invoice; a declaration that a customer
+owes you money. The specific charges are itemized as B<cust_bill_pkg> records
+(see L<FS::cust_bill_pkg>). FS::cust_bill inherits from FS::Record. The
+following fields are currently supported:
=over 4
=item charged - amount of this invoice
-=item owed - amount still outstanding on this invoice, which is charged minus
-all payments (see L<FS::cust_pay>).
-
=item printed - how many times this invoice has been printed automatically
(see L<FS::cust_main/"collect">).
Adds this invoice to the database ("Posts" the invoice). If there is an error,
returns the error, otherwise returns false.
-When adding new invoices, owed must be charged (or null, in which case it is
-automatically set to charged).
-
-=cut
-
-sub insert {
- my $self = shift;
-
- $self->owed( $self->charged ) if $self->owed eq '';
- return "owed != charged!"
- unless $self->owed == $self->charged;
-
- $self->SUPER::insert;
-}
-
=item delete
Currently unimplemented. I don't remove invoices because there would then be
Replaces the OLD_RECORD with this one in the database. If there is an error,
returns the error, otherwise returns false.
-Only owed and printed may be changed. Owed is normally updated by creating and
-inserting a payment (see L<FS::cust_pay>). Printed is normally updated by
-calling the collect method of a customer object (see L<FS::cust_main>).
+Only printed may be changed. printed is normally updated by calling the
+collect method of a customer object (see L<FS::cust_main>).
=cut
#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 charged!" unless $old->charged == $new->charged;
- return "(New) owed can't be > (new) charged!" if $new->owed > $new->charged;
$new->SUPER::replace($old);
}
|| $self->ut_number('custnum')
|| $self->ut_numbern('_date')
|| $self->ut_money('charged')
- || $self->ut_money('owed')
|| $self->ut_numbern('printed')
;
return $error if $error;
sub cust_credit {
my $self = shift;
my $total = 0;
- my @cust_credit = sort { $a->_date <=> $b->date }
+ my @cust_credit = sort { $a->_date <=> $b->_date }
grep { $_->credited != 0 && $_->_date < $self->_date }
qsearch('cust_credit', { 'custnum' => $self->custnum } )
;
sub cust_pay {
my $self = shift;
- sort { $a->_date <=> $b->date }
+ sort { $a->_date <=> $b->_date }
qsearch( 'cust_pay', { 'invnum' => $self->invnum } )
;
}
+=item owed
+
+Returns the amount owed (still outstanding) on this invoice, which is charged
+minus all payments (see L<FS::cust_pay>).
+
+=cut
+
+sub owed {
+ my $self = shift;
+ my $balance = $self->charged;
+ $balance -= $_->paid foreach ( $self->cust_pay );
+ $balance;
+}
+
=item print_text [TIME];
Returns an text invoice, as a list of lines.
push @buf, [
"Previous Balance, Invoice #". $_->invnum.
" (". time2str("%x",$_->_date). ")",
- '$'. sprintf("%10.2f",$_->owed)
+ $money_char. sprintf("%10.2f",$_->owed)
];
}
if (@pr_cust_bill) {
push @buf,['','-----------'];
- push @buf,['Total Previous Balance','$' . sprintf("%10.2f",$pr_total ) ];
+ push @buf,[ 'Total Previous Balance',
+ $money_char. sprintf("%10.2f",$pr_total ) ];
push @buf,['',''];
}
my($pkg)=$part_pkg->pkg;
if ( $_->setup != 0 ) {
- push @buf, [ "$pkg Setup",'$' . sprintf("%10.2f",$_->setup) ];
+ push @buf, [ "$pkg Setup", $money_char. sprintf("%10.2f",$_->setup) ];
push @buf,
map { [ " ". $_->[0]. ": ". $_->[1], '' ] } $cust_pkg->labels;
}
push @buf, [
"$pkg (" . time2str("%x",$_->sdate) . " - " .
time2str("%x",$_->edate) . ")",
- '$' . sprintf("%10.2f",$_->recur)
+ $money_char. sprintf("%10.2f",$_->recur)
];
push @buf,
map { [ " ". $_->[0]. ": ". $_->[1], '' ] } $cust_pkg->labels;
}
} else { #pkgnum Tax
- push @buf,["Tax",'$' . sprintf("%10.2f",$_->setup) ]
+ push @buf,["Tax", $money_char. sprintf("%10.2f",$_->setup) ]
if $_->setup != 0;
}
}
push @buf,['','-----------'];
push @buf,['Total New Charges',
- '$' . sprintf("%10.2f",$self->charged) ];
+ $money_char. sprintf("%10.2f",$self->charged) ];
push @buf,['',''];
push @buf,['','-----------'];
push @buf,['Total Charges',
- '$' . sprintf("%10.2f",$self->charged + $pr_total) ];
+ $money_char. sprintf("%10.2f",$self->charged + $pr_total) ];
push @buf,['',''];
#credits
foreach ( @cr_cust_credit ) {
push @buf,[
"Credit #". $_->crednum. " (" . time2str("%x",$_->_date) .")",
- '$' . sprintf("%10.2f",$_->credited)
+ $money_char. sprintf("%10.2f",$_->credited)
];
}
foreach ( $self->cust_pay ) {
push @buf,[
"Payment received ". time2str("%x",$_->_date ),
- '$' . sprintf("%10.2f",$_->paid )
+ $money_char. sprintf("%10.2f",$_->paid )
];
}
#balance due
push @buf,['','-----------'];
- push @buf,['Balance Due','$' .
+ push @buf,['Balance Due', $money_char.
sprintf("%10.2f",$self->owed + $pr_total - $cr_total ) ];
#setup template variables
$FS::cust_bill::_template::overdue = (
$balance_due > 0
&& $today > $self->_date
- && $self->printed > 1
+# && $self->printed > 1
+ && $self->printed > 0
);
#and subroutine for the template
=head1 VERSION
-$Id: cust_bill.pm,v 1.2 2000-08-09 11:30:41 ivan Exp $
+$Id: cust_bill.pm,v 1.7 2001-04-09 23:05:15 ivan Exp $
=head1 BUGS