killbill-memoizeit

invoice: Fix issue when there are multiple usage sections defined

3/6/2018 8:46:48 PM

Details

diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalCapacityUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalCapacityUsageInArrear.java
index ed2236c..474c5b3 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalCapacityUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalCapacityUsageInArrear.java
@@ -128,4 +128,16 @@ public class ContiguousIntervalCapacityUsageInArrear extends ContiguousIntervalU
         Preconditions.checkState(false, "Could not find tier for usage " + usage.getName() + "matching with data = " + joiner.join(roUnits));
         return null;
     }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("ContiguousIntervalCapacityUsageInArrear{");
+        sb.append("transitionTimes=").append(transitionTimes);
+        sb.append(", billingEvents=").append(billingEvents);
+        sb.append(", rawSubscriptionUsage=").append(rawSubscriptionUsage);
+        sb.append(", rawUsageStartDate=").append(rawUsageStartDate);
+        sb.append('}');
+        return sb.toString();
+    }
+
 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
index e828849..dd21aed 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
@@ -97,7 +97,7 @@ public abstract class ContiguousIntervalUsageInArrear {
         this.accountId = accountId;
         this.invoiceId = invoiceId;
         this.unitTypes = usage.getUsageType() == UsageType.CAPACITY ? getCapacityInArrearUnitTypes(usage) : getConsumableInArrearUnitTypes(usage);
-        this.rawSubscriptionUsage = rawSubscriptionUsage;
+        this.rawSubscriptionUsage = filterInputRawUsage(rawSubscriptionUsage);
         this.targetDate = targetDate;
         this.rawUsageStartDate = rawUsageStartDate;
         this.internalTenantContext = internalTenantContext;
@@ -107,6 +107,7 @@ public abstract class ContiguousIntervalUsageInArrear {
         this.usageDetailMode = usageDetailMode;
     }
 
+
     /**
      * Builds the transitionTimes associated to that usage section. Those are determined based on billing events for when to start and when to stop,
      * the per usage billingPeriod and finally the targetDate.
@@ -345,6 +346,16 @@ public abstract class ContiguousIntervalUsageInArrear {
         }
     }
 
+    private List<RawUsage> filterInputRawUsage(final List<RawUsage> rawSubscriptionUsage) {
+        final Iterable<RawUsage> filteredList = Iterables.filter(rawSubscriptionUsage, new Predicate<RawUsage>() {
+            @Override
+            public boolean apply(final RawUsage input) {
+                return unitTypes.contains(input.getUnitType());
+            }
+        });
+        return ImmutableList.copyOf(filteredList);
+    }
+    
     /**
      * @param filteredUsageForInterval the list of invoiceItem to consider
      * @return the price amount that was already billed for that period and usage section (across unitTypes)
@@ -419,16 +430,6 @@ public abstract class ContiguousIntervalUsageInArrear {
         return billingEvents.get(0).getCurrency();
     }
 
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder("ContiguousIntervalConsumableInArrear{");
-        sb.append("transitionTimes=").append(transitionTimes);
-        sb.append(", billingEvents=").append(billingEvents);
-        sb.append(", rawSubscriptionUsage=").append(rawSubscriptionUsage);
-        sb.append(", rawUsageStartDate=").append(rawUsageStartDate);
-        sb.append('}');
-        return sb.toString();
-    }
 
     public class UsageInArrearItemsAndNextNotificationDate {