killbill-aplcache

Details

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 c992206..392276e 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
@@ -406,8 +406,7 @@ public class ContiguousIntervalUsageInArrear {
 
             }
             if (complies) {
-                toBeBilledDetails.get(toBeBilledDetails.size() - 1).setAmount(cur.getRecurringPrice().getPrice(getCurrency()));
-                return toBeBilledDetails;
+                return distributeAmount(toBeBilledDetails, cur.getRecurringPrice().getPrice(getCurrency()));
             }
         }
         // Probably invalid catalog config
@@ -646,12 +645,27 @@ public class ContiguousIntervalUsageInArrear {
         return toBeBilledUsageInArrearDetails;
     }
 
-    public class UsageInArrearDetail {
+    // divide the price between all details to prevent a detail to be removed if the price is zero when the usage mode is detail
+    private static final List<UsageInArrearDetail> distributeAmount(List<UsageInArrearDetail> toBeBilledDetails, BigDecimal price) {
+        BigDecimal priceByDetail = price.divide(new BigDecimal(toBeBilledDetails.size()), 2, BigDecimal.ROUND_HALF_UP);
+        BigDecimal accumulatedPrice = BigDecimal.ZERO;
+
+        for (UsageInArrearDetail toBeBilledDetail : toBeBilledDetails) {
+            accumulatedPrice = accumulatedPrice.add(priceByDetail);
+            toBeBilledDetail.setAmount(priceByDetail);
+        }
+
+        toBeBilledDetails.get(toBeBilledDetails.size() - 1).setAmount(priceByDetail.add(price.subtract(accumulatedPrice)));
+
+        return toBeBilledDetails;
+    }
+
+    public static class UsageInArrearDetail {
 
         private final int tier;
         private final String tierUnit;
         private final BigDecimal tierPrice;
-        private final Integer quantity;
+        private Integer quantity;
         private String reference;
         private BigDecimal existingUsageAmount;
         private BigDecimal amount;
@@ -718,7 +732,8 @@ public class ContiguousIntervalUsageInArrear {
             List<UsageInArrearDetail> unreconciledUsage = Lists.newLinkedList();
             for (UsageInArrearDetail billedUsageDetail : billedUsageItemDetails) {
                 if (tierUnit.equals(billedUsageDetail.tierUnit)) {
-                    existingUsageAmount = billedUsageDetail.amount.abs();
+                    existingUsageAmount = billedUsageDetail.getAmount().abs();
+                    quantity = quantity - billedUsageDetail.getQuantity();
                     amount = amount.subtract(existingUsageAmount);
                 } else {
                     unreconciledUsage.add(billedUsageDetail);