killbill-aplcache
Changes
invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java 17(+10 -7)
Details
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java
index b540981..d65921c 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalConsumableUsageInArrear.java
@@ -70,6 +70,8 @@ public class ContiguousIntervalConsumableUsageInArrear extends ContiguousInterva
protected void populateResults(final LocalDate startDate, final LocalDate endDate, final Iterable<InvoiceItem> billedItems, final BigDecimal billedUsage, final BigDecimal toBeBilledUsage, final UsageInArrearDetail toBeBilledUsageDetails, final boolean areAllBilledItemsWithDetails, final List<InvoiceItem> result) {
// Compute final amount by subtracting amount that was already billed.
if (!billedItems.iterator().hasNext() || billedUsage.compareTo(toBeBilledUsage) < 0) {
+ // In the case past invoice items showed the details (areAllBilledItemsWithDetails=true), billed usage has already been taken into account
+ // as it part of the reconciliation logic, so no need to subtract it here
final BigDecimal amountToBill = areAllBilledItemsWithDetails ? toBeBilledUsage : toBeBilledUsage.subtract(billedUsage);
if (amountToBill.compareTo(BigDecimal.ZERO) > 0) {
@@ -90,6 +92,7 @@ public class ContiguousIntervalConsumableUsageInArrear extends ContiguousInterva
}
+ @Override
protected UsageInArrearDetail getToBeBilledUsageDetails(final List<RolledUpUnit> rolledUpUnits, final Iterable<InvoiceItem> billedItems, final boolean areAllBilledItemsWithDetails) throws CatalogApiException {
final Map<String, List<UsageConsumableInArrearTierUnitDetail>> previousUnitsUsage;
@@ -121,8 +124,9 @@ public class ContiguousIntervalConsumableUsageInArrear extends ContiguousInterva
final List<UsageConsumableInArrearTierUnitDetail> result = new ArrayList<UsageConsumableInArrearTierUnitDetail>();
for (final InvoiceItem bi : billedItems) {
- final List<UsageConsumableInArrearTierUnitDetail> billedUsageItemDetails = fromJson(bi.getItemDetails());
- for (final UsageConsumableInArrearTierUnitDetail curDetail : billedUsageItemDetails) {
+
+ final UsageConsumableInArrearDetail usageDetail = fromJson(bi.getItemDetails());
+ for (final UsageConsumableInArrearTierUnitDetail curDetail : usageDetail.getTierDetails()) {
if (curDetail.getTierUnit().equals(unitType)) {
result.add(curDetail);
}
@@ -229,17 +233,16 @@ public class ContiguousIntervalConsumableUsageInArrear extends ContiguousInterva
return sb.toString();
}
- public static List<UsageConsumableInArrearTierUnitDetail> fromJson(String itemDetails) {
- List<UsageConsumableInArrearTierUnitDetail> toBeBilledUsageConsumableInArrearTierUnitDetails = null;
+ public static UsageConsumableInArrearDetail fromJson(String itemDetails) {
+ UsageConsumableInArrearDetail result = null;
if (itemDetails != null) {
try {
- toBeBilledUsageConsumableInArrearTierUnitDetails = objectMapper.readValue(itemDetails, new TypeReference<List<UsageConsumableInArrearTierUnitDetail>>() {});
+ result = objectMapper.readValue(itemDetails, new TypeReference<UsageConsumableInArrearDetail>() {});
} catch (IOException e) {
Preconditions.checkState(false, e.getMessage());
}
}
-
- return toBeBilledUsageConsumableInArrearTierUnitDetails;
+ return result;
}
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/details/UsageConsumableInArrearDetail.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/details/UsageConsumableInArrearDetail.java
index 903e489..927836a 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/details/UsageConsumableInArrearDetail.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/details/UsageConsumableInArrearDetail.java
@@ -52,7 +52,7 @@ public class UsageConsumableInArrearDetail implements UsageInArrearDetail {
String result = null;
if (tierDetails != null && tierDetails.size() > 0){
try {
- result = objectMapper.writeValueAsString(tierDetails);
+ result = objectMapper.writeValueAsString(this);
} catch (JsonProcessingException e) {
Preconditions.checkState(false, e.getMessage());
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java
index fff1797..945468f 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalConsumableInArrear.java
@@ -61,8 +61,8 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
-import static org.testng.AssertJUnit.assertNull;
public class TestContiguousIntervalConsumableInArrear extends TestUsageInArrearBase {
@@ -636,9 +636,10 @@ public class TestContiguousIntervalConsumableInArrear extends TestUsageInArrearB
List<InvoiceItem> result = produceInvoiceItems(rawUsages, TierBlockPolicy.TOP_TIER, UsageDetailMode.AGGREGATE, ImmutableList.<InvoiceItem>of());
assertEquals(result.size(), 1);
- assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("203")),0);
+ assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("203")), 0);
- List<UsageConsumableInArrearTierUnitDetail> itemDetails = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<List<UsageConsumableInArrearTierUnitDetail>>() {});
+ UsageConsumableInArrearDetail usageDetail = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<UsageConsumableInArrearDetail>() {});
+ List<UsageConsumableInArrearTierUnitDetail> itemDetails = usageDetail.getTierDetails();
// BAR: 99 * 2 = 198
assertEquals(itemDetails.get(0).getTierUnit(), "BAR");
assertEquals(itemDetails.get(0).getTier(), 1);
@@ -659,9 +660,11 @@ public class TestContiguousIntervalConsumableInArrear extends TestUsageInArrearB
result = produceInvoiceItems(rawUsages, TierBlockPolicy.TOP_TIER, UsageDetailMode.AGGREGATE, ImmutableList.<InvoiceItem>of());
assertEquals(result.size(), 1);
- assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("2025")),0);
+ assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("2025")), 0);
+
+ usageDetail = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<UsageConsumableInArrearDetail>() {});
+ itemDetails = usageDetail.getTierDetails();
- itemDetails = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<List<UsageConsumableInArrearTierUnitDetail>>() {});
// BAR: 101 * 20 = 2020
assertEquals(itemDetails.get(0).getTierUnit(), "BAR");
assertEquals(itemDetails.get(0).getTier(), 2);
@@ -682,9 +685,10 @@ public class TestContiguousIntervalConsumableInArrear extends TestUsageInArrearB
result = produceInvoiceItems(rawUsages, TierBlockPolicy.TOP_TIER, UsageDetailMode.AGGREGATE, ImmutableList.<InvoiceItem>of());
assertEquals(result.size(), 1);
- assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("9620")),0);
+ assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("9620")), 0);
- itemDetails = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<List<UsageConsumableInArrearTierUnitDetail>>() {});
+ usageDetail = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<UsageConsumableInArrearDetail>() {});
+ itemDetails = usageDetail.getTierDetails();
// BAR: 101 * 20 = 2020
assertEquals(itemDetails.get(0).getTierUnit(), "BAR");
assertEquals(itemDetails.get(0).getTier(), 2);
@@ -725,7 +729,7 @@ public class TestContiguousIntervalConsumableInArrear extends TestUsageInArrearB
result = produceInvoiceItems(rawUsages, TierBlockPolicy.TOP_TIER, UsageDetailMode.DETAIL, ImmutableList.<InvoiceItem>of());
assertEquals(result.size(), 2);
- // BAR: 101 * 20 = 2020
+ // BAR: 101 * 20 = 2020
assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("2020.0")), 0);
assertEquals(result.get(0).getQuantity().intValue(), 101);
assertEquals(result.get(0).getRate().compareTo(new BigDecimal("20.0")), 0);
@@ -775,19 +779,20 @@ public class TestContiguousIntervalConsumableInArrear extends TestUsageInArrearB
// Create usage data points (will include already billed + add new usage data)
//
List<RawUsage> rawUsages = new ArrayList<RawUsage>();
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 20), "FOO", 50L /* already built */+ 20L)); // tier 3
- rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 21), "BAR", 80L /* already built */+ 120L)); // tier 2
+ rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 20), "FOO", 50L /* already built */ + 20L)); // tier 3
+ rawUsages.add(new DefaultRawUsage(subscriptionId, new LocalDate(2014, 03, 21), "BAR", 80L /* already built */ + 120L)); // tier 2
final List<InvoiceItem> existingItems = new ArrayList<InvoiceItem>();
final InvoiceItem ii1 = new UsageInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, usageName, new LocalDate(2014, 03, 20), new LocalDate(2014, 04, 15), new BigDecimal("570.00"), null, currency, null, existingUsageJson);
existingItems.add(ii1);
-
List<InvoiceItem> result = produceInvoiceItems(rawUsages, TierBlockPolicy.ALL_TIERS, UsageDetailMode.AGGREGATE, existingItems);
assertEquals(result.size(), 1);
assertEquals(result.get(0).getAmount().compareTo(new BigDecimal("3140.00")), 0, String.format("%s != 3140.0", result.get(0).getAmount()));
- List<UsageConsumableInArrearTierUnitDetail> itemDetails = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<List<UsageConsumableInArrearTierUnitDetail>>() {});
+ UsageConsumableInArrearDetail usageDetail = objectMapper.readValue(result.get(0).getItemDetails(), new TypeReference<UsageConsumableInArrearDetail>() {});
+ List<UsageConsumableInArrearTierUnitDetail> itemDetails = usageDetail.getTierDetails();
+
// BAR item detail
assertEquals(itemDetails.get(0).getTierUnit(), "BAR");
assertEquals(itemDetails.get(0).getTier(), 1);