killbill-uncached
Changes
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java 10(+10 -0)
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 8(+7 -1)
Details
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..9f99d4b 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,34 @@ 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();
+
+ UUID getReversedItemId();
InvoiceItem asReversingItem();
}
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/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index a53705f..573b215 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
@@ -50,17 +50,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;
}
@@ -155,25 +156,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));
-
- notifyOfFutureBillingEvents(transactional, recurringInvoiceItems);
+ 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));
- 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));
+ List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
- final List<InvoiceItem> creditInvoiceItems = invoice.getInvoiceItems(CreditBalanceAdjInvoiceItem.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);
@@ -328,7 +319,7 @@ 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
@@ -340,7 +331,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
invoiceSqlDao.create(invoice, context);
final InvoiceItem credit = new CreditBalanceAdjInvoiceItem(invoice.getId(), accountId, effectiveDate, amount, currency);
- creditInvoiceItemSqlDao.create(credit, context);
+ invoiceItemSqlDao.create(credit, context);
return credit;
}
@@ -366,20 +357,12 @@ public class DefaultInvoiceDao implements 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) {
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 7d94daa..b2d134a 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;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java
new file mode 100644
index 0000000..63504df
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java
@@ -0,0 +1,106 @@
+/*
+ * 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.InvoiceItem;
+import com.ning.billing.invoice.api.InvoiceItemType;
+
+public abstract class AdjInvoiceItem extends InvoiceItemBase {
+
+
+
+ public AdjInvoiceItem(final UUID invoiceId, final UUID accountId, final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
+ this(UUID.randomUUID(), invoiceId, accountId, startDate, endDate, amount, currency);
+ }
+
+ public AdjInvoiceItem(final UUID invoiceId, final UUID accountId, final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final UUID reversingId) {
+ this(UUID.randomUUID(), invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
+ }
+
+ public AdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
+ super(id, invoiceId, accountId, null, null, null, null, startDate, endDate, amount, currency);
+ }
+
+ public AdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final UUID reversingId) {
+ super(id, invoiceId, accountId, null, null, null, null, startDate, endDate, amount, currency, reversingId);
+ }
+
+ @Override
+ public InvoiceItem asReversingItem() {
+ throw new UnsupportedOperationException();
+ }
+
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ final AdjInvoiceItem that = (AdjInvoiceItem) o;
+ return this.compareTo(that) == 0;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = accountId.hashCode();
+ result = 31 * result + invoiceId.hashCode();
+ result = 31 * result + startDate.hashCode();
+ result = 31 * result + amount.hashCode();
+ result = 31 * result + currency.hashCode();
+ result = 31 * result + getInvoiceItemType().hashCode();
+ result = 31 * result + getId().hashCode();
+ return result;
+ }
+
+ @Override
+ public int compareTo(final InvoiceItem item) {
+
+ if (!(item instanceof AdjInvoiceItem)) {
+ return 1;
+ }
+
+ final AdjInvoiceItem that = (AdjInvoiceItem) item;
+
+ if (accountId.compareTo(that.accountId) != 0) {
+ return accountId.compareTo(that.accountId);
+ }
+ if (invoiceId.compareTo(that.invoiceId) != 0) {
+ return invoiceId.compareTo(that.invoiceId);
+ }
+ if (amount.compareTo(that.amount) != 0) {
+ return amount.compareTo(that.amount);
+ }
+ if (startDate.compareTo(that.startDate) != 0) {
+ return startDate.compareTo(that.startDate);
+ }
+ if (currency != that.currency) {
+ return currency.ordinal() > that.currency.ordinal() ? 1: -1;
+ }
+ return id.compareTo(that.getId());
+ }
+
+ @Override
+ public abstract InvoiceItemType getInvoiceItemType();
+}
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/FixedPriceInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
index 7a9d3bd..1b3b6fd 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
@@ -156,5 +156,4 @@ public class FixedPriceInvoiceItem extends InvoiceItemBase {
public InvoiceItemType getInvoiceItemType() {
return InvoiceItemType.FIXED;
}
-
}
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 f219c3d..79cc927 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
@@ -48,26 +48,59 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem
protected final UUID reversedItemId;
+ /*
+ * 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, null);
+ 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 BigDecimal rate, final Currency currency, final UUID reversedItemId) {
+ 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, rate, currency, reversedItemId);
+ 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(subscriptionId, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency, null);
+ 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 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);
@@ -136,14 +169,26 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem
}
@Override
- public abstract InvoiceItemType getInvoiceItemType();
+ public BigDecimal getRate() {
+ return rate;
+ }
@Override
- public abstract InvoiceItem asReversingItem();
+ public UUID getReversedItemId() {
+ return reversedItemId;
+ }
+
+ @Override
+ public abstract InvoiceItemType getInvoiceItemType();
@Override
public abstract String getDescription();
@Override
public abstract int compareTo(InvoiceItem invoiceItem);
+
+ // STEPH
+ @Override
+ public abstract InvoiceItem asReversingItem();
+
}
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 892a3ec..708f6a1 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
@@ -40,7 +40,7 @@ public class InvoiceItemList extends ArrayList<InvoiceItem> {
BigDecimal total = BigDecimal.ZERO.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
for (final InvoiceItem item : this) {
- if (!(item instanceof CreditBalanceAdjInvoiceItem)) {
+ if ((item instanceof FixedPriceInvoiceItem) || (item instanceof RecurringInvoiceItem)) {
if (item.getAmount() != null) {
total = total.add(item.getAmount());
}
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 4d3aa6e..5560a22 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
@@ -36,7 +36,7 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
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, rate, currency, 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,
@@ -44,7 +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, rate, currency, reversedItemId);
+ amount, rate, currency);
}
public RecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
@@ -52,16 +52,9 @@ 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, rate, currency, null);
+ super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
}
- 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, rate, currency, reversedItemId);
- }
@Override
public InvoiceItem asReversingItem() {
@@ -76,6 +69,7 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
return String.format("%s from %s to %s", phaseName, startDate.toString(dateTimeFormatter), endDate.toString(dateTimeFormatter));
}
+ @Override
public UUID getReversedItemId() {
return reversedItemId;
}
@@ -84,6 +78,7 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
return (reversedItemId != null);
}
+ @Override
public BigDecimal getRate() {
return rate;
}
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/DefaultInvoiceItemFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
index 2dc8168..5c5ff95 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
@@ -130,4 +130,14 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
public UUID getId() {
return item.getId();
}
+
+ @Override
+ public BigDecimal getRate() {
+ return null;
+ }
+
+ @Override
+ public UUID getReversedItemId() {
+ return null;
+ }
}
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 1fc1d62..b347fdd 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
+++ b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
@@ -27,69 +27,6 @@ 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 recurring_invoice_items;
-CREATE TABLE recurring_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,
- 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,
- 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;
DROP TABLE IF EXISTS invoices;
CREATE TABLE invoices (
@@ -124,22 +61,3 @@ CREATE TABLE invoice_payments (
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;
-
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..c44a63a 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
@@ -16,7 +16,11 @@
package com.ning.billing.invoice.api.migration;
+import static org.testng.Assert.assertNotNull;
+
+import java.io.IOException;
import java.math.BigDecimal;
+import java.net.URL;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
@@ -52,7 +56,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;
@@ -112,6 +116,8 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
private final Clock clock = new ClockMock();
+
+
@BeforeClass(groups = {"slow"})
public void setup() throws Exception {
log.info("Starting set up");
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 ff6e2d5..304b4e8 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,6 +50,7 @@ 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 {
@@ -56,10 +59,6 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
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;
@@ -89,8 +88,21 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
}
};
+ 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(alwaysRun = true)
protected void setup() throws IOException {
+
+ loadSystemPropertiesFromClasspath("/resource.properties");
+
mysqlTestingHelper = new MysqlTestingHelper();
dbi = mysqlTestingHelper.getDBI();
@@ -108,9 +120,6 @@ 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);
@@ -130,11 +139,8 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
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;
}
});
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
index 8911661..38dd106 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
@@ -103,7 +103,6 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final Invoice savedInvoice = invoiceDao.getById(invoiceId);
assertNotNull(savedInvoice);
assertEquals(savedInvoice.getBalance().compareTo(new BigDecimal("21.00")), 0);
- assertEquals(savedInvoice.getBalance().compareTo(new BigDecimal("21.00")), 0);
assertEquals(savedInvoice.getAmountPaid(), BigDecimal.ZERO);
assertEquals(savedInvoice.getInvoiceItems().size(), 1);
@@ -187,19 +186,19 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
rate1, rate1, Currency.USD);
- recurringInvoiceItemDao.create(item1, context);
+ invoiceItemSqlDao.create(item1, context);
final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
rate2, rate2, Currency.USD);
- recurringInvoiceItemDao.create(item2, context);
+ invoiceItemSqlDao.create(item2, context);
final RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
rate3, rate3, Currency.USD);
- recurringInvoiceItemDao.create(item3, context);
+ invoiceItemSqlDao.create(item3, context);
final RecurringInvoiceItem item4 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
rate4, rate4, Currency.USD);
- recurringInvoiceItemDao.create(item4, context);
+ invoiceItemSqlDao.create(item4, context);
// Create invoice 2 (subscriptions 1-3)
final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
@@ -212,15 +211,15 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem item5 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
rate1, rate1, Currency.USD);
- recurringInvoiceItemDao.create(item5, context);
+ invoiceItemSqlDao.create(item5, context);
final RecurringInvoiceItem item6 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
rate2, rate2, Currency.USD);
- recurringInvoiceItemDao.create(item6, context);
+ invoiceItemSqlDao.create(item6, context);
final RecurringInvoiceItem item7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
rate3, rate3, Currency.USD);
- recurringInvoiceItemDao.create(item7, context);
+ invoiceItemSqlDao.create(item7, context);
// Check that each subscription returns the correct number of invoices
final List<Invoice> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1);
@@ -263,19 +262,19 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
rate1, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(item1, context);
+ invoiceItemSqlDao.create(item1, context);
final FixedPriceInvoiceItem item2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
rate2, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(item2, context);
+ invoiceItemSqlDao.create(item2, context);
final FixedPriceInvoiceItem item3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
rate3, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(item3, context);
+ invoiceItemSqlDao.create(item3, context);
final FixedPriceInvoiceItem item4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
rate4, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(item4, context);
+ invoiceItemSqlDao.create(item4, context);
// create invoice 2 (subscriptions 1-3)
final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
@@ -288,15 +287,15 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final FixedPriceInvoiceItem item5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
rate1, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(item5, context);
+ invoiceItemSqlDao.create(item5, context);
final FixedPriceInvoiceItem item6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
rate2, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(item6, context);
+ invoiceItemSqlDao.create(item6, context);
final FixedPriceInvoiceItem item7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
rate3, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(item7, context);
+ invoiceItemSqlDao.create(item7, context);
// check that each subscription returns the correct number of invoices
final List<Invoice> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1);
@@ -339,35 +338,35 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem recurringItem1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
rate1, rate1, Currency.USD);
- recurringInvoiceItemDao.create(recurringItem1, context);
+ invoiceItemSqlDao.create(recurringItem1, context);
final RecurringInvoiceItem recurringItem2 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
rate2, rate2, Currency.USD);
- recurringInvoiceItemDao.create(recurringItem2, context);
+ invoiceItemSqlDao.create(recurringItem2, context);
final RecurringInvoiceItem recurringItem3 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
rate3, rate3, Currency.USD);
- recurringInvoiceItemDao.create(recurringItem3, context);
+ invoiceItemSqlDao.create(recurringItem3, context);
final RecurringInvoiceItem recurringItem4 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
rate4, rate4, Currency.USD);
- recurringInvoiceItemDao.create(recurringItem4, context);
+ invoiceItemSqlDao.create(recurringItem4, context);
final FixedPriceInvoiceItem fixedItem1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
rate1, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(fixedItem1, context);
+ invoiceItemSqlDao.create(fixedItem1, context);
final FixedPriceInvoiceItem fixedItem2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
rate2, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(fixedItem2, context);
+ invoiceItemSqlDao.create(fixedItem2, context);
final FixedPriceInvoiceItem fixedItem3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
rate3, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(fixedItem3, context);
+ invoiceItemSqlDao.create(fixedItem3, context);
final FixedPriceInvoiceItem fixedItem4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
rate4, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(fixedItem4, context);
+ invoiceItemSqlDao.create(fixedItem4, context);
// create invoice 2 (subscriptions 1-3)
final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
@@ -380,26 +379,26 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem recurringItem5 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
rate1, rate1, Currency.USD);
- recurringInvoiceItemDao.create(recurringItem5, context);
+ invoiceItemSqlDao.create(recurringItem5, context);
final RecurringInvoiceItem recurringItem6 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
rate2, rate2, Currency.USD);
- recurringInvoiceItemDao.create(recurringItem6, context);
+ invoiceItemSqlDao.create(recurringItem6, context);
final RecurringInvoiceItem recurringItem7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
rate3, rate3, Currency.USD);
- recurringInvoiceItemDao.create(recurringItem7, context);
+ invoiceItemSqlDao.create(recurringItem7, context);
final FixedPriceInvoiceItem fixedItem5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
rate1, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(fixedItem5, context);
+ invoiceItemSqlDao.create(fixedItem5, context);
final FixedPriceInvoiceItem fixedItem6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
rate2, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(fixedItem6, context);
+ invoiceItemSqlDao.create(fixedItem6, context);
final FixedPriceInvoiceItem fixedItem7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
rate3, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(fixedItem7, context);
+ invoiceItemSqlDao.create(fixedItem7, context);
// check that each subscription returns the correct number of invoices
final List<Invoice> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1);
@@ -460,11 +459,11 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
endDate, rate1, rate1, Currency.USD);
- recurringInvoiceItemDao.create(item1, context);
+ invoiceItemSqlDao.create(item1, context);
final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
endDate, rate2, rate2, Currency.USD);
- recurringInvoiceItemDao.create(item2, context);
+ invoiceItemSqlDao.create(item2, context);
final BigDecimal payment1 = new BigDecimal("48.0");
final InvoicePayment payment = new DefaultInvoicePayment(UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
@@ -490,11 +489,11 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
rate1, rate1, Currency.USD);
- recurringInvoiceItemDao.create(item1, context);
+ invoiceItemSqlDao.create(item1, context);
final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
rate2, rate2, Currency.USD);
- recurringInvoiceItemDao.create(item2, context);
+ invoiceItemSqlDao.create(item2, context);
final BigDecimal balance = invoiceDao.getAccountBalance(accountId);
assertEquals(balance.compareTo(rate1.add(rate2)), 0);
@@ -532,11 +531,11 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
rate1, rate1, Currency.USD);
- recurringInvoiceItemDao.create(item1, context);
+ invoiceItemSqlDao.create(item1, context);
final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
rate2, rate2, Currency.USD);
- recurringInvoiceItemDao.create(item2, context);
+ invoiceItemSqlDao.create(item2, context);
DateTime upToDate;
Collection<Invoice> invoices;
@@ -560,7 +559,7 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoice2.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase C", startDate2, endDate2,
rate3, rate3, Currency.USD);
- recurringInvoiceItemDao.create(item3, context);
+ invoiceItemSqlDao.create(item3, context);
upToDate = new DateTime(2011, 1, 1, 0, 0, 0, 0);
invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
@@ -696,10 +695,12 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
final List<Invoice> invoiceList = new ArrayList<Invoice>();
invoiceList.add(invoice1);
+ //invoiceDao.create(invoice1, context);
+
final DateTime effectiveDate2 = effectiveDate1.plusDays(30);
final BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
- "testEvent2", 2L, SubscriptionTransitionType.CHANGE);
+ "testEvent2", 2L, SubscriptionTransitionType.PHASE);
events.add(event2);
final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, effectiveDate2, Currency.USD);
@@ -709,11 +710,15 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
invoiceList.add(invoice2);
+ //invoiceDao.create(invoice2, context);
+
final DateTime effectiveDate3 = effectiveDate2.plusMonths(1);
final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, effectiveDate3, Currency.USD);
assertNotNull(invoice3);
assertEquals(invoice3.getNumberOfItems(), 1);
assertEquals(invoice3.getBalance().compareTo(cheapAmount), 0);
+
+ //invoiceDao.create(invoice3, context);
}
@Test
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
index d5e6248..4d25b8c 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
@@ -81,10 +81,10 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
"test plan", "test phase", startDate.plusMonths(i), startDate.plusMonths(i + 1),
rate, rate, Currency.USD);
- recurringInvoiceItemDao.create(item, context);
+ invoiceItemSqlDao.create(item, context);
}
- final List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsBySubscription(subscriptionId.toString());
+ final List<InvoiceItem> items = invoiceItemSqlDao.getInvoiceItemsBySubscription(subscriptionId.toString());
assertEquals(items.size(), 3);
}
@@ -103,10 +103,10 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
"test plan", "test phase", startDate, startDate.plusMonths(1),
amount, amount, Currency.USD);
- recurringInvoiceItemDao.create(item, context);
+ invoiceItemSqlDao.create(item, context);
}
- final List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsByInvoice(invoiceId.toString());
+ final List<InvoiceItem> items = invoiceItemSqlDao.getInvoiceItemsByInvoice(invoiceId.toString());
assertEquals(items.size(), 5);
}
@@ -128,22 +128,22 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
"test plan", "test phase", startDate, startDate.plusMonths(1),
rate, rate, Currency.USD);
- recurringInvoiceItemDao.create(item, context);
+ invoiceItemSqlDao.create(item, context);
- final List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsByAccount(accountId.toString());
+ final List<InvoiceItem> items = invoiceItemSqlDao.getInvoiceItemsByAccount(accountId.toString());
assertEquals(items.size(), 1);
}
@Test
- public void testCreditInvoiceSqlDao() {
+ public void testCreditBalanceInvoiceSqlDao() {
final UUID invoiceId = UUID.randomUUID();
final UUID accountId = UUID.randomUUID();
final DateTime creditDate = new DateTime(2012, 4, 1, 0, 10, 22, 0);
final InvoiceItem creditInvoiceItem = new CreditBalanceAdjInvoiceItem(invoiceId, accountId, creditDate, TEN, Currency.USD);
- creditInvoiceItemSqlDao.create(creditInvoiceItem, context);
+ invoiceItemSqlDao.create(creditInvoiceItem, context);
- final InvoiceItem savedItem = creditInvoiceItemSqlDao.getById(creditInvoiceItem.getId().toString());
+ final InvoiceItem savedItem = invoiceItemSqlDao.getById(creditInvoiceItem.getId().toString());
assertEquals(savedItem, creditInvoiceItem);
}
@@ -155,9 +155,9 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
final InvoiceItem fixedPriceInvoiceItem = new FixedPriceInvoiceItem(invoiceId, accountId, UUID.randomUUID(),
UUID.randomUUID(), "test plan", "test phase", startDate, startDate.plusMonths(1), TEN, Currency.USD);
- fixedPriceInvoiceItemSqlDao.create(fixedPriceInvoiceItem, context);
+ invoiceItemSqlDao.create(fixedPriceInvoiceItem, context);
- final InvoiceItem savedItem = fixedPriceInvoiceItemSqlDao.getById(fixedPriceInvoiceItem.getId().toString());
+ final InvoiceItem savedItem = invoiceItemSqlDao.getById(fixedPriceInvoiceItem.getId().toString());
assertEquals(savedItem, fixedPriceInvoiceItem);
}
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
new file mode 100644
index 0000000..0a7e194
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.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 TestDefaultInvoiceGenerator {
+
+ 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 testAddReversingItemsRecurringPrice() {
+ 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.addReversingItems(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.getReversedItemId(), 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.generateCreditsForPastRepairedInvoices(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.getReversedItemId(), 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..df94e19 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;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
index 98a8ecc..08da1ee 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
@@ -47,12 +47,12 @@ import com.ning.billing.invoice.MockBillingEventSet;
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.generator.DefaultInvoiceGenerator;
+import com.ning.billing.invoice.generator.InvoiceGenerator;
import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
import com.ning.billing.invoice.model.DefaultInvoice;
-import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
import com.ning.billing.invoice.model.DefaultInvoicePayment;
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.BillingEventSet;
import com.ning.billing.mock.BrainDeadProxyFactory;
diff --git a/invoice/src/test/resources/resource.properties b/invoice/src/test/resources/resource.properties
index 4e66149..85d4e42 100644
--- a/invoice/src/test/resources/resource.properties
+++ b/invoice/src/test/resources/resource.properties
@@ -1 +1,2 @@
-com.ning.billing.invoice.maxNumberOfMonthsInFuture = 36
\ No newline at end of file
+com.ning.billing.invoice.maxNumberOfMonthsInFuture = 36
+com.ning.billing.dbi.test.useLocalDb=true
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..50258f3 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
@@ -183,7 +183,7 @@ public class MockInvoice extends EntityBase implements Invoice {
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());
}
}
@@ -195,7 +195,7 @@ public class MockInvoice extends EntityBase implements Invoice {
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());
}
}
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");