Details
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java
index 9c595e1..6f43c9a 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java
@@ -253,15 +253,18 @@ public class InvoiceResource extends JaxRsResourceBase {
@Path("/" +CHARGES)
public Response createExternalCharge(final InvoiceItemJson externalChargeJson,
@QueryParam(QUERY_REQUESTED_DT) final String requestedDateTimeString,
+ @QueryParam(QUERY_PAY_INVOICE) @DefaultValue("false") final Boolean payInvoice,
@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 UriInfo uriInfo,
- @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, InvoiceApiException {
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, InvoiceApiException, PaymentApiException {
final CallContext callContext = context.createContext(createdBy, reason, comment, request);
final Account account = accountUserApi.getAccountById(UUID.fromString(externalChargeJson.getAccountId()), callContext);
-
+ if (payInvoice && account.getPaymentMethodId() == null) {
+ return Response.status(Status.BAD_REQUEST).build();
+ }
// Get the effective date of the external charge, in the account timezone
final LocalDate requestedDate = toLocalDate(account, requestedDateTimeString, callContext);
@@ -277,6 +280,10 @@ public class InvoiceResource extends JaxRsResourceBase {
currency, callContext);
}
+ if (payInvoice) {
+ final Invoice invoice = invoiceApi.getInvoice(externalCharge.getInvoiceId(), callContext);
+ paymentApi.createPayment(account, invoice.getId(), invoice.getBalance(), callContext);
+ }
return uriBuilder.buildResponse(InvoiceResource.class, "getInvoice", externalCharge.getInvoiceId(), uriInfo.getBaseUri().toString());
}
@@ -287,14 +294,18 @@ public class InvoiceResource extends JaxRsResourceBase {
public Response createExternalChargeForInvoice(final InvoiceItemJson externalChargeJson,
@PathParam("invoiceId") final String invoiceIdString,
@QueryParam(QUERY_REQUESTED_DT) final String requestedDateTimeString,
+ @QueryParam(QUERY_PAY_INVOICE) @DefaultValue("false") final Boolean payInvoice,
@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 UriInfo uriInfo,
- @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, InvoiceApiException {
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, InvoiceApiException, PaymentApiException {
final CallContext callContext = context.createContext(createdBy, reason, comment, request);
final Account account = accountUserApi.getAccountById(UUID.fromString(externalChargeJson.getAccountId()), callContext);
+ if (payInvoice && account.getPaymentMethodId() == null) {
+ return Response.status(Status.BAD_REQUEST).build();
+ }
// Get the effective date of the external charge, in the account timezone
final LocalDate requestedDate = toLocalDate(account, requestedDateTimeString, callContext);
@@ -312,6 +323,11 @@ public class InvoiceResource extends JaxRsResourceBase {
requestedDate, currency, callContext);
}
+ if (payInvoice) {
+ final Invoice invoice = invoiceApi.getInvoice(externalCharge.getInvoiceId(), callContext);
+ paymentApi.createPayment(account, invoice.getId(), invoice.getBalance(), callContext);
+ }
+
return uriBuilder.buildResponse(InvoiceResource.class, "getInvoice", externalCharge.getInvoiceId(), uriInfo.getBaseUri().toString());
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java
index fbdda77..0f1e2d1 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java
@@ -81,6 +81,7 @@ public interface JaxrsResource {
public static final String QUERY_PAYMENT_METHOD_IS_DEFAULT = "isDefault";
public static final String QUERY_PAY_ALL_UNPAID_INVOICES = "payAllUnpaidInvoices";
+ public static final String QUERY_PAY_INVOICE = "payInvoice";
public static final String QUERY_BUNDLE_TRANSFER_ADDON = "transferAddOn";
public static final String QUERY_BUNDLE_TRANSFER_CANCEL_IMM = "cancelImmediately";
diff --git a/server/src/test/java/com/ning/billing/jaxrs/KillbillClient.java b/server/src/test/java/com/ning/billing/jaxrs/KillbillClient.java
index d56eba2..193dbb1 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/KillbillClient.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/KillbillClient.java
@@ -549,22 +549,25 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
}
protected InvoiceJson createExternalCharge(final String accountId, final BigDecimal amount, @Nullable final String bundleId,
- @Nullable final Currency currency, @Nullable final DateTime requestedDate) throws Exception {
- return doCreateExternalCharge(accountId, null, bundleId, amount, currency, requestedDate, JaxrsResource.CHARGES_PATH);
+ @Nullable final Currency currency, @Nullable final DateTime requestedDate, final Boolean autoPay) throws Exception {
+ return doCreateExternalCharge(accountId, null, bundleId, amount, currency, requestedDate, autoPay, JaxrsResource.CHARGES_PATH);
}
protected InvoiceJson createExternalChargeForInvoice(final String accountId, final String invoiceId, @Nullable final String bundleId, final BigDecimal amount,
- @Nullable final Currency currency, @Nullable final DateTime requestedDate) throws Exception {
+ @Nullable final Currency currency, @Nullable final DateTime requestedDate, final Boolean autoPay) throws Exception {
final String uri = JaxrsResource.INVOICES_PATH + "/" + invoiceId + "/" + JaxrsResource.CHARGES;
- return doCreateExternalCharge(accountId, invoiceId, bundleId, amount, currency, requestedDate, uri);
+ return doCreateExternalCharge(accountId, invoiceId, bundleId, amount, currency, requestedDate, autoPay, uri);
}
private InvoiceJson doCreateExternalCharge(final String accountId, @Nullable final String invoiceId, @Nullable final String bundleId, @Nullable final BigDecimal amount,
- @Nullable final Currency currency, final DateTime requestedDate, final String uri) throws IOException {
+ @Nullable final Currency currency, final DateTime requestedDate, final Boolean autoPay, final String uri) throws IOException {
final Map<String, String> queryParams = new HashMap<String, String>();
if (requestedDate != null) {
queryParams.put(JaxrsResource.QUERY_REQUESTED_DT, requestedDate.toDateTimeISO().toString());
}
+ if (autoPay) {
+ queryParams.put(JaxrsResource.QUERY_PAY_INVOICE, "true");
+ }
final InvoiceItemJson externalCharge = new InvoiceItemJson(null, invoiceId, null, accountId, bundleId, null, null, null,
null, null, null, null, amount, currency, null);
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestInvoice.java b/server/src/test/java/com/ning/billing/jaxrs/TestInvoice.java
index b29434e..34a661e 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestInvoice.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestInvoice.java
@@ -282,7 +282,7 @@ public class TestInvoice extends TestJaxrsBase {
// Post an external charge
final BigDecimal chargeAmount = BigDecimal.TEN;
- final InvoiceJson invoiceWithItems = createExternalCharge(accountJson.getAccountId(), chargeAmount, null, null, null);
+ final InvoiceJson invoiceWithItems = createExternalCharge(accountJson.getAccountId(), chargeAmount, null, null, null, false);
assertEquals(invoiceWithItems.getBalance().compareTo(chargeAmount), 0);
assertEquals(invoiceWithItems.getItems().size(), 1);
assertNull(invoiceWithItems.getItems().get(0).getBundleId());
@@ -291,6 +291,26 @@ public class TestInvoice extends TestJaxrsBase {
assertEquals(getInvoicesForAccount(accountJson.getAccountId()).size(), 3);
}
+
+ @Test(groups = "slow")
+ public void testExternalChargeOnNewInvoiceWithAutomaticPayment() throws Exception {
+ final AccountJson accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+
+ // Get the invoices
+ assertEquals(getInvoicesForAccount(accountJson.getAccountId()).size(), 2);
+
+ // Post an external charge
+ final BigDecimal chargeAmount = BigDecimal.TEN;
+ final InvoiceJson invoiceWithItems = createExternalCharge(accountJson.getAccountId(), chargeAmount, null, null, null, true);
+ assertEquals(invoiceWithItems.getBalance().compareTo(BigDecimal.ZERO), 0);
+ assertEquals(invoiceWithItems.getItems().size(), 1);
+ assertNull(invoiceWithItems.getItems().get(0).getBundleId());
+
+ // Verify the total number of invoices
+ assertEquals(getInvoicesForAccount(accountJson.getAccountId()).size(), 3);
+
+ }
+
@Test(groups = "slow")
public void testExternalChargeForBundleOnNewInvoice() throws Exception {
final AccountJson accountJson = createAccountNoPMBundleAndSubscriptionAndWaitForFirstInvoice();
@@ -301,7 +321,7 @@ public class TestInvoice extends TestJaxrsBase {
// Post an external charge
final BigDecimal chargeAmount = BigDecimal.TEN;
final String bundleId = UUID.randomUUID().toString();
- final InvoiceJson invoiceWithItems = createExternalCharge(accountJson.getAccountId(), chargeAmount, bundleId, null, null);
+ final InvoiceJson invoiceWithItems = createExternalCharge(accountJson.getAccountId(), chargeAmount, bundleId, null, null, false);
assertEquals(invoiceWithItems.getBalance().compareTo(chargeAmount), 0);
assertEquals(invoiceWithItems.getItems().size(), 1);
assertEquals(invoiceWithItems.getItems().get(0).getBundleId(), bundleId);
@@ -325,7 +345,7 @@ public class TestInvoice extends TestJaxrsBase {
// Post an external charge
final BigDecimal chargeAmount = BigDecimal.TEN;
final InvoiceJson invoiceWithItems = createExternalChargeForInvoice(accountJson.getAccountId(), invoiceId,
- null, chargeAmount, null, null);
+ null, chargeAmount, null, null, false);
assertEquals(invoiceWithItems.getItems().size(), originalNumberOfItemsForInvoice + 1);
assertNull(invoiceWithItems.getItems().get(originalNumberOfItemsForInvoice).getBundleId());
@@ -336,6 +356,31 @@ public class TestInvoice extends TestJaxrsBase {
}
@Test(groups = "slow")
+ public void testExternalChargeOnExistingInvoiceWithAutomaticPayment() throws Exception {
+ final AccountJson accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+
+ // Get the invoices
+ final List<InvoiceJson> invoices = getInvoicesWithItemsForAccount(accountJson.getAccountId());
+ // 2 invoices but look for the non zero dollar one
+ assertEquals(invoices.size(), 2);
+ final String invoiceId = invoices.get(1).getInvoiceId();
+ final BigDecimal originalInvoiceAmount = invoices.get(1).getAmount();
+ final int originalNumberOfItemsForInvoice = invoices.get(1).getItems().size();
+
+ // Post an external charge
+ final BigDecimal chargeAmount = BigDecimal.TEN;
+ final InvoiceJson invoiceWithItems = createExternalChargeForInvoice(accountJson.getAccountId(), invoiceId,
+ null, chargeAmount, null, null, true);
+ assertEquals(invoiceWithItems.getItems().size(), originalNumberOfItemsForInvoice + 1);
+ assertNull(invoiceWithItems.getItems().get(originalNumberOfItemsForInvoice).getBundleId());
+
+ // Verify the new invoice balance
+ final InvoiceJson adjustedInvoice = getInvoice(invoiceId);
+ assertEquals(adjustedInvoice.getBalance().compareTo(BigDecimal.ZERO), 0);
+ }
+
+
+ @Test(groups = "slow")
public void testExternalChargeForBundleOnExistingInvoice() throws Exception {
final AccountJson accountJson = createAccountNoPMBundleAndSubscriptionAndWaitForFirstInvoice();
@@ -351,7 +396,7 @@ public class TestInvoice extends TestJaxrsBase {
final BigDecimal chargeAmount = BigDecimal.TEN;
final String bundleId = UUID.randomUUID().toString();
final InvoiceJson invoiceWithItems = createExternalChargeForInvoice(accountJson.getAccountId(), invoiceId,
- bundleId, chargeAmount, null, null);
+ bundleId, chargeAmount, null, null, false);
assertEquals(invoiceWithItems.getItems().size(), originalNumberOfItemsForInvoice + 1);
assertEquals(invoiceWithItems.getItems().get(originalNumberOfItemsForInvoice).getBundleId(), bundleId);