Details
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueConditionJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueConditionJson.java
index 5af1d37..4f93cad 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueConditionJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueConditionJson.java
@@ -17,8 +17,11 @@
package org.killbill.billing.jaxrs.json;
+import org.killbill.billing.catalog.api.TimeUnit;
import org.killbill.billing.jaxrs.json.CatalogJson.DurationJson;
import org.killbill.billing.overdue.api.OverdueCondition;
+import org.killbill.billing.overdue.config.DefaultDuration;
+import org.killbill.billing.overdue.config.DefaultOverdueCondition;
import org.killbill.billing.util.tag.ControlTagType;
import com.fasterxml.jackson.annotation.JsonCreator;
@@ -94,4 +97,14 @@ public class OverdueConditionJson {
result = 31 * result + (controlTagExclusion != null ? controlTagExclusion.hashCode() : 0);
return result;
}
+
+ public static DefaultOverdueCondition toOverdueCondition(final OverdueConditionJson input) {
+ final DefaultOverdueCondition result = new DefaultOverdueCondition();
+ if (input.getTimeSinceEarliestUnpaidInvoiceEqualsOrExceeds() != null) {
+ result.setTimeSinceEarliestUnpaidInvoiceEqualsOrExceeds(new DefaultDuration().setUnit(input.getTimeSinceEarliestUnpaidInvoiceEqualsOrExceeds().getUnit()).setNumber(input.getTimeSinceEarliestUnpaidInvoiceEqualsOrExceeds().getNumber()));
+ }
+ result.setControlTagInclusion(input.getControlTagInclusion());
+ result.setControlTagExclusion(input.getControlTagExclusion());
+ return result;
+ }
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueJson.java
index 5dc7aec..f59c110 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueJson.java
@@ -20,9 +20,14 @@ package org.killbill.billing.jaxrs.json;
import java.util.List;
import org.killbill.billing.catalog.api.CurrencyValueNull;
+import org.killbill.billing.catalog.api.TimeUnit;
import org.killbill.billing.overdue.api.OverdueApiException;
import org.killbill.billing.overdue.api.OverdueConfig;
import org.killbill.billing.overdue.api.OverdueState;
+import org.killbill.billing.overdue.config.DefaultDuration;
+import org.killbill.billing.overdue.config.DefaultOverdueConfig;
+import org.killbill.billing.overdue.config.DefaultOverdueState;
+import org.killbill.billing.overdue.config.DefaultOverdueStatesAccount;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -93,4 +98,28 @@ public class OverdueJson {
result = 31 * result + (overdueStates != null ? overdueStates.hashCode() : 0);
return result;
}
+
+ public static OverdueConfig toOverdueConfig(final OverdueJson input) {
+ final DefaultOverdueConfig result = new DefaultOverdueConfig();
+ final DefaultOverdueStatesAccount overdueStateAccount = new DefaultOverdueStatesAccount();
+ result.setOverdueStates(overdueStateAccount);
+
+ final DefaultOverdueState [] states = new DefaultOverdueState[input.getOverdueStates().size()];
+ int i = 0;
+ for (final OverdueStateConfigJson cur : input.getOverdueStates()) {
+ final DefaultOverdueState state = new DefaultOverdueState();
+ state.setName(cur.getName());
+ state.setExternalMessage(cur.getExternalMessage());
+ state.setBlockChanges(cur.getBlockChanges());
+ state.setDisableEntitlement(cur.getDisableEntitlement());
+ state.setSubscriptionCancellationPolicy(cur.getSubscriptionCancellationPolicy());
+ state.setClearState(cur.isClearState());
+ state.setAutoReevaluationInterval((new DefaultDuration()).setUnit(TimeUnit.DAYS).setNumber(cur.getAutoReevaluationIntervalDays()));
+ state.setCondition(OverdueConditionJson.toOverdueCondition(cur.getCondition()));
+ states[i++] = state;
+ }
+ overdueStateAccount.setAccountOverdueStates(states);
+ overdueStateAccount.setInitialReevaluationInterval(null);
+ return result;
+ }
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/OverdueResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/OverdueResource.java
index fc5a080..3ae8ae6 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/OverdueResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/OverdueResource.java
@@ -45,6 +45,7 @@ import org.killbill.billing.jaxrs.json.CatalogJson;
import org.killbill.billing.jaxrs.json.OverdueJson;
import org.killbill.billing.jaxrs.util.Context;
import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
+import org.killbill.billing.overdue.api.DefaultOverdueApi;
import org.killbill.billing.overdue.api.OverdueApi;
import org.killbill.billing.overdue.api.OverdueConfig;
import org.killbill.billing.overdue.config.DefaultOverdueConfig;
@@ -125,12 +126,31 @@ public class OverdueResource extends JaxRsResourceBase {
@ApiOperation(value = "Retrieve the overdue config as JSON" , response = OverdueJson.class)
@ApiResponses(value = {})
public Response getOverdueConfigJson(@javax.ws.rs.core.Context final HttpServletRequest request) throws Exception {
-
-
final TenantContext tenantContext = context.createContext(request);
final OverdueConfig overdueConfig = overdueApi.getOverdueConfig(tenantContext);
final OverdueJson result = new OverdueJson(overdueConfig);
return Response.status(Status.OK).entity(result).build();
}
+
+
+ @TimedResource
+ @POST
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Upload the full overdue config as JSON")
+ @ApiResponses(value = {})
+ public Response uploadOverdueConfigJson(final OverdueJson overdueJson,
+ @HeaderParam(HDR_CREATED_BY) final String createdBy,
+ @HeaderParam(HDR_REASON) final String reason,
+ @HeaderParam(HDR_COMMENT) final String comment,
+ @javax.ws.rs.core.Context final HttpServletRequest request,
+ @javax.ws.rs.core.Context final UriInfo uriInfo) throws Exception {
+ final CallContext callContext = context.createContext(createdBy, reason, comment, request);
+
+ final OverdueConfig overdueConfig = OverdueJson.toOverdueConfig(overdueJson);
+ ((DefaultOverdueApi)overdueApi).uploadOverdueConfig(overdueConfig, callContext);
+ return uriBuilder.buildResponse(uriInfo, OverdueResource.class, null, null);
+ }
+
}
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/api/DefaultOverdueApi.java b/overdue/src/main/java/org/killbill/billing/overdue/api/DefaultOverdueApi.java
index 580e4f9..2364cf4 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/api/DefaultOverdueApi.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/api/DefaultOverdueApi.java
@@ -21,6 +21,7 @@ import java.util.UUID;
import javax.inject.Inject;
+import org.killbill.billing.ErrorCode;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.entitlement.api.BlockingState;
import org.killbill.billing.entitlement.api.BlockingStateType;
@@ -36,6 +37,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.xmlloader.XMLWriter;
public class DefaultOverdueApi implements OverdueApi {
@@ -76,6 +78,15 @@ public class DefaultOverdueApi implements OverdueApi {
}
}
+ public void uploadOverdueConfig(final OverdueConfig overdueConfig, final CallContext callContext) throws OverdueApiException {
+ try {
+ final String overdueXML = XMLWriter.writeXML((DefaultOverdueConfig) overdueConfig, DefaultOverdueConfig.class);
+ uploadOverdueConfig(overdueXML, callContext);
+ } catch (final Exception e) {
+ throw new OverdueApiException(ErrorCode.OVERDUE_INVALID_FOR_TENANT, callContext.getTenantId());
+ }
+ }
+
@Override
public OverdueState getOverdueStateFor(final UUID accountId, final TenantContext tenantContext) throws OverdueApiException {
final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(accountId, tenantContext);
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultDuration.java b/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultDuration.java
index d1d73c2..49396ea 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultDuration.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultDuration.java
@@ -111,12 +111,12 @@ public class DefaultDuration extends ValidatingConfig<DefaultOverdueConfig> impl
return errors;
}
- protected DefaultDuration setUnit(final TimeUnit unit) {
+ public DefaultDuration setUnit(final TimeUnit unit) {
this.unit = unit;
return this;
}
- protected DefaultDuration setNumber(final Integer number) {
+ public DefaultDuration setNumber(final Integer number) {
this.number = number;
return this;
}
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueCondition.java b/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueCondition.java
index 3cca103..a4e4b51 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueCondition.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueCondition.java
@@ -157,6 +157,30 @@ public class DefaultOverdueCondition extends ValidatingConfig<DefaultOverdueConf
return controlTagExclusion;
}
+ public void setNumberOfUnpaidInvoicesEqualsOrExceeds(final Integer numberOfUnpaidInvoicesEqualsOrExceeds) {
+ this.numberOfUnpaidInvoicesEqualsOrExceeds = numberOfUnpaidInvoicesEqualsOrExceeds;
+ }
+
+ public void setTotalUnpaidInvoiceBalanceEqualsOrExceeds(final BigDecimal totalUnpaidInvoiceBalanceEqualsOrExceeds) {
+ this.totalUnpaidInvoiceBalanceEqualsOrExceeds = totalUnpaidInvoiceBalanceEqualsOrExceeds;
+ }
+
+ public void setTimeSinceEarliestUnpaidInvoiceEqualsOrExceeds(final DefaultDuration timeSinceEarliestUnpaidInvoiceEqualsOrExceeds) {
+ this.timeSinceEarliestUnpaidInvoiceEqualsOrExceeds = timeSinceEarliestUnpaidInvoiceEqualsOrExceeds;
+ }
+
+ public void setResponseForLastFailedPayment(final PaymentResponse[] responseForLastFailedPayment) {
+ this.responseForLastFailedPayment = responseForLastFailedPayment;
+ }
+
+ public void setControlTagInclusion(final ControlTagType controlTagInclusion) {
+ this.controlTagInclusion = controlTagInclusion;
+ }
+
+ public void setControlTagExclusion(final ControlTagType controlTagExclusion) {
+ this.controlTagExclusion = controlTagExclusion;
+ }
+
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("DefaultOverdueCondition{");
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueState.java b/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueState.java
index 9d33ddd..af49f62 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueState.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueState.java
@@ -119,22 +119,26 @@ public class DefaultOverdueState extends ValidatingConfig<DefaultOverdueConfig>
return autoReevaluationInterval.toJodaPeriod();
}
- protected DefaultOverdueState setName(final String name) {
+ public void setAutoReevaluationInterval(final DefaultDuration autoReevaluationInterval) {
+ this.autoReevaluationInterval = autoReevaluationInterval;
+ }
+
+ public DefaultOverdueState setName(final String name) {
this.name = name;
return this;
}
- protected DefaultOverdueState setClearState(final boolean isClearState) {
+ public DefaultOverdueState setClearState(final boolean isClearState) {
this.isClearState = isClearState;
return this;
}
- protected DefaultOverdueState setExternalMessage(final String externalMessage) {
+ public DefaultOverdueState setExternalMessage(final String externalMessage) {
this.externalMessage = externalMessage;
return this;
}
- protected DefaultOverdueState setDisableEntitlement(final boolean cancel) {
+ public DefaultOverdueState setDisableEntitlement(final boolean cancel) {
this.disableEntitlement = cancel;
return this;
}
@@ -144,12 +148,12 @@ public class DefaultOverdueState extends ValidatingConfig<DefaultOverdueConfig>
return this;
}
- protected DefaultOverdueState setBlockChanges(final boolean cancel) {
+ public DefaultOverdueState setBlockChanges(final boolean cancel) {
this.blockChanges = cancel;
return this;
}
- protected DefaultOverdueState setCondition(final DefaultOverdueCondition condition) {
+ public DefaultOverdueState setCondition(final DefaultOverdueCondition condition) {
this.condition = condition;
return this;
}
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueStatesAccount.java b/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueStatesAccount.java
index 0bd4e63..004fd2d 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueStatesAccount.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/config/DefaultOverdueStatesAccount.java
@@ -45,12 +45,12 @@ public class DefaultOverdueStatesAccount extends DefaultOverdueStateSet implemen
return initialReevaluationInterval.toJodaPeriod();
}
- protected DefaultOverdueStatesAccount setAccountOverdueStates(final DefaultOverdueState[] accountOverdueStates) {
+ public DefaultOverdueStatesAccount setAccountOverdueStates(final DefaultOverdueState[] accountOverdueStates) {
this.accountOverdueStates = accountOverdueStates;
return this;
}
- protected DefaultOverdueStatesAccount setInitialReevaluationInterval(final DefaultDuration initialReevaluationInterval) {
+ public DefaultOverdueStatesAccount setInitialReevaluationInterval(final DefaultDuration initialReevaluationInterval) {
this.initialReevaluationInterval = initialReevaluationInterval;
return this;
}
diff --git a/overdue/src/test/resources/OverdueConfig3.xml b/overdue/src/test/resources/OverdueConfig3.xml
new file mode 100644
index 0000000..ddba32f
--- /dev/null
+++ b/overdue/src/test/resources/OverdueConfig3.xml
@@ -0,0 +1,71 @@
+<!--
+ ~ 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
+ ~ License. You may obtain a copy of the License at:
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ ~ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ ~ License for the specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+<overdueConfig>
+ <accountOverdueStates>
+ <state name="OD4">
+ <condition>
+ <numberOfUnpaidInvoicesEqualsOrExceeds>5</numberOfUnpaidInvoicesEqualsOrExceeds>
+ <controlTagInclusion>AUTO_PAY_OFF</controlTagInclusion>
+ </condition>
+ <externalMessage>Reached OD3</externalMessage>
+ <blockChanges>true</blockChanges>
+ <disableEntitlementAndChangesBlocked>true</disableEntitlementAndChangesBlocked>
+ <autoReevaluationInterval>
+ <unit>DAYS</unit><number>5</number>
+ </autoReevaluationInterval>
+ </state>
+ <state name="OD3">
+ <condition>
+ <responseForLastFailedPaymentIn>
+ <response>INVALID_CARD</response>
+ <response>LOST_OR_STOLEN_CARD</response>
+ </responseForLastFailedPaymentIn>
+ </condition>
+ <externalMessage>Reached OD3</externalMessage>
+ <blockChanges>true</blockChanges>
+ <disableEntitlementAndChangesBlocked>true</disableEntitlementAndChangesBlocked>
+ <autoReevaluationInterval>
+ <unit>DAYS</unit><number>5</number>
+ </autoReevaluationInterval>
+ </state>
+ <state name="OD2">
+ <condition>
+ <totalUnpaidInvoiceBalanceEqualsOrExceeds>5.00</totalUnpaidInvoiceBalanceEqualsOrExceeds>
+ </condition>
+ <externalMessage>Reached OD2</externalMessage>
+ <blockChanges>true</blockChanges>
+ <disableEntitlementAndChangesBlocked>true</disableEntitlementAndChangesBlocked>
+ <autoReevaluationInterval>
+ <unit>DAYS</unit><number>5</number>
+ </autoReevaluationInterval>
+ </state>
+ <state name="OD1">
+ <condition>
+ <timeSinceEarliestUnpaidInvoiceEqualsOrExceeds>
+ <unit>DAYS</unit><number>30</number>
+ </timeSinceEarliestUnpaidInvoiceEqualsOrExceeds>
+ </condition>
+ <externalMessage>Reached OD1</externalMessage>
+ <blockChanges>true</blockChanges>
+ <disableEntitlementAndChangesBlocked>false</disableEntitlementAndChangesBlocked>
+ <autoReevaluationInterval>
+ <unit>DAYS</unit><number>5</number>
+ </autoReevaluationInterval>
+ </state>
+ </accountOverdueStates>
+</overdueConfig>