Details
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountJsonWithBalance.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountJsonWithBalance.java
index b204a48..618f924 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountJsonWithBalance.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountJsonWithBalance.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2010-2011 Ning, Inc.
+ * Copyright 2010-2012 Ning, Inc.
*
* Ning 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
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
index 360202b..b49715c 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
@@ -33,33 +33,19 @@ import com.fasterxml.jackson.annotation.JsonProperty;
public class PaymentJsonSimple extends JsonBase {
private final BigDecimal paidAmount;
-
private final BigDecimal amount;
-
private final String accountId;
-
private final String invoiceId;
-
private final String paymentId;
-
private final DateTime requestedDate;
-
private final DateTime effectiveDate;
-
private final Integer retryCount;
-
private final String currency;
-
private final String status;
-
private final String gatewayErrorCode;
-
private final String gatewayErrorMsg;
-
private final String paymentMethodId;
-
private final String extFirstPaymentIdRef;
-
private final String extSecondPaymentIdRef;
@JsonCreator
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java
index d7029dc..55b5b68 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java
@@ -43,8 +43,8 @@ public class PaymentJsonWithBundleKeys extends PaymentJsonSimple {
@JsonProperty("invoiceId") final String invoiceId,
@JsonProperty("paymentId") final String paymentId,
@JsonProperty("paymentMethodId") final String paymentMethodId,
- @JsonProperty("requestedDt") final DateTime requestedDate,
- @JsonProperty("effectiveDt") final DateTime effectiveDate,
+ @JsonProperty("requestedDate") final DateTime requestedDate,
+ @JsonProperty("effectiveDate") final DateTime effectiveDate,
@JsonProperty("retryCount") final Integer retryCount,
@JsonProperty("currency") final String currency,
@JsonProperty("status") final String status,
@@ -65,8 +65,13 @@ public class PaymentJsonWithBundleKeys extends PaymentJsonSimple {
}
public PaymentJsonWithBundleKeys(final Payment payment, final String status, final int nbOfPaymentAttempts, final String bundleExternalKey,
+ final UUID accountId, final List<RefundJson> refunds, final List<ChargebackJson> chargebacks) {
+ this(payment, status, nbOfPaymentAttempts, bundleExternalKey, accountId, refunds, chargebacks, null);
+ }
+
+ public PaymentJsonWithBundleKeys(final Payment payment, final String status, final int nbOfPaymentAttempts, final String bundleExternalKey,
final UUID accountId, final List<RefundJson> refunds, final List<ChargebackJson> chargebacks,
- final List<AuditLog> auditLogs) {
+ @Nullable final List<AuditLog> auditLogs) {
this(payment.getAmount(), payment.getPaidAmount(), accountId.toString(),
payment.getInvoiceId().toString(), payment.getId().toString(),
payment.getPaymentMethodId().toString(),
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/RefundJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/RefundJson.java
index 3a52b58..8dd0c8e 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/RefundJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/RefundJson.java
@@ -65,6 +65,10 @@ public class RefundJson extends JsonBase {
this.adjustments = adjustments;
}
+ public RefundJson(final Refund refund) {
+ this(refund, null, null);
+ }
+
public RefundJson(final Refund refund, @Nullable final List<InvoiceItem> adjustments, @Nullable final List<AuditLog> auditLogs) {
this(refund.getId().toString(), refund.getPaymentId().toString(), refund.getRefundAmount(), refund.getCurrency().toString(),
refund.isAdjusted(), refund.getEffectiveDate(), refund.getEffectiveDate(),
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 3f48212..eeb1034 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
@@ -59,6 +59,7 @@ public interface JaxrsResource {
public static final String QUERY_PAYMENT_EXTERNAL = "externalPayment";
public static final String QUERY_PAYMENT_LAST4_CC = "last4CC";
public static final String QUERY_PAYMENT_NAME_ON_CC = "nameOnCC";
+ public static final String QUERY_PAYMENT_WITH_REFUNDS_AND_CHARGEBACKS = "withRefundsAndChargebacks";
public static final String QUERY_TAGS = "tagList";
public static final String QUERY_CUSTOM_FIELDS = "customFieldList";
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java
index 24f6bc2..cea02e2 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java
@@ -40,8 +40,13 @@ import javax.ws.rs.core.UriInfo;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountApiException;
import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
+import com.ning.billing.jaxrs.json.ChargebackJson;
import com.ning.billing.jaxrs.json.CustomFieldJson;
import com.ning.billing.jaxrs.json.InvoiceItemJsonSimple;
+import com.ning.billing.jaxrs.json.PaymentJsonSimple;
+import com.ning.billing.jaxrs.json.PaymentJsonWithBundleKeys;
import com.ning.billing.jaxrs.json.RefundJson;
import com.ning.billing.jaxrs.util.Context;
import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
@@ -70,22 +75,61 @@ public class PaymentResource extends JaxRsResourceBase {
private final Context context;
private final PaymentApi paymentApi;
+ private final InvoicePaymentApi invoicePaymentApi;
private final AccountUserApi accountApi;
@Inject
public PaymentResource(final JaxrsUriBuilder uriBuilder,
final AccountUserApi accountApi,
final PaymentApi paymentApi,
+ final InvoicePaymentApi invoicePaymentApi,
final TagUserApi tagUserApi,
final CustomFieldUserApi customFieldUserApi,
final Context context) {
super(uriBuilder, tagUserApi, customFieldUserApi);
this.context = context;
this.paymentApi = paymentApi;
+ this.invoicePaymentApi = invoicePaymentApi;
this.accountApi = accountApi;
}
@GET
+ @Path("/{paymentId:" + UUID_PATTERN + "}")
+ @Produces(APPLICATION_JSON)
+ public Response getPayment(@PathParam(ID_PARAM_NAME) final String paymentIdString,
+ @QueryParam(QUERY_PAYMENT_WITH_REFUNDS_AND_CHARGEBACKS) @DefaultValue("false") final Boolean withRefundsAndChargebacks) throws PaymentApiException {
+ final UUID paymentId = UUID.fromString(paymentIdString);
+ final Payment payment = paymentApi.getPayment(paymentId);
+
+ final PaymentJsonSimple paymentJsonSimple;
+ if (withRefundsAndChargebacks) {
+ final List<RefundJson> refunds = new ArrayList<RefundJson>();
+ for (final Refund refund : paymentApi.getPaymentRefunds(paymentId)) {
+ refunds.add(new RefundJson(refund));
+ }
+
+ final List<ChargebackJson> chargebacks = new ArrayList<ChargebackJson>();
+ for (final InvoicePayment chargeback : invoicePaymentApi.getChargebacksByPaymentId(paymentId)) {
+ chargebacks.add(new ChargebackJson(chargeback));
+ }
+
+ final int nbOfPaymentAttempts = payment.getAttempts().size();
+ final String status = payment.getPaymentStatus().toString();
+ paymentJsonSimple = new PaymentJsonWithBundleKeys(payment,
+ status,
+ nbOfPaymentAttempts,
+ null, // TODO - the keys are really only used for the timeline
+ payment.getAccountId(),
+ refunds,
+ chargebacks);
+ } else {
+ paymentJsonSimple = new PaymentJsonSimple(payment);
+ }
+
+ return Response.status(Status.OK).entity(paymentJsonSimple).build();
+ }
+
+ @GET
@Path("/{paymentId:" + UUID_PATTERN + "}/" + REFUNDS)
@Produces(APPLICATION_JSON)
public Response getRefunds(@PathParam("paymentId") final String paymentId) throws PaymentApiException {
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
index 54149d7..cd2cf90 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
@@ -75,6 +75,7 @@ import com.ning.billing.jaxrs.json.InvoiceItemJsonSimple;
import com.ning.billing.jaxrs.json.InvoiceJsonSimple;
import com.ning.billing.jaxrs.json.InvoiceJsonWithItems;
import com.ning.billing.jaxrs.json.PaymentJsonSimple;
+import com.ning.billing.jaxrs.json.PaymentJsonWithBundleKeys;
import com.ning.billing.jaxrs.json.PaymentMethodJson;
import com.ning.billing.jaxrs.json.PaymentMethodJson.PaymentMethodPluginDetailJson;
import com.ning.billing.jaxrs.json.PaymentMethodJson.PaymentMethodProperties;
@@ -515,7 +516,7 @@ public class TestJaxrsBase extends ServerTestSuiteWithEmbeddedDB {
assertNotNull(bundleJson);
final SubscriptionJsonNoEvents subscriptionJson = createSubscription(bundleJson.getBundleId(), "Shotgun", ProductCategory.BASE.toString(), BillingPeriod.MONTHLY.toString(), true);
assertNotNull(subscriptionJson);
- clock.addMonths(1);
+ clock.addDays(32);
crappyWaitForLackOfProperSynchonization();
return accountJson;
@@ -680,6 +681,26 @@ public class TestJaxrsBase extends ServerTestSuiteWithEmbeddedDB {
// PAYMENT UTILITIES
//
+ protected PaymentJsonSimple getPayment(final String paymentId) throws IOException {
+ return doGetPayment(paymentId, DEFAULT_EMPTY_QUERY, PaymentJsonSimple.class);
+ }
+
+ protected PaymentJsonWithBundleKeys getPaymentWithRefundsAndChargebacks(final String paymentId) throws IOException {
+ return doGetPayment(paymentId, ImmutableMap.<String, String>of(JaxrsResource.QUERY_PAYMENT_WITH_REFUNDS_AND_CHARGEBACKS, "true"), PaymentJsonWithBundleKeys.class);
+ }
+
+ protected <T extends PaymentJsonSimple> T doGetPayment(final String paymentId, final Map<String, String> queryParams, final Class<T> clazz) throws IOException {
+ final String paymentURI = JaxrsResource.PAYMENTS_PATH + "/" + paymentId;
+
+ final Response paymentResponse = doGet(paymentURI, queryParams, DEFAULT_HTTP_TIMEOUT_SEC);
+ assertEquals(paymentResponse.getStatusCode(), Status.OK.getStatusCode());
+
+ final T paymentJsonSimple = mapper.readValue(paymentResponse.getResponseBody(), clazz);
+ assertNotNull(paymentJsonSimple);
+
+ return paymentJsonSimple;
+ }
+
protected PaymentMethodJson getPaymentMethod(final String paymentMethodId) throws IOException {
final String paymentMethodURI = JaxrsResource.PAYMENT_METHODS_PATH + "/" + paymentMethodId;
final Response paymentMethodResponse = doGet(paymentMethodURI, DEFAULT_EMPTY_QUERY, DEFAULT_HTTP_TIMEOUT_SEC);
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestPayment.java b/server/src/test/java/com/ning/billing/jaxrs/TestPayment.java
index a95ac00..2c2942e 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestPayment.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestPayment.java
@@ -29,12 +29,21 @@ import com.ning.billing.jaxrs.json.InvoiceItemJsonSimple;
import com.ning.billing.jaxrs.json.InvoiceJsonSimple;
import com.ning.billing.jaxrs.json.InvoiceJsonWithItems;
import com.ning.billing.jaxrs.json.PaymentJsonSimple;
+import com.ning.billing.jaxrs.json.PaymentJsonWithBundleKeys;
import com.ning.billing.jaxrs.json.PaymentMethodJson;
import com.ning.billing.jaxrs.json.RefundJson;
public class TestPayment extends TestJaxrsBase {
@Test(groups = "slow")
+ public void testRetrievePayment() throws Exception {
+ final PaymentJsonSimple paymentJsonSimple = setupScenarioWithPayment();
+
+ final PaymentJsonSimple retrievedPaymentJsonSimple = getPayment(paymentJsonSimple.getPaymentId());
+ Assert.assertEquals(retrievedPaymentJsonSimple, paymentJsonSimple);
+ }
+
+ @Test(groups = "slow")
public void testFullRefundWithNoAdjustment() throws Exception {
final PaymentJsonSimple paymentJsonSimple = setupScenarioWithPayment();
@@ -181,6 +190,27 @@ public class TestPayment extends TestJaxrsBase {
// Verify the refunds
final List<RefundJson> retrievedRefunds = getRefundsForPayment(paymentJsonSimple.getPaymentId());
Assert.assertEquals(retrievedRefunds.size(), 1);
+
+ // Verify the refund via the payment API
+ final PaymentJsonWithBundleKeys retrievedPaymentJsonWithBundleKeys = getPaymentWithRefundsAndChargebacks(paymentJsonSimple.getPaymentId());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getPaymentId(), paymentJsonSimple.getPaymentId());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getPaidAmount(), paymentJsonSimple.getPaidAmount().add(refundAmount.negate()).setScale(2, RoundingMode.HALF_UP));
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getAmount(), paymentJsonSimple.getAmount());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getAccountId(), paymentJsonSimple.getAccountId());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getInvoiceId(), paymentJsonSimple.getInvoiceId());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getRequestedDate(), paymentJsonSimple.getRequestedDate());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getEffectiveDate(), paymentJsonSimple.getEffectiveDate());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getRetryCount(), paymentJsonSimple.getRetryCount());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getCurrency(), paymentJsonSimple.getCurrency());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getStatus(), paymentJsonSimple.getStatus());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getGatewayErrorCode(), paymentJsonSimple.getGatewayErrorCode());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getGatewayErrorMsg(), paymentJsonSimple.getGatewayErrorMsg());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getPaymentMethodId(), paymentJsonSimple.getPaymentMethodId());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getExtFirstPaymentIdRef(), paymentJsonSimple.getExtFirstPaymentIdRef());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getExtSecondPaymentIdRef(), paymentJsonSimple.getExtSecondPaymentIdRef());
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getChargebacks().size(), 0);
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getRefunds().size(), 1);
+ Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getRefunds().get(0), refundJsonCheck);
}
private void verifyInvoice(final PaymentJsonSimple paymentJsonSimple, final BigDecimal expectedInvoiceBalance) throws IOException {