killbill-memoizeit

jaxrs: extend AccountTimelineJson Add refunds, chargebacks

7/17/2012 8:45:14 PM

Details

diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
index 866f64d..b8541b2 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
@@ -13,34 +13,35 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.jaxrs.json;
 
-import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.entitlement.api.timeline.BundleTimeline;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.api.InvoiceItemType;
+import com.ning.billing.invoice.api.InvoicePayment;
 import com.ning.billing.payment.api.Payment;
-import com.ning.billing.payment.api.PaymentStatus;
+import com.ning.billing.payment.api.Refund;
 
-public class AccountTimelineJson {
-
-    private final List<PaymentJsonWithBundleKeys> payments;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.Multimap;
 
-    private final List<InvoiceJsonWithBundleKeys> invoices;
+public class AccountTimelineJson {
 
     private final AccountJsonSimple account;
-
-
     private final List<BundleJsonWithSubscriptions> bundles;
+    private final List<InvoiceJsonWithBundleKeys> invoices;
+    private final List<PaymentJsonWithBundleKeys> payments;
 
     @JsonCreator
     public AccountTimelineJson(@JsonProperty("account") final AccountJsonSimple account,
@@ -84,59 +85,111 @@ public class AccountTimelineJson {
         return tmp.toString();
     }
 
-    public AccountTimelineJson(final Account account, final List<Invoice> invoices, final List<Payment> payments, final List<BundleTimeline> bundles) {
+    public AccountTimelineJson(final Account account, final List<Invoice> invoices, final List<Payment> payments, final List<BundleTimeline> bundles,
+                               final Multimap<UUID, Refund> refundsByPayment, final Multimap<UUID, InvoicePayment> chargebacksByPayment) {
         this.account = new AccountJsonSimple(account.getId().toString(), account.getExternalKey());
         this.bundles = new LinkedList<BundleJsonWithSubscriptions>();
         for (final BundleTimeline cur : bundles) {
             this.bundles.add(new BundleJsonWithSubscriptions(account.getId(), cur));
         }
+
         this.invoices = new LinkedList<InvoiceJsonWithBundleKeys>();
-        for (final Invoice cur : invoices) {
-            this.invoices.add(new InvoiceJsonWithBundleKeys(cur.getPaidAmount(),
-                                                            cur.getCBAAmount(),
-                                                            cur.getCreditAdjAmount(),
-                                                            cur.getRefundAdjAmount(),
-                                                            cur.getId().toString(),
-                                                            cur.getInvoiceDate(),
-                                                            cur.getTargetDate(),
-                                                            Integer.toString(cur.getInvoiceNumber()),
-                                                            cur.getBalance(),
-                                                            cur.getAccountId().toString(),
-                                                            getBundleExternalKey(cur, bundles)));
+        // Extract the credits from the invoices first
+        final List<CreditJson> credits = new ArrayList<CreditJson>();
+        for (final Invoice invoice : invoices) {
+            for (final InvoiceItem invoiceItem : invoice.getInvoiceItems()) {
+                if (InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType())) {
+                    credits.add(new CreditJson(invoiceItem, account.getTimeZone()));
+                }
+            }
+        }
+        // Create now the invoice json objects
+        for (final Invoice invoice : invoices) {
+            this.invoices.add(new InvoiceJsonWithBundleKeys(invoice.getPaidAmount(),
+                                                            invoice.getCBAAmount(),
+                                                            invoice.getCreditAdjAmount(),
+                                                            invoice.getRefundAdjAmount(),
+                                                            invoice.getId().toString(),
+                                                            invoice.getInvoiceDate(),
+                                                            invoice.getTargetDate(),
+                                                            Integer.toString(invoice.getInvoiceNumber()),
+                                                            invoice.getBalance(),
+                                                            invoice.getAccountId().toString(),
+                                                            getBundleExternalKey(invoice, bundles),
+                                                            credits));
         }
 
         this.payments = new LinkedList<PaymentJsonWithBundleKeys>();
-        for (final Payment cur : payments) {
-
-            final String status = cur.getPaymentStatus().toString();
-            this.payments.add(new PaymentJsonWithBundleKeys(cur.getAmount(), cur.getPaidAmount(), account.getId().toString(),
-                                                            cur.getInvoiceId().toString(), cur.getId().toString(),
-                                                            cur.getEffectiveDate(), cur.getEffectiveDate(),
-                                                            cur.getAttempts().size(), cur.getCurrency().toString(), status,
-                                                            getBundleExternalKey(cur.getInvoiceId(), invoices, bundles)));
+        for (final Payment payment : payments) {
+            final List<RefundJson> refunds = new ArrayList<RefundJson>();
+            for (final Refund refund : refundsByPayment.get(payment.getId())) {
+                refunds.add(new RefundJson(refund));
+            }
+
+            final List<ChargebackJson> chargebacks = new ArrayList<ChargebackJson>();
+            for (final InvoicePayment chargeback : chargebacksByPayment.get(payment.getId())) {
+                chargebacks.add(new ChargebackJson(chargeback));
+            }
+
+            final String status = payment.getPaymentStatus().toString();
+            this.payments.add(new PaymentJsonWithBundleKeys(payment.getAmount(), payment.getPaidAmount(), account.getId().toString(),
+                                                            payment.getInvoiceId().toString(), payment.getId().toString(),
+                                                            payment.getEffectiveDate(), payment.getEffectiveDate(),
+                                                            payment.getAttempts().size(), payment.getCurrency().toString(), status,
+                                                            getBundleExternalKey(payment.getInvoiceId(), invoices, bundles),
+                                                            refunds, chargebacks));
         }
     }
 
-    public AccountTimelineJson() {
-        this.account = null;
-        this.bundles = null;
-        this.invoices = null;
-        this.payments = null;
+    public AccountJsonSimple getAccount() {
+        return account;
     }
 
-    public List<PaymentJsonWithBundleKeys> getPayments() {
-        return payments;
+    public List<BundleJsonWithSubscriptions> getBundles() {
+        return bundles;
     }
 
     public List<InvoiceJsonWithBundleKeys> getInvoices() {
         return invoices;
     }
 
-    public AccountJsonSimple getAccount() {
-        return account;
+    public List<PaymentJsonWithBundleKeys> getPayments() {
+        return payments;
     }
 
-    public List<BundleJsonWithSubscriptions> getBundles() {
-        return bundles;
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("AccountTimelineJson");
+        sb.append("{account=").append(account);
+        sb.append(", bundles=").append(bundles);
+        sb.append(", invoices=").append(invoices);
+        sb.append(", payments=").append(payments);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        final AccountTimelineJson that = (AccountTimelineJson) o;
+
+        if (account != null ? !account.equals(that.account) : that.account != null) return false;
+        if (bundles != null ? !bundles.equals(that.bundles) : that.bundles != null) return false;
+        if (invoices != null ? !invoices.equals(that.invoices) : that.invoices != null) return false;
+        if (payments != null ? !payments.equals(that.payments) : that.payments != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = account != null ? account.hashCode() : 0;
+        result = 31 * result + (bundles != null ? bundles.hashCode() : 0);
+        result = 31 * result + (invoices != null ? invoices.hashCode() : 0);
+        result = 31 * result + (payments != null ? payments.hashCode() : 0);
+        return result;
     }
 }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
index 4c27655..5279507 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
@@ -1,16 +1,5 @@
-package com.ning.billing.jaxrs.json;
-
-import java.math.BigDecimal;
-
-import org.joda.time.LocalDate;
-
-import com.ning.billing.invoice.api.Invoice;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
 /*
- * 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
@@ -25,13 +14,28 @@ import com.fasterxml.jackson.annotation.JsonProperty;
  * under the License.
  */
 
+package com.ning.billing.jaxrs.json;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import org.joda.time.LocalDate;
+
+import com.ning.billing.invoice.api.Invoice;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.ImmutableList;
+
 public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
 
     private final String bundleKeys;
+    private final List<CreditJson> credits;
 
     public InvoiceJsonWithBundleKeys() {
         super();
         this.bundleKeys = null;
+        this.credits = ImmutableList.<CreditJson>of();
     }
 
     @JsonCreator
@@ -45,37 +49,47 @@ public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
                                      @JsonProperty("invoiceNumber") final String invoiceNumber,
                                      @JsonProperty("balance") final BigDecimal balance,
                                      @JsonProperty("accountId") final String accountId,
-                                     @JsonProperty("externalBundleKeys") final String bundleKeys) {
+                                     @JsonProperty("externalBundleKeys") final String bundleKeys,
+                                     @JsonProperty("credits") final List<CreditJson> credits) {
         super(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId);
         this.bundleKeys = bundleKeys;
+        this.credits = credits;
     }
 
-    public InvoiceJsonWithBundleKeys(final Invoice input, final String bundleKeys) {
+    public InvoiceJsonWithBundleKeys(final Invoice input, final String bundleKeys, final List<CreditJson> credits) {
         super(input);
         this.bundleKeys = bundleKeys;
+        this.credits = credits;
     }
 
     public String getBundleKeys() {
         return bundleKeys;
     }
 
+    public List<CreditJson> getCredits() {
+        return credits;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("InvoiceJsonWithBundleKeys");
+        sb.append("{bundleKeys='").append(bundleKeys).append('\'');
+        sb.append(", credits=").append(credits);
+        sb.append('}');
+        return sb.toString();
+    }
+
     @Override
     public boolean equals(final Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        if (!super.equals(o)) return false;
 
         final InvoiceJsonWithBundleKeys that = (InvoiceJsonWithBundleKeys) o;
 
-        if (bundleKeys != null ? !bundleKeys.equals(that.bundleKeys) : that.bundleKeys != null) {
-            return false;
-        }
+        if (bundleKeys != null ? !bundleKeys.equals(that.bundleKeys) : that.bundleKeys != null) return false;
+        if (credits != null ? !credits.equals(that.credits) : that.credits != null) return false;
 
         return true;
     }
@@ -84,6 +98,7 @@ public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
     public int hashCode() {
         int result = super.hashCode();
         result = 31 * result + (bundleKeys != null ? bundleKeys.hashCode() : 0);
+        result = 31 * result + (credits != null ? credits.hashCode() : 0);
         return result;
     }
 }
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 8032fa5..255cef2 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
@@ -17,18 +17,25 @@
 package com.ning.billing.jaxrs.json;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 import org.joda.time.DateTime;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.ImmutableList;
 
 public class PaymentJsonWithBundleKeys extends PaymentJsonSimple {
+
     private final String bundleKeys;
+    private final List<RefundJson> refunds;
+    private final List<ChargebackJson> chargebacks;
 
     public PaymentJsonWithBundleKeys() {
         super();
         this.bundleKeys = null;
+        this.refunds = ImmutableList.<RefundJson>of();
+        this.chargebacks = ImmutableList.<ChargebackJson>of();
     }
 
     @JsonCreator
@@ -42,12 +49,59 @@ public class PaymentJsonWithBundleKeys extends PaymentJsonSimple {
                                      @JsonProperty("retryCount") final Integer retryCount,
                                      @JsonProperty("currency") final String currency,
                                      @JsonProperty("status") final String status,
-                                     @JsonProperty("externalBundleKeys") final String bundleKeys) {
+                                     @JsonProperty("externalBundleKeys") final String bundleKeys,
+                                     @JsonProperty("refunds") final List<RefundJson> refunds,
+                                     @JsonProperty("chargebacks") final List<ChargebackJson> chargebacks) {
         super(amount, paidAmount, accountId, invoiceId, paymentId, requestedDate, effectiveDate, retryCount, currency, status);
         this.bundleKeys = bundleKeys;
+        this.refunds = refunds;
+        this.chargebacks = chargebacks;
     }
 
     public String getBundleKeys() {
         return bundleKeys;
     }
+
+    public List<RefundJson> getRefunds() {
+        return refunds;
+    }
+
+    public List<ChargebackJson> getChargebacks() {
+        return chargebacks;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("PaymentJsonWithBundleKeys");
+        sb.append("{bundleKeys='").append(bundleKeys).append('\'');
+        sb.append(", refunds=").append(refunds);
+        sb.append(", chargebacks=").append(chargebacks);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        if (!super.equals(o)) return false;
+
+        final PaymentJsonWithBundleKeys that = (PaymentJsonWithBundleKeys) o;
+
+        if (bundleKeys != null ? !bundleKeys.equals(that.bundleKeys) : that.bundleKeys != null) return false;
+        if (chargebacks != null ? !chargebacks.equals(that.chargebacks) : that.chargebacks != null) return false;
+        if (refunds != null ? !refunds.equals(that.refunds) : that.refunds != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (bundleKeys != null ? bundleKeys.hashCode() : 0);
+        result = 31 * result + (refunds != null ? refunds.hashCode() : 0);
+        result = 31 * result + (chargebacks != null ? chargebacks.hashCode() : 0);
+        return result;
+    }
 }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
index 0dec7e0..fd80946 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
@@ -16,12 +16,11 @@
 
 package com.ning.billing.jaxrs.resources;
 
-import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 import javax.ws.rs.Consumes;
@@ -42,10 +41,6 @@ import javax.ws.rs.core.UriInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
@@ -59,6 +54,8 @@ import com.ning.billing.entitlement.api.timeline.EntitlementTimelineApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.invoice.api.InvoiceUserApi;
 import com.ning.billing.jaxrs.json.AccountEmailJson;
 import com.ning.billing.jaxrs.json.AccountJson;
@@ -81,9 +78,20 @@ import com.ning.billing.util.api.CustomFieldUserApi;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.dao.ObjectType;
 
+import com.google.common.base.Function;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
 @Singleton
 @Path(JaxrsResource.ACCOUNTS_PATH)
 public class AccountResource extends JaxRsResourceBase {
+
     private static final Logger log = LoggerFactory.getLogger(AccountResource.class);
     private static final String ID_PARAM_NAME = "accountId";
     private static final String CUSTOM_FIELD_URI = JaxrsResource.CUSTOM_FIELDS;
@@ -93,6 +101,7 @@ public class AccountResource extends JaxRsResourceBase {
     private final EntitlementUserApi entitlementApi;
     private final EntitlementTimelineApi timelineApi;
     private final InvoiceUserApi invoiceApi;
+    private final InvoicePaymentApi invoicePaymentApi;
     private final PaymentApi paymentApi;
     private final Context context;
     private final JaxrsUriBuilder uriBuilder;
@@ -102,6 +111,7 @@ public class AccountResource extends JaxRsResourceBase {
                            final AccountUserApi accountApi,
                            final EntitlementUserApi entitlementApi,
                            final InvoiceUserApi invoiceApi,
+                           final InvoicePaymentApi invoicePaymentApi,
                            final PaymentApi paymentApi,
                            final EntitlementTimelineApi timelineApi,
                            final CustomFieldUserApi customFieldUserApi,
@@ -113,6 +123,7 @@ public class AccountResource extends JaxRsResourceBase {
         this.accountApi = accountApi;
         this.entitlementApi = entitlementApi;
         this.invoiceApi = invoiceApi;
+        this.invoicePaymentApi = invoicePaymentApi;
         this.paymentApi = paymentApi;
         this.timelineApi = timelineApi;
         this.context = context;
@@ -251,20 +262,41 @@ public class AccountResource extends JaxRsResourceBase {
     @GET
     @Path("/{accountId:" + UUID_PATTERN + "}/" + TIMELINE)
     @Produces(APPLICATION_JSON)
-    public Response getAccountTimeline(@PathParam("accountId") final String accountId) {
+    public Response getAccountTimeline(@PathParam("accountId") final String accountIdString) {
         try {
+            final UUID accountId = UUID.fromString(accountIdString);
+            final Account account = accountApi.getAccountById(accountId);
 
-            final Account account = accountApi.getAccountById(UUID.fromString(accountId));
-
+            // Get the invoices
             final List<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId());
-            final List<Payment> payments = paymentApi.getAccountPayments(UUID.fromString(accountId));
 
+            // Get the payments
+            final List<Payment> payments = paymentApi.getAccountPayments(accountId);
+
+            // Get the refunds
+            final List<Refund> refunds = paymentApi.getAccountRefunds(account);
+            final Multimap<UUID, Refund> refundsByPayment = ArrayListMultimap.<UUID, Refund>create();
+            for (final Refund refund : refunds) {
+                refundsByPayment.put(refund.getPaymentId(), refund);
+            }
+
+            // Get the chargebacks
+            final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(accountId);
+            final Multimap<UUID, InvoicePayment> chargebacksByPayment = ArrayListMultimap.<UUID, InvoicePayment>create();
+            for (final InvoicePayment chargeback : chargebacks) {
+                chargebacksByPayment.put(chargeback.getPaymentId(), chargeback);
+            }
+
+            // Get the bundles
             final List<SubscriptionBundle> bundles = entitlementApi.getBundlesForAccount(account.getId());
             final List<BundleTimeline> bundlesTimeline = new LinkedList<BundleTimeline>();
             for (final SubscriptionBundle cur : bundles) {
                 bundlesTimeline.add(timelineApi.getBundleRepair(cur.getId()));
             }
-            final AccountTimelineJson json = new AccountTimelineJson(account, invoices, payments, bundlesTimeline);
+
+            final AccountTimelineJson json = new AccountTimelineJson(account, invoices, payments, bundlesTimeline,
+                                                                     refundsByPayment, chargebacksByPayment);
+
             return Response.status(Status.OK).entity(json).build();
         } catch (AccountApiException e) {
             if (e.getCode() == ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID.getCode()) {
@@ -439,7 +471,6 @@ public class AccountResource extends JaxRsResourceBase {
         }
     }
 
-
     /*
      * ************************** REFUNDS ********************************
      */
@@ -450,7 +481,7 @@ public class AccountResource extends JaxRsResourceBase {
 
         try {
             final Account account = accountApi.getAccountById(UUID.fromString(accountId));
-            List<Refund> refunds =  paymentApi.getAccountRefunds(account);
+            List<Refund> refunds = paymentApi.getAccountRefunds(account);
             List<RefundJson> result = new ArrayList<RefundJson>(Collections2.transform(refunds, new Function<Refund, RefundJson>() {
                 @Override
                 public RefundJson apply(Refund input) {
@@ -469,8 +500,6 @@ public class AccountResource extends JaxRsResourceBase {
         }
     }
 
-
-
     /*
      * *************************      CUSTOM FIELDS     *****************************
      */
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java
index 642313a..5c2ca0b 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java
@@ -17,8 +17,10 @@
 package com.ning.billing.jaxrs.json;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.mockito.Mockito;
 import org.testng.Assert;
@@ -32,6 +34,7 @@ import com.ning.billing.util.clock.DefaultClock;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.datatype.joda.JodaModule;
+import com.google.common.collect.ImmutableList;
 
 public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
 
@@ -57,8 +60,11 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
         final BigDecimal balance = BigDecimal.ZERO;
         final String accountId = UUID.randomUUID().toString();
         final String bundleKeys = UUID.randomUUID().toString();
+        CreditJson creditJson = createCreditJson();
+        final List<CreditJson> credits = ImmutableList.<CreditJson>of(creditJson);
         final InvoiceJsonWithBundleKeys invoiceJsonSimple = new InvoiceJsonWithBundleKeys(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate,
-                                                                                          targetDate, invoiceNumber, balance, accountId, bundleKeys);
+                                                                                          targetDate, invoiceNumber, balance, accountId, bundleKeys,
+                                                                                          credits);
         Assert.assertEquals(invoiceJsonSimple.getAmount(), amount);
         Assert.assertEquals(invoiceJsonSimple.getCBA(), cba);
         Assert.assertEquals(invoiceJsonSimple.getCreditAdj(), creditAdj);
@@ -70,6 +76,7 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
         Assert.assertEquals(invoiceJsonSimple.getBalance(), balance);
         Assert.assertEquals(invoiceJsonSimple.getAccountId(), accountId);
         Assert.assertEquals(invoiceJsonSimple.getBundleKeys(), bundleKeys);
+        Assert.assertEquals(invoiceJsonSimple.getCredits(), credits);
 
         final String asJson = mapper.writeValueAsString(invoiceJsonSimple);
         Assert.assertEquals(asJson, "{\"amount\":" + invoiceJsonSimple.getAmount().toString() + "," +
@@ -82,6 +89,14 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
                                     "\"invoiceNumber\":\"" + invoiceJsonSimple.getInvoiceNumber() + "\"," +
                                     "\"balance\":" + invoiceJsonSimple.getBalance().toString() + "," +
                                     "\"accountId\":\"" + invoiceJsonSimple.getAccountId() + "\"," +
+                                    "\"credits\":[" +
+                                    "{\"creditAmount\":" + creditJson.getCreditAmount() + "," +
+                                    "\"invoiceId\":\"" + creditJson.getInvoiceId().toString() + "\"," +
+                                    "\"invoiceNumber\":\"" + creditJson.getInvoiceNumber() + "\"," +
+                                    "\"requestedDate\":\"" + creditJson.getRequestedDate().toDateTimeISO().toString() + "\"," +
+                                    "\"effectiveDate\":\"" + creditJson.getEffectiveDate().toDateTimeISO().toString() + "\"," +
+                                    "\"reason\":\"" + creditJson.getReason() + "\"," +
+                                    "\"accountId\":\"" + creditJson.getAccountId().toString() + "\"}]," +
                                     "\"bundleKeys\":\"" + invoiceJsonSimple.getBundleKeys() + "\"}");
 
         final InvoiceJsonWithBundleKeys fromJson = mapper.readValue(asJson, InvoiceJsonWithBundleKeys.class);
@@ -103,8 +118,9 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
         Mockito.when(invoice.getAccountId()).thenReturn(UUID.randomUUID());
 
         final String bundleKeys = UUID.randomUUID().toString();
+        final List<CreditJson> credits = ImmutableList.<CreditJson>of(createCreditJson());
 
-        final InvoiceJsonWithBundleKeys invoiceJsonWithBundleKeys = new InvoiceJsonWithBundleKeys(invoice, bundleKeys);
+        final InvoiceJsonWithBundleKeys invoiceJsonWithBundleKeys = new InvoiceJsonWithBundleKeys(invoice, bundleKeys, credits);
         Assert.assertEquals(invoiceJsonWithBundleKeys.getAmount(), invoice.getChargedAmount());
         Assert.assertEquals(invoiceJsonWithBundleKeys.getCBA(), invoice.getCBAAmount());
         Assert.assertEquals(invoiceJsonWithBundleKeys.getCreditAdj(), invoice.getCreditAdjAmount());
@@ -116,5 +132,17 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
         Assert.assertEquals(invoiceJsonWithBundleKeys.getBalance(), invoice.getBalance());
         Assert.assertEquals(invoiceJsonWithBundleKeys.getAccountId(), invoice.getAccountId().toString());
         Assert.assertEquals(invoiceJsonWithBundleKeys.getBundleKeys(), bundleKeys);
+        Assert.assertEquals(invoiceJsonWithBundleKeys.getCredits(), credits);
+    }
+
+    private CreditJson createCreditJson() {
+        final BigDecimal creditAmount = BigDecimal.TEN;
+        final UUID invoiceId = UUID.randomUUID();
+        final String invoiceNumber = UUID.randomUUID().toString();
+        final DateTime requestedDate = clock.getUTCNow();
+        final DateTime effectiveDate = clock.getUTCNow();
+        final String reason = UUID.randomUUID().toString();
+        final UUID accountId = UUID.randomUUID();
+        return new CreditJson(creditAmount, invoiceId, invoiceNumber, requestedDate, effectiveDate, reason, accountId);
     }
 }