+ # 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 $def = $cust_bill_pkg_discount->cust_pkg_discount->discount;
+ push @ext, &{$escape_function}( $def->description );
+ }
+ }
+
+ # 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
+