}
} # otherwise include them all in the main section
# XXX what to do when sectioning by location?
+
+ my @ext_desc;
+ my %base_invnums; # invnum => invoice date
+ foreach ($cust_bill_pkg->cust_bill_pkg_fee) {
+ if ($_->base_invnum) {
+ my $base_bill = FS::cust_bill->by_key($_->base_invnum);
+ my $base_date = $self->time2str_local('short', $base_bill->_date)
+ if $base_bill;
+ $base_invnums{$_->base_invnum} = $base_date || '';
+ }
+ }
+ foreach (sort keys(%base_invnums)) {
+ next if $_ == $self->invnum;
+ push @ext_desc,
+ $self->mt('from invoice \\#[_1] on [_2]', $_, $base_invnums{$_});
+ }
push @items,
{ feepart => $cust_bill_pkg->feepart,
amount => sprintf('%.2f', $cust_bill_pkg->setup + $cust_bill_pkg->recur),
description => $part_fee->itemdesc_locale($self->cust_main->locale),
+ ext_description => \@ext_desc
# sdate/edate?
- # ext_description referencing the base_invnum?
};
}
@items;
$self->{Hash}->{cust_tax_exempt_pkg} ||= [];
}
+=item cust_bill_pkg_fee
+
+Returns the list of associated cust_bill_pkg_fee objects, if this is
+a fee-type item.
+
+=cut
+
+sub cust_bill_pkg_fee {
+ my $self = shift;
+ qsearch('cust_bill_pkg_fee', { billpkgnum => $self->billpkgnum });
+}
+
=item cust_bill_pkg_tax_Xlocation
Returns the list of associated cust_bill_pkg_tax_location and/or