diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/SubscriptionJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/SubscriptionJson.java
index fab4d96..c860f33 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/SubscriptionJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/SubscriptionJson.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* 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
@@ -313,12 +313,35 @@ public class SubscriptionJson extends JsonBase {
public SubscriptionJson(final Subscription subscription, @Nullable final AccountAuditLogs accountAuditLogs) {
super(toAuditLogJson(accountAuditLogs == null ? null : accountAuditLogs.getAuditLogsForSubscription(subscription.getId())));
this.startDate = subscription.getEffectiveStartDate();
- // last* fields can be null if the subscription starts in the future
- this.productName = subscription.getLastActiveProduct() == null ? null : subscription.getLastActiveProduct().getName();
- this.productCategory = subscription.getLastActiveProductCategory() == null ? null : subscription.getLastActiveProductCategory().name();
- this.billingPeriod = subscription.getLastActivePlan() == null ? null : subscription.getLastActivePlan().getRecurringBillingPeriod().toString();
- this.phaseType = subscription.getLastActivePhase() == null ? null : subscription.getLastActivePhase().getPhaseType().toString();
- this.priceList = subscription.getLastActivePriceList() == null ? null : subscription.getLastActivePriceList().getName();
+
+ // last* fields can be null if the subscription starts in the future - rely on the first available event instead
+ final SubscriptionEvent firstEvent = subscription.getSubscriptionEvents().isEmpty() ? null : subscription.getSubscriptionEvents().get(0);
+ if (subscription.getLastActiveProduct() == null) {
+ this.productName = firstEvent == null ? null : firstEvent.getNextProduct().getName();
+ } else {
+ this.productName = subscription.getLastActiveProduct().getName();
+ }
+ if (subscription.getLastActiveProductCategory() == null) {
+ this.productCategory = firstEvent == null ? null : firstEvent.getNextProduct().getCategory().name();
+ } else {
+ this.productCategory = subscription.getLastActiveProductCategory().name();
+ }
+ if (subscription.getLastActivePlan() == null) {
+ this.billingPeriod = firstEvent == null ? null : firstEvent.getNextPlan().getRecurringBillingPeriod().name();
+ } else {
+ this.billingPeriod = subscription.getLastActivePlan().getRecurringBillingPeriod().toString();
+ }
+ if (subscription.getLastActivePhase() == null) {
+ this.phaseType = firstEvent == null ? null : firstEvent.getNextPhase().getPhaseType().name();
+ } else {
+ this.phaseType = subscription.getLastActivePhase().getPhaseType().toString();
+ }
+ if (subscription.getLastActivePriceList() == null) {
+ this.priceList = firstEvent == null ? null : firstEvent.getNextPriceList().getName();
+ } else {
+ this.priceList = subscription.getLastActivePriceList().getName();
+ }
+
this.state = subscription.getState().name();
this.sourceType = subscription.getSourceType().name();
this.cancelledDate = subscription.getEffectiveEndDate();
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 2f5ca6d..c795c16 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
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* 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
@@ -198,7 +198,6 @@ public class TestEntitlement extends TestJaxrsBase {
assertEquals(objFromJson.getBillingPeriod(), BillingPeriod.MONTHLY);
}
-
@Test(groups = "slow", description = "Can override a price when creating a subscription")
public void testOverridePrice() throws Exception {
final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
@@ -209,7 +208,6 @@ public class TestEntitlement extends TestJaxrsBase {
final String productName = "Shotgun";
final BillingPeriod term = BillingPeriod.ANNUAL;
-
final Subscription input = new Subscription();
input.setAccountId(accountJson.getAccountId());
input.setExternalKey("identical");
@@ -221,7 +219,7 @@ public class TestEntitlement extends TestJaxrsBase {
overrides.add(new PhasePriceOverride(null, PhaseType.TRIAL.toString(), BigDecimal.TEN, null));
input.setPriceOverrides(overrides);
- final Subscription subscription = killBillClient.createSubscription(input, DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC, createdBy, reason, comment);
+ final Subscription subscription = killBillClient.createSubscription(input, DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC, createdBy, reason, comment);
final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), true, false, AuditLevel.FULL);
assertEquals(invoices.size(), 1);
@@ -235,7 +233,6 @@ public class TestEntitlement extends TestJaxrsBase {
final Account accountJson = createAccountWithDefaultPaymentMethod();
-
final Subscription base = new Subscription();
base.setAccountId(accountJson.getAccountId());
base.setExternalKey("base");
@@ -273,4 +270,28 @@ public class TestEntitlement extends TestJaxrsBase {
assertEquals(invoices.size(), 1);
}
+ @Test(groups = "slow", description = "Can create an entitlement in the future")
+ public void testCreateEntitlementInTheFuture() throws Exception {
+ final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
+ clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
+
+ final Account accountJson = createAccountWithDefaultPaymentMethod();
+
+ final Subscription input = new Subscription();
+ input.setAccountId(accountJson.getAccountId());
+ input.setProductName("Shotgun");
+ 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);
+
+ Assert.assertEquals(entitlementJson.getProductName(), input.getProductName());
+ Assert.assertEquals(entitlementJson.getProductCategory(), input.getProductCategory());
+ Assert.assertEquals(entitlementJson.getBillingPeriod(), input.getBillingPeriod());
+ Assert.assertEquals(entitlementJson.getPriceList(), input.getPriceList());
+
+ // Retrieves with GET
+ final Subscription objFromJson = killBillClient.getSubscription(entitlementJson.getSubscriptionId());
+ Assert.assertTrue(objFromJson.equals(entitlementJson));
+ }
}