diff --git a/catalog/src/main/java/org/killbill/billing/catalog/api/user/DefaultCatalogUserApi.java b/catalog/src/main/java/org/killbill/billing/catalog/api/user/DefaultCatalogUserApi.java
index 048f41c..ccd260e 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/api/user/DefaultCatalogUserApi.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/api/user/DefaultCatalogUserApi.java
@@ -22,6 +22,7 @@ import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
+import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.xml.bind.JAXBException;
import javax.xml.transform.TransformerException;
@@ -47,6 +48,7 @@ import org.killbill.billing.tenant.api.TenantUserApi;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.callcontext.TenantContext;
+import org.killbill.clock.Clock;
import org.killbill.xmlloader.ValidationErrors;
import org.killbill.xmlloader.ValidationException;
import org.killbill.xmlloader.XMLLoader;
@@ -62,16 +64,19 @@ public class DefaultCatalogUserApi implements CatalogUserApi {
private final InternalCallContextFactory internalCallContextFactory;
private final TenantUserApi tenantApi;
private final CatalogCache catalogCache;
+ private final Clock clock;
@Inject
public DefaultCatalogUserApi(final CatalogService catalogService,
final TenantUserApi tenantApi,
final CatalogCache catalogCache,
+ final Clock clock,
final InternalCallContextFactory internalCallContextFactory) {
this.catalogService = catalogService;
this.tenantApi = tenantApi;
this.catalogCache = catalogCache;
+ this.clock = clock;
this.internalCallContextFactory = internalCallContextFactory;
}
@@ -152,14 +157,14 @@ public class DefaultCatalogUserApi implements CatalogUserApi {
@Override
- public void createDefaultEmptyCatalog(final DateTime effectiveDate, final CallContext callContext) throws CatalogApiException {
+ public void createDefaultEmptyCatalog(@Nullable final DateTime effectiveDate, final CallContext callContext) throws CatalogApiException {
try {
final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContextWithoutAccountRecordId(callContext);
final StandaloneCatalog currentCatalog = getCurrentStandaloneCatalogForTenant(internalTenantContext);
final CatalogUpdater catalogUpdater = (currentCatalog != null) ?
new CatalogUpdater(currentCatalog) :
- new CatalogUpdater(BillingMode.IN_ADVANCE, effectiveDate, null);
+ new CatalogUpdater(BillingMode.IN_ADVANCE, getSafeFirstCatalogEffectiveDate(effectiveDate), null);
catalogCache.clearCatalog(internalTenantContext);
tenantApi.updateTenantKeyValue(TenantKey.CATALOG.toString(), catalogUpdater.getCatalogXML(), callContext);
@@ -169,14 +174,14 @@ public class DefaultCatalogUserApi implements CatalogUserApi {
}
@Override
- public void addSimplePlan(final SimplePlanDescriptor descriptor, final DateTime effectiveDate, final CallContext callContext) throws CatalogApiException {
+ public void addSimplePlan(final SimplePlanDescriptor descriptor, @Nullable final DateTime effectiveDate, final CallContext callContext) throws CatalogApiException {
try {
final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContextWithoutAccountRecordId(callContext);
final StandaloneCatalog currentCatalog = getCurrentStandaloneCatalogForTenant(internalTenantContext);
final CatalogUpdater catalogUpdater = (currentCatalog != null) ?
new CatalogUpdater(currentCatalog) :
- new CatalogUpdater(BillingMode.IN_ADVANCE, effectiveDate, descriptor.getCurrency());
+ new CatalogUpdater(BillingMode.IN_ADVANCE, getSafeFirstCatalogEffectiveDate(effectiveDate), descriptor.getCurrency());
catalogUpdater.addSimplePlanDescriptor(descriptor);
@@ -187,6 +192,14 @@ public class DefaultCatalogUserApi implements CatalogUserApi {
}
}
+ private DateTime getSafeFirstCatalogEffectiveDate(@Nullable final DateTime input) {
+ // The effectiveDate for the initial version does not matter too much
+ // Because of #760, we want to make that client passing a approximate date (e.g today.toDateTimeAtStartOfDay()) will find the version
+ final DateTime catalogEffectiveDate = clock.getUTCNow().minusDays(1);
+ return (input == null || input.isAfter(catalogEffectiveDate)) ? catalogEffectiveDate : input;
+ }
+
+
private StandaloneCatalog getCurrentStandaloneCatalogForTenant(final InternalTenantContext internalTenantContext) throws CatalogApiException {
final VersionedCatalog versionedCatalog = (VersionedCatalog) catalogService.getCurrentCatalog(false, false, internalTenantContext);
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CatalogResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CatalogResource.java
index 3f842fe..98b2f84 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CatalogResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CatalogResource.java
@@ -216,7 +216,7 @@ public class CatalogResource extends JaxRsResourceBase {
simplePlan.getTrialLength(),
simplePlan.getTrialTimeUnit(),
simplePlan.getAvailableBaseProducts());
- catalogUserApi.addSimplePlan(desc, clock.getUTCNow(), callContext);
+ catalogUserApi.addSimplePlan(desc, null, callContext);
return uriBuilder.buildResponse(uriInfo, CatalogResource.class, null, null, request);
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TenantResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TenantResource.java
index 691002e..4a036e6 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TenantResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TenantResource.java
@@ -37,6 +37,7 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
+import org.joda.time.DateTime;
import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.AccountUserApi;
import org.killbill.billing.callcontext.DefaultCallContext;
@@ -140,11 +141,13 @@ public class TenantResource extends JaxRsResourceBase {
if (!useGlobalDefault) {
final CallContext callContext = new DefaultCallContext(tenant.getId(), createdBy, CallOrigin.EXTERNAL,
UserType.CUSTOMER, Context.getOrCreateUserToken(), clock);
- catalogUserApi.createDefaultEmptyCatalog(clock.getUTCNow(),callContext);
+
+ catalogUserApi.createDefaultEmptyCatalog(null, callContext);
}
return uriBuilder.buildResponse(uriInfo, TenantResource.class, "getTenant", tenant.getId(), request);
}
+
@TimedResource
@POST
@Path("/" + REGISTER_NOTIFICATION_CALLBACK)
@@ -420,4 +423,5 @@ public class TenantResource extends JaxRsResourceBase {
protected ObjectType getObjectType() {
return ObjectType.TENANT;
}
+
}