Details
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java b/api/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
index 5f64dc7..673dec5 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
@@ -41,7 +41,7 @@ public class DefaultBillingEvent implements BillingEvent {
final private String description;
final private BillingModeType billingModeType;
final private BillingPeriod billingPeriod;
-
+
public DefaultBillingEvent(SubscriptionTransition transition, Subscription subscription, int billCycleDay) {
this.billCycleDay = billCycleDay;
this.subscription = subscription;
@@ -53,7 +53,7 @@ public class DefaultBillingEvent implements BillingEvent {
description = transition.getTransitionType().toString();
billingModeType=BillingModeType.IN_ADVANCE;
billingPeriod = transition.getNextPhase().getBillingPeriod();
-
+
}
// Intended for test only
@@ -135,12 +135,12 @@ public class DefaultBillingEvent implements BillingEvent {
}
@Override
public BigDecimal getFixedPrice(Currency currency) throws CatalogApiException {
- return fixedPrice.getPrice(currency);
+ return fixedPrice != null ? fixedPrice.getPrice(currency) : new BigDecimal(0);
}
@Override
public BigDecimal getRecurringPrice(Currency currency) throws CatalogApiException {
- return recurringPrice.getPrice(currency);
+ return recurringPrice != null ? recurringPrice.getPrice(currency) : new BigDecimal(0);
}
-
+
}
\ No newline at end of file
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
index b79d2a9..63ea85e 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
@@ -40,7 +40,10 @@ import org.testng.annotations.Test;
import com.google.inject.Inject;
+import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.AccountService;
+import com.ning.billing.account.api.AccountUserApi;
import com.ning.billing.beatrix.integration.inv_ent.TestBusHandler.NextEvent;
import com.ning.billing.beatrix.lifecycle.Lifecycle;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -81,11 +84,16 @@ public class TestBasic {
@Inject
private InvoiceService invoiceService;
+ @Inject
+ private AccountService accountService;
+
private EntitlementUserApi entitlementUserApi;
private InvoiceUserApi invoiceUserApi;
+ private AccountUserApi accountUserApi;
+
private TestBusHandler busHandler;
@@ -106,6 +114,7 @@ public class TestBasic {
*/
entitlementUserApi = entitlementService.getUserApi();
invoiceUserApi = invoiceService.getUserApi();
+ accountUserApi = accountService.getAccountUserApi();
}
@AfterSuite(alwaysRun = true)
@@ -163,8 +172,10 @@ public class TestBasic {
@Test(groups = "fast", enabled = false)
public void testSimple() throws Exception {
- UUID accountId = UUID.randomUUID();
- SubscriptionBundle bundle = entitlementUserApi.createBundleForAccount(accountId, "whatever");
+ Account account = accountUserApi.createAccount(getAccountData(), null, null);
+ assertNotNull(account);
+
+ SubscriptionBundle bundle = entitlementUserApi.createBundleForAccount(account.getId(), "whatever");
String productName = "Shotgun";
BillingPeriod term = BillingPeriod.MONTHLY;
@@ -178,7 +189,7 @@ public class TestBasic {
SubscriptionData subscription = (SubscriptionData) entitlementUserApi.createSubscription(bundle.getId(),
new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSetName, null), null);
assertNotNull(subscription);
- assertTrue(busHandler.isCompleted(5000));
+ assertTrue(busHandler.isCompleted(5000 * 1000));
//
// VERIFY CTD HAS BEEN SET
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
index b7bc657..df43d71 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
@@ -17,19 +17,31 @@
package com.ning.billing.invoice.api;
import com.google.inject.Inject;
+import com.ning.billing.invoice.InvoiceListener;
+import com.ning.billing.invoice.notification.NextBillingDateNotifier;
import com.ning.billing.lifecycle.LifecycleHandlerType;
+import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
+import com.ning.billing.util.eventbus.Bus;
public class DefaultInvoiceService implements InvoiceService {
- private static final String INVOICE_SERVICE_NAME = "invoice-service";
+
+ public static final String INVOICE_SERVICE_NAME = "invoice-service";
private final InvoiceUserApi userApi;
private final InvoicePaymentApi paymentApi;
+ private final NextBillingDateNotifier dateNotifier;
+ private final InvoiceListener invoiceListener;
+ private final Bus eventBus;
@Inject
- public DefaultInvoiceService(InvoiceUserApi userApi, InvoicePaymentApi paymentApi) {
+ public DefaultInvoiceService(InvoiceListener invoiceListener, Bus eventBus, InvoiceUserApi userApi, InvoicePaymentApi paymentApi, NextBillingDateNotifier dateNotifier) {
+ this.invoiceListener = invoiceListener;
+ this.eventBus = eventBus;
this.userApi = userApi;
this.paymentApi = paymentApi;
+ this.dateNotifier = dateNotifier;
}
+
@Override
public String getName() {
return INVOICE_SERVICE_NAME;
@@ -47,5 +59,34 @@ public class DefaultInvoiceService implements InvoiceService {
@LifecycleHandlerType(LifecycleHandlerType.LifecycleLevel.INIT_SERVICE)
public void initialize() {
+ dateNotifier.initialize();
+ }
+
+ @LifecycleHandlerType(LifecycleLevel.START_SERVICE)
+ public void start() {
+ dateNotifier.start();
+ }
+
+ @LifecycleHandlerType(LifecycleHandlerType.LifecycleLevel.REGISTER_EVENTS)
+ public void registerForNotifications() {
+ try {
+ eventBus.register(invoiceListener);
+ } catch (Bus.EventBusException e) {
+ throw new RuntimeException("Unable to register to the EventBus!", e);
+ }
+ }
+
+ @LifecycleHandlerType(LifecycleHandlerType.LifecycleLevel.UNREGISTER_EVENTS)
+ public void unregisterForNotifications() {
+ try {
+ eventBus.unregister(invoiceListener);
+ } catch (Bus.EventBusException e) {
+ throw new RuntimeException("Unable to unregister to the EventBus!", e);
+ }
+ }
+
+ @LifecycleHandlerType(LifecycleLevel.STOP_SERVICE)
+ public void stop() {
+ dateNotifier.stop();
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java b/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
index 35c6ac6..174a21c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
@@ -16,7 +16,11 @@
package com.ning.billing.invoice.glue;
+import org.skife.config.ConfigurationObjectFactory;
+
import com.google.inject.AbstractModule;
+import com.ning.billing.config.InvoiceConfig;
+import com.ning.billing.invoice.InvoiceListener;
import com.ning.billing.invoice.api.DefaultInvoiceService;
import com.ning.billing.invoice.api.InvoicePaymentApi;
import com.ning.billing.invoice.api.InvoiceService;
@@ -25,6 +29,10 @@ import com.ning.billing.invoice.api.user.DefaultInvoiceUserApi;
import com.ning.billing.invoice.api.InvoiceUserApi;
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.notification.DefaultNextBillingDateNotifier;
+import com.ning.billing.invoice.notification.NextBillingDateNotifier;
public class InvoiceModule extends AbstractModule {
@@ -40,9 +48,18 @@ public class InvoiceModule extends AbstractModule {
bind(InvoicePaymentApi.class).to(DefaultInvoicePaymentApi.class).asEagerSingleton();
}
+ protected void installConfig() {
+ final InvoiceConfig config = new ConfigurationObjectFactory(System.getProperties()).build(InvoiceConfig.class);
+ bind(InvoiceConfig.class).toInstance(config);
+ }
+
@Override
protected void configure() {
bind(InvoiceService.class).to(DefaultInvoiceService.class).asEagerSingleton();
+ bind(NextBillingDateNotifier.class).to(DefaultNextBillingDateNotifier.class).asEagerSingleton();
+ bind(InvoiceListener.class).asEagerSingleton();
+ bind(InvoiceGenerator.class).to(DefaultInvoiceGenerator.class).asEagerSingleton();
+ installConfig();
installInvoiceDao();
installInvoiceUserApi();
installInvoicePaymentApi();
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
index 1a1cd13..f305441 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -16,6 +16,7 @@
package com.ning.billing.invoice;
+import java.util.List;
import java.util.SortedSet;
import java.util.UUID;
import org.joda.time.DateTime;
@@ -34,6 +35,7 @@ import com.ning.billing.entitlement.api.user.SubscriptionTransition;
import com.ning.billing.invoice.api.BillingEventSet;
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.InvoiceUserApi;
import com.ning.billing.invoice.dao.InvoiceDao;
import com.ning.billing.invoice.model.InvoiceGenerator;
@@ -96,7 +98,7 @@ public class InvoiceListener {
DateTime targetDate = new DateTime();
Currency targetCurrency = account.getCurrency();
- InvoiceItemList invoiceItemList = (InvoiceItemList) invoiceUserApi.getInvoiceItemsByAccount(accountId);
+ InvoiceItemList invoiceItemList = new InvoiceItemList(invoiceUserApi.getInvoiceItemsByAccount(accountId));
Invoice invoice = generator.generateInvoice(accountId, billingEvents, invoiceItemList, targetDate, targetCurrency);
if (invoice != null) {
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 2e462df..6ee713c 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
@@ -24,6 +24,14 @@ import com.ning.billing.invoice.api.InvoiceItem;
public class InvoiceItemList extends ArrayList<InvoiceItem> {
private static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
+
+ public InvoiceItemList() {
+ }
+
+ public InvoiceItemList(List<InvoiceItem> items) {
+ addAll(items);
+ }
+
public BigDecimal getTotalAmount() {
// TODO: Jeff -- naive implementation, assumes all invoice items share the same currency
BigDecimal total = new BigDecimal("0");
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
index ebf0b5b..794426e 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
@@ -25,6 +25,7 @@ import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.ning.billing.config.InvoiceConfig;
+import com.ning.billing.invoice.api.DefaultInvoiceService;
import com.ning.billing.lifecycle.KillbillService;
import com.ning.billing.lifecycle.LifecycleHandlerType;
import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
@@ -37,29 +38,30 @@ import com.ning.billing.util.notificationq.NotificationQueueService;
import com.ning.billing.util.notificationq.NotificationQueueService.NotficationQueueAlreadyExists;
import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueHandler;
-public class DefaultNextBillingDateNotifier implements KillbillService, NextBillingDateNotifier {
+public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
+
private final static Logger log = LoggerFactory.getLogger(DefaultNextBillingDateNotifier.class);
- private static final String NEXT_BILLING_DATE_NOTIFIER_SERVICE_NAME = "next-billing-date-notifier";
private static final String NEXT_BILLING_DATE_NOTIFIER_QUEUE = "next-billing-date-queue";
-
+
private final Bus eventBus;
private final NotificationQueueService notificationQueueService;
+ private final InvoiceConfig config;
+
private NotificationQueue nextBillingQueue;
- private InvoiceConfig config;
- @Inject
+ @Inject
public DefaultNextBillingDateNotifier(NotificationQueueService notificationQueueService, Bus eventBus, InvoiceConfig config){
this.notificationQueueService = notificationQueueService;
this.config = config;
this.eventBus = eventBus;
}
-
-
- @LifecycleHandlerType(LifecycleLevel.INIT_SERVICE)
+
+
+ @Override
public void initialize() {
try {
- nextBillingQueue = notificationQueueService.createNotificationQueue(NEXT_BILLING_DATE_NOTIFIER_SERVICE_NAME,
+ nextBillingQueue = notificationQueueService.createNotificationQueue(DefaultInvoiceService.INVOICE_SERVICE_NAME,
NEXT_BILLING_DATE_NOTIFIER_QUEUE,
new NotificationQueueHandler() {
@Override
@@ -71,7 +73,7 @@ public class DefaultNextBillingDateNotifier implements KillbillService, NextBill
log.error("The key returned from the NextBillingNotificationQueue is not a valid UUID",e);
return;
}
-
+
processEvent(subscriptionId);
}
},
@@ -98,23 +100,18 @@ public class DefaultNextBillingDateNotifier implements KillbillService, NextBill
}
}
- @LifecycleHandlerType(LifecycleLevel.START_SERVICE)
+ @Override
public void start() {
nextBillingQueue.startQueue();
}
- @LifecycleHandlerType(LifecycleLevel.STOP_SERVICE)
+ @Override
public void stop() {
if (nextBillingQueue != null) {
nextBillingQueue.stopQueue();
}
}
-
- @Override
- public String getName() {
- return NEXT_BILLING_DATE_NOTIFIER_SERVICE_NAME;
- }
-
+
private void processEvent(UUID subscriptionId) {
try {
eventBus.post(new NextBillingDateEvent(subscriptionId));
@@ -122,14 +119,14 @@ public class DefaultNextBillingDateNotifier implements KillbillService, NextBill
log.error("Failed to post entitlement event " + subscriptionId, e);
}
}
-
+
@Override
public void insertNextBillingNotification(Transmogrifier transactionalDao, final UUID subscriptionId, DateTime futureNotificationTime) {
nextBillingQueue.recordFutureNotificationFromTransaction(transactionalDao, futureNotificationTime, new NotificationKey(){
- public String toString() {
+ @Override
+ public String toString() {
return subscriptionId.toString();
}
});
}
-
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java
index 5371824..d33dc61 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java
@@ -23,7 +23,13 @@ import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
public interface NextBillingDateNotifier {
- void insertNextBillingNotification(Transmogrifier transactionalDao,
+ public void initialize();
+
+ public void start();
+
+ public void stop();
+
+ public void insertNextBillingNotification(Transmogrifier transactionalDao,
UUID subscriptionId, DateTime futureNotificationTime);
}