killbill-uncached
Changes
analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java 43(+16 -27)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java 27(+3 -24)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldMapper.java 8(+7 -1)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.java 5(+3 -2)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java 61(+30 -31)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java 5(+1 -4)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagMapper.java 7(+6 -1)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.java 5(+3 -2)
analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java 63(+54 -9)
analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionField.java 31(+28 -3)
analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionTag.java 30(+27 -3)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountFieldSqlDao.sql.stg 17(+10 -7)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountSqlDao.sql.stg 33(+28 -5)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountTagSqlDao.sql.stg 17(+10 -7)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceSqlDao.sql.stg 38(+36 -2)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessOverdueStatusSqlDao.sql.stg 14(+10 -4)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.sql.stg 20(+13 -7)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg 74(+16 -58)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.sql.stg 20(+13 -7)
analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountFieldSqlDao.java 16(+10 -6)
analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessOverdueStatusSqlDao.java 10(+6 -4)
analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionFieldSqlDao.java 18(+12 -6)
analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionTagSqlDao.java 18(+12 -6)
analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java 11(+4 -7)
analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java 38(+28 -10)
analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionField.java 10(+9 -1)
analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionTag.java 14(+12 -2)
analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java 6(+5 -1)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java 35(+23 -12)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java 25(+12 -13)
overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueListenerTesterModule.java 29(+29 -0)
Details
diff --git a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
index bcddd64..1a2585b 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
@@ -57,11 +57,13 @@ public class AnalyticsListener {
@Subscribe
public void handleEffectiveSubscriptionTransitionChange(final EffectiveSubscriptionEvent eventEffective) throws AccountApiException, EntitlementUserApiException {
+ // The event is used as a trigger to rebuild all transitions for this bundle
bstRecorder.rebuildTransitionsForBundle(eventEffective.getBundleId());
}
@Subscribe
public void handleRequestedSubscriptionTransitionChange(final RequestedSubscriptionEvent eventRequested) throws AccountApiException, EntitlementUserApiException {
+ // The event is used as a trigger to rebuild all transitions for this bundle
bstRecorder.rebuildTransitionsForBundle(eventRequested.getBundleId());
}
@@ -87,8 +89,8 @@ public class AnalyticsListener {
@Subscribe
public void handleInvoiceCreation(final InvoiceCreationEvent event) {
- // TODO - follow same logic as entitlements to support repair
- invoiceRecorder.invoiceCreated(event.getInvoiceId());
+ // The event is used as a trigger to rebuild all invoices and invoice items for this account
+ invoiceRecorder.rebuildInvoicesForAccount(event.getAccountId());
}
@Subscribe
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
index 998fd7e..0919746 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
@@ -59,7 +59,7 @@ public class BusinessAccountRecorder {
final Account account;
try {
account = accountApi.getAccountByKey(data.getExternalKey());
- final BusinessAccount bac = new BusinessAccount();
+ final BusinessAccount bac = new BusinessAccount(account.getId());
updateBusinessAccountFromAccount(account, bac);
log.info("ACCOUNT CREATION " + bac);
@@ -92,9 +92,9 @@ public class BusinessAccountRecorder {
try {
final Account account = accountApi.getAccountById(accountId);
- BusinessAccount bac = sqlDao.getAccount(account.getExternalKey());
+ BusinessAccount bac = sqlDao.getAccount(accountId.toString());
if (bac == null) {
- bac = new BusinessAccount();
+ bac = new BusinessAccount(accountId);
updateBusinessAccountFromAccount(account, bac);
log.info("ACCOUNT CREATION " + bac);
sqlDao.createAccount(bac);
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceRecorder.java
index 21693f3..b3c6996 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceRecorder.java
@@ -21,13 +21,18 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+import org.skife.jdbi.v2.Transaction;
+import org.skife.jdbi.v2.TransactionStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountApiException;
import com.ning.billing.account.api.AccountUserApi;
-import com.ning.billing.analytics.dao.AnalyticsDao;
+import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceItemSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceSqlDao;
+import com.ning.billing.analytics.model.BusinessAccount;
import com.ning.billing.analytics.model.BusinessInvoice;
import com.ning.billing.analytics.model.BusinessInvoiceItem;
import com.ning.billing.catalog.api.Plan;
@@ -39,46 +44,73 @@ import com.ning.billing.entitlement.api.user.SubscriptionBundle;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.util.clock.Clock;
public class BusinessInvoiceRecorder {
private static final Logger log = LoggerFactory.getLogger(BusinessInvoiceRecorder.class);
- private final AnalyticsDao analyticsDao;
private final AccountUserApi accountApi;
private final EntitlementUserApi entitlementApi;
private final InvoiceUserApi invoiceApi;
+ private final BusinessInvoiceSqlDao sqlDao;
+ private final Clock clock;
@Inject
- public BusinessInvoiceRecorder(final AnalyticsDao analyticsDao,
- final AccountUserApi accountApi,
+ public BusinessInvoiceRecorder(final AccountUserApi accountApi,
final EntitlementUserApi entitlementApi,
- final InvoiceUserApi invoiceApi) {
- this.analyticsDao = analyticsDao;
+ final InvoiceUserApi invoiceApi,
+ final BusinessInvoiceSqlDao sqlDao,
+ final Clock clock) {
this.accountApi = accountApi;
this.entitlementApi = entitlementApi;
this.invoiceApi = invoiceApi;
+ this.sqlDao = sqlDao;
+ this.clock = clock;
}
- public void invoiceCreated(final UUID invoiceId) {
- // Lookup the invoice object
- final Invoice invoice = invoiceApi.getInvoice(invoiceId);
- if (invoice == null) {
- log.warn("Ignoring invoice creation for invoice id {} (invoice does not exist)", invoiceId.toString());
- return;
- }
-
+ public void rebuildInvoicesForAccount(final UUID accountId) {
// Lookup the associated account
final String accountKey;
try {
- final Account account = accountApi.getAccountById(invoice.getAccountId());
+ final Account account = accountApi.getAccountById(accountId);
accountKey = account.getExternalKey();
} catch (AccountApiException e) {
- log.warn("Ignoring invoice creation for invoice id {} and account id {} (account does not exist)",
- invoice.getId().toString(),
- invoice.getAccountId().toString());
+ log.warn("Ignoring invoice update for account id {} (account does not exist)", accountId);
return;
}
+ sqlDao.inTransaction(new Transaction<Void, BusinessInvoiceSqlDao>() {
+ @Override
+ public Void inTransaction(final BusinessInvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+ log.info("Started rebuilding transitions for account id {}", accountId);
+ deleteInvoicesAndInvoiceItemsForAccountInTransaction(transactional, accountId);
+
+ for (final Invoice invoice : invoiceApi.getInvoicesByAccount(accountId)) {
+ createInvoiceInTransaction(transactional, accountKey, invoice);
+ }
+
+ log.info("Finished rebuilding transitions for account id {}", accountId);
+ return null;
+ }
+ });
+ }
+
+ private void deleteInvoicesAndInvoiceItemsForAccountInTransaction(final BusinessInvoiceSqlDao transactional, final UUID accountId) {
+ // We don't use on cascade delete here as we don't want the database layer to be generic - hence we have
+ // to delete the invoice items manually.
+ final List<BusinessInvoice> invoicesToDelete = transactional.getInvoicesForAccount(accountId.toString());
+ final BusinessInvoiceItemSqlDao invoiceItemSqlDao = transactional.become(BusinessInvoiceItemSqlDao.class);
+ for (final BusinessInvoice businessInvoice : invoicesToDelete) {
+ final List<BusinessInvoiceItem> invoiceItemsForInvoice = invoiceItemSqlDao.getInvoiceItemsForInvoice(businessInvoice.getInvoiceId().toString());
+ for (final BusinessInvoiceItem invoiceItemToDelete : invoiceItemsForInvoice) {
+ invoiceItemSqlDao.deleteInvoiceItem(invoiceItemToDelete.getItemId().toString());
+ }
+ }
+
+ transactional.deleteInvoicesForAccount(accountId.toString());
+ }
+
+ private void createInvoiceInTransaction(final BusinessInvoiceSqlDao transactional, final String accountKey, final Invoice invoice) {
// Create the invoice
final BusinessInvoice businessInvoice = new BusinessInvoice(accountKey, invoice);
@@ -91,8 +123,33 @@ public class BusinessInvoiceRecorder {
}
}
- // Update the Analytics tables
- analyticsDao.createInvoice(accountKey, businessInvoice, businessInvoiceItems);
+ createInvoiceInTransaction(transactional, invoice.getAccountId(), businessInvoice, businessInvoiceItems);
+ }
+
+ private void createInvoiceInTransaction(final BusinessInvoiceSqlDao transactional, final UUID accountId,
+ final BusinessInvoice invoice, final Iterable<BusinessInvoiceItem> invoiceItems) {
+ // Create the invoice
+ log.info("Adding invoice {}", invoice);
+ transactional.createInvoice(invoice);
+
+ // Add associated invoice items
+ final BusinessInvoiceItemSqlDao invoiceItemSqlDao = transactional.become(BusinessInvoiceItemSqlDao.class);
+ for (final BusinessInvoiceItem invoiceItem : invoiceItems) {
+ log.info("Adding invoice item {}", invoiceItem);
+ invoiceItemSqlDao.createInvoiceItem(invoiceItem);
+ }
+
+ // Update BAC
+ final BusinessAccountSqlDao accountSqlDao = transactional.become(BusinessAccountSqlDao.class);
+ final BusinessAccount account = accountSqlDao.getAccount(accountId.toString());
+ if (account == null) {
+ throw new IllegalStateException("Account does not exist for id " + accountId);
+ }
+ account.setBalance(account.getBalance().add(invoice.getBalance()));
+ account.setLastInvoiceDate(invoice.getInvoiceDate());
+ account.setTotalInvoiceBalance(account.getTotalInvoiceBalance().add(invoice.getBalance()));
+ account.setUpdatedDt(clock.getUTCNow());
+ accountSqlDao.saveAccount(account);
}
private BusinessInvoiceItem createBusinessInvoiceItem(final InvoiceItem invoiceItem) {
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
index a4c9ff3..83f701d 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
@@ -20,7 +20,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
-import org.joda.time.DateTime;
import org.skife.jdbi.v2.Transaction;
import org.skife.jdbi.v2.TransactionStatus;
import org.slf4j.Logger;
@@ -86,15 +85,13 @@ public class BusinessSubscriptionTransitionRecorder {
final List<Subscription> subscriptions = entitlementApi.getSubscriptionsForBundle(bundleId);
- final String externalKey = bundle.getKey();
- final String accountKey = account.getExternalKey();
final Currency currency = account.getCurrency();
sqlDao.inTransaction(new Transaction<Void, BusinessSubscriptionTransitionSqlDao>() {
@Override
public Void inTransaction(final BusinessSubscriptionTransitionSqlDao transactional, final TransactionStatus status) throws Exception {
- log.info("Started rebuilding transitions for bundle {}", externalKey);
- transactional.deleteTransitionsForBundle(externalKey);
+ log.info("Started rebuilding transitions for bundle id {}", bundleId);
+ transactional.deleteTransitionsForBundle(bundleId.toString());
final ArrayList<BusinessSubscriptionTransition> transitions = new ArrayList<BusinessSubscriptionTransition>();
for (final Subscription subscription : subscriptions) {
@@ -108,8 +105,11 @@ public class BusinessSubscriptionTransitionRecorder {
final BusinessSubscription nextSubscription = createNextBusinessSubscription(event, businessEvent, currency);
final BusinessSubscriptionTransition transition = new BusinessSubscriptionTransition(
event.getTotalOrdering(),
- externalKey,
- accountKey,
+ bundleId,
+ bundle.getKey(),
+ bundle.getAccountId(),
+ account.getExternalKey(),
+ subscription.getId(),
event.getRequestedTransitionTime(),
businessEvent,
prevSubscription,
@@ -125,8 +125,11 @@ public class BusinessSubscriptionTransitionRecorder {
clock.getUTCNow().isAfter(event.getEffectiveTransitionTime())) {
final BusinessSubscriptionTransition systemCancelTransition = new BusinessSubscriptionTransition(
event.getTotalOrdering(),
- externalKey,
- accountKey,
+ bundleId,
+ bundle.getKey(),
+ bundle.getAccountId(),
+ account.getExternalKey(),
+ subscription.getId(),
event.getRequestedTransitionTime(),
new BusinessSubscriptionEvent(BusinessSubscriptionEvent.EventType.SYSTEM_CANCEL, businessEvent.getCategory()),
prevSubscription,
@@ -139,7 +142,7 @@ public class BusinessSubscriptionTransitionRecorder {
}
}
- log.info("Finished rebuilding transitions for bundle {}", externalKey);
+ log.info("Finished rebuilding transitions for bundle id {}", bundleId);
return null;
}
});
@@ -198,7 +201,7 @@ public class BusinessSubscriptionTransitionRecorder {
} else {
nextSubscription = new BusinessSubscription(event.getNextPriceList(), event.getNextPlan(), event.getNextPhase(),
currency, event.getEffectiveTransitionTime(), event.getNextState(),
- event.getSubscriptionId(), event.getBundleId(), catalogService.getFullCatalog());
+ catalogService.getFullCatalog());
}
return nextSubscription;
@@ -216,7 +219,7 @@ public class BusinessSubscriptionTransitionRecorder {
final BusinessSubscriptionTransition prevTransition = getPreviousBusinessSubscriptionTransitionForEvent(event, transitions);
return new BusinessSubscription(event.getPreviousPriceList(), event.getPreviousPlan(), event.getPreviousPhase(),
currency, prevTransition.getNextSubscription().getStartDate(), event.getPreviousState(),
- event.getSubscriptionId(), event.getBundleId(), catalogService.getFullCatalog());
+ catalogService.getFullCatalog());
}
private BusinessSubscriptionTransition getPreviousBusinessSubscriptionTransitionForEvent(final EffectiveSubscriptionEvent event,
@@ -228,7 +231,7 @@ public class BusinessSubscriptionTransitionRecorder {
continue;
}
- if (nextSubscription.getSubscriptionId().equals(event.getSubscriptionId())) {
+ if (candidate.getSubscriptionId().equals(event.getSubscriptionId())) {
transition = candidate;
}
}
@@ -241,18 +244,4 @@ public class BusinessSubscriptionTransitionRecorder {
return transition;
}
-
- // Public for internal reasons
- public void record(final Long totalOrdering, final String externalKey, final String accountKey, final DateTime requestedDateTime, final BusinessSubscriptionEvent event, final BusinessSubscription prevSubscription, final BusinessSubscription nextSubscription) {
- final BusinessSubscriptionTransition transition = new BusinessSubscriptionTransition(
- totalOrdering,
- externalKey,
- accountKey,
- requestedDateTime,
- event,
- prevSubscription,
- nextSubscription
- );
- sqlDao.createTransition(transition);
- }
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessTagRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessTagRecorder.java
index 8aa4343..7708f15 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessTagRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessTagRecorder.java
@@ -87,61 +87,50 @@ public class BusinessTagRecorder {
}
}
- private void tagAddedForAccount(final UUID objectId, final String name) {
+ private void tagAddedForAccount(final UUID accountId, final String name) {
final Account account;
try {
- account = accountApi.getAccountById(objectId);
+ account = accountApi.getAccountById(accountId);
} catch (AccountApiException e) {
- log.warn("Ignoring tag addition of {} for account id {} (account does not exist)", name, objectId.toString());
+ log.warn("Ignoring tag addition of {} for account id {} (account does not exist)", name, accountId.toString());
return;
}
final String accountKey = account.getExternalKey();
- accountTagSqlDao.addTag(accountKey, name);
+ accountTagSqlDao.addTag(accountId.toString(), accountKey, name);
}
- private void tagRemovedForAccount(final UUID objectId, final String name) {
- final Account account;
- try {
- account = accountApi.getAccountById(objectId);
- } catch (AccountApiException e) {
- log.warn("Ignoring tag removal of {} for account id {} (account does not exist)", name, objectId.toString());
- return;
- }
-
- final String accountKey = account.getExternalKey();
- accountTagSqlDao.removeTag(accountKey, name);
+ private void tagRemovedForAccount(final UUID accountId, final String name) {
+ accountTagSqlDao.removeTag(accountId.toString(), name);
}
- private void tagAddedForBundle(final UUID objectId, final String name) {
+ private void tagAddedForBundle(final UUID bundleId, final String name) {
final SubscriptionBundle bundle;
try {
- bundle = entitlementUserApi.getBundleFromId(objectId);
+ bundle = entitlementUserApi.getBundleFromId(bundleId);
} catch (EntitlementUserApiException e) {
- log.warn("Ignoring tag addition of {} for bundle id {} (bundle does not exist)", name, objectId.toString());
+ log.warn("Ignoring tag addition of {} for bundle id {} (bundle does not exist)", name, bundleId.toString());
+ return;
+ }
+
+ final Account account;
+ try {
+ account = accountApi.getAccountById(bundle.getAccountId());
+ } catch (AccountApiException e) {
+ log.warn("Ignoring tag addition of {} for bundle id {} and account id {} (account does not exist)", new Object[]{name, bundleId.toString(), bundle.getAccountId()});
return;
}
/*
* Note: we store tags associated to bundles, not to subscriptions.
- * Subscriptions are in the core of killbill and not exposed in Analytics to avoid a hard dependency
- * (i.e. dashboards should not rely on killbill ids).
*/
+ final String accountKey = account.getExternalKey();
final String externalKey = bundle.getKey();
- subscriptionTransitionTagSqlDao.addTag(externalKey, name);
+ subscriptionTransitionTagSqlDao.addTag(accountKey, bundleId.toString(), externalKey, name);
}
- private void tagRemovedForBundle(final UUID objectId, final String name) {
- final SubscriptionBundle bundle;
- try {
- bundle = entitlementUserApi.getBundleFromId(objectId);
- } catch (EntitlementUserApiException e) {
- log.warn("Ignoring tag removal of {} for bundle id {} (bundle does not exist)", name, objectId.toString());
- return;
- }
-
- final String externalKey = bundle.getKey();
- subscriptionTransitionTagSqlDao.removeTag(externalKey, name);
+ private void tagRemovedForBundle(final UUID bundleId, final String name) {
+ subscriptionTransitionTagSqlDao.removeTag(bundleId.toString(), name);
}
private void tagAddedForInvoice(final UUID objectId, final String name) {
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/AnalyticsDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/AnalyticsDao.java
index 8dcc6c8..2f0b6db 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/AnalyticsDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/AnalyticsDao.java
@@ -34,6 +34,4 @@ public interface AnalyticsDao {
List<BusinessAccountTag> getTagsForAccount(final String accountKey);
List<BusinessInvoiceItem> getInvoiceItemsForInvoice(final String invoiceId);
-
- void createInvoice(final String accountKey, final BusinessInvoice invoice, final Iterable<BusinessInvoiceItem> invoiceItems);
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
index 223068e..3ba6ea5 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
@@ -49,6 +49,7 @@ public @interface BusinessAccountBinder {
}
q.bind("updated_date", dateTimeNow.getMillis());
+ q.bind("account_id", account.getAccountId().toString());
q.bind("account_key", account.getKey());
q.bind("balance", account.getRoundedBalance());
q.bind("name", account.getName());
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountFieldMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountFieldMapper.java
index 7cb7260..411af1a 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountFieldMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountFieldMapper.java
@@ -18,6 +18,7 @@ package com.ning.billing.analytics.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.UUID;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
@@ -27,6 +28,10 @@ import com.ning.billing.analytics.model.BusinessAccountField;
public class BusinessAccountFieldMapper implements ResultSetMapper<BusinessAccountField> {
@Override
public BusinessAccountField map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
- return new BusinessAccountField(r.getString(1), r.getString(2), r.getString(3));
+ final UUID accountId = UUID.fromString(r.getString(1));
+ final String accountKey = r.getString(2);
+ final String name = r.getString(3);
+ final String value = r.getString(4);
+ return new BusinessAccountField(accountId, accountKey, name, value);
}
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountFieldSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountFieldSqlDao.java
index d982772..3bf8b43 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountFieldSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountFieldSqlDao.java
@@ -33,10 +33,11 @@ public interface BusinessAccountFieldSqlDao {
List<BusinessAccountField> getFieldsForAccount(@Bind("account_key") final String accountKey);
@SqlUpdate
- int addField(@Bind("account_key") final String accountKey, @Bind("name") final String name, @Bind("value") final String value);
+ int addField(@Bind("account_id") final String accountId, @Bind("account_key") final String accountKey,
+ @Bind("name") final String name, @Bind("value") final String value);
@SqlUpdate
- int removeField(@Bind("account_key") final String accountKey, @Bind("name") final String name);
+ int removeField(@Bind("account_id") final String accountId, @Bind("name") final String name);
@SqlUpdate
void test();
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
index bf4da3d..7bced4f 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
@@ -19,6 +19,7 @@ package com.ning.billing.analytics.dao;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
@@ -31,18 +32,19 @@ public class BusinessAccountMapper implements ResultSetMapper<BusinessAccount> {
@Override
public BusinessAccount map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
final BusinessAccount account = new BusinessAccount(
- r.getString(1),
- r.getString(5),
- BigDecimal.valueOf(r.getDouble(4)),
- r.getLong(6) == 0 ? null : new DateTime(r.getLong(6), DateTimeZone.UTC),
- BigDecimal.valueOf(r.getDouble(7)),
- r.getString(8),
+ UUID.fromString(r.getString(1)),
+ r.getString(2),
+ r.getString(6),
+ BigDecimal.valueOf(r.getDouble(5)),
+ r.getLong(7) == 0 ? null : new DateTime(r.getLong(7), DateTimeZone.UTC),
+ BigDecimal.valueOf(r.getDouble(8)),
r.getString(9),
r.getString(10),
- r.getString(11)
+ r.getString(11),
+ r.getString(12)
);
- account.setCreatedDt(new DateTime(r.getLong(2), DateTimeZone.UTC));
- account.setUpdatedDt(new DateTime(r.getLong(3), DateTimeZone.UTC));
+ account.setCreatedDt(new DateTime(r.getLong(3), DateTimeZone.UTC));
+ account.setUpdatedDt(new DateTime(r.getLong(4), DateTimeZone.UTC));
return account;
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountSqlDao.java
index 605e604..8ceb0ad 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountSqlDao.java
@@ -30,7 +30,10 @@ import com.ning.billing.analytics.model.BusinessAccount;
@RegisterMapper(BusinessAccountMapper.class)
public interface BusinessAccountSqlDao extends Transactional<BusinessAccountSqlDao>, Transmogrifier {
@SqlQuery
- BusinessAccount getAccount(@Bind("account_key") final String key);
+ BusinessAccount getAccount(@Bind("account_id") final String accountId);
+
+ @SqlQuery
+ BusinessAccount getAccountByKey(@Bind("account_key") String accountKey);
@SqlUpdate
int createAccount(@BusinessAccountBinder final BusinessAccount account);
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountTagMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountTagMapper.java
index ddad81d..e8897d7 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountTagMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountTagMapper.java
@@ -18,6 +18,7 @@ package com.ning.billing.analytics.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.UUID;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
@@ -27,6 +28,9 @@ import com.ning.billing.analytics.model.BusinessAccountTag;
public class BusinessAccountTagMapper implements ResultSetMapper<BusinessAccountTag> {
@Override
public BusinessAccountTag map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
- return new BusinessAccountTag(r.getString(1), r.getString(2));
+ final UUID accountId = UUID.fromString(r.getString(1));
+ final String accountKey = r.getString(2);
+ final String name = r.getString(3);
+ return new BusinessAccountTag(accountId, accountKey, name);
}
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountTagSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountTagSqlDao.java
index 0aac244..26bc628 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountTagSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountTagSqlDao.java
@@ -33,10 +33,10 @@ public interface BusinessAccountTagSqlDao {
List<BusinessAccountTag> getTagsForAccount(@Bind("account_key") final String accountKey);
@SqlUpdate
- int addTag(@Bind("account_key") final String accountKey, @Bind("name") final String name);
+ int addTag(@Bind("account_id") final String accountId, @Bind("account_key") final String accountKey, @Bind("name") final String name);
@SqlUpdate
- int removeTag(@Bind("account_key") final String accountKey, @Bind("name") final String name);
+ int removeTag(@Bind("account_id") final String accountId, @Bind("name") final String name);
@SqlUpdate
void test();
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceBinder.java
index 412f323..fa8358b 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceBinder.java
@@ -43,6 +43,12 @@ public @interface BusinessInvoiceBinder {
public void bind(final SQLStatement q, final BusinessInvoiceBinder bind, final BusinessInvoice invoice) {
q.bind("invoice_id", invoice.getInvoiceId().toString());
+ if (invoice.getInvoiceNumber() != null) {
+ q.bind("invoice_number", invoice.getInvoiceNumber());
+ } else {
+ q.bindNull("invoice_number", Types.BIGINT);
+ }
+
final DateTime dateTimeNow = new DateTime(DateTimeZone.UTC);
if (invoice.getCreatedDate() != null) {
q.bind("created_date", invoice.getCreatedDate().getMillis());
@@ -56,6 +62,7 @@ public @interface BusinessInvoiceBinder {
q.bind("updated_date", dateTimeNow.getMillis());
}
+ q.bind("account_id", invoice.getAccountId().toString());
q.bind("account_key", invoice.getAccountKey());
if (invoice.getInvoiceDate() != null) {
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceMapper.java
index 93d727a..e6df819 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceMapper.java
@@ -33,18 +33,20 @@ public class BusinessInvoiceMapper implements ResultSetMapper<BusinessInvoice> {
@Override
public BusinessInvoice map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
final UUID invoiceId = UUID.fromString(r.getString(1));
- final DateTime createdDate = new DateTime(r.getLong(2), DateTimeZone.UTC);
- final DateTime updatedDate = new DateTime(r.getLong(3), DateTimeZone.UTC);
- final String accountKey = r.getString(4);
- final DateTime invoiceDate = new DateTime(r.getLong(5), DateTimeZone.UTC);
- final DateTime targetDate = new DateTime(r.getLong(6), DateTimeZone.UTC);
- final Currency currency = Currency.valueOf(r.getString(7));
- final BigDecimal balance = BigDecimal.valueOf(r.getDouble(8));
- final BigDecimal amountPaid = BigDecimal.valueOf(r.getDouble(9));
- final BigDecimal amountCharged = BigDecimal.valueOf(r.getDouble(10));
- final BigDecimal amountCredited = BigDecimal.valueOf(r.getDouble(11));
+ final Integer invoiceNumber = r.getInt(2);
+ final DateTime createdDate = new DateTime(r.getLong(3), DateTimeZone.UTC);
+ final DateTime updatedDate = new DateTime(r.getLong(4), DateTimeZone.UTC);
+ final UUID accountId = UUID.fromString(r.getString(5));
+ final String accountKey = r.getString(6);
+ final DateTime invoiceDate = new DateTime(r.getLong(7), DateTimeZone.UTC);
+ final DateTime targetDate = new DateTime(r.getLong(8), DateTimeZone.UTC);
+ final Currency currency = Currency.valueOf(r.getString(9));
+ final BigDecimal balance = BigDecimal.valueOf(r.getDouble(10));
+ final BigDecimal amountPaid = BigDecimal.valueOf(r.getDouble(11));
+ final BigDecimal amountCharged = BigDecimal.valueOf(r.getDouble(12));
+ final BigDecimal amountCredited = BigDecimal.valueOf(r.getDouble(13));
- return new BusinessInvoice(accountKey, amountCharged, amountCredited, amountPaid, balance, createdDate, currency,
- invoiceDate, invoiceId, targetDate, updatedDate);
+ return new BusinessInvoice(accountId, accountKey, amountCharged, amountCredited, amountPaid, balance, createdDate, currency,
+ invoiceDate, invoiceId, invoiceNumber, targetDate, updatedDate);
}
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceSqlDao.java
index d3c8c6e..73fbb9b 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceSqlDao.java
@@ -35,16 +35,19 @@ public interface BusinessInvoiceSqlDao extends Transactional<BusinessInvoiceSqlD
BusinessInvoice getInvoice(@Bind("invoice_id") final String invoiceId);
@SqlQuery
- List<BusinessInvoice> getInvoicesForAccount(@Bind("account_key") final String accountKey);
+ List<BusinessInvoice> getInvoicesForAccount(@Bind("account_id") final String accountId);
+
+ @SqlQuery
+ List<BusinessInvoice> getInvoicesForAccountByKey(@Bind("account_key") final String accountKey);
@SqlUpdate
int createInvoice(@BusinessInvoiceBinder final BusinessInvoice invoice);
@SqlUpdate
- int updateInvoice(@BusinessInvoiceBinder final BusinessInvoice invoice);
+ int deleteInvoice(@Bind("invoice_id") final String invoiceId);
@SqlUpdate
- int deleteInvoice(@Bind("invoice_id") final String invoiceId);
+ void deleteInvoicesForAccount(@Bind("account_id") final String accountId);
@SqlUpdate
void test();
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessOverdueStatusBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessOverdueStatusBinder.java
index eb1bd9d..879b2ee 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessOverdueStatusBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessOverdueStatusBinder.java
@@ -38,6 +38,8 @@ public @interface BusinessOverdueStatusBinder {
public Binder build(final Annotation annotation) {
return new Binder<BusinessOverdueStatusBinder, BusinessOverdueStatus>() {
public void bind(final SQLStatement q, final BusinessOverdueStatusBinder bind, final BusinessOverdueStatus overdueStatus) {
+ q.bind("account_key", overdueStatus.getAccountKey());
+ q.bind("bundle_id", overdueStatus.getBundleId().toString());
q.bind("external_key", overdueStatus.getExternalKey());
q.bind("status", overdueStatus.getStatus());
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessOverdueStatusMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessOverdueStatusMapper.java
index dcd6bf2..35ef90e 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessOverdueStatusMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessOverdueStatusMapper.java
@@ -18,6 +18,7 @@ package com.ning.billing.analytics.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
@@ -29,11 +30,13 @@ import com.ning.billing.analytics.model.BusinessOverdueStatus;
public class BusinessOverdueStatusMapper implements ResultSetMapper<BusinessOverdueStatus> {
@Override
public BusinessOverdueStatus map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
- final String externalKey = r.getString(1);
- final String status = r.getString(2);
- final DateTime startDate = new DateTime(r.getLong(3), DateTimeZone.UTC);
- final DateTime endDate = new DateTime(r.getLong(4), DateTimeZone.UTC);
+ final UUID bundleId = UUID.fromString(r.getString(1));
+ final String externalKey = r.getString(2);
+ final String accountKey = r.getString(3);
+ final String status = r.getString(4);
+ final DateTime startDate = new DateTime(r.getLong(5), DateTimeZone.UTC);
+ final DateTime endDate = new DateTime(r.getLong(6), DateTimeZone.UTC);
- return new BusinessOverdueStatus(endDate, externalKey, startDate, status);
+ return new BusinessOverdueStatus(accountKey, bundleId, endDate, externalKey, startDate, status);
}
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java
index 9e5b507..73804a3 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java
@@ -40,8 +40,11 @@ public @interface BusinessSubscriptionTransitionBinder {
return new Binder<BusinessSubscriptionTransitionBinder, BusinessSubscriptionTransition>() {
public void bind(final SQLStatement q, final BusinessSubscriptionTransitionBinder bind, final BusinessSubscriptionTransition arg) {
q.bind("total_ordering", arg.getTotalOrdering());
+ q.bind("bundle_id", arg.getBundleId().toString());
q.bind("external_key", arg.getExternalKey());
+ q.bind("account_id", arg.getAccountId().toString());
q.bind("account_key", arg.getAccountKey());
+ q.bind("subscription_id", arg.getSubscriptionId().toString());
q.bind("requested_timestamp", arg.getRequestedTimestamp().getMillis());
q.bind("event", arg.getEvent().toString());
@@ -59,8 +62,6 @@ public @interface BusinessSubscriptionTransitionBinder {
q.bindNull("prev_currency", Types.VARCHAR);
q.bindNull("prev_start_date", Types.BIGINT);
q.bindNull("prev_state", Types.VARCHAR);
- q.bindNull("prev_subscription_id", Types.VARCHAR);
- q.bindNull("prev_bundle_id", Types.VARCHAR);
} else {
q.bind("prev_product_name", previousSubscription.getProductName());
q.bind("prev_product_type", previousSubscription.getProductType());
@@ -86,16 +87,6 @@ public @interface BusinessSubscriptionTransitionBinder {
} else {
q.bind("prev_state", previousSubscription.getState().toString());
}
- if (previousSubscription.getSubscriptionId() == null) {
- q.bindNull("prev_subscription_id", Types.VARCHAR);
- } else {
- q.bind("prev_subscription_id", previousSubscription.getSubscriptionId().toString());
- }
- if (previousSubscription.getBundleId() == null) {
- q.bindNull("prev_bundle_id", Types.VARCHAR);
- } else {
- q.bind("prev_bundle_id", previousSubscription.getBundleId().toString());
- }
}
final BusinessSubscription nextSubscription = arg.getNextSubscription();
@@ -112,8 +103,6 @@ public @interface BusinessSubscriptionTransitionBinder {
q.bindNull("next_currency", Types.VARCHAR);
q.bindNull("next_start_date", Types.BIGINT);
q.bindNull("next_state", Types.VARCHAR);
- q.bindNull("next_subscription_id", Types.VARCHAR);
- q.bindNull("next_bundle_id", Types.VARCHAR);
} else {
q.bind("next_product_name", nextSubscription.getProductName());
q.bind("next_product_type", nextSubscription.getProductType());
@@ -139,16 +128,6 @@ public @interface BusinessSubscriptionTransitionBinder {
} else {
q.bind("next_state", nextSubscription.getState().toString());
}
- if (nextSubscription.getSubscriptionId() == null) {
- q.bindNull("next_subscription_id", Types.VARCHAR);
- } else {
- q.bind("next_subscription_id", nextSubscription.getSubscriptionId().toString());
- }
- if (nextSubscription.getBundleId() == null) {
- q.bindNull("next_bundle_id", Types.VARCHAR);
- } else {
- q.bind("next_bundle_id", nextSubscription.getBundleId().toString());
- }
}
}
};
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldMapper.java
index 68ef0e2..56540b8 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldMapper.java
@@ -18,6 +18,7 @@ package com.ning.billing.analytics.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.UUID;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
@@ -27,6 +28,11 @@ import com.ning.billing.analytics.model.BusinessSubscriptionTransitionField;
public class BusinessSubscriptionTransitionFieldMapper implements ResultSetMapper<BusinessSubscriptionTransitionField> {
@Override
public BusinessSubscriptionTransitionField map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
- return new BusinessSubscriptionTransitionField(r.getString(1), r.getString(2), r.getString(3));
+ final UUID bundleId = UUID.fromString(r.getString(1));
+ final String externalKey = r.getString(2);
+ final String accountKey = r.getString(3);
+ final String name = r.getString(4);
+ final String value = r.getString(5);
+ return new BusinessSubscriptionTransitionField(accountKey, bundleId, externalKey, name, value);
}
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.java
index d22076e..e000dcc 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.java
@@ -33,10 +33,11 @@ public interface BusinessSubscriptionTransitionFieldSqlDao {
List<BusinessSubscriptionTransitionField> getFieldsForBusinessSubscriptionTransition(@Bind("external_key") final String externalKey);
@SqlUpdate
- int addField(@Bind("external_key") final String externalKey, @Bind("name") final String name, @Bind("value") final String value);
+ int addField(@Bind("account_key") final String accountKey, @Bind("bundle_id") final String bundleId, @Bind("external_key") final String externalKey,
+ @Bind("name") final String name, @Bind("value") final String value);
@SqlUpdate
- int removeField(@Bind("external_key") final String externalKey, @Bind("name") final String name);
+ int removeField(@Bind("bundle_id") final String bundleId, @Bind("name") final String name);
@SqlUpdate
void test();
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java
index c5bdf96..97ecc5b 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java
@@ -37,20 +37,18 @@ public class BusinessSubscriptionTransitionMapper implements ResultSetMapper<Bus
@Override
public BusinessSubscriptionTransition map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
BusinessSubscription prev = new BusinessSubscription(
- r.getString(6), // productName
- r.getString(7), // productType
- r.getString(8) == null ? null : ProductCategory.valueOf(r.getString(8)), // productCategory
- r.getString(9), // slug
- r.getString(10), // phase
- r.getString(11), // billing period
- BigDecimal.valueOf(r.getDouble(12)), // price
- r.getString(13), // priceList
- BigDecimal.valueOf(r.getDouble(14)), // mrr
- r.getString(15), // currency
- r.getLong(16) == 0 ? null : new DateTime(r.getLong(16), DateTimeZone.UTC), // startDate
- r.getString(17) == null ? null : SubscriptionState.valueOf(r.getString(17)), // state
- r.getString(18) == null ? null : UUID.fromString(r.getString(18)), // subscriptionId
- r.getString(19) == null ? null : UUID.fromString(r.getString(19)) //bundleId
+ r.getString(9), // productName
+ r.getString(10), // productType
+ r.getString(11) == null ? null : ProductCategory.valueOf(r.getString(11)), // productCategory
+ r.getString(12), // slug
+ r.getString(13), // phase
+ r.getString(14), // billing period
+ BigDecimal.valueOf(r.getDouble(15)), // price
+ r.getString(16), // priceList
+ BigDecimal.valueOf(r.getDouble(17)), // mrr
+ r.getString(18), // currency
+ r.getLong(19) == 0 ? null : new DateTime(r.getLong(19), DateTimeZone.UTC), // startDate
+ r.getString(20) == null ? null : SubscriptionState.valueOf(r.getString(20)) // state
);
// Avoid creating a dummy subscriptions with all null fields
@@ -59,20 +57,18 @@ public class BusinessSubscriptionTransitionMapper implements ResultSetMapper<Bus
}
BusinessSubscription next = new BusinessSubscription(
- r.getString(20), // productName
- r.getString(21), // productType
- r.getString(22) == null ? null : ProductCategory.valueOf(r.getString(22)), // productCategory
- r.getString(23), // slug8
- r.getString(24), // phase
- r.getString(25), // billing period
- BigDecimal.valueOf(r.getDouble(26)), // price
- r.getString(27), // priceList
- BigDecimal.valueOf(r.getDouble(28)), // mrr
- r.getString(29), // currency
- r.getLong(30) == 0 ? null : new DateTime(r.getLong(30), DateTimeZone.UTC), // startDate
- r.getString(31) == null ? null : SubscriptionState.valueOf(r.getString(31)), // state
- r.getString(32) == null ? null : UUID.fromString(r.getString(32)), // subscriptionId
- r.getString(33) == null ? null : UUID.fromString(r.getString(33)) //bundleId
+ r.getString(21), // productName
+ r.getString(22), // productType
+ r.getString(23) == null ? null : ProductCategory.valueOf(r.getString(23)), // productCategory
+ r.getString(24), // slug8
+ r.getString(25), // phase
+ r.getString(26), // billing period
+ BigDecimal.valueOf(r.getDouble(27)), // price
+ r.getString(28), // priceList
+ BigDecimal.valueOf(r.getDouble(29)), // mrr
+ r.getString(30), // currency
+ r.getLong(31) == 0 ? null : new DateTime(r.getLong(31), DateTimeZone.UTC), // startDate
+ r.getString(32) == null ? null : SubscriptionState.valueOf(r.getString(32)) // state
);
// Avoid creating a dummy subscriptions with all null fields
@@ -80,13 +76,16 @@ public class BusinessSubscriptionTransitionMapper implements ResultSetMapper<Bus
next = null;
}
- final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.valueOf(r.getString(5));
+ final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.valueOf(r.getString(8));
return new BusinessSubscriptionTransition(
r.getLong(1),
- r.getString(2),
+ UUID.fromString(r.getString(2)),
r.getString(3),
- new DateTime(r.getLong(4), DateTimeZone.UTC),
+ UUID.fromString(r.getString(4)),
+ r.getString(5),
+ UUID.fromString(r.getString(6)),
+ new DateTime(r.getLong(7), DateTimeZone.UTC),
event,
prev,
next
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java
index 2092d47..254e59e 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java
@@ -40,10 +40,7 @@ public interface BusinessSubscriptionTransitionSqlDao extends Transactional<Busi
int createTransition(@BusinessSubscriptionTransitionBinder final BusinessSubscriptionTransition transition);
@SqlUpdate
- void updateTransition(@Bind("total_ordering") long totalOrdering, @BusinessSubscriptionTransitionBinder BusinessSubscriptionTransition updatedFirstTransition);
-
- @SqlUpdate
- void deleteTransitionsForBundle(@Bind("external_key") final String externalKey);
+ void deleteTransitionsForBundle(@Bind("bundle_id") final String bundleId);
@SqlUpdate
void test();
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagMapper.java
index 36f7631..25ae0be 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagMapper.java
@@ -18,6 +18,7 @@ package com.ning.billing.analytics.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.UUID;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
@@ -27,6 +28,10 @@ import com.ning.billing.analytics.model.BusinessSubscriptionTransitionTag;
public class BusinessSubscriptionTransitionTagMapper implements ResultSetMapper<BusinessSubscriptionTransitionTag> {
@Override
public BusinessSubscriptionTransitionTag map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
- return new BusinessSubscriptionTransitionTag(r.getString(1), r.getString(2));
+ final UUID bundleId = UUID.fromString(r.getString(1));
+ final String externalKey = r.getString(2);
+ final String accountKey = r.getString(3);
+ final String name = r.getString(4);
+ return new BusinessSubscriptionTransitionTag(accountKey, bundleId, externalKey, name);
}
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.java
index c073a53..fef5a05 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.java
@@ -33,10 +33,11 @@ public interface BusinessSubscriptionTransitionTagSqlDao {
List<BusinessSubscriptionTransitionTag> getTagsForBusinessSubscriptionTransition(@Bind("external_key") final String externalKey);
@SqlUpdate
- int addTag(@Bind("external_key") final String externalKey, @Bind("name") final String name);
+ int addTag(@Bind("account_key") final String accountKey, @Bind("bundle_id") final String bundleId,
+ @Bind("external_key") final String externalKey, @Bind("name") final String name);
@SqlUpdate
- int removeTag(@Bind("external_key") final String externalKey, @Bind("name") final String name);
+ int removeTag(@Bind("bundle_id") final String bundleId, @Bind("name") final String name);
@SqlUpdate
void test();
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/DefaultAnalyticsDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/DefaultAnalyticsDao.java
index d5f8627..edbf529 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/DefaultAnalyticsDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/DefaultAnalyticsDao.java
@@ -19,11 +19,6 @@ package com.ning.billing.analytics.dao;
import javax.inject.Inject;
import java.util.List;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.skife.jdbi.v2.Transaction;
-import org.skife.jdbi.v2.TransactionStatus;
-
import com.ning.billing.analytics.model.BusinessAccount;
import com.ning.billing.analytics.model.BusinessAccountTag;
import com.ning.billing.analytics.model.BusinessInvoice;
@@ -52,7 +47,7 @@ public class DefaultAnalyticsDao implements AnalyticsDao {
@Override
public BusinessAccount getAccountByKey(final String accountKey) {
- return accountSqlDao.getAccount(accountKey);
+ return accountSqlDao.getAccountByKey(accountKey);
}
@Override
@@ -62,7 +57,7 @@ public class DefaultAnalyticsDao implements AnalyticsDao {
@Override
public List<BusinessInvoice> getInvoicesByKey(final String accountKey) {
- return invoiceSqlDao.getInvoicesForAccount(accountKey);
+ return invoiceSqlDao.getInvoicesForAccountByKey(accountKey);
}
@Override
@@ -74,35 +69,4 @@ public class DefaultAnalyticsDao implements AnalyticsDao {
public List<BusinessInvoiceItem> getInvoiceItemsForInvoice(final String invoiceId) {
return invoiceItemSqlDao.getInvoiceItemsForInvoice(invoiceId);
}
-
- @Override
- public void createInvoice(final String accountKey, final BusinessInvoice invoice, final Iterable<BusinessInvoiceItem> invoiceItems) {
- invoiceSqlDao.inTransaction(new Transaction<Void, BusinessInvoiceSqlDao>() {
- @Override
- public Void inTransaction(final BusinessInvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
- // Create the invoice
- transactional.createInvoice(invoice);
-
- // Add associated invoice items
- final BusinessInvoiceItemSqlDao invoiceItemSqlDao = transactional.become(BusinessInvoiceItemSqlDao.class);
- for (final BusinessInvoiceItem invoiceItem : invoiceItems) {
- invoiceItemSqlDao.createInvoiceItem(invoiceItem);
- }
-
- // Update BAC
- final BusinessAccountSqlDao accountSqlDao = transactional.become(BusinessAccountSqlDao.class);
- final BusinessAccount account = accountSqlDao.getAccount(accountKey);
- if (account == null) {
- throw new IllegalStateException("Account does not exist for key " + accountKey);
- }
- account.setBalance(account.getBalance().add(invoice.getBalance()));
- account.setLastInvoiceDate(invoice.getInvoiceDate());
- account.setTotalInvoiceBalance(account.getTotalInvoiceBalance().add(invoice.getBalance()));
- account.setUpdatedDt(new DateTime(DateTimeZone.UTC));
- accountSqlDao.saveAccount(account);
-
- return null;
- }
- });
- }
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
index b8b056c..642a765 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
@@ -17,6 +17,7 @@
package com.ning.billing.analytics.model;
import java.math.BigDecimal;
+import java.util.UUID;
import org.joda.time.DateTime;
@@ -27,6 +28,7 @@ public class BusinessAccount {
private DateTime createdDt = null;
private DateTime updatedDt = null;
+ private final UUID accountId;
private String key;
private String name;
private BigDecimal balance;
@@ -37,10 +39,14 @@ public class BusinessAccount {
private String creditCardType;
private String billingAddressCountry;
- public BusinessAccount() {
+ public BusinessAccount(final UUID accountId) {
+ this.accountId = accountId;
}
- public BusinessAccount(final String key, final String name, final BigDecimal balance, final DateTime lastInvoiceDate, final BigDecimal totalInvoiceBalance, final String lastPaymentStatus, final String paymentMethod, final String creditCardType, final String billingAddressCountry) {
+ public BusinessAccount(final UUID accountId, final String key, final String name, final BigDecimal balance,
+ final DateTime lastInvoiceDate, final BigDecimal totalInvoiceBalance, final String lastPaymentStatus,
+ final String paymentMethod, final String creditCardType, final String billingAddressCountry) {
+ this.accountId = accountId;
this.key = key;
this.balance = balance;
this.billingAddressCountry = billingAddressCountry;
@@ -52,6 +58,10 @@ public class BusinessAccount {
this.totalInvoiceBalance = totalInvoiceBalance;
}
+ public UUID getAccountId() {
+ return accountId;
+ }
+
public String getKey() {
return key;
}
@@ -155,6 +165,7 @@ public class BusinessAccount {
sb.append("{balance=").append(balance);
sb.append(", createdDt=").append(createdDt);
sb.append(", updatedDt=").append(updatedDt);
+ sb.append(", accountId='").append(accountId).append('\'');
sb.append(", key='").append(key).append('\'');
sb.append(", name='").append(name).append('\'');
sb.append(", lastInvoiceDate=").append(lastInvoiceDate);
@@ -190,6 +201,9 @@ public class BusinessAccount {
if (creditCardType != null ? !creditCardType.equals(that.creditCardType) : that.creditCardType != null) {
return false;
}
+ if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
+ return false;
+ }
if (key != null ? !key.equals(that.key) : that.key != null) {
return false;
}
@@ -219,6 +233,7 @@ public class BusinessAccount {
public int hashCode() {
int result = createdDt != null ? createdDt.hashCode() : 0;
result = 31 * result + (updatedDt != null ? updatedDt.hashCode() : 0);
+ result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
result = 31 * result + (key != null ? key.hashCode() : 0);
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (balance != null ? balance.hashCode() : 0);
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccountField.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccountField.java
index 3d9df23..b422838 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccountField.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccountField.java
@@ -16,14 +16,22 @@
package com.ning.billing.analytics.model;
+import java.util.UUID;
+
public class BusinessAccountField extends BusinessField {
+ private final UUID accountId;
private final String accountKey;
- public BusinessAccountField(final String accountKey, final String name, final String value) {
+ public BusinessAccountField(final UUID accountId, final String accountKey, final String name, final String value) {
super(name, value);
+ this.accountId = accountId;
this.accountKey = accountKey;
}
+ public UUID getAccountId() {
+ return accountId;
+ }
+
public String getAccountKey() {
return accountKey;
}
@@ -32,7 +40,8 @@ public class BusinessAccountField extends BusinessField {
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("BusinessAccountField");
- sb.append("{accountKey='").append(accountKey).append('\'');
+ sb.append("{accountId='").append(accountId).append('\'');
+ sb.append(", accountKey='").append(accountKey).append('\'');
sb.append(", name='").append(getName()).append('\'');
sb.append(", value='").append(getValue()).append('\'');
sb.append('}');
@@ -50,6 +59,9 @@ public class BusinessAccountField extends BusinessField {
final BusinessAccountField that = (BusinessAccountField) o;
+ if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
+ return false;
+ }
if (accountKey != null ? !accountKey.equals(that.accountKey) : that.accountKey != null) {
return false;
}
@@ -65,7 +77,8 @@ public class BusinessAccountField extends BusinessField {
@Override
public int hashCode() {
- int result = accountKey != null ? accountKey.hashCode() : 0;
+ int result = accountId != null ? accountId.hashCode() : 0;
+ result = 31 * result + (accountKey != null ? accountKey.hashCode() : 0);
result = 31 * result + (getName() != null ? getName().hashCode() : 0);
result = 31 * result + (getValue() != null ? getValue().hashCode() : 0);
return result;
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccountTag.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccountTag.java
index 1461c6d..877ab42 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccountTag.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccountTag.java
@@ -16,14 +16,22 @@
package com.ning.billing.analytics.model;
+import java.util.UUID;
+
public class BusinessAccountTag extends BusinessTag {
+ private final UUID accountId;
private final String accountKey;
- public BusinessAccountTag(final String accountKey, final String name) {
+ public BusinessAccountTag(final UUID accountId, final String accountKey, final String name) {
super(name);
+ this.accountId = accountId;
this.accountKey = accountKey;
}
+ public UUID getAccountId() {
+ return accountId;
+ }
+
public String getAccountKey() {
return accountKey;
}
@@ -32,7 +40,8 @@ public class BusinessAccountTag extends BusinessTag {
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("BusinessAccountTag");
- sb.append("{accountKey='").append(accountKey).append('\'');
+ sb.append("{accountId='").append(accountId).append('\'');
+ sb.append(", accountKey='").append(accountKey).append('\'');
sb.append(", name='").append(getName()).append('\'');
sb.append('}');
return sb.toString();
@@ -49,6 +58,9 @@ public class BusinessAccountTag extends BusinessTag {
final BusinessAccountTag that = (BusinessAccountTag) o;
+ if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
+ return false;
+ }
if (accountKey != null ? !accountKey.equals(that.accountKey) : that.accountKey != null) {
return false;
}
@@ -61,7 +73,8 @@ public class BusinessAccountTag extends BusinessTag {
@Override
public int hashCode() {
- int result = accountKey != null ? accountKey.hashCode() : 0;
+ int result = accountId != null ? accountId.hashCode() : 0;
+ result = 31 * result + (accountKey != null ? accountKey.hashCode() : 0);
result = 31 * result + (getName() != null ? getName().hashCode() : 0);
return result;
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
index beab7d6..cb3138a 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
@@ -28,22 +28,24 @@ import com.ning.billing.invoice.api.Invoice;
public class BusinessInvoice {
private final UUID invoiceId;
+ private final Integer invoiceNumber;
private final DateTime createdDate;
-
- private DateTime updatedDate;
- private String accountKey;
- private DateTime invoiceDate;
- private DateTime targetDate;
- private Currency currency;
- private BigDecimal balance;
- private BigDecimal amountPaid;
- private BigDecimal amountCharged;
- private BigDecimal amountCredited;
-
- public BusinessInvoice(final String accountKey, final BigDecimal amountCharged, final BigDecimal amountCredited,
+ private final DateTime updatedDate;
+ private final UUID accountId;
+ private final String accountKey;
+ private final DateTime invoiceDate;
+ private final DateTime targetDate;
+ private final Currency currency;
+ private final BigDecimal balance;
+ private final BigDecimal amountPaid;
+ private final BigDecimal amountCharged;
+ private final BigDecimal amountCredited;
+
+ public BusinessInvoice(final UUID accountId, final String accountKey, final BigDecimal amountCharged, final BigDecimal amountCredited,
final BigDecimal amountPaid, final BigDecimal balance, final DateTime createdDate,
- final Currency currency, final DateTime invoiceDate, final UUID invoiceId,
+ final Currency currency, final DateTime invoiceDate, final UUID invoiceId, final Integer invoiceNumber,
final DateTime targetDate, final DateTime updatedDate) {
+ this.accountId = accountId;
this.accountKey = accountKey;
this.amountCharged = amountCharged;
this.amountCredited = amountCredited;
@@ -53,105 +55,80 @@ public class BusinessInvoice {
this.currency = currency;
this.invoiceDate = invoiceDate;
this.invoiceId = invoiceId;
+ this.invoiceNumber = invoiceNumber;
this.targetDate = targetDate;
this.updatedDate = updatedDate;
}
public BusinessInvoice(final String accountKey, final Invoice invoice) {
- // STEPH this is probably not what we want (CBA versus credit)
- this(accountKey, invoice.getChargedAmount(), invoice.getCBAAmount(), invoice.getPaidAmount(), invoice.getBalance(),
- new DateTime(DateTimeZone.UTC), invoice.getCurrency(), invoice.getInvoiceDate(), invoice.getId(), invoice.getTargetDate(),
+ // TODO STEPH this is probably not what we want (CBA versus credit)
+ this(invoice.getAccountId(), accountKey, invoice.getChargedAmount(), invoice.getCBAAmount(), invoice.getPaidAmount(), invoice.getBalance(),
+ new DateTime(DateTimeZone.UTC), invoice.getCurrency(), invoice.getInvoiceDate(), invoice.getId(), invoice.getInvoiceNumber(), invoice.getTargetDate(),
new DateTime(DateTimeZone.UTC));
}
- public DateTime getCreatedDate() {
- return createdDate;
- }
-
- public UUID getInvoiceId() {
- return invoiceId;
+ public UUID getAccountId() {
+ return accountId;
}
public String getAccountKey() {
return accountKey;
}
- public void setAccountKey(final String accountKey) {
- this.accountKey = accountKey;
- }
-
public BigDecimal getAmountCharged() {
return amountCharged;
}
- public void setAmountCharged(final BigDecimal amountCharged) {
- this.amountCharged = amountCharged;
- }
-
public BigDecimal getAmountCredited() {
return amountCredited;
}
- public void setAmountCredited(final BigDecimal amountCredited) {
- this.amountCredited = amountCredited;
- }
-
public BigDecimal getAmountPaid() {
return amountPaid;
}
- public void setAmountPaid(final BigDecimal amountPaid) {
- this.amountPaid = amountPaid;
- }
-
public BigDecimal getBalance() {
return balance;
}
- public void setBalance(final BigDecimal balance) {
- this.balance = balance;
+ public DateTime getCreatedDate() {
+ return createdDate;
}
public Currency getCurrency() {
return currency;
}
- public void setCurrency(final Currency currency) {
- this.currency = currency;
- }
-
public DateTime getInvoiceDate() {
return invoiceDate;
}
- public void setInvoiceDate(final DateTime invoiceDate) {
- this.invoiceDate = invoiceDate;
+ public UUID getInvoiceId() {
+ return invoiceId;
}
- public DateTime getTargetDate() {
- return targetDate;
+ public Integer getInvoiceNumber() {
+ return invoiceNumber;
}
- public void setTargetDate(final DateTime targetDate) {
- this.targetDate = targetDate;
+ public DateTime getTargetDate() {
+ return targetDate;
}
public DateTime getUpdatedDate() {
return updatedDate;
}
- public void setUpdatedDate(final DateTime updatedDate) {
- this.updatedDate = updatedDate;
- }
-
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("BusinessInvoice");
- sb.append("{accountKey='").append(accountKey).append('\'');
+ sb.append("{accountId=").append(accountId);
sb.append(", invoiceId=").append(invoiceId);
+ sb.append(", invoiceNumber=").append(invoiceNumber);
sb.append(", createdDate=").append(createdDate);
sb.append(", updatedDate=").append(updatedDate);
+ sb.append(", accountKey='").append(accountKey).append('\'');
sb.append(", invoiceDate=").append(invoiceDate);
sb.append(", targetDate=").append(targetDate);
sb.append(", currency=").append(currency);
@@ -174,6 +151,9 @@ public class BusinessInvoice {
final BusinessInvoice that = (BusinessInvoice) o;
+ if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
+ return false;
+ }
if (accountKey != null ? !accountKey.equals(that.accountKey) : that.accountKey != null) {
return false;
}
@@ -189,22 +169,25 @@ public class BusinessInvoice {
if (balance != null ? Rounder.round(balance) != Rounder.round(that.balance) : that.balance != null) {
return false;
}
- if (createdDate != null ? !createdDate.equals(that.createdDate) : that.createdDate != null) {
+ if (createdDate != null ? createdDate.compareTo(that.createdDate) != 0 : that.createdDate != null) {
return false;
}
if (currency != that.currency) {
return false;
}
- if (invoiceDate != null ? !invoiceDate.equals(that.invoiceDate) : that.invoiceDate != null) {
+ if (invoiceDate != null ? invoiceDate.compareTo(that.invoiceDate) != 0 : that.invoiceDate != null) {
return false;
}
if (invoiceId != null ? !invoiceId.equals(that.invoiceId) : that.invoiceId != null) {
return false;
}
- if (targetDate != null ? !targetDate.equals(that.targetDate) : that.targetDate != null) {
+ if (invoiceNumber != null ? !invoiceNumber.equals(that.invoiceNumber) : that.invoiceNumber != null) {
+ return false;
+ }
+ if (targetDate != null ? targetDate.compareTo(that.targetDate) != 0 : that.targetDate != null) {
return false;
}
- if (updatedDate != null ? !updatedDate.equals(that.updatedDate) : that.updatedDate != null) {
+ if (updatedDate != null ? updatedDate.compareTo(that.updatedDate) != 0 : that.updatedDate != null) {
return false;
}
@@ -214,8 +197,10 @@ public class BusinessInvoice {
@Override
public int hashCode() {
int result = invoiceId != null ? invoiceId.hashCode() : 0;
+ result = 31 * result + (invoiceNumber != null ? invoiceNumber.hashCode() : 0);
result = 31 * result + (createdDate != null ? createdDate.hashCode() : 0);
result = 31 * result + (updatedDate != null ? updatedDate.hashCode() : 0);
+ result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
result = 31 * result + (accountKey != null ? accountKey.hashCode() : 0);
result = 31 * result + (invoiceDate != null ? invoiceDate.hashCode() : 0);
result = 31 * result + (targetDate != null ? targetDate.hashCode() : 0);
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessOverdueStatus.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessOverdueStatus.java
index dd8a310..bd74d14 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessOverdueStatus.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessOverdueStatus.java
@@ -16,21 +16,36 @@
package com.ning.billing.analytics.model;
+import java.util.UUID;
+
import org.joda.time.DateTime;
public class BusinessOverdueStatus {
+ private final String accountKey;
+ private final UUID bundleId;
private final String externalKey;
private final String status;
private final DateTime startDate;
private final DateTime endDate;
- public BusinessOverdueStatus(final DateTime endDate, final String externalKey, final DateTime startDate, final String status) {
+ public BusinessOverdueStatus(final String accountKey, final UUID bundleId, final DateTime endDate,
+ final String externalKey, final DateTime startDate, final String status) {
+ this.accountKey = accountKey;
+ this.bundleId = bundleId;
this.endDate = endDate;
this.externalKey = externalKey;
this.startDate = startDate;
this.status = status;
}
+ public String getAccountKey() {
+ return accountKey;
+ }
+
+ public UUID getBundleId() {
+ return bundleId;
+ }
+
public DateTime getEndDate() {
return endDate;
}
@@ -51,7 +66,9 @@ public class BusinessOverdueStatus {
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("BusinessOverdueStatus");
- sb.append("{endDate=").append(endDate);
+ sb.append("{accountKey=").append(accountKey);
+ sb.append(", bundleId='").append(bundleId).append('\'');
+ sb.append(", endDate='").append(endDate).append('\'');
sb.append(", externalKey='").append(externalKey).append('\'');
sb.append(", status='").append(status).append('\'');
sb.append(", startDate=").append(startDate);
@@ -70,6 +87,12 @@ public class BusinessOverdueStatus {
final BusinessOverdueStatus that = (BusinessOverdueStatus) o;
+ if (accountKey != null ? !accountKey.equals(that.accountKey) : that.accountKey != null) {
+ return false;
+ }
+ if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
+ return false;
+ }
if (endDate != null ? !endDate.equals(that.endDate) : that.endDate != null) {
return false;
}
@@ -88,7 +111,9 @@ public class BusinessOverdueStatus {
@Override
public int hashCode() {
- int result = externalKey != null ? externalKey.hashCode() : 0;
+ int result = accountKey != null ? accountKey.hashCode() : 0;
+ result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0);
+ result = 31 * result + (externalKey != null ? externalKey.hashCode() : 0);
result = 31 * result + (status != null ? status.hashCode() : 0);
result = 31 * result + (startDate != null ? startDate.hashCode() : 0);
result = 31 * result + (endDate != null ? endDate.hashCode() : 0);
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscription.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscription.java
index 35d5ea1..86b6244 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscription.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscription.java
@@ -18,7 +18,6 @@ package com.ning.billing.analytics.model;
import java.math.BigDecimal;
import java.math.RoundingMode;
-import java.util.UUID;
import org.joda.time.DateTime;
import org.slf4j.Logger;
@@ -60,10 +59,10 @@ public class BusinessSubscription {
private final String currency;
private final DateTime startDate;
private final SubscriptionState state;
- private final UUID subscriptionId;
- private final UUID bundleId;
- public BusinessSubscription(final String productName, final String productType, final ProductCategory productCategory, final String slug, final String phase, final String billingPeriod, final BigDecimal price, final String priceList, final BigDecimal mrr, final String currency, final DateTime startDate, final SubscriptionState state, final UUID subscriptionId, final UUID bundleId) {
+ public BusinessSubscription(final String productName, final String productType, final ProductCategory productCategory,
+ final String slug, final String phase, final String billingPeriod, final BigDecimal price,
+ final String priceList, final BigDecimal mrr, final String currency, final DateTime startDate, final SubscriptionState state) {
this.productName = productName;
this.productType = productType;
this.productCategory = productCategory;
@@ -76,8 +75,6 @@ public class BusinessSubscription {
this.currency = currency;
this.startDate = startDate;
this.state = state;
- this.subscriptionId = subscriptionId;
- this.bundleId = bundleId;
}
/**
@@ -91,10 +88,13 @@ public class BusinessSubscription {
* @param catalog Catalog to use
*/
BusinessSubscription(final Subscription subscription, final Currency currency, final Catalog catalog) {
- this(subscription.getCurrentPriceList() == null ? null : subscription.getCurrentPriceList().getName(), subscription.getCurrentPlan().getName(), subscription.getCurrentPhase().getName(), currency, subscription.getStartDate(), subscription.getState(), subscription.getId(), subscription.getBundleId(), catalog);
+ this(subscription.getCurrentPriceList() == null ? null : subscription.getCurrentPriceList().getName(),
+ subscription.getCurrentPlan().getName(), subscription.getCurrentPhase().getName(), currency,
+ subscription.getStartDate(), subscription.getState(), catalog);
}
- public BusinessSubscription(final String priceList, final String currentPlan, final String currentPhase, final Currency currency, final DateTime startDate, final SubscriptionState state, final UUID subscriptionId, final UUID bundleId, final Catalog catalog) {
+ public BusinessSubscription(final String priceList, final String currentPlan, final String currentPhase, final Currency currency,
+ final DateTime startDate, final SubscriptionState state, final Catalog catalog) {
Plan thePlan = null;
PlanPhase thePhase = null;
try {
@@ -165,11 +165,10 @@ public class BusinessSubscription {
this.startDate = startDate;
this.state = state;
- this.subscriptionId = subscriptionId;
- this.bundleId = bundleId;
}
- public BusinessSubscription(final String priceList, final Plan currentPlan, final PlanPhase currentPhase, final Currency currency, final DateTime startDate, final SubscriptionState state, final UUID subscriptionId, final UUID bundleId) {
+ public BusinessSubscription(final String priceList, final Plan currentPlan, final PlanPhase currentPhase, final Currency currency,
+ final DateTime startDate, final SubscriptionState state) {
this.priceList = priceList;
// Record plan information
@@ -231,18 +230,12 @@ public class BusinessSubscription {
this.startDate = startDate;
this.state = state;
- this.subscriptionId = subscriptionId;
- this.bundleId = bundleId;
}
public String getBillingPeriod() {
return billingPeriod;
}
- public UUID getBundleId() {
- return bundleId;
- }
-
public String getCurrency() {
return currency;
}
@@ -295,10 +288,6 @@ public class BusinessSubscription {
return state;
}
- public UUID getSubscriptionId() {
- return subscriptionId;
- }
-
static BigDecimal getMrrFromISubscription(final Duration duration, final BigDecimal price) {
if (duration == null || duration.getUnit() == null || duration.getNumber() == 0) {
return BigDecimal.ZERO;
@@ -334,8 +323,6 @@ public class BusinessSubscription {
sb.append(", currency='").append(currency).append('\'');
sb.append(", startDate=").append(startDate);
sb.append(", state=").append(state);
- sb.append(", subscriptionId=").append(subscriptionId);
- sb.append(", bundleId=").append(bundleId);
sb.append('}');
return sb.toString();
}
@@ -354,9 +341,6 @@ public class BusinessSubscription {
if (billingPeriod != null ? !billingPeriod.equals(that.billingPeriod) : that.billingPeriod != null) {
return false;
}
- if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
- return false;
- }
if (currency != null ? !currency.equals(that.currency) : that.currency != null) {
return false;
}
@@ -390,9 +374,6 @@ public class BusinessSubscription {
if (state != that.state) {
return false;
}
- if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null) {
- return false;
- }
return true;
}
@@ -410,8 +391,6 @@ public class BusinessSubscription {
result = 31 * result + (currency != null ? currency.hashCode() : 0);
result = 31 * result + (startDate != null ? startDate.hashCode() : 0);
result = 31 * result + (state != null ? state.hashCode() : 0);
- result = 31 * result + (subscriptionId != null ? subscriptionId.hashCode() : 0);
- result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0);
result = 31 * result + (billingPeriod != null ? billingPeriod.hashCode() : 0);
return result;
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java
index 2e2a6ce..806b226 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java
@@ -16,42 +16,60 @@
package com.ning.billing.analytics.model;
+import java.util.UUID;
+
import org.joda.time.DateTime;
/**
* Describe a state change between two BusinessSubscription
- * <p/>
- * The key is unique identifier that ties sets of subscriptions together.
*/
public class BusinessSubscriptionTransition {
private final long totalOrdering;
+ private final UUID bundleId;
private final String externalKey;
+ private final UUID accountId;
private final String accountKey;
+ private final UUID subscriptionId;
private final DateTime requestedTimestamp;
private final BusinessSubscriptionEvent event;
private final BusinessSubscription previousSubscription;
private final BusinessSubscription nextSubscription;
- public BusinessSubscriptionTransition(final Long totalOrdering, final String externalKey, final String accountKey, final DateTime requestedTimestamp, final BusinessSubscriptionEvent event, final BusinessSubscription previousSubscription, final BusinessSubscription nextSubscription) {
+ public BusinessSubscriptionTransition(final Long totalOrdering, final UUID bundleId, final String externalKey,
+ final UUID accountId, final String accountKey, final UUID subscriptionId,
+ final DateTime requestedTimestamp, final BusinessSubscriptionEvent event,
+ final BusinessSubscription previousSubscription, final BusinessSubscription nextSubscription) {
if (totalOrdering == null) {
- throw new IllegalArgumentException("An event must have a total ordering");
+ throw new IllegalArgumentException("A transition must have a total ordering");
+ }
+ if (bundleId == null) {
+ throw new IllegalArgumentException("A transition must have a bundle id");
}
if (externalKey == null) {
- throw new IllegalArgumentException("An event must have an external key");
+ throw new IllegalArgumentException("A transition must have an external key");
+ }
+ if (accountId == null) {
+ throw new IllegalArgumentException("A transition must have an account key");
+ }
+ if (subscriptionId == null) {
+ throw new IllegalArgumentException("A transition must have a subscription id");
}
if (accountKey == null) {
- throw new IllegalArgumentException("An event must have an account key");
+ throw new IllegalArgumentException("A transition must have an account key");
}
if (requestedTimestamp == null) {
- throw new IllegalArgumentException("An event must have a requestedTimestamp");
+ throw new IllegalArgumentException("A transition must have a requested timestamp");
}
if (event == null) {
throw new IllegalArgumentException("No event specified");
}
this.totalOrdering = totalOrdering;
+ this.bundleId = bundleId;
this.externalKey = externalKey;
+ this.accountId = accountId;
this.accountKey = accountKey;
+ this.subscriptionId = subscriptionId;
this.requestedTimestamp = requestedTimestamp;
this.event = event;
this.previousSubscription = previousSubscription;
@@ -66,10 +84,18 @@ public class BusinessSubscriptionTransition {
return event;
}
+ public UUID getBundleId() {
+ return bundleId;
+ }
+
public String getExternalKey() {
return externalKey;
}
+ public UUID getAccountId() {
+ return accountId;
+ }
+
public String getAccountKey() {
return accountKey;
}
@@ -82,6 +108,10 @@ public class BusinessSubscriptionTransition {
return previousSubscription;
}
+ public UUID getSubscriptionId() {
+ return subscriptionId;
+ }
+
public DateTime getRequestedTimestamp() {
return requestedTimestamp;
}
@@ -90,9 +120,12 @@ public class BusinessSubscriptionTransition {
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("BusinessSubscriptionTransition");
- sb.append("{accountKey='").append(accountKey).append('\'');
+ sb.append("{accountId='").append(accountId).append('\'');
+ sb.append(", accountKey=").append(accountKey);
sb.append(", totalOrdering=").append(totalOrdering);
- sb.append(", key='").append(externalKey).append('\'');
+ sb.append(", bundleId='").append(bundleId).append('\'');
+ sb.append(", externalKey='").append(externalKey).append('\'');
+ sb.append(", subscriptionId='").append(subscriptionId).append('\'');
sb.append(", requestedTimestamp=").append(requestedTimestamp);
sb.append(", event=").append(event);
sb.append(", previousSubscription=").append(previousSubscription);
@@ -118,8 +151,11 @@ public class BusinessSubscriptionTransition {
@Override
public int hashCode() {
int result = (int) (totalOrdering ^ (totalOrdering >>> 32));
+ result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0);
result = 31 * result + (externalKey != null ? externalKey.hashCode() : 0);
+ result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
result = 31 * result + (accountKey != null ? accountKey.hashCode() : 0);
+ result = 31 * result + (subscriptionId != null ? subscriptionId.hashCode() : 0);
result = 31 * result + (requestedTimestamp != null ? requestedTimestamp.hashCode() : 0);
result = 31 * result + (event != null ? event.hashCode() : 0);
result = 31 * result + (previousSubscription != null ? previousSubscription.hashCode() : 0);
@@ -128,12 +164,18 @@ public class BusinessSubscriptionTransition {
}
public boolean isDuplicateOf(final BusinessSubscriptionTransition that) {
+ if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
+ return false;
+ }
if (accountKey != null ? !accountKey.equals(that.accountKey) : that.accountKey != null) {
return false;
}
if (event != null ? !event.equals(that.event) : that.event != null) {
return false;
}
+ if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
+ return false;
+ }
if (externalKey != null ? !externalKey.equals(that.externalKey) : that.externalKey != null) {
return false;
}
@@ -143,6 +185,9 @@ public class BusinessSubscriptionTransition {
if (previousSubscription != null ? !previousSubscription.equals(that.previousSubscription) : that.previousSubscription != null) {
return false;
}
+ if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null) {
+ return false;
+ }
if (requestedTimestamp != null ? !requestedTimestamp.equals(that.requestedTimestamp) : that.requestedTimestamp != null) {
return false;
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionField.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionField.java
index 4fe470a..d570c68 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionField.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionField.java
@@ -16,14 +16,29 @@
package com.ning.billing.analytics.model;
+import java.util.UUID;
+
public class BusinessSubscriptionTransitionField extends BusinessField {
+ private final String accountKey;
+ private final UUID bundleId;
private final String externalKey;
- public BusinessSubscriptionTransitionField(final String externalKey, final String name, final String value) {
+ public BusinessSubscriptionTransitionField(final String accountKey, final UUID bundleId, final String externalKey,
+ final String name, final String value) {
super(name, value);
+ this.accountKey = accountKey;
+ this.bundleId = bundleId;
this.externalKey = externalKey;
}
+ public String getAccountKey() {
+ return accountKey;
+ }
+
+ public UUID getBundleId() {
+ return bundleId;
+ }
+
public String getExternalKey() {
return externalKey;
}
@@ -32,7 +47,9 @@ public class BusinessSubscriptionTransitionField extends BusinessField {
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("BusinessSubscriptionTransitionField");
- sb.append("{externalKey='").append(externalKey).append('\'');
+ sb.append("{accountKey='").append(accountKey).append('\'');
+ sb.append(", bundleId='").append(bundleId).append('\'');
+ sb.append(", externalKey='").append(externalKey).append('\'');
sb.append(", name='").append(getName()).append('\'');
sb.append(", value='").append(getValue()).append('\'');
sb.append('}');
@@ -50,6 +67,12 @@ public class BusinessSubscriptionTransitionField extends BusinessField {
final BusinessSubscriptionTransitionField that = (BusinessSubscriptionTransitionField) o;
+ if (accountKey != null ? !accountKey.equals(that.accountKey) : that.accountKey != null) {
+ return false;
+ }
+ if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
+ return false;
+ }
if (externalKey != null ? !externalKey.equals(that.externalKey) : that.externalKey != null) {
return false;
}
@@ -65,7 +88,9 @@ public class BusinessSubscriptionTransitionField extends BusinessField {
@Override
public int hashCode() {
- int result = externalKey != null ? externalKey.hashCode() : 0;
+ int result = accountKey != null ? accountKey.hashCode() : 0;
+ result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0);
+ result = 31 * result + (externalKey != null ? externalKey.hashCode() : 0);
result = 31 * result + (getName() != null ? getName().hashCode() : 0);
result = 31 * result + (getValue() != null ? getValue().hashCode() : 0);
return result;
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionTag.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionTag.java
index eefa65c..e2b6e33 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionTag.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransitionTag.java
@@ -16,14 +16,28 @@
package com.ning.billing.analytics.model;
+import java.util.UUID;
+
public class BusinessSubscriptionTransitionTag extends BusinessTag {
+ private final String accountKey;
+ private final UUID bundleId;
private final String externalKey;
- public BusinessSubscriptionTransitionTag(final String externalKey, final String name) {
+ public BusinessSubscriptionTransitionTag(final String accountKey, final UUID bundleId, final String externalKey, final String name) {
super(name);
+ this.accountKey = accountKey;
+ this.bundleId = bundleId;
this.externalKey = externalKey;
}
+ public String getAccountKey() {
+ return accountKey;
+ }
+
+ public UUID getBundleId() {
+ return bundleId;
+ }
+
public String getExternalKey() {
return externalKey;
}
@@ -32,7 +46,9 @@ public class BusinessSubscriptionTransitionTag extends BusinessTag {
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("BusinessSubscriptionTransitionTag");
- sb.append("{externalKey='").append(externalKey).append('\'');
+ sb.append("{accountKey='").append(accountKey).append('\'');
+ sb.append(", bundleId='").append(bundleId).append('\'');
+ sb.append(", externalKey='").append(externalKey).append('\'');
sb.append(", name='").append(getName()).append('\'');
sb.append('}');
return sb.toString();
@@ -49,6 +65,12 @@ public class BusinessSubscriptionTransitionTag extends BusinessTag {
final BusinessSubscriptionTransitionTag that = (BusinessSubscriptionTransitionTag) o;
+ if (accountKey != null ? !accountKey.equals(that.accountKey) : that.accountKey != null) {
+ return false;
+ }
+ if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
+ return false;
+ }
if (externalKey != null ? !externalKey.equals(that.externalKey) : that.externalKey != null) {
return false;
}
@@ -61,7 +83,9 @@ public class BusinessSubscriptionTransitionTag extends BusinessTag {
@Override
public int hashCode() {
- int result = externalKey != null ? externalKey.hashCode() : 0;
+ int result = accountKey != null ? accountKey.hashCode() : 0;
+ result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0);
+ result = 31 * result + (externalKey != null ? externalKey.hashCode() : 0);
result = 31 * result + (getName() != null ? getName().hashCode() : 0);
return result;
}
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountFieldSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountFieldSqlDao.sql.stg
index 8bb9e0b..43b90ab 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountFieldSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountFieldSqlDao.sql.stg
@@ -2,7 +2,8 @@ group BusinessAccountField;
getFieldsForAccount(account_key) ::=<<
select
- account_key
+ account_id
+, account_key
, name
, value
from bac_fields
@@ -10,22 +11,24 @@ where account_key = :account_key
;
>>
-addField(account_key, name, value) ::=<<
+addField(account_id, account_key, name, value) ::=<<
insert into bac_fields (
- account_key
+ account_id
+, account_key
, name
, value
) values (
- :account_key
+ :account_id
+, :account_key
, :name
, :value
);
>>
-removeField(account_key, name) ::= <<
-delete from bac_fields where account_key = :account_key and name = :name;
+removeField(account_id, name) ::= <<
+delete from bac_fields where account_id = :account_id and name = :name;
>>
test() ::= <<
select 1 from bac_fields;
->>
\ No newline at end of file
+>>
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountSqlDao.sql.stg
index e4cfa8d..66052ec 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountSqlDao.sql.stg
@@ -1,8 +1,29 @@
group BusinessAccount;
-getAccount(account_key) ::= <<
+getAccount(account_id) ::= <<
select
- account_key
+ account_id
+ , account_key
+ , created_date
+ , updated_date
+ , balance
+ , name
+ , last_invoice_date
+ , total_invoice_balance
+ , last_payment_status
+ , payment_method
+ , credit_card_type
+ , billing_address_country
+ from bac
+ where account_id=:account_id
+ limit 1
+ ;
+>>
+
+getAccountByKey(account_key) ::= <<
+ select
+ account_id
+ , account_key
, created_date
, updated_date
, balance
@@ -21,7 +42,8 @@ getAccount(account_key) ::= <<
createAccount() ::= <<
insert into bac(
- account_key
+ account_id
+ , account_key
, created_date
, updated_date
, balance
@@ -33,7 +55,8 @@ createAccount() ::= <<
, credit_card_type
, billing_address_country
) values (
- :account_key
+ :account_id
+ , :account_key
, :created_date
, :updated_date
, :balance
@@ -58,7 +81,7 @@ saveAccount() ::= <<
, payment_method=:payment_method
, credit_card_type=:credit_card_type
, billing_address_country=:billing_address_country
- where account_key=:account_key
+ where account_id=:account_id
;
>>
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountTagSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountTagSqlDao.sql.stg
index af34473..1b4762c 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountTagSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountTagSqlDao.sql.stg
@@ -2,27 +2,30 @@ group BusinessAccountTag;
getTagsForAccount(account_key) ::=<<
select
- account_key
+ account_id
+, account_key
, name
from bac_tags
where account_key = :account_key
;
>>
-addTag(account_key, name) ::=<<
+addTag(account_id, account_key, name) ::=<<
insert into bac_tags (
- account_key
+ account_id
+, account_key
, name
) values (
- :account_key
+ :account_id
+, :account_key
, :name
);
>>
-removeTag(account_key, name) ::= <<
-delete from bac_tags where account_key = :account_key and name = :name;
+removeTag(account_id, name) ::= <<
+delete from bac_tags where account_id = :account_id and name = :name;
>>
test() ::= <<
select 1 from bac_tags;
->>
\ No newline at end of file
+>>
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceSqlDao.sql.stg
index 83d3ffc..fed7d20 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceSqlDao.sql.stg
@@ -3,8 +3,10 @@ group BusinessInvoice;
getInvoice(invoice_id) ::= <<
select
invoice_id
+, invoice_number
, created_date
, updated_date
+, account_id
, account_key
, invoice_date
, target_date
@@ -19,11 +21,34 @@ limit 1
;
>>
-getInvoicesForAccount(account_key) ::= <<
+getInvoicesForAccount(account_id) ::= <<
select
invoice_id
+, invoice_number
, created_date
, updated_date
+, account_id
+, account_key
+, invoice_date
+, target_date
+, currency
+, balance
+, amount_paid
+, amount_charged
+, amount_credited
+from bin
+where account_id = :account_id
+order by created_date asc
+;
+>>
+
+getInvoicesForAccountByKey(account_key) ::= <<
+select
+ invoice_id
+, invoice_number
+, created_date
+, updated_date
+, account_id
, account_key
, invoice_date
, target_date
@@ -41,8 +66,10 @@ order by created_date asc
createInvoice() ::= <<
insert into bin (
invoice_id
+, invoice_number
, created_date
, updated_date
+, account_id
, account_key
, invoice_date
, target_date
@@ -53,8 +80,10 @@ insert into bin (
, amount_credited
) values (
:invoice_id
+, :invoice_number
, :created_date
, :updated_date
+, :account_id
, :account_key
, :invoice_date
, :target_date
@@ -69,6 +98,7 @@ insert into bin (
updateInvoice() ::= <<
update bin set
updated_date = :updated_date
+, invoice_number = :invoice_number
, account_key = :account_key
, invoice_date = :invoice_date
, target_date = :target_date
@@ -85,6 +115,10 @@ deleteInvoice(invoice_id) ::= <<
delete from bin where invoice_id = :invoice_id;
>>
+deleteInvoicesForAccount(account_id) ::= <<
+delete from bin where account_id = :account_id;
+>>
+
test() ::= <<
select 1 from bin;
->>
\ No newline at end of file
+>>
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessOverdueStatusSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessOverdueStatusSqlDao.sql.stg
index d412125..a785959 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessOverdueStatusSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessOverdueStatusSqlDao.sql.stg
@@ -2,7 +2,9 @@ group BusinessOverdueStatus;
getOverdueStatusesForBundle(external_key) ::= <<
select
- external_key
+ bundle_id
+, external_key
+, account_key
, status
, start_date
, end_date
@@ -14,12 +16,16 @@ order by start_date asc
createOverdueStatus() ::= <<
insert into bos (
- external_key
+ bundle_id
+, external_key
+, account_key
, status
, start_date
, end_date
) values (
- :external_key
+ :bundle_id
+, :external_key
+, :account_key
, :status
, :start_date
, :end_date
@@ -28,4 +34,4 @@ insert into bos (
test() ::= <<
select 1 from bos;
->>
\ No newline at end of file
+>>
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.sql.stg
index 522e6d7..a9e9a2b 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionFieldSqlDao.sql.stg
@@ -2,7 +2,9 @@ group BusinessSubscriptionTransitionField;
getFieldsForBusinessSubscriptionTransition(external_key) ::=<<
select
- external_key
+ bundle_id
+, external_key
+, account_key
, name
, value
from bst_fields
@@ -10,22 +12,26 @@ where external_key = :external_key
;
>>
-addField(external_key, name, value) ::=<<
+addField(bundle_id, external_key, name, value) ::=<<
insert into bst_fields (
- external_key
+ bundle_id
+, external_key
+, account_key
, name
, value
) values (
- :external_key
+ :bundle_id
+, :external_key
+, :account_key
, :name
, :value
);
>>
-removeField(external_key, name) ::= <<
-delete from bst_fields where external_key = :external_key and name = :name;
+removeField(bundle_id, name) ::= <<
+delete from bst_fields where bundle_id = :bundle_id and name = :name;
>>
test() ::= <<
select 1 from bst_fields;
->>
\ No newline at end of file
+>>
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg
index 7192e5f..58d04f4 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg
@@ -3,8 +3,11 @@ group BusinessSubscriptionTransition;
getTransitions(external_key) ::= <<
select
total_ordering
+ , bundle_id
, external_key
+ , account_id
, account_key
+ , subscription_id
, requested_timestamp
, event
, prev_product_name
@@ -19,8 +22,6 @@ getTransitions(external_key) ::= <<
, prev_currency
, prev_start_date
, prev_state
- , prev_subscription_id
- , prev_bundle_id
, next_product_name
, next_product_type
, next_product_category
@@ -33,8 +34,6 @@ getTransitions(external_key) ::= <<
, next_currency
, next_start_date
, next_state
- , next_subscription_id
- , next_bundle_id
from bst
where external_key=:external_key
order by requested_timestamp asc
@@ -44,8 +43,11 @@ getTransitions(external_key) ::= <<
getTransitionForSubscription(subscription_id) ::= <<
select
total_ordering
+ , bundle_id
, external_key
+ , account_id
, account_key
+ , subscription_id
, requested_timestamp
, event
, prev_product_name
@@ -60,8 +62,6 @@ getTransitionForSubscription(subscription_id) ::= <<
, prev_currency
, prev_start_date
, prev_state
- , prev_subscription_id
- , prev_bundle_id
, next_product_name
, next_product_type
, next_product_category
@@ -74,19 +74,20 @@ getTransitionForSubscription(subscription_id) ::= <<
, next_currency
, next_start_date
, next_state
- , next_subscription_id
- , next_bundle_id
from bst
- where prev_subscription_id = :subscription_id or next_subscription_id = :subscription_id
+ where subscription_id = :subscription_id
order by requested_timestamp asc
;
>>
createTransition() ::= <<
- insert ignore into bst(
+ insert into bst(
total_ordering
+ , bundle_id
, external_key
+ , account_id
, account_key
+ , subscription_id
, requested_timestamp
, event
, prev_product_name
@@ -101,8 +102,6 @@ createTransition() ::= <<
, prev_currency
, prev_start_date
, prev_state
- , prev_subscription_id
- , prev_bundle_id
, next_product_name
, next_product_type
, next_product_category
@@ -115,12 +114,13 @@ createTransition() ::= <<
, next_currency
, next_start_date
, next_state
- , next_subscription_id
- , next_bundle_id
) values (
:total_ordering
+ , :bundle_id
, :external_key
+ , :account_id
, :account_key
+ , :subscription_id
, :requested_timestamp
, :event
, :prev_product_name
@@ -135,8 +135,6 @@ createTransition() ::= <<
, :prev_currency
, :prev_start_date
, :prev_state
- , :prev_subscription_id
- , :prev_bundle_id
, :next_product_name
, :next_product_type
, :next_product_category
@@ -149,52 +147,12 @@ createTransition() ::= <<
, :next_currency
, :next_start_date
, :next_state
- , :next_subscription_id
- , :next_bundle_id
);
>>
-updateTransition() ::= <<
- update bst set
- total_ordering = :total_ordering
- , external_key = :external_key
- , account_key = :account_key
- , requested_timestamp = :requested_timestamp
- , event = :event
- , prev_product_name = :prev_product_name
- , prev_product_type = :prev_product_type
- , prev_product_category = :prev_product_category
- , prev_slug = :prev_slug
- , prev_phase = :prev_phase
- , prev_billing_period = :prev_billing_period
- , prev_price = :prev_price
- , prev_price_list = :prev_price_list
- , prev_mrr = :prev_mrr
- , prev_currency = :prev_currency
- , prev_start_date = :prev_start_date
- , prev_state = :prev_state
- , prev_subscription_id = :prev_subscription_id
- , prev_bundle_id = :prev_bundle_id
- , next_product_name = :next_product_name
- , next_product_type = :next_product_type
- , next_product_category = :next_product_category
- , next_slug = :next_slug
- , next_phase = :next_phase
- , next_billing_period = :next_billing_period
- , next_price = :next_price
- , next_price_list = :next_price_list
- , next_mrr = :next_mrr
- , next_currency = :next_currency
- , next_start_date = :next_start_date
- , next_state = :next_state
- , next_subscription_id = :next_subscription_id
- , next_bundle_id = :next_bundle_id
- where total_ordering = :total_ordering
->>
-
-deleteTransitionsForBundle(external_key) ::= <<
+deleteTransitionsForBundle(bundle_id) ::= <<
delete from bst
- where external_key=:external_key
+ where bundle_id=:bundle_id
;
>>
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.sql.stg
index 3d2255f..c33c98e 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionTagSqlDao.sql.stg
@@ -2,27 +2,33 @@ group BusinessSubscriptionTransitionTag;
getTagsForBusinessSubscriptionTransition(external_key) ::=<<
select
- external_key
+ bundle_id
+, external_key
+, account_key
, name
from bst_tags
where external_key = :external_key
;
>>
-addTag(external_key, name) ::=<<
+addTag(bundle_id, external_key, name) ::=<<
insert into bst_tags (
- external_key
+ bundle_id
+, external_key
+, account_key
, name
) values (
- :external_key
+ :bundle_id
+, :external_key
+, :account_key
, :name
);
>>
-removeTag(external_key, name) ::= <<
-delete from bst_tags where external_key = :external_key and name = :name;
+removeTag(bundle_id, name) ::= <<
+delete from bst_tags where bundle_id = :bundle_id and name = :name;
>>
test() ::= <<
select 1 from bst_tags;
->>
\ No newline at end of file
+>>
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
index 366570c..09d0a0c 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
+++ b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
@@ -2,8 +2,11 @@ drop table if exists bst;
create table bst (
record_id int(11) unsigned not null auto_increment
, total_ordering bigint default 0
+, bundle_id char(36) not null
+, account_id char(36) not null
, external_key varchar(50) not null comment 'Bundle external key'
, account_key varchar(50) not null comment 'Account external key'
+, subscription_id char(36) not null
, requested_timestamp bigint not null
, event varchar(50) not null
, prev_product_name varchar(32) default null
@@ -18,8 +21,6 @@ create table bst (
, prev_currency varchar(32) default null
, prev_start_date bigint default null
, prev_state varchar(32) default null
-, prev_subscription_id varchar(100) default null
-, prev_bundle_id varchar(100) default null
, next_product_name varchar(32) default null
, next_product_type varchar(32) default null
, next_product_category varchar(32) default null
@@ -32,15 +33,15 @@ create table bst (
, next_currency varchar(32) default null
, next_start_date bigint default null
, next_state varchar(32) default null
-, next_subscription_id varchar(100) default null
-, next_bundle_id varchar(100) default null
, primary key(record_id)
) engine=innodb comment 'Business Subscription Transitions, track bundles lifecycle';
create index bst_key_index on bst (external_key, requested_timestamp asc);
drop table if exists bac;
create table bac (
- account_key varchar(50) not null
+ record_id int(11) unsigned not null auto_increment
+, account_id char(36) not null
+, account_key varchar(50) not null
, name varchar(100) not null
, created_date bigint not null
, updated_date bigint not null
@@ -52,14 +53,18 @@ create table bac (
, credit_card_type varchar(32) default null
, billing_address_country varchar(100) default null
, currency char(3) default null
+, primary key(record_id)
) engine=innodb comment 'Business ACcounts, keep a record of all accounts';
create unique index bac_key_index on bac (account_key);
drop table if exists bin;
create table bin (
- invoice_id char(36) not null
+ record_id int(11) unsigned not null auto_increment
+, invoice_id char(36) not null
+, invoice_number bigint default null
, created_date bigint not null
, updated_date bigint not null
+, account_id char(36) not null
, account_key varchar(50) not null
, invoice_date bigint not null
, target_date bigint not null
@@ -68,12 +73,14 @@ create table bin (
, amount_paid numeric(10, 4) default 0 comment 'Sums of the successful payments made for this invoice minus the refunds associated with this invoice'
, amount_charged numeric(10, 4) default 0 comment 'Sums of the invoice items amount'
, amount_credited numeric(10, 4) default 0 comment 'Sums of the credit items'
+, primary key(record_id)
) engine=innodb comment 'Business INvoices, keep a record of generated invoices';
create unique index bin_key_index on bin (invoice_id);
drop table if exists bii;
create table bii (
- item_id char(36) not null
+ record_id int(11) unsigned not null auto_increment
+, item_id char(36) not null
, created_date bigint not null
, updated_date bigint not null
, invoice_id char(36) not null
@@ -89,12 +96,14 @@ create table bii (
, end_date bigint default null
, amount numeric(10, 4) default 0
, currency char(3) default null
+, primary key(record_id)
) engine=innodb comment 'Business Invoice Items, keep a record of all invoice items';
create unique index bii_key_index on bii (item_id);
drop table if exists bip;
create table bip (
- payment_id char(36) not null
+ record_id int(11) unsigned not null auto_increment
+, payment_id char(36) not null
, created_date bigint not null
, updated_date bigint not null
, attempt_id char(36) not null
@@ -111,66 +120,93 @@ create table bip (
, payment_method varchar(20) default null
, card_type varchar(20) default null
, card_country varchar(20) default null
+, primary key(record_id)
) engine=innodb comment 'Business Invoice Payments, track all payment attempts';
create unique index bip_key_index on bip (attempt_id);
drop table if exists bos;
create table bos (
- external_key varchar(50) not null comment 'Bundle external key'
+ record_id int(11) unsigned not null auto_increment
+, bundle_id char(36) not null
+, external_key varchar(50) not null comment 'Bundle external key'
+, account_key varchar(50) not null comment 'Account external key'
, status varchar(50) not null
, start_date bigint default null
, end_date bigint default null
+, primary key(record_id)
) engine=innodb comment 'Business Overdue Status, historical bundles overdue status';
create unique index bos_key_index on bos (external_key, status);
drop table if exists bac_tags;
create table bac_tags (
- account_key varchar(50) not null comment 'Account external key'
+ record_id int(11) unsigned not null auto_increment
+, account_id char(36) not null
+, account_key varchar(50) not null comment 'Account external key'
, name varchar(20) not null
+, primary key(record_id)
) engine=innodb comment 'Tags associated to accounts';
drop table if exists bac_fields;
create table bac_fields (
- account_key varchar(50) not null comment 'Account external key'
+ record_id int(11) unsigned not null auto_increment
+, account_id char(36) not null
+, account_key varchar(50) not null comment 'Account external key'
, name varchar(30) not null
, value varchar(255) default null
+, primary key(record_id)
) engine=innodb comment 'Custom fields associated to accounts';
drop table if exists bst_tags;
create table bst_tags (
- external_key varchar(50) not null comment 'Bundle external key'
+ record_id int(11) unsigned not null auto_increment
+, bundle_id char(36) not null
+, external_key varchar(50) not null comment 'Bundle external key'
+, account_key varchar(50) not null comment 'Account external key'
, name varchar(20) not null
+, primary key(record_id)
) engine=innodb comment 'Tags associated to bundles';
drop table if exists bst_fields;
create table bst_fields (
- external_key varchar(50) not null comment 'Bundle external key'
+ record_id int(11) unsigned not null auto_increment
+, bundle_id char(36) not null
+, external_key varchar(50) not null comment 'Bundle external key'
+, account_key varchar(50) not null comment 'Account external key'
, name varchar(30) not null
, value varchar(255) default null
+, primary key(record_id)
) engine=innodb comment 'Custom fields associated to bundles';
drop table if exists bin_tags;
create table bin_tags (
- invoice_id char(36) not null
+ record_id int(11) unsigned not null auto_increment
+, invoice_id char(36) not null
, name varchar(20) not null
+, primary key(record_id)
) engine=innodb comment 'Tags associated to invoices';
drop table if exists bin_fields;
create table bin_fields (
- invoice_id char(36) not null
+ record_id int(11) unsigned not null auto_increment
+, invoice_id char(36) not null
, name varchar(30) not null
, value varchar(255) default null
+, primary key(record_id)
) engine=innodb comment 'Custom fields associated to invoices';
drop table if exists bip_tags;
create table bip_tags (
- payment_id char(36) not null
+ record_id int(11) unsigned not null auto_increment
+, payment_id char(36) not null
, name varchar(20) not null
+, primary key(record_id)
) engine=innodb comment 'Tags associated to payments';
drop table if exists bip_fields;
create table bip_fields (
- payment_id char(36) not null
+ record_id int(11) unsigned not null auto_increment
+, payment_id char(36) not null
, name varchar(30) not null
, value varchar(255) default null
+, primary key(record_id)
) engine=innodb comment 'Custom fields associated to payments';
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index d906f1c..2df1254 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -95,6 +95,7 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
private static final Long TOTAL_ORDERING = 11L;
private static final String EXTERNAL_KEY = "12345";
+ private static final UUID ACCOUNT_ID = UUID.randomUUID();
private static final String ACCOUNT_KEY = "pierre-12345";
private static final Currency ACCOUNT_CURRENCY = Currency.EUR;
private static final BigDecimal INVOICE_AMOUNT = BigDecimal.valueOf(1243.11);
@@ -201,12 +202,15 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
true), null);
expectedTransition = new BusinessSubscriptionTransition(
TOTAL_ORDERING,
+ transition.getBundleId(),
EXTERNAL_KEY,
+ ACCOUNT_ID,
ACCOUNT_KEY,
+ transition.getSubscriptionId(),
requestedTransitionTime,
BusinessSubscriptionEvent.subscriptionCreated(plan.getName(), catalog, new DateTime(), new DateTime()),
null,
- new BusinessSubscription(priceList.getName(), plan.getName(), phase.getName(), ACCOUNT_CURRENCY, effectiveTransitionTime, Subscription.SubscriptionState.ACTIVE, subscriptionId, bundle.getId(), catalog)
+ new BusinessSubscription(priceList.getName(), plan.getName(), phase.getName(), ACCOUNT_CURRENCY, effectiveTransitionTime, Subscription.SubscriptionState.ACTIVE, catalog)
);
}
@@ -256,7 +260,7 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
Assert.fail("Unable to start the bus or service! " + t);
}
- Assert.assertNull(accountSqlDao.getAccount(ACCOUNT_KEY));
+ Assert.assertNull(accountSqlDao.getAccountByKey(ACCOUNT_KEY));
// Send events and wait for the async part...
bus.post(transition);
@@ -267,12 +271,12 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
Assert.assertEquals(subscriptionSqlDao.getTransitions(EXTERNAL_KEY).get(0), expectedTransition);
// Test invoice integration - the account creation notification has triggered a BAC update
- Assert.assertTrue(accountSqlDao.getAccount(ACCOUNT_KEY).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT) == 0);
+ Assert.assertTrue(accountSqlDao.getAccountByKey(ACCOUNT_KEY).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT) == 0);
// Post the same invoice event again - the invoice balance shouldn't change
bus.post(invoiceCreationNotification);
Thread.sleep(5000);
- Assert.assertTrue(accountSqlDao.getAccount(ACCOUNT_KEY).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT) == 0);
+ Assert.assertTrue(accountSqlDao.getAccountByKey(ACCOUNT_KEY).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT) == 0);
// Test payment integration - the fields have already been populated, just make sure the code is exercised
bus.post(paymentInfoNotification);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
index a953ed2..c03f999 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
@@ -30,14 +30,14 @@ import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
-import com.ning.billing.analytics.model.BusinessAccount;
-import com.ning.billing.analytics.model.BusinessSubscription;
-import com.ning.billing.analytics.model.BusinessSubscriptionEvent;
-import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
import com.ning.billing.analytics.MockDuration;
import com.ning.billing.analytics.MockPhase;
import com.ning.billing.analytics.MockProduct;
import com.ning.billing.analytics.TestWithEmbeddedDB;
+import com.ning.billing.analytics.model.BusinessAccount;
+import com.ning.billing.analytics.model.BusinessSubscription;
+import com.ning.billing.analytics.model.BusinessSubscriptionEvent;
+import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
import com.ning.billing.analytics.utils.Rounder;
import com.ning.billing.catalog.api.Catalog;
import com.ning.billing.catalog.api.CatalogApiException;
@@ -53,7 +53,9 @@ import com.ning.billing.mock.MockPlan;
public class TestAnalyticsDao extends TestWithEmbeddedDB {
private static final Long TOTAL_ORDERING = 1L;
+ private static final UUID BUNDLE_ID = UUID.randomUUID();
private static final String EXTERNAL_KEY = "23456";
+ private static final UUID ACCOUNT_ID = UUID.randomUUID();
private static final String ACCOUNT_KEY = "pierre-143343-vcc";
private final Product product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
@@ -81,11 +83,12 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
private void setupBusinessSubscriptionTransition() {
final DateTime requestedTimestamp = new DateTime(DateTimeZone.UTC);
- final BusinessSubscription prevSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.ACTIVE, UUID.randomUUID(), UUID.randomUUID(), catalog);
- final BusinessSubscription nextSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.CANCELLED, UUID.randomUUID(), UUID.randomUUID(), catalog);
+ final BusinessSubscription prevSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.ACTIVE, catalog);
+ final BusinessSubscription nextSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.CANCELLED, catalog);
final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(plan.getName(), catalog, requestedTimestamp, requestedTimestamp);
- transition = new BusinessSubscriptionTransition(TOTAL_ORDERING, EXTERNAL_KEY, ACCOUNT_KEY, requestedTimestamp, event, prevSubscription, nextSubscription);
+ transition = new BusinessSubscriptionTransition(TOTAL_ORDERING, BUNDLE_ID, EXTERNAL_KEY, ACCOUNT_ID, ACCOUNT_KEY,
+ UUID.randomUUID(), requestedTimestamp, event, prevSubscription, nextSubscription);
final IDBI dbi = helper.getDBI();
businessSubscriptionTransitionSqlDao = dbi.onDemand(BusinessSubscriptionTransitionSqlDao.class);
@@ -99,7 +102,7 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
}
private void setupBusinessAccount() {
- account = new BusinessAccount(ACCOUNT_KEY, UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(DateTimeZone.UTC), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE");
+ account = new BusinessAccount(UUID.randomUUID(), ACCOUNT_KEY, UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(DateTimeZone.UTC), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE");
final IDBI dbi = helper.getDBI();
businessAccountSqlDao = dbi.onDemand(BusinessAccountSqlDao.class);
@@ -116,8 +119,11 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
public void testTransitionsWithNullPrevSubscription() {
final BusinessSubscriptionTransition transitionWithNullPrev = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
null,
@@ -134,8 +140,11 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
public void testTransitionsWithNullNextSubscription() {
final BusinessSubscriptionTransition transitionWithNullNext = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
transition.getPreviousSubscription(),
@@ -150,11 +159,14 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testTransitionsWithNullFieldsInSubscription() {
- final BusinessSubscription subscriptionWithNullFields = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription subscriptionWithNullFields = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, null, null, catalog);
final BusinessSubscriptionTransition transitionWithNullFields = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
subscriptionWithNullFields,
@@ -169,11 +181,14 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testTransitionsWithNullPlanAndPhase() throws Exception {
- final BusinessSubscription subscriptionWithNullPlanAndPhase = new BusinessSubscription(null, null, null, Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription subscriptionWithNullPlanAndPhase = new BusinessSubscription(null, null, null, Currency.USD, null, null, catalog);
final BusinessSubscriptionTransition transitionWithNullPlanAndPhase = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
subscriptionWithNullPlanAndPhase,
@@ -192,11 +207,14 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testTransitionsWithNullPlan() throws Exception {
- final BusinessSubscription subscriptionWithNullPlan = new BusinessSubscription(null, null, phase.getName(), Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription subscriptionWithNullPlan = new BusinessSubscription(null, null, phase.getName(), Currency.USD, null, null, catalog);
final BusinessSubscriptionTransition transitionWithNullPlan = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
subscriptionWithNullPlan,
@@ -212,11 +230,14 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testTransitionsWithNullPhase() throws Exception {
- final BusinessSubscription subscriptionWithNullPhase = new BusinessSubscription(null, plan.getName(), null, Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription subscriptionWithNullPhase = new BusinessSubscription(null, plan.getName(), null, Currency.USD, null, null, catalog);
final BusinessSubscriptionTransition transitionWithNullPhase = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
subscriptionWithNullPhase,
@@ -231,7 +252,7 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
Assert.assertEquals(transitions.get(0).getEvent(), transition.getEvent());
// Null Phase but Plan - we don't turn the subscription into a null, however price and mrr are both set to 0 (not null)
- final BusinessSubscription blankSubscription = new BusinessSubscription(null, plan.getName(), new MockPhase(null, null, null, 0.0).getName(), Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription blankSubscription = new BusinessSubscription(null, plan.getName(), new MockPhase(null, null, null, 0.0).getName(), Currency.USD, null, null, catalog);
Assert.assertEquals(transitions.get(0).getPreviousSubscription(), blankSubscription);
Assert.assertEquals(transitions.get(0).getNextSubscription(), blankSubscription);
}
@@ -251,7 +272,7 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
public void testCreateSaveAndRetrieveAccounts() {
// Create and retrieve an account
businessAccountSqlDao.createAccount(account);
- final BusinessAccount foundAccount = businessAccountSqlDao.getAccount(ACCOUNT_KEY);
+ final BusinessAccount foundAccount = businessAccountSqlDao.getAccountByKey(ACCOUNT_KEY);
Assert.assertNotNull(foundAccount.getCreatedDt());
Assert.assertEquals(foundAccount.getCreatedDt(), foundAccount.getUpdatedDt());
// Verify the dates by backfilling them
@@ -265,12 +286,12 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
account.setPaymentMethod("PayPal");
businessAccountSqlDao.saveAccount(account);
// Verify the save worked as expected
- account = businessAccountSqlDao.getAccount(ACCOUNT_KEY);
+ account = businessAccountSqlDao.getAccountByKey(ACCOUNT_KEY);
Assert.assertEquals(Rounder.round(BigDecimal.TEN), account.getRoundedBalance());
Assert.assertEquals("PayPal", account.getPaymentMethod());
Assert.assertTrue(account.getUpdatedDt().compareTo(previousUpdatedDt) > 0);
// ACCOUNT not found
- Assert.assertNull(businessAccountSqlDao.getAccount("Doesn't exist"));
+ Assert.assertNull(businessAccountSqlDao.getAccountByKey("Doesn't exist"));
}
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountFieldSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountFieldSqlDao.java
index 69fed56..2dae790 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountFieldSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountFieldSqlDao.java
@@ -38,46 +38,50 @@ public class TestBusinessAccountFieldSqlDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testCRUD() throws Exception {
+ final UUID accountId = UUID.randomUUID();
final String accountKey = UUID.randomUUID().toString();
final String name = UUID.randomUUID().toString().substring(0, 30);
final String value = UUID.randomUUID().toString();
// Verify initial state
Assert.assertEquals(accountFieldSqlDao.getFieldsForAccount(accountKey).size(), 0);
- Assert.assertEquals(accountFieldSqlDao.removeField(accountKey, name), 0);
+ Assert.assertEquals(accountFieldSqlDao.removeField(accountId.toString(), name), 0);
// Add an entry
- Assert.assertEquals(accountFieldSqlDao.addField(accountKey, name, value), 1);
+ Assert.assertEquals(accountFieldSqlDao.addField(accountId.toString(), accountKey, name, value), 1);
final List<BusinessAccountField> fieldsForAccount = accountFieldSqlDao.getFieldsForAccount(accountKey);
Assert.assertEquals(fieldsForAccount.size(), 1);
// Retrieve it
final BusinessAccountField accountField = fieldsForAccount.get(0);
+ Assert.assertEquals(accountField.getAccountId(), accountId);
Assert.assertEquals(accountField.getAccountKey(), accountKey);
Assert.assertEquals(accountField.getName(), name);
Assert.assertEquals(accountField.getValue(), value);
// Delete it
- Assert.assertEquals(accountFieldSqlDao.removeField(accountKey, name), 1);
+ Assert.assertEquals(accountFieldSqlDao.removeField(accountId.toString(), name), 1);
Assert.assertEquals(accountFieldSqlDao.getFieldsForAccount(accountKey).size(), 0);
}
@Test(groups = "slow")
public void testSegmentation() throws Exception {
+ final UUID accountId1 = UUID.randomUUID();
final String accountKey1 = UUID.randomUUID().toString();
final String name1 = UUID.randomUUID().toString().substring(0, 30);
+ final UUID accountId2 = UUID.randomUUID();
final String accountKey2 = UUID.randomUUID().toString();
final String name2 = UUID.randomUUID().toString().substring(0, 30);
// Add a field to both accounts
- Assert.assertEquals(accountFieldSqlDao.addField(accountKey1, name1, UUID.randomUUID().toString()), 1);
- Assert.assertEquals(accountFieldSqlDao.addField(accountKey2, name2, UUID.randomUUID().toString()), 1);
+ Assert.assertEquals(accountFieldSqlDao.addField(accountId1.toString(), accountKey1, name1, UUID.randomUUID().toString()), 1);
+ Assert.assertEquals(accountFieldSqlDao.addField(accountId2.toString(), accountKey2, name2, UUID.randomUUID().toString()), 1);
Assert.assertEquals(accountFieldSqlDao.getFieldsForAccount(accountKey1).size(), 1);
Assert.assertEquals(accountFieldSqlDao.getFieldsForAccount(accountKey2).size(), 1);
// Remove the field for the first account
- Assert.assertEquals(accountFieldSqlDao.removeField(accountKey1, name1), 1);
+ Assert.assertEquals(accountFieldSqlDao.removeField(accountId1.toString(), name1), 1);
Assert.assertEquals(accountFieldSqlDao.getFieldsForAccount(accountKey1).size(), 0);
Assert.assertEquals(accountFieldSqlDao.getFieldsForAccount(accountKey2).size(), 1);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountTagSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountTagSqlDao.java
index 20ccfc8..8c05270 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountTagSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountTagSqlDao.java
@@ -38,44 +38,48 @@ public class TestBusinessAccountTagSqlDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testCRUD() throws Exception {
+ final UUID accountId = UUID.randomUUID();
final String accountKey = UUID.randomUUID().toString();
final String name = UUID.randomUUID().toString().substring(0, 20);
// Verify initial state
Assert.assertEquals(accountTagSqlDao.getTagsForAccount(accountKey).size(), 0);
- Assert.assertEquals(accountTagSqlDao.removeTag(accountKey, name), 0);
+ Assert.assertEquals(accountTagSqlDao.removeTag(accountId.toString(), name), 0);
// Add an entry
- Assert.assertEquals(accountTagSqlDao.addTag(accountKey, name), 1);
+ Assert.assertEquals(accountTagSqlDao.addTag(accountId.toString(), accountKey, name), 1);
final List<BusinessAccountTag> tagsForAccount = accountTagSqlDao.getTagsForAccount(accountKey);
Assert.assertEquals(tagsForAccount.size(), 1);
// Retrieve it
final BusinessAccountTag accountTag = tagsForAccount.get(0);
+ Assert.assertEquals(accountTag.getAccountId(), accountId);
Assert.assertEquals(accountTag.getAccountKey(), accountKey);
Assert.assertEquals(accountTag.getName(), name);
// Delete it
- Assert.assertEquals(accountTagSqlDao.removeTag(accountKey, name), 1);
+ Assert.assertEquals(accountTagSqlDao.removeTag(accountId.toString(), name), 1);
Assert.assertEquals(accountTagSqlDao.getTagsForAccount(accountKey).size(), 0);
}
@Test(groups = "slow")
public void testSegmentation() throws Exception {
+ final UUID accountId1 = UUID.randomUUID();
final String accountKey1 = UUID.randomUUID().toString();
final String name1 = UUID.randomUUID().toString().substring(0, 20);
+ final UUID accountId2 = UUID.randomUUID();
final String accountKey2 = UUID.randomUUID().toString();
final String name2 = UUID.randomUUID().toString().substring(0, 20);
// Add a tag to both accounts
- Assert.assertEquals(accountTagSqlDao.addTag(accountKey1, name1), 1);
- Assert.assertEquals(accountTagSqlDao.addTag(accountKey2, name2), 1);
+ Assert.assertEquals(accountTagSqlDao.addTag(accountId1.toString(), accountKey1, name1), 1);
+ Assert.assertEquals(accountTagSqlDao.addTag(accountId2.toString(), accountKey2, name2), 1);
Assert.assertEquals(accountTagSqlDao.getTagsForAccount(accountKey1).size(), 1);
Assert.assertEquals(accountTagSqlDao.getTagsForAccount(accountKey2).size(), 1);
// Remove the tag for the first account
- Assert.assertEquals(accountTagSqlDao.removeTag(accountKey1, name1), 1);
+ Assert.assertEquals(accountTagSqlDao.removeTag(accountId1.toString(), name1), 1);
Assert.assertEquals(accountTagSqlDao.getTagsForAccount(accountKey1).size(), 0);
Assert.assertEquals(accountTagSqlDao.getTagsForAccount(accountKey2).size(), 1);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java
index 8373f81..b66e4ad 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java
@@ -42,8 +42,9 @@ public class TestBusinessInvoiceSqlDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testCRUD() throws Exception {
final UUID invoiceId = UUID.randomUUID();
+ final UUID accountId = UUID.randomUUID();
final String accountKey = UUID.randomUUID().toString();
- final BusinessInvoice invoice = createInvoice(invoiceId, accountKey);
+ final BusinessInvoice invoice = createInvoice(accountId, invoiceId, accountKey);
// Verify initial state
Assert.assertNull(invoiceSqlDao.getInvoice(invoice.getInvoiceId().toString()));
@@ -54,43 +55,38 @@ public class TestBusinessInvoiceSqlDao extends TestWithEmbeddedDB {
// Retrieve it
Assert.assertEquals(invoiceSqlDao.getInvoice(invoice.getInvoiceId().toString()), invoice);
- Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(invoice.getAccountKey()).size(), 1);
- Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(invoice.getAccountKey()).get(0), invoice);
-
- // Update and retrieve it
- invoice.setInvoiceDate(new DateTime(DateTimeZone.UTC));
- Assert.assertEquals(invoiceSqlDao.updateInvoice(invoice), 1);
- Assert.assertEquals(invoiceSqlDao.getInvoice(invoice.getInvoiceId().toString()), invoice);
- Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(invoice.getAccountKey()).size(), 1);
- Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(invoice.getAccountKey()).get(0), invoice);
+ Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(invoice.getAccountId().toString()).size(), 1);
+ Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(invoice.getAccountId().toString()).get(0), invoice);
// Delete it
Assert.assertEquals(invoiceSqlDao.deleteInvoice(invoice.getInvoiceId().toString()), 1);
Assert.assertNull(invoiceSqlDao.getInvoice(invoice.getInvoiceId().toString()));
- Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(invoice.getAccountKey()).size(), 0);
+ Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(invoice.getAccountId().toString()).size(), 0);
}
@Test(groups = "slow")
public void testSegmentation() throws Exception {
final UUID invoiceId1 = UUID.randomUUID();
+ final UUID accountId1 = UUID.randomUUID();
final String accountKey1 = UUID.randomUUID().toString();
- final BusinessInvoice invoice1 = createInvoice(invoiceId1, accountKey1);
+ final BusinessInvoice invoice1 = createInvoice(invoiceId1, accountId1, accountKey1);
final UUID invoiceId2 = UUID.randomUUID();
+ final UUID accountId2 = UUID.randomUUID();
final String accountKey2 = UUID.randomUUID().toString();
- final BusinessInvoice invoice2 = createInvoice(invoiceId2, accountKey2);
+ final BusinessInvoice invoice2 = createInvoice(invoiceId2, accountId2, accountKey2);
// Create both invoices
Assert.assertEquals(invoiceSqlDao.createInvoice(invoice1), 1);
Assert.assertEquals(invoiceSqlDao.createInvoice(invoice2), 1);
- Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(accountKey1).size(), 1);
- Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(accountKey2).size(), 1);
+ Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(accountId1.toString()).size(), 1);
+ Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(accountId2.toString()).size(), 1);
// Remove the first invoice
Assert.assertEquals(invoiceSqlDao.deleteInvoice(invoice1.getInvoiceId().toString()), 1);
- Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(accountKey1).size(), 0);
- Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(accountKey2).size(), 1);
+ Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(accountId1.toString()).size(), 0);
+ Assert.assertEquals(invoiceSqlDao.getInvoicesForAccount(accountId2.toString()).size(), 1);
}
@Test(groups = "slow")
@@ -103,7 +99,7 @@ public class TestBusinessInvoiceSqlDao extends TestWithEmbeddedDB {
}
}
- private BusinessInvoice createInvoice(final UUID invoiceId, final String accountKey) {
+ private BusinessInvoice createInvoice(final UUID invoiceId, final UUID accountId, final String accountKey) {
final BigDecimal amountCharged = BigDecimal.ZERO;
final BigDecimal amountCredited = BigDecimal.ONE;
final BigDecimal amountPaid = BigDecimal.TEN;
@@ -114,7 +110,7 @@ public class TestBusinessInvoiceSqlDao extends TestWithEmbeddedDB {
final DateTime targetDate = new DateTime(DateTimeZone.UTC);
final DateTime updatedDate = new DateTime(DateTimeZone.UTC);
- return new BusinessInvoice(accountKey, amountCharged, amountCredited, amountPaid, balance,
- createdDate, currency, invoiceDate, invoiceId, targetDate, updatedDate);
+ return new BusinessInvoice(accountId, accountKey, amountCharged, amountCredited, amountPaid, balance,
+ createdDate, currency, invoiceDate, invoiceId, 12, targetDate, updatedDate);
}
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessOverdueStatusSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessOverdueStatusSqlDao.java
index c16ab3c..7153da2 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessOverdueStatusSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessOverdueStatusSqlDao.java
@@ -39,8 +39,10 @@ public class TestBusinessOverdueStatusSqlDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testCreate() throws Exception {
+ final String accountKey = UUID.randomUUID().toString();
+ final UUID bundleId = UUID.randomUUID();
final String externalKey = UUID.randomUUID().toString();
- final BusinessOverdueStatus firstOverdueStatus = createOverdueStatus(externalKey);
+ final BusinessOverdueStatus firstOverdueStatus = createOverdueStatus(accountKey, bundleId, externalKey);
// Verify initial state
Assert.assertEquals(overdueStatusSqlDao.getOverdueStatusesForBundle(externalKey).size(), 0);
@@ -53,7 +55,7 @@ public class TestBusinessOverdueStatusSqlDao extends TestWithEmbeddedDB {
Assert.assertEquals(overdueStatusSqlDao.getOverdueStatusesForBundle(externalKey).get(0), firstOverdueStatus);
// Add a second one
- final BusinessOverdueStatus secondOverdueStatus = createOverdueStatus(externalKey);
+ final BusinessOverdueStatus secondOverdueStatus = createOverdueStatus(accountKey, bundleId, externalKey);
Assert.assertEquals(overdueStatusSqlDao.createOverdueStatus(secondOverdueStatus), 1);
// Retrieve both
@@ -72,11 +74,11 @@ public class TestBusinessOverdueStatusSqlDao extends TestWithEmbeddedDB {
}
}
- private BusinessOverdueStatus createOverdueStatus(final String externalKey) {
+ private BusinessOverdueStatus createOverdueStatus(final String accountKey, final UUID bundleId, final String externalKey) {
final DateTime endDate = new DateTime(DateTimeZone.UTC);
final DateTime startDate = new DateTime(DateTimeZone.UTC);
final String status = UUID.randomUUID().toString();
- return new BusinessOverdueStatus(endDate, externalKey, startDate, status);
+ return new BusinessOverdueStatus(accountKey, bundleId, endDate, externalKey, startDate, status);
}
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionFieldSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionFieldSqlDao.java
index 5233229..9880ebc 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionFieldSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionFieldSqlDao.java
@@ -38,46 +38,52 @@ public class TestBusinessSubscriptionTransitionFieldSqlDao extends TestWithEmbed
@Test(groups = "slow")
public void testCRUD() throws Exception {
+ final String accountKey = UUID.randomUUID().toString();
+ final UUID bundleId = UUID.randomUUID();
final String externalKey = UUID.randomUUID().toString();
final String name = UUID.randomUUID().toString().substring(0, 30);
final String value = UUID.randomUUID().toString();
// Verify initial state
Assert.assertEquals(subscriptionTransitionFieldSqlDao.getFieldsForBusinessSubscriptionTransition(externalKey).size(), 0);
- Assert.assertEquals(subscriptionTransitionFieldSqlDao.removeField(externalKey, name), 0);
+ Assert.assertEquals(subscriptionTransitionFieldSqlDao.removeField(bundleId.toString(), name), 0);
// Add an entry
- Assert.assertEquals(subscriptionTransitionFieldSqlDao.addField(externalKey, name, value), 1);
+ Assert.assertEquals(subscriptionTransitionFieldSqlDao.addField(accountKey, bundleId.toString(), externalKey, name, value), 1);
final List<BusinessSubscriptionTransitionField> fieldsForBusinessSubscriptionTransition = subscriptionTransitionFieldSqlDao.getFieldsForBusinessSubscriptionTransition(externalKey);
Assert.assertEquals(fieldsForBusinessSubscriptionTransition.size(), 1);
// Retrieve it
final BusinessSubscriptionTransitionField subscriptionTransitionField = fieldsForBusinessSubscriptionTransition.get(0);
+ Assert.assertEquals(subscriptionTransitionField.getBundleId(), bundleId);
Assert.assertEquals(subscriptionTransitionField.getExternalKey(), externalKey);
Assert.assertEquals(subscriptionTransitionField.getName(), name);
Assert.assertEquals(subscriptionTransitionField.getValue(), value);
// Delete it
- Assert.assertEquals(subscriptionTransitionFieldSqlDao.removeField(externalKey, name), 1);
+ Assert.assertEquals(subscriptionTransitionFieldSqlDao.removeField(bundleId.toString(), name), 1);
Assert.assertEquals(subscriptionTransitionFieldSqlDao.getFieldsForBusinessSubscriptionTransition(externalKey).size(), 0);
}
@Test(groups = "slow")
public void testSegmentation() throws Exception {
+ final String accountKey = UUID.randomUUID().toString();
+ final UUID bundleId1 = UUID.randomUUID();
final String externalKey1 = UUID.randomUUID().toString();
final String name1 = UUID.randomUUID().toString().substring(0, 30);
+ final UUID bundleId2 = UUID.randomUUID();
final String externalKey2 = UUID.randomUUID().toString();
final String name2 = UUID.randomUUID().toString().substring(0, 30);
// Add a field to both transitions
- Assert.assertEquals(subscriptionTransitionFieldSqlDao.addField(externalKey1, name1, UUID.randomUUID().toString()), 1);
- Assert.assertEquals(subscriptionTransitionFieldSqlDao.addField(externalKey2, name2, UUID.randomUUID().toString()), 1);
+ Assert.assertEquals(subscriptionTransitionFieldSqlDao.addField(accountKey, bundleId1.toString(), externalKey1, name1, UUID.randomUUID().toString()), 1);
+ Assert.assertEquals(subscriptionTransitionFieldSqlDao.addField(accountKey, bundleId2.toString(), externalKey2, name2, UUID.randomUUID().toString()), 1);
Assert.assertEquals(subscriptionTransitionFieldSqlDao.getFieldsForBusinessSubscriptionTransition(externalKey1).size(), 1);
Assert.assertEquals(subscriptionTransitionFieldSqlDao.getFieldsForBusinessSubscriptionTransition(externalKey2).size(), 1);
// Remove the field for the first transition
- Assert.assertEquals(subscriptionTransitionFieldSqlDao.removeField(externalKey1, name1), 1);
+ Assert.assertEquals(subscriptionTransitionFieldSqlDao.removeField(bundleId1.toString(), name1), 1);
Assert.assertEquals(subscriptionTransitionFieldSqlDao.getFieldsForBusinessSubscriptionTransition(externalKey1).size(), 0);
Assert.assertEquals(subscriptionTransitionFieldSqlDao.getFieldsForBusinessSubscriptionTransition(externalKey2).size(), 1);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionTagSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionTagSqlDao.java
index 8b4740f..bce20fb 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionTagSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionTagSqlDao.java
@@ -38,44 +38,50 @@ public class TestBusinessSubscriptionTransitionTagSqlDao extends TestWithEmbedde
@Test(groups = "slow")
public void testCRUD() throws Exception {
+ final String accountKey = UUID.randomUUID().toString();
+ final UUID bundleId = UUID.randomUUID();
final String externalKey = UUID.randomUUID().toString();
final String name = UUID.randomUUID().toString().substring(0, 20);
// Verify initial state
Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransition(externalKey).size(), 0);
- Assert.assertEquals(subscriptionTransitionTagSqlDao.removeTag(externalKey, name), 0);
+ Assert.assertEquals(subscriptionTransitionTagSqlDao.removeTag(bundleId.toString(), name), 0);
// Add an entry
- Assert.assertEquals(subscriptionTransitionTagSqlDao.addTag(externalKey, name), 1);
+ Assert.assertEquals(subscriptionTransitionTagSqlDao.addTag(accountKey, bundleId.toString(), externalKey, name), 1);
final List<BusinessSubscriptionTransitionTag> tagsForBusinessSubscriptionTransition = subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransition(externalKey);
Assert.assertEquals(tagsForBusinessSubscriptionTransition.size(), 1);
// Retrieve it
final BusinessSubscriptionTransitionTag subscriptionTransitionTag = tagsForBusinessSubscriptionTransition.get(0);
+ Assert.assertEquals(subscriptionTransitionTag.getBundleId(), bundleId);
Assert.assertEquals(subscriptionTransitionTag.getExternalKey(), externalKey);
Assert.assertEquals(subscriptionTransitionTag.getName(), name);
// Delete it
- Assert.assertEquals(subscriptionTransitionTagSqlDao.removeTag(externalKey, name), 1);
+ Assert.assertEquals(subscriptionTransitionTagSqlDao.removeTag(bundleId.toString(), name), 1);
Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransition(externalKey).size(), 0);
}
@Test(groups = "slow")
public void testSegmentation() throws Exception {
+ final String accountKey = UUID.randomUUID().toString();
+ final UUID bundleId1 = UUID.randomUUID();
final String externalKey1 = UUID.randomUUID().toString();
final String name1 = UUID.randomUUID().toString().substring(0, 20);
+ final UUID bundleId2 = UUID.randomUUID();
final String externalKey2 = UUID.randomUUID().toString();
final String name2 = UUID.randomUUID().toString().substring(0, 20);
// Add a tag to both transitions
- Assert.assertEquals(subscriptionTransitionTagSqlDao.addTag(externalKey1, name1), 1);
- Assert.assertEquals(subscriptionTransitionTagSqlDao.addTag(externalKey2, name2), 1);
+ Assert.assertEquals(subscriptionTransitionTagSqlDao.addTag(accountKey, bundleId1.toString(), externalKey1, name1), 1);
+ Assert.assertEquals(subscriptionTransitionTagSqlDao.addTag(accountKey, bundleId2.toString(), externalKey2, name2), 1);
Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransition(externalKey1).size(), 1);
Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransition(externalKey2).size(), 1);
// Remove the tag for the first transition
- Assert.assertEquals(subscriptionTransitionTagSqlDao.removeTag(externalKey1, name1), 1);
+ Assert.assertEquals(subscriptionTransitionTagSqlDao.removeTag(bundleId1.toString(), name1), 1);
Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransition(externalKey1).size(), 0);
Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransition(externalKey2).size(), 1);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
index b54d7ce..d9691f4 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
@@ -32,6 +32,7 @@ import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
public class MockBusinessSubscriptionTransitionSqlDao implements BusinessSubscriptionTransitionSqlDao {
private final Map<String, List<BusinessSubscriptionTransition>> content = new HashMap<String, List<BusinessSubscriptionTransition>>();
+ private final Map<String, String> keyForBundleId = new HashMap<String, String>();
@Override
public List<BusinessSubscriptionTransition> getTransitions(@Bind("event_key") final String key) {
@@ -49,17 +50,13 @@ public class MockBusinessSubscriptionTransitionSqlDao implements BusinessSubscri
content.put(transition.getExternalKey(), new ArrayList<BusinessSubscriptionTransition>());
}
content.get(transition.getExternalKey()).add(transition);
+ keyForBundleId.put(transition.getBundleId().toString(), transition.getExternalKey());
return 1;
}
@Override
- public void updateTransition(@Bind("total_ordering") final long totalOrdering, @BusinessSubscriptionTransitionBinder final BusinessSubscriptionTransition updatedFirstTransition) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void deleteTransitionsForBundle(@Bind("external_key") final String externalKey) {
- content.put(externalKey, new ArrayList<BusinessSubscriptionTransition>());
+ public void deleteTransitionsForBundle(@Bind("bundle_id") final String bundleId) {
+ content.put(keyForBundleId.get(bundleId), new ArrayList<BusinessSubscriptionTransition>());
}
@Override
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
index 1a37ea8..88329f7 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
@@ -25,14 +25,14 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.ning.billing.analytics.AnalyticsTestSuite;
-import com.ning.billing.analytics.model.BusinessAccount;
public class TestBusinessAccount extends AnalyticsTestSuite {
private BusinessAccount account;
@BeforeMethod(groups = "fast")
public void setUp() throws Exception {
- account = new BusinessAccount("pierre", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
+ account = new BusinessAccount(UUID.randomUUID(), "pierre", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(),
+ BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
}
@Test(groups = "fast")
@@ -41,7 +41,8 @@ public class TestBusinessAccount extends AnalyticsTestSuite {
Assert.assertEquals(account, account);
Assert.assertTrue(account.equals(account));
- final BusinessAccount otherAccount = new BusinessAccount("pierre cardin", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
+ final BusinessAccount otherAccount = new BusinessAccount(UUID.randomUUID(), "pierre cardin", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(),
+ BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
Assert.assertFalse(account.equals(otherAccount));
}
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountField.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountField.java
index ebe3c9e..86ce86c 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountField.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountField.java
@@ -26,20 +26,24 @@ import com.ning.billing.analytics.AnalyticsTestSuite;
public class TestBusinessAccountField extends AnalyticsTestSuite {
@Test(groups = "fast")
public void testEquals() throws Exception {
+ final UUID accountId = UUID.randomUUID();
final String accountKey = UUID.randomUUID().toString();
final String name = UUID.randomUUID().toString();
final String value = UUID.randomUUID().toString();
- final BusinessAccountField accountField = new BusinessAccountField(accountKey,
+ final BusinessAccountField accountField = new BusinessAccountField(accountId,
+ accountKey,
name,
value);
Assert.assertSame(accountField, accountField);
Assert.assertEquals(accountField, accountField);
Assert.assertTrue(accountField.equals(accountField));
+ Assert.assertEquals(accountField.getAccountId(), accountId);
Assert.assertEquals(accountField.getAccountKey(), accountKey);
Assert.assertEquals(accountField.getName(), name);
Assert.assertEquals(accountField.getValue(), value);
- final BusinessAccountField otherAccountField = new BusinessAccountField(UUID.randomUUID().toString(),
+ final BusinessAccountField otherAccountField = new BusinessAccountField(UUID.randomUUID(),
+ UUID.randomUUID().toString(),
UUID.randomUUID().toString(),
UUID.randomUUID().toString());
Assert.assertFalse(accountField.equals(otherAccountField));
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountTag.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountTag.java
index 1d9c072..4d0014e 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountTag.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountTag.java
@@ -26,16 +26,18 @@ import com.ning.billing.analytics.AnalyticsTestSuite;
public class TestBusinessAccountTag extends AnalyticsTestSuite {
@Test(groups = "fast")
public void testEquals() throws Exception {
+ final UUID accountId = UUID.randomUUID();
final String accountKey = UUID.randomUUID().toString();
final String name = UUID.randomUUID().toString();
- final BusinessAccountTag accountTag = new BusinessAccountTag(accountKey, name);
+ final BusinessAccountTag accountTag = new BusinessAccountTag(accountId, accountKey, name);
Assert.assertSame(accountTag, accountTag);
Assert.assertEquals(accountTag, accountTag);
Assert.assertTrue(accountTag.equals(accountTag));
+ Assert.assertEquals(accountTag.getAccountId(), accountId);
Assert.assertEquals(accountTag.getAccountKey(), accountKey);
Assert.assertEquals(accountTag.getName(), name);
- final BusinessAccountTag otherAccountTag = new BusinessAccountTag(UUID.randomUUID().toString(), UUID.randomUUID().toString());
+ final BusinessAccountTag otherAccountTag = new BusinessAccountTag(UUID.randomUUID(), UUID.randomUUID().toString(), UUID.randomUUID().toString());
Assert.assertFalse(accountTag.equals(otherAccountTag));
}
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java
index 869284d..9ec77f2 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java
@@ -30,6 +30,7 @@ import com.ning.billing.catalog.api.Currency;
public class TestBusinessInvoice extends AnalyticsTestSuite {
@Test(groups = "fast")
public void testEquals() throws Exception {
+ final UUID accountId = UUID.randomUUID();
final String accountKey = UUID.randomUUID().toString();
final BigDecimal amountCharged = BigDecimal.ZERO;
final BigDecimal amountCredited = BigDecimal.ONE;
@@ -39,13 +40,15 @@ public class TestBusinessInvoice extends AnalyticsTestSuite {
final Currency currency = Currency.MXN;
final DateTime invoiceDate = new DateTime(DateTimeZone.UTC);
final UUID invoiceId = UUID.randomUUID();
+ final Integer invoiceNumber = 15;
final DateTime targetDate = new DateTime(DateTimeZone.UTC);
final DateTime updatedDate = new DateTime(DateTimeZone.UTC);
- final BusinessInvoice invoice = new BusinessInvoice(accountKey, amountCharged, amountCredited, amountPaid, balance,
- createdDate, currency, invoiceDate, invoiceId, targetDate, updatedDate);
+ final BusinessInvoice invoice = new BusinessInvoice(accountId, accountKey, amountCharged, amountCredited, amountPaid, balance,
+ createdDate, currency, invoiceDate, invoiceId, invoiceNumber, targetDate, updatedDate);
Assert.assertSame(invoice, invoice);
Assert.assertEquals(invoice, invoice);
Assert.assertTrue(invoice.equals(invoice));
+ Assert.assertEquals(invoice.getAccountId(), accountId);
Assert.assertEquals(invoice.getAccountKey(), accountKey);
Assert.assertEquals(invoice.getAmountCharged(), amountCharged);
Assert.assertEquals(invoice.getAmountCredited(), amountCredited);
@@ -55,23 +58,12 @@ public class TestBusinessInvoice extends AnalyticsTestSuite {
Assert.assertEquals(invoice.getCurrency(), currency);
Assert.assertEquals(invoice.getInvoiceDate(), invoiceDate);
Assert.assertEquals(invoice.getInvoiceId(), invoiceId);
+ Assert.assertEquals(invoice.getInvoiceNumber(), invoiceNumber);
Assert.assertEquals(invoice.getTargetDate(), targetDate);
Assert.assertEquals(invoice.getUpdatedDate(), updatedDate);
- final BusinessInvoice otherInvoice = new BusinessInvoice(null, null, null, null, null, createdDate, null,
- null, invoiceId, null, null);
+ final BusinessInvoice otherInvoice = new BusinessInvoice(null, null, null, null, null, null, createdDate, null,
+ null, invoiceId, 0, null, null);
Assert.assertFalse(invoice.equals(otherInvoice));
-
- // Test setters
- otherInvoice.setAccountKey(accountKey);
- otherInvoice.setAmountCharged(amountCharged);
- otherInvoice.setAmountCredited(amountCredited);
- otherInvoice.setAmountPaid(amountPaid);
- otherInvoice.setBalance(balance);
- otherInvoice.setCurrency(currency);
- otherInvoice.setInvoiceDate(invoiceDate);
- otherInvoice.setTargetDate(targetDate);
- otherInvoice.setUpdatedDate(updatedDate);
- Assert.assertTrue(invoice.equals(otherInvoice));
}
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessOverdueStatus.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessOverdueStatus.java
index b92ee12..be467e9 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessOverdueStatus.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessOverdueStatus.java
@@ -28,21 +28,29 @@ import com.ning.billing.analytics.AnalyticsTestSuite;
public class TestBusinessOverdueStatus extends AnalyticsTestSuite {
@Test(groups = "fast")
public void testEquals() throws Exception {
+ final String accountKey = UUID.randomUUID().toString();
+ final UUID bundleId = UUID.randomUUID();
final DateTime endDate = new DateTime(DateTimeZone.UTC);
final String externalKey = UUID.randomUUID().toString();
final DateTime startDate = new DateTime(DateTimeZone.UTC);
final String status = UUID.randomUUID().toString();
- final BusinessOverdueStatus overdueStatus = new BusinessOverdueStatus(endDate, externalKey, startDate, status);
+ final BusinessOverdueStatus overdueStatus = new BusinessOverdueStatus(accountKey, bundleId, endDate, externalKey, startDate, status);
Assert.assertSame(overdueStatus, overdueStatus);
Assert.assertEquals(overdueStatus, overdueStatus);
Assert.assertTrue(overdueStatus.equals(overdueStatus));
+ Assert.assertEquals(overdueStatus.getAccountKey(), accountKey);
+ Assert.assertEquals(overdueStatus.getBundleId(), bundleId);
Assert.assertEquals(overdueStatus.getEndDate(), endDate);
Assert.assertEquals(overdueStatus.getExternalKey(), externalKey);
Assert.assertEquals(overdueStatus.getStartDate(), startDate);
Assert.assertEquals(overdueStatus.getStatus(), status);
- final BusinessOverdueStatus otherOverdueStatus = new BusinessOverdueStatus(new DateTime(DateTimeZone.UTC), UUID.randomUUID().toString(),
- new DateTime(DateTimeZone.UTC), UUID.randomUUID().toString());
+ final BusinessOverdueStatus otherOverdueStatus = new BusinessOverdueStatus(UUID.randomUUID().toString(),
+ UUID.randomUUID(),
+ new DateTime(DateTimeZone.UTC),
+ UUID.randomUUID().toString(),
+ new DateTime(DateTimeZone.UTC),
+ UUID.randomUUID().toString());
Assert.assertFalse(overdueStatus.equals(otherOverdueStatus));
}
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java
index 1e10acf..3e237bc 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java
@@ -16,6 +16,8 @@
package com.ning.billing.analytics.model;
+import java.util.UUID;
+
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.mockito.Mockito;
@@ -46,8 +48,11 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
private BusinessSubscriptionEvent event;
private DateTime requestedTimestamp;
private Long totalOrdering;
+ private UUID bundleId;
private String externalKey;
+ private UUID accountId;
private String accountKey;
+ private UUID subscriptionId;
private BusinessSubscriptionTransition transition;
private final CatalogService catalogService = Mockito.mock(CatalogService.class);
@@ -72,9 +77,13 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
event = BusinessSubscriptionEvent.subscriptionCancelled(prevISubscription.getCurrentPlan().getName(), catalog, now, now);
requestedTimestamp = new DateTime(DateTimeZone.UTC);
totalOrdering = 12L;
+ bundleId = UUID.randomUUID();
externalKey = "1234";
+ accountId = UUID.randomUUID();
accountKey = "pierre-1234";
- transition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+ subscriptionId = UUID.randomUUID();
+ transition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, nextSubscription);
}
@Test(groups = "fast")
@@ -93,47 +102,56 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
BusinessSubscriptionTransition otherTransition;
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, new DateTime(), event, prevSubscription, nextSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, new DateTime(), event, prevSubscription, nextSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, "12345", accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, "12345", accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, nextSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, prevSubscription, prevSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, prevSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, nextSubscription, nextSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, nextSubscription, nextSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, nextSubscription, prevSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, nextSubscription, prevSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
}
@Test(groups = "fast")
public void testRejectInvalidTransitions() throws Exception {
try {
- new BusinessSubscriptionTransition(null, externalKey, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+ new BusinessSubscriptionTransition(null, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, nextSubscription);
Assert.fail();
} catch (IllegalArgumentException e) {
Assert.assertTrue(true);
}
try {
- new BusinessSubscriptionTransition(totalOrdering, null, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+ new BusinessSubscriptionTransition(totalOrdering, bundleId, null, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, nextSubscription);
Assert.fail();
} catch (IllegalArgumentException e) {
Assert.assertTrue(true);
}
try {
- new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, null, event, prevSubscription, nextSubscription);
+ new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, null, event, prevSubscription, nextSubscription);
Assert.fail();
} catch (IllegalArgumentException e) {
Assert.assertTrue(true);
}
try {
- new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, null, prevSubscription, nextSubscription);
+ new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, null, prevSubscription, nextSubscription);
Assert.fail();
} catch (IllegalArgumentException e) {
Assert.assertTrue(true);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionField.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionField.java
index 5a1e31b..18a46f3 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionField.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionField.java
@@ -26,20 +26,28 @@ import com.ning.billing.analytics.AnalyticsTestSuite;
public class TestBusinessSubscriptionTransitionField extends AnalyticsTestSuite {
@Test(groups = "fast")
public void testEquals() throws Exception {
+ final String accountKey = UUID.randomUUID().toString();
+ final UUID bundleId = UUID.randomUUID();
final String externalKey = UUID.randomUUID().toString();
final String name = UUID.randomUUID().toString();
final String value = UUID.randomUUID().toString();
- final BusinessSubscriptionTransitionField subscriptionTransitionField = new BusinessSubscriptionTransitionField(externalKey,
+ final BusinessSubscriptionTransitionField subscriptionTransitionField = new BusinessSubscriptionTransitionField(accountKey,
+ bundleId,
+ externalKey,
name,
value);
Assert.assertSame(subscriptionTransitionField, subscriptionTransitionField);
Assert.assertEquals(subscriptionTransitionField, subscriptionTransitionField);
Assert.assertTrue(subscriptionTransitionField.equals(subscriptionTransitionField));
+ Assert.assertEquals(subscriptionTransitionField.getAccountKey(), accountKey);
+ Assert.assertEquals(subscriptionTransitionField.getBundleId(), bundleId);
Assert.assertEquals(subscriptionTransitionField.getExternalKey(), externalKey);
Assert.assertEquals(subscriptionTransitionField.getName(), name);
Assert.assertEquals(subscriptionTransitionField.getValue(), value);
final BusinessSubscriptionTransitionField otherSubscriptionField = new BusinessSubscriptionTransitionField(UUID.randomUUID().toString(),
+ UUID.randomUUID(),
+ UUID.randomUUID().toString(),
UUID.randomUUID().toString(),
UUID.randomUUID().toString());
Assert.assertFalse(subscriptionTransitionField.equals(otherSubscriptionField));
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionTag.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionTag.java
index b5a40d1..66c2da8 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionTag.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionTag.java
@@ -26,16 +26,26 @@ import com.ning.billing.analytics.AnalyticsTestSuite;
public class TestBusinessSubscriptionTransitionTag extends AnalyticsTestSuite {
@Test(groups = "fast")
public void testEquals() throws Exception {
+ final String accountKey = UUID.randomUUID().toString();
+ final UUID bundleId = UUID.randomUUID();
final String externalKey = UUID.randomUUID().toString();
final String name = UUID.randomUUID().toString();
- final BusinessSubscriptionTransitionTag subscriptionTransitionTag = new BusinessSubscriptionTransitionTag(externalKey, name);
+ final BusinessSubscriptionTransitionTag subscriptionTransitionTag = new BusinessSubscriptionTransitionTag(accountKey,
+ bundleId,
+ externalKey,
+ name);
Assert.assertSame(subscriptionTransitionTag, subscriptionTransitionTag);
Assert.assertEquals(subscriptionTransitionTag, subscriptionTransitionTag);
Assert.assertTrue(subscriptionTransitionTag.equals(subscriptionTransitionTag));
+ Assert.assertEquals(subscriptionTransitionTag.getAccountKey(), accountKey);
+ Assert.assertEquals(subscriptionTransitionTag.getBundleId(), bundleId);
Assert.assertEquals(subscriptionTransitionTag.getExternalKey(), externalKey);
Assert.assertEquals(subscriptionTransitionTag.getName(), name);
- final BusinessSubscriptionTransitionTag otherTransitionTag = new BusinessSubscriptionTransitionTag(UUID.randomUUID().toString(), UUID.randomUUID().toString());
+ final BusinessSubscriptionTransitionTag otherTransitionTag = new BusinessSubscriptionTransitionTag(UUID.randomUUID().toString(),
+ UUID.randomUUID(),
+ UUID.randomUUID().toString(),
+ UUID.randomUUID().toString());
Assert.assertFalse(subscriptionTransitionTag.equals(otherTransitionTag));
}
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
index 48cefb4..abc7559 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
@@ -43,6 +43,8 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
public void testCreateAddOn() throws Exception {
final UUID bundleId = UUID.randomUUID();
final UUID externalKey = UUID.randomUUID();
+ final UUID accountId = UUID.randomUUID();
+ final UUID subscriptionId = UUID.randomUUID();
// Setup the catalog
final CatalogService catalogService = Mockito.mock(CatalogService.class);
@@ -54,6 +56,7 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
// Setup the entitlement API
final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
Mockito.when(bundle.getId()).thenReturn(bundleId);
+ Mockito.when(bundle.getAccountId()).thenReturn(accountId);
Mockito.when(bundle.getKey()).thenReturn(externalKey.toString());
final EntitlementUserApi entitlementApi = Mockito.mock(EntitlementUserApi.class);
Mockito.when(entitlementApi.getBundleFromId(Mockito.<UUID>any())).thenReturn(bundle);
@@ -68,13 +71,14 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
final EffectiveSubscriptionEvent eventEffective = Mockito.mock(EffectiveSubscriptionEvent.class);
Mockito.when(eventEffective.getId()).thenReturn(UUID.randomUUID());
Mockito.when(eventEffective.getTransitionType()).thenReturn(SubscriptionTransitionType.CREATE);
- Mockito.when(eventEffective.getSubscriptionId()).thenReturn(UUID.randomUUID());
+ Mockito.when(eventEffective.getSubscriptionId()).thenReturn(subscriptionId);
Mockito.when(eventEffective.getRequestedTransitionTime()).thenReturn(new DateTime(DateTimeZone.UTC));
Mockito.when(eventEffective.getNextPlan()).thenReturn(UUID.randomUUID().toString());
Mockito.when(eventEffective.getEffectiveTransitionTime()).thenReturn(new DateTime(DateTimeZone.UTC));
Mockito.when(eventEffective.getSubscriptionStartDate()).thenReturn(new DateTime(DateTimeZone.UTC));
final Subscription subscription = Mockito.mock(Subscription.class);
+ Mockito.when(subscription.getId()).thenReturn(subscriptionId);
Mockito.when(subscription.getAllTransitions()).thenReturn(ImmutableList.<EffectiveSubscriptionEvent>of(eventEffective));
Mockito.when(entitlementApi.getSubscriptionsForBundle(Mockito.<UUID>any())).thenReturn(ImmutableList.<Subscription>of(subscription));
diff --git a/api/src/main/java/com/ning/billing/overdue/OverdueChangeEvent.java b/api/src/main/java/com/ning/billing/overdue/OverdueChangeEvent.java
new file mode 100644
index 0000000..5b6aa57
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/overdue/OverdueChangeEvent.java
@@ -0,0 +1,33 @@
+/*
+ * 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.overdue;
+
+import java.util.UUID;
+
+import com.ning.billing.junction.api.Blockable;
+import com.ning.billing.util.bus.BusEvent;
+
+public interface OverdueChangeEvent extends BusEvent {
+
+ UUID getOverdueObjectId();
+
+ Blockable.Type getOverdueObjectType();
+
+ String getPreviousOverdueStateName();
+
+ String getNextOverdueStateName();
+}
diff --git a/api/src/main/java/com/ning/billing/util/bus/BusEvent.java b/api/src/main/java/com/ning/billing/util/bus/BusEvent.java
index cfb8b0b..919924e 100644
--- a/api/src/main/java/com/ning/billing/util/bus/BusEvent.java
+++ b/api/src/main/java/com/ning/billing/util/bus/BusEvent.java
@@ -35,7 +35,8 @@ public interface BusEvent {
CONTROL_TAGDEFINITION_CREATION,
CONTROL_TAGDEFINITION_DELETION,
USER_TAGDEFINITION_CREATION,
- USER_TAGDEFINITION_DELETION
+ USER_TAGDEFINITION_DELETION,
+ OVERDUE_CHANGE
}
public BusEventType getBusEventType();
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
index 0c7eeec..9d4b29a 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
@@ -316,8 +316,11 @@ public class TestAnalytics extends TestIntegrationBase {
// Check the first transition (into trial phase)
final BusinessSubscriptionTransition initialTransition = transitions.get(0);
+ Assert.assertEquals(initialTransition.getBundleId(), bundle.getId());
Assert.assertEquals(initialTransition.getExternalKey(), bundle.getKey());
+ Assert.assertEquals(initialTransition.getAccountId(), account.getId());
Assert.assertEquals(initialTransition.getAccountKey(), account.getExternalKey());
+ Assert.assertEquals(initialTransition.getSubscriptionId(), subscription.getId());
Assert.assertEquals(initialTransition.getEvent().getCategory(), currentProduct.getCategory());
Assert.assertEquals(initialTransition.getEvent().getEventType(), BusinessSubscriptionEvent.EventType.ADD);
@@ -325,7 +328,6 @@ public class TestAnalytics extends TestIntegrationBase {
Assert.assertNull(initialTransition.getPreviousSubscription());
Assert.assertEquals(initialTransition.getNextSubscription().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD.toString());
- Assert.assertEquals(initialTransition.getNextSubscription().getBundleId(), subscription.getBundleId());
Assert.assertEquals(initialTransition.getNextSubscription().getCurrency(), account.getCurrency().toString());
Assert.assertEquals(initialTransition.getNextSubscription().getPhase(), PhaseType.TRIAL.toString());
// Trial: fixed price of zero
@@ -337,7 +339,6 @@ public class TestAnalytics extends TestIntegrationBase {
Assert.assertEquals(initialTransition.getNextSubscription().getSlug(), currentProduct.getName().toLowerCase() + "-monthly-trial");
Assert.assertEquals(initialTransition.getNextSubscription().getStartDate(), subscription.getStartDate());
Assert.assertEquals(initialTransition.getNextSubscription().getState(), Subscription.SubscriptionState.ACTIVE);
- Assert.assertEquals(initialTransition.getNextSubscription().getSubscriptionId(), subscription.getId());
// Check the second transition (from trial to evergreen)
final BusinessSubscriptionTransition futureTransition = transitions.get(1);
@@ -350,7 +351,6 @@ public class TestAnalytics extends TestIntegrationBase {
// The billing period should have changed (NO_BILLING_PERIOD for the trial period)
Assert.assertEquals(futureTransition.getNextSubscription().getBillingPeriod(), BillingPeriod.MONTHLY.toString());
- Assert.assertEquals(futureTransition.getNextSubscription().getBundleId(), subscription.getBundleId());
Assert.assertEquals(initialTransition.getNextSubscription().getCurrency(), account.getCurrency().toString());
// From trial to evergreen
Assert.assertEquals(futureTransition.getNextSubscription().getPhase(), PhaseType.EVERGREEN.toString());
@@ -363,7 +363,6 @@ public class TestAnalytics extends TestIntegrationBase {
// 30 days trial
Assert.assertEquals(futureTransition.getNextSubscription().getStartDate(), subscription.getStartDate().plusDays(30));
Assert.assertEquals(futureTransition.getNextSubscription().getState(), Subscription.SubscriptionState.ACTIVE);
- Assert.assertEquals(futureTransition.getNextSubscription().getSubscriptionId(), subscription.getId());
}
private void verifyCancellationTransition(final Account account, final SubscriptionBundle bundle) throws CatalogApiException {
@@ -409,8 +408,11 @@ public class TestAnalytics extends TestIntegrationBase {
Assert.assertEquals(transitions.size(), 3);
final BusinessSubscriptionTransition previousTransition = transitions.get(0);
final BusinessSubscriptionTransition transition = transitions.get(1);
+ Assert.assertEquals(transition.getBundleId(), bundle.getId());
Assert.assertEquals(transition.getExternalKey(), bundle.getKey());
+ Assert.assertEquals(transition.getAccountId(), account.getId());
Assert.assertEquals(transition.getAccountKey(), account.getExternalKey());
+ Assert.assertEquals(transition.getSubscriptionId(), subscription.getId());
Assert.assertEquals(transition.getEvent().getCategory(), ProductCategory.BASE);
Assert.assertEquals(transition.getEvent().getEventType(), BusinessSubscriptionEvent.EventType.CHANGE);
@@ -421,7 +423,6 @@ public class TestAnalytics extends TestIntegrationBase {
// Verify the next subscription
// No billing period for the trial phase
Assert.assertEquals(transition.getNextSubscription().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD.toString());
- Assert.assertEquals(transition.getNextSubscription().getBundleId(), subscription.getBundleId());
Assert.assertEquals(transition.getNextSubscription().getCurrency(), account.getCurrency().toString());
Assert.assertEquals(transition.getNextSubscription().getPhase(), PhaseType.TRIAL.toString());
// We're still in trial
@@ -433,8 +434,6 @@ public class TestAnalytics extends TestIntegrationBase {
Assert.assertEquals(transition.getNextSubscription().getSlug(), subscription.getCurrentPhase().getName());
Assert.assertEquals(transition.getNextSubscription().getStartDate(), requestedDate);
Assert.assertEquals(transition.getNextSubscription().getState(), Subscription.SubscriptionState.ACTIVE);
- // It's still the same subscription
- Assert.assertEquals(transition.getNextSubscription().getSubscriptionId(), subscription.getId());
// The account should have two invoices for the trial phase of both subscriptions
Assert.assertEquals(analyticsUserApi.getInvoicesForAccount(account.getExternalKey()).size(), 2);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
index 55a2e8f..9499378 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
@@ -29,6 +29,7 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.invoice.template.formatters;
import java.math.BigDecimal;
@@ -41,6 +42,9 @@ import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
@@ -48,6 +52,9 @@ import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
import com.ning.billing.util.template.translation.TranslatorConfig;
+/**
+ * Format invoice fields. Note that the Mustache engine won't accept null values.
+ */
public class DefaultInvoiceFormatter implements InvoiceFormatter {
private final TranslatorConfig config;
private final Invoice invoice;
@@ -63,7 +70,7 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
@Override
public Integer getInvoiceNumber() {
- return invoice.getInvoiceNumber();
+ return Objects.firstNonNull(invoice.getInvoiceNumber(), 0);
}
@Override
@@ -87,7 +94,7 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
@Override
public <T extends InvoiceItem> List<InvoiceItem> getInvoiceItems(final Class<T> clazz) {
- return invoice.getInvoiceItems(clazz);
+ return Objects.firstNonNull(invoice.getInvoiceItems(clazz), ImmutableList.<InvoiceItem>of());
}
@Override
@@ -107,7 +114,7 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
@Override
public List<InvoicePayment> getPayments() {
- return invoice.getPayments();
+ return Objects.firstNonNull(invoice.getPayments(), ImmutableList.<InvoicePayment>of());
}
@Override
@@ -122,18 +129,17 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
@Override
public BigDecimal getChargedAmount() {
- return invoice.getChargedAmount();
+ return Objects.firstNonNull(invoice.getChargedAmount(), BigDecimal.ZERO);
}
@Override
public BigDecimal getCBAAmount() {
- return invoice.getCBAAmount();
+ return Objects.firstNonNull(invoice.getCBAAmount(), BigDecimal.ZERO);
}
-
@Override
public BigDecimal getBalance() {
- return invoice.getBalance();
+ return Objects.firstNonNull(invoice.getBalance(), BigDecimal.ZERO);
}
@Override
@@ -168,12 +174,17 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
@Override
public BigDecimal getPaidAmount() {
- return invoice.getPaidAmount();
+ return Objects.firstNonNull(invoice.getPaidAmount(), BigDecimal.ZERO);
}
@Override
public String getFormattedInvoiceDate() {
- return invoice.getInvoiceDate().toString(dateFormatter);
+ final DateTime invoiceDate = invoice.getInvoiceDate();
+ if (invoiceDate == null) {
+ return "";
+ } else {
+ return Strings.nullToEmpty(invoiceDate.toString(dateFormatter));
+ }
}
@Override
@@ -201,16 +212,16 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
@Override
public BigDecimal getTotalAdjAmount() {
- return invoice.getTotalAdjAmount();
+ return Objects.firstNonNull(invoice.getTotalAdjAmount(), BigDecimal.ZERO);
}
@Override
public BigDecimal getCreditAdjAmount() {
- return invoice.getCreditAdjAmount();
+ return Objects.firstNonNull(invoice.getCreditAdjAmount(), BigDecimal.ZERO);
}
@Override
public BigDecimal getRefundAdjAmount() {
- return invoice.getRefundAdjAmount();
+ return Objects.firstNonNull(invoice.getRefundAdjAmount(), BigDecimal.ZERO);
}
}
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 3f4ff92..86be83b 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
@@ -23,6 +23,8 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormatter;
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceItemType;
@@ -31,6 +33,9 @@ import com.ning.billing.util.template.translation.DefaultCatalogTranslator;
import com.ning.billing.util.template.translation.Translator;
import com.ning.billing.util.template.translation.TranslatorConfig;
+/**
+ * Format invoice item fields. Note that the Mustache engine won't accept null values.
+ */
public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
private final Translator translator;
@@ -48,7 +53,7 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
@Override
public BigDecimal getAmount() {
- return item.getAmount();
+ return Objects.firstNonNull(item.getAmount(), BigDecimal.ZERO);
}
@Override
@@ -60,16 +65,10 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
public InvoiceItemType getInvoiceItemType() {
return item.getInvoiceItemType();
}
-/*
- @Override
- public InvoiceItem asReversingItem() {
- return item.asReversingItem();
- }
- */
@Override
public String getDescription() {
- return item.getDescription();
+ return Strings.nullToEmpty(item.getDescription());
}
@Override
@@ -84,12 +83,12 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
@Override
public String getFormattedStartDate() {
- return item.getStartDate().toString(dateFormatter);
+ return Strings.nullToEmpty(item.getStartDate().toString(dateFormatter));
}
@Override
public String getFormattedEndDate() {
- return item.getEndDate().toString(dateFormatter);
+ return Strings.nullToEmpty(item.getEndDate().toString(dateFormatter));
}
@Override
@@ -114,12 +113,12 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
@Override
public String getPlanName() {
- return translator.getTranslation(locale, item.getPlanName());
+ return Strings.nullToEmpty(translator.getTranslation(locale, item.getPlanName()));
}
@Override
public String getPhaseName() {
- return translator.getTranslation(locale, item.getPhaseName());
+ return Strings.nullToEmpty(translator.getTranslation(locale, item.getPhaseName()));
}
@Override
@@ -134,7 +133,7 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
@Override
public BigDecimal getRate() {
- return null;
+ return BigDecimal.ZERO;
}
@Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java
index f27bce7..04c5075 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java
@@ -16,6 +16,7 @@
package com.ning.billing.invoice.template;
+import javax.annotation.Nullable;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
@@ -42,7 +43,12 @@ public class HtmlInvoiceGenerator {
this.config = config;
}
- public String generateInvoice(final Account account, final Invoice invoice) throws IOException {
+ public String generateInvoice(final Account account, @Nullable final Invoice invoice) throws IOException {
+ // Don't do anything if the invoice is null
+ if (invoice == null) {
+ return null;
+ }
+
final Map<String, Object> data = new HashMap<String, Object>();
final DefaultInvoiceTranslator invoiceTranslator = new DefaultInvoiceTranslator(config);
final Locale locale = new Locale(account.getLocale());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
index 2847e0b..8c9ace4 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
@@ -22,7 +22,9 @@ import java.util.List;
import java.util.Locale;
import org.joda.time.DateTime;
+import org.mockito.Mockito;
import org.skife.config.ConfigurationObjectFactory;
+import org.testng.Assert;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
@@ -39,12 +41,10 @@ import com.ning.billing.util.email.templates.MustacheTemplateEngine;
import com.ning.billing.util.email.templates.TemplateEngine;
import com.ning.billing.util.template.translation.TranslatorConfig;
-import static org.testng.Assert.assertNotNull;
-
public class TestHtmlInvoiceGenerator {
private HtmlInvoiceGenerator g;
- @BeforeSuite(groups = {"fast"})
+ @BeforeSuite(groups = "fast")
public void setup() {
final TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
final TemplateEngine templateEngine = new MustacheTemplateEngine();
@@ -52,11 +52,23 @@ public class TestHtmlInvoiceGenerator {
g = new HtmlInvoiceGenerator(factory, templateEngine, config);
}
- @Test(groups = {"fast"})
+ @Test(groups = "fast")
public void testGenerateInvoice() throws Exception {
final String output = g.generateInvoice(createAccount(), createInvoice());
- assertNotNull(output);
- System.out.print(output);
+ Assert.assertNotNull(output);
+ }
+
+ @Test(groups = "fast")
+ public void testGenerateEmptyInvoice() throws Exception {
+ final Invoice invoice = Mockito.mock(Invoice.class);
+ final String output = g.generateInvoice(createAccount(), invoice);
+ Assert.assertNotNull(output);
+ }
+
+ @Test(groups = "fast")
+ public void testGenerateNullInvoice() throws Exception {
+ final String output = g.generateInvoice(createAccount(), null);
+ Assert.assertNull(output);
}
private Account createAccount() {
@@ -110,7 +122,6 @@ public class TestHtmlInvoiceGenerator {
zombie.addResult("getPlanName", planName);
zombie.addResult("getDescription", networkName);
-
return item;
}
}
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
new file mode 100644
index 0000000..982f18a
--- /dev/null
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
@@ -0,0 +1,79 @@
+/*
+ * 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.overdue.applicator;
+
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.junction.api.Blockable;
+import com.ning.billing.junction.api.Blockable.Type;
+import com.ning.billing.overdue.OverdueChangeEvent;
+
+public class DefaultOverdueChangeEvent implements OverdueChangeEvent {
+ private final UUID overdueObjectId;
+ private final Blockable.Type overdueObjectType;
+ private final String previousOverdueStateName;
+ private final String nextOverdueStateName;
+ private final UUID userToken;
+
+
+ @JsonCreator
+ public DefaultOverdueChangeEvent(@JsonProperty("overdueObjectId") final UUID overdueObjectId,
+ @JsonProperty("overdueObjectType") final Blockable.Type overdueObjectType,
+ @JsonProperty("previousOverdueStateName") final String previousOverdueStateName,
+ @JsonProperty("nextOverdueStateName") final String nextOverdueStateName,
+ @JsonProperty("userToken") final UUID userToken) {
+ this.overdueObjectId = overdueObjectId;
+ this.overdueObjectType = overdueObjectType;
+ this.previousOverdueStateName = previousOverdueStateName;
+ this.nextOverdueStateName = nextOverdueStateName;
+ this.userToken = userToken;
+ }
+
+ @JsonIgnore
+ @Override
+ public BusEventType getBusEventType() {
+ return BusEventType.OVERDUE_CHANGE;
+ }
+
+ @Override
+ public UUID getUserToken() {
+ return userToken;
+ }
+ @Override
+ public String getPreviousOverdueStateName() {
+ return previousOverdueStateName;
+ }
+
+ @Override
+ public UUID getOverdueObjectId() {
+ return overdueObjectId;
+ }
+
+ @Override
+ public Type getOverdueObjectType() {
+ return overdueObjectType;
+ }
+
+ @Override
+ public String getNextOverdueStateName() {
+ return nextOverdueStateName;
+ }
+
+}
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
index 3f9704b..86c9a72 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
@@ -18,31 +18,39 @@ package com.ning.billing.overdue.applicator;
import org.joda.time.DateTime;
import org.joda.time.Period;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.ning.billing.ErrorCode;
import com.ning.billing.junction.api.Blockable;
import com.ning.billing.junction.api.BlockingApi;
+import com.ning.billing.junction.api.BlockingApiException;
import com.ning.billing.junction.api.DefaultBlockingState;
import com.ning.billing.ovedue.notification.OverdueCheckPoster;
import com.ning.billing.overdue.OverdueApiException;
+import com.ning.billing.overdue.OverdueChangeEvent;
import com.ning.billing.overdue.OverdueService;
import com.ning.billing.overdue.OverdueState;
import com.ning.billing.overdue.config.api.OverdueError;
+import com.ning.billing.util.bus.Bus;
import com.ning.billing.util.clock.Clock;
public class OverdueStateApplicator<T extends Blockable> {
+ private static final Logger log = LoggerFactory.getLogger(OverdueStateApplicator.class);
private final BlockingApi blockingApi;
private final Clock clock;
private final OverdueCheckPoster poster;
+ private final Bus bus;
@Inject
- public OverdueStateApplicator(final BlockingApi accessApi, final Clock clock, final OverdueCheckPoster poster) {
+ public OverdueStateApplicator(final BlockingApi accessApi, final Clock clock, final OverdueCheckPoster poster, final Bus bus) {
this.blockingApi = accessApi;
this.clock = clock;
this.poster = poster;
+ this.bus = bus;
}
public void apply(final T overdueable, final String previousOverdueStateName, final OverdueState<T> nextOverdueState) throws OverdueError {
@@ -65,9 +73,19 @@ public class OverdueStateApplicator<T extends Blockable> {
if (nextOverdueState.isClearState()) {
clear(overdueable);
}
+
+ try {
+ bus.post(createOverdueEvent(overdueable, previousOverdueStateName, nextOverdueState.getName()));
+ } catch (Exception e) {
+ log.error("Error posting overdue change event to bus",e);
+ }
}
+ private OverdueChangeEvent createOverdueEvent(T overdueable, String previousOverdueStateName, String nextOverdueStateName) throws BlockingApiException {
+ return new DefaultOverdueChangeEvent(overdueable.getId(), Blockable.Type.get(overdueable), previousOverdueStateName, nextOverdueStateName, null);
+ }
+
protected void storeNewState(final T blockable, final OverdueState<T> nextOverdueState) throws OverdueError {
try {
blockingApi.setBlockingState(new DefaultBlockingState(blockable.getId(), nextOverdueState.getName(), Blockable.Type.get(blockable),
diff --git a/overdue/src/main/java/com/ning/billing/overdue/glue/DefaultOverdueModule.java b/overdue/src/main/java/com/ning/billing/overdue/glue/DefaultOverdueModule.java
index a81e791..8536748 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/glue/DefaultOverdueModule.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/glue/DefaultOverdueModule.java
@@ -48,6 +48,7 @@ public class DefaultOverdueModule extends AbstractModule implements OverdueModul
bind(ExtendedOverdueService.class).to(DefaultOverdueService.class).asEagerSingleton();
bind(OverdueCheckNotifier.class).to(DefaultOverdueCheckNotifier.class).asEagerSingleton();
bind(OverdueCheckPoster.class).to(DefaultOverdueCheckPoster.class).asEagerSingleton();
+
}
protected void installOverdueService() {
diff --git a/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java b/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java
new file mode 100644
index 0000000..ee5e833
--- /dev/null
+++ b/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.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.overdue.applicator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.eventbus.Subscribe;
+import com.ning.billing.overdue.OverdueChangeEvent;
+
+public class OverdueBusListenerTester {
+ public static final Logger log = LoggerFactory.getLogger(OverdueBusListenerTester.class);
+
+ private List<OverdueChangeEvent> eventsReceived = new ArrayList<OverdueChangeEvent>();
+
+ @Subscribe
+ public void handleOverdueChange(final OverdueChangeEvent changeEvent) {
+ log.info("Received subscription transition.");
+ eventsReceived.add(changeEvent);
+ }
+
+ public List<OverdueChangeEvent> getEventsReceived() {
+ return eventsReceived;
+ }
+
+ public void clearEventsReceived() {
+ eventsReceived.clear();
+ }
+
+}
diff --git a/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueListenerTesterModule.java b/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueListenerTesterModule.java
new file mode 100644
index 0000000..b0774b4
--- /dev/null
+++ b/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueListenerTesterModule.java
@@ -0,0 +1,29 @@
+/*
+ * 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.overdue.applicator;
+
+import com.google.inject.AbstractModule;
+import com.ning.billing.util.glue.BusModule;
+
+public class OverdueListenerTesterModule extends AbstractModule {
+
+ @Override
+ protected void configure() {
+ install(new BusModule(BusModule.BusType.PERSISTENT));
+ bind(OverdueBusListenerTester.class).asEagerSingleton();
+ }
+}
diff --git a/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java b/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java
index 35425d0..a58ac39 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java
@@ -17,9 +17,16 @@
package com.ning.billing.overdue.applicator;
+import static com.jayway.awaitility.Awaitility.await;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
import java.io.ByteArrayInputStream;
import java.io.InputStream;
+import java.util.List;
import java.util.UUID;
+import java.util.concurrent.Callable;
+
+import junit.framework.Assert;
import org.testng.annotations.Test;
@@ -28,17 +35,28 @@ import com.ning.billing.entitlement.api.user.SubscriptionBundle;
import com.ning.billing.junction.api.BlockingApi;
import com.ning.billing.mock.BrainDeadProxyFactory;
import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
+import com.ning.billing.overdue.OverdueChangeEvent;
import com.ning.billing.overdue.OverdueState;
import com.ning.billing.overdue.OverdueTestBase;
import com.ning.billing.overdue.config.OverdueConfig;
+import com.ning.billing.util.bus.Bus;
import com.ning.billing.util.config.XMLLoader;
public class TestOverdueStateApplicator extends OverdueTestBase {
@Inject
OverdueStateApplicator<SubscriptionBundle> applicator;
+ @Inject
+ OverdueBusListenerTester listener;
+
+ @Inject
+ Bus bus;
+
+
@Test(groups = {"slow"}, enabled = true)
public void testApplicator() throws Exception {
+ bus.register(listener);
+ bus.start();
final InputStream is = new ByteArrayInputStream(configXml.getBytes());
config = XMLLoader.getObjectFromStreamNoValidation(is, OverdueConfig.class);
overdueWrapperFactory.setOverdueConfig(config);
@@ -51,15 +69,37 @@ public class TestOverdueStateApplicator extends OverdueTestBase {
state = config.getBundleStateSet().findState("OD1");
applicator.apply(bundle, BlockingApi.CLEAR_STATE_NAME, state);
checkStateApplied(state);
+ checkBussEvent("OD1");
+
state = config.getBundleStateSet().findState("OD2");
applicator.apply(bundle, BlockingApi.CLEAR_STATE_NAME, state);
checkStateApplied(state);
+ checkBussEvent("OD2");
+
state = config.getBundleStateSet().findState("OD3");
applicator.apply(bundle, BlockingApi.CLEAR_STATE_NAME, state);
checkStateApplied(state);
+ checkBussEvent("OD3");
+ bus.stop();
+
+ }
+
+
+ private void checkBussEvent(final String state) throws Exception {
+ await().atMost(10, SECONDS).until(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ List<OverdueChangeEvent> events = listener.getEventsReceived();
+ return events.size() == 1;
+ }
+ });
+ List<OverdueChangeEvent> events = listener.getEventsReceived();
+ Assert.assertEquals(1, events.size());
+ Assert.assertEquals(state, events.get(0).getNextOverdueStateName());
+ listener.clearEventsReceived();
}
diff --git a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestBase.java b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestBase.java
index f68ce0a..afc93e5 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestBase.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestBase.java
@@ -52,6 +52,7 @@ import com.ning.billing.mock.glue.MockPaymentModule;
import com.ning.billing.mock.glue.TestDbiModule;
import com.ning.billing.overdue.applicator.ApplicatorMockJunctionModule;
import com.ning.billing.overdue.applicator.ApplicatorMockJunctionModule.ApplicatorBlockingApi;
+import com.ning.billing.overdue.applicator.OverdueListenerTesterModule;
import com.ning.billing.overdue.applicator.TestOverdueStateApplicator;
import com.ning.billing.overdue.config.OverdueConfig;
import com.ning.billing.overdue.glue.DefaultOverdueModule;
@@ -64,7 +65,7 @@ import com.ning.billing.util.glue.NotificationQueueModule;
import com.ning.billing.util.io.IOUtils;
import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
-@Guice(modules = {DefaultOverdueModule.class, MockClockModule.class, ApplicatorMockJunctionModule.class, CatalogModule.class, MockInvoiceModule.class, MockPaymentModule.class, BusModule.class, NotificationQueueModule.class, TestDbiModule.class})
+@Guice(modules = {DefaultOverdueModule.class,OverdueListenerTesterModule.class, MockClockModule.class, ApplicatorMockJunctionModule.class, CatalogModule.class, MockInvoiceModule.class, MockPaymentModule.class, NotificationQueueModule.class, TestDbiModule.class})
public class OverdueTestBase {
protected final String configXml =
"<overdueConfig>" +