use Text::Template 1.20;
use File::Temp 0.14;
use HTML::Entities;
-use Locale::Country;
use Cwd;
use FS::UID;
use FS::Misc qw( send_email );
if ( $cust_main->country eq $countrydefault ) {
$invoice_data{'country'} = '';
} else {
- $invoice_data{'country'} = &$escape_function(code2country($cust_main->country));
+ $invoice_data{'country'} = &$escape_function($cust_main->bill_country_full);
}
my @address = ();
# "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.
+ #
+ # still do this for the "Previous Balance" line of the summary block
my @sql =
map "$_ WHERE _date <= ? AND custnum = ?", (
"SELECT COALESCE( SUM(charged), 0 ) FROM cust_bill",
# 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;
+ # Now, get all applications of credits/payments dated on or after the
+ # previous bill, to invoices before the current bill. (The
+ # credit/payment date restriction prevents these from intersecting
+ # the "Previous Balance" set.)
+ # These are "adjustments". The past due balance will be shown as
+ # Previous Balance - Adjustments.
+ my $adjustments = 0;
+ @sql = map {
+ "SELECT COALESCE(SUM(y.amount),0) FROM $_ JOIN cust_bill USING (invnum)
+ WHERE cust_bill._date < ?
+ AND x._date >= ?
+ AND cust_bill.custnum = ?"
+ } "cust_credit AS x JOIN cust_credit_bill y USING (crednum)",
+ "cust_pay AS x JOIN cust_bill_pay y USING (paynum)"
+ ;
foreach (@sql) {
my $delta = FS::Record->scalar_sql(
$_,
- $self->_date - 1,
+ $self->_date,
+ $last_bill->_date,
$self->custnum,
);
- $before_this_bill_balance += $delta;
+ $adjustments += $delta;
}
- $invoice_data{'balance_adjustments'} =
- sprintf("%.2f", $last_bill_balance - $before_this_bill_balance);
+ $invoice_data{'balance_adjustments'} = sprintf("%.2f", $adjustments);
warn sprintf("BALANCE ADJUSTMENTS: %.2f\n\n",
$invoice_data{'balance_adjustments'}
multisection: a flag indicating that this is a multisection invoice,
which does something complicated.
-preref_callback: coderef run for each line item, code should return HTML to be
-displayed before that line item (quotations only)
-
Returns a list of hashrefs, each of which may contain:
pkgnum, description, amount, unit_amount, quantity, pkgpart, _is_setup, and
'no_usage' => $opt{'no_usage'},
);
- if ( ref($cust_bill_pkg) eq 'FS::quotation_pkg' ) {
- # XXX this should be pulled out into quotation_pkg
-
- warn "$me _items_cust_bill_pkg cust_bill_pkg is quotation_pkg\n"
- if $DEBUG > 1;
- # quotation_pkgs are never fees, so don't worry about the case where
- # part_pkg is undefined
-
- # and I guess they're never bundled either?
- if ( $cust_bill_pkg->setup != 0 ) {
- my $description = $desc;
- $description .= ' Setup'
- if $cust_bill_pkg->recur != 0
- || $discount_show_always
- || $cust_bill_pkg->recur_show_zero;
- #push @b, {
- # keep it consistent, please
- $s = {
- 'pkgnum' => $cust_bill_pkg->pkgpart, #so it displays in Ref
- 'description' => $description,
- 'amount' => sprintf("%.2f", $cust_bill_pkg->setup),
- 'unit_amount' => sprintf("%.2f", $cust_bill_pkg->unitsetup),
- 'quantity' => $cust_bill_pkg->quantity,
- 'preref_html' => ( $opt{preref_callback}
- ? &{ $opt{preref_callback} }( $cust_bill_pkg )
- : ''
- ),
- };
- }
- if ( $cust_bill_pkg->recur != 0 ) {
- #push @b, {
- $r = {
- 'pkgnum' => $cust_bill_pkg->pkgpart, #so it displays in Ref
- 'description' => "$desc (". $cust_bill_pkg->part_pkg->freq_pretty.")",
- 'amount' => sprintf("%.2f", $cust_bill_pkg->recur),
- 'unit_amount' => sprintf("%.2f", $cust_bill_pkg->unitrecur),
- 'quantity' => $cust_bill_pkg->quantity,
- 'preref_html' => ( $opt{preref_callback}
- ? &{ $opt{preref_callback} }( $cust_bill_pkg )
- : ''
- ),
- };
- }
-
- } elsif ( $cust_bill_pkg->pkgnum > 0 ) {
+ if ( $cust_bill_pkg->pkgnum > 0 ) {
# a "normal" package line item (not a quotation, not a fee, not a tax)
warn "$me _items_cust_bill_pkg cust_bill_pkg is non-tax\n"
+ $cust_bill_pkg->recur)
};
- } # if quotation / package line item / other line item
+ } # if package line item / other line item
# decide whether to show active discounts here
if (