summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2014-06-09 14:23:59 -0700
committerMark Wells <mark@freeside.biz>2014-06-09 14:23:59 -0700
commita455b3d4dd10624e223705477f55ef09ed81a85f (patch)
tree63f96cbfefd07cc02b24cabc90bc436ebc9738b3
parentb58f35d5de926f2f9187e9c5052ef70f0e652124 (diff)
correctly associate bundled line item amounts with base items, #29518
-rw-r--r--FS/FS/Template_Mixin.pm21
1 files changed, 20 insertions, 1 deletions
diff --git a/FS/FS/Template_Mixin.pm b/FS/FS/Template_Mixin.pm
index bfa03bcdb..afa17fca1 100644
--- a/FS/FS/Template_Mixin.pm
+++ b/FS/FS/Template_Mixin.pm
@@ -2295,7 +2295,26 @@ separate quantities, for some reason).
sub _items_nontax {
my $self = shift;
- grep { $_->pkgnum } $self->cust_bill_pkg;
+ # The order of these is important. Bundled line items will be merged into
+ # the most recent non-hidden item, so it needs to be the one with:
+ # - the same pkgnum
+ # - the same start date
+ # - no pkgpart_override
+ #
+ # So: sort by pkgnum,
+ # then by sdate
+ # then sort the base line item before any overrides
+ # then sort hidden before non-hidden add-ons
+ # then sort by override pkgpart (for consistency)
+ sort { $a->pkgnum <=> $b->pkgnum or
+ $a->sdate <=> $b->sdate or
+ ($a->pkgpart_override ? 0 : -1) or
+ ($b->pkgpart_override ? 0 : 1) or
+ $b->hidden cmp $a->hidden or
+ $a->pkgpart_override <=> $b->pkgpart_override
+ }
+ # and of course exclude taxes and fees
+ grep { $_->pkgnum > 0 } $self->cust_bill_pkg;
}
sub _items_fee {