summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FS/FS/Conf.pm7
-rw-r--r--FS/FS/cust_bill.pm85
2 files changed, 72 insertions, 20 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index b19c9296e..81e2a577d 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -4034,6 +4034,13 @@ and customer address. Include units.',
},
{
+ 'key' => 'previous_balance-payments_since',
+ 'section' => 'invoicing',
+ 'description' => 'Instead of showing payments (and credits) applied to the invoice, show those received since the previous invoice date.',
+ 'type' => 'checkbox',
+ },
+
+ {
'key' => 'balance_due_below_line',
'section' => 'invoicing',
'description' => 'Place the balance due message below a line. Only meaningful when when invoice_sections is false.',
diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm
index 6f4132833..32d493516 100644
--- a/FS/FS/cust_bill.pm
+++ b/FS/FS/cust_bill.pm
@@ -377,6 +377,25 @@ sub display_invnum {
}
}
+=item previous_bill
+
+Returns the customer's last invoice before this one.
+
+=cut
+
+sub previous_bill {
+ my $self = shift;
+ if ( !$self->get('previous_bill') ) {
+ $self->set('previous_bill', qsearchs({
+ 'table' => 'cust_bill',
+ 'hashref' => { 'custnum' => $self->custnum,
+ '_date' => { op=>'<', value=>$self->_date } },
+ 'order_by' => 'ORDER BY _date DESC LIMIT 1',
+ }) );
+ }
+ $self->get('previous_bill');
+}
+
=item previous
Returns a list consisting of the total previous balance for this customer,
@@ -2874,10 +2893,9 @@ sub print_generic {
# info from customer's last invoice before this one, for some
# summary formats
$invoice_data{'last_bill'} = {};
- my $last_bill = $pr_cust_bill[-1];
- if ( $last_bill ) {
+ if ( $self->previous_bill ) {
$invoice_data{'last_bill'} = {
- '_date' => $last_bill->_date, #unformatted
+ '_date' => $self->previous_bill->_date, #unformatted
# all we need for now
};
}
@@ -3316,7 +3334,7 @@ sub print_generic {
$adjust_section->{'pretotal'} = $self->mt('New charges total').' '.
$other_money_char. sprintf('%.2f', $self->charged );
}
- }else{
+ } else {
push @total_items, $total;
}
push @buf,['','-----------'];
@@ -3483,6 +3501,10 @@ sub print_generic {
} } @discounts_avail;
}
+ # debugging hook: call this with 'diag' => 1 to just get a hash of
+ # the invoice variables
+ return \%invoice_data if ( $params{'diag'} );
+
# All sections and items are built; now fill in templates.
my @includelist = ();
push @includelist, 'summary' if $summarypage;
@@ -5313,12 +5335,25 @@ sub _items_credits {
my @b;
#credits
- foreach ( $self->cust_credited ) {
+ my @objects;
+ if ( $self->conf->exists('previous_balance-payments_since') ) {
+ my $date = 0;
+ $date = $self->previous_bill->_date if $self->previous_bill;
+ @objects = qsearch('cust_credit', {
+ 'custnum' => $self->custnum,
+ '_date' => {op => '>=', value => $date},
+ });
+ # hard to do this in the qsearch...
+ @objects = grep { $_->_date < $self->_date } @objects;
+ } else {
+ @objects = $self->cust_credited;
+ }
- #something more elaborate if $_->amount ne $_->cust_credit->credited ?
+ foreach my $obj ( @objects ) {
+ my $cust_credit = $obj->isa('FS::cust_credit') ? $obj : $obj->cust_credit;
- my $reason = substr($_->cust_credit->reason, 0, $trim_len);
- $reason .= '...' if length($reason) < length($_->cust_credit->reason);
+ my $reason = substr($cust_credit->reason, 0, $trim_len);
+ $reason .= '...' if length($reason) < length($cust_credit->reason);
$reason = " ($reason) " if $reason;
push @b, {
@@ -5326,8 +5361,8 @@ sub _items_credits {
# " (". time2str("%x",$_->cust_credit->_date) .")".
# $reason,
'description' => $self->mt('Credit applied').' '.
- time2str($date_format,$_->cust_credit->_date). $reason,
- 'amount' => sprintf("%.2f",$_->amount),
+ time2str($date_format,$obj->_date). $reason,
+ 'amount' => sprintf("%.2f",$obj->amount),
};
}
@@ -5339,21 +5374,31 @@ sub _items_payments {
my $self = shift;
my @b;
- #get & print payments
- foreach ( $self->cust_bill_pay ) {
-
- #something more elaborate if $_->amount ne ->cust_pay->paid ?
+ my $detailed = $self->conf->exists('invoice_payment_details');
+ my @objects;
+ if ( $self->conf->exists('previous_balance-payments_since') ) {
+ my $date = 0;
+ $date = $self->previous_bill->_date if $self->previous_bill;
+ @objects = qsearch('cust_pay', {
+ 'custnum' => $self->custnum,
+ '_date' => {op => '>=', value => $date},
+ });
+ @objects = grep { $_->_date < $self->_date } @objects;
+ } else {
+ @objects = $self->cust_bill_pay;
+ }
+ foreach my $obj (@objects) {
+ my $cust_pay = $obj->isa('FS::cust_pay') ? $obj : $obj->cust_pay;
my $desc = $self->mt('Payment received').' '.
- time2str($date_format,$_->cust_pay->_date );
- $desc .= $self->mt(' via ' . $_->cust_pay->payby_payinfo_pretty)
- if ( $self->conf->exists('invoice_payment_details') );
-
+ time2str($date_format, $cust_pay->_date );
+ $desc .= $self->mt(' via ' . $cust_pay->payby_payinfo_pretty)
+ if $detailed;
+
push @b, {
'description' => $desc,
- 'amount' => sprintf("%.2f", $_->amount )
+ 'amount' => sprintf("%.2f", $obj->amount )
};
-
}
@b;