X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FTemplate_Mixin.pm;h=e26592ceea12c356a76ac9e12175da2142a94a8c;hb=899cf5029429c1183024cd4bf838573a951d0ede;hp=9669ac2cf0a5ee9946eb89c66117d039118210d6;hpb=2e4fa975e054554beac71883436b143267d7aa12;p=freeside.git diff --git a/FS/FS/Template_Mixin.pm b/FS/FS/Template_Mixin.pm index 9669ac2cf..e26592cee 100644 --- a/FS/FS/Template_Mixin.pm +++ b/FS/FS/Template_Mixin.pm @@ -691,11 +691,12 @@ sub print_generic { # (this is used in the summary & on the payment coupon) $invoice_data{'balance'} = sprintf("%.2f", $balance_due); - # info from customer's last invoice before this one, for some - # summary formats - $invoice_data{'last_bill'} = {}; + # flag telling this invoice to have a first-page summary + my $summarypage = ''; if ( $self->custnum && $self->invnum ) { + # XXX should be an FS::cust_bill method to set the defaults, instead + # of checking the type here my $last_bill = $self->previous_bill; if ( $last_bill ) { @@ -801,13 +802,16 @@ sub print_generic { $invoice_data{'previous_payments'} = []; $invoice_data{'previous_credits'} = []; } - } # if this is an invoice - my $summarypage = ''; - if ( $conf->exists('invoice_usesummary', $agentnum) ) { - $summarypage = 1; - } - $invoice_data{'summarypage'} = $summarypage; + # info from customer's last invoice before this one, for some + # summary formats + $invoice_data{'last_bill'} = {}; + + if ( $conf->exists('invoice_usesummary', $agentnum) ) { + $invoice_data{'summarypage'} = $summarypage = 1; + } + + } # if this is an invoice warn "$me substituting variables in notes, footer, smallfooter\n" if $DEBUG > 1; @@ -3093,7 +3097,9 @@ sub _items_cust_bill_pkg { if $cust_bill_pkg->recur != 0 || $discount_show_always || $cust_bill_pkg->recur_show_zero; - push @b, { + #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), @@ -3106,7 +3112,8 @@ sub _items_cust_bill_pkg { }; } if ( $cust_bill_pkg->recur != 0 ) { - push @b, { + #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), @@ -3399,89 +3406,6 @@ sub _items_cust_bill_pkg { } # recurring or usage with recurring charge - # decide whether to show active discounts here - if ( - # case 1: we are showing a single line for the package - ( !$type ) - # case 2: we are showing a setup line for a package that has - # no base recurring fee - or ( $type eq 'S' and $cust_bill_pkg->unitrecur == 0 ) - # case 3: we are showing a recur line for a package that has - # a base recurring fee - or ( $type eq 'R' and $cust_bill_pkg->unitrecur > 0 ) - ) { - - # the line item hashref for the line that will show the original - # price - # (use the recur or single line for the package, unless we're - # showing a setup line for a package with no recurring fee) - my $active_line = $r; - if ( $type eq 'S' ) { - $active_line = $s; - } - - my @discounts = $cust_bill_pkg->cust_bill_pkg_discount; - # special case: if there are old "discount details" on this line - # item, don't show discount line items - if ( FS::cust_bill_pkg_detail->count( - "detail LIKE 'Includes discount%' AND billpkgnum = " . - $cust_bill_pkg->billpkgnum - ) > 0 ) { - @discounts = (); - } - if ( @discounts ) { - warn "$me _items_cust_bill_pkg including discounts for ". - $cust_bill_pkg->billpkgnum."\n" - if $DEBUG; - my $discount_amount = sum( map {$_->amount} @discounts ); - # if multiple discounts apply to the same package, how to display - # them? ext_description lines, apparently - # - # # discount amounts are negative - if ( $d and $cust_bill_pkg->hidden ) { - $d->{amount} -= $discount_amount; - } else { - my @ext; - $d = { - _is_discount => 1, - description => $self->mt('Discount'), - amount => -1 * $discount_amount, - ext_description => \@ext, - }; - foreach my $cust_bill_pkg_discount (@discounts) { - my $discount = $cust_bill_pkg_discount->cust_pkg_discount->discount; - my $discount_desc = $discount->description_short; - - if ($discount->months) { - - # calculate months remaining after this invoice - my $used = FS::Record->scalar_sql( - 'SELECT SUM(months) FROM cust_bill_pkg_discount - JOIN cust_bill_pkg USING (billpkgnum) - JOIN cust_bill USING (invnum) - WHERE pkgdiscountnum = ? AND _date <= ?', - $cust_bill_pkg_discount->pkgdiscountnum, - $self->_date - ); - $used ||= 0; - my $remaining = sprintf('%.2f', $discount->months - $used); - # append "for X months (Y months remaining)" - $discount_desc .= $self->mt(' for [quant,_1,month] ([quant,_2,month] remaining)', - $cust_bill_pkg_discount->months, - $remaining - ); - } # else it's not time-limited - push @ext, &{$escape_function}($discount_desc); - } - } - - # update the active line (before the discount) to show the - # original price (whether this is a hidden line or not) - $active_line->{amount} += $discount_amount; - - } # if there are any discounts - } # if this is an appropriate place to show discounts - } else { # taxes and fees warn "$me _items_cust_bill_pkg cust_bill_pkg is tax\n" @@ -3496,6 +3420,56 @@ sub _items_cust_bill_pkg { } # if quotation / package line item / other line item + # decide whether to show active discounts here + if ( + # case 1: we are showing a single line for the package + ( !$type ) + # case 2: we are showing a setup line for a package that has + # no base recurring fee + or ( $type eq 'S' and $cust_bill_pkg->unitrecur == 0 ) + # case 3: we are showing a recur line for a package that has + # a base recurring fee + or ( $type eq 'R' and $cust_bill_pkg->unitrecur > 0 ) + ) { + + my $item_discount = $cust_bill_pkg->_item_discount; + if ( $item_discount ) { + # $item_discount->{amount} is negative + + if ( $d and $cust_bill_pkg->hidden ) { + $d->{amount} += $item_discount->{amount}; + } else { + $d = $item_discount; + $_ = &{$escape_function}($_) foreach @{ $d->{ext_description} }; + } + + # update the active line (before the discount) to show the + # original price (whether this is a hidden line or not) + # + # quotation discounts keep track of setup and recur; invoice + # discounts currently don't + if ( exists $item_discount->{setup_amount} ) { + + $s->{amount} -= $item_discount->{setup_amount} if $s; + $r->{amount} -= $item_discount->{recur_amount} if $r; + + } else { + + # $active_line is the line item hashref for the line that will + # show the original price + # (use the recur or single line for the package, unless we're + # showing a setup line for a package with no recurring fee) + my $active_line = $r; + if ( $type eq 'S' ) { + $active_line = $s; + } + $active_line->{amount} -= $item_discount->{amount}; + + } + + } # if there are any discounts + } # if this is an appropriate place to show discounts + } # foreach $display $discount_show_always = ($cust_bill_pkg->cust_bill_pkg_discount