+ my $last_bill = $self->previous_bill;
+ if ( $last_bill ) {
+
+ # "balance_date_range" unfortunately is unsuitable for this, since it
+ # cares about application dates. We want to know the sum of all
+ # _top-level transactions_ dated before the last invoice.
+ my @sql =
+ map "$_ WHERE _date <= ? AND custnum = ?", (
+ "SELECT COALESCE( SUM(charged), 0 ) FROM cust_bill",
+ "SELECT -1 * COALESCE( SUM(amount), 0 ) FROM cust_credit",
+ "SELECT -1 * COALESCE( SUM(paid), 0 ) FROM cust_pay",
+ "SELECT COALESCE( SUM(refund), 0 ) FROM cust_refund",
+ );
+
+ # the customer's current balance immediately after generating the last
+ # bill
+
+ my $last_bill_balance = $last_bill->charged;
+ foreach (@sql) {
+ my $delta = FS::Record->scalar_sql(
+ $_,
+ $last_bill->_date - 1,
+ $self->custnum,
+ );
+ $last_bill_balance += $delta;
+ }
+
+ $last_bill_balance = sprintf("%.2f", $last_bill_balance);
+
+ warn sprintf("LAST BILL: INVNUM %d, DATE %s, BALANCE %.2f\n\n",
+ $last_bill->invnum,
+ $self->time2str_local('%D', $last_bill->_date),
+ $last_bill_balance
+ ) if $DEBUG > 0;
+ # ("true_previous_balance" is a terrible name, but at least it's no
+ # longer stored in the database)
+ $invoice_data{'true_previous_balance'} = $last_bill_balance;
+
+ # the change in balance from immediately after that invoice
+ # to immediately before this one
+ my $before_this_bill_balance = 0;
+ foreach (@sql) {
+ my $delta = FS::Record->scalar_sql(
+ $_,
+ $self->_date - 1,
+ $self->custnum,
+ );
+ $before_this_bill_balance += $delta;
+ }
+ $invoice_data{'balance_adjustments'} =
+ sprintf("%.2f", $last_bill_balance - $before_this_bill_balance);
+
+ warn sprintf("BALANCE ADJUSTMENTS: %.2f\n\n",
+ $invoice_data{'balance_adjustments'}
+ ) if $DEBUG > 0;
+
+ # the sum of amount owed on all previous invoices
+ # ($pr_total is used elsewhere but not as $previous_balance)
+ $invoice_data{'previous_balance'} = sprintf("%.2f", $pr_total);
+