killbill-memoizeit
Changes
invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java 25(+12 -13)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java 28(+22 -6)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java 13(+12 -1)
invoice/src/main/resources/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.sql.stg 82(+0 -82)
invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java 41(+33 -8)
invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java 105(+73 -32)
invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java 336(+336 -0)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/GenericProRationTests.java 1(+0 -1)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java 21(+10 -11)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java 23(+11 -12)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java 16(+8 -8)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java 31(+15 -16)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/GenericProRationTests.java 1(+0 -1)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java 21(+10 -11)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java 24(+12 -12)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java 39(+19 -20)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java 15(+7 -8)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java 1(+0 -1)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/GenericProRationTests.java 1(+0 -1)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java 22(+11 -11)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java 23(+11 -12)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java 39(+19 -20)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java 15(+7 -8)
Details
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
index 31591c6..beab7d6 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
@@ -58,7 +58,8 @@ public class BusinessInvoice {
}
public BusinessInvoice(final String accountKey, final Invoice invoice) {
- this(accountKey, invoice.getAmountCharged(), invoice.getAmountCredited(), invoice.getAmountPaid(), invoice.getBalance(),
+ // STEPH this is probably not what we want (CBA versus credit)
+ this(accountKey, invoice.getChargedAmount(), invoice.getCBAAmount(), invoice.getPaidAmount(), invoice.getBalance(),
new DateTime(DateTimeZone.UTC), invoice.getCurrency(), invoice.getInvoiceDate(), invoice.getId(), invoice.getTargetDate(),
new DateTime(DateTimeZone.UTC));
}
diff --git a/api/src/main/java/com/ning/billing/ErrorCode.java b/api/src/main/java/com/ning/billing/ErrorCode.java
index 0cda076..bc20699 100644
--- a/api/src/main/java/com/ning/billing/ErrorCode.java
+++ b/api/src/main/java/com/ning/billing/ErrorCode.java
@@ -184,7 +184,7 @@ public enum ErrorCode {
INVOICE_TARGET_DATE_TOO_FAR_IN_THE_FUTURE(4005, "The target date was too far in the future. Target Date: %s"),
INVOICE_NOT_FOUND(4006, "No invoice could be found for id %s."),
INVOICE_NOTHING_TO_DO(4007, "No invoice to generate for account %s and date %s"),
-
+
/*
*
* Range 4900: Invoice payment
@@ -193,21 +193,25 @@ public enum ErrorCode {
INVOICE_PAYMENT_NOT_FOUND(4900, "No invoice payment could be found for id %s."),
CHARGE_BACK_AMOUNT_TOO_HIGH(4901, "Tried to charge back %s of a %s payment."),
CHARGE_BACK_AMOUNT_IS_NEGATIVE(4902, "Charge backs for negative amounts are not permitted"),
- CHARGE_BACK_COULD_NOT_FIND_ACCOUNT_ID(4093, "Could not find chargeback for id %s."),
- CHARGE_BACK_DOES_NOT_EXIST(4093, "Could not find chargeback for id %s."),
+ CHARGE_BACK_COULD_NOT_FIND_ACCOUNT_ID(4003, "Could not find chargeback for id %s."),
+ CHARGE_BACK_DOES_NOT_EXIST(4004, "Could not find chargeback for id %s."),
+ INVOICE_PAYMENT_BY_ATTEMPT_NOT_FOUND(4905, "No invoice payment could be found for paymentAttempt id %s."),
+ REFUND_AMOUNT_TOO_HIGH(4906, "Tried to refund %s of a %s payment."),
+ REFUND_AMOUNT_IS_POSITIVE(4907, "Refund for positve amounts are not permitted"),
+
/*
- *
+ *
* Range 5000: Overdue system
- *
+ *
*/
OVERDUE_CAT_ERROR_ENCOUNTERED(5001, "Catalog error encountered on Overdueable: id='%s', type='%s'"),
OVERDUE_TYPE_NOT_SUPPORTED(5002, "Overdue of this type is not supported: id='%s', type='%s'"),
OVERDUE_NO_REEVALUATION_INTERVAL(5003, "No valid reevaluation interval for state (name: %s)"),
OVERDUE_NOT_CONFIGURED(5004, "No configuration was found for the overdue system"),
/*
- *
+ *
* Range 6000: Blocking system
- *
+ *
*/
BLOCK_BLOCKED_ACTION(6000, "The action %s is block on this %s with id=%s"),
BLOCK_TYPE_NOT_SUPPORTED(6001, "The Blockable type '%s' is not supported"),
diff --git a/api/src/main/java/com/ning/billing/invoice/api/Invoice.java b/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
index 8fbf0cf..460f962 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
@@ -56,11 +56,17 @@ public interface Invoice extends Entity {
DateTime getLastPaymentAttempt();
- BigDecimal getAmountPaid();
+ BigDecimal getPaidAmount();
- BigDecimal getAmountCharged();
+ BigDecimal getChargedAmount();
- BigDecimal getAmountCredited();
+ BigDecimal getCBAAmount();
+
+ BigDecimal getTotalAdjAmount();
+
+ BigDecimal getCreditAdjAmount();
+
+ BigDecimal getRefundAdjAmount();
BigDecimal getBalance();
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceItem.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceItem.java
index ca7f7af..6c5cbef 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceItem.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceItem.java
@@ -25,29 +25,32 @@ import com.ning.billing.catalog.api.Currency;
import com.ning.billing.util.entity.Entity;
public interface InvoiceItem extends Entity, Comparable<InvoiceItem> {
+
+ InvoiceItemType getInvoiceItemType();
+
UUID getInvoiceId();
UUID getAccountId();
- UUID getBundleId();
+ DateTime getStartDate();
- UUID getSubscriptionId();
+ DateTime getEndDate();
- String getPlanName();
+ BigDecimal getAmount();
- String getPhaseName();
+ Currency getCurrency();
String getDescription();
- DateTime getStartDate();
+ UUID getBundleId();
- DateTime getEndDate();
+ UUID getSubscriptionId();
- BigDecimal getAmount();
+ String getPlanName();
- Currency getCurrency();
+ String getPhaseName();
- InvoiceItemType getInvoiceItemType();
+ BigDecimal getRate();
- InvoiceItem asReversingItem();
+ UUID getLinkedItemId();
}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceItemType.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceItemType.java
index aaae9df..93afad8 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceItemType.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceItemType.java
@@ -19,9 +19,8 @@ package com.ning.billing.invoice.api;
public enum InvoiceItemType {
FIXED,
RECURRING,
- REVERSAL,
- MIGRATION,
- REFUND,
- CHARGE_BACK,
- CREDIT
+ REPAIR_ADJ,
+ CBA_ADJ,
+ CREDIT_ADJ,
+ REFUND_ADJ
}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoicePayment.java b/api/src/main/java/com/ning/billing/invoice/api/InvoicePayment.java
index 4a04248..880fc2b 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoicePayment.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoicePayment.java
@@ -27,6 +27,8 @@ import com.ning.billing.util.entity.Entity;
public interface InvoicePayment extends Entity {
UUID getPaymentAttemptId();
+ InvoicePaymentType getType();
+
UUID getInvoiceId();
DateTime getPaymentAttemptDate();
@@ -35,10 +37,11 @@ public interface InvoicePayment extends Entity {
Currency getCurrency();
- UUID getReversedInvoicePaymentId();
+ UUID getLinkedInvoicePaymentId();
- /*
- * @param chargeBackAmount BigDecimal pass the amount as a positive number
- */
- InvoicePayment asChargeBack(BigDecimal chargeBackAmount, DateTime chargeBackDate) throws InvoiceApiException;
+ public enum InvoicePaymentType {
+ ATTEMPT,
+ CHARGED_BACK,
+ REFUND
+ }
}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoicePaymentApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoicePaymentApi.java
index 9c6eb69..a71783a 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoicePaymentApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoicePaymentApi.java
@@ -42,11 +42,11 @@ public interface InvoicePaymentApi {
public void notifyOfPaymentAttempt(UUID invoiceId, BigDecimal amountOutstanding, Currency currency, UUID paymentAttemptId, DateTime paymentAttemptDate, CallContext context);
- public void notifyOfPaymentAttempt(UUID invoiceId, UUID paymentAttemptId, DateTime paymentAttemptDate, CallContext context);
+ public InvoicePayment createRefund(UUID paymentAttemptId, BigDecimal amount, boolean isInvoiceAdjusted, CallContext context) throws InvoiceApiException;
- public InvoicePayment processChargeback(UUID invoicePaymentId, BigDecimal amount, CallContext context) throws InvoiceApiException;
+ public InvoicePayment createChargeback(UUID invoicePaymentId, BigDecimal amount, CallContext context) throws InvoiceApiException;
- public InvoicePayment processChargeback(UUID invoicePaymentId, CallContext context) throws InvoiceApiException;
+ public InvoicePayment createChargeback(UUID invoicePaymentId, CallContext context) throws InvoiceApiException;
public BigDecimal getRemainingAmountPaid(UUID invoicePaymentId);
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
index d95f56d..a3ef34c 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
@@ -51,7 +51,10 @@ public interface InvoiceUserApi {
public InvoiceItem getCreditById(UUID creditId) throws InvoiceApiException;
public InvoiceItem insertCredit(UUID accountId, BigDecimal amount, DateTime effectiveDate,
- Currency currency, CallContext context) throws InvoiceApiException;
+ Currency currency, CallContext context) throws InvoiceApiException;
+
+ public InvoiceItem insertCreditForInvoice(UUID accountId, UUID invoiceId, BigDecimal amount, DateTime effectiveDate,
+ Currency currency, CallContext context) throws InvoiceApiException;
public String getInvoiceAsHTML(UUID invoiceId) throws AccountApiException, IOException, InvoiceApiException;
}
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java b/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java
index 571630f..400da99 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java
@@ -128,11 +128,11 @@ public class TestPlanAligner {
// Laser-Scope is START_OF_SUBSCRIPTION aligned on creation
Assert.assertEquals(phases[0].getStartPhase(), subscriptionData.getStartDate());
- Assert.assertEquals(phases[1].getStartPhase(), subscriptionData.getStartDate().plusDays(30));
+ Assert.assertEquals(phases[1].getStartPhase(), subscriptionData.getStartDate().plusMonths(1));
// Verify the next phase via the other API
final TimedPhase nextTimePhase = planAligner.getNextTimedPhase(subscriptionData, effectiveDate, effectiveDate);
- Assert.assertEquals(nextTimePhase.getStartPhase(), subscriptionData.getStartDate().plusDays(30));
+ Assert.assertEquals(nextTimePhase.getStartPhase(), subscriptionData.getStartDate().plusMonths(1));
// Now look at the past, before the subscription started
final DateTime effectiveDateInThePast = subscriptionData.getStartDate().minusHours(10);
@@ -150,7 +150,7 @@ public class TestPlanAligner {
// Try a change plan (simulate END_OF_TERM policy)
final String newProductName = "telescopic-scope-monthly";
- final DateTime effectiveChangeDate = subscriptionData.getStartDate().plusDays(30);
+ final DateTime effectiveChangeDate = subscriptionData.getStartDate().plusMonths(1);
changeSubscription(effectiveChangeDate, subscriptionData, productName, newProductName, initialPhase);
// All non rescue plans are START_OF_SUBSCRIPTION aligned on change. Since we're END_OF_TERM here, we'll
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
index a93ee28..a73fab7 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
@@ -28,6 +28,7 @@ import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
import com.ning.billing.invoice.api.InvoicePaymentApi;
import com.ning.billing.invoice.dao.InvoiceDao;
import com.ning.billing.invoice.model.DefaultInvoicePayment;
@@ -69,27 +70,18 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
@Override
public void notifyOfPaymentAttempt(final UUID invoiceId, final BigDecimal amount, final Currency currency, final UUID paymentAttemptId, final DateTime paymentAttemptDate, final CallContext context) {
- final InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate, amount, currency);
+ final InvoicePayment invoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentAttemptId, invoiceId, paymentAttemptDate, amount, currency);
dao.notifyOfPaymentAttempt(invoicePayment, context);
}
@Override
- public void notifyOfPaymentAttempt(final UUID invoiceId, final UUID paymentAttemptId, final DateTime paymentAttemptDate, final CallContext context) {
- final InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate);
- dao.notifyOfPaymentAttempt(invoicePayment, context);
- }
-
- @Override
- public InvoicePayment processChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
+ public InvoicePayment createChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
return dao.postChargeback(invoicePaymentId, amount, context);
}
@Override
- public InvoicePayment processChargeback(final UUID invoicePaymentId, final CallContext context) throws InvoiceApiException {
- // use the invoicePaymentId to get the amount remaining on the payment
- // (preventing charge backs totalling more than the payment)
- final BigDecimal amount = dao.getRemainingAmountPaid(invoicePaymentId);
- return processChargeback(invoicePaymentId, amount, context);
+ public InvoicePayment createChargeback(final UUID invoicePaymentId, final CallContext context) throws InvoiceApiException {
+ return createChargeback(invoicePaymentId, null, context);
}
@Override
@@ -116,4 +108,11 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
public UUID getAccountIdFromInvoicePaymentId(final UUID invoicePaymentId) throws InvoiceApiException {
return dao.getAccountIdFromInvoicePaymentId(invoicePaymentId);
}
+
+ @Override
+ public InvoicePayment createRefund(UUID paymentAttemptId,
+ BigDecimal amount, boolean isInvoiceAdjusted, CallContext context)
+ throws InvoiceApiException {
+ return dao.createRefund(paymentAttemptId, amount, isInvoiceAdjusted, context);
+ }
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 4245ba8..88d67fd 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -115,10 +115,18 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
@Override
public InvoiceItem insertCredit(final UUID accountId, final BigDecimal amount, final DateTime effectiveDate,
final Currency currency, final CallContext context) throws InvoiceApiException {
- return dao.insertCredit(accountId, amount, effectiveDate, currency, context);
+ return dao.insertCredit(accountId, null, amount, effectiveDate, currency, context);
}
@Override
+ public InvoiceItem insertCreditForInvoice(UUID accountId, UUID invoiceId,
+ BigDecimal amount, DateTime effectiveDate, Currency currency,
+ CallContext context) throws InvoiceApiException {
+ return dao.insertCredit(accountId, invoiceId, amount, effectiveDate, currency, context);
+ }
+
+
+ @Override
public String getInvoiceAsHTML(final UUID invoiceId) throws AccountApiException, IOException, InvoiceApiException {
final Invoice invoice = getInvoice(invoiceId);
if (invoice == null) {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index 7102051..c0539a9 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -18,25 +18,38 @@ package com.ning.billing.invoice.dao;
import java.math.BigDecimal;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
+import org.joda.time.field.ZeroIsMaxDateTimeField;
import org.skife.jdbi.v2.IDBI;
import org.skife.jdbi.v2.Transaction;
import org.skife.jdbi.v2.TransactionStatus;
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
import com.google.inject.Inject;
import com.ning.billing.ErrorCode;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceApiException;
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.invoice.model.CreditInvoiceItem;
+import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
+import com.ning.billing.invoice.model.CreditAdjInvoiceItem;
+import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
import com.ning.billing.invoice.model.DefaultInvoice;
+import com.ning.billing.invoice.model.DefaultInvoicePayment;
import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
import com.ning.billing.invoice.model.RecurringInvoiceItem;
+import com.ning.billing.invoice.model.RefundAdjInvoiceItem;
import com.ning.billing.invoice.notification.NextBillingDatePoster;
import com.ning.billing.util.ChangeType;
import com.ning.billing.util.api.TagApiException;
@@ -50,17 +63,18 @@ import com.ning.billing.util.tag.ControlTagType;
public class DefaultInvoiceDao implements InvoiceDao {
private final InvoiceSqlDao invoiceSqlDao;
private final InvoicePaymentSqlDao invoicePaymentSqlDao;
- private final CreditInvoiceItemSqlDao creditInvoiceItemSqlDao;
private final TagUserApi tagUserApi;
private final NextBillingDatePoster nextBillingDatePoster;
+ private final InvoiceItemSqlDao invoiceItemSqlDao;
+
@Inject
public DefaultInvoiceDao(final IDBI dbi,
final NextBillingDatePoster nextBillingDatePoster,
final TagUserApi tagUserApi) {
this.invoiceSqlDao = dbi.onDemand(InvoiceSqlDao.class);
this.invoicePaymentSqlDao = dbi.onDemand(InvoicePaymentSqlDao.class);
- this.creditInvoiceItemSqlDao = dbi.onDemand(CreditInvoiceItemSqlDao.class);
+ this.invoiceItemSqlDao = dbi.onDemand(InvoiceItemSqlDao.class);
this.nextBillingDatePoster = nextBillingDatePoster;
this.tagUserApi = tagUserApi;
}
@@ -71,9 +85,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
@Override
public List<Invoice> inTransaction(final InvoiceSqlDao invoiceDao, final TransactionStatus status) throws Exception {
final List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId.toString());
-
populateChildren(invoices, invoiceDao);
-
return invoices;
}
});
@@ -84,11 +96,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
return invoiceSqlDao.inTransaction(new Transaction<List<Invoice>, InvoiceSqlDao>() {
@Override
public List<Invoice> inTransaction(final InvoiceSqlDao invoiceDao, final TransactionStatus status) throws Exception {
- final List<Invoice> invoices = invoiceDao.getAllInvoicesByAccount(accountId.toString());
-
- populateChildren(invoices, invoiceDao);
-
- return invoices;
+ return getAllInvoicesByAccountFromTransaction(accountId, invoiceDao);
}
});
}
@@ -143,7 +151,6 @@ public class DefaultInvoiceDao implements InvoiceDao {
@Override
public Void inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
- // STEPH this seems useless
final Invoice currentInvoice = transactional.getById(invoice.getId().toString());
if (currentInvoice == null) {
@@ -155,25 +162,15 @@ public class DefaultInvoiceDao implements InvoiceDao {
List<Long> recordIdList;
- final List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
- final RecurringInvoiceItemSqlDao recurringInvoiceItemDao = transactional.become(RecurringInvoiceItemSqlDao.class);
- recurringInvoiceItemDao.batchCreateFromTransaction(recurringInvoiceItems, context);
- recordIdList = recurringInvoiceItemDao.getRecordIds(invoice.getId().toString());
- audits.addAll(createAudits(TableName.RECURRING_INVOICE_ITEMS, recordIdList));
+ final List<InvoiceItem> invoiceItems = invoice.getInvoiceItems();
+ final InvoiceItemSqlDao transInvoiceItemSqlDao = transactional.become(InvoiceItemSqlDao.class);
+ transInvoiceItemSqlDao.batchCreateFromTransaction(invoiceItems, context);
+ recordIdList = transInvoiceItemSqlDao.getRecordIds(invoice.getId().toString());
+ audits.addAll(createAudits(TableName.INVOICE_ITEMS, recordIdList));
- notifyOfFutureBillingEvents(transactional, recurringInvoiceItems);
+ List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
- final List<InvoiceItem> fixedPriceInvoiceItems = invoice.getInvoiceItems(FixedPriceInvoiceItem.class);
- final FixedPriceInvoiceItemSqlDao fixedPriceInvoiceItemDao = transactional.become(FixedPriceInvoiceItemSqlDao.class);
- fixedPriceInvoiceItemDao.batchCreateFromTransaction(fixedPriceInvoiceItems, context);
- recordIdList = fixedPriceInvoiceItemDao.getRecordIds(invoice.getId().toString());
- audits.addAll(createAudits(TableName.FIXED_INVOICE_ITEMS, recordIdList));
-
- final List<InvoiceItem> creditInvoiceItems = invoice.getInvoiceItems(CreditInvoiceItem.class);
- final CreditInvoiceItemSqlDao creditInvoiceItemSqlDao = transactional.become(CreditInvoiceItemSqlDao.class);
- creditInvoiceItemSqlDao.batchCreateFromTransaction(creditInvoiceItems, context);
- recordIdList = creditInvoiceItemSqlDao.getRecordIds(invoice.getId().toString());
- audits.addAll(createAudits(TableName.CREDIT_INVOICE_ITEMS, recordIdList));
+ notifyOfFutureBillingEvents(transactional, recurringInvoiceItems);
final List<InvoicePayment> invoicePayments = invoice.getPayments();
final InvoicePaymentSqlDao invoicePaymentSqlDao = transactional.become(InvoicePaymentSqlDao.class);
@@ -214,9 +211,35 @@ public class DefaultInvoiceDao implements InvoiceDao {
@Override
public BigDecimal getAccountBalance(final UUID accountId) {
- return invoiceSqlDao.getAccountBalance(accountId.toString());
+
+ return invoiceSqlDao.inTransaction(new Transaction<BigDecimal, InvoiceSqlDao>() {
+ @Override
+ public BigDecimal inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+
+ BigDecimal cba = BigDecimal.ZERO;
+
+ BigDecimal accountBalance = BigDecimal.ZERO;
+ List<Invoice> invoices = getAllInvoicesByAccountFromTransaction(accountId, transactional);
+ for (Invoice cur : invoices) {
+ accountBalance = accountBalance.add(cur.getBalance());
+ cba = cba.add(cur.getCBAAmount());
+ }
+ return accountBalance.subtract(cba);
+ }
+ });
+ }
+
+ @Override
+ public BigDecimal getAccountCBA(final UUID accountId) {
+ return invoiceSqlDao.inTransaction(new Transaction<BigDecimal, InvoiceSqlDao>() {
+ @Override
+ public BigDecimal inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+ return getAccountCBAFromTransaction(accountId, transactional);
+ }
+ });
}
+
@Override
public void notifyOfPaymentAttempt(final InvoicePayment invoicePayment, final CallContext context) {
invoicePaymentSqlDao.inTransaction(new Transaction<Void, InvoicePaymentSqlDao>() {
@@ -239,11 +262,15 @@ public class DefaultInvoiceDao implements InvoiceDao {
return invoiceSqlDao.inTransaction(new Transaction<List<Invoice>, InvoiceSqlDao>() {
@Override
public List<Invoice> inTransaction(final InvoiceSqlDao invoiceDao, final TransactionStatus status) throws Exception {
- final List<Invoice> invoices = invoiceSqlDao.getUnpaidInvoicesByAccountId(accountId.toString(), upToDate.toDate());
-
- populateChildren(invoices, invoiceDao);
- return invoices;
+ List<Invoice> invoices = getAllInvoicesByAccountFromTransaction(accountId, invoiceDao);
+ Collection<Invoice> unpaidInvoices = Collections2.filter(invoices, new Predicate<Invoice>() {
+ @Override
+ public boolean apply(Invoice in) {
+ return (in.getBalance().compareTo(BigDecimal.ZERO) >= 1) && !in.getTargetDate().isAfter(upToDate);
+ }
+ });
+ return new ArrayList<Invoice>(unpaidInvoices);
}
});
}
@@ -268,22 +295,95 @@ public class DefaultInvoiceDao implements InvoiceDao {
tagUserApi.removeTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.toTagDefinition(), context);
}
+
+ @Override
+ public InvoicePayment createRefund(final UUID paymentAttemptId,
+ final BigDecimal amount, final boolean isInvoiceAdjusted, final CallContext context)
+ throws InvoiceApiException {
+
+ return invoicePaymentSqlDao.inTransaction(new Transaction<InvoicePayment, InvoicePaymentSqlDao>() {
+ @Override
+ public InvoicePayment inTransaction(final InvoicePaymentSqlDao transactional, final TransactionStatus status) throws Exception {
+ final InvoicePayment payment = transactional.getByPaymentAttemptId(paymentAttemptId.toString());
+ if (payment == null) {
+ throw new InvoiceApiException(ErrorCode.INVOICE_PAYMENT_BY_ATTEMPT_NOT_FOUND, paymentAttemptId);
+ }
+ final BigDecimal maxRefundAmount = payment.getAmount() == null ? BigDecimal.ZERO : payment.getAmount();
+ final BigDecimal requestedAmount = amount == null ? maxRefundAmount : amount;
+ if (requestedAmount.compareTo(BigDecimal.ZERO) >= 0) {
+ throw new InvoiceApiException(ErrorCode.REFUND_AMOUNT_IS_POSITIVE);
+ }
+
+ // No that we check signs, let's work with positive numbers, this makes things simpler
+ final BigDecimal requestedPositiveAmount = requestedAmount.negate();
+ if (requestedPositiveAmount.compareTo(maxRefundAmount) > 0) {
+ throw new InvoiceApiException(ErrorCode.REFUND_AMOUNT_TOO_HIGH, requestedPositiveAmount, maxRefundAmount);
+ }
+
+
+ final InvoicePayment refund = new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.REFUND, paymentAttemptId,
+ payment.getInvoiceId(), context.getCreatedDate(), requestedPositiveAmount.negate(), payment.getCurrency(), payment.getId());
+ transactional.create(refund, context);
+
+ // Retrieve invoice after the Refund
+ InvoiceSqlDao transInvoiceDao = transactional.become(InvoiceSqlDao.class);
+ Invoice invoice = transInvoiceDao.getById(payment.getInvoiceId().toString());
+ if (invoice != null) {
+ populateChildren(invoice, transInvoiceDao);
+ }
+
+ final BigDecimal invoiceBalanceAfterRefund = invoice.getBalance();
+ InvoiceItemSqlDao transInvoiceItemDao = transInvoiceDao.become(InvoiceItemSqlDao.class);
+
+ // If we have an existing CBA > 0, we need to adjust it
+ //final BigDecimal cbaAmountAfterRefund = invoice.getCBAAmount();
+ final BigDecimal accountCbaAvailable = getAccountCBAFromTransaction(invoice.getAccountId(), transInvoiceDao);
+ BigDecimal cbaAdjAmount = BigDecimal.ZERO;
+ if (accountCbaAvailable.compareTo(BigDecimal.ZERO) > 0) {
+ cbaAdjAmount = (requestedPositiveAmount.compareTo(accountCbaAvailable) > 0) ? accountCbaAvailable.negate() : requestedPositiveAmount.negate();
+ final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate(), cbaAdjAmount, invoice.getCurrency());
+ transInvoiceItemDao.create(cbaAdjItem, context);
+ }
+ final BigDecimal requestedPositiveAmountAfterCbaAdj = requestedPositiveAmount.add(cbaAdjAmount);
+
+ if (isInvoiceAdjusted) {
+
+ BigDecimal maxBalanceToAdjust = (invoiceBalanceAfterRefund.compareTo(BigDecimal.ZERO) <= 0) ? BigDecimal.ZERO : invoiceBalanceAfterRefund;
+ BigDecimal requestedPositiveAmountToAdjust = requestedPositiveAmountAfterCbaAdj.compareTo(maxBalanceToAdjust) > 0 ? maxBalanceToAdjust : requestedPositiveAmountAfterCbaAdj;
+ if (requestedPositiveAmountToAdjust.compareTo(BigDecimal.ZERO) > 0) {
+ final InvoiceItem adjItem = new RefundAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate(), requestedPositiveAmountToAdjust.negate(), invoice.getCurrency());
+ transInvoiceItemDao.create(adjItem, context);
+ }
+ }
+ return refund;
+ }
+ });
+ }
+
+
@Override
public InvoicePayment postChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
+
return invoicePaymentSqlDao.inTransaction(new Transaction<InvoicePayment, InvoicePaymentSqlDao>() {
@Override
public InvoicePayment inTransaction(final InvoicePaymentSqlDao transactional, final TransactionStatus status) throws Exception {
+
+ final BigDecimal maxChargedBackAmount = getRemainingAmountPaidFromTransaction(invoicePaymentId, transactional);
+ final BigDecimal requestedChargedBackAmout = (amount == null) ? maxChargedBackAmount : amount;
+ if (requestedChargedBackAmout.compareTo(BigDecimal.ZERO) <= 0) {
+ throw new InvoiceApiException(ErrorCode.CHARGE_BACK_AMOUNT_IS_NEGATIVE);
+ }
+ if (requestedChargedBackAmout.compareTo(maxChargedBackAmount) > 0) {
+ throw new InvoiceApiException(ErrorCode.CHARGE_BACK_AMOUNT_TOO_HIGH, requestedChargedBackAmout, maxChargedBackAmount);
+ }
+
final InvoicePayment payment = invoicePaymentSqlDao.getById(invoicePaymentId.toString());
if (payment == null) {
throw new InvoiceApiException(ErrorCode.INVOICE_PAYMENT_NOT_FOUND, invoicePaymentId.toString());
} else {
- if (amount.compareTo(BigDecimal.ZERO) < 0) {
- throw new InvoiceApiException(ErrorCode.CHARGE_BACK_AMOUNT_IS_NEGATIVE);
- }
-
- final InvoicePayment chargeBack = payment.asChargeBack(amount, context.getCreatedDate());
+ final InvoicePayment chargeBack = new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.CHARGED_BACK, null,
+ payment.getInvoiceId(), context.getCreatedDate(), requestedChargedBackAmout.negate(), payment.getCurrency(), payment.getId());
invoicePaymentSqlDao.create(chargeBack, context);
-
return chargeBack;
}
}
@@ -292,8 +392,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
@Override
public BigDecimal getRemainingAmountPaid(final UUID invoicePaymentId) {
- final BigDecimal amount = invoicePaymentSqlDao.getRemainingAmountPaid(invoicePaymentId.toString());
- return amount == null ? BigDecimal.ZERO : amount;
+ return getRemainingAmountPaidFromTransaction(invoicePaymentId, invoicePaymentSqlDao);
}
@Override
@@ -328,21 +427,29 @@ public class DefaultInvoiceDao implements InvoiceDao {
@Override
public InvoiceItem getCreditById(final UUID creditId) throws InvoiceApiException {
- return creditInvoiceItemSqlDao.getById(creditId.toString());
+ return invoiceItemSqlDao.getById(creditId.toString());
}
- // TODO: make this transactional
@Override
- public InvoiceItem insertCredit(final UUID accountId, final BigDecimal amount,
- final DateTime effectiveDate, final Currency currency,
- final CallContext context) {
- final Invoice invoice = new DefaultInvoice(accountId, effectiveDate, effectiveDate, currency);
- invoiceSqlDao.create(invoice, context);
-
- final InvoiceItem credit = new CreditInvoiceItem(invoice.getId(), accountId, effectiveDate, amount, currency);
- creditInvoiceItemSqlDao.create(credit, context);
+ public InvoiceItem insertCredit(final UUID accountId, final UUID invoiceId, final BigDecimal amount,
+ final DateTime effectiveDate, final Currency currency,
+ final CallContext context) {
- return credit;
+ return invoiceSqlDao.inTransaction(new Transaction<InvoiceItem, InvoiceSqlDao>() {
+ @Override
+ public InvoiceItem inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+ UUID invoiceIdForRefund = invoiceId;
+ if (invoiceIdForRefund == null) {
+ final Invoice invoiceForRefund = new DefaultInvoice(accountId, effectiveDate, effectiveDate, currency);
+ transactional.create(invoiceForRefund, context);
+ invoiceIdForRefund = invoiceForRefund.getId();
+ }
+ final InvoiceItem credit = new CreditAdjInvoiceItem(invoiceIdForRefund, accountId, effectiveDate, amount, currency);
+ InvoiceItemSqlDao transInvoiceItemDao = transactional.become(InvoiceItemSqlDao.class);
+ transInvoiceItemDao.create(credit, context);
+ return credit;
+ }
+ });
}
@Override
@@ -350,6 +457,16 @@ public class DefaultInvoiceDao implements InvoiceDao {
invoiceSqlDao.test();
}
+ private BigDecimal getAccountCBAFromTransaction(final UUID accountId, final InvoiceSqlDao transactional) {
+ BigDecimal cba = BigDecimal.ZERO;
+ List<Invoice> invoices = getAllInvoicesByAccountFromTransaction(accountId, transactional);
+ for (Invoice cur : invoices) {
+ cba = cba.add(cur.getCBAAmount());
+ }
+ return cba;
+ }
+
+
private void populateChildren(final Invoice invoice, final InvoiceSqlDao invoiceSqlDao) {
getInvoiceItemsWithinTransaction(invoice, invoiceSqlDao);
getInvoicePaymentsWithinTransaction(invoice, invoiceSqlDao);
@@ -360,26 +477,32 @@ public class DefaultInvoiceDao implements InvoiceDao {
getInvoicePaymentsWithinTransaction(invoices, invoiceSqlDao);
}
+ private List<Invoice> getAllInvoicesByAccountFromTransaction(final UUID accountId, final InvoiceSqlDao transactional) {
+ final List<Invoice> invoices = transactional.getAllInvoicesByAccount(accountId.toString());
+ populateChildren(invoices, transactional);
+ return invoices;
+ }
+
+
+ private BigDecimal getRemainingAmountPaidFromTransaction(final UUID invoicePaymentId, final InvoicePaymentSqlDao transactional) {
+ final BigDecimal amount = transactional.getRemainingAmountPaid(invoicePaymentId.toString());
+ return amount == null ? BigDecimal.ZERO : amount;
+ }
+
+
+
private void getInvoiceItemsWithinTransaction(final List<Invoice> invoices, final InvoiceSqlDao invoiceDao) {
for (final Invoice invoice : invoices) {
getInvoiceItemsWithinTransaction(invoice, invoiceDao);
}
}
- private void getInvoiceItemsWithinTransaction(final Invoice invoice, final InvoiceSqlDao invoiceDao) {
+ private void getInvoiceItemsWithinTransaction(final Invoice invoice, final InvoiceSqlDao transactional) {
final String invoiceId = invoice.getId().toString();
- final RecurringInvoiceItemSqlDao recurringInvoiceItemDao = invoiceDao.become(RecurringInvoiceItemSqlDao.class);
- final List<InvoiceItem> recurringInvoiceItems = recurringInvoiceItemDao.getInvoiceItemsByInvoice(invoiceId);
- invoice.addInvoiceItems(recurringInvoiceItems);
-
- final FixedPriceInvoiceItemSqlDao fixedPriceInvoiceItemDao = invoiceDao.become(FixedPriceInvoiceItemSqlDao.class);
- final List<InvoiceItem> fixedPriceInvoiceItems = fixedPriceInvoiceItemDao.getInvoiceItemsByInvoice(invoiceId);
- invoice.addInvoiceItems(fixedPriceInvoiceItems);
-
- final CreditInvoiceItemSqlDao creditInvoiceItemSqlDao = invoiceDao.become(CreditInvoiceItemSqlDao.class);
- final List<InvoiceItem> creditInvoiceItems = creditInvoiceItemSqlDao.getInvoiceItemsByInvoice(invoiceId);
- invoice.addInvoiceItems(creditInvoiceItems);
+ final InvoiceItemSqlDao transInvoiceItemSqlDao = transactional.become(InvoiceItemSqlDao.class);
+ final List<InvoiceItem> items = transInvoiceItemSqlDao.getInvoiceItemsByInvoice(invoiceId);
+ invoice.addInvoiceItems(items);
}
private void getInvoicePaymentsWithinTransaction(final List<Invoice> invoices, final InvoiceSqlDao invoiceDao) {
@@ -397,7 +520,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
private void notifyOfFutureBillingEvents(final InvoiceSqlDao dao, final List<InvoiceItem> invoiceItems) {
for (final InvoiceItem item : invoiceItems) {
- if (item instanceof RecurringInvoiceItem) {
+ if (item.getInvoiceItemType() == InvoiceItemType.RECURRING) {
final RecurringInvoiceItem recurringInvoiceItem = (RecurringInvoiceItem) item;
if ((recurringInvoiceItem.getEndDate() != null) &&
(recurringInvoiceItem.getAmount() == null ||
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
index 888295a..209285b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
@@ -31,6 +31,7 @@ import com.ning.billing.util.api.TagApiException;
import com.ning.billing.util.callcontext.CallContext;
public interface InvoiceDao {
+
void create(Invoice invoice, CallContext context);
Invoice getById(final UUID id);
@@ -51,6 +52,8 @@ public interface InvoiceDao {
BigDecimal getAccountBalance(final UUID accountId);
+ public BigDecimal getAccountCBA(final UUID accountId);
+
List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate);
void test();
@@ -63,6 +66,9 @@ public interface InvoiceDao {
InvoicePayment postChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException;
+ InvoicePayment createRefund(UUID paymentAttemptId,
+ BigDecimal amount, boolean isInvoiceAdjusted, CallContext context) throws InvoiceApiException;
+
BigDecimal getRemainingAmountPaid(final UUID invoicePaymentId);
UUID getAccountIdFromInvoicePaymentId(final UUID invoicePaymentId) throws InvoiceApiException;
@@ -75,7 +81,8 @@ public interface InvoiceDao {
InvoiceItem getCreditById(final UUID creditId) throws InvoiceApiException;
- InvoiceItem insertCredit(final UUID accountId, final BigDecimal amount,
+ InvoiceItem insertCredit(final UUID accountId, final UUID invoiceId, final BigDecimal amount,
final DateTime effectiveDate, final Currency currency,
final CallContext context);
+
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
index 8b12f8d..ed5b2c3 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
@@ -45,6 +45,7 @@ import org.skife.jdbi.v2.tweak.ResultSetMapper;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
import com.ning.billing.invoice.model.DefaultInvoicePayment;
import com.ning.billing.util.callcontext.CallContext;
import com.ning.billing.util.callcontext.CallContextBinder;
@@ -61,11 +62,13 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
List<Long> getRecordIds(@Bind("invoiceId") final String invoiceId);
@SqlQuery
- public InvoicePayment getByPaymentAttemptId(@Bind("paymentAttempt") final String paymentAttemptId);
+ public InvoicePayment getByPaymentAttemptId(@Bind("paymentAttemptId") final String paymentAttemptId);
+ @Override
@SqlQuery
public List<InvoicePayment> get();
+ @Override
@SqlUpdate
public void create(@InvoicePaymentBinder final InvoicePayment invoicePayment,
@CallContextBinder final CallContext context);
@@ -101,16 +104,17 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
@Override
public InvoicePayment map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
final UUID id = getUUID(result, "id");
+ final InvoicePaymentType type = InvoicePaymentType.valueOf(result.getString("type"));
final UUID paymentAttemptId = getUUID(result, "payment_attempt_id");
final UUID invoiceId = getUUID(result, "invoice_id");
final DateTime paymentAttemptDate = getDate(result, "payment_attempt_date");
final BigDecimal amount = result.getBigDecimal("amount");
final String currencyString = result.getString("currency");
final Currency currency = (currencyString == null) ? null : Currency.valueOf(currencyString);
- final UUID reversedInvoicePaymentId = getUUID(result, "reversed_invoice_Payment_id");
+ final UUID linkedInvoicePaymentId = getUUID(result, "linked_invoice_payment_id");
- return new DefaultInvoicePayment(id, paymentAttemptId, invoiceId, paymentAttemptDate,
- amount, currency, reversedInvoicePaymentId);
+ return new DefaultInvoicePayment(id, type, paymentAttemptId, invoiceId, paymentAttemptDate,
+ amount, currency, linkedInvoicePaymentId);
}
}
@@ -125,13 +129,14 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
@Override
public void bind(final SQLStatement q, final InvoicePaymentBinder bind, final InvoicePayment payment) {
q.bind("id", payment.getId().toString());
+ q.bind("type", payment.getType().toString());
q.bind("invoiceId", payment.getInvoiceId().toString());
q.bind("paymentAttemptId", uuidToString(payment.getPaymentAttemptId()));
q.bind("paymentAttemptDate", payment.getPaymentAttemptDate().toDate());
q.bind("amount", payment.getAmount());
final Currency currency = payment.getCurrency();
q.bind("currency", (currency == null) ? null : currency.toString());
- q.bind("reversedInvoicePaymentId", uuidToString(payment.getReversedInvoicePaymentId()));
+ q.bind("linkedInvoicePaymentId", uuidToString(payment.getLinkedInvoicePaymentId()));
}
};
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
index 21fe8d5..3de924b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
@@ -77,13 +77,6 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
@RegisterMapper(UuidMapper.class)
UUID getInvoiceIdByPaymentAttemptId(@Bind("paymentAttemptId") final String paymentAttemptId);
- @SqlQuery
- @RegisterMapper(BalanceMapper.class)
- BigDecimal getAccountBalance(@Bind("accountId") final String accountId);
-
- @SqlQuery
- List<Invoice> getUnpaidInvoicesByAccountId(@Bind("accountId") final String accountId,
- @Bind("upToDate") final Date upToDate);
@BindingAnnotation(InvoiceBinder.InvoiceBinderFactory.class)
@Retention(RetentionPolicy.RUNTIME)
@@ -121,23 +114,5 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
return new DefaultInvoice(id, accountId, invoiceNumber, invoiceDate, targetDate, currency, isMigrationInvoice);
}
}
-
- public static class BalanceMapper implements ResultSetMapper<BigDecimal> {
- @Override
- public BigDecimal map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
- BigDecimal amountInvoiced = result.getBigDecimal("amount_invoiced");
- BigDecimal amountPaid = result.getBigDecimal("amount_paid");
-
- if (amountInvoiced == null) {
- amountInvoiced = BigDecimal.ZERO;
- }
-
- if (amountPaid == null) {
- amountPaid = BigDecimal.ZERO;
- }
-
- return amountInvoiced.subtract(amountPaid);
- }
- }
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
index 918bfa2..7ed75e1 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
@@ -36,8 +36,8 @@ import com.ning.billing.invoice.api.test.InvoiceTestApi;
import com.ning.billing.invoice.api.user.DefaultInvoiceUserApi;
import com.ning.billing.invoice.dao.DefaultInvoiceDao;
import com.ning.billing.invoice.dao.InvoiceDao;
-import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
-import com.ning.billing.invoice.model.InvoiceGenerator;
+import com.ning.billing.invoice.generator.DefaultInvoiceGenerator;
+import com.ning.billing.invoice.generator.InvoiceGenerator;
import com.ning.billing.invoice.notification.DefaultNextBillingDateNotifier;
import com.ning.billing.invoice.notification.DefaultNextBillingDatePoster;
import com.ning.billing.invoice.notification.EmailInvoiceNotifier;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
index 314816a..1f747e5 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -44,8 +44,8 @@ import com.ning.billing.invoice.api.InvoiceNotifier;
import com.ning.billing.invoice.api.user.DefaultEmptyInvoiceEvent;
import com.ning.billing.invoice.api.user.DefaultInvoiceCreationEvent;
import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.invoice.generator.InvoiceGenerator;
import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
-import com.ning.billing.invoice.model.InvoiceGenerator;
import com.ning.billing.invoice.model.RecurringInvoiceItem;
import com.ning.billing.junction.api.BillingApi;
import com.ning.billing.junction.api.BillingEventSet;
@@ -56,7 +56,7 @@ import com.ning.billing.util.callcontext.CallContext;
import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.globallocker.GlobalLock;
import com.ning.billing.util.globallocker.GlobalLocker;
-import com.ning.billing.util.globallocker.GlobalLocker.LockerService;
+import com.ning.billing.util.globallocker.GlobalLocker.LockerType;
import com.ning.billing.util.globallocker.LockFailedException;
public class InvoiceDispatcher {
@@ -123,7 +123,7 @@ public class InvoiceDispatcher {
final boolean dryRun, final CallContext context) throws InvoiceApiException {
GlobalLock lock = null;
try {
- lock = locker.lockWithNumberOfTries(LockerService.INVOICE, accountId.toString(), NB_LOCK_TRY);
+ lock = locker.lockWithNumberOfTries(LockerType.ACCOUNT, accountId.toString(), NB_LOCK_TRY);
return processAccountWithLock(accountId, targetDate, dryRun, context);
} catch (LockFailedException e) {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java
new file mode 100644
index 0000000..bbc06da
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2010-2011 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
+ * 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.
+ */
+package com.ning.billing.invoice.model;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoiceItemType;
+
+public class CreditAdjInvoiceItem extends AdjInvoiceItem {
+
+ public CreditAdjInvoiceItem(UUID invoiceId, UUID accountId, DateTime date,
+ BigDecimal amount, Currency currency) {
+ super(invoiceId, accountId, date, date, amount, currency);
+ }
+
+ public CreditAdjInvoiceItem(UUID id, UUID invoiceId, UUID accountId, DateTime date,
+ BigDecimal amount, Currency currency) {
+ super(id, invoiceId, accountId, date, date, amount, currency);
+ }
+
+ @Override
+ public InvoiceItemType getInvoiceItemType() {
+ return InvoiceItemType.CREDIT_ADJ;
+ }
+
+ @Override
+ public String getDescription() {
+ return "credit-adj";
+ }
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
new file mode 100644
index 0000000..f32bc72
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2010-2011 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
+ * 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.
+ */
+
+package com.ning.billing.invoice.model;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoiceItemType;
+
+public class CreditBalanceAdjInvoiceItem extends AdjInvoiceItem {
+
+ public CreditBalanceAdjInvoiceItem(UUID invoiceId, UUID accountId,
+ DateTime date, BigDecimal amount, Currency currency) {
+ super(invoiceId, accountId, date, date, amount, currency);
+ }
+
+ public CreditBalanceAdjInvoiceItem(UUID id, UUID invoiceId, UUID accountId,
+ DateTime date, BigDecimal amount, Currency currency) {
+ super(id, invoiceId, accountId, date, date, amount, currency);
+ }
+
+
+ @Override
+ public InvoiceItemType getInvoiceItemType() {
+ return InvoiceItemType.CBA_ADJ;
+ }
+
+ @Override
+ public String getDescription() {
+ return "cba-adj";
+ }
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
index c636ada..797b228 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
@@ -162,7 +162,7 @@ public class DefaultInvoice extends EntityBase implements Invoice {
}
@Override
- public BigDecimal getAmountPaid() {
+ public BigDecimal getPaidAmount() {
BigDecimal amountPaid = BigDecimal.ZERO;
for (final InvoicePayment payment : payments) {
if (payment.getAmount() != null) {
@@ -173,19 +173,33 @@ public class DefaultInvoice extends EntityBase implements Invoice {
}
@Override
- public BigDecimal getAmountCharged() {
- return invoiceItems.getAmountCharged();
+ public BigDecimal getChargedAmount() {
+ return invoiceItems.getChargedAmount();
}
@Override
- public BigDecimal getAmountCredited() {
- return invoiceItems.getAmountCredited();
+ public BigDecimal getCBAAmount() {
+ return invoiceItems.getCBAAmount();
}
@Override
+ public BigDecimal getTotalAdjAmount() {
+ return invoiceItems.getTotalAdjAmount();
+ }
+
+ @Override
+ public BigDecimal getCreditAdjAmount() {
+ return invoiceItems.getCreditAdjAmount();
+ }
+
+ @Override
+ public BigDecimal getRefundAdjAmount() {
+ return invoiceItems.getRefundAdjAmount();
+ }
+ @Override
public BigDecimal getBalance() {
- // credits offset payments
- return getAmountCharged().subtract(getAmountPaid().subtract(getAmountCredited()));
+ final BigDecimal balance = getChargedAmount().add(getTotalAdjAmount()).add(getCBAAmount()).subtract(getPaidAmount());;
+ return balance;
}
@Override
@@ -200,7 +214,8 @@ public class DefaultInvoice extends EntityBase implements Invoice {
@Override
public String toString() {
- return "DefaultInvoice [items=" + invoiceItems + ", payments=" + payments + ", id=" + id + ", accountId=" + accountId + ", invoiceDate=" + invoiceDate + ", targetDate=" + targetDate + ", currency=" + currency + ", amountPaid=" + getAmountPaid() + ", lastPaymentAttempt=" + getLastPaymentAttempt() + "]";
+ return "DefaultInvoice [items=" + invoiceItems + ", payments=" + payments + ", id=" + id + ", accountId=" + accountId + ", invoiceDate=" + invoiceDate + ", targetDate=" + targetDate + ", currency=" + currency + ", amountPaid=" + getPaidAmount() + ", lastPaymentAttempt=" + getLastPaymentAttempt() + "]";
}
+
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
index db80be0..08371ed 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
@@ -22,33 +22,29 @@ import java.util.UUID;
import org.joda.time.DateTime;
-import com.ning.billing.ErrorCode;
import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.util.entity.EntityBase;
public class DefaultInvoicePayment extends EntityBase implements InvoicePayment {
private final UUID paymentAttemptId;
+ private final InvoicePaymentType type;
private final UUID invoiceId;
private final DateTime paymentDate;
private final BigDecimal amount;
private final Currency currency;
private final UUID reversedInvoicePaymentId;
- public DefaultInvoicePayment(final UUID paymentAttemptId, final UUID invoiceId, final DateTime paymentDate) {
- this(UUID.randomUUID(), paymentAttemptId, invoiceId, paymentDate, null, null, null);
- }
-
- public DefaultInvoicePayment(final UUID paymentAttemptId, final UUID invoiceId, final DateTime paymentDate,
+ public DefaultInvoicePayment(final InvoicePaymentType type, final UUID paymentAttemptId, final UUID invoiceId, final DateTime paymentDate,
final BigDecimal amount, final Currency currency) {
- this(UUID.randomUUID(), paymentAttemptId, invoiceId, paymentDate, amount, currency, null);
+ this(UUID.randomUUID(), type, paymentAttemptId, invoiceId, paymentDate, amount, currency, null);
}
- public DefaultInvoicePayment(final UUID id, final UUID paymentAttemptId, final UUID invoiceId, final DateTime paymentDate,
+ public DefaultInvoicePayment(final UUID id, final InvoicePaymentType type, final UUID paymentAttemptId, final UUID invoiceId, final DateTime paymentDate,
@Nullable final BigDecimal amount, @Nullable final Currency currency,
@Nullable final UUID reversedInvoicePaymentId) {
super(id);
+ this.type = type;
this.paymentAttemptId = paymentAttemptId;
this.amount = amount;
this.invoiceId = invoiceId;
@@ -58,6 +54,11 @@ public class DefaultInvoicePayment extends EntityBase implements InvoicePayment
}
@Override
+ public InvoicePaymentType getType() {
+ return type;
+ }
+
+ @Override
public UUID getPaymentAttemptId() {
return paymentAttemptId;
}
@@ -83,16 +84,7 @@ public class DefaultInvoicePayment extends EntityBase implements InvoicePayment
}
@Override
- public UUID getReversedInvoicePaymentId() {
+ public UUID getLinkedInvoicePaymentId() {
return reversedInvoicePaymentId;
}
-
- @Override
- public InvoicePayment asChargeBack(final BigDecimal chargeBackAmount, final DateTime chargeBackDate) throws InvoiceApiException {
- if (chargeBackAmount.compareTo(amount) > 0) {
- throw new InvoiceApiException(ErrorCode.CHARGE_BACK_AMOUNT_TOO_HIGH, chargeBackAmount, amount);
- }
-
- return new DefaultInvoicePayment(UUID.randomUUID(), null, invoiceId, chargeBackDate, chargeBackAmount.negate(), currency, id);
- }
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
index 9176230..d8ac06b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
@@ -30,17 +30,12 @@ public class FixedPriceInvoiceItem extends InvoiceItemBase {
public FixedPriceInvoiceItem(final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, @Nullable final UUID subscriptionId, final String planName, final String phaseName,
final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
- super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.FIXED);
+ super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
}
public FixedPriceInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
- super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.FIXED);
- }
-
- @Override
- public InvoiceItem asReversingItem() {
- throw new UnsupportedOperationException();
+ super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
}
@Override
@@ -151,4 +146,9 @@ public class FixedPriceInvoiceItem extends InvoiceItemBase {
return true;
}
+
+ @Override
+ public InvoiceItemType getInvoiceItemType() {
+ return InvoiceItemType.FIXED;
+ }
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java b/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java
index 3fcff90..e6132d4 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java
@@ -137,7 +137,6 @@ public class InAdvanceBillingMode implements BillingMode {
DateTime proposedDate = tmp.toDateTime();
while (proposedDate.isBefore(date)) {
- // STEPH could be an annual ?
proposedDate = proposedDate.plusMonths(1);
}
return proposedDate;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
index 89bd1a3..842e4d9 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
@@ -28,28 +28,93 @@ import com.ning.billing.invoice.api.InvoiceItemType;
import com.ning.billing.util.entity.EntityBase;
public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem {
+
+ /* Common to all items */
protected final UUID invoiceId;
protected final UUID accountId;
- protected final UUID subscriptionId;
- protected final UUID bundleId;
- protected final String planName;
- protected final String phaseName;
protected final DateTime startDate;
protected final DateTime endDate;
protected final BigDecimal amount;
protected final Currency currency;
- protected final InvoiceItemType invoiceItemType;
+ /* Fixed and recurring specific */
+ protected final UUID subscriptionId;
+ protected final UUID bundleId;
+ protected final String planName;
+ protected final String phaseName;
+
+ /* Recurring specific */
+ protected final BigDecimal rate;
+
+ /* RepairAdjInvoiceItem */
+ protected final UUID linkedItemId;
+
+
+ @Override
+ public String toString() {
+ return getInvoiceItemType() + ": [startDate=" + startDate + ", endDate="
+ + endDate + ", amount=" + amount + ", currency=" + currency
+ + ", invoiceId=" + invoiceId
+ + ", subscriptionId=" + subscriptionId + ", planName="
+ + planName + ", phaseName=" + phaseName + ", rate=" + rate
+ + ", linkedItemId=" + linkedItemId + "]";
+ }
+
+ /*
+ * CTOR without ID; called from generator when creating invoice item
+ */
+ // No rate and no reversing item
+ public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
+ final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
+ this(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency);
+
+ }
+
+ // With rate but no reversing item
public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final InvoiceItemType invoiceItemType) {
+ final DateTime startDate, final DateTime endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency) {
this(UUID.randomUUID(), invoiceId, accountId, bundleId, subscriptionId, planName, phaseName,
- startDate, endDate, amount, currency, invoiceItemType);
+ startDate, endDate, amount, rate, currency, null);
}
+ // With reversing item, no rate
+ public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
+ final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final UUID reversedItemId) {
+ this(UUID.randomUUID(), invoiceId, accountId, bundleId, subscriptionId, planName, phaseName,
+ startDate, endDate, amount, null, currency, reversedItemId);
+ }
+
+
+
+ /*
+ * CTORs with ID; called from DAO when rehydrating
+ */
+ // No rate and no reversing item
+ public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
+ @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
+ final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
+ this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency, null);
+ }
+
+ // With rate but no reversing item
+ public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
+ @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
+ final DateTime startDate, final DateTime endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency) {
+ this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency, null);
+ }
+
+ // With reversing item, no rate
public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
- @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency,
- final InvoiceItemType invoiceItemType) {
+ @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
+ final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final UUID reversedItemId) {
+ this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency, reversedItemId);
+ }
+
+
+ private InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
+ @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
+ final DateTime startDate, final DateTime endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency,
+ UUID reversedItemId) {
super(id);
this.invoiceId = invoiceId;
this.accountId = accountId;
@@ -61,7 +126,8 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem
this.endDate = endDate;
this.amount = amount;
this.currency = currency;
- this.invoiceItemType = invoiceItemType;
+ this.rate = rate;
+ this.linkedItemId = reversedItemId;
}
@Override
@@ -74,6 +140,7 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem
return bundleId;
}
+ @Override
public UUID getAccountId() {
return accountId;
}
@@ -114,16 +181,22 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem
}
@Override
- public InvoiceItemType getInvoiceItemType() {
- return invoiceItemType;
+ public BigDecimal getRate() {
+ return rate;
}
@Override
- public abstract InvoiceItem asReversingItem();
+ public UUID getLinkedItemId() {
+ return linkedItemId;
+ }
+
+ @Override
+ public abstract InvoiceItemType getInvoiceItemType();
@Override
public abstract String getDescription();
@Override
public abstract int compareTo(InvoiceItem invoiceItem);
+
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java
index 265f518..3b495a4 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java
@@ -18,11 +18,16 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.api.InvoiceItemType;
public class InvoiceItemList extends ArrayList<InvoiceItem> {
+
+ private static final long serialVersionUID = 192311667L;
+
private static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
private static final int ROUNDING_METHOD = InvoicingConfiguration.getRoundingMode();
@@ -35,33 +40,45 @@ public class InvoiceItemList extends ArrayList<InvoiceItem> {
this.addAll(invoiceItems);
}
- public BigDecimal getAmountCharged() {
- // naive implementation, assumes all invoice items share the same currency
- BigDecimal total = BigDecimal.ZERO.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+ public BigDecimal getTotalAdjAmount() {
+ return getAmoutForItems(InvoiceItemType.CREDIT_ADJ, InvoiceItemType.REFUND_ADJ);
+ }
- for (final InvoiceItem item : this) {
- if (!(item instanceof CreditInvoiceItem)) {
- if (item.getAmount() != null) {
- total = total.add(item.getAmount());
- }
- }
- }
+ public BigDecimal getCreditAdjAmount() {
+ return getAmoutForItems(InvoiceItemType.CREDIT_ADJ);
+ }
- return total.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+ public BigDecimal getRefundAdjAmount() {
+ return getAmoutForItems(InvoiceItemType.REFUND_ADJ);
+ }
+
+ public BigDecimal getChargedAmount() {
+ return getAmoutForItems(InvoiceItemType.RECURRING, InvoiceItemType.FIXED, InvoiceItemType.REPAIR_ADJ);
+ }
+
+ public BigDecimal getCBAAmount() {
+ return getAmoutForItems(InvoiceItemType.CBA_ADJ);
}
- public BigDecimal getAmountCredited() {
- // naive implementation, assumes all invoice items share the same currency
- BigDecimal total = BigDecimal.ZERO.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+ private BigDecimal getAmoutForItems(InvoiceItemType...types) {
+ BigDecimal total = BigDecimal.ZERO.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
for (final InvoiceItem item : this) {
- if (item instanceof CreditInvoiceItem) {
+ if (isFromType(item, types)) {
if (item.getAmount() != null) {
total = total.add(item.getAmount());
}
}
}
-
return total.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
}
+
+ private boolean isFromType(InvoiceItem item, InvoiceItemType...types) {
+ for (InvoiceItemType cur : types) {
+ if (item.getInvoiceItemType() == cur) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
index 9c9dcb9..23ac57b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
@@ -30,16 +30,13 @@ import com.ning.billing.invoice.api.InvoiceItemType;
public class RecurringInvoiceItem extends InvoiceItemBase {
private final DateTimeFormatter dateTimeFormatter = DateTimeFormat.mediumDate();
- private final BigDecimal rate;
- private final UUID reversedItemId;
+
public RecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
final DateTime startDate, final DateTime endDate,
final BigDecimal amount, final BigDecimal rate,
final Currency currency) {
- super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.RECURRING);
- this.rate = rate;
- this.reversedItemId = null;
+ super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
}
public RecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
@@ -47,9 +44,7 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
final BigDecimal amount, final BigDecimal rate,
final Currency currency, final UUID reversedItemId) {
super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate,
- amount, currency, InvoiceItemType.REVERSAL);
- this.rate = rate;
- this.reversedItemId = reversedItemId;
+ amount, rate, currency);
}
public RecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
@@ -57,42 +52,25 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
final DateTime startDate, final DateTime endDate,
final BigDecimal amount, final BigDecimal rate,
final Currency currency) {
- super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.RECURRING);
- this.rate = rate;
- this.reversedItemId = null;
- }
-
- public RecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
- final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate,
- final BigDecimal amount, final BigDecimal rate,
- final Currency currency, final UUID reversedItemId) {
- super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.REVERSAL);
- this.rate = rate;
- this.reversedItemId = reversedItemId;
+ super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
}
- @Override
- public InvoiceItem asReversingItem() {
- final BigDecimal amountNegated = amount == null ? null : amount.negate();
-
- return new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate,
- amountNegated, rate, currency, id);
- }
@Override
public String getDescription() {
return String.format("%s from %s to %s", phaseName, startDate.toString(dateTimeFormatter), endDate.toString(dateTimeFormatter));
}
- public UUID getReversedItemId() {
- return reversedItemId;
+ @Override
+ public UUID getLinkedItemId() {
+ return linkedItemId;
}
public boolean reversesItem() {
- return (reversedItemId != null);
+ return (linkedItemId != null);
}
+ @Override
public BigDecimal getRate() {
return rate;
}
@@ -167,7 +145,7 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
if (rate.compareTo(that.rate) != 0) {
return false;
}
- if (reversedItemId != null ? !reversedItemId.equals(that.reversedItemId) : that.reversedItemId != null) {
+ if (linkedItemId != null ? !linkedItemId.equals(that.linkedItemId) : that.linkedItemId != null) {
return false;
}
if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null) {
@@ -192,22 +170,14 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
result = 31 * result + amount.hashCode();
result = 31 * result + rate.hashCode();
result = 31 * result + currency.hashCode();
- result = 31 * result + invoiceItemType.hashCode();
- result = 31 * result + (reversedItemId != null ? reversedItemId.hashCode() : 0);
+ result = 31 * result + getInvoiceItemType().hashCode();
+ result = 31 * result + (linkedItemId != null ? linkedItemId.hashCode() : 0);
return result;
}
@Override
- public String toString() {
- final StringBuilder sb = new StringBuilder();
-
- sb.append(phaseName).append(", ");
- sb.append(startDate.toString()).append(", ");
- sb.append(endDate.toString()).append(", ");
- sb.append(amount.toString()).append(", ");
- sb.append("subscriptionId = ").append(subscriptionId == null ? null : subscriptionId.toString()).append(", ");
- sb.append("bundleId = ").append(bundleId == null ? null : bundleId.toString()).append(", ");
-
- return sb.toString();
+ public InvoiceItemType getInvoiceItemType() {
+ return InvoiceItemType.RECURRING;
}
+
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java
new file mode 100644
index 0000000..6eac357
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2010-2011 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
+ * 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.
+ */
+package com.ning.billing.invoice.model;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoiceItemType;
+
+public class RefundAdjInvoiceItem extends AdjInvoiceItem {
+
+ public RefundAdjInvoiceItem(UUID invoiceId, UUID accountId, DateTime date,
+ BigDecimal amount, Currency currency) {
+ super(invoiceId, accountId, date, date, amount, currency);
+ }
+
+ public RefundAdjInvoiceItem(UUID id, UUID invoiceId, UUID accountId, DateTime date,
+ BigDecimal amount, Currency currency) {
+ super(id, invoiceId, accountId, date, date, amount, currency);
+ }
+
+ @Override
+ public InvoiceItemType getInvoiceItemType() {
+ return InvoiceItemType.REFUND_ADJ;
+ }
+
+ @Override
+ public String getDescription() {
+ return "refund-adj";
+ }
+
+
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java
new file mode 100644
index 0000000..1ea8ef4
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2010-2011 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
+ * 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.
+ */
+package com.ning.billing.invoice.model;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoiceItemType;
+
+public class RepairAdjInvoiceItem extends AdjInvoiceItem {
+
+ public RepairAdjInvoiceItem(UUID invoiceId, UUID accountId, DateTime startDate, DateTime endDate,
+ BigDecimal amount, Currency currency, final UUID reversingId) {
+ super(invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
+ }
+
+ public RepairAdjInvoiceItem(UUID id, UUID invoiceId, UUID accountId, DateTime startDate, DateTime endDate,
+ BigDecimal amount, Currency currency, final UUID reversingId) {
+ super(id, invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
+ }
+
+ @Override
+ public InvoiceItemType getInvoiceItemType() {
+ return InvoiceItemType.REPAIR_ADJ;
+ }
+
+ @Override
+ public String getDescription() {
+ return "repair-adj";
+ }
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
index 6ed5713..55a2e8f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
@@ -121,15 +121,16 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
}
@Override
- public BigDecimal getAmountCharged() {
- return invoice.getAmountCharged();
+ public BigDecimal getChargedAmount() {
+ return invoice.getChargedAmount();
}
@Override
- public BigDecimal getAmountCredited() {
- return invoice.getAmountCredited();
+ public BigDecimal getCBAAmount() {
+ return invoice.getCBAAmount();
}
+
@Override
public BigDecimal getBalance() {
return invoice.getBalance();
@@ -166,8 +167,8 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
}
@Override
- public BigDecimal getAmountPaid() {
- return invoice.getAmountPaid();
+ public BigDecimal getPaidAmount() {
+ return invoice.getPaidAmount();
}
@Override
@@ -197,4 +198,19 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
protected Invoice getInvoice() {
return invoice;
}
+
+ @Override
+ public BigDecimal getTotalAdjAmount() {
+ return invoice.getTotalAdjAmount();
+ }
+
+ @Override
+ public BigDecimal getCreditAdjAmount() {
+ return invoice.getCreditAdjAmount();
+ }
+
+ @Override
+ public BigDecimal getRefundAdjAmount() {
+ return invoice.getRefundAdjAmount();
+ }
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
index 2dc8168..3f4ff92 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
@@ -60,11 +60,12 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
public InvoiceItemType getInvoiceItemType() {
return item.getInvoiceItemType();
}
-
+/*
@Override
public InvoiceItem asReversingItem() {
return item.asReversingItem();
}
+ */
@Override
public String getDescription() {
@@ -130,4 +131,14 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
public UUID getId() {
return item.getId();
}
+
+ @Override
+ public BigDecimal getRate() {
+ return null;
+ }
+
+ @Override
+ public UUID getLinkedItemId() {
+ return null;
+ }
}
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
index 8ccf73b..f201331 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
@@ -2,26 +2,27 @@ group InvoicePayment;
invoicePaymentFields(prefix) ::= <<
<prefix>id,
+ <prefix>type,
<prefix>invoice_id,
<prefix>payment_attempt_id,
<prefix>payment_attempt_date,
<prefix>amount,
<prefix>currency,
- <prefix>reversed_invoice_payment_id,
+ <prefix>linked_invoice_payment_id,
<prefix>created_by,
<prefix>created_date
>>
create() ::= <<
INSERT INTO invoice_payments(<invoicePaymentFields()>)
- VALUES(:id, :invoiceId, :paymentAttemptId, :paymentAttemptDate, :amount, :currency,
- :reversedInvoicePaymentId, :userName, :createdDate);
+ VALUES(:id, :type, :invoiceId, :paymentAttemptId, :paymentAttemptDate, :amount, :currency,
+ :linkedInvoicePaymentId, :userName, :createdDate);
>>
batchCreateFromTransaction() ::= <<
INSERT INTO invoice_payments(<invoicePaymentFields()>)
- VALUES(:id, :invoiceId, :paymentAttemptId, :paymentAttemptDate, :amount, :currency,
- :reversedInvoicePaymentId, :userName, :createdDate);
+ VALUES(:id, :type, :invoiceId, :paymentAttemptId, :paymentAttemptDate, :amount, :currency,
+ :linkedInvoicePaymentId, :userName, :createdDate);
>>
getByPaymentAttemptId() ::= <<
@@ -49,8 +50,8 @@ getPaymentsForInvoice() ::= <<
notifyOfPaymentAttempt() ::= <<
INSERT INTO invoice_payments(<invoicePaymentFields()>)
- VALUES(:id, :invoiceId, :paymentAttemptId, :paymentAttemptDate, :amount, :currency,
- :reversedInvoicePaymentId, :userName, :createdDate);
+ VALUES(:id, :type, :invoiceId, :paymentAttemptId, :paymentAttemptDate, :amount, :currency,
+ :linkedInvoicePaymentId, :userName, :createdDate);
>>
getInvoicePayment() ::= <<
@@ -95,7 +96,7 @@ getRemainingAmountPaid() ::= <<
SELECT SUM(amount)
FROM invoice_payments
WHERE id = :invoicePaymentId
- OR reversed_invoice_payment_id = :invoicePaymentId;
+ OR linked_invoice_payment_id = :invoicePaymentId;
>>
getAccountIdFromInvoicePaymentId() ::= <<
@@ -110,13 +111,13 @@ getChargeBacksByAccountId() ::= <<
FROM invoice_payments ip
INNER JOIN invoices i ON i.id = ip.invoice_id
WHERE i.account_id = :accountId
- AND reversed_invoice_payment_id IS NOT NULL;
+ AND linked_invoice_payment_id IS NOT NULL;
>>
getChargebacksByAttemptPaymentId() ::= <<
SELECT <invoicePaymentFields()>
FROM invoice_payments
- WHERE reversed_invoice_payment_id IN
+ WHERE linked_invoice_payment_id IN
(SELECT id FROM invoice_payments WHERE payment_attempt_id = :paymentAttemptId);
>>
;
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
index 8c8a3a2..416fb5e 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
@@ -20,7 +20,7 @@ get() ::= <<
getInvoicesByAccount() ::= <<
SELECT record_id as invoice_number, <invoiceFields()>
FROM invoices
- WHERE account_id = :accountId AND migrated = 'FALSE'
+ WHERE account_id = :accountId AND migrated = '0'
ORDER BY target_date ASC;
>>
@@ -34,24 +34,15 @@ getAllInvoicesByAccount() ::= <<
getInvoicesByAccountAfterDate() ::= <<
SELECT record_id as invoice_number, <invoiceFields()>
FROM invoices
- WHERE account_id = :accountId AND target_date >= :fromDate AND migrated = 'FALSE'
+ WHERE account_id = :accountId AND target_date >= :fromDate AND migrated = '0'
ORDER BY target_date ASC;
>>
getInvoicesBySubscription() ::= <<
SELECT i.record_id as invoice_number, <invoiceFields("i.")>
FROM invoices i
- LEFT JOIN recurring_invoice_items rii ON i.id = rii.invoice_id
- WHERE rii.subscription_id = :subscriptionId AND migrated = 'FALSE'
- GROUP BY i.record_id, <invoiceFields("i.")>
-
- UNION ALL
-
- SELECT i.record_id as invoice_number, <invoiceFields("i.")>
- FROM invoices i
- LEFT JOIN fixed_invoice_items fii ON i.id = fii.invoice_id
- WHERE fii.subscription_id = :subscriptionId AND migrated = 'FALSE'
- GROUP BY i.record_id, <invoiceFields("i.")>;
+ JOIN invoice_items ii ON i.id = ii.invoice_id
+ WHERE ii.subscription_id = :subscriptionId AND i.migrated = '0';
>>
getById() ::= <<
@@ -60,16 +51,6 @@ getById() ::= <<
WHERE id = :id;
>>
-getAccountBalance() ::= <<
- SELECT SUM(iis.amount_invoiced) AS amount_invoiced,
- SUM(ips.total_paid) AS amount_paid
- FROM invoices i
- LEFT JOIN invoice_payment_summary ips ON i.id = ips.invoice_id
- LEFT JOIN invoice_item_summary iis ON i.id = iis.invoice_id
- WHERE i.account_id = :accountId
- GROUP BY i.account_id;
->>
-
create() ::= <<
INSERT INTO invoices(<invoiceFields()>)
VALUES (:id, :accountId, :invoiceDate, :targetDate, :currency, :migrated, :userName, :createdDate);
@@ -82,17 +63,6 @@ getInvoiceIdByPaymentAttemptId() ::= <<
AND ip.payment_attempt_id = :paymentAttemptId
>>
-getUnpaidInvoicesByAccountId() ::= <<
- SELECT record_id as invoice_number, <invoiceFields("i.")>
- FROM invoices i
- LEFT JOIN invoice_payment_summary ips ON i.id = ips.invoice_id
- LEFT JOIN invoice_item_summary iis ON i.id = iis.invoice_id
- WHERE i.account_id = :accountId AND NOT (i.target_date > :upToDate) AND migrated = 'FALSE'
- GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency
- HAVING (SUM(iis.amount_invoiced) > SUM(ips.total_paid)) OR (SUM(ips.total_paid) IS NULL)
- AND SUM(iis.amount_invoiced) > 0
- ORDER BY i.target_date ASC;
->>
getRecordId() ::= <<
SELECT record_id
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
index 7c69562..a408d3c 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
+++ b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
@@ -1,67 +1,30 @@
+
DROP TABLE IF EXISTS invoice_items;
-DROP TABLE IF EXISTS recurring_invoice_items;
-CREATE TABLE recurring_invoice_items (
+CREATE TABLE invoice_items (
record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
id char(36) NOT NULL,
+ type varchar(24) NOT NULL,
invoice_id char(36) NOT NULL,
account_id char(36) NOT NULL,
bundle_id char(36),
subscription_id char(36),
- plan_name varchar(50) NOT NULL,
- phase_name varchar(50) NOT NULL,
+ plan_name varchar(50),
+ phase_name varchar(50),
start_date datetime NOT NULL,
- end_date datetime NOT NULL,
- amount numeric(10,4) NULL,
+ end_date datetime,
+ amount numeric(10,4) NOT NULL,
rate numeric(10,4) NULL,
currency char(3) NOT NULL,
- reversed_item_id char(36),
- created_by varchar(50) NOT NULL,
- created_date datetime NOT NULL,
- PRIMARY KEY(record_id)
-) ENGINE=innodb;
-CREATE UNIQUE INDEX recurring_invoice_items_id ON recurring_invoice_items(id);
-CREATE INDEX recurring_invoice_items_subscription_id ON recurring_invoice_items(subscription_id ASC);
-CREATE INDEX recurring_invoice_items_invoice_id ON recurring_invoice_items(invoice_id ASC);
-
-DROP TABLE IF EXISTS fixed_invoice_items;
-CREATE TABLE fixed_invoice_items (
- record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
- id char(36) NOT NULL,
- invoice_id char(36) NOT NULL,
- account_id char(36) NOT NULL,
- bundle_id char(36),
- subscription_id char(36),
- plan_name varchar(50) NOT NULL,
- phase_name varchar(50) NOT NULL,
- start_date datetime NOT NULL,
- end_date datetime NOT NULL,
- amount numeric(10,4) NULL,
- currency char(3) NOT NULL,
- created_by varchar(50) NOT NULL,
- created_date datetime NOT NULL,
- PRIMARY KEY(record_id)
-) ENGINE=innodb;
-CREATE UNIQUE INDEX fixed_invoice_items_id ON fixed_invoice_items(id);
-CREATE INDEX fixed_invoice_items_subscription_id ON fixed_invoice_items(subscription_id ASC);
-CREATE INDEX fixed_invoice_items_invoice_id ON fixed_invoice_items(invoice_id ASC);
-
-DROP TABLE IF EXISTS credit_invoice_items;
-CREATE TABLE credit_invoice_items (
- record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
- id char(36) NOT NULL,
- invoice_id char(36) NOT NULL,
- account_id char(36) NOT NULL,
- credit_date datetime NOT NULL,
- amount numeric(10,4) NULL,
- currency char(3) NOT NULL,
+ linked_item_id char(36),
created_by varchar(50) NOT NULL,
created_date datetime NOT NULL,
PRIMARY KEY(record_id)
) ENGINE=innodb;
-CREATE UNIQUE INDEX credit_invoice_items_id ON credit_invoice_items(id);
-CREATE INDEX credit_invoice_items_invoice_id ON credit_invoice_items(invoice_id ASC);
-DROP TABLE IF EXISTS invoice_locking;
+CREATE UNIQUE INDEX invoice_items_id ON invoice_items(id);
+CREATE INDEX invoice_items_subscription_id ON invoice_items(subscription_id ASC);
+CREATE INDEX invoice_items_invoice_id ON invoice_items(invoice_id ASC);
+CREATE INDEX invoice_items_account_id ON invoice_items(account_id ASC);
DROP TABLE IF EXISTS invoices;
CREATE TABLE invoices (
@@ -83,35 +46,17 @@ DROP TABLE IF EXISTS invoice_payments;
CREATE TABLE invoice_payments (
record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
id char(36) NOT NULL,
+ type varchar(24) NOT NULL,
invoice_id char(36) NOT NULL,
payment_attempt_id char(36) COLLATE utf8_bin,
payment_attempt_date datetime NOT NULL,
amount numeric(10,4) NOT NULL,
currency char(3) NOT NULL,
- reversed_invoice_payment_id char(36) DEFAULT NULL,
+ linked_invoice_payment_id char(36) DEFAULT NULL,
created_by varchar(50) NOT NULL,
created_date datetime NOT NULL,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX invoice_payments_id ON invoice_payments(id);
CREATE INDEX invoice_payments_attempt ON invoice_payments(payment_attempt_id);
-CREATE INDEX invoice_payments_reversals ON invoice_payments(reversed_invoice_payment_id);
-
-DROP VIEW IF EXISTS invoice_payment_summary;
-CREATE VIEW invoice_payment_summary AS
-SELECT invoice_id,
- CASE WHEN SUM(amount) IS NULL THEN 0 ELSE SUM(amount) END AS total_paid,
- MAX(payment_attempt_date) AS last_payment_date
-FROM invoice_payments
-GROUP BY invoice_id;
-
-DROP VIEW IF EXISTS invoice_item_summary;
-CREATE VIEW invoice_item_summary AS
-SELECT i.id as invoice_id,
- CASE WHEN SUM(rii.amount) IS NULL THEN 0 ELSE SUM(rii.amount) END
- + CASE WHEN SUM(fii.amount) IS NULL THEN 0 ELSE SUM(fii.amount) END AS amount_invoiced
-FROM invoices i
-LEFT JOIN recurring_invoice_items rii ON i.id = rii.invoice_id
-LEFT JOIN fixed_invoice_items fii ON i.id = fii.invoice_id
-GROUP BY invoice_id;
-
+CREATE INDEX invoice_payments_reversals ON invoice_payments(linked_invoice_payment_id);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/MockModuleNoEntitlement.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/MockModuleNoEntitlement.java
index 27ea80c..a315a2c 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/MockModuleNoEntitlement.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/MockModuleNoEntitlement.java
@@ -16,6 +16,11 @@
package com.ning.billing.invoice.api.migration;
+import static org.testng.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.net.URL;
+
import org.skife.config.ConfigurationObjectFactory;
import com.ning.billing.invoice.MockModule;
@@ -64,5 +69,4 @@ public class MockModuleNoEntitlement extends MockModule {
}
-
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
index 64ee7ac..7bbeb76 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -22,11 +22,18 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.skife.jdbi.v2.Handle;
+import org.skife.jdbi.v2.IDBI;
+import org.skife.jdbi.v2.TransactionCallback;
+import org.skife.jdbi.v2.TransactionStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.BeforeTest;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
@@ -52,7 +59,7 @@ import com.ning.billing.invoice.api.InvoiceNotifier;
import com.ning.billing.invoice.api.InvoicePaymentApi;
import com.ning.billing.invoice.api.InvoiceUserApi;
import com.ning.billing.invoice.dao.InvoiceDao;
-import com.ning.billing.invoice.model.InvoiceGenerator;
+import com.ning.billing.invoice.generator.InvoiceGenerator;
import com.ning.billing.invoice.notification.NullInvoiceNotifier;
import com.ning.billing.invoice.tests.InvoicingTestBase;
import com.ning.billing.junction.api.BillingApi;
@@ -107,12 +114,32 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
private UUID migrationInvoiceId;
private UUID regularInvoiceId;
+ private IDBI dbi;
+
+
private static final BigDecimal MIGRATION_INVOICE_AMOUNT = new BigDecimal("100.00");
private static final Currency MIGRATION_INVOICE_CURRENCY = Currency.USD;
private final Clock clock = new ClockMock();
- @BeforeClass(groups = {"slow"})
+ //@BeforeTest(groups = {"slow"})
+ public void cleanup() {
+ if (dbi != null) {
+ dbi.inTransaction(new TransactionCallback<Void>() {
+ @Override
+ public Void inTransaction(final Handle h, final TransactionStatus status)
+ throws Exception {
+ h.execute("truncate table invoices");
+ h.execute("truncate table invoice_items");
+ h.execute("truncate table invoice_payments");
+ return null;
+ }
+ });
+ }
+ }
+
+
+ @BeforeSuite(groups = {"slow"})
public void setup() throws Exception {
log.info("Starting set up");
accountId = UUID.randomUUID();
@@ -127,7 +154,8 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
helper.initDb(invoiceDdl);
helper.initDb(utilDdl);
-
+ dbi = helper.getDBI();
+ cleanup();
busService.getBus().start();
((ZombieControl) billingApi).addResult("setChargedThroughDate", BrainDeadProxyFactory.ZOMBIE_VOID);
@@ -136,7 +164,7 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
}
- @AfterClass(groups = {"slow"})
+ @AfterSuite(groups = {"slow"})
public void tearDown() {
try {
((DefaultBusService) busService).stopBus();
@@ -209,7 +237,6 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
return invoice.getId();
}
- // Check migration invoice is NOT returned for all user api invoice calls
@Test(groups = {"slow"}, enabled = true)
public void testUserApiAccess() {
final List<Invoice> byAccount = invoiceUserApi.getInvoicesByAccount(accountId);
@@ -221,9 +248,7 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
Assert.assertEquals(byAccountAndDate.get(0).getId(), regularInvoiceId);
final Collection<Invoice> unpaid = invoiceUserApi.getUnpaidInvoicesByAccountId(accountId, date_regular.plusDays(1));
- Assert.assertEquals(unpaid.size(), 1);
- Assert.assertEquals(regularInvoiceId, unpaid.iterator().next().getId());
-
+ Assert.assertEquals(unpaid.size(), 2);
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
index d4feb57..af2c854 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
@@ -26,6 +26,7 @@ import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
import com.ning.billing.invoice.model.DefaultInvoicePayment;
import com.ning.billing.util.callcontext.CallContext;
@@ -91,34 +92,30 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi {
@Override
public void notifyOfPaymentAttempt(final UUID invoiceId, final BigDecimal amountOutstanding, final Currency currency, final UUID paymentAttemptId, final DateTime paymentAttemptDate, final CallContext context) {
- final InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate, amountOutstanding, currency);
+ final InvoicePayment invoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentAttemptId, invoiceId, paymentAttemptDate, amountOutstanding, currency);
notifyOfPaymentAttempt(invoicePayment, context);
}
@Override
- public void notifyOfPaymentAttempt(final UUID invoiceId, final UUID paymentAttemptId, final DateTime paymentAttemptDate, final CallContext context) {
- final InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate);
- notifyOfPaymentAttempt(invoicePayment, context);
- }
-
- @Override
- public InvoicePayment processChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
+ public InvoicePayment createChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
InvoicePayment existingPayment = null;
for (final InvoicePayment payment : invoicePayments) {
if (payment.getId() == invoicePaymentId) {
existingPayment = payment;
+ break;
}
}
if (existingPayment != null) {
- invoicePayments.add(existingPayment.asChargeBack(amount, DateTime.now(DateTimeZone.UTC)));
+ invoicePayments.add(new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.CHARGED_BACK, null, null, DateTime.now(DateTimeZone.UTC), amount,
+ Currency.USD, existingPayment.getId()));
}
return existingPayment;
}
@Override
- public InvoicePayment processChargeback(final UUID invoicePaymentId, final CallContext context) throws InvoiceApiException {
+ public InvoicePayment createChargeback(final UUID invoicePaymentId, final CallContext context) throws InvoiceApiException {
InvoicePayment existingPayment = null;
for (final InvoicePayment payment : invoicePayments) {
if (payment.getId() == invoicePaymentId) {
@@ -127,7 +124,7 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi {
}
if (existingPayment != null) {
- this.processChargeback(invoicePaymentId, existingPayment.getAmount(), context);
+ this.createChargeback(invoicePaymentId, existingPayment.getAmount(), context);
}
return existingPayment;
@@ -141,7 +138,7 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi {
amount = amount.add(payment.getAmount());
}
- if (payment.getReversedInvoicePaymentId().equals(invoicePaymentId)) {
+ if (payment.getLinkedInvoicePaymentId().equals(invoicePaymentId)) {
amount = amount.add(payment.getAmount());
}
}
@@ -168,4 +165,12 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi {
public InvoicePayment getChargebackById(final UUID chargebackId) {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public InvoicePayment createRefund(UUID paymentAttemptId,
+ BigDecimal amount, boolean isInvoiceAdjusted, CallContext context)
+ throws InvoiceApiException {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
index 637dd5a..c1c40af 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
@@ -17,6 +17,7 @@
package com.ning.billing.invoice.dao;
import java.io.IOException;
+import java.net.URL;
import org.skife.jdbi.v2.Handle;
import org.skife.jdbi.v2.IDBI;
@@ -28,8 +29,9 @@ import org.testng.annotations.BeforeMethod;
import com.ning.billing.config.InvoiceConfig;
import com.ning.billing.dbi.MysqlTestingHelper;
-import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
-import com.ning.billing.invoice.model.InvoiceGenerator;
+import com.ning.billing.invoice.generator.DefaultInvoiceGenerator;
+import com.ning.billing.invoice.generator.InvoiceGenerator;
+import com.ning.billing.invoice.glue.InvoiceModuleWithEmbeddedDb;
import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
import com.ning.billing.invoice.notification.NextBillingDatePoster;
import com.ning.billing.invoice.tests.InvoicingTestBase;
@@ -48,17 +50,16 @@ import com.ning.billing.util.tag.dao.MockTagDefinitionDao;
import com.ning.billing.util.tag.dao.TagDao;
import com.ning.billing.util.tag.dao.TagDefinitionDao;
+import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
-public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
+public class InvoiceDaoTestBase extends InvoicingTestBase {
protected final TagEventBuilder tagEventBuilder = new TagEventBuilder();
protected IDBI dbi;
private MysqlTestingHelper mysqlTestingHelper;
protected InvoiceDao invoiceDao;
- protected RecurringInvoiceItemSqlDao recurringInvoiceItemDao;
- protected FixedPriceInvoiceItemSqlDao fixedPriceInvoiceItemSqlDao;
- protected CreditInvoiceItemSqlDao creditInvoiceItemSqlDao;
+ protected InvoiceItemSqlDao invoiceItemSqlDao;
protected InvoicePaymentSqlDao invoicePaymentDao;
protected Clock clock;
protected CallContext context;
@@ -87,18 +88,36 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
}
};
- @BeforeClass(alwaysRun = true)
+ private static void loadSystemPropertiesFromClasspath(final String resource) {
+ final URL url = InvoiceModuleWithEmbeddedDb.class.getResource(resource);
+ assertNotNull(url);
+ try {
+ System.getProperties().load(url.openStream());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @BeforeClass(groups={"slow"})
protected void setup() throws IOException {
+
+ loadSystemPropertiesFromClasspath("/resource.properties");
+
mysqlTestingHelper = new MysqlTestingHelper();
dbi = mysqlTestingHelper.getDBI();
final String invoiceDdl = IOUtils.toString(DefaultInvoiceDao.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
final String utilDdl = IOUtils.toString(DefaultInvoiceDao.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
+ clock = new ClockMock();
+
mysqlTestingHelper.startMysql();
mysqlTestingHelper.initDb(invoiceDdl);
mysqlTestingHelper.initDb(utilDdl);
+ bus = new InMemoryBus();
+ bus.start();
+
final NextBillingDatePoster nextBillingDatePoster = new MockNextBillingDatePoster();
final TagDefinitionDao tagDefinitionDao = new MockTagDefinitionDao();
final TagDao tagDao = new AuditedTagDao(dbi, tagEventBuilder, bus);
@@ -106,38 +125,34 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
invoiceDao = new DefaultInvoiceDao(dbi, nextBillingDatePoster, tagUserApi);
invoiceDao.test();
- recurringInvoiceItemDao = dbi.onDemand(RecurringInvoiceItemSqlDao.class);
- fixedPriceInvoiceItemSqlDao = dbi.onDemand(FixedPriceInvoiceItemSqlDao.class);
- creditInvoiceItemSqlDao = dbi.onDemand(CreditInvoiceItemSqlDao.class);
+ invoiceItemSqlDao = dbi.onDemand(InvoiceItemSqlDao.class);
invoicePaymentDao = dbi.onDemand(InvoicePaymentSqlDao.class);
- clock = new ClockMock();
+
+
context = new TestCallContext("Invoice Dao Tests");
generator = new DefaultInvoiceGenerator(clock, invoiceConfig);
- bus = new InMemoryBus();
- bus.start();
+
+
assertTrue(true);
}
- @BeforeMethod(alwaysRun = true)
+ @BeforeMethod(groups={"slow"})
public void cleanupData() {
dbi.inTransaction(new TransactionCallback<Void>() {
@Override
public Void inTransaction(final Handle h, final TransactionStatus status)
throws Exception {
h.execute("truncate table invoices");
- h.execute("truncate table fixed_invoice_items");
- h.execute("truncate table recurring_invoice_items");
- h.execute("truncate table credit_invoice_items");
+ h.execute("truncate table invoice_items");
h.execute("truncate table invoice_payments");
-
return null;
}
});
}
- @AfterClass(alwaysRun = true)
+ @AfterClass(groups={"slow"})
protected void tearDown() {
bus.stop();
mysqlTestingHelper.stopMysql();
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
index 0564bd0..a2e8a34 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
@@ -248,7 +248,22 @@ public class MockInvoiceDao implements InvoiceDao {
}
@Override
- public InvoiceItem insertCredit(final UUID accountId, final BigDecimal amount, final DateTime effectiveDate, final Currency currency, final CallContext context) {
+ public InvoiceItem insertCredit(final UUID accountId, final UUID invoiceId, final BigDecimal amount, final DateTime effectiveDate, final Currency currency, final CallContext context) {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public BigDecimal getAccountCBA(UUID accountId) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public InvoicePayment createRefund(UUID paymentAttemptId,
+ BigDecimal amount, boolean isInvoiceAdjusted, CallContext context)
+ throws InvoiceApiException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
new file mode 100644
index 0000000..53066ea
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
@@ -0,0 +1,336 @@
+/*
+ * Copyright 2010-2011 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
+ * 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.
+ */
+package com.ning.billing.invoice.generator;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertEquals;
+
+import java.math.BigDecimal;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.config.InvoiceConfig;
+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.model.CreditBalanceAdjInvoiceItem;
+import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
+import com.ning.billing.invoice.model.RecurringInvoiceItem;
+import com.ning.billing.invoice.model.RepairAdjInvoiceItem;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.ClockMock;
+
+public class TestDefaultInvoiceGeneratorUnit {
+
+ private DefaultInvoiceGenerator gen;
+ private Clock clock;
+
+ private final UUID invoiceId = UUID.randomUUID();
+ private final UUID accountId = UUID.randomUUID();
+ private final UUID subscriptionId = UUID.randomUUID();
+ private final UUID bundleId = UUID.randomUUID();
+ private final String planName = "my-plan";
+ private final String phaseName = "my-phase";
+ private final Currency currency = Currency.USD;
+
+ public static final class TestDefaultInvoiceGeneratorMock extends DefaultInvoiceGenerator {
+ public TestDefaultInvoiceGeneratorMock(final Clock clock, final InvoiceConfig config) {
+ super(clock, config);
+ }
+ }
+
+ @BeforeClass(groups = {"fast"})
+ public void setup() {
+ clock = new ClockMock();
+ gen = new TestDefaultInvoiceGeneratorMock(clock, new InvoiceConfig() {
+ @Override
+ public boolean isNotificationProcessingOff() {
+ return false;
+ }
+ @Override
+ public boolean isEmailNotificationsEnabled() {
+ return false;
+ }
+ @Override
+ public long getSleepTimeMs() {
+ return 100;
+ }
+ @Override
+ public int getNumberOfMonthsInFuture() {
+ return 5;
+ }
+ });
+ }
+
+ @Test(groups = {"fast"}, enabled= true)
+ public void testRemoveCancellingInvoiceItemsFixedPrice() {
+
+ DateTime startDate = clock.getUTCNow();
+ DateTime endDate = startDate.plusDays(30);
+ DateTime nextEndDate = startDate.plusMonths(1);
+
+ BigDecimal amount = new BigDecimal("12.00");
+ BigDecimal rate2 = new BigDecimal("14.85");
+ BigDecimal amount2 = rate2;
+ List<InvoiceItem> items = new LinkedList<InvoiceItem>();
+ InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
+ items.add(item1);
+ items.add(new RepairAdjInvoiceItem(invoiceId, accountId, startDate, endDate, amount.negate(), currency, item1.getId()));
+ items.add(new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency));
+ gen.removeCancellingInvoiceItems(items);
+ assertEquals(items.size(), 1);
+ InvoiceItem leftItem = items.get(0);
+ assertEquals(leftItem.getInvoiceItemType(), InvoiceItemType.RECURRING);
+ assertEquals(leftItem.getAmount(), amount2);
+ }
+
+ @Test(groups = {"fast"})
+ public void testRemoveCancellingInvoiceItemsRecurringPrice() {
+
+ DateTime startDate = clock.getUTCNow();
+ DateTime endDate = startDate.plusDays(30);
+ DateTime nextEndDate = startDate.plusMonths(1);
+
+ BigDecimal rate1 = new BigDecimal("12.00");
+ BigDecimal amount1 = rate1;
+ BigDecimal rate2 = new BigDecimal("14.85");
+ BigDecimal amount2 = rate2;
+ List<InvoiceItem> items = new LinkedList<InvoiceItem>();
+ InvoiceItem item1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ items.add(item1);
+ items.add(new RepairAdjInvoiceItem(invoiceId, accountId, startDate, endDate, amount1.negate(), currency, item1.getId()));
+ items.add(new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency));
+ gen.removeCancellingInvoiceItems(items);
+ assertEquals(items.size(), 1);
+ InvoiceItem leftItem = items.get(0);
+ assertEquals(leftItem.getInvoiceItemType(), InvoiceItemType.RECURRING);
+ assertEquals(leftItem.getAmount(), amount2);
+ }
+
+ @Test(groups = {"fast"})
+ public void testRemoveDuplicatedInvoiceItemsFixedPrice() {
+
+ DateTime startDate = clock.getUTCNow();
+ DateTime endDate = startDate.plusDays(30);
+ DateTime nextEndDate = startDate.plusMonths(1);
+
+ BigDecimal amount1 = new BigDecimal("12.00");
+
+ BigDecimal amount2 = new BigDecimal("14.85");
+
+ BigDecimal rate3 = new BigDecimal("14.85");
+ BigDecimal amount3 = rate3;
+
+ List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
+ InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, currency);
+ existing.add(item1);
+
+ List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
+ InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount3, rate3, currency, null);
+ proposed.add(item1);
+ proposed.add(other);
+
+ gen.removeDuplicatedInvoiceItems(proposed, existing);
+ assertEquals(existing.size(), 0);
+ assertEquals(proposed.size(), 1);
+ InvoiceItem leftItem = proposed.get(0);
+ assertEquals(leftItem.getInvoiceItemType(), InvoiceItemType.RECURRING);
+ assertEquals(leftItem.getAmount(), amount2);
+ }
+
+ @Test(groups = {"fast"})
+ public void testRemoveDuplicatedInvoiceItemsRecuringPrice() {
+
+ DateTime startDate = clock.getUTCNow();
+ DateTime endDate = startDate.plusDays(30);
+ DateTime nextEndDate = startDate.plusMonths(1);
+
+ BigDecimal rate1 = new BigDecimal("12.00");
+ BigDecimal amount1 = rate1;
+
+ BigDecimal rate2 = new BigDecimal("14.85");
+ BigDecimal amount2 = rate2;
+
+ List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
+ InvoiceItem item1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ existing.add(item1);
+
+ List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
+ InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency, null);
+ proposed.add(item1);
+ proposed.add(other);
+
+ gen.removeDuplicatedInvoiceItems(proposed, existing);
+ assertEquals(existing.size(), 0);
+ assertEquals(proposed.size(), 1);
+ InvoiceItem leftItem = proposed.get(0);
+ assertEquals(leftItem.getInvoiceItemType(), InvoiceItemType.RECURRING);
+ assertEquals(leftItem.getAmount(), amount2);
+ }
+
+ // STEPH same as testRemoveCancellingInvoiceItemsFixedPrice: should we have one for FixedPrice?
+ @Test(groups = {"fast"})
+ public void testAddRepairedItemsItemsRecurringPrice() {
+ DateTime startDate = clock.getUTCNow();
+ DateTime endDate = startDate.plusDays(30);
+ DateTime nextEndDate = startDate.plusMonths(1);
+
+ BigDecimal rate1 = new BigDecimal("12.00");
+ BigDecimal amount1 = rate1;
+
+ BigDecimal rate2 = new BigDecimal("14.85");
+ BigDecimal amount2 = rate2;
+
+ UUID firstInvoiceId = UUID.randomUUID();
+ List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
+ InvoiceItem item1 = new RecurringInvoiceItem(firstInvoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ existing.add(item1);
+
+ List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
+ InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency, null);
+ proposed.add(other);
+
+ gen.addRepairedItems(existing, proposed);
+ assertEquals(existing.size(), 1);
+ assertEquals(proposed.size(), 2);
+ InvoiceItem leftItem1 = proposed.get(0);
+ assertEquals(leftItem1.getInvoiceId(), invoiceId);
+ assertEquals(leftItem1.getInvoiceItemType(), InvoiceItemType.RECURRING);
+ assertEquals(leftItem1.getAmount(), amount2);
+
+ InvoiceItem newItem2 = proposed.get(1);
+ assertEquals(newItem2.getInvoiceId(), firstInvoiceId);
+ assertEquals(newItem2.getInvoiceItemType(), InvoiceItemType.REPAIR_ADJ);
+ assertEquals(newItem2.getAmount(), item1.getAmount().negate());
+ assertEquals(newItem2.getLinkedItemId(), item1.getId());
+
+ }
+
+ @Test(groups = {"fast"})
+ public void testGenerateCreditsForPastRepairedInvoices() {
+
+ DateTime startDate = clock.getUTCNow();
+ DateTime endDate = startDate.plusDays(30);
+ DateTime nextEndDate = startDate.plusMonths(1);
+
+ BigDecimal rate1 = new BigDecimal("10.00");
+ BigDecimal amount1 = rate1;
+
+ List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
+ InvoiceItem item1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ existing.add(item1);
+
+
+ UUID existingInvoiceId = UUID.randomUUID();
+ List<Invoice> existingInvoices = new LinkedList<Invoice>();
+ Invoice existingInvoice = mock(Invoice.class);
+ when(existingInvoice.getId()).thenReturn(existingInvoiceId);
+ when(existingInvoice.getBalance()).thenReturn(BigDecimal.ZERO);
+ when(existingInvoice.getInvoiceItems()).thenReturn(existing);
+
+ BigDecimal rate2 = new BigDecimal("20.0");
+ BigDecimal amount2 = rate2;
+
+ List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
+ InvoiceItem reversedItem1 = new RepairAdjInvoiceItem(existingInvoiceId, accountId, startDate, nextEndDate, item1.getAmount().negate(), currency, item1.getId());
+ InvoiceItem newItem1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount2, rate2, currency, null);
+ proposed.add(reversedItem1);
+ proposed.add(newItem1);
+
+ gen.generateCBAForExistingInvoices(accountId, existingInvoices, proposed, currency);
+
+ assertEquals(proposed.size(), 3);
+ InvoiceItem reversedItemCheck1 = proposed.get(0);
+ assertEquals(reversedItemCheck1.getInvoiceId(), existingInvoiceId);
+ assertEquals(reversedItemCheck1.getInvoiceItemType(), InvoiceItemType.REPAIR_ADJ);
+ assertEquals(reversedItemCheck1.getAmount(), item1.getAmount().negate());
+ assertEquals(reversedItemCheck1.getLinkedItemId(), item1.getId());
+
+ InvoiceItem newItemCheck1 = proposed.get(1);
+ assertEquals(newItemCheck1.getInvoiceId(), invoiceId);
+ assertEquals(newItemCheck1.getInvoiceItemType(), InvoiceItemType.RECURRING);
+ assertEquals(newItemCheck1.getAmount(), amount2);
+
+ InvoiceItem creditItemCheck = proposed.get(2);
+ assertEquals(creditItemCheck.getInvoiceId(), existingInvoiceId);
+ assertEquals(creditItemCheck.getInvoiceItemType(), InvoiceItemType.CBA_ADJ);
+ assertEquals(creditItemCheck.getAmount(), amount2.add(rate1.negate()));
+ }
+
+ @Test(groups = {"fast"})
+ public void testConsumeNotEnoughExistingCredit() {
+ testConsumeCreditInternal(new BigDecimal("12.00"), new BigDecimal("-10.00"));
+ }
+
+ @Test(groups = {"fast"})
+ public void testConsumeTooMuchExistingCredit() {
+ testConsumeCreditInternal(new BigDecimal("7.00"), new BigDecimal("-7.00"));
+ }
+
+ private void testConsumeCreditInternal(BigDecimal newRate, BigDecimal expectedNewCba) {
+ DateTime startDate = clock.getUTCNow();
+ DateTime endDate = startDate.plusDays(30);
+ DateTime nextEndDate = startDate.plusMonths(1);
+
+
+ BigDecimal rate1 = new BigDecimal("20.00");
+ BigDecimal amount1 = rate1;
+
+ BigDecimal rate2 = new BigDecimal("10.00");
+ BigDecimal amount2 = rate2;
+
+
+ UUID firstInvoiceId = UUID.randomUUID();
+ List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
+ BigDecimal pcba1 = new BigDecimal("10.00");
+
+ InvoiceItem item1 = new RecurringInvoiceItem(firstInvoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ InvoiceItem reversedItem1 = new RepairAdjInvoiceItem(firstInvoiceId, accountId, startDate, nextEndDate, amount1.negate(), currency, item1.getId());
+ InvoiceItem newItem1 = new RecurringInvoiceItem(firstInvoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount2, rate2, currency, null);
+ InvoiceItem cba1 = new CreditBalanceAdjInvoiceItem(firstInvoiceId, accountId, startDate, pcba1, currency);
+ existing.add(item1);
+ existing.add(reversedItem1);
+ existing.add(newItem1);
+ existing.add(cba1);
+
+
+ BigDecimal newRate2 = newRate;
+ BigDecimal newAmount2 = newRate2;
+
+ List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
+ InvoiceItem item2 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate.plusMonths(1), endDate.plusMonths(1), newAmount2, newRate2, currency, null);
+ proposed.add(item2);
+
+ gen.consumeExistingCredit(invoiceId, firstInvoiceId, existing, proposed, currency);
+ assertEquals(proposed.size(), 2);
+ InvoiceItem item2Check = proposed.get(0);
+ assertEquals(item2Check.getInvoiceId(), invoiceId);
+ assertEquals(item2Check.getInvoiceItemType(), InvoiceItemType.RECURRING);
+ assertEquals(item2Check.getAmount(), newAmount2);
+
+ InvoiceItem cbaCheck = proposed.get(1);
+ assertEquals(cbaCheck.getInvoiceId(), invoiceId);
+ assertEquals(cbaCheck.getInvoiceItemType(), InvoiceItemType.CBA_ADJ);
+ assertEquals(cbaCheck.getAmount(), expectedNewCba);
+ }
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
index 6017a5a..a317cad 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
@@ -27,8 +27,8 @@ import com.ning.billing.dbi.MysqlTestingHelper;
import com.ning.billing.invoice.api.InvoiceNotifier;
import com.ning.billing.invoice.api.test.DefaultInvoiceTestApi;
import com.ning.billing.invoice.api.test.InvoiceTestApi;
+import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
import com.ning.billing.invoice.dao.InvoicePaymentSqlDao;
-import com.ning.billing.invoice.dao.RecurringInvoiceItemSqlDao;
import com.ning.billing.invoice.notification.MockNextBillingDateNotifier;
import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
import com.ning.billing.invoice.notification.NextBillingDateNotifier;
@@ -72,8 +72,8 @@ public class InvoiceModuleWithEmbeddedDb extends DefaultInvoiceModule {
return dbi;
}
- public RecurringInvoiceItemSqlDao getInvoiceItemSqlDao() {
- return dbi.onDemand(RecurringInvoiceItemSqlDao.class);
+ public InvoiceItemSqlDao getInvoiceItemSqlDao() {
+ return dbi.onDemand(InvoiceItemSqlDao.class);
}
public InvoicePaymentSqlDao getInvoicePaymentSqlDao() {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/MockModule.java b/invoice/src/test/java/com/ning/billing/invoice/MockModule.java
index 120ab0e..0e1ff55 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/MockModule.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/MockModule.java
@@ -16,6 +16,11 @@
package com.ning.billing.invoice;
+import static org.testng.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.net.URL;
+
import org.skife.config.ConfigurationObjectFactory;
import org.skife.jdbi.v2.IDBI;
@@ -25,6 +30,7 @@ import com.ning.billing.dbi.DBIProvider;
import com.ning.billing.dbi.DbiConfig;
import com.ning.billing.dbi.MysqlTestingHelper;
import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
+import com.ning.billing.invoice.api.migration.TestDefaultInvoiceMigrationApi;
import com.ning.billing.invoice.glue.DefaultInvoiceModule;
import com.ning.billing.invoice.template.formatters.DefaultInvoiceFormatterFactory;
import com.ning.billing.mock.glue.MockJunctionModule;
@@ -43,6 +49,9 @@ import com.ning.billing.util.glue.TagStoreModule;
public class MockModule extends AbstractModule {
@Override
protected void configure() {
+
+ loadSystemPropertiesFromClasspath("/resource.properties");
+
bind(Clock.class).to(ClockMock.class).asEagerSingleton();
bind(ClockMock.class).asEagerSingleton();
bind(CallContextFactory.class).to(DefaultCallContextFactory.class).asEagerSingleton();
@@ -76,4 +85,15 @@ public class MockModule extends AbstractModule {
protected void installInvoiceModule() {
install(new DefaultInvoiceModule());
}
+
+
+ private static void loadSystemPropertiesFromClasspath(final String resource) {
+ final URL url = TestDefaultInvoiceMigrationApi.class.getResource(resource);
+ assertNotNull(url);
+ try {
+ System.getProperties().load(url.openStream());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
index 88401ec..b586cd7 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
@@ -46,7 +46,7 @@ import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.invoice.api.InvoiceNotifier;
import com.ning.billing.invoice.dao.InvoiceDao;
-import com.ning.billing.invoice.model.InvoiceGenerator;
+import com.ning.billing.invoice.generator.InvoiceGenerator;
import com.ning.billing.invoice.notification.NextBillingDateNotifier;
import com.ning.billing.invoice.notification.NullInvoiceNotifier;
import com.ning.billing.invoice.tests.InvoicingTestBase;
@@ -64,7 +64,6 @@ import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.globallocker.GlobalLocker;
import com.ning.billing.util.io.IOUtils;
-@Test(groups = "slow")
@Guice(modules = {MockModule.class})
public class TestInvoiceDispatcher extends InvoicingTestBase {
private final Logger log = LoggerFactory.getLogger(TestInvoiceDispatcher.class);
@@ -95,7 +94,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
private CallContext context;
- @BeforeSuite(groups = "slow")
+ @BeforeSuite(groups = {"slow"})
public void setup() throws Exception {
final String invoiceDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
final String utilDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
@@ -113,7 +112,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
((ZombieControl) billingApi).addResult("setChargedThroughDate", BrainDeadProxyFactory.ZOMBIE_VOID);
}
- @AfterClass(alwaysRun = true)
+ @AfterClass(groups = {"slow"})
public void tearDown() {
try {
((DefaultBusService) busService).stopBus();
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/GenericProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/GenericProRationTests.java
index 81d5347..4b37ad8 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/GenericProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/GenericProRationTests.java
@@ -23,7 +23,6 @@ import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.invoice.tests.inAdvance.GenericProRationTestBase;
-@Test(groups = {"fast", "invoicing", "proRation"})
public class GenericProRationTests extends GenericProRationTestBase {
@Override
protected BillingPeriod getBillingPeriod() {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java
index ea37848..ebf816e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java
@@ -23,7 +23,6 @@ import org.testng.annotations.Test;
import com.ning.billing.invoice.model.InvalidDateSequenceException;
-@Test(groups = {"fast", "invoicing", "proRation"})
public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBase {
/**
* used for testing cancellation in less than a single billing period
@@ -32,14 +31,14 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
*/
protected abstract BigDecimal getDaysInTestPeriod();
- @Test
+ @Test(groups = {"fast"})
public void testSinglePlan_OnStartDate() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 2, 15);
testCalculateNumberOfBillingCycles(startDate, startDate, 15, ONE);
}
- @Test
+ @Test(groups = {"fast"})
public void testSinglePlan_LessThanOnePeriod() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 2, 15);
final DateTime targetDate = buildDateTime(2011, 3, 1);
@@ -47,7 +46,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
- @Test
+ @Test(groups = {"fast"})
public void testSinglePlan_OnePeriodLessADayAfterStart() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 2, 15);
final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(-1);
@@ -55,7 +54,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
- @Test
+ @Test(groups = {"fast"})
public void testSinglePlan_ExactlyOnePeriodAfterStart() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 2, 15);
final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
@@ -63,7 +62,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
- @Test
+ @Test(groups = {"fast"})
public void testSinglePlan_SlightlyMoreThanOnePeriodAfterStart() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 2, 15);
final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(1);
@@ -71,7 +70,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
- @Test
+ @Test(groups = {"fast"})
public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 12, 15);
final DateTime oneCycleLater = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
@@ -86,7 +85,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(1), 15, TWO);
}
- @Test
+ @Test(groups = {"fast"})
public void testSinglePlan_StartingMidFebruary() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 2, 15);
final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
@@ -94,7 +93,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
- @Test
+ @Test(groups = {"fast"})
public void testSinglePlan_StartingMidFebruaryOfLeapYear() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2012, 2, 15);
final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
@@ -102,7 +101,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
- @Test
+ @Test(groups = {"fast"})
public void testSinglePlan_MovingForwardThroughTime() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 1, 31);
BigDecimal expectedValue = ONE;
@@ -123,7 +122,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
}
// tests for cancellation in less than one period, beginning Jan 1
- @Test
+ @Test(groups = {"fast"})
public void testCancelledBeforeOnePeriod_TargetDateInStartDate() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 1, 1);
final DateTime targetDate = buildDateTime(2011, 1, 1);
@@ -133,7 +132,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
- @Test
+ @Test(groups = {"fast"})
public void testCancelledBeforeOnePeriod_TargetDateInSubscriptionPeriod() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 1, 1);
final DateTime targetDate = buildDateTime(2011, 1, 7);
@@ -143,7 +142,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
- @Test
+ @Test(groups = {"fast"})
public void testCancelledBeforeOnePeriod_TargetDateOnEndDate() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 1, 1);
final DateTime targetDate = buildDateTime(2011, 1, 15);
@@ -153,7 +152,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
- @Test
+ @Test(groups = {"fast"})
public void testCancelledBeforeOnePeriod_TargetDateAfterEndDateButInFirstBillingPeriod() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 1, 1);
final DateTime targetDate = buildDateTime(2011, 1, 17);
@@ -163,7 +162,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
- @Test
+ @Test(groups = {"fast"})
public void testCancelledBeforeOnePeriod_TargetDateAtEndOfFirstBillingPeriod() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 1, 1);
final DateTime targetDate = buildDateTime(2011, 2, 1);
@@ -173,7 +172,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
}
- @Test
+ @Test(groups = {"fast"})
public void testCancelledBeforeOnePeriod_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
final DateTime startDate = buildDateTime(2011, 1, 1);
final DateTime targetDate = buildDateTime(2011, 4, 5);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/GenericProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/GenericProRationTests.java
index b749ab8..87aeac6 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/GenericProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/GenericProRationTests.java
@@ -23,7 +23,6 @@ import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.invoice.tests.inAdvance.GenericProRationTestBase;
-@Test(groups = {"fast", "invoicing", "proRation"})
public class GenericProRationTests extends GenericProRationTestBase {
@Override
protected BillingPeriod getBillingPeriod() {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java
index b8f3848..dca4d61 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java
@@ -22,7 +22,6 @@ import com.ning.billing.invoice.model.BillingMode;
import com.ning.billing.invoice.model.InAdvanceBillingMode;
import com.ning.billing.invoice.tests.ProRationTestBase;
-@Test(groups = {"fast", "invoicing", "proRation"})
public abstract class ProRationInAdvanceTestBase extends ProRationTestBase {
@Override
protected BillingMode getBillingMode() {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/GenericProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/GenericProRationTests.java
index 3351807..72e83d1 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/GenericProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/GenericProRationTests.java
@@ -23,7 +23,6 @@ import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.invoice.tests.inAdvance.GenericProRationTestBase;
-@Test(groups = {"fast", "invoicing", "proRation"})
public class GenericProRationTests extends GenericProRationTestBase {
@Override
protected BillingPeriod getBillingPeriod() {
diff --git a/invoice/src/test/resources/resource.properties b/invoice/src/test/resources/resource.properties
index 4e66149..b271d93 100644
--- a/invoice/src/test/resources/resource.properties
+++ b/invoice/src/test/resources/resource.properties
@@ -1 +1 @@
-com.ning.billing.invoice.maxNumberOfMonthsInFuture = 36
\ No newline at end of file
+com.ning.billing.invoice.maxNumberOfMonthsInFuture = 36
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 94ed09a..789ccc3 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
@@ -92,8 +92,10 @@ public class AccountTimelineJson {
}
this.invoices = new LinkedList<InvoiceJsonWithBundleKeys>();
for (final Invoice cur : invoices) {
- this.invoices.add(new InvoiceJsonWithBundleKeys(cur.getAmountPaid(),
- cur.getAmountCredited(),
+ this.invoices.add(new InvoiceJsonWithBundleKeys(cur.getPaidAmount(),
+ cur.getCBAAmount(),
+ cur.getCreditAdjAmount(),
+ cur.getRefundAdjAmount(),
cur.getId().toString(),
cur.getInvoiceDate(),
cur.getTargetDate(),
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/ChargebackJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/ChargebackJson.java
index f9b681f..70385a6 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/ChargebackJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/ChargebackJson.java
@@ -49,7 +49,7 @@ public class ChargebackJson {
this.requestedDate = null;
this.effectiveDate = chargeback.getPaymentAttemptDate();
this.chargebackAmount = chargeback.getAmount().negate();
- this.paymentId = chargeback.getReversedInvoicePaymentId().toString();
+ this.paymentId = chargeback.getLinkedInvoicePaymentId().toString();
this.reason = null;
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
index 2cb2447..670c0c6 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
@@ -32,25 +32,31 @@ public class InvoiceJsonSimple {
private final DateTime invoiceDate;
private final DateTime targetDate;
private final String invoiceNumber;
- private final BigDecimal credit;
private final BigDecimal balance;
+ private final BigDecimal creditAdj;
+ private final BigDecimal refundAdj;
+ private final BigDecimal cba;
private final String accountId;
public InvoiceJsonSimple() {
- this(BigDecimal.ZERO, BigDecimal.ZERO, null, null, null, null, BigDecimal.ZERO, null);
+ this(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO , BigDecimal.ZERO, null, null, null, null, BigDecimal.ZERO, null);
}
@JsonCreator
public InvoiceJsonSimple(@JsonProperty("amount") final BigDecimal amount,
- @JsonProperty("credit") final BigDecimal credit,
- @JsonProperty("invoiceId") @Nullable final String invoiceId,
- @JsonProperty("invoiceDate") @Nullable final DateTime invoiceDate,
- @JsonProperty("targetDate") @Nullable final DateTime targetDate,
- @JsonProperty("invoiceNumber") @Nullable final String invoiceNumber,
- @JsonProperty("balance") final BigDecimal balance,
- @JsonProperty("accountId") @Nullable final String accountId) {
+ @JsonProperty("cba") final BigDecimal cba,
+ @JsonProperty("creditAdj") final BigDecimal creditAdj,
+ @JsonProperty("refundAdj") final BigDecimal refundAdj,
+ @JsonProperty("invoiceId") @Nullable final String invoiceId,
+ @JsonProperty("invoiceDate") @Nullable final DateTime invoiceDate,
+ @JsonProperty("targetDate") @Nullable final DateTime targetDate,
+ @JsonProperty("invoiceNumber") @Nullable final String invoiceNumber,
+ @JsonProperty("balance") final BigDecimal balance,
+ @JsonProperty("accountId") @Nullable final String accountId) {
this.amount = amount;
- this.credit = credit;
+ this.cba = cba;
+ this.creditAdj = creditAdj;
+ this.refundAdj = refundAdj;
this.invoiceId = invoiceId;
this.invoiceDate = invoiceDate;
this.targetDate = targetDate;
@@ -60,16 +66,24 @@ public class InvoiceJsonSimple {
}
public InvoiceJsonSimple(final Invoice input) {
- this(input.getAmountCharged(), input.getAmountCredited(), input.getId().toString(), input.getInvoiceDate(),
- input.getTargetDate(), String.valueOf(input.getInvoiceNumber()), input.getBalance(), input.getAccountId().toString());
+ this(input.getChargedAmount(), input.getCBAAmount(), input.getCreditAdjAmount(), input.getRefundAdjAmount(), input.getId().toString(), input.getInvoiceDate(),
+ input.getTargetDate(), String.valueOf(input.getInvoiceNumber()), input.getBalance(), input.getAccountId().toString());
}
public BigDecimal getAmount() {
return amount;
}
- public BigDecimal getCredit() {
- return credit;
+ public BigDecimal getCBA() {
+ return cba;
+ }
+
+ public BigDecimal getCreditAdj() {
+ return creditAdj;
+ }
+
+ public BigDecimal getRefundAdj() {
+ return refundAdj;
}
public String getInvoiceId() {
@@ -118,8 +132,16 @@ public class InvoiceJsonSimple {
(balance != null && that.balance != null && balance.compareTo(that.balance) == 0))) {
return false;
}
- if (!((credit == null && that.credit == null) ||
- (credit != null && that.credit != null && credit.compareTo(that.credit) == 0))) {
+ if (!((cba == null && that.cba == null) ||
+ (cba != null && that.cba != null && cba.compareTo(that.cba) == 0))) {
+ return false;
+ }
+ if (!((creditAdj == null && that.creditAdj == null) ||
+ (creditAdj != null && that.creditAdj != null && creditAdj.compareTo(that.creditAdj) == 0))) {
+ return false;
+ }
+ if (!((refundAdj == null && that.refundAdj == null) ||
+ (refundAdj != null && that.refundAdj != null && refundAdj.compareTo(that.refundAdj) == 0))) {
return false;
}
if (!((invoiceDate == null && that.invoiceDate == null) ||
@@ -143,7 +165,9 @@ public class InvoiceJsonSimple {
@Override
public int hashCode() {
int result = amount != null ? amount.hashCode() : 0;
- result = 31 * result + (credit != null ? credit.hashCode() : 0);
+ result = 31 * result + (cba != null ? cba.hashCode() : 0);
+ result = 31 * result + (creditAdj != null ? creditAdj.hashCode() : 0);
+ result = 31 * result + (refundAdj != null ? refundAdj.hashCode() : 0);
result = 31 * result + (invoiceId != null ? invoiceId.hashCode() : 0);
result = 31 * result + (invoiceDate != null ? invoiceDate.hashCode() : 0);
result = 31 * result + (targetDate != null ? targetDate.hashCode() : 0);
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 67d5e6a..963e78b 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
@@ -34,15 +34,17 @@ public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
@JsonCreator
public InvoiceJsonWithBundleKeys(@JsonProperty("amount") final BigDecimal amount,
- @JsonProperty("credit") final BigDecimal credit,
- @JsonProperty("invoiceId") final String invoiceId,
- @JsonProperty("invoiceDate") final DateTime invoiceDate,
- @JsonProperty("targetDate") final DateTime targetDate,
- @JsonProperty("invoiceNumber") final String invoiceNumber,
- @JsonProperty("balance") final BigDecimal balance,
- @JsonProperty("accountId") final String accountId,
- @JsonProperty("externalBundleKeys") final String bundleKeys) {
- super(amount, credit, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId);
+ @JsonProperty("cba") final BigDecimal cba,
+ @JsonProperty("creditAdj") final BigDecimal creditAdj,
+ @JsonProperty("refundAdj") final BigDecimal refundAdj,
+ @JsonProperty("invoiceId") final String invoiceId,
+ @JsonProperty("invoiceDate") final DateTime invoiceDate,
+ @JsonProperty("targetDate") final DateTime targetDate,
+ @JsonProperty("invoiceNumber") final String invoiceNumber,
+ @JsonProperty("balance") final BigDecimal balance,
+ @JsonProperty("accountId") final String accountId,
+ @JsonProperty("externalBundleKeys") final String bundleKeys) {
+ super(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId);
this.bundleKeys = bundleKeys;
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
index 6c5445e..ab26af2 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
@@ -33,15 +33,17 @@ public class InvoiceJsonWithItems extends InvoiceJsonSimple {
@JsonCreator
public InvoiceJsonWithItems(@JsonProperty("amount") final BigDecimal amount,
- @JsonProperty("credit") final BigDecimal credit,
- @JsonProperty("invoiceId") final String invoiceId,
- @JsonProperty("invoiceDate") final DateTime invoiceDate,
- @JsonProperty("targetDate") final DateTime targetDate,
- @JsonProperty("invoiceNumber") final String invoiceNumber,
- @JsonProperty("balance") final BigDecimal balance,
- @JsonProperty("accountId") final String accountId,
- @JsonProperty("items") final List<InvoiceItemJsonSimple> items) {
- super(amount, credit, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId);
+ @JsonProperty("cba") final BigDecimal cba,
+ @JsonProperty("creditAdj") final BigDecimal creditAdj,
+ @JsonProperty("refundAdj") final BigDecimal refundAdj,
+ @JsonProperty("invoiceId") final String invoiceId,
+ @JsonProperty("invoiceDate") final DateTime invoiceDate,
+ @JsonProperty("targetDate") final DateTime targetDate,
+ @JsonProperty("invoiceNumber") final String invoiceNumber,
+ @JsonProperty("balance") final BigDecimal balance,
+ @JsonProperty("accountId") final String accountId,
+ @JsonProperty("items") final List<InvoiceItemJsonSimple> items) {
+ super(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId);
this.items = new ArrayList<InvoiceItemJsonSimple>(items);
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/ChargebackResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/ChargebackResource.java
index 8823018..2ce2493 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/ChargebackResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/ChargebackResource.java
@@ -166,7 +166,7 @@ public class ChargebackResource implements JaxrsResource {
return Response.status(Response.Status.NO_CONTENT).entity(error).build();
}
- final InvoicePayment chargeBack = invoicePaymentApi.processChargeback(invoicePayment.getId(), json.getChargebackAmount(),
+ final InvoicePayment chargeBack = invoicePaymentApi.createChargeback(invoicePayment.getId(), json.getChargebackAmount(),
context.createContext(createdBy, reason, comment));
return uriBuilder.buildResponse(ChargebackResource.class, "getChargeback", chargeBack.getId());
} catch (InvoiceApiException e) {
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
index 8e6f306..0331473 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
@@ -94,7 +94,9 @@ public class TestBundleTimelineJson {
"\"currency\":\"" + payment.getCurrency() + "\"," +
"\"status\":\"" + payment.getStatus() + "\"}]," +
"\"invoices\":[{\"amount\":" + invoice.getAmount() + "," +
- "\"credit\":" + invoice.getCredit() + "," +
+ "\"cba\":" + invoice.getCBA() + "," +
+ "\"creditAdj\":" + invoice.getCreditAdj() + "," +
+ "\"refundAdj\":" + invoice.getRefundAdj() + "," +
"\"invoiceId\":\"" + invoice.getInvoiceId() + "\"," +
"\"invoiceDate\":\"" + invoice.getInvoiceDate().toDateTimeISO().toString() + "\"," +
"\"targetDate\":\"" + invoice.getTargetDate() + "\"," +
@@ -134,13 +136,15 @@ public class TestBundleTimelineJson {
final UUID accountId = UUID.randomUUID();
final UUID invoiceId = UUID.randomUUID();
final BigDecimal invoiceAmount = BigDecimal.TEN;
- final BigDecimal credit = BigDecimal.ONE;
+ final BigDecimal cba = BigDecimal.ONE;
+ final BigDecimal creditAdj = BigDecimal.ONE;
+ final BigDecimal refundAdj = BigDecimal.ONE;
final DateTime invoiceDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
final DateTime targetDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
final String invoiceNumber = UUID.randomUUID().toString();
final BigDecimal balance = BigDecimal.ZERO;
- return new InvoiceJsonSimple(invoiceAmount, credit, invoiceId.toString(), invoiceDate,
+ return new InvoiceJsonSimple(invoiceAmount, cba, creditAdj, refundAdj, invoiceId.toString(), invoiceDate,
targetDate, invoiceNumber, balance, accountId.toString());
}
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java
index 64f0ac0..bd5ab0d 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java
@@ -41,17 +41,21 @@ public class TestInvoiceJsonSimple {
@Test(groups = "fast")
public void testJson() throws Exception {
final BigDecimal amount = BigDecimal.TEN;
- final BigDecimal credit = BigDecimal.ONE;
+ final BigDecimal cba = BigDecimal.ONE;
+ final BigDecimal creditAdj = BigDecimal.ONE;
+ final BigDecimal refundAdj = BigDecimal.ONE;
final String invoiceId = UUID.randomUUID().toString();
final DateTime invoiceDate = new DateTime(DateTimeZone.UTC);
final DateTime targetDate = new DateTime(DateTimeZone.UTC);
final String invoiceNumber = UUID.randomUUID().toString();
final BigDecimal balance = BigDecimal.ZERO;
final String accountId = UUID.randomUUID().toString();
- final InvoiceJsonSimple invoiceJsonSimple = new InvoiceJsonSimple(amount, credit, invoiceId, invoiceDate,
+ final InvoiceJsonSimple invoiceJsonSimple = new InvoiceJsonSimple(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate,
targetDate, invoiceNumber, balance, accountId);
Assert.assertEquals(invoiceJsonSimple.getAmount(), amount);
- Assert.assertEquals(invoiceJsonSimple.getCredit(), credit);
+ Assert.assertEquals(invoiceJsonSimple.getCBA(), cba);
+ Assert.assertEquals(invoiceJsonSimple.getCreditAdj(), creditAdj);
+ Assert.assertEquals(invoiceJsonSimple.getRefundAdj(), refundAdj);
Assert.assertEquals(invoiceJsonSimple.getInvoiceId(), invoiceId);
Assert.assertEquals(invoiceJsonSimple.getInvoiceDate(), invoiceDate);
Assert.assertEquals(invoiceJsonSimple.getTargetDate(), targetDate);
@@ -61,7 +65,9 @@ public class TestInvoiceJsonSimple {
final String asJson = mapper.writeValueAsString(invoiceJsonSimple);
Assert.assertEquals(asJson, "{\"amount\":" + invoiceJsonSimple.getAmount().toString() + "," +
- "\"credit\":" + invoiceJsonSimple.getCredit().toString() + "," +
+ "\"cba\":" + invoiceJsonSimple.getCBA().toString() + "," +
+ "\"creditAdj\":" + invoiceJsonSimple.getCreditAdj().toString() + "," +
+ "\"refundAdj\":" + invoiceJsonSimple.getRefundAdj().toString() + "," +
"\"invoiceId\":\"" + invoiceJsonSimple.getInvoiceId() + "\"," +
"\"invoiceDate\":\"" + invoiceJsonSimple.getInvoiceDate().toDateTimeISO().toString() + "\"," +
"\"targetDate\":\"" + invoiceJsonSimple.getTargetDate().toDateTimeISO().toString() + "\"," +
@@ -76,8 +82,10 @@ public class TestInvoiceJsonSimple {
@Test(groups = "fast")
public void testFromInvoice() throws Exception {
final Invoice invoice = Mockito.mock(Invoice.class);
- Mockito.when(invoice.getAmountCharged()).thenReturn(BigDecimal.TEN);
- Mockito.when(invoice.getAmountCredited()).thenReturn(BigDecimal.ONE);
+ Mockito.when(invoice.getChargedAmount()).thenReturn(BigDecimal.TEN);
+ Mockito.when(invoice.getCBAAmount()).thenReturn(BigDecimal.ONE);
+ Mockito.when(invoice.getCreditAdjAmount()).thenReturn(BigDecimal.ONE);
+ Mockito.when(invoice.getRefundAdjAmount()).thenReturn(BigDecimal.ONE);
Mockito.when(invoice.getId()).thenReturn(UUID.randomUUID());
Mockito.when(invoice.getInvoiceDate()).thenReturn(new DateTime(DateTimeZone.UTC));
Mockito.when(invoice.getTargetDate()).thenReturn(new DateTime(DateTimeZone.UTC));
@@ -86,8 +94,10 @@ public class TestInvoiceJsonSimple {
Mockito.when(invoice.getAccountId()).thenReturn(UUID.randomUUID());
final InvoiceJsonSimple invoiceJsonSimple = new InvoiceJsonSimple(invoice);
- Assert.assertEquals(invoiceJsonSimple.getAmount(), invoice.getAmountCharged());
- Assert.assertEquals(invoiceJsonSimple.getCredit(), invoice.getAmountCredited());
+ Assert.assertEquals(invoiceJsonSimple.getAmount(), invoice.getChargedAmount());
+ Assert.assertEquals(invoiceJsonSimple.getCBA(), invoice.getCBAAmount());
+ Assert.assertEquals(invoiceJsonSimple.getCreditAdj(), invoice.getCreditAdjAmount());
+ Assert.assertEquals(invoiceJsonSimple.getRefundAdj(), invoice.getRefundAdjAmount());
Assert.assertEquals(invoiceJsonSimple.getInvoiceId(), invoice.getId().toString());
Assert.assertEquals(invoiceJsonSimple.getInvoiceDate(), invoice.getInvoiceDate());
Assert.assertEquals(invoiceJsonSimple.getTargetDate(), invoice.getTargetDate());
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 8603492..dd4cbad 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
@@ -41,7 +41,9 @@ public class TestInvoiceJsonWithBundleKeys {
@Test(groups = "fast")
public void testJson() throws Exception {
final BigDecimal amount = BigDecimal.TEN;
- final BigDecimal credit = BigDecimal.ONE;
+ final BigDecimal cba = BigDecimal.ONE;
+ final BigDecimal creditAdj = BigDecimal.ONE;
+ final BigDecimal refundAdj = BigDecimal.ONE;
final String invoiceId = UUID.randomUUID().toString();
final DateTime invoiceDate = new DateTime(DateTimeZone.UTC);
final DateTime targetDate = new DateTime(DateTimeZone.UTC);
@@ -49,10 +51,12 @@ public class TestInvoiceJsonWithBundleKeys {
final BigDecimal balance = BigDecimal.ZERO;
final String accountId = UUID.randomUUID().toString();
final String bundleKeys = UUID.randomUUID().toString();
- final InvoiceJsonWithBundleKeys invoiceJsonSimple = new InvoiceJsonWithBundleKeys(amount, credit, invoiceId, invoiceDate,
+ final InvoiceJsonWithBundleKeys invoiceJsonSimple = new InvoiceJsonWithBundleKeys(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate,
targetDate, invoiceNumber, balance, accountId, bundleKeys);
Assert.assertEquals(invoiceJsonSimple.getAmount(), amount);
- Assert.assertEquals(invoiceJsonSimple.getCredit(), credit);
+ Assert.assertEquals(invoiceJsonSimple.getCBA(), cba);
+ Assert.assertEquals(invoiceJsonSimple.getCreditAdj(), creditAdj);
+ Assert.assertEquals(invoiceJsonSimple.getRefundAdj(), refundAdj);
Assert.assertEquals(invoiceJsonSimple.getInvoiceId(), invoiceId);
Assert.assertEquals(invoiceJsonSimple.getInvoiceDate(), invoiceDate);
Assert.assertEquals(invoiceJsonSimple.getTargetDate(), targetDate);
@@ -63,7 +67,9 @@ public class TestInvoiceJsonWithBundleKeys {
final String asJson = mapper.writeValueAsString(invoiceJsonSimple);
Assert.assertEquals(asJson, "{\"amount\":" + invoiceJsonSimple.getAmount().toString() + "," +
- "\"credit\":" + invoiceJsonSimple.getCredit().toString() + "," +
+ "\"cba\":" + invoiceJsonSimple.getCBA().toString() + "," +
+ "\"creditAdj\":" + invoiceJsonSimple.getCreditAdj().toString() + "," +
+ "\"refundAdj\":" + invoiceJsonSimple.getRefundAdj().toString() + "," +
"\"invoiceId\":\"" + invoiceJsonSimple.getInvoiceId() + "\"," +
"\"invoiceDate\":\"" + invoiceJsonSimple.getInvoiceDate().toDateTimeISO().toString() + "\"," +
"\"targetDate\":\"" + invoiceJsonSimple.getTargetDate().toDateTimeISO().toString() + "\"," +
@@ -79,8 +85,10 @@ public class TestInvoiceJsonWithBundleKeys {
@Test(groups = "fast")
public void testFromInvoice() throws Exception {
final Invoice invoice = Mockito.mock(Invoice.class);
- Mockito.when(invoice.getAmountCharged()).thenReturn(BigDecimal.TEN);
- Mockito.when(invoice.getAmountCredited()).thenReturn(BigDecimal.ONE);
+ Mockito.when(invoice.getChargedAmount()).thenReturn(BigDecimal.TEN);
+ Mockito.when(invoice.getCBAAmount()).thenReturn(BigDecimal.ONE);
+ Mockito.when(invoice.getCreditAdjAmount()).thenReturn(BigDecimal.ONE);
+ Mockito.when(invoice.getRefundAdjAmount()).thenReturn(BigDecimal.ONE);
Mockito.when(invoice.getId()).thenReturn(UUID.randomUUID());
Mockito.when(invoice.getInvoiceDate()).thenReturn(new DateTime(DateTimeZone.UTC));
Mockito.when(invoice.getTargetDate()).thenReturn(new DateTime(DateTimeZone.UTC));
@@ -91,8 +99,10 @@ public class TestInvoiceJsonWithBundleKeys {
final String bundleKeys = UUID.randomUUID().toString();
final InvoiceJsonWithBundleKeys invoiceJsonWithBundleKeys = new InvoiceJsonWithBundleKeys(invoice, bundleKeys);
- Assert.assertEquals(invoiceJsonWithBundleKeys.getAmount(), invoice.getAmountCharged());
- Assert.assertEquals(invoiceJsonWithBundleKeys.getCredit(), invoice.getAmountCredited());
+ Assert.assertEquals(invoiceJsonWithBundleKeys.getAmount(), invoice.getChargedAmount());
+ Assert.assertEquals(invoiceJsonWithBundleKeys.getCBA(), invoice.getCBAAmount());
+ Assert.assertEquals(invoiceJsonWithBundleKeys.getCreditAdj(), invoice.getCreditAdjAmount());
+ Assert.assertEquals(invoiceJsonWithBundleKeys.getRefundAdj(), invoice.getRefundAdjAmount());
Assert.assertEquals(invoiceJsonWithBundleKeys.getInvoiceId(), invoice.getId().toString());
Assert.assertEquals(invoiceJsonWithBundleKeys.getInvoiceDate(), invoice.getInvoiceDate());
Assert.assertEquals(invoiceJsonWithBundleKeys.getTargetDate(), invoice.getTargetDate());
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java
index c7bd606..89766c0 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java
@@ -44,7 +44,9 @@ public class TestInvoiceJsonWithItems {
@Test(groups = "fast")
public void testJson() throws Exception {
final BigDecimal amount = BigDecimal.TEN;
- final BigDecimal credit = BigDecimal.ONE;
+ final BigDecimal cba = BigDecimal.ONE;
+ final BigDecimal creditAdj = BigDecimal.ONE;
+ final BigDecimal refundAdj = BigDecimal.ONE;
final String invoiceId = UUID.randomUUID().toString();
final DateTime invoiceDate = new DateTime(DateTimeZone.UTC);
final DateTime targetDate = new DateTime(DateTimeZone.UTC);
@@ -52,11 +54,13 @@ public class TestInvoiceJsonWithItems {
final BigDecimal balance = BigDecimal.ZERO;
final String accountId = UUID.randomUUID().toString();
final InvoiceItemJsonSimple invoiceItemJsonSimple = createInvoiceItemJson();
- final InvoiceJsonWithItems invoiceJsonWithItems = new InvoiceJsonWithItems(amount, credit, invoiceId, invoiceDate,
+ final InvoiceJsonWithItems invoiceJsonWithItems = new InvoiceJsonWithItems(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate,
targetDate, invoiceNumber, balance, accountId,
ImmutableList.<InvoiceItemJsonSimple>of(invoiceItemJsonSimple));
Assert.assertEquals(invoiceJsonWithItems.getAmount(), amount);
- Assert.assertEquals(invoiceJsonWithItems.getCredit(), credit);
+ Assert.assertEquals(invoiceJsonWithItems.getCBA(), cba);
+ Assert.assertEquals(invoiceJsonWithItems.getCreditAdj(), creditAdj);
+ Assert.assertEquals(invoiceJsonWithItems.getRefundAdj(), refundAdj);
Assert.assertEquals(invoiceJsonWithItems.getInvoiceId(), invoiceId);
Assert.assertEquals(invoiceJsonWithItems.getInvoiceDate(), invoiceDate);
Assert.assertEquals(invoiceJsonWithItems.getTargetDate(), targetDate);
@@ -68,7 +72,9 @@ public class TestInvoiceJsonWithItems {
final String asJson = mapper.writeValueAsString(invoiceJsonWithItems);
Assert.assertEquals(asJson, "{\"amount\":" + invoiceJsonWithItems.getAmount().toString() + "," +
- "\"credit\":" + invoiceJsonWithItems.getCredit().toString() + "," +
+ "\"cba\":" + invoiceJsonWithItems.getCBA().toString() + "," +
+ "\"creditAdj\":" + invoiceJsonWithItems.getCreditAdj().toString() + "," +
+ "\"refundAdj\":" + invoiceJsonWithItems.getRefundAdj().toString() + "," +
"\"invoiceId\":\"" + invoiceJsonWithItems.getInvoiceId() + "\"," +
"\"invoiceDate\":\"" + invoiceJsonWithItems.getInvoiceDate().toDateTimeISO().toString() + "\"," +
"\"targetDate\":\"" + invoiceJsonWithItems.getTargetDate().toDateTimeISO().toString() + "\"," +
@@ -94,8 +100,7 @@ public class TestInvoiceJsonWithItems {
@Test(groups = "fast")
public void testFromInvoice() throws Exception {
final Invoice invoice = Mockito.mock(Invoice.class);
- Mockito.when(invoice.getAmountCharged()).thenReturn(BigDecimal.TEN);
- Mockito.when(invoice.getAmountCredited()).thenReturn(BigDecimal.ONE);
+ Mockito.when(invoice.getChargedAmount()).thenReturn(BigDecimal.TEN);
Mockito.when(invoice.getId()).thenReturn(UUID.randomUUID());
Mockito.when(invoice.getInvoiceDate()).thenReturn(new DateTime(DateTimeZone.UTC));
Mockito.when(invoice.getTargetDate()).thenReturn(new DateTime(DateTimeZone.UTC));
@@ -106,8 +111,7 @@ public class TestInvoiceJsonWithItems {
Mockito.when(invoice.getInvoiceItems()).thenReturn(ImmutableList.<InvoiceItem>of(invoiceItem));
final InvoiceJsonWithItems invoiceJsonWithItems = new InvoiceJsonWithItems(invoice);
- Assert.assertEquals(invoiceJsonWithItems.getAmount(), invoice.getAmountCharged());
- Assert.assertEquals(invoiceJsonWithItems.getCredit(), invoice.getAmountCredited());
+ Assert.assertEquals(invoiceJsonWithItems.getAmount(), invoice.getChargedAmount());
Assert.assertEquals(invoiceJsonWithItems.getInvoiceId(), invoice.getId().toString());
Assert.assertEquals(invoiceJsonWithItems.getInvoiceDate(), invoice.getInvoiceDate());
Assert.assertEquals(invoiceJsonWithItems.getTargetDate(), invoice.getTargetDate());
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
index 20e30b5..03c38ef 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2010-2011 Ning, Inc.
*
* Ning licenses this file to you under the Apache License, version 2.0
@@ -303,11 +303,11 @@ public class PaymentProcessor extends ProcessorBase {
payment = paymentDao.getPayment(paymentInput.getId());
invoicePaymentApi.notifyOfPaymentAttempt(invoice.getId(),
- paymentStatus == PaymentStatus.SUCCESS ? payment.getAmount() : null,
- paymentStatus == PaymentStatus.SUCCESS ? payment.getCurrency() : null,
- lastAttempt.getId(),
- lastAttempt.getEffectiveDate(),
- context);
+ payment.getAmount(),
+ paymentStatus == PaymentStatus.SUCCESS ? payment.getCurrency() : null,
+ lastAttempt.getId(),
+ lastAttempt.getEffectiveDate(),
+ context);
// Create Bus event
event = new DefaultPaymentInfoEvent(account.getId(),
diff --git a/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java b/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
index 4e5c71f..9d31f67 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2010-2011 Ning, Inc.
*
* Ning licenses this file to you under the Apache License, version 2.0
@@ -36,7 +36,7 @@ import com.ning.billing.util.bus.Bus.EventBusException;
import com.ning.billing.util.bus.BusEvent;
import com.ning.billing.util.globallocker.GlobalLock;
import com.ning.billing.util.globallocker.GlobalLocker;
-import com.ning.billing.util.globallocker.GlobalLocker.LockerService;
+import com.ning.billing.util.globallocker.GlobalLocker.LockerType;
import com.ning.billing.util.globallocker.LockFailedException;
public abstract class ProcessorBase {
@@ -138,7 +138,7 @@ public abstract class ProcessorBase {
throws PaymentApiException {
GlobalLock lock = null;
try {
- lock = locker.lockWithNumberOfTries(LockerService.PAYMENT, accountExternalKey, NB_LOCK_TRY);
+ lock = locker.lockWithNumberOfTries(LockerType.ACCOUNT, accountExternalKey, NB_LOCK_TRY);
return callback.doOperation();
} catch (LockFailedException e) {
final String format = String.format("Failed to lock account %s", accountExternalKey);
diff --git a/payment/src/test/java/com/ning/billing/payment/MockInvoice.java b/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
index 9cabab5..d87dfb1 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
@@ -168,7 +168,7 @@ public class MockInvoice extends EntityBase implements Invoice {
}
@Override
- public BigDecimal getAmountPaid() {
+ public BigDecimal getPaidAmount() {
BigDecimal amountPaid = BigDecimal.ZERO;
for (final InvoicePayment payment : payments) {
if (payment.getAmount() != null) {
@@ -179,11 +179,11 @@ public class MockInvoice extends EntityBase implements Invoice {
}
@Override
- public BigDecimal getAmountCharged() {
+ public BigDecimal getChargedAmount() {
BigDecimal result = BigDecimal.ZERO;
for (final InvoiceItem i : invoiceItems) {
- if (!i.getInvoiceItemType().equals(InvoiceItemType.CREDIT)) {
+ if (!i.getInvoiceItemType().equals(InvoiceItemType.CBA_ADJ)) {
result = result.add(i.getAmount());
}
}
@@ -191,11 +191,11 @@ public class MockInvoice extends EntityBase implements Invoice {
}
@Override
- public BigDecimal getAmountCredited() {
+ public BigDecimal getCreditAdjAmount() {
BigDecimal result = BigDecimal.ZERO;
for (final InvoiceItem i : invoiceItems) {
- if (i.getInvoiceItemType().equals(InvoiceItemType.CREDIT)) {
+ if (i.getInvoiceItemType().equals(InvoiceItemType.CBA_ADJ)) {
result = result.add(i.getAmount());
}
}
@@ -204,7 +204,7 @@ public class MockInvoice extends EntityBase implements Invoice {
@Override
public BigDecimal getBalance() {
- return getAmountCharged().subtract(getAmountPaid().subtract(getAmountCredited()));
+ return getChargedAmount().subtract(getPaidAmount());
}
@Override
@@ -223,7 +223,25 @@ public class MockInvoice extends EntityBase implements Invoice {
@Override
public String toString() {
- return "DefaultInvoice [items=" + invoiceItems + ", payments=" + payments + ", id=" + id + ", accountId=" + accountId + ", invoiceDate=" + invoiceDate + ", targetDate=" + targetDate + ", currency=" + currency + ", amountPaid=" + getAmountPaid() + ", lastPaymentAttempt=" + getLastPaymentAttempt() + "]";
+ return "DefaultInvoice [items=" + invoiceItems + ", payments=" + payments + ", id=" + id + ", accountId=" + accountId + ", invoiceDate=" + invoiceDate + ", targetDate=" + targetDate + ", currency=" + currency + ", amountPaid=" + getPaidAmount() + ", lastPaymentAttempt=" + getLastPaymentAttempt() + "]";
+ }
+
+ @Override
+ public BigDecimal getCBAAmount() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public BigDecimal getTotalAdjAmount() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public BigDecimal getRefundAdjAmount() {
+ // TODO Auto-generated method stub
+ return null;
}
}
diff --git a/payment/src/test/java/com/ning/billing/payment/MockRecurringInvoiceItem.java b/payment/src/test/java/com/ning/billing/payment/MockRecurringInvoiceItem.java
index 534bfb2..054d995 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockRecurringInvoiceItem.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockRecurringInvoiceItem.java
@@ -113,6 +113,7 @@ public class MockRecurringInvoiceItem extends EntityBase implements InvoiceItem
return bundleId;
}
+ @Override
public UUID getAccountId() {
return accountId;
}
@@ -158,16 +159,12 @@ public class MockRecurringInvoiceItem extends EntityBase implements InvoiceItem
}
@Override
- public InvoiceItem asReversingItem() {
- throw new UnsupportedOperationException();
- }
-
- @Override
public String getDescription() {
return String.format("%s from %s to %s", phaseName, startDate.toString(), endDate.toString());
}
- public UUID getReversedItemId() {
+ @Override
+ public UUID getLinkedItemId() {
return reversedItemId;
}
@@ -175,6 +172,7 @@ public class MockRecurringInvoiceItem extends EntityBase implements InvoiceItem
return (reversedItemId != null);
}
+ @Override
public BigDecimal getRate() {
return rate;
}
diff --git a/util/src/main/java/com/ning/billing/util/dao/TableName.java b/util/src/main/java/com/ning/billing/util/dao/TableName.java
index 1620b13..4008f2e 100644
--- a/util/src/main/java/com/ning/billing/util/dao/TableName.java
+++ b/util/src/main/java/com/ning/billing/util/dao/TableName.java
@@ -21,16 +21,14 @@ public enum TableName {
ACCOUNT_HISTORY("account_history"),
ACCOUNT_EMAIL_HISTORY("account_email_history"),
BUNDLES("bundles"),
- CREDIT_INVOICE_ITEMS("credit_invoice_items"),
CUSTOM_FIELD_HISTORY("custom_field_history"),
- FIXED_INVOICE_ITEMS("fixed_invoice_items"),
+ INVOICE_ITEMS("invoice_items"),
INVOICE_PAYMENTS("invoice_payments"),
INVOICES("invoices"),
PAYMENT_ATTEMPTS("payment_attempts"),
PAYMENT_HISTORY("payment_history"),
PAYMENTS("payments"),
PAYMENT_METHODS("payment_methods"),
- RECURRING_INVOICE_ITEMS("recurring_invoice_items"),
SUBSCRIPTIONS("subscriptions"),
SUBSCRIPTION_EVENTS("subscription_events"),
TAG_HISTORY("tag_history");
diff --git a/util/src/main/java/com/ning/billing/util/globallocker/GlobalLocker.java b/util/src/main/java/com/ning/billing/util/globallocker/GlobalLocker.java
index daddf1a..7c59a47 100644
--- a/util/src/main/java/com/ning/billing/util/globallocker/GlobalLocker.java
+++ b/util/src/main/java/com/ning/billing/util/globallocker/GlobalLocker.java
@@ -18,24 +18,12 @@ package com.ning.billing.util.globallocker;
public interface GlobalLocker {
- GlobalLock lockWithNumberOfTries(final LockerService service, final String lockKey, final int retry);
+ GlobalLock lockWithNumberOfTries(final LockerType service, final String lockKey, final int retry);
- Boolean isFree(final LockerService service, final String lockKey);
+ Boolean isFree(final LockerType service, final String lockKey);
- public enum LockerService {
-
- INVOICE("invoice"),
- PAYMENT("payment");
-
- private final String svcName;
-
- LockerService(final String svcName) {
- this.svcName = svcName;
- }
-
- @Override
- public String toString() {
- return svcName;
- }
+ public enum LockerType {
+ // Global ACCOUNT locking
+ ACCOUNT
}
}
diff --git a/util/src/main/java/com/ning/billing/util/globallocker/MySqlGlobalLocker.java b/util/src/main/java/com/ning/billing/util/globallocker/MySqlGlobalLocker.java
index 95e61bc..248aeef 100644
--- a/util/src/main/java/com/ning/billing/util/globallocker/MySqlGlobalLocker.java
+++ b/util/src/main/java/com/ning/billing/util/globallocker/MySqlGlobalLocker.java
@@ -27,7 +27,7 @@ public class MySqlGlobalLocker implements GlobalLocker {
private static final Logger logger = LoggerFactory.getLogger(MySqlGlobalLocker.class);
- private static final long DEFAULT_TIMEOUT = 3L; // 3 seconds
+ private static final long DEFAULT_TIMEOUT = 5L; // 5 seconds
private final IDBI dbi;
private long timeout;
@@ -43,7 +43,7 @@ public class MySqlGlobalLocker implements GlobalLocker {
}
@Override
- public GlobalLock lockWithNumberOfTries(final LockerService service, final String lockKey, final int retry) {
+ public GlobalLock lockWithNumberOfTries(final LockerType service, final String lockKey, final int retry) {
final String lockName = getLockName(service, lockKey);
int tries_left = retry;
@@ -82,7 +82,7 @@ public class MySqlGlobalLocker implements GlobalLocker {
}
@Override
- public Boolean isFree(final LockerService service, final String lockKey) {
+ public Boolean isFree(final LockerType service, final String lockKey) {
final String lockName = getLockName(service, lockKey);
final Handle h = dbi.open();
@@ -96,7 +96,7 @@ public class MySqlGlobalLocker implements GlobalLocker {
}
}
- private String getLockName(final LockerService service, final String lockKey) {
+ private String getLockName(final LockerType service, final String lockKey) {
final StringBuilder tmp = new StringBuilder()
.append(service.toString())
.append("-")
diff --git a/util/src/test/java/com/ning/billing/util/globallocker/MockGlobalLocker.java b/util/src/test/java/com/ning/billing/util/globallocker/MockGlobalLocker.java
index 4a1ff01..1e46918 100644
--- a/util/src/test/java/com/ning/billing/util/globallocker/MockGlobalLocker.java
+++ b/util/src/test/java/com/ning/billing/util/globallocker/MockGlobalLocker.java
@@ -19,7 +19,7 @@ package com.ning.billing.util.globallocker;
public class MockGlobalLocker implements GlobalLocker {
@Override
- public GlobalLock lockWithNumberOfTries(final LockerService service,
+ public GlobalLock lockWithNumberOfTries(final LockerType service,
final String lockKey, final int retry) {
return new GlobalLock() {
@Override
@@ -29,7 +29,7 @@ public class MockGlobalLocker implements GlobalLocker {
}
@Override
- public Boolean isFree(final LockerService service, final String lockKey) {
+ public Boolean isFree(final LockerType service, final String lockKey) {
return Boolean.TRUE;
}
}
diff --git a/util/src/test/java/com/ning/billing/util/globallocker/TestMysqlGlobalLocker.java b/util/src/test/java/com/ning/billing/util/globallocker/TestMysqlGlobalLocker.java
index 4619b42..f2fd01a 100644
--- a/util/src/test/java/com/ning/billing/util/globallocker/TestMysqlGlobalLocker.java
+++ b/util/src/test/java/com/ning/billing/util/globallocker/TestMysqlGlobalLocker.java
@@ -32,7 +32,7 @@ import org.testng.annotations.Test;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.ning.billing.dbi.MysqlTestingHelper;
-import com.ning.billing.util.globallocker.GlobalLocker.LockerService;
+import com.ning.billing.util.globallocker.GlobalLocker.LockerType;
import com.ning.billing.util.io.IOUtils;
@Test(groups = "slow")
@@ -66,7 +66,7 @@ public class TestMysqlGlobalLocker {
final String lockName = UUID.randomUUID().toString();
final GlobalLocker locker = new MySqlGlobalLocker(dbi);
- final GlobalLock lock = locker.lockWithNumberOfTries(LockerService.INVOICE, lockName, 3);
+ final GlobalLock lock = locker.lockWithNumberOfTries(LockerType.ACCOUNT, lockName, 3);
dbi.inTransaction(new TransactionCallback<Void>() {
@Override
@@ -76,11 +76,11 @@ public class TestMysqlGlobalLocker {
return null;
}
});
- Assert.assertEquals(locker.isFree(LockerService.INVOICE, lockName), Boolean.FALSE);
+ Assert.assertEquals(locker.isFree(LockerType.ACCOUNT, lockName), Boolean.FALSE);
boolean gotException = false;
try {
- locker.lockWithNumberOfTries(LockerService.INVOICE, lockName, 1);
+ locker.lockWithNumberOfTries(LockerType.ACCOUNT, lockName, 1);
} catch (LockFailedException e) {
gotException = true;
}
@@ -88,7 +88,7 @@ public class TestMysqlGlobalLocker {
lock.release();
- Assert.assertEquals(locker.isFree(LockerService.INVOICE, lockName), Boolean.TRUE);
+ Assert.assertEquals(locker.isFree(LockerType.ACCOUNT, lockName), Boolean.TRUE);
}
public static final class TestMysqlGlobalLockerModule extends AbstractModule {
diff --git a/util/src/test/resources/com/ning/billing/util/email/templates/HtmlInvoiceTemplate.mustache b/util/src/test/resources/com/ning/billing/util/email/templates/HtmlInvoiceTemplate.mustache
index aef1dce..be1668b 100644
--- a/util/src/test/resources/com/ning/billing/util/email/templates/HtmlInvoiceTemplate.mustache
+++ b/util/src/test/resources/com/ning/billing/util/email/templates/HtmlInvoiceTemplate.mustache
@@ -78,12 +78,12 @@
<tr>
<td colspan=2 />
<td align=right><strong>{{text.invoiceAmount}}</strong></td>
- <td align=right><strong>{{invoice.amountCharged}}</strong></td>
+ <td align=right><strong>{{invoice.chargedAmount}}</strong></td>
</tr>
<tr>
<td colspan=2 />
<td align=right><strong>{{text.invoiceAmountPaid}}</strong></td>
- <td align=right><strong>{{invoice.amountPaid}}</strong></td>
+ <td align=right><strong>{{invoice.paidAmount}}</strong></td>
</tr>
<tr>
<td colspan=2 />