- push @b, {
- description => $desc .
- ( $conf->exists('disable_line_item_date_ranges')
- ? ''
- : " (" .time2str("%x", $cust_bill_pkg->sdate).
- " - ".time2str("%x", $cust_bill_pkg->edate).")"
- ),
- #pkgpart => $part_pkg->pkgpart,
- pkgnum => $cust_bill_pkg->pkgnum,
- amount => sprintf("%.2f", $cust_bill_pkg->recur),
- ext_description =>
- #at least until cust_bill_pkg has "past" ranges in addition to
- #the "future" sdate/edate ones... see #3032
- [ $cust_pkg->h_labels_short( $self->_date ),
- #$cust_bill_pkg->edate,
- #$cust_bill_pkg->sdate),
- $cust_bill_pkg->details,
- ],
- };
+
+ my $is_summary =
+ ( $cust_bill_pkg->duplicate &&
+ $opt{section}->{description} ne $cust_bill_pkg->section
+ );
+ my $description = $is_summary ? "Usage charges" : $desc;
+
+ unless ( $conf->exists('disable_line_item_date_ranges') ) {
+ $description .= " (" . time2str("%x", $cust_bill_pkg->sdate).
+ " - ". time2str("%x", $cust_bill_pkg->edate). ")";
+ }
+
+ #at least until cust_bill_pkg has "past" ranges in addition to
+ #the "future" sdate/edate ones... see #3032
+ my @d = ();
+ push @d, map &{$escape_function}($_),
+ $cust_pkg->h_labels_short($self->_date)
+ #$cust_bill_pkg->edate,
+ #$cust_bill_pkg->sdate),
+ unless ($cust_bill_pkg->pkgnum eq $last_pkgnum);
+
+ @d = () if ($cust_bill_pkg->itemdesc || $is_summary);
+ push @d, $cust_bill_pkg->details(%details_opt)
+ unless $is_summary;
+
+ if ($cust_bill_pkg->pkgnum eq $last_pkgnum) {
+
+ $b[$#b]->{amount} =
+ sprintf("%.2f", $b[$#b]->{amount} + $cust_bill_pkg->recur);
+ push @{$b[$#b]->{ext_description}}, @d;
+
+ }else{
+
+ push @b, {
+ description => $description,
+ #pkgpart => $part_pkg->pkgpart,
+ pkgnum => $cust_bill_pkg->pkgnum,
+ amount => sprintf("%.2f", $cust_bill_pkg->recur),
+ unit_amount => sprintf("%.2f", $cust_bill_pkg->unitrecur),
+ quantity => $cust_bill_pkg->quantity,
+ ext_description => \@d,
+ };
+
+ }
+
+ if ($conf->exists('separate_usage') && $cust_bill_pkg->type ne 'U') {
+ $last_pkgnum = '';
+ }else{
+ $last_pkgnum = $cust_bill_pkg->pkgnum;
+ }