Details
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
index 7f3432a..7658730 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
@@ -205,12 +205,10 @@ public class BundleResource extends JaxRsResourceBase {
@HeaderParam(HDR_REASON) final String reason,
@HeaderParam(HDR_COMMENT) final String comment,
@javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionApiException, EntitlementApiException, AccountApiException {
-
final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
final CallContext callContext = context.createContext(createdBy, reason, comment, request);
final UUID bundleId = UUID.fromString(id);
- final SubscriptionBundle bundle = subscriptionApi.getSubscriptionBundle(bundleId, callContext);
- final LocalDate inputLocalDate = toLocalDate(bundle.getAccountId(), requestedDate, callContext);
+ final LocalDate inputLocalDate = toLocalDate(requestedDate, callContext);
entitlementApi.pause(bundleId, inputLocalDate, pluginProperties, callContext);
return Response.status(Status.OK).build();
}
@@ -230,12 +228,10 @@ public class BundleResource extends JaxRsResourceBase {
@HeaderParam(HDR_REASON) final String reason,
@HeaderParam(HDR_COMMENT) final String comment,
@javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionApiException, EntitlementApiException, AccountApiException {
-
final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
final CallContext callContext = context.createContext(createdBy, reason, comment, request);
final UUID bundleId = UUID.fromString(id);
- final SubscriptionBundle bundle = subscriptionApi.getSubscriptionBundle(bundleId, callContext);
- final LocalDate inputLocalDate = toLocalDate(bundle.getAccountId(), requestedDate, callContext);
+ final LocalDate inputLocalDate = toLocalDate(requestedDate, callContext);
entitlementApi.resume(bundleId, inputLocalDate, pluginProperties, callContext);
return Response.status(Status.OK).build();
}
@@ -362,7 +358,7 @@ public class BundleResource extends JaxRsResourceBase {
final UUID bundleId = UUID.fromString(id);
final SubscriptionBundle bundle = subscriptionApi.getSubscriptionBundle(bundleId, callContext);
- final LocalDate inputLocalDate = toLocalDate(bundle.getAccountId(), requestedDate, callContext);
+ final LocalDate inputLocalDate = toLocalDate(requestedDate, callContext);
final UUID newBundleId = entitlementApi.transferEntitlementsOverrideBillingPolicy(bundle.getAccountId(), UUID.fromString(json.getAccountId()), bundle.getExternalKey(), inputLocalDate, policy, pluginProperties, callContext);
return uriBuilder.buildResponse(BundleResource.class, "getBundle", newBundleId, uriInfo.getBaseUri().toString());
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
index 95d58a7..fed8945 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
@@ -302,7 +302,7 @@ public class InvoiceResource extends JaxRsResourceBase {
@javax.ws.rs.core.Context final HttpServletRequest request,
@javax.ws.rs.core.Context final UriInfo uriInfo) throws AccountApiException, InvoiceApiException {
final CallContext callContext = context.createContext(createdBy, reason, comment, request);
- final LocalDate inputDate = toLocalDate(UUID.fromString(accountId), targetDate, callContext);
+ final LocalDate inputDate = toLocalDate(targetDate, callContext);
try {
final Invoice generatedInvoice = invoiceApi.triggerInvoiceGeneration(UUID.fromString(accountId), inputDate, null,
@@ -339,10 +339,10 @@ public class InvoiceResource extends JaxRsResourceBase {
} else if (DryRunType.SUBSCRIPTION_ACTION.name().equals(dryRunSubscriptionSpec.getDryRunType()) && dryRunSubscriptionSpec.getEffectiveDate() != null) {
inputDate = dryRunSubscriptionSpec.getEffectiveDate();
} else {
- inputDate = toLocalDate(UUID.fromString(accountId), targetDate, callContext);
+ inputDate = toLocalDate(targetDate, callContext);
}
} else {
- inputDate = toLocalDate(UUID.fromString(accountId), targetDate, callContext);
+ inputDate = toLocalDate(targetDate, callContext);
}
// Passing a null or empty body means we are trying to generate an invoice with a (future) targetDate
@@ -426,7 +426,7 @@ public class InvoiceResource extends JaxRsResourceBase {
final CallContext callContext = context.createContext(createdBy, reason, comment, request);
final UUID accountId = UUID.fromString(json.getAccountId());
- final LocalDate requestedDate = toLocalDate(accountId, requestedDateTimeString, callContext);
+ final LocalDate requestedDate = toLocalDateDefaultToday(accountId, requestedDateTimeString, callContext);
final InvoiceItem adjustmentItem;
if (json.getAmount() == null) {
adjustmentItem = invoiceApi.insertInvoiceItemAdjustment(accountId,
@@ -474,7 +474,7 @@ public class InvoiceResource extends JaxRsResourceBase {
final Iterable<InvoiceItemJson> sanitizedExternalChargesJson = cloneRefundItemsWithValidCurrency(account.getCurrency(), externalChargesJson);
// Get the effective date of the external charge, in the account timezone
- final LocalDate requestedDate = toLocalDate(account, requestedDateTimeString, callContext);
+ final LocalDate requestedDate = toLocalDateDefaultToday(account, requestedDateTimeString, callContext);
final Iterable<InvoiceItem> externalCharges = Iterables.<InvoiceItemJson, InvoiceItem>transform(sanitizedExternalChargesJson,
new Function<InvoiceItemJson, InvoiceItem>() {
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
index 6292294..e4ae745 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
@@ -39,8 +39,6 @@ import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.StreamingOutput;
import javax.ws.rs.core.UriInfo;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
@@ -91,6 +89,7 @@ import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.base.Strings;
@@ -298,51 +297,19 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
}
}
- protected LocalDate toLocalDate(final UUID accountId, final String inputDate, final TenantContext context) throws AccountApiException {
- final LocalDate maybeResult = extractLocalDate(inputDate);
- if (maybeResult != null) {
- return maybeResult;
- }
- Account account = accountId != null ? accountUserApi.getAccountById(accountId, context) : null;
- final DateTime inputDateTime = inputDate != null ? DATE_TIME_FORMATTER.parseDateTime(inputDate) : clock.getUTCNow();
- return toLocalDate(account, inputDateTime, context);
+ protected LocalDate toLocalDateDefaultToday(final UUID accountId, @Nullable final String inputDate, final TenantContext context) throws AccountApiException {
+ final Account account = accountId != null ? accountUserApi.getAccountById(accountId, context) : null;
+ return toLocalDateDefaultToday(account, inputDate, context);
}
- protected LocalDate toLocalDate(final Account account, final String inputDate, final TenantContext context) {
-
- final LocalDate maybeResult = extractLocalDate(inputDate);
- if (maybeResult != null) {
- return maybeResult;
- }
- final DateTime inputDateTime = inputDate != null ? DATE_TIME_FORMATTER.parseDateTime(inputDate) : clock.getUTCNow();
- return toLocalDate(account, inputDateTime, context);
+ protected LocalDate toLocalDateDefaultToday(final Account account, @Nullable final String inputDate, final TenantContext context) {
+ // TODO Switch to cached normalized timezone when available
+ return MoreObjects.firstNonNull(toLocalDate(inputDate, context), clock.getToday(account.getTimeZone()));
}
- private LocalDate toLocalDate(final Account account, final DateTime inputDate, final TenantContext context) {
- if (account == null && inputDate == null) {
- // We have no inputDate and so accountTimeZone so we default to LocalDate as seen in UTC
- return new LocalDate(clock.getUTCNow(), DateTimeZone.UTC);
- } else if (account == null && inputDate != null) {
- // We were given a date but can't get timezone, default in UTC
- return new LocalDate(inputDate, DateTimeZone.UTC);
- } else if (account != null && inputDate == null) {
- // We have no inputDate but for accountTimeZone so default to LocalDate as seen in account timezone
- return new LocalDate(clock.getUTCNow(), account.getTimeZone());
- } else {
- // Precise LocalDate as requested
- return new LocalDate(inputDate, account.getTimeZone());
- }
- }
-
- private LocalDate extractLocalDate(final String inputDate) {
- if (inputDate != null) {
- try {
- final LocalDate localDate = LocalDate.parse(inputDate, LOCAL_DATE_FORMATTER);
- return localDate;
- } catch (final IllegalArgumentException expectedAndIgnore) {
- }
- }
- return null;
+ // API for subscription and invoice generation: keep null, the lower layers will default to now()
+ protected LocalDate toLocalDate(@Nullable final String inputDate, final TenantContext context) {
+ return inputDate == null ? null : LocalDate.parse(inputDate, LOCAL_DATE_FORMATTER);
}
protected Iterable<PluginProperty> extractPluginProperties(@Nullable final Iterable<PluginPropertyJson> pluginProperties) {
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
index 7749b79..8ef1a39 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
@@ -92,7 +92,6 @@ import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import com.wordnik.swagger.annotations.Api;
@@ -187,7 +186,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
ProductCategory.valueOf(entitlement.getProductCategory()),
BillingPeriod.valueOf(entitlement.getBillingPeriod()), entitlement.getPriceList(), phaseType);
- final LocalDate inputLocalDate = requestedDate == null ? null : toLocalDate(account, requestedDate, callContext);
+ final LocalDate inputLocalDate = toLocalDate(requestedDate, callContext);
final PlanSpecifier planSpec = new PlanSpecifier(entitlement.getProductName(),
ProductCategory.valueOf(entitlement.getProductCategory()),
BillingPeriod.valueOf(entitlement.getBillingPeriod()), entitlement.getPriceList());
@@ -314,7 +313,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
entitlementSpecifierList.add(specifier);
}
- final LocalDate inputLocalDate = toLocalDate(account, requestedDate, callContext);
+ final LocalDate inputLocalDate = toLocalDate(requestedDate, callContext);
return entitlementApi.createBaseEntitlementWithAddOns(account.getId(), baseEntitlement.getExternalKey(), entitlementSpecifierList,
inputLocalDate, pluginProperties, callContext);
}
@@ -392,7 +391,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
final UUID uuid = UUID.fromString(subscriptionId);
final Entitlement current = entitlementApi.getEntitlementForId(uuid, callContext);
- final LocalDate inputLocalDate = toLocalDate(current.getAccountId(), requestedDate, callContext);
+ final LocalDate inputLocalDate = toLocalDate(requestedDate, callContext);
final Entitlement newEntitlement;
final Account account = accountUserApi.getAccountById(current.getAccountId(), callContext);
@@ -467,7 +466,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
final UUID uuid = UUID.fromString(subscriptionId);
final Entitlement current = entitlementApi.getEntitlementForId(uuid, ctx);
- final LocalDate inputLocalDate = toLocalDate(current.getAccountId(), requestedDate, callContext);
+ final LocalDate inputLocalDate = toLocalDate(requestedDate, callContext);
final Entitlement newEntitlement;
if (billingPolicyString == null && entitlementPolicyString == null) {
newEntitlement = current.cancelEntitlementWithDate(inputLocalDate, useRequestedDateForBilling, pluginProperties, ctx);
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/TestDateConversion.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/TestDateConversion.java
index a09bf3f..a754a75 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/TestDateConversion.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/TestDateConversion.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
*
@@ -55,22 +57,18 @@ public class TestDateConversion extends JaxRsResourceBase {
//
// BASIC Tests to understand how toLocalDate converts different inputs (null, LocalDate, DateTime)
//
- @Test(groups = "fast")
- public void testDateTimeConversion() throws AccountApiException {
- final UUID accountId = setupAccount(DateTimeZone.forOffsetHours(-8));
- final String input = "2013-08-26T06:50:20Z";
- final LocalDate result = toLocalDate(accountId, input, null);
- Assert.assertTrue(result.compareTo(new LocalDate(2013, 8, 25)) == 0);
- }
-
@Test(groups = "fast")
public void testNullConversion() throws AccountApiException {
+ final String input = null;
+
+ final LocalDate result = toLocalDate(input, null);
+ Assert.assertNull(result);
+
final UUID accountId = setupAccount(DateTimeZone.forOffsetHours(-8));
((ClockMock) clock).setTime(new DateTime("2013-08-26T06:50:20Z"));
- final String input = null;
- final LocalDate result = toLocalDate(accountId, input, null);
- Assert.assertTrue(result.compareTo(new LocalDate(2013, 8, 25)) == 0);
+ final LocalDate result2 = toLocalDateDefaultToday(accountId, input, null);
+ Assert.assertTrue(result2.compareTo(new LocalDate(2013, 8, 25)) == 0);
((ClockMock) clock).resetDeltaFromReality();
}
@@ -78,7 +76,7 @@ public class TestDateConversion extends JaxRsResourceBase {
public void testLocalDateConversion() throws AccountApiException {
final UUID accountId = setupAccount(DateTimeZone.forOffsetHours(-8));
final String input = "2013-08-25";
- final LocalDate result = toLocalDate(accountId, input, null);
+ final LocalDate result = toLocalDate(input, null);
Assert.assertTrue(result.compareTo(new LocalDate(2013, 8, 25)) == 0);
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java
index 1d3cb3f..0cc4c18 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java
@@ -246,7 +246,7 @@ public class TestEntitlement extends TestJaxrsBase {
subscriptions.add(base);
subscriptions.add(addOn1);
subscriptions.add(addOn2);
- final Bundle bundle = killBillClient.createSubscriptionWithAddOns(subscriptions, initialDate, 10, "createdBy", "", "");
+ final Bundle bundle = killBillClient.createSubscriptionWithAddOns(subscriptions, initialDate.toLocalDate(), 10, "createdBy", "", "");
assertNotNull(bundle);
assertEquals(bundle.getExternalKey(), "base");
assertEquals(bundle.getSubscriptions().size(), 3);
@@ -268,7 +268,7 @@ public class TestEntitlement extends TestJaxrsBase {
input.setProductCategory(ProductCategory.BASE);
input.setBillingPeriod(BillingPeriod.MONTHLY);
input.setPriceList(PriceListSet.DEFAULT_PRICELIST_NAME);
- final Subscription entitlementJson = killBillClient.createSubscription(input, initialDate.plusMonths(1), -1, createdBy, reason, comment);
+ final Subscription entitlementJson = killBillClient.createSubscription(input, initialDate.toLocalDate().plusMonths(1), -1, createdBy, reason, comment);
Assert.assertEquals(entitlementJson.getProductName(), input.getProductName());
Assert.assertEquals(entitlementJson.getProductCategory(), input.getProductCategory());
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
index 4457006..8fba460 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
@@ -340,7 +340,7 @@ public class TestInvoice extends TestJaxrsBase {
externalCharge.setAmount(chargeAmount);
externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency()));
externalCharge.setDescription(UUID.randomUUID().toString());
- final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, createdBy, reason, comment);
+ final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCToday(), false, createdBy, reason, comment);
final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true);
assertEquals(invoiceWithItems.getBalance().compareTo(chargeAmount), 0);
assertEquals(invoiceWithItems.getItems().size(), 1);
@@ -377,7 +377,7 @@ public class TestInvoice extends TestJaxrsBase {
externalCharge2.setDescription(UUID.randomUUID().toString());
externalCharges.add(externalCharge2);
- final List<InvoiceItem> createdExternalCharges = killBillClient.createExternalCharges(externalCharges, clock.getUTCNow(), false, createdBy, reason, comment);
+ final List<InvoiceItem> createdExternalCharges = killBillClient.createExternalCharges(externalCharges, clock.getUTCToday(), false, createdBy, reason, comment);
assertEquals(createdExternalCharges.size(), 2);
assertEquals(createdExternalCharges.get(0).getCurrency().toString(), accountJson.getCurrency());
assertEquals(createdExternalCharges.get(1).getCurrency().toString(), accountJson.getCurrency());
@@ -399,7 +399,7 @@ public class TestInvoice extends TestJaxrsBase {
externalCharge.setAccountId(accountJson.getAccountId());
externalCharge.setAmount(chargeAmount);
externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency()));
- final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), true, createdBy, reason, comment);
+ final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCToday(), true, createdBy, reason, comment);
final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true);
assertEquals(invoiceWithItems.getBalance().compareTo(BigDecimal.ZERO), 0);
assertEquals(invoiceWithItems.getItems().size(), 1);
@@ -424,7 +424,7 @@ public class TestInvoice extends TestJaxrsBase {
externalCharge.setAmount(chargeAmount);
externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency()));
externalCharge.setBundleId(bundleId);
- final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, createdBy, reason, comment);
+ final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCToday(), false, createdBy, reason, comment);
final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true);
assertEquals(invoiceWithItems.getBalance().compareTo(chargeAmount), 0);
assertEquals(invoiceWithItems.getItems().size(), 1);
@@ -453,7 +453,7 @@ public class TestInvoice extends TestJaxrsBase {
externalCharge.setAmount(chargeAmount);
externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency()));
externalCharge.setInvoiceId(invoiceId);
- final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, createdBy, reason, comment);
+ final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCToday(), false, createdBy, reason, comment);
final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true);
assertEquals(invoiceWithItems.getItems().size(), originalNumberOfItemsForInvoice + 1);
assertNull(invoiceWithItems.getItems().get(originalNumberOfItemsForInvoice).getBundleId());
@@ -483,7 +483,7 @@ public class TestInvoice extends TestJaxrsBase {
externalCharge.setAmount(chargeAmount);
externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency()));
externalCharge.setInvoiceId(invoiceId);
- final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), true, createdBy, reason, comment);
+ final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCToday(), true, createdBy, reason, comment);
final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true);
assertEquals(invoiceWithItems.getItems().size(), originalNumberOfItemsForInvoice + 1);
assertNull(invoiceWithItems.getItems().get(originalNumberOfItemsForInvoice).getBundleId());
@@ -514,7 +514,7 @@ public class TestInvoice extends TestJaxrsBase {
externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency()));
externalCharge.setInvoiceId(invoiceId);
externalCharge.setBundleId(bundleId);
- final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, createdBy, reason, comment);
+ final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCToday(), false, createdBy, reason, comment);
final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true);
assertEquals(invoiceWithItems.getItems().size(), originalNumberOfItemsForInvoice + 1);
assertEquals(invoiceWithItems.getItems().get(originalNumberOfItemsForInvoice).getBundleId(), bundleId);