killbill-memoizeit
Changes
account/pom.xml 2(+1 -1)
analytics/pom.xml 2(+1 -1)
analytics/src/main/java/com/ning/billing/analytics/api/user/DefaultAnalyticsUserApi.java 216(+214 -2)
analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java 31(+16 -15)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java 4(+4 -0)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceItemSqlDao.sql.stg 8(+6 -2)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg 42(+42 -0)
analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java 23(+21 -2)
analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java 5(+5 -0)
analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java 20(+10 -10)
api/pom.xml 2(+1 -1)
beatrix/pom.xml 2(+1 -1)
catalog/pom.xml 2(+1 -1)
entitlement/pom.xml 2(+1 -1)
entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionFactory.java 22(+22 -0)
entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java 17(+17 -0)
entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java 3(+3 -0)
entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg 8(+6 -2)
invoice/pom.xml 2(+1 -1)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java 11(+11 -0)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java 11(+11 -0)
invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java 23(+11 -12)
jaxrs/pom.xml 2(+1 -1)
junction/pom.xml 2(+1 -1)
junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscriptionBundle.java 12(+12 -0)
overdue/pom.xml 2(+1 -1)
payment/pom.xml 2(+1 -1)
pom.xml 2(+1 -1)
server/pom.xml 2(+1 -1)
tenant/pom.xml 2(+1 -1)
usage/pom.xml 2(+1 -1)
util/pom.xml 2(+1 -1)
Details
account/pom.xml 2(+1 -1)
diff --git a/account/pom.xml b/account/pom.xml
index 168ee48..e23b548 100644
--- a/account/pom.xml
+++ b/account/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-account</artifactId>
diff --git a/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
index fcd0a89..cb2188f 100644
--- a/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
+++ b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
@@ -18,6 +18,9 @@ package com.ning.billing.account.api;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import com.ning.billing.catalog.api.Currency;
@@ -90,7 +93,21 @@ public class DefaultAccount extends EntityBase implements Account {
final String city, final String stateOrProvince, final String country,
final String postalCode, final String phone,
final Boolean isMigrated, final Boolean isNotifiedForInvoices) {
- super(id);
+ this(id, null, null, externalKey, email, name, firstNameLength, currency, billCycleDay, paymentMethodId,
+ timeZone, locale, address1, address2, companyName, city, stateOrProvince, country, postalCode,
+ phone, isMigrated, isNotifiedForInvoices);
+ }
+
+ public DefaultAccount(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
+ final String externalKey, final String email,
+ final String name, final Integer firstNameLength,
+ final Currency currency, final BillCycleDay billCycleDay, final UUID paymentMethodId,
+ final DateTimeZone timeZone, final String locale,
+ final String address1, final String address2, final String companyName,
+ final String city, final String stateOrProvince, final String country,
+ final String postalCode, final String phone,
+ final Boolean isMigrated, final Boolean isNotifiedForInvoices) {
+ super(id, createdDate, updatedDate);
this.externalKey = externalKey;
this.email = email;
this.name = name;
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountMapper.java b/account/src/main/java/com/ning/billing/account/dao/AccountMapper.java
index 90a6b25..e6e3a9e 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AccountMapper.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountMapper.java
@@ -20,6 +20,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
@@ -31,6 +32,7 @@ import com.ning.billing.catalog.api.Currency;
import com.ning.billing.util.dao.MapperBase;
public class AccountMapper extends MapperBase implements ResultSetMapper<Account> {
+
@Override
public Account map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
final UUID id = UUID.fromString(result.getString("id"));
@@ -63,7 +65,9 @@ public class AccountMapper extends MapperBase implements ResultSetMapper<Account
final Boolean isMigrated = result.getBoolean("migrated");
final Boolean isNotifiedForInvoices = result.getBoolean("is_notified_for_invoices");
- return new DefaultAccount(id, externalKey, email, name, firstNameLength, currency,
+ final DateTime createdDate = getDateTime(result, "created_date");
+ final DateTime updatedDate = getDateTime(result, "updated_date");
+ return new DefaultAccount(id, createdDate, updatedDate, externalKey, email, name, firstNameLength, currency,
new DefaultBillCycleDay(billingCycleDayLocal, billingCycleDayUTC), paymentMethodId, timeZone, locale,
address1, address2, companyName, city, stateOrProvince, country, postalCode, phone,
isMigrated, isNotifiedForInvoices);
analytics/pom.xml 2(+1 -1)
diff --git a/analytics/pom.xml b/analytics/pom.xml
index 8c545e0..8777ef1 100644
--- a/analytics/pom.xml
+++ b/analytics/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-analytics</artifactId>
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 184ea75..bb6961c 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
@@ -48,52 +48,52 @@ import com.google.inject.Inject;
public class AnalyticsListener {
- private final BusinessSubscriptionTransitionRecorder bstRecorder;
- private final BusinessAccountRecorder bacRecorder;
- private final BusinessInvoiceRecorder invoiceRecorder;
- private final BusinessOverdueStatusRecorder bosRecorder;
- private final BusinessInvoicePaymentRecorder bipRecorder;
- private final BusinessTagRecorder tagRecorder;
+ private final BusinessSubscriptionTransitionDao bstDao;
+ private final BusinessAccountDao bacDao;
+ private final BusinessInvoiceDao invoiceDao;
+ private final BusinessOverdueStatusDao bosDao;
+ private final BusinessInvoicePaymentDao bipDao;
+ private final BusinessTagDao tagDao;
private final InternalCallContextFactory internalCallContextFactory;
@Inject
- public AnalyticsListener(final BusinessSubscriptionTransitionRecorder bstRecorder,
- final BusinessAccountRecorder bacRecorder,
- final BusinessInvoiceRecorder invoiceRecorder,
- final BusinessOverdueStatusRecorder bosRecorder,
- final BusinessInvoicePaymentRecorder bipRecorder,
- final BusinessTagRecorder tagRecorder,
+ public AnalyticsListener(final BusinessSubscriptionTransitionDao bstDao,
+ final BusinessAccountDao bacDao,
+ final BusinessInvoiceDao invoiceDao,
+ final BusinessOverdueStatusDao bosDao,
+ final BusinessInvoicePaymentDao bipDao,
+ final BusinessTagDao tagDao,
final InternalCallContextFactory internalCallContextFactory) {
- this.bstRecorder = bstRecorder;
- this.bacRecorder = bacRecorder;
- this.invoiceRecorder = invoiceRecorder;
- this.bosRecorder = bosRecorder;
- this.bipRecorder = bipRecorder;
- this.tagRecorder = tagRecorder;
+ this.bstDao = bstDao;
+ this.bacDao = bacDao;
+ this.invoiceDao = invoiceDao;
+ this.bosDao = bosDao;
+ this.bipDao = bipDao;
+ this.tagDao = tagDao;
this.internalCallContextFactory = internalCallContextFactory;
}
@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(), createCallContext(eventEffective));
+ bstDao.rebuildTransitionsForBundle(eventEffective.getBundleId(), createCallContext(eventEffective));
}
@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(), createCallContext(eventRequested));
+ bstDao.rebuildTransitionsForBundle(eventRequested.getBundleId(), createCallContext(eventRequested));
}
@Subscribe
public void handleRepairEntitlement(final RepairEntitlementEvent event) {
// In case of repair, just rebuild all transitions
- bstRecorder.rebuildTransitionsForBundle(event.getBundleId(), createCallContext(event));
+ bstDao.rebuildTransitionsForBundle(event.getBundleId(), createCallContext(event));
}
@Subscribe
public void handleAccountCreation(final AccountCreationEvent event) {
- bacRecorder.accountCreated(event.getData(), createCallContext(event));
+ bacDao.accountUpdated(event.getId(), createCallContext(event));
}
@Subscribe
@@ -102,13 +102,13 @@ public class AnalyticsListener {
return;
}
- bacRecorder.accountUpdated(event.getAccountId(), createCallContext(event));
+ bacDao.accountUpdated(event.getAccountId(), createCallContext(event));
}
@Subscribe
public void handleInvoiceCreation(final InvoiceCreationEvent event) {
// The event is used as a trigger to rebuild all invoices and invoice items for this account
- invoiceRecorder.rebuildInvoicesForAccount(event.getAccountId(), createCallContext(event));
+ invoiceDao.rebuildInvoicesForAccount(event.getAccountId(), createCallContext(event));
}
@Subscribe
@@ -119,52 +119,52 @@ public class AnalyticsListener {
@Subscribe
public void handleInvoiceAdjustment(final InvoiceAdjustmentEvent event) {
// The event is used as a trigger to rebuild all invoices and invoice items for this account
- invoiceRecorder.rebuildInvoicesForAccount(event.getAccountId(), createCallContext(event));
+ invoiceDao.rebuildInvoicesForAccount(event.getAccountId(), createCallContext(event));
}
@Subscribe
public void handlePaymentInfo(final PaymentInfoEvent paymentInfo) {
- bipRecorder.invoicePaymentPosted(paymentInfo.getAccountId(),
- paymentInfo.getPaymentId(),
- paymentInfo.getExtFirstPaymentRefId(),
- paymentInfo.getExtSecondPaymentRefId(),
- paymentInfo.getStatus().toString(),
- createCallContext(paymentInfo));
+ bipDao.invoicePaymentPosted(paymentInfo.getAccountId(),
+ paymentInfo.getPaymentId(),
+ paymentInfo.getExtFirstPaymentRefId(),
+ paymentInfo.getExtSecondPaymentRefId(),
+ paymentInfo.getStatus().toString(),
+ createCallContext(paymentInfo));
}
@Subscribe
public void handlePaymentError(final PaymentErrorEvent paymentError) {
- bipRecorder.invoicePaymentPosted(paymentError.getAccountId(),
- paymentError.getPaymentId(),
- null,
- null,
- paymentError.getMessage(),
- createCallContext(paymentError));
+ bipDao.invoicePaymentPosted(paymentError.getAccountId(),
+ paymentError.getPaymentId(),
+ null,
+ null,
+ paymentError.getMessage(),
+ createCallContext(paymentError));
}
@Subscribe
public void handleOverdueChange(final OverdueChangeEvent changeEvent) {
- bosRecorder.overdueStatusChanged(changeEvent.getOverdueObjectType(), changeEvent.getOverdueObjectId(), createCallContext(changeEvent));
+ bosDao.overdueStatusChanged(changeEvent.getOverdueObjectType(), changeEvent.getOverdueObjectId(), createCallContext(changeEvent));
}
@Subscribe
public void handleControlTagCreation(final ControlTagCreationEvent event) {
- tagRecorder.tagAdded(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
+ tagDao.tagAdded(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
}
@Subscribe
public void handleControlTagDeletion(final ControlTagDeletionEvent event) {
- tagRecorder.tagRemoved(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
+ tagDao.tagRemoved(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
}
@Subscribe
public void handleUserTagCreation(final UserTagCreationEvent event) {
- tagRecorder.tagAdded(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
+ tagDao.tagAdded(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
}
@Subscribe
public void handleUserTagDeletion(final UserTagDeletionEvent event) {
- tagRecorder.tagRemoved(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
+ tagDao.tagRemoved(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
}
@Subscribe
diff --git a/analytics/src/main/java/com/ning/billing/analytics/api/user/DefaultAnalyticsUserApi.java b/analytics/src/main/java/com/ning/billing/analytics/api/user/DefaultAnalyticsUserApi.java
index fb74122..840f483 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/api/user/DefaultAnalyticsUserApi.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/api/user/DefaultAnalyticsUserApi.java
@@ -16,11 +16,27 @@
package com.ning.billing.analytics.api.user;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.UUID;
+import javax.annotation.Nullable;
import javax.inject.Inject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ning.billing.account.api.Account;
+import com.ning.billing.analytics.BusinessAccountDao;
+import com.ning.billing.analytics.BusinessInvoiceDao;
+import com.ning.billing.analytics.BusinessInvoicePaymentDao;
+import com.ning.billing.analytics.BusinessOverdueStatusDao;
+import com.ning.billing.analytics.BusinessSubscriptionTransitionDao;
+import com.ning.billing.analytics.BusinessTagDao;
import com.ning.billing.analytics.api.TimeSeriesData;
import com.ning.billing.analytics.dao.AnalyticsDao;
import com.ning.billing.analytics.model.BusinessAccount;
@@ -30,17 +46,61 @@ import com.ning.billing.analytics.model.BusinessInvoiceItem;
import com.ning.billing.analytics.model.BusinessInvoicePayment;
import com.ning.billing.analytics.model.BusinessOverdueStatus;
import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.junction.api.Blockable.Type;
+import com.ning.billing.payment.api.Payment;
+import com.ning.billing.payment.api.PaymentApi;
+import com.ning.billing.payment.api.PaymentApiException;
+import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.callcontext.InternalCallContext;
import com.ning.billing.util.callcontext.InternalCallContextFactory;
import com.ning.billing.util.callcontext.TenantContext;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Sets;
public class DefaultAnalyticsUserApi implements AnalyticsUserApi {
- private final InternalCallContextFactory internalCallContextFactory;
+ private static final Logger log = LoggerFactory.getLogger(DefaultAnalyticsUserApi.class);
+
private final AnalyticsDao analyticsDao;
+ private final BusinessSubscriptionTransitionDao bstDao;
+ private final BusinessAccountDao bacDao;
+ private final BusinessInvoiceDao invoiceDao;
+ private final BusinessOverdueStatusDao bosDao;
+ private final BusinessInvoicePaymentDao bipDao;
+ private final BusinessTagDao tagDao;
+ private final EntitlementInternalApi entitlementInternalApi;
+ private final PaymentApi paymentApi;
+ private final TagInternalApi tagInternalApi;
+ private final InternalCallContextFactory internalCallContextFactory;
@Inject
- public DefaultAnalyticsUserApi(final AnalyticsDao analyticsDao, final InternalCallContextFactory internalCallContextFactory) {
+ public DefaultAnalyticsUserApi(final AnalyticsDao analyticsDao,
+ final BusinessSubscriptionTransitionDao bstDao,
+ final BusinessAccountDao bacDao,
+ final BusinessInvoiceDao invoiceDao,
+ final BusinessOverdueStatusDao bosDao,
+ final BusinessInvoicePaymentDao bipDao,
+ final BusinessTagDao tagDao,
+ final EntitlementInternalApi entitlementInternalApi,
+ final PaymentApi paymentApi,
+ final TagInternalApi tagInternalApi,
+ final InternalCallContextFactory internalCallContextFactory) {
this.analyticsDao = analyticsDao;
+ this.bstDao = bstDao;
+ this.bacDao = bacDao;
+ this.invoiceDao = invoiceDao;
+ this.bosDao = bosDao;
+ this.bipDao = bipDao;
+ this.tagDao = tagDao;
+ this.entitlementInternalApi = entitlementInternalApi;
+ this.paymentApi = paymentApi;
+ this.tagInternalApi = tagInternalApi;
this.internalCallContextFactory = internalCallContextFactory;
}
@@ -54,6 +114,158 @@ public class DefaultAnalyticsUserApi implements AnalyticsUserApi {
return analyticsDao.getSubscriptionsCreatedOverTime(productType, slug, internalCallContextFactory.createInternalTenantContext(context));
}
+ @Override
+ public void rebuildAnalyticsForAccount(final Account account, final CallContext context) {
+ final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(context);
+
+ // Update the BAC row
+ bacDao.accountUpdated(account.getId(), internalCallContext);
+
+ // Update BST for all bundles
+ final Set<UUID> bundleIds = updateBST(account, internalCallContext);
+
+ // Update BIN and BII for all invoices
+ invoiceDao.rebuildInvoicesForAccount(account.getId(), internalCallContext);
+
+ // Update BIP for all invoices
+ try {
+ updateBIP(account, context, internalCallContext);
+ } catch (PaymentApiException e) {
+ // Log and ignore
+ log.warn(e.toString());
+ }
+
+ // Update BOS for all bundles (only blockable supported today)
+ // TODO: support other blockables
+ for (final UUID bundleId : bundleIds) {
+ bosDao.overdueStatusChanged(Type.SUBSCRIPTION_BUNDLE, bundleId, internalCallContext);
+ }
+
+ // Update bac_tags
+ // TODO: refresh all tags
+ updateTags(account, internalCallContext);
+ }
+
+ private Set<UUID> updateBST(final Account account, final InternalCallContext internalCallContext) {
+ // Find the current state of bundles in entitlement
+ final Collection<UUID> entitlementBundlesId = Collections2.transform(entitlementInternalApi.getBundlesForAccount(account.getId(), internalCallContext),
+ new Function<SubscriptionBundle, UUID>() {
+ @Override
+ public UUID apply(@Nullable final SubscriptionBundle input) {
+ if (input == null) {
+ return null;
+ } else {
+ return input.getId();
+ }
+ }
+ });
+
+ // Find the current state of bundles in analytics
+ final Collection<UUID> analyticsBundlesId = Collections2.transform(analyticsDao.getTransitionsForAccount(account.getExternalKey(), internalCallContext),
+ new Function<BusinessSubscriptionTransition, UUID>() {
+ @Override
+ public UUID apply(@Nullable final BusinessSubscriptionTransition input) {
+ if (input == null) {
+ return null;
+ } else {
+ return input.getBundleId();
+ }
+ }
+ });
+
+ // Update BST for all bundles found
+ final Set<UUID> bundlesId = new HashSet<UUID>();
+ bundlesId.addAll(entitlementBundlesId);
+ bundlesId.addAll(analyticsBundlesId);
+ for (final UUID bundleId : bundlesId) {
+ bstDao.rebuildTransitionsForBundle(bundleId, internalCallContext);
+ }
+
+ return bundlesId;
+ }
+
+ private void updateBIP(final Account account, final TenantContext tenantContext, final InternalCallContext internalCallContext) throws PaymentApiException {
+ final List<Payment> accountPayments = paymentApi.getAccountPayments(account.getId(), tenantContext);
+ final Map<UUID, Payment> payments = new HashMap<UUID, Payment>();
+ for (final Payment payment : accountPayments) {
+ payments.put(payment.getId(), payment);
+ }
+
+ // Find the current state of payments in payment
+ final Collection<UUID> paymentPaymentsId = Collections2.transform(accountPayments,
+ new Function<Payment, UUID>() {
+ @Override
+ public UUID apply(@Nullable final Payment input) {
+ if (input == null) {
+ return null;
+ } else {
+ return input.getId();
+ }
+ }
+ });
+
+ // Find the current state of payments in analytics
+ final Collection<UUID> analyticsPaymentsId = Collections2.transform(analyticsDao.getInvoicePaymentsForAccountByKey(account.getExternalKey(), internalCallContext),
+ new Function<BusinessInvoicePayment, UUID>() {
+ @Override
+ public UUID apply(@Nullable final BusinessInvoicePayment input) {
+ if (input == null) {
+ return null;
+ } else {
+ return input.getPaymentId();
+ }
+ }
+ });
+
+ // Update BIP for all payments found
+ final Set<UUID> paymentsId = new HashSet<UUID>();
+ paymentsId.addAll(paymentPaymentsId);
+ paymentsId.addAll(analyticsPaymentsId);
+ for (final UUID paymentId : paymentsId) {
+ final Payment paymentInfo = payments.get(paymentId);
+ bipDao.invoicePaymentPosted(paymentInfo.getAccountId(),
+ paymentInfo.getId(),
+ paymentInfo.getExtFirstPaymentIdRef(),
+ paymentInfo.getExtSecondPaymentIdRef(),
+ paymentInfo.getPaymentStatus().toString(),
+ internalCallContext);
+ }
+ }
+
+ private void updateTags(final Account account, final InternalCallContext internalCallContext) {
+ // Find the current state of tags from util
+ final Collection<String> utilTags = Collections2.transform(tagInternalApi.getTags(account.getId(), ObjectType.ACCOUNT, internalCallContext).keySet(),
+ new Function<String, String>() {
+ @Override
+ public String apply(@Nullable final String input) {
+ return input;
+ }
+ });
+
+ // Find the current state of tags in analytics
+ final Collection<String> analyticsTags = Collections2.transform(analyticsDao.getTagsForAccount(account.getExternalKey(), internalCallContext),
+ new Function<BusinessAccountTag, String>() {
+ @Override
+ public String apply(@Nullable final BusinessAccountTag input) {
+ if (input == null) {
+ return null;
+ } else {
+ return input.getName();
+ }
+ }
+ });
+
+ // Remove non existing tags
+ for (final String tag : Sets.difference(new HashSet<String>(analyticsTags), new HashSet<String>(utilTags))) {
+ tagDao.tagRemoved(ObjectType.ACCOUNT, account.getId(), tag, internalCallContext);
+ }
+
+ // Add missing ones
+ for (final String tag : Sets.difference(new HashSet<String>(utilTags), new HashSet<String>(analyticsTags))) {
+ tagDao.tagAdded(ObjectType.ACCOUNT, account.getId(), tag, internalCallContext);
+ }
+ }
+
// Note: the following is not exposed in api yet, as the models need to be extracted first
public BusinessAccount getAccountByKey(final String accountKey, final TenantContext context) {
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 d99f5b8..7c4ab6c 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
@@ -38,6 +38,8 @@ public interface AnalyticsDao {
List<BusinessSubscriptionTransition> getTransitionsByKey(String externalKey, InternalTenantContext context);
+ List<BusinessSubscriptionTransition> getTransitionsForAccount(String accountKey, InternalTenantContext context);
+
List<BusinessInvoice> getInvoicesByKey(String accountKey, InternalTenantContext context);
List<BusinessAccountTag> getTagsForAccount(String accountKey, InternalTenantContext context);
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 7aff8db..5f062fa 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
@@ -47,7 +47,12 @@ public @interface BusinessAccountBinder {
} else {
q.bind("created_date", dateTimeNow.getMillis());
}
- q.bind("updated_date", dateTimeNow.getMillis());
+
+ if (account.getUpdatedDt() != null) {
+ q.bind("updated_date", account.getUpdatedDt().getMillis());
+ } else {
+ q.bind("updated_date", dateTimeNow.getMillis());
+ }
q.bind("account_id", account.getAccountId().toString());
q.bind("account_key", account.getKey());
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 b9eaa54..4c48746 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
@@ -30,9 +30,10 @@ import com.ning.billing.analytics.model.BusinessAccount;
import com.ning.billing.util.dao.MapperBase;
public class BusinessAccountMapper extends MapperBase implements ResultSetMapper<BusinessAccount> {
+
@Override
public BusinessAccount map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
- final BusinessAccount account = new BusinessAccount(
+ return new BusinessAccount(
UUID.fromString(r.getString(1)),
r.getString(2),
r.getString(6),
@@ -43,11 +44,9 @@ public class BusinessAccountMapper extends MapperBase implements ResultSetMapper
r.getString(10),
r.getString(11),
r.getString(12),
- r.getString(13)
+ r.getString(13),
+ new DateTime(r.getLong(3), DateTimeZone.UTC),
+ new DateTime(r.getLong(4), 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 f081a7a..f223626 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
@@ -55,5 +55,9 @@ public interface BusinessAccountSqlDao extends Transactional<BusinessAccountSqlD
@InternalTenantContextBinder final InternalCallContext context);
@SqlUpdate
+ int deleteAccount(@Bind("account_id") final String accountId,
+ @InternalTenantContextBinder final InternalCallContext context);
+
+ @SqlUpdate
void test(@InternalTenantContextBinder final InternalTenantContext context);
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemSqlDao.java
index 1ff220b..c464094 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemSqlDao.java
@@ -56,5 +56,9 @@ public interface BusinessInvoiceItemSqlDao extends Transactional<BusinessInvoice
@InternalTenantContextBinder final InternalCallContext context);
@SqlUpdate
+ void deleteInvoiceItemsForAccount(@Bind("account_id") final String accountId,
+ @InternalTenantContextBinder final InternalCallContext context);
+
+ @SqlUpdate
void test(@InternalTenantContextBinder final InternalTenantContext context);
}
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 6706537..0e65c7b 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
@@ -47,6 +47,10 @@ public interface BusinessSubscriptionTransitionSqlDao extends Transactional<Busi
List<BusinessSubscriptionTransition> getTransitionForSubscription(@Bind("subscription_id") final String subscriptionId,
@InternalTenantContextBinder final InternalTenantContext context);
+ @SqlQuery
+ List<BusinessSubscriptionTransition> getTransitionsForAccount(@Bind("account_key") final String accountKey,
+ @InternalTenantContextBinder final InternalTenantContext context);
+
@SqlUpdate
int createTransition(@BusinessSubscriptionTransitionBinder final BusinessSubscriptionTransition transition,
@InternalTenantContextBinder final InternalCallContext context);
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 59e9af8..e91c988 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
@@ -79,6 +79,11 @@ public class DefaultAnalyticsDao implements AnalyticsDao {
}
@Override
+ public List<BusinessSubscriptionTransition> getTransitionsForAccount(final String accountKey, final InternalTenantContext context) {
+ return subscriptionTransitionSqlDao.getTransitionsForAccount(accountKey, context);
+ }
+
+ @Override
public List<BusinessInvoice> getInvoicesByKey(final String accountKey, final InternalTenantContext context) {
return invoiceSqlDao.getInvoicesForAccountByKey(accountKey, context);
}
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 66459f1..187b522 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
@@ -22,16 +22,13 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
+import com.ning.billing.account.api.Account;
import com.ning.billing.analytics.utils.Rounder;
import com.google.common.base.Objects;
public class BusinessAccount {
- // Populated by the database
- private DateTime createdDt = null;
- private DateTime updatedDt = null;
-
private final UUID accountId;
private String key;
private String name;
@@ -43,15 +40,13 @@ public class BusinessAccount {
private String creditCardType;
private String billingAddressCountry;
private String currency;
-
- public BusinessAccount(final UUID accountId) {
- this.accountId = accountId;
- }
+ private DateTime createdDt;
+ private DateTime updatedDt;
public BusinessAccount(final UUID accountId, final String key, final String name, final BigDecimal balance,
final LocalDate lastInvoiceDate, final BigDecimal totalInvoiceBalance, final String lastPaymentStatus,
final String paymentMethod, final String creditCardType, final String billingAddressCountry,
- final String currency) {
+ final String currency, final DateTime createdDt, final DateTime updatedDt) {
this.accountId = accountId;
this.key = key;
this.balance = balance;
@@ -63,6 +58,19 @@ public class BusinessAccount {
this.paymentMethod = paymentMethod;
this.totalInvoiceBalance = totalInvoiceBalance;
this.currency = currency;
+ this.createdDt = createdDt;
+ this.updatedDt = updatedDt;
+ }
+
+ public BusinessAccount(final Account account) {
+ this.accountId = account.getId();
+ this.name = account.getName();
+ this.key = account.getExternalKey();
+ if (account.getCurrency() != null) {
+ this.currency = account.getCurrency().toString();
+ }
+ this.createdDt = account.getCreatedDate();
+ this.updatedDt = account.getUpdatedDate();
}
public UUID getAccountId() {
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 891ebcb..8becca2 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
@@ -20,7 +20,6 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import com.ning.billing.analytics.utils.Rounder;
@@ -28,6 +27,7 @@ import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
public class BusinessInvoice {
+
private final UUID invoiceId;
private final Integer invoiceNumber;
private final DateTime createdDate;
@@ -63,8 +63,8 @@ public class BusinessInvoice {
public BusinessInvoice(final String accountKey, final Invoice invoice) {
this(invoice.getAccountId(), accountKey, invoice.getChargedAmount(), invoice.getCreditAdjAmount(), invoice.getPaidAmount(), invoice.getBalance(),
- new DateTime(DateTimeZone.UTC), invoice.getCurrency(), invoice.getInvoiceDate(), invoice.getId(), invoice.getInvoiceNumber(), invoice.getTargetDate(),
- new DateTime(DateTimeZone.UTC));
+ invoice.getCreatedDate(), invoice.getCurrency(), invoice.getInvoiceDate(), invoice.getId(), invoice.getInvoiceNumber(), invoice.getTargetDate(),
+ invoice.getUpdatedDate());
}
public UUID getAccountId() {
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java
index bad0b96..346a7e4 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java
@@ -22,7 +22,6 @@ import java.util.UUID;
import javax.annotation.Nullable;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import com.ning.billing.analytics.utils.Rounder;
@@ -76,13 +75,13 @@ public class BusinessInvoiceItem {
}
public BusinessInvoiceItem(@Nullable final String externalKey, final InvoiceItem invoiceItem, @Nullable final Plan plan, @Nullable final PlanPhase planPhase) {
- this(invoiceItem.getAmount(), planPhase != null ? planPhase.getBillingPeriod().toString() : null, new DateTime(DateTimeZone.UTC), invoiceItem.getCurrency(),
+ this(invoiceItem.getAmount(), planPhase != null ? planPhase.getBillingPeriod().toString() : null, invoiceItem.getCreatedDate(), invoiceItem.getCurrency(),
/* Populate end date for fixed items for convenience (null in invoice_items table) */
(invoiceItem.getEndDate() == null && planPhase != null) ? invoiceItem.getStartDate().plus(planPhase.getDuration().toJodaPeriod()) : invoiceItem.getEndDate(),
externalKey, invoiceItem.getInvoiceId(), invoiceItem.getId(), invoiceItem.getLinkedItemId(), invoiceItem.getInvoiceItemType().toString(),
planPhase != null ? planPhase.getPhaseType().toString() : null, plan != null ? plan.getProduct().getCategory().toString() : null,
plan != null ? plan.getProduct().getName() : null, plan != null ? plan.getProduct().getCatalogName() : null,
- planPhase != null ? planPhase.getName() : null, invoiceItem.getStartDate(), new DateTime(DateTimeZone.UTC));
+ planPhase != null ? planPhase.getName() : null, invoiceItem.getStartDate(), invoiceItem.getUpdatedDate());
}
public DateTime getCreatedDate() {
diff --git a/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java b/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
index 1f4e3c9..7c9e1fd 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
@@ -17,9 +17,9 @@
package com.ning.billing.analytics.setup;
import com.ning.billing.analytics.AnalyticsListener;
-import com.ning.billing.analytics.BusinessAccountRecorder;
-import com.ning.billing.analytics.BusinessSubscriptionTransitionRecorder;
-import com.ning.billing.analytics.BusinessTagRecorder;
+import com.ning.billing.analytics.BusinessAccountDao;
+import com.ning.billing.analytics.BusinessSubscriptionTransitionDao;
+import com.ning.billing.analytics.BusinessTagDao;
import com.ning.billing.analytics.api.AnalyticsService;
import com.ning.billing.analytics.api.DefaultAnalyticsService;
import com.ning.billing.analytics.api.user.AnalyticsUserApi;
@@ -61,9 +61,9 @@ public class AnalyticsModule extends AbstractModule {
bind(BusinessSubscriptionTransitionSqlDao.class).toProvider(new BusinessSqlProvider<BusinessSubscriptionTransitionSqlDao>(BusinessSubscriptionTransitionSqlDao.class));
bind(BusinessSubscriptionTransitionTagSqlDao.class).toProvider(new BusinessSqlProvider<BusinessSubscriptionTransitionTagSqlDao>(BusinessSubscriptionTransitionTagSqlDao.class));
- bind(BusinessSubscriptionTransitionRecorder.class).asEagerSingleton();
- bind(BusinessAccountRecorder.class).asEagerSingleton();
- bind(BusinessTagRecorder.class).asEagerSingleton();
+ bind(BusinessSubscriptionTransitionDao.class).asEagerSingleton();
+ bind(BusinessAccountDao.class).asEagerSingleton();
+ bind(BusinessTagDao.class).asEagerSingleton();
bind(AnalyticsListener.class).asEagerSingleton();
bind(AnalyticsDao.class).to(DefaultAnalyticsDao.class).asEagerSingleton();
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 3fab53f..07e1b96 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
@@ -114,6 +114,10 @@ saveAccount() ::= <<
;
>>
+deleteAccount(account_id) ::= <<
+delete from bac where account_id = :account_id <AND_CHECK_TENANT()>;
+>>
+
test() ::= <<
select 1 from bac where <CHECK_TENANT()>;
>>
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceItemSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceItemSqlDao.sql.stg
index 8fe8ad5..3d6fb5d 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceItemSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoiceItemSqlDao.sql.stg
@@ -1,7 +1,7 @@
group BusinessInvoiceItem;
-CHECK_TENANT() ::= "tenant_record_id = :tenantRecordId"
-AND_CHECK_TENANT() ::= "AND <CHECK_TENANT()>"
+CHECK_TENANT(prefix) ::= "<prefix>tenant_record_id = :tenantRecordId"
+AND_CHECK_TENANT(prefix) ::= "AND <CHECK_TENANT(prefix)>"
getInvoiceItem(item_id) ::= <<
select
@@ -132,6 +132,10 @@ deleteInvoiceItem(item_id) ::= <<
delete from bii where item_id = :item_id <AND_CHECK_TENANT()>;
>>
+deleteInvoiceItemsForAccount(account_id) ::= <<
+delete from bii where bii.invoice_id in (select invoice_id from bin where bin.account_id = :account_id <AND_CHECK_TENANT("bin.")> for update) <AND_CHECK_TENANT("bii.")>;
+>>
+
test() ::= <<
select 1 from bii where <CHECK_TENANT()>;
>>
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 8649840..8f85dd6 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
@@ -101,6 +101,48 @@ getTransitionForSubscription(subscription_id) ::= <<
;
>>
+getTransitionsForAccount(account_id) ::= <<
+ select
+ total_ordering
+ , bundle_id
+ , external_key
+ , account_id
+ , account_key
+ , subscription_id
+ , requested_timestamp
+ , event
+ , prev_product_name
+ , prev_product_type
+ , prev_product_category
+ , prev_slug
+ , prev_phase
+ , prev_billing_period
+ , prev_price
+ , prev_price_list
+ , prev_mrr
+ , prev_currency
+ , prev_start_date
+ , prev_state
+ , next_product_name
+ , next_product_type
+ , next_product_category
+ , next_slug
+ , next_phase
+ , next_billing_period
+ , next_price
+ , next_price_list
+ , next_mrr
+ , next_currency
+ , next_start_date
+ , next_state
+ , tenant_record_id
+ from bst
+ where account_key = :account_key
+ <AND_CHECK_TENANT()>
+ order by requested_timestamp asc
+ ;
+>>
+
createTransition() ::= <<
insert into bst(
total_ordering
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 ad14c3e..5ec0dbd 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
@@ -79,9 +79,9 @@ import com.ning.billing.payment.api.PaymentStatus;
import com.ning.billing.payment.dao.PaymentAttemptModelDao;
import com.ning.billing.payment.dao.PaymentDao;
import com.ning.billing.payment.dao.PaymentModelDao;
-import com.ning.billing.util.svcsapi.bus.Bus;
import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.util.svcsapi.bus.Bus;
import com.google.inject.Inject;
@@ -224,9 +224,8 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
private void createInvoiceAndPaymentCreationEvents(final Account account) {
final DefaultInvoice invoice = new DefaultInvoice(account.getId(), clock.getUTCToday(), clock.getUTCToday(), ACCOUNT_CURRENCY);
- final FixedPriceInvoiceItem invoiceItem = new FixedPriceInvoiceItem(
- UUID.randomUUID(), invoice.getId(), account.getId(), UUID.randomUUID(), UUID.randomUUID(), "somePlan", "somePhase", clock.getUTCToday(),
- INVOICE_AMOUNT, ACCOUNT_CURRENCY);
+ final FixedPriceInvoiceItem invoiceItem = new FixedPriceInvoiceItem(invoice.getId(), account.getId(), UUID.randomUUID(), UUID.randomUUID(), "somePlan", "somePhase", clock.getUTCToday(),
+ INVOICE_AMOUNT, ACCOUNT_CURRENCY);
invoice.addInvoiceItem(invoiceItem);
invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), true, internalCallContext);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java b/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java
index 70cb427..6012be1 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java
@@ -27,6 +27,12 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
+import com.ning.billing.analytics.BusinessAccountDao;
+import com.ning.billing.analytics.BusinessInvoiceDao;
+import com.ning.billing.analytics.BusinessInvoicePaymentDao;
+import com.ning.billing.analytics.BusinessOverdueStatusDao;
+import com.ning.billing.analytics.BusinessSubscriptionTransitionDao;
+import com.ning.billing.analytics.BusinessTagDao;
import com.ning.billing.analytics.MockDuration;
import com.ning.billing.analytics.MockPhase;
import com.ning.billing.analytics.MockProduct;
@@ -53,10 +59,13 @@ import com.ning.billing.catalog.api.Product;
import com.ning.billing.catalog.api.ProductCategory;
import com.ning.billing.entitlement.api.user.Subscription;
import com.ning.billing.mock.MockPlan;
+import com.ning.billing.payment.api.PaymentApi;
import com.ning.billing.util.callcontext.InternalCallContextFactory;
import com.ning.billing.util.callcontext.TenantContext;
import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.clock.ClockMock;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
public class TestDefaultAnalyticsUserApi extends AnalyticsTestSuiteWithEmbeddedDB {
@@ -85,13 +94,23 @@ public class TestDefaultAnalyticsUserApi extends AnalyticsTestSuiteWithEmbeddedD
final AnalyticsDao analyticsDao = new DefaultAnalyticsDao(accountSqlDao, subscriptionTransitionSqlDao, invoiceSqlDao,
invoiceItemSqlDao, accountTagSqlDao, overdueStatusSqlDao, invoicePaymentSqlDao);
- analyticsUserApi = new DefaultAnalyticsUserApi(analyticsDao, new InternalCallContextFactory(dbi, clock));
+ analyticsUserApi = new DefaultAnalyticsUserApi(analyticsDao,
+ Mockito.mock(BusinessSubscriptionTransitionDao.class),
+ Mockito.mock(BusinessAccountDao.class),
+ Mockito.mock(BusinessInvoiceDao.class),
+ Mockito.mock(BusinessOverdueStatusDao.class),
+ Mockito.mock(BusinessInvoicePaymentDao.class),
+ Mockito.mock(BusinessTagDao.class),
+ Mockito.mock(EntitlementInternalApi.class),
+ Mockito.mock(PaymentApi.class),
+ Mockito.mock(TagInternalApi.class),
+ new InternalCallContextFactory(dbi, clock));
}
@Test(groups = "slow")
public void testAccountsCreatedOverTime() throws Exception {
final BusinessAccount account = new BusinessAccount(UUID.randomUUID(), UUID.randomUUID().toString(), UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
- BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", "USD");
+ BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", "USD", clock.getUTCNow(), clock.getUTCNow());
accountSqlDao.createAccount(account, internalCallContext);
final TimeSeriesData data = analyticsUserApi.getAccountsCreatedOverTime(tenantContext);
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 a0b49fe..a263962 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
@@ -107,7 +107,7 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
private void setupBusinessAccount() {
account = new BusinessAccount(UUID.randomUUID(), ACCOUNT_KEY, UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
- BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", CURRENCY);
+ BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", CURRENCY, clock.getUTCNow(), clock.getUTCNow());
final IDBI dbi = helper.getDBI();
businessAccountSqlDao = dbi.onDemand(BusinessAccountSqlDao.class);
@@ -278,15 +278,11 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
// Create and retrieve an account
businessAccountSqlDao.createAccount(account, internalCallContext);
final BusinessAccount foundAccount = businessAccountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext);
- Assert.assertNotNull(foundAccount.getCreatedDt());
- Assert.assertEquals(foundAccount.getCreatedDt(), foundAccount.getUpdatedDt());
- // Verify the dates by backfilling them
- account.setCreatedDt(foundAccount.getCreatedDt());
- account.setUpdatedDt(foundAccount.getUpdatedDt());
+ Assert.assertEquals(foundAccount.getCreatedDt().getMillis(), account.getCreatedDt().getMillis());
+ Assert.assertEquals(foundAccount.getUpdatedDt().getMillis(), account.getUpdatedDt().getMillis());
Assert.assertTrue(foundAccount.equals(account));
// Try to update the account
- final DateTime previousUpdatedDt = account.getUpdatedDt();
account.setBalance(BigDecimal.TEN);
account.setPaymentMethod("PayPal");
account.setCurrency("CAD");
@@ -296,7 +292,6 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
Assert.assertEquals(Rounder.round(BigDecimal.TEN), account.getRoundedBalance());
Assert.assertEquals("PayPal", account.getPaymentMethod());
Assert.assertEquals("CAD", account.getCurrency());
- Assert.assertTrue(account.getUpdatedDt().compareTo(previousUpdatedDt) > 0);
// ACCOUNT not found
Assert.assertNull(businessAccountSqlDao.getAccountByKey("Doesn't exist", internalCallContext));
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 58d3148..1cc7c31 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
@@ -60,6 +60,11 @@ public class MockBusinessSubscriptionTransitionSqlDao implements BusinessSubscri
}
@Override
+ public List<BusinessSubscriptionTransition> getTransitionsForAccount(@Bind("account_id") final String accountId, @InternalTenantContextBinder final InternalTenantContext context) {
+ return ImmutableList.<BusinessSubscriptionTransition>of();
+ }
+
+ @Override
public int createTransition(@BusinessSubscriptionTransitionBinder final BusinessSubscriptionTransition transition,
@InternalTenantContextBinder final InternalCallContext context) {
if (content.get(transition.getExternalKey()) == null) {
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 8629bce..dfd5b5d 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
@@ -19,10 +19,12 @@ package com.ning.billing.analytics.model;
import java.math.BigDecimal;
import java.util.UUID;
+import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import com.ning.billing.account.api.Account;
import com.ning.billing.analytics.AnalyticsTestSuite;
import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.clock.DefaultClock;
@@ -36,7 +38,8 @@ public class TestBusinessAccount extends AnalyticsTestSuite {
@BeforeMethod(groups = "fast")
public void setUp() throws Exception {
account = new BusinessAccount(UUID.randomUUID(), "pierre", UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
- BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "", UUID.randomUUID().toString());
+ BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "", UUID.randomUUID().toString(),
+ clock.getUTCNow(), clock.getUTCNow());
}
@Test(groups = "fast")
@@ -48,13 +51,14 @@ public class TestBusinessAccount extends AnalyticsTestSuite {
final BusinessAccount otherAccount = new BusinessAccount(UUID.randomUUID(), "pierre cardin", UUID.randomUUID().toString(),
BigDecimal.ONE, clock.getUTCToday(),
BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa",
- "", UUID.randomUUID().toString());
+ "", UUID.randomUUID().toString(), clock.getUTCNow(), clock.getUTCNow());
Assert.assertFalse(account.equals(otherAccount));
}
@Test(groups = "fast")
public void testDefaultBigDecimalValues() throws Exception {
- final BusinessAccount bac = new BusinessAccount(UUID.randomUUID());
+ final Account account = Mockito.mock(Account.class);
+ final BusinessAccount bac = new BusinessAccount(account);
Assert.assertEquals(bac.getBalance(), BigDecimal.ZERO);
Assert.assertEquals(bac.getTotalInvoiceBalance(), BigDecimal.ZERO);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessInvoiceRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessInvoiceRecorder.java
index fce78b9..ceebb20 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessInvoiceRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessInvoiceRecorder.java
@@ -24,29 +24,29 @@ import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
-import com.ning.billing.account.api.AccountUserApi;
import com.ning.billing.analytics.dao.BusinessInvoiceSqlDao;
import com.ning.billing.analytics.model.BusinessInvoiceItem;
import com.ning.billing.catalog.MockCatalog;
import com.ning.billing.catalog.MockCatalogService;
import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceItemType;
-import com.ning.billing.invoice.api.InvoiceUserApi;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
+import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
public class TestBusinessInvoiceRecorder extends AnalyticsTestSuite {
- private final AccountUserApi accountApi = Mockito.mock(AccountUserApi.class);
- private final EntitlementUserApi entitlementApi = Mockito.mock(EntitlementUserApi.class);
- private final InvoiceUserApi invoiceApi = Mockito.mock(InvoiceUserApi.class);
+ private final AccountInternalApi accountApi = Mockito.mock(AccountInternalApi.class);
+ private final EntitlementInternalApi entitlementApi = Mockito.mock(EntitlementInternalApi.class);
+ private final InvoiceInternalApi invoiceApi = Mockito.mock(InvoiceInternalApi.class);
+ private final BusinessAccountDao bacDao = Mockito.mock(BusinessAccountDao.class);
private final BusinessInvoiceSqlDao sqlDao = Mockito.mock(BusinessInvoiceSqlDao.class);
- private final Clock clock = Mockito.mock(Clock.class);
@Test(groups = "fast")
public void testShouldBeAbleToHandleNullFieldsInInvoiceItem() throws Exception {
- final BusinessInvoiceRecorder recorder = new BusinessInvoiceRecorder(accountApi, entitlementApi, invoiceApi, sqlDao, new MockCatalogService(new MockCatalog()), clock);
+ final BusinessInvoiceDao dao = new BusinessInvoiceDao(accountApi, entitlementApi, invoiceApi, bacDao,
+ sqlDao, new MockCatalogService(new MockCatalog()));
final InvoiceItem invoiceItem = Mockito.mock(InvoiceItem.class);
Mockito.when(invoiceItem.getAmount()).thenReturn(BigDecimal.TEN);
@@ -59,7 +59,7 @@ public class TestBusinessInvoiceRecorder extends AnalyticsTestSuite {
Mockito.when(invoiceItem.getStartDate()).thenReturn(new LocalDate(1985, 9, 10));
Mockito.when(invoiceItem.getInvoiceItemType()).thenReturn(InvoiceItemType.CREDIT_ADJ);
- final BusinessInvoiceItem bii = recorder.createBusinessInvoiceItem(invoiceItem, internalCallContext);
+ final BusinessInvoiceItem bii = dao.createBusinessInvoiceItem(invoiceItem, internalCallContext);
Assert.assertNotNull(bii);
Assert.assertEquals(bii.getAmount(), invoiceItem.getAmount());
Assert.assertEquals(bii.getCurrency(), invoiceItem.getCurrency());
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 0d1afe8..b36e075 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
@@ -25,18 +25,18 @@ import org.testng.Assert;
import org.testng.annotations.Test;
import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountUserApi;
import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionSqlDao;
import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
import com.ning.billing.catalog.api.Catalog;
import com.ning.billing.catalog.api.CatalogService;
import com.ning.billing.entitlement.api.SubscriptionTransitionType;
import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
import com.ning.billing.entitlement.api.user.Subscription;
import com.ning.billing.entitlement.api.user.SubscriptionBundle;
-import com.ning.billing.util.callcontext.TenantContext;
+import com.ning.billing.util.callcontext.InternalTenantContext;
import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
import com.google.common.collect.ImmutableList;
@@ -61,14 +61,14 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
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(), Mockito.<TenantContext>any())).thenReturn(bundle);
+ final EntitlementInternalApi entitlementApi = Mockito.mock(EntitlementInternalApi.class);
+ Mockito.when(entitlementApi.getBundleFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(bundle);
// Setup the account API
final Account account = Mockito.mock(Account.class);
Mockito.when(account.getExternalKey()).thenReturn(externalKey.toString());
- final AccountUserApi accountApi = Mockito.mock(AccountUserApi.class);
- Mockito.when(accountApi.getAccountById(Mockito.eq(bundle.getAccountId()), Mockito.<TenantContext>any())).thenReturn(account);
+ final AccountInternalApi accountApi = Mockito.mock(AccountInternalApi.class);
+ Mockito.when(accountApi.getAccountById(Mockito.eq(bundle.getAccountId()), Mockito.<InternalTenantContext>any())).thenReturn(account);
// Create an new subscription event
final EffectiveSubscriptionEvent eventEffective = Mockito.mock(EffectiveSubscriptionEvent.class);
@@ -83,10 +83,10 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
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(), Mockito.<TenantContext>any())).thenReturn(ImmutableList.<Subscription>of(subscription));
+ Mockito.when(entitlementApi.getSubscriptionsForBundle(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(ImmutableList.<Subscription>of(subscription));
- final BusinessSubscriptionTransitionRecorder recorder = new BusinessSubscriptionTransitionRecorder(sqlDao, catalogService, entitlementApi, accountApi, new DefaultClock());
- recorder.rebuildTransitionsForBundle(bundle.getId(), internalCallContext);
+ final BusinessSubscriptionTransitionDao dao = new BusinessSubscriptionTransitionDao(sqlDao, catalogService, entitlementApi, accountApi, new DefaultClock());
+ dao.rebuildTransitionsForBundle(bundle.getId(), internalCallContext);
Assert.assertEquals(sqlDao.getTransitionsByKey(externalKey.toString(), internalCallContext).size(), 1);
final BusinessSubscriptionTransition transition = sqlDao.getTransitionsByKey(externalKey.toString(), internalCallContext).get(0);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java
index 51700d1..a033a2c 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java
@@ -27,6 +27,7 @@ import org.testng.annotations.Test;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.account.api.svcs.DefaultAccountInternalApi;
import com.ning.billing.account.api.user.DefaultAccountUserApi;
import com.ning.billing.account.dao.AccountDao;
import com.ning.billing.account.dao.AccountEmailDao;
@@ -42,6 +43,7 @@ import com.ning.billing.catalog.api.Currency;
import com.ning.billing.catalog.io.VersionedCatalogLoader;
import com.ning.billing.config.CatalogConfig;
import com.ning.billing.entitlement.alignment.PlanAligner;
+import com.ning.billing.entitlement.api.svcs.DefaultEntitlementInternalApi;
import com.ning.billing.entitlement.api.user.DefaultEntitlementUserApi;
import com.ning.billing.entitlement.api.user.DefaultSubscriptionApiService;
import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory;
@@ -58,15 +60,20 @@ import com.ning.billing.util.clock.ClockMock;
import com.ning.billing.util.clock.DefaultClock;
import com.ning.billing.util.dao.ObjectType;
import com.ning.billing.util.notificationq.DefaultNotificationQueueService;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
public class TestBusinessTagRecorder extends AnalyticsTestSuiteWithEmbeddedDB {
+
private BusinessAccountTagSqlDao accountTagSqlDao;
private BusinessSubscriptionTransitionTagSqlDao subscriptionTransitionTagSqlDao;
private InMemoryBus eventBus;
private DefaultCallContextFactory callContextFactory;
+ private AccountInternalApi accountApi;
private AccountUserApi accountUserApi;
+ private EntitlementInternalApi entitlementApi;
private EntitlementUserApi entitlementUserApi;
- private BusinessTagRecorder tagRecorder;
+ private BusinessTagDao tagDao;
@BeforeMethod(groups = "slow")
public void setUp() throws Exception {
@@ -81,6 +88,7 @@ public class TestBusinessTagRecorder extends AnalyticsTestSuiteWithEmbeddedDB {
final DefaultClock clock = new DefaultClock();
callContextFactory = new DefaultCallContextFactory(clock);
final InternalCallContextFactory internalCallContextFactory = new InternalCallContextFactory(dbi, clock);
+ accountApi = new DefaultAccountInternalApi(accountDao, accountEmailDao);
accountUserApi = new DefaultAccountUserApi(callContextFactory, internalCallContextFactory, accountDao, accountEmailDao);
final CatalogService catalogService = new DefaultCatalogService(Mockito.mock(CatalogConfig.class), Mockito.mock(VersionedCatalogLoader.class));
final AddonUtils addonUtils = new AddonUtils(catalogService);
@@ -89,10 +97,10 @@ public class TestBusinessTagRecorder extends AnalyticsTestSuiteWithEmbeddedDB {
final PlanAligner planAligner = new PlanAligner(catalogService);
final DefaultSubscriptionApiService apiService = new DefaultSubscriptionApiService(clock, entitlementDao, catalogService, planAligner, internalCallContextFactory);
final DefaultSubscriptionFactory subscriptionFactory = new DefaultSubscriptionFactory(apiService, clock, catalogService);
- entitlementUserApi = new DefaultEntitlementUserApi(clock, entitlementDao, catalogService,
- apiService, subscriptionFactory, addonUtils, internalCallContextFactory);
- tagRecorder = new BusinessTagRecorder(accountTagSqlDao, invoicePaymentTagSqlDao, invoiceTagSqlDao, subscriptionTransitionTagSqlDao,
- accountUserApi, entitlementUserApi);
+ entitlementApi = new DefaultEntitlementInternalApi(entitlementDao, subscriptionFactory);
+ entitlementUserApi = new DefaultEntitlementUserApi(clock, entitlementDao, catalogService, apiService, subscriptionFactory, addonUtils, internalCallContextFactory);
+ tagDao = new BusinessTagDao(accountTagSqlDao, invoicePaymentTagSqlDao, invoiceTagSqlDao, subscriptionTransitionTagSqlDao,
+ accountApi, entitlementApi);
eventBus.start();
}
@@ -115,9 +123,9 @@ public class TestBusinessTagRecorder extends AnalyticsTestSuiteWithEmbeddedDB {
final UUID accountId = account.getId();
Assert.assertEquals(accountTagSqlDao.getTagsForAccountByKey(accountKey, internalCallContext).size(), 0);
- tagRecorder.tagAdded(ObjectType.ACCOUNT, accountId, name, internalCallContext);
+ tagDao.tagAdded(ObjectType.ACCOUNT, accountId, name, internalCallContext);
Assert.assertEquals(accountTagSqlDao.getTagsForAccountByKey(accountKey, internalCallContext).size(), 1);
- tagRecorder.tagRemoved(ObjectType.ACCOUNT, accountId, name, internalCallContext);
+ tagDao.tagRemoved(ObjectType.ACCOUNT, accountId, name, internalCallContext);
Assert.assertEquals(accountTagSqlDao.getTagsForAccountByKey(accountKey, internalCallContext).size(), 0);
}
@@ -134,9 +142,9 @@ public class TestBusinessTagRecorder extends AnalyticsTestSuiteWithEmbeddedDB {
final UUID bundleId = bundle.getId();
Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransitionByKey(externalKey, internalCallContext).size(), 0);
- tagRecorder.tagAdded(ObjectType.BUNDLE, bundleId, name, internalCallContext);
+ tagDao.tagAdded(ObjectType.BUNDLE, bundleId, name, internalCallContext);
Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransitionByKey(externalKey, internalCallContext).size(), 1);
- tagRecorder.tagRemoved(ObjectType.BUNDLE, bundleId, name, internalCallContext);
+ tagDao.tagRemoved(ObjectType.BUNDLE, bundleId, name, internalCallContext);
Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransitionByKey(externalKey, internalCallContext).size(), 0);
}
}
api/pom.xml 2(+1 -1)
diff --git a/api/pom.xml b/api/pom.xml
index 07ce0c3..c3a391a 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-api</artifactId>
diff --git a/api/src/main/java/com/ning/billing/analytics/api/user/AnalyticsUserApi.java b/api/src/main/java/com/ning/billing/analytics/api/user/AnalyticsUserApi.java
index cbdea9b..ba5ae0f 100644
--- a/api/src/main/java/com/ning/billing/analytics/api/user/AnalyticsUserApi.java
+++ b/api/src/main/java/com/ning/billing/analytics/api/user/AnalyticsUserApi.java
@@ -16,7 +16,9 @@
package com.ning.billing.analytics.api.user;
+import com.ning.billing.account.api.Account;
import com.ning.billing.analytics.api.TimeSeriesData;
+import com.ning.billing.util.callcontext.CallContext;
import com.ning.billing.util.callcontext.TenantContext;
public interface AnalyticsUserApi {
@@ -32,4 +34,12 @@ public interface AnalyticsUserApi {
* @return the number of new subscriptions created per day (transfers not included)
*/
public TimeSeriesData getSubscriptionsCreatedOverTime(String productType, String slug, TenantContext context);
+
+ /**
+ * Rebuild all analytics tables for an account
+ *
+ * @param account account
+ * @param context call context
+ */
+ void rebuildAnalyticsForAccount(Account account, CallContext context);
}
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentMethod.java b/api/src/main/java/com/ning/billing/payment/api/PaymentMethod.java
index dfe9668..afbc076 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentMethod.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentMethod.java
@@ -17,8 +17,9 @@ package com.ning.billing.payment.api;
import java.util.UUID;
+import com.ning.billing.util.entity.Entity;
-public interface PaymentMethod {
+public interface PaymentMethod extends Entity {
public UUID getId();
diff --git a/api/src/main/java/com/ning/billing/util/entity/Entity.java b/api/src/main/java/com/ning/billing/util/entity/Entity.java
index f363534..83b2151 100644
--- a/api/src/main/java/com/ning/billing/util/entity/Entity.java
+++ b/api/src/main/java/com/ning/billing/util/entity/Entity.java
@@ -18,6 +18,13 @@ package com.ning.billing.util.entity;
import java.util.UUID;
+import org.joda.time.DateTime;
+
public interface Entity {
+
public UUID getId();
+
+ public DateTime getCreatedDate();
+
+ public DateTime getUpdatedDate();
}
beatrix/pom.xml 2(+1 -1)
diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index 1bdf49c..72af665 100644
--- a/beatrix/pom.xml
+++ b/beatrix/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-beatrix</artifactId>
catalog/pom.xml 2(+1 -1)
diff --git a/catalog/pom.xml b/catalog/pom.xml
index 9e1d5d6..31e70ba 100644
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-catalog</artifactId>
entitlement/pom.xml 2(+1 -1)
diff --git a/entitlement/pom.xml b/entitlement/pom.xml
index 8f8fc60..93711c4 100644
--- a/entitlement/pom.xml
+++ b/entitlement/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-entitlement</artifactId>
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionFactory.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionFactory.java
index 599c65e..edb6b7a 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionFactory.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionFactory.java
@@ -33,6 +33,7 @@ import com.ning.billing.util.clock.Clock;
import com.google.inject.Inject;
public class DefaultSubscriptionFactory implements SubscriptionFactory {
+
private final SubscriptionApiService apiService;
private final Clock clock;
private final CatalogService catalogService;
@@ -54,8 +55,11 @@ public class DefaultSubscriptionFactory implements SubscriptionFactory {
}
public static class SubscriptionBuilder {
+
private UUID id;
private UUID bundleId;
+ private DateTime createdDate;
+ private DateTime updatedDate;
private DateTime alignStartDate;
private DateTime bundleStartDate;
private Long activeVersion;
@@ -83,6 +87,16 @@ public class DefaultSubscriptionFactory implements SubscriptionFactory {
return this;
}
+ public SubscriptionBuilder setCreatedDate(final DateTime createdDate) {
+ this.createdDate = createdDate;
+ return this;
+ }
+
+ public SubscriptionBuilder setUpdatedDate(final DateTime updatedDate) {
+ this.updatedDate = updatedDate;
+ return this;
+ }
+
public SubscriptionBuilder setBundleId(final UUID bundleId) {
this.bundleId = bundleId;
return this;
@@ -122,6 +136,14 @@ public class DefaultSubscriptionFactory implements SubscriptionFactory {
return id;
}
+ public DateTime getCreatedDate() {
+ return createdDate;
+ }
+
+ public DateTime getUpdatedDate() {
+ return updatedDate;
+ }
+
public UUID getBundleId() {
return bundleId;
}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java
index 3722b4b..87516f4 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java
@@ -26,9 +26,12 @@ import com.ning.billing.junction.api.BlockingState;
import com.ning.billing.overdue.OverdueState;
public class SubscriptionBundleData implements SubscriptionBundle {
+
private final UUID id;
private final String key;
private final UUID accountId;
+ private final DateTime createdDate;
+ private final DateTime updatedDate;
private final DateTime lastSysTimeUpdate;
private final OverdueState<SubscriptionBundle> overdueState;
@@ -46,6 +49,10 @@ public class SubscriptionBundleData implements SubscriptionBundle {
this.accountId = accountId;
this.lastSysTimeUpdate = lastSysUpdate;
this.overdueState = overdueState;
+
+ // TODO add column in bundles table
+ createdDate = null;
+ updatedDate = null;
}
@Override
@@ -59,6 +66,16 @@ public class SubscriptionBundleData implements SubscriptionBundle {
}
@Override
+ public DateTime getCreatedDate() {
+ return createdDate;
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return updatedDate;
+ }
+
+ @Override
public UUID getAccountId() {
return accountId;
}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
index 59d67e9..b0ba8ea 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
@@ -55,6 +55,7 @@ import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.entity.EntityBase;
public class SubscriptionData extends EntityBase implements Subscription {
+
private static final Logger log = LoggerFactory.getLogger(SubscriptionData.class);
private final Clock clock;
@@ -88,9 +89,8 @@ public class SubscriptionData extends EntityBase implements Subscription {
this(builder, null, null);
}
- public SubscriptionData(final SubscriptionBuilder builder,
- @Nullable final SubscriptionApiService apiService, @Nullable final Clock clock) {
- super(builder.getId());
+ public SubscriptionData(final SubscriptionBuilder builder, @Nullable final SubscriptionApiService apiService, @Nullable final Clock clock) {
+ super(builder.getId(), builder.getCreatedDate(), builder.getUpdatedDate());
this.apiService = apiService;
this.clock = clock;
this.bundleId = builder.getBundleId();
@@ -115,7 +115,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
@Override
public SubscriptionState getState() {
return (getPreviousTransition() == null) ? null
- : getPreviousTransition().getNextState();
+ : getPreviousTransition().getNextState();
}
@Override
@@ -125,32 +125,32 @@ public class SubscriptionData extends EntityBase implements Subscription {
}
final SubscriptionTransitionData initialTransition = transitions.get(0);
switch (initialTransition.getApiEventType()) {
- case MIGRATE_BILLING:
- case MIGRATE_ENTITLEMENT:
- return SubscriptionSourceType.MIGRATED;
- case TRANSFER:
- return SubscriptionSourceType.TRANSFERED;
- default:
- return SubscriptionSourceType.NATIVE;
+ case MIGRATE_BILLING:
+ case MIGRATE_ENTITLEMENT:
+ return SubscriptionSourceType.MIGRATED;
+ case TRANSFER:
+ return SubscriptionSourceType.TRANSFERED;
+ default:
+ return SubscriptionSourceType.NATIVE;
}
}
@Override
public PlanPhase getCurrentPhase() {
return (getPreviousTransitionData() == null) ? null
- : getPreviousTransitionData().getNextPhase();
+ : getPreviousTransitionData().getNextPhase();
}
@Override
public Plan getCurrentPlan() {
return (getPreviousTransitionData() == null) ? null
- : getPreviousTransitionData().getNextPlan();
+ : getPreviousTransitionData().getNextPlan();
}
@Override
public PriceList getCurrentPriceList() {
return (getPreviousTransitionData() == null) ? null :
- getPreviousTransitionData().getNextPriceList();
+ getPreviousTransitionData().getNextPriceList();
}
@@ -180,7 +180,6 @@ public class SubscriptionData extends EntityBase implements Subscription {
return null;
}
-
@Override
public boolean cancel(final DateTime requestedDate, final CallContext context) throws EntitlementUserApiException {
return apiService.cancel(this, requestedDate, context);
@@ -193,25 +192,25 @@ public class SubscriptionData extends EntityBase implements Subscription {
@Override
public boolean uncancel(final CallContext context)
- throws EntitlementUserApiException {
+ throws EntitlementUserApiException {
return apiService.uncancel(this, context);
}
@Override
public boolean changePlan(final String productName, final BillingPeriod term, final String priceList,
- final DateTime requestedDate, final CallContext context) throws EntitlementUserApiException {
+ final DateTime requestedDate, final CallContext context) throws EntitlementUserApiException {
return apiService.changePlan(this, productName, term, priceList, requestedDate, context);
}
@Override
public boolean changePlanWithPolicy(final String productName, final BillingPeriod term, final String priceList,
- final DateTime requestedDate, final ActionPolicy policy, final CallContext context) throws EntitlementUserApiException {
+ final DateTime requestedDate, final ActionPolicy policy, final CallContext context) throws EntitlementUserApiException {
return apiService.changePlanWithPolicy(this, productName, term, priceList, requestedDate, policy, context);
}
@Override
public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate,
- final CallContext context) throws EntitlementUserApiException {
+ final CallContext context) throws EntitlementUserApiException {
return apiService.recreatePlan(this, spec, requestedDate, context);
}
@@ -322,7 +321,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
final int prime = 31;
int result = 1;
result = prime * result
- + ((id == null) ? 0 : id.hashCode());
+ + ((id == null) ? 0 : id.hashCode());
return result;
}
@@ -381,7 +380,6 @@ public class SubscriptionData extends EntityBase implements Subscription {
return alignStartDate;
}
-
public long getLastEventOrderedId() {
final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(
clock, transitions, Order.DESC_FROM_FUTURE, Kind.ENTITLEMENT,
@@ -414,19 +412,19 @@ public class SubscriptionData extends EntityBase implements Subscription {
}
final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(clock,
- transitions,
- Order.DESC_FROM_FUTURE,
- Kind.ENTITLEMENT,
- Visibility.ALL,
- TimeLimit.PAST_OR_PRESENT_ONLY);
+ transitions,
+ Order.DESC_FROM_FUTURE,
+ Kind.ENTITLEMENT,
+ Visibility.ALL,
+ TimeLimit.PAST_OR_PRESENT_ONLY);
while (it.hasNext()) {
final SubscriptionTransitionData cur = it.next();
if (cur.getTransitionType() == SubscriptionTransitionType.CREATE
- || cur.getTransitionType() == SubscriptionTransitionType.RE_CREATE
- || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
- || cur.getTransitionType() == SubscriptionTransitionType.CHANGE
- || cur.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT) {
+ || cur.getTransitionType() == SubscriptionTransitionType.RE_CREATE
+ || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
+ || cur.getTransitionType() == SubscriptionTransitionType.CHANGE
+ || cur.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT) {
return cur;
}
}
@@ -434,13 +432,12 @@ public class SubscriptionData extends EntityBase implements Subscription {
throw new EntitlementError(String.format("Failed to find InitialTransitionForCurrentPlan id = %s", getId()));
}
-
public boolean isSubscriptionFutureCancelled() {
return getFutureEndDate() != null;
}
public DateTime getPlanChangeEffectiveDate(final ActionPolicy policy,
- final DateTime requestedDate) {
+ final DateTime requestedDate) {
if (policy == ActionPolicy.IMMEDIATE) {
return requestedDate;
@@ -454,7 +451,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
return requestedDate;
} else {
return chargedThroughDate.isBefore(requestedDate) ? requestedDate
- : chargedThroughDate;
+ : chargedThroughDate;
}
}
@@ -471,11 +468,11 @@ public class SubscriptionData extends EntityBase implements Subscription {
final SubscriptionTransitionData cur = it.next();
if (cur.getTransitionType() == SubscriptionTransitionType.PHASE
- || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
- || cur.getTransitionType() == SubscriptionTransitionType.CREATE
- || cur.getTransitionType() == SubscriptionTransitionType.RE_CREATE
- || cur.getTransitionType() == SubscriptionTransitionType.CHANGE
- || cur.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT) {
+ || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
+ || cur.getTransitionType() == SubscriptionTransitionType.CREATE
+ || cur.getTransitionType() == SubscriptionTransitionType.RE_CREATE
+ || cur.getTransitionType() == SubscriptionTransitionType.CHANGE
+ || cur.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT) {
return cur.getEffectiveTransitionTime();
}
}
@@ -484,7 +481,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
}
public void rebuildTransitions(final List<EntitlementEvent> inputEvents,
- final Catalog catalog) {
+ final Catalog catalog) {
if (inputEvents == null) {
return;
@@ -515,53 +512,53 @@ public class SubscriptionData extends EntityBase implements Subscription {
switch (cur.getType()) {
- case PHASE:
- final PhaseEvent phaseEV = (PhaseEvent) cur;
- nextPhaseName = phaseEV.getPhase();
- break;
-
- case API_USER:
- final ApiEvent userEV = (ApiEvent) cur;
- apiEventType = userEV.getEventType();
- isFromDisk = userEV.isFromDisk();
- nextUserToken = userEV.getUserToken();
-
- switch (apiEventType) {
- case TRANSFER:
- case MIGRATE_BILLING:
- case MIGRATE_ENTITLEMENT:
- case CREATE:
- case RE_CREATE:
- previousState = null;
- previousPlan = null;
- previousPhase = null;
- previousPriceList = null;
- nextState = SubscriptionState.ACTIVE;
- nextPlanName = userEV.getEventPlan();
- nextPhaseName = userEV.getEventPlanPhase();
- nextPriceListName = userEV.getPriceList();
+ case PHASE:
+ final PhaseEvent phaseEV = (PhaseEvent) cur;
+ nextPhaseName = phaseEV.getPhase();
break;
- case CHANGE:
- nextPlanName = userEV.getEventPlan();
- nextPhaseName = userEV.getEventPlanPhase();
- nextPriceListName = userEV.getPriceList();
- break;
- case CANCEL:
- nextState = SubscriptionState.CANCELLED;
- nextPlanName = null;
- nextPhaseName = null;
- break;
- case UNCANCEL:
+
+ case API_USER:
+ final ApiEvent userEV = (ApiEvent) cur;
+ apiEventType = userEV.getEventType();
+ isFromDisk = userEV.isFromDisk();
+ nextUserToken = userEV.getUserToken();
+
+ switch (apiEventType) {
+ case TRANSFER:
+ case MIGRATE_BILLING:
+ case MIGRATE_ENTITLEMENT:
+ case CREATE:
+ case RE_CREATE:
+ previousState = null;
+ previousPlan = null;
+ previousPhase = null;
+ previousPriceList = null;
+ nextState = SubscriptionState.ACTIVE;
+ nextPlanName = userEV.getEventPlan();
+ nextPhaseName = userEV.getEventPlanPhase();
+ nextPriceListName = userEV.getPriceList();
+ break;
+ case CHANGE:
+ nextPlanName = userEV.getEventPlan();
+ nextPhaseName = userEV.getEventPlanPhase();
+ nextPriceListName = userEV.getPriceList();
+ break;
+ case CANCEL:
+ nextState = SubscriptionState.CANCELLED;
+ nextPlanName = null;
+ nextPhaseName = null;
+ break;
+ case UNCANCEL:
+ break;
+ default:
+ throw new EntitlementError(String.format(
+ "Unexpected UserEvent type = %s", userEV
+ .getEventType().toString()));
+ }
break;
default:
throw new EntitlementError(String.format(
- "Unexpected UserEvent type = %s", userEV
- .getEventType().toString()));
- }
- break;
- default:
- throw new EntitlementError(String.format(
- "Unexpected Event type = %s", cur.getType()));
+ "Unexpected Event type = %s", cur.getType()));
}
Plan nextPlan = null;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
index 18a4d6f..9fff155 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
@@ -142,6 +142,7 @@ public interface EntitlementEventSqlDao extends Transactional<EntitlementEventSq
final EventType eventType = EventType.valueOf(r.getString("event_type"));
final ApiEventType userType = (eventType == EventType.API_USER) ? ApiEventType.valueOf(r.getString("user_type")) : null;
final DateTime createdDate = getDateTime(r, "created_date");
+ final DateTime updatedDate = getDateTime(r, "updated_date");
final DateTime requestedDate = getDateTime(r, "requested_date");
final DateTime effectiveDate = getDateTime(r, "effective_date");
final UUID subscriptionId = UUID.fromString(r.getString("subscription_id"));
@@ -158,6 +159,8 @@ public interface EntitlementEventSqlDao extends Transactional<EntitlementEventSq
.setTotalOrdering(totalOrdering)
.setUuid(id)
.setSubscriptionId(subscriptionId)
+ .setCreatedDate(createdDate)
+ .setUpdatedDate(updatedDate)
.setRequestedDate(requestedDate)
.setEffectiveDate(effectiveDate)
.setProcessedDate(createdDate)
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
index fec77f7..9a7dc3f 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
@@ -98,7 +98,6 @@ public interface SubscriptionSqlDao extends Transactional<SubscriptionSqlDao>, A
@Override
public SubscriptionData map(final int arg0, final ResultSet r, final StatementContext ctx)
throws SQLException {
-
final UUID id = UUID.fromString(r.getString("id"));
final UUID bundleId = UUID.fromString(r.getString("bundle_id"));
final ProductCategory category = ProductCategory.valueOf(r.getString("category"));
@@ -107,11 +106,14 @@ public interface SubscriptionSqlDao extends Transactional<SubscriptionSqlDao>, A
final DateTime ctd = getDateTime(r, "charged_through_date");
final DateTime ptd = getDateTime(r, "paid_through_date");
final long activeVersion = r.getLong("active_version");
-
+ final DateTime createdDate = getDateTime(r, "created_date");
+ final DateTime updatedDate = getDateTime(r, "updated_date");
return new SubscriptionData(new SubscriptionBuilder()
.setId(id)
.setBundleId(bundleId)
.setCategory(category)
+ .setCreatedDate(createdDate)
+ .setUpdatedDate(updatedDate)
.setBundleStartDate(bundleStartDate)
.setAlignStartDate(startDate)
.setActiveVersion(activeVersion)
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBase.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBase.java
index 92b4526..3ae3285 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBase.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBase.java
@@ -23,9 +23,12 @@ import org.joda.time.DateTime;
import com.ning.billing.entitlement.events.user.ApiEvent;
public abstract class EventBase implements EntitlementEvent {
+
private final long totalOrdering;
private final UUID uuid;
private final UUID subscriptionId;
+ private final DateTime createdDate;
+ private final DateTime updatedDate;
private final DateTime requestedDate;
private final DateTime effectiveDate;
private final DateTime processedDate;
@@ -37,6 +40,8 @@ public abstract class EventBase implements EntitlementEvent {
this.totalOrdering = builder.getTotalOrdering();
this.uuid = builder.getUuid();
this.subscriptionId = builder.getSubscriptionId();
+ this.createdDate = builder.getCreatedDate();
+ this.updatedDate = builder.getUpdatedDate();
this.requestedDate = builder.getRequestedDate();
this.effectiveDate = builder.getEffectiveDate();
this.processedDate = builder.getProcessedDate();
@@ -75,6 +80,16 @@ public abstract class EventBase implements EntitlementEvent {
}
@Override
+ public DateTime getCreatedDate() {
+ return createdDate;
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return updatedDate;
+ }
+
+ @Override
public long getActiveVersion() {
return activeVersion;
}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java
index 7d9bb13..086a59d 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java
@@ -26,6 +26,8 @@ public class EventBaseBuilder<T extends EventBaseBuilder<T>> {
private long totalOrdering;
private UUID uuid;
private UUID subscriptionId;
+ private DateTime createdDate;
+ private DateTime updatedDate;
private DateTime requestedDate;
private DateTime effectiveDate;
private DateTime processedDate;
@@ -33,7 +35,6 @@ public class EventBaseBuilder<T extends EventBaseBuilder<T>> {
private long activeVersion;
private boolean isActive;
-
public EventBaseBuilder() {
this.uuid = UUID.randomUUID();
this.isActive = true;
@@ -61,6 +62,16 @@ public class EventBaseBuilder<T extends EventBaseBuilder<T>> {
return (T) this;
}
+ public T setCreatedDate(final DateTime createdDate) {
+ this.createdDate = createdDate;
+ return (T) this;
+ }
+
+ public T setUpdatedDate(final DateTime updatedDate) {
+ this.updatedDate = updatedDate;
+ return (T) this;
+ }
+
public T setSubscriptionId(final UUID subscriptionId) {
this.subscriptionId = subscriptionId;
return (T) this;
@@ -99,6 +110,14 @@ public class EventBaseBuilder<T extends EventBaseBuilder<T>> {
return uuid;
}
+ public DateTime getCreatedDate() {
+ return createdDate;
+ }
+
+ public DateTime getUpdatedDate() {
+ return updatedDate;
+ }
+
public UUID getSubscriptionId() {
return subscriptionId;
}
diff --git a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg
index 17e9c89..e74145a 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg
@@ -46,7 +46,9 @@ getSubscriptionFromId() ::= <<
, bundle_start_date
, active_version
, charged_through_date
- , paid_through_date
+ , paid_through_date
+ , created_date
+ , updated_date
from subscriptions
where id = :id
<AND_CHECK_TENANT()>
@@ -62,7 +64,9 @@ getSubscriptionsFromBundleId() ::= <<
, bundle_start_date
, active_version
, charged_through_date
- , paid_through_date
+ , paid_through_date
+ , created_date
+ , updated_date
from subscriptions
where bundle_id = :bundleId
<AND_CHECK_TENANT()>
invoice/pom.xml 2(+1 -1)
diff --git a/invoice/pom.xml b/invoice/pom.xml
index fe83bee..c7ca703 100644
--- a/invoice/pom.xml
+++ b/invoice/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-invoice</artifactId>
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
index d687736..d0aef0f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
@@ -13,8 +13,10 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.invoice.api.svcs;
+import java.math.BigDecimal;
import java.util.Collection;
import java.util.UUID;
@@ -23,6 +25,7 @@ import javax.inject.Inject;
import org.joda.time.LocalDate;
import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.invoice.dao.InvoiceDao;
import com.ning.billing.util.callcontext.InternalTenantContext;
import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
@@ -33,12 +36,26 @@ public class DefaultInvoiceInternalApi implements InvoiceInternalApi {
@Inject
public DefaultInvoiceInternalApi(final InvoiceDao dao) {
- this.dao = dao;
+ this.dao = dao;
}
@Override
- public Collection<Invoice> getUnpaidInvoicesByAccountId(UUID accountId,
- LocalDate upToDate, InternalTenantContext context) {
+ public Invoice getInvoiceById(final UUID invoiceId, final InternalTenantContext context) throws InvoiceApiException {
+ return dao.getById(invoiceId, context);
+ }
+
+ @Override
+ public Collection<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final LocalDate upToDate, final InternalTenantContext context) {
return dao.getUnpaidInvoicesByAccountId(accountId, upToDate, context);
}
+
+ @Override
+ public Collection<Invoice> getInvoicesByAccountId(final UUID accountId, final InternalTenantContext context) {
+ return dao.getInvoicesByAccount(accountId, context);
+ }
+
+ @Override
+ public BigDecimal getAccountBalance(final UUID accountId, final InternalTenantContext context) {
+ return dao.getAccountBalance(accountId, context);
+ }
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index bc9a07a..49facb4 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -72,7 +72,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
private final Bus eventBus;
@Inject
- public DefaultInvoiceUserApi(final InvoiceDao dao, final InvoiceDispatcher dispatcher, final AccountInternalApi accountUserApi, final Bus eventBus,
+ public DefaultInvoiceUserApi(final InvoiceDao dao, final InvoiceDispatcher dispatcher, final AccountInternalApi accountUserApi, final Bus eventBus,
final TagInternalApi tagApi, final HtmlInvoiceGenerator generator, final InternalCallContextFactory internalCallContextFactory) {
this.dao = dao;
this.dispatcher = dispatcher;
@@ -218,7 +218,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
throw new InvoiceApiException(ErrorCode.INVOICE_NO_SUCH_CREDIT, creditId);
}
- return new CreditAdjInvoiceItem(creditItem.getId(), creditItem.getInvoiceId(), creditItem.getAccountId(),
+ return new CreditAdjInvoiceItem(creditItem.getId(), creditItem.getCreatedDate(), creditItem.getInvoiceId(), creditItem.getAccountId(),
creditItem.getStartDate(), creditItem.getAmount().negate(), creditItem.getCurrency());
}
@@ -267,7 +267,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
throw new InvoiceApiException(ErrorCode.INVOICE_NOT_FOUND, invoiceId);
}
- final InternalTenantContext internalContext = internalCallContextFactory.createInternalTenantContext(context);
+ final InternalTenantContext internalContext = internalCallContextFactory.createInternalTenantContext(context);
final Account account = accountUserApi.getAccountById(invoice.getAccountId(), internalContext);
// Check if this account has the MANUAL_PAY system tag
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java
index bb62a38..ce7799f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java
@@ -27,6 +27,7 @@ import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.skife.jdbi.v2.SQLStatement;
import org.skife.jdbi.v2.StatementContext;
@@ -137,32 +138,33 @@ public interface InvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
final BigDecimal rate = result.getBigDecimal("rate");
final Currency currency = Currency.valueOf(result.getString("currency"));
final UUID linkedItemId = getUUID(result, "linked_item_id");
+ final DateTime createdDate = getDateTime(result, "created_date");
final InvoiceItem item;
switch (type) {
case EXTERNAL_CHARGE:
- item = new ExternalChargeInvoiceItem(id, invoiceId, accountId, bundleId, planName, startDate, amount, currency);
+ item = new ExternalChargeInvoiceItem(id, createdDate, invoiceId, accountId, bundleId, planName, startDate, amount, currency);
break;
case FIXED:
- item = new FixedPriceInvoiceItem(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency);
+ item = new FixedPriceInvoiceItem(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency);
break;
case RECURRING:
- item = new RecurringInvoiceItem(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
+ item = new RecurringInvoiceItem(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
break;
case CBA_ADJ:
- item = new CreditBalanceAdjInvoiceItem(id, invoiceId, accountId, startDate, linkedItemId, amount, currency);
+ item = new CreditBalanceAdjInvoiceItem(id, createdDate, invoiceId, accountId, startDate, linkedItemId, amount, currency);
break;
case CREDIT_ADJ:
- item = new CreditAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
+ item = new CreditAdjInvoiceItem(id, createdDate, invoiceId, accountId, startDate, amount, currency);
break;
case REFUND_ADJ:
- item = new RefundAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
+ item = new RefundAdjInvoiceItem(id, createdDate, invoiceId, accountId, startDate, amount, currency);
break;
case REPAIR_ADJ:
- item = new RepairAdjInvoiceItem(id, invoiceId, accountId, startDate, endDate, amount, currency, linkedItemId);
+ item = new RepairAdjInvoiceItem(id, createdDate, invoiceId, accountId, startDate, endDate, amount, currency, linkedItemId);
break;
case ITEM_ADJ:
- item = new ItemAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency, linkedItemId);
+ item = new ItemAdjInvoiceItem(id, createdDate, invoiceId, accountId, startDate, amount, currency, linkedItemId);
break;
default:
throw new RuntimeException("Unexpected type of event item " + type);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
index f387ec8..0a1c533 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
@@ -128,8 +128,9 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
final Currency currency = (currencyString == null) ? null : Currency.valueOf(currencyString);
final UUID paymentCookieId = getUUID(result, "payment_cookie_id");
final UUID linkedInvoicePaymentId = getUUID(result, "linked_invoice_payment_id");
+ final DateTime createdDate = getDateTime(result, "created_date");
- return new DefaultInvoicePayment(id, type, paymentId, invoiceId, paymentDate,
+ return new DefaultInvoicePayment(id, createdDate, type, paymentId, invoiceId, paymentDate,
amount, currency, paymentCookieId, linkedInvoicePaymentId);
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
index 138608e..6358101 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
@@ -27,6 +27,7 @@ import java.util.Date;
import java.util.List;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.skife.jdbi.v2.SQLStatement;
import org.skife.jdbi.v2.StatementContext;
@@ -120,8 +121,9 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
final LocalDate targetDate = getDate(result, "target_date");
final Currency currency = Currency.valueOf(result.getString("currency"));
final boolean isMigrationInvoice = result.getBoolean("migrated");
+ final DateTime createdDate = getDateTime(result, "created_date");
- return new DefaultInvoice(id, accountId, invoiceNumber, invoiceDate, targetDate, currency, isMigrationInvoice);
+ return new DefaultInvoice(id, createdDate, accountId, invoiceNumber, invoiceDate, targetDate, currency, isMigrationInvoice);
}
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java
index 7a4f9b1..c191bca 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java
@@ -19,6 +19,8 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
@@ -27,20 +29,15 @@ import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceItemType;
public abstract class AdjInvoiceItem extends InvoiceItemBase {
- public AdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency) {
- this(UUID.randomUUID(), invoiceId, accountId, startDate, endDate, amount, currency);
- }
-
- public AdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final UUID reversingId) {
- this(UUID.randomUUID(), invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
- }
- public AdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency) {
- super(id, invoiceId, accountId, null, null, null, null, startDate, endDate, amount, currency);
+ public AdjInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency) {
+ this(id, createdDate, invoiceId, accountId, startDate, endDate, amount, currency, null);
}
- public AdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final UUID reversingId) {
- super(id, invoiceId, accountId, null, null, null, null, startDate, endDate, amount, currency, reversingId);
+ public AdjInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, @Nullable final UUID reversingId) {
+ super(id, createdDate, invoiceId, accountId, null, null, null, null, startDate, endDate, amount, currency, reversingId);
}
@Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java
index 3b43340..cc64bc4 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java
@@ -19,6 +19,9 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
@@ -28,12 +31,12 @@ public class CreditAdjInvoiceItem extends AdjInvoiceItem {
public CreditAdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate date,
final BigDecimal amount, final Currency currency) {
- super(invoiceId, accountId, date, date, amount, currency);
+ this(UUID.randomUUID(), null, invoiceId, accountId, date, amount, currency);
}
- public CreditAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate date,
+ public CreditAdjInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, final LocalDate date,
final BigDecimal amount, final Currency currency) {
- super(id, invoiceId, accountId, date, date, amount, currency);
+ super(id, createdDate, invoiceId, accountId, date, date, amount, currency);
}
@Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
index 588a650..e8db0c7 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
@@ -19,6 +19,9 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
@@ -28,18 +31,18 @@ public class CreditBalanceAdjInvoiceItem extends AdjInvoiceItem {
public CreditBalanceAdjInvoiceItem(final UUID invoiceId, final UUID accountId,
final LocalDate date, final BigDecimal amount, final Currency currency) {
- super(invoiceId, accountId, date, date, amount, currency);
+ this(UUID.randomUUID(), null, invoiceId, accountId, date, null, amount, currency);
}
- public CreditBalanceAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId,
- final LocalDate date, final UUID linkedInvoiceItemId,
+ public CreditBalanceAdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate date, @Nullable final UUID linkedInvoiceItemId,
final BigDecimal amount, final Currency currency) {
- super(id, invoiceId, accountId, date, date, amount, currency, linkedInvoiceItemId);
+ this(UUID.randomUUID(), null, invoiceId, accountId, date, linkedInvoiceItemId, amount, currency);
}
- public CreditBalanceAdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate date, final UUID linkedInvoiceItemId,
+ public CreditBalanceAdjInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId,
+ final LocalDate date, final UUID linkedInvoiceItemId,
final BigDecimal amount, final Currency currency) {
- super(invoiceId, accountId, date, date, amount, currency, linkedInvoiceItemId);
+ super(id, createdDate, invoiceId, accountId, date, date, amount, currency, linkedInvoiceItemId);
}
@Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
index 9c04617..8231cf3 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
@@ -33,6 +33,7 @@ import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.util.entity.EntityBase;
public class DefaultInvoice extends EntityBase implements Invoice {
+
private final InvoiceItemList invoiceItems = new InvoiceItemList();
private final List<InvoicePayment> payments = new ArrayList<InvoicePayment>();
private final UUID accountId;
@@ -47,10 +48,16 @@ public class DefaultInvoice extends EntityBase implements Invoice {
this(UUID.randomUUID(), accountId, null, invoiceDate, targetDate, currency, false);
}
- // Used to hydrate invoice from persistence layer
public DefaultInvoice(final UUID invoiceId, final UUID accountId, @Nullable final Integer invoiceNumber, final LocalDate invoiceDate,
final LocalDate targetDate, final Currency currency, final boolean isMigrationInvoice) {
- super(invoiceId);
+ this(invoiceId, null, accountId, invoiceNumber, invoiceDate, targetDate, currency, isMigrationInvoice);
+ }
+
+ // Used to hydrate invoice from persistence layer
+ public DefaultInvoice(final UUID invoiceId, @Nullable final DateTime createdDate, final UUID accountId,
+ @Nullable final Integer invoiceNumber, final LocalDate invoiceDate,
+ final LocalDate targetDate, final Currency currency, final boolean isMigrationInvoice) {
+ super(invoiceId, createdDate, createdDate);
this.accountId = accountId;
this.invoiceNumber = invoiceNumber;
this.invoiceDate = invoiceDate;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
index abd96b3..2805276 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
@@ -16,10 +16,11 @@
package com.ning.billing.invoice.model;
-import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
import com.ning.billing.catalog.api.Currency;
@@ -27,6 +28,7 @@ import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.util.entity.EntityBase;
public class DefaultInvoicePayment extends EntityBase implements InvoicePayment {
+
private final UUID paymentId;
private final InvoicePaymentType type;
private final UUID invoiceId;
@@ -38,13 +40,19 @@ public class DefaultInvoicePayment extends EntityBase implements InvoicePayment
public DefaultInvoicePayment(final InvoicePaymentType type, final UUID paymentId, final UUID invoiceId, final DateTime paymentDate,
final BigDecimal amount, final Currency currency) {
- this(UUID.randomUUID(), type, paymentId, invoiceId, paymentDate, amount, currency, null, null);
+ this(UUID.randomUUID(), null, type, paymentId, invoiceId, paymentDate, amount, currency, null, null);
}
public DefaultInvoicePayment(final UUID id, final InvoicePaymentType type, final UUID paymentId, final UUID invoiceId, final DateTime paymentDate,
@Nullable final BigDecimal amount, @Nullable final Currency currency, @Nullable final UUID paymentCookieId,
@Nullable final UUID linkedInvoicePaymentId) {
- super(id);
+ this(id, null, type, paymentId, invoiceId, paymentDate, amount, currency, paymentCookieId, linkedInvoicePaymentId);
+ }
+
+ public DefaultInvoicePayment(final UUID id, @Nullable final DateTime createdDate, final InvoicePaymentType type, final UUID paymentId, final UUID invoiceId, final DateTime paymentDate,
+ @Nullable final BigDecimal amount, @Nullable final Currency currency, @Nullable final UUID paymentCookieId,
+ @Nullable final UUID linkedInvoicePaymentId) {
+ super(id, createdDate, createdDate);
this.type = type;
this.paymentId = paymentId;
this.amount = amount;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/ExternalChargeInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/ExternalChargeInvoiceItem.java
index 44c915e..f46c29d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/ExternalChargeInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/ExternalChargeInvoiceItem.java
@@ -21,6 +21,7 @@ import java.util.UUID;
import javax.annotation.Nullable;
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
@@ -31,12 +32,17 @@ public class ExternalChargeInvoiceItem extends InvoiceItemBase {
public ExternalChargeInvoiceItem(final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, @Nullable final String description,
final LocalDate date, final BigDecimal amount, final Currency currency) {
- super(invoiceId, accountId, bundleId, null, description, null, date, null, amount, currency);
+ this(UUID.randomUUID(), invoiceId, accountId, bundleId, description, date, amount, currency);
}
public ExternalChargeInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final String description, final LocalDate date, final BigDecimal amount, final Currency currency) {
- super(id, invoiceId, accountId, bundleId, (UUID) null, description, null, date, null, amount, currency);
+ this(id, null, invoiceId, accountId, bundleId, description, date, amount, currency);
+ }
+
+ public ExternalChargeInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
+ @Nullable final String description, final LocalDate date, final BigDecimal amount, final Currency currency) {
+ super(id, createdDate, invoiceId, accountId, bundleId, (UUID) null, description, null, date, null, amount, currency);
}
@Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
index d169d78..d99a84b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
@@ -21,6 +21,7 @@ import java.util.UUID;
import javax.annotation.Nullable;
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
@@ -29,14 +30,16 @@ import com.ning.billing.invoice.api.InvoiceItemType;
public class FixedPriceInvoiceItem extends InvoiceItemBase {
- public FixedPriceInvoiceItem(final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, @Nullable final UUID subscriptionId, final String planName, final String phaseName,
+ public FixedPriceInvoiceItem(final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, @Nullable final UUID subscriptionId,
+ final String planName, final String phaseName,
final LocalDate date, final BigDecimal amount, final Currency currency) {
- super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, date, null, amount, currency);
+ this(UUID.randomUUID(), null, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, date, amount, currency);
}
- public FixedPriceInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
+ public FixedPriceInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, final UUID bundleId,
+ final UUID subscriptionId, final String planName, final String phaseName,
final LocalDate date, final BigDecimal amount, final Currency currency) {
- super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, date, null, amount, currency);
+ super(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, date, null, amount, currency);
}
@Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
index a4264b6..f347a45 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
@@ -30,6 +30,7 @@ import com.ning.billing.invoice.api.InvoiceItemType;
import com.ning.billing.util.entity.EntityBase;
public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem {
+
/* Common to all items */
protected final UUID invoiceId;
protected final UUID accountId;
@@ -61,58 +62,34 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem
}
/*
- * CTOR without ID; called from generator when creating invoice item
- */
- // No rate and no reversing item
- public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency) {
- this(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency);
-
- }
-
- // With rate but no reversing item
- public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency) {
- this(UUID.randomUUID(), invoiceId, accountId, bundleId, subscriptionId, planName, phaseName,
- startDate, endDate, amount, rate, currency, null);
- }
-
- // With reversing item, no rate
- public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final UUID reversedItemId) {
- this(UUID.randomUUID(), invoiceId, accountId, bundleId, subscriptionId, planName, phaseName,
- startDate, endDate, amount, null, currency, reversedItemId);
- }
-
- /*
* CTORs with ID; called from DAO when rehydrating
*/
// No rate and no reversing item
- public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
+ public InvoiceItemBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency) {
- this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency, null);
+ this(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency, null);
}
// With rate but no reversing item
- public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
+ public InvoiceItemBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency) {
- this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency, null);
+ this(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency, null);
}
// With reversing item, no rate
- public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
+ public InvoiceItemBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final UUID reversedItemId) {
- this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency, reversedItemId);
+ this(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency, reversedItemId);
}
- private InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
+ private InvoiceItemBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency,
final UUID reversedItemId) {
- super(id);
+ super(id, createdDate, createdDate);
this.invoiceId = invoiceId;
this.accountId = accountId;
this.subscriptionId = subscriptionId;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/ItemAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/ItemAdjInvoiceItem.java
index 5392adf..c29fa84 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/ItemAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/ItemAdjInvoiceItem.java
@@ -19,6 +19,9 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
@@ -29,13 +32,18 @@ public class ItemAdjInvoiceItem extends AdjInvoiceItem {
public ItemAdjInvoiceItem(final InvoiceItem invoiceItem, final LocalDate effectiveDate,
final BigDecimal amount, final Currency currency) {
- super(invoiceItem.getInvoiceId(), invoiceItem.getAccountId(), effectiveDate, effectiveDate,
- amount, currency, invoiceItem.getId());
+ this(UUID.randomUUID(), invoiceItem.getInvoiceId(), invoiceItem.getAccountId(), effectiveDate,
+ amount, currency, invoiceItem.getId());
}
public ItemAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate startDate,
final BigDecimal amount, final Currency currency, final UUID linkedItemId) {
- super(id, invoiceId, accountId, startDate, startDate, amount, currency, linkedItemId);
+ this(id, null, invoiceId, accountId, startDate, amount, currency, linkedItemId);
+ }
+
+ public ItemAdjInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, final LocalDate startDate,
+ final BigDecimal amount, final Currency currency, final UUID linkedItemId) {
+ super(id, createdDate, invoiceId, accountId, startDate, startDate, amount, currency, linkedItemId);
}
@Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
index c3f4afa..a9beddf 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
@@ -19,33 +19,27 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceItemType;
public class RecurringInvoiceItem extends InvoiceItemBase {
- private final DateTimeFormatter dateTimeFormatter = DateTimeFormat.mediumDate();
public RecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
final String planName, final String phaseName, final LocalDate startDate, final LocalDate endDate,
final BigDecimal amount, final BigDecimal rate, final Currency currency) {
- super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
- }
-
- public RecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate,
- final Currency currency, final UUID reversedItemId) {
- super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
+ this(UUID.randomUUID(), null, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
}
- public RecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
+ public RecurringInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
final String planName, final String phaseName, final LocalDate startDate, final LocalDate endDate,
final BigDecimal amount, final BigDecimal rate, final Currency currency) {
- super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
+ super(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
}
@Override
@@ -54,15 +48,6 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
}
@Override
- public UUID getLinkedItemId() {
- return linkedItemId;
- }
-
- public boolean reversesItem() {
- return (linkedItemId != null);
- }
-
- @Override
public BigDecimal getRate() {
return rate;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java
index 6ccef1e..fffcb94 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java
@@ -19,6 +19,9 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
@@ -28,12 +31,12 @@ public class RefundAdjInvoiceItem extends AdjInvoiceItem {
public RefundAdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate date,
final BigDecimal amount, final Currency currency) {
- super(invoiceId, accountId, date, date, amount, currency);
+ this(UUID.randomUUID(), null, invoiceId, accountId, date, amount, currency);
}
- public RefundAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate date,
+ public RefundAdjInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, final LocalDate date,
final BigDecimal amount, final Currency currency) {
- super(id, invoiceId, accountId, date, date, amount, currency);
+ super(id, createdDate, invoiceId, accountId, date, date, amount, currency);
}
@Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java
index 1b3155b..f99babc 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java
@@ -19,6 +19,9 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
@@ -28,12 +31,12 @@ public class RepairAdjInvoiceItem extends AdjInvoiceItem {
public RepairAdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate,
final BigDecimal amount, final Currency currency, final UUID reversingId) {
- super(invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
+ this(UUID.randomUUID(), null, invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
}
- public RepairAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate,
+ public RepairAdjInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate,
final BigDecimal amount, final Currency currency, final UUID reversingId) {
- super(id, invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
+ super(id, createdDate, invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
}
@Override
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 2eb05f7..7c22a77 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
@@ -39,6 +39,7 @@ import java.util.List;
import java.util.Locale;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
@@ -264,6 +265,16 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
return invoice.getId();
}
+ @Override
+ public DateTime getCreatedDate() {
+ return invoice.getCreatedDate();
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return invoice.getUpdatedDate();
+ }
+
// Expose the fields for children classes. This is useful for further customization of the invoices
protected TranslatorConfig getConfig() {
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 9ea3a1f..ed99dcf 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
@@ -21,6 +21,7 @@ import java.text.NumberFormat;
import java.util.Locale;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormatter;
@@ -144,6 +145,16 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
}
@Override
+ public DateTime getCreatedDate() {
+ return item.getCreatedDate();
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return item.getUpdatedDate();
+ }
+
+ @Override
public BigDecimal getRate() {
return round(BigDecimal.ZERO);
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
index 8c7b0a8..ead2db7 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
@@ -21,7 +21,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
-import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -119,7 +118,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
final BigDecimal rate2 = new BigDecimal("14.85");
final BigDecimal amount2 = rate2;
final List<InvoiceItem> items = new LinkedList<InvoiceItem>();
- final InvoiceItem item1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ final InvoiceItem item1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency);
items.add(item1);
items.add(new RepairAdjInvoiceItem(invoiceId, accountId, startDate, endDate, amount1.negate(), currency, item1.getId()));
items.add(new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency));
@@ -219,7 +218,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
existing.add(item1);
final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
- final InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount3, rate3, currency, null);
+ final InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount3, rate3, currency);
proposed.add(item1);
proposed.add(other);
@@ -244,11 +243,11 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
final BigDecimal amount2 = rate2;
final List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
- final InvoiceItem item1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ final InvoiceItem item1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency);
existing.add(item1);
final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
- final InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency, null);
+ final InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency);
proposed.add(item1);
proposed.add(other);
@@ -275,11 +274,11 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
final UUID firstInvoiceId = UUID.randomUUID();
final List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
- final InvoiceItem item1 = new RecurringInvoiceItem(firstInvoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ final InvoiceItem item1 = new RecurringInvoiceItem(firstInvoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency);
existing.add(item1);
final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
- final InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency, null);
+ final InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency);
proposed.add(other);
gen.addRepairedItems(existing, proposed);
@@ -308,7 +307,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
final BigDecimal amount1 = rate1;
final List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
- final InvoiceItem item1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ final InvoiceItem item1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency);
existing.add(item1);
final UUID existingInvoiceId = UUID.randomUUID();
@@ -323,7 +322,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
final InvoiceItem reversedItem1 = new RepairAdjInvoiceItem(existingInvoiceId, accountId, startDate, nextEndDate, item1.getAmount().negate(), currency, item1.getId());
- final InvoiceItem newItem1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount2, rate2, currency, null);
+ final InvoiceItem newItem1 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount2, rate2, currency);
proposed.add(reversedItem1);
proposed.add(newItem1);
@@ -372,9 +371,9 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
final List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
final BigDecimal pcba1 = new BigDecimal("10.00");
- final InvoiceItem item1 = new RecurringInvoiceItem(firstInvoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency, null);
+ final InvoiceItem item1 = new RecurringInvoiceItem(firstInvoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, rate1, currency);
final InvoiceItem reversedItem1 = new RepairAdjInvoiceItem(firstInvoiceId, accountId, startDate, nextEndDate, amount1.negate(), currency, item1.getId());
- final InvoiceItem newItem1 = new RecurringInvoiceItem(firstInvoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount2, rate2, currency, null);
+ final InvoiceItem newItem1 = new RecurringInvoiceItem(firstInvoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount2, rate2, currency);
final InvoiceItem cba1 = new CreditBalanceAdjInvoiceItem(firstInvoiceId, accountId, startDate, pcba1, currency);
existing.add(item1);
existing.add(reversedItem1);
@@ -385,7 +384,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
final BigDecimal newAmount2 = newRate2;
final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
- final InvoiceItem item2 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate.plusMonths(1), endDate.plusMonths(1), newAmount2, newRate2, currency, null);
+ final InvoiceItem item2 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate.plusMonths(1), endDate.plusMonths(1), newAmount2, newRate2, currency);
proposed.add(item2);
gen.consumeExistingCredit(invoiceId, firstInvoiceId, existing, proposed, currency);
jaxrs/pom.xml 2(+1 -1)
diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml
index ae73a08..3e99f83 100644
--- a/jaxrs/pom.xml
+++ b/jaxrs/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-jaxrs</artifactId>
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountEmailJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountEmailJson.java
index 9a0d074..3efaf7f 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountEmailJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountEmailJson.java
@@ -18,11 +18,15 @@ package com.ning.billing.jaxrs.json;
import java.util.UUID;
+import org.joda.time.DateTime;
+
+import com.ning.billing.account.api.AccountEmail;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ning.billing.account.api.AccountEmail;
public class AccountEmailJson {
+
private final String accountId;
private final String email;
@@ -58,6 +62,16 @@ public class AccountEmailJson {
public UUID getId() {
return accountEmailId;
}
+
+ @Override
+ public DateTime getCreatedDate() {
+ return null;
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return null;
+ }
};
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentMethodJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentMethodJson.java
index 9fa91e0..844941b 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentMethodJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentMethodJson.java
@@ -20,15 +20,18 @@ import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
+import org.joda.time.DateTime;
+
import com.ning.billing.account.api.Account;
import com.ning.billing.payment.api.PaymentMethod;
import com.ning.billing.payment.api.PaymentMethodPlugin;
import com.ning.billing.payment.api.PaymentMethodPlugin.PaymentMethodKVInfo;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+
public class PaymentMethodJson {
private final String paymentMethodId;
@@ -88,6 +91,16 @@ public class PaymentMethodJson {
}
@Override
+ public DateTime getCreatedDate() {
+ return null;
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return null;
+ }
+
+ @Override
public UUID getAccountId() {
return accountId != null ? UUID.fromString(accountId) : null;
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AnalyticsResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AnalyticsResource.java
index e8c871e..bbf996f 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AnalyticsResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AnalyticsResource.java
@@ -16,15 +16,23 @@
package com.ning.billing.jaxrs.resources;
+import java.util.UUID;
+
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.PUT;
import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
+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.api.TimeSeriesData;
import com.ning.billing.analytics.api.user.AnalyticsUserApi;
import com.ning.billing.jaxrs.json.TimeSeriesDataJson;
@@ -33,6 +41,7 @@ import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
import com.ning.billing.util.api.AuditUserApi;
import com.ning.billing.util.api.CustomFieldUserApi;
import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.callcontext.CallContext;
import com.google.inject.Singleton;
@@ -42,19 +51,35 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
@Path(JaxrsResource.ANALYTICS_PATH)
public class AnalyticsResource extends JaxRsResourceBase {
+ private final AccountUserApi accountUserApi;
private final AnalyticsUserApi analyticsUserApi;
@Inject
- public AnalyticsResource(final AnalyticsUserApi analyticsUserApi,
+ public AnalyticsResource(final AccountUserApi accountUserApi,
+ final AnalyticsUserApi analyticsUserApi,
final JaxrsUriBuilder uriBuilder,
final TagUserApi tagUserApi,
final CustomFieldUserApi customFieldUserApi,
final AuditUserApi auditUserApi,
final Context context) {
super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, context);
+ this.accountUserApi = accountUserApi;
this.analyticsUserApi = analyticsUserApi;
}
+ @PUT
+ @Path("/{accountId:" + UUID_PATTERN + "}")
+ public Response rebuildAnalyticsForAccount(@PathParam("accountId") final String accountId,
+ @HeaderParam(HDR_CREATED_BY) final String createdBy,
+ @HeaderParam(HDR_REASON) final String reason,
+ @HeaderParam(HDR_COMMENT) final String comment,
+ @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException {
+ final CallContext callContext = context.createContext(createdBy, reason, comment, request);
+ final Account account = accountUserApi.getAccountById(UUID.fromString(accountId), callContext);
+ analyticsUserApi.rebuildAnalyticsForAccount(account, callContext);
+ return Response.status(Status.OK).build();
+ }
+
@GET
@Path("/accountsCreatedOverTime")
@Produces(APPLICATION_JSON)
junction/pom.xml 2(+1 -1)
diff --git a/junction/pom.xml b/junction/pom.xml
index d1ad33e..c975807 100644
--- a/junction/pom.xml
+++ b/junction/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-junction</artifactId>
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingAccount.java b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingAccount.java
index dcd1ddb..34add5d 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingAccount.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingAccount.java
@@ -18,6 +18,7 @@ package com.ning.billing.junction.plumbing.api;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import com.ning.billing.account.api.Account;
@@ -29,6 +30,7 @@ import com.ning.billing.util.callcontext.InternalTenantContext;
import com.ning.billing.util.svcapi.junction.BlockingApi;
public class BlockingAccount implements Account {
+
private final Account account;
private final InternalTenantContext context;
private BlockingState blockingState = null;
@@ -46,6 +48,16 @@ public class BlockingAccount implements Account {
}
@Override
+ public DateTime getCreatedDate() {
+ return account.getCreatedDate();
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return account.getUpdatedDate();
+ }
+
+ @Override
public String getExternalKey() {
return account.getExternalKey();
}
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java
index 635bea0..ff225e4 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java
@@ -40,6 +40,7 @@ import com.ning.billing.util.callcontext.InternalTenantContext;
import com.ning.billing.util.svcapi.junction.BlockingApi;
public class BlockingSubscription implements Subscription {
+
private final Subscription subscription;
private final BlockingApi blockingApi;
private final BlockingChecker checker;
@@ -63,6 +64,16 @@ public class BlockingSubscription implements Subscription {
}
@Override
+ public DateTime getCreatedDate() {
+ return subscription.getCreatedDate();
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return subscription.getUpdatedDate();
+ }
+
+ @Override
public boolean cancel(final DateTime requestedDate, final CallContext context) throws EntitlementUserApiException {
return subscription.cancel(requestedDate, context);
}
@@ -73,7 +84,6 @@ public class BlockingSubscription implements Subscription {
return subscription.cancelWithPolicy(requestedDate, policy, context);
}
-
@Override
public boolean uncancel(final CallContext context) throws EntitlementUserApiException {
return subscription.uncancel(context);
@@ -81,7 +91,7 @@ public class BlockingSubscription implements Subscription {
@Override
public boolean changePlan(final String productName, final BillingPeriod term, final String priceList, final DateTime requestedDate,
- final CallContext context) throws EntitlementUserApiException {
+ final CallContext context) throws EntitlementUserApiException {
try {
checker.checkBlockedChange(this, internalCallContextFactory.createInternalTenantContext(context));
} catch (BlockingApiException e) {
@@ -92,7 +102,7 @@ public class BlockingSubscription implements Subscription {
@Override
public boolean changePlanWithPolicy(final String productName, final BillingPeriod term, final String priceList,
- final DateTime requestedDate, final ActionPolicy policy, final CallContext context) throws EntitlementUserApiException {
+ final DateTime requestedDate, final ActionPolicy policy, final CallContext context) throws EntitlementUserApiException {
try {
checker.checkBlockedChange(this, internalCallContextFactory.createInternalTenantContext(context));
} catch (BlockingApiException e) {
@@ -103,7 +113,7 @@ public class BlockingSubscription implements Subscription {
@Override
public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate, final CallContext context)
- throws EntitlementUserApiException {
+ throws EntitlementUserApiException {
return subscription.recreate(spec, requestedDate, context);
}
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscriptionBundle.java b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscriptionBundle.java
index 8ba6acd..dd7f504 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscriptionBundle.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscriptionBundle.java
@@ -18,6 +18,8 @@ package com.ning.billing.junction.plumbing.api;
import java.util.UUID;
+import org.joda.time.DateTime;
+
import com.ning.billing.entitlement.api.user.SubscriptionBundle;
import com.ning.billing.junction.api.BlockingState;
import com.ning.billing.overdue.OverdueState;
@@ -48,6 +50,16 @@ public class BlockingSubscriptionBundle implements SubscriptionBundle {
}
@Override
+ public DateTime getCreatedDate() {
+ return subscriptionBundle.getCreatedDate();
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return subscriptionBundle.getUpdatedDate();
+ }
+
+ @Override
public String getKey() {
return subscriptionBundle.getKey();
}
overdue/pom.xml 2(+1 -1)
diff --git a/overdue/pom.xml b/overdue/pom.xml
index f3a2cc0..354817d 100644
--- a/overdue/pom.xml
+++ b/overdue/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-overdue</artifactId>
payment/pom.xml 2(+1 -1)
diff --git a/payment/pom.xml b/payment/pom.xml
index a4abd69..de05e2f 100644
--- a/payment/pom.xml
+++ b/payment/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-payment</artifactId>
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java
index 6aa1705..cde2b82 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java
@@ -13,6 +13,7 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.payment.api;
import java.math.BigDecimal;
@@ -21,10 +22,10 @@ import java.util.Collections;
import java.util.List;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.payment.dao.PaymentAttemptModelDao;
import com.ning.billing.payment.dao.PaymentModelDao;
@@ -32,8 +33,10 @@ import com.ning.billing.payment.dao.RefundModelDao;
import com.ning.billing.payment.dao.RefundModelDao.RefundStatus;
import com.ning.billing.util.entity.EntityBase;
-public class DefaultPayment extends EntityBase implements Payment {
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+public class DefaultPayment extends EntityBase implements Payment {
private final UUID accountId;
private final UUID invoiceId;
@@ -48,13 +51,12 @@ public class DefaultPayment extends EntityBase implements Payment {
private final String extSecondPaymentIdRef;
private final List<PaymentAttempt> attempts;
-
- private DefaultPayment(final UUID id, final UUID accountId, final UUID invoiceId,
- final UUID paymentMethodId, final BigDecimal amount, BigDecimal paidAmount, final Currency currency,
+ private DefaultPayment(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate, final UUID accountId, final UUID invoiceId,
+ final UUID paymentMethodId, final BigDecimal amount, final BigDecimal paidAmount, final Currency currency,
final DateTime effectiveDate, final Integer paymentNumber,
final PaymentStatus paymentStatus, final String paymentError, final String extFirstPaymentIdRef,
final String extSecondPaymentIdRef, final List<PaymentAttempt> attempts) {
- super(id);
+ super(id, createdDate, updatedDate);
this.accountId = accountId;
this.invoiceId = invoiceId;
this.paymentMethodId = paymentMethodId;
@@ -71,6 +73,8 @@ public class DefaultPayment extends EntityBase implements Payment {
public DefaultPayment(final PaymentModelDao src, final List<PaymentAttemptModelDao> attempts, final List<RefundModelDao> refunds) {
this(src.getId(),
+ src.getCreatedDate(),
+ src.getUpdatedDate(),
src.getAccountId(),
src.getInvoiceId(),
src.getPaymentMethodId(),
@@ -141,7 +145,6 @@ public class DefaultPayment extends EntityBase implements Payment {
return extSecondPaymentIdRef;
}
-
@Override
public List<PaymentAttempt> getAttempts() {
return attempts;
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentMethod.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentMethod.java
index e3f57b7..065c649 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentMethod.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentMethod.java
@@ -13,31 +13,28 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.payment.api;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
+
import com.ning.billing.payment.dao.PaymentMethodModelDao;
import com.ning.billing.util.entity.EntityBase;
public class DefaultPaymentMethod extends EntityBase implements PaymentMethod {
-
private final UUID accountId;
private final Boolean isActive;
private final String pluginName;
private final PaymentMethodPlugin pluginDetail;
- public DefaultPaymentMethod(final UUID paymentMethodId, final UUID accountId, final Boolean isActive, final String pluginName) {
- super(paymentMethodId);
- this.accountId = accountId;
- this.isActive = isActive;
- this.pluginName = pluginName;
- this.pluginDetail = null;
- }
-
- public DefaultPaymentMethod(final UUID paymentMethodId, final UUID accountId, final Boolean isActive, final String pluginName, final PaymentMethodPlugin pluginDetail) {
- super(paymentMethodId);
+ public DefaultPaymentMethod(final UUID paymentMethodId, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
+ final UUID accountId, final Boolean isActive, final String pluginName, final PaymentMethodPlugin pluginDetail) {
+ super(paymentMethodId, createdDate, updatedDate);
this.accountId = accountId;
this.isActive = isActive;
this.pluginName = pluginName;
@@ -45,18 +42,13 @@ public class DefaultPaymentMethod extends EntityBase implements PaymentMethod {
}
public DefaultPaymentMethod(final UUID accountId, final String pluginName, final PaymentMethodPlugin pluginDetail) {
- this(UUID.randomUUID(), accountId, true, pluginName, pluginDetail);
- }
-
- public DefaultPaymentMethod(final PaymentMethodModelDao input) {
- this(input.getId(), input.getAccountId(), input.isActive(), input.getPluginName());
+ this(UUID.randomUUID(), null, null, accountId, true, pluginName, pluginDetail);
}
public DefaultPaymentMethod(final PaymentMethodModelDao input, final PaymentMethodPlugin pluginDetail) {
- this(input.getId(), input.getAccountId(), input.isActive(), input.getPluginName(), pluginDetail);
+ this(input.getId(), input.getCreatedDate(), input.getUpdatedDate(), input.getAccountId(), input.isActive(), input.getPluginName(), pluginDetail);
}
-
@Override
public UUID getAccountId() {
return accountId;
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultRefund.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultRefund.java
index 81c8257..9bf3904 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultRefund.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultRefund.java
@@ -19,6 +19,8 @@ package com.ning.billing.payment.api;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
import com.ning.billing.catalog.api.Currency;
@@ -32,9 +34,10 @@ public class DefaultRefund extends EntityBase implements Refund {
private final boolean isAdjusted;
private final DateTime effectiveDate;
- public DefaultRefund(final UUID id, final UUID paymentId, final BigDecimal amount,
+ public DefaultRefund(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
+ final UUID paymentId, final BigDecimal amount,
final Currency currency, final boolean isAdjusted, final DateTime effectiveDate) {
- super(id);
+ super(id, createdDate, updatedDate);
this.paymentId = paymentId;
this.amount = amount;
this.currency = currency;
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
index 4b79f9e..a816b3b 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
@@ -16,8 +16,6 @@
package com.ning.billing.payment.core;
-import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -57,6 +55,8 @@ import com.google.common.collect.ImmutableList;
import com.google.inject.Inject;
import com.google.inject.name.Named;
+import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
+
public class PaymentMethodProcessor extends ProcessorBase {
private static final Logger log = LoggerFactory.getLogger(PaymentMethodProcessor.class);
@@ -109,7 +109,8 @@ public class PaymentMethodProcessor extends ProcessorBase {
pluginApi = pluginRegistry.getPlugin(pluginName);
pm = new DefaultPaymentMethod(account.getId(), pluginName, paymentMethodProps);
final String externalId = pluginApi.addPaymentMethod(account.getExternalKey(), paymentMethodProps, setDefault, context.toCallContext());
- final PaymentMethodModelDao pmModel = new PaymentMethodModelDao(pm.getId(), pm.getAccountId(), pm.getPluginName(), pm.isActive(), externalId);
+ final PaymentMethodModelDao pmModel = new PaymentMethodModelDao(pm.getId(), pm.getCreatedDate(), pm.getUpdatedDate(),
+ pm.getAccountId(), pm.getPluginName(), pm.isActive(), externalId);
paymentDao.insertPaymentMethod(pmModel, context);
if (setDefault) {
@@ -145,7 +146,9 @@ public class PaymentMethodProcessor extends ProcessorBase {
final List<PaymentMethodModelDao> finalPaymentMethods = new ArrayList<PaymentMethodModelDao>();
for (final PaymentMethodPlugin cur : pluginPms) {
final PaymentMethod input = new DefaultPaymentMethod(account.getId(), pluginName, cur);
- final PaymentMethodModelDao pmModel = new PaymentMethodModelDao(input.getId(), input.getAccountId(), input.getPluginName(), input.isActive(), input.getPluginDetail().getExternalPaymentMethodId());
+ final PaymentMethodModelDao pmModel = new PaymentMethodModelDao(input.getId(), input.getCreatedDate(), input.getUpdatedDate(),
+ input.getAccountId(), input.getPluginName(), input.isActive(),
+ input.getPluginDetail().getExternalPaymentMethodId());
finalPaymentMethods.add(pmModel);
}
diff --git a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
index 97e3848..2054f0e 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
@@ -16,8 +16,6 @@
package com.ning.billing.payment.core;
-import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
-
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
@@ -66,6 +64,8 @@ import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableMap;
import com.google.inject.name.Named;
+import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
+
public class RefundProcessor extends ProcessorBase {
private static final Logger log = LoggerFactory.getLogger(RefundProcessor.class);
@@ -170,7 +170,8 @@ public class RefundProcessor extends ProcessorBase {
paymentDao.updateRefundStatus(refundInfo.getId(), RefundStatus.COMPLETED, context);
- return new DefaultRefund(refundInfo.getId(), paymentId, refundInfo.getAmount(), account.getCurrency(),
+ return new DefaultRefund(refundInfo.getId(),refundInfo.getCreatedDate(), refundInfo.getUpdatedDate(),
+ paymentId, refundInfo.getAmount(), account.getCurrency(),
isAdjusted, refundInfo.getCreatedDate());
} catch (PaymentPluginApiException e) {
throw new PaymentApiException(ErrorCode.PAYMENT_CREATE_REFUND, account.getId(), e.getMessage());
@@ -236,7 +237,8 @@ public class RefundProcessor extends ProcessorBase {
if (completePluginCompletedRefund(filteredInput)) {
result = paymentDao.getRefund(refundId, context);
}
- return new DefaultRefund(result.getId(), result.getPaymentId(), result.getAmount(), result.getCurrency(),
+ return new DefaultRefund(result.getId(), result.getCreatedDate(), result.getUpdatedDate(),
+ result.getPaymentId(), result.getAmount(), result.getCurrency(),
result.isAdjsuted(), result.getCreatedDate());
}
@@ -264,7 +266,8 @@ public class RefundProcessor extends ProcessorBase {
return new ArrayList<Refund>(Collections2.transform(in, new Function<RefundModelDao, Refund>() {
@Override
public Refund apply(final RefundModelDao cur) {
- return new DefaultRefund(cur.getId(), cur.getPaymentId(), cur.getAmount(), cur.getCurrency(),
+ return new DefaultRefund(cur.getId(), cur.getCreatedDate(), cur.getUpdatedDate(),
+ cur.getPaymentId(), cur.getAmount(), cur.getCurrency(),
cur.isAdjsuted(), cur.getCreatedDate());
}
}));
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptModelDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptModelDao.java
index 2234c61..fb83540 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptModelDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptModelDao.java
@@ -13,11 +13,14 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.payment.dao;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
import com.ning.billing.payment.api.PaymentStatus;
@@ -34,10 +37,11 @@ public class PaymentAttemptModelDao extends EntityBase {
private final String gatewayErrorMsg;
private final BigDecimal requestedAmount;
- public PaymentAttemptModelDao(final UUID id, final UUID accountId, final UUID invoiceId,
+ public PaymentAttemptModelDao(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
+ final UUID accountId, final UUID invoiceId,
final UUID paymentId, final PaymentStatus processingStatus, final DateTime effectiveDate,
final BigDecimal requestedAmount, final String gatewayErrorCode, final String gatewayErrorMsg) {
- super(id);
+ super(id, createdDate, updatedDate);
this.accountId = accountId;
this.invoiceId = invoiceId;
this.paymentId = paymentId;
@@ -49,15 +53,15 @@ public class PaymentAttemptModelDao extends EntityBase {
}
public PaymentAttemptModelDao(final UUID accountId, final UUID invoiceId, final UUID paymentId, final PaymentStatus paymentStatus, final DateTime effectiveDate, final BigDecimal requestedAmount) {
- this(UUID.randomUUID(), accountId, invoiceId, paymentId, paymentStatus, effectiveDate, requestedAmount, null, null);
+ this(UUID.randomUUID(), null, null, accountId, invoiceId, paymentId, paymentStatus, effectiveDate, requestedAmount, null, null);
}
public PaymentAttemptModelDao(final UUID accountId, final UUID invoiceId, final UUID paymentId, final DateTime effectiveDate, final BigDecimal requestedAmount) {
- this(UUID.randomUUID(), accountId, invoiceId, paymentId, PaymentStatus.UNKNOWN, effectiveDate, requestedAmount, null, null);
+ this(UUID.randomUUID(), null, null, accountId, invoiceId, paymentId, PaymentStatus.UNKNOWN, effectiveDate, requestedAmount, null, null);
}
public PaymentAttemptModelDao(final PaymentAttemptModelDao src, final PaymentStatus newProcessingStatus, final String gatewayErrorCode, final String gatewayErrorMsg) {
- this(src.getId(), src.getAccountId(), src.getInvoiceId(), src.getPaymentId(), newProcessingStatus,
+ this(src.getId(), src.getCreatedDate(), src.getUpdatedDate(), src.getAccountId(), src.getInvoiceId(), src.getPaymentId(), newProcessingStatus,
src.getEffectiveDate(), src.getRequestedAmount(), gatewayErrorCode, gatewayErrorMsg);
}
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java
index 199ad81..84d5ed5 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java
@@ -100,7 +100,11 @@ public interface PaymentAttemptSqlDao extends Transactional<PaymentAttemptSqlDao
final String gatewayErrorCode = rs.getString("gateway_error_code");
final String gatewayErrorMsg = rs.getString("gateway_error_msg");
final BigDecimal requestedAmount = rs.getBigDecimal("requested_amount");
- return new PaymentAttemptModelDao(id, accountId, invoiceId, paymentId, processingStatus, effectiveDate, requestedAmount, gatewayErrorCode, gatewayErrorMsg);
+ final DateTime createdDate = getDateTime(rs, "created_date");
+ final DateTime updatedDate = getDateTime(rs, "updated_date");
+
+ return new PaymentAttemptModelDao(id, createdDate, updatedDate, accountId, invoiceId, paymentId, processingStatus,
+ effectiveDate, requestedAmount, gatewayErrorCode, gatewayErrorMsg);
}
}
}
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodModelDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodModelDao.java
index 30aa125..38d144b 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodModelDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodModelDao.java
@@ -13,10 +13,15 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.payment.dao;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
+
import com.ning.billing.util.entity.EntityBase;
public class PaymentMethodModelDao extends EntityBase {
@@ -26,9 +31,10 @@ public class PaymentMethodModelDao extends EntityBase {
private final Boolean isActive;
private final String externalId;
- public PaymentMethodModelDao(final UUID id, final UUID accountId, final String pluginName,
+ public PaymentMethodModelDao(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
+ final UUID accountId, final String pluginName,
final Boolean isActive, final String externalId) {
- super(id);
+ super(id, createdDate, updatedDate);
this.accountId = accountId;
this.pluginName = pluginName;
this.isActive = isActive;
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java
index 8ad616c..8ccadca 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java
@@ -21,6 +21,7 @@ import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.skife.jdbi.v2.SQLStatement;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.sqlobject.Bind;
@@ -97,7 +98,9 @@ public interface PaymentMethodSqlDao extends Transactional<PaymentMethodSqlDao>,
final String pluginName = rs.getString("plugin_name");
final Boolean isActive = rs.getBoolean("is_active");
final String externalId = rs.getString("external_id");
- return new PaymentMethodModelDao(id, accountId, pluginName, isActive, externalId);
+ final DateTime createdDate = getDateTime(rs, "created_date");
+ final DateTime updatedDate = getDateTime(rs, "updated_date");
+ return new PaymentMethodModelDao(id, createdDate, updatedDate, accountId, pluginName, isActive, externalId);
}
}
}
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentModelDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentModelDao.java
index 3091e47..a2af3dd 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentModelDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentModelDao.java
@@ -13,11 +13,14 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.payment.dao;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
import com.ning.billing.catalog.api.Currency;
@@ -39,10 +42,11 @@ public class PaymentModelDao extends EntityBase {
private final String extFirstPaymentRefId;
private final String extSecondPaymentRefId;
- public PaymentModelDao(final UUID id, final UUID accountId, final UUID invoiceId, final UUID paymentMethodId,
+ public PaymentModelDao(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate, final UUID accountId,
+ final UUID invoiceId, final UUID paymentMethodId,
final Integer paymentNumber, final BigDecimal amount, final Currency currency,
final PaymentStatus paymentStatus, final DateTime effectiveDate, final String extFirstPaymentRefId, final String extSecondPaymentRefId) {
- super(id);
+ super(id, createdDate, updatedDate);
this.accountId = accountId;
this.invoiceId = invoiceId;
this.paymentMethodId = paymentMethodId;
@@ -56,17 +60,18 @@ public class PaymentModelDao extends EntityBase {
}
public PaymentModelDao(final UUID accountId, final UUID invoiceId, final UUID paymentMethodId,
- final BigDecimal amount, final Currency currency, final DateTime effectiveDate, final PaymentStatus paymentStatus) {
- this(UUID.randomUUID(), accountId, invoiceId, paymentMethodId, INVALID_PAYMENT_NUMBER, amount, currency, paymentStatus, effectiveDate, null, null);
+ final BigDecimal amount, final Currency currency, final DateTime effectiveDate, final PaymentStatus paymentStatus) {
+ this(UUID.randomUUID(), null, null, accountId, invoiceId, paymentMethodId, INVALID_PAYMENT_NUMBER, amount, currency, paymentStatus, effectiveDate, null, null);
}
public PaymentModelDao(final UUID accountId, final UUID invoiceId, final UUID paymentMethodId,
- final BigDecimal amount, final Currency currency, final DateTime effectiveDate) {
- this(UUID.randomUUID(), accountId, invoiceId, paymentMethodId, INVALID_PAYMENT_NUMBER, amount, currency, PaymentStatus.UNKNOWN, effectiveDate, null, null);
+ final BigDecimal amount, final Currency currency, final DateTime effectiveDate) {
+ this(UUID.randomUUID(), null, null, accountId, invoiceId, paymentMethodId, INVALID_PAYMENT_NUMBER, amount, currency, PaymentStatus.UNKNOWN, effectiveDate, null, null);
}
public PaymentModelDao(final PaymentModelDao src, final PaymentStatus newPaymentStatus) {
- this(src.getId(), src.getAccountId(), src.getInvoiceId(), src.getPaymentMethodId(), src.getPaymentNumber(), src.getAmount(), src.getCurrency(), newPaymentStatus, src.getEffectiveDate(), null, null);
+ this(src.getId(), src.getCreatedDate(), src.getUpdatedDate(), src.getAccountId(), src.getInvoiceId(), src.getPaymentMethodId(),
+ src.getPaymentNumber(), src.getAmount(), src.getCurrency(), newPaymentStatus, src.getEffectiveDate(), null, null);
}
public UUID getAccountId() {
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
index a615a39..cd19c70 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
@@ -121,7 +121,10 @@ public interface PaymentSqlDao extends Transactional<PaymentSqlDao>, UpdatableEn
final PaymentStatus paymentStatus = PaymentStatus.valueOf(rs.getString("payment_status"));
final String extFirstPaymentRefId = rs.getString("ext_first_payment_ref_id");
final String extSecondPaymentRefId = rs.getString("ext_second_payment_ref_id");
- return new PaymentModelDao(id, accountId, invoiceId, paymentMethodId, paymentNumber, amount, currency, paymentStatus, effectiveDate, extFirstPaymentRefId, extSecondPaymentRefId);
+ final DateTime createdDate = getDateTime(rs, "created_date");
+ final DateTime updatedDate = getDateTime(rs, "updated_date");
+ return new PaymentModelDao(id, createdDate, updatedDate, accountId, invoiceId, paymentMethodId, paymentNumber,
+ amount, currency, paymentStatus, effectiveDate, extFirstPaymentRefId, extSecondPaymentRefId);
}
}
}
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
index 8190f77..e279a76 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
@@ -282,7 +282,8 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
final Boolean isActive = Boolean.TRUE;
final String externalPaymentId = UUID.randomUUID().toString();
- final PaymentMethodModelDao method = new PaymentMethodModelDao(paymentMethodId, accountId, pluginName, isActive, externalPaymentId);
+ final PaymentMethodModelDao method = new PaymentMethodModelDao(paymentMethodId, null, null,
+ accountId, pluginName, isActive, externalPaymentId);
PaymentMethodModelDao savedMethod = paymentDao.insertPaymentMethod(method, internalCallContext);
assertEquals(savedMethod.getId(), paymentMethodId);
pom.xml 2(+1 -1)
diff --git a/pom.xml b/pom.xml
index efc21b8..1515dc6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,7 +17,7 @@
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
<packaging>pom</packaging>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<name>killbill</name>
<description>Library for managing recurring subscriptions and the associated billing</description>
<url>http://github.com/ning/killbill</url>
server/pom.xml 2(+1 -1)
diff --git a/server/pom.xml b/server/pom.xml
index f9a826d..da88516 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-server</artifactId>
diff --git a/server/src/test/java/com/ning/billing/server/security/TestKillbillJdbcRealm.java b/server/src/test/java/com/ning/billing/server/security/TestKillbillJdbcRealm.java
index aa8344d..f2874fe 100644
--- a/server/src/test/java/com/ning/billing/server/security/TestKillbillJdbcRealm.java
+++ b/server/src/test/java/com/ning/billing/server/security/TestKillbillJdbcRealm.java
@@ -47,7 +47,7 @@ public class TestKillbillJdbcRealm extends ServerTestSuiteWithEmbeddedDB {
public void setUp() throws Exception {
// Create the tenant
final DefaultTenantDao tenantDao = new DefaultTenantDao(getMysqlTestingHelper().getDBI(), Mockito.mock(Bus.class));
- tenant = new DefaultTenant(UUID.randomUUID(), UUID.randomUUID().toString(),
+ tenant = new DefaultTenant(UUID.randomUUID(), null, null, UUID.randomUUID().toString(),
UUID.randomUUID().toString(), UUID.randomUUID().toString());
tenantDao.create(tenant, internalCallContext);
tenant/pom.xml 2(+1 -1)
diff --git a/tenant/pom.xml b/tenant/pom.xml
index 1d28596..b03adb0 100644
--- a/tenant/pom.xml
+++ b/tenant/pom.xml
@@ -20,7 +20,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-tenant</artifactId>
diff --git a/tenant/src/main/java/com/ning/billing/tenant/api/DefaultTenant.java b/tenant/src/main/java/com/ning/billing/tenant/api/DefaultTenant.java
index 1f1b250..fbc405a 100644
--- a/tenant/src/main/java/com/ning/billing/tenant/api/DefaultTenant.java
+++ b/tenant/src/main/java/com/ning/billing/tenant/api/DefaultTenant.java
@@ -18,6 +18,10 @@ package com.ning.billing.tenant.api;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
+
import com.ning.billing.util.entity.EntityBase;
public class DefaultTenant extends EntityBase implements Tenant {
@@ -43,11 +47,12 @@ public class DefaultTenant extends EntityBase implements Tenant {
* @param data TenantData new data for the existing tenant
*/
public DefaultTenant(final UUID id, final TenantData data) {
- this(id, data.getExternalKey(), data.getApiKey(), data.getApiSecret());
+ this(id, null, null, data.getExternalKey(), data.getApiKey(), data.getApiSecret());
}
- public DefaultTenant(final UUID id, final String externalKey, final String apiKey, final String apiSecret) {
- super(id);
+ public DefaultTenant(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
+ final String externalKey, final String apiKey, final String apiSecret) {
+ super(id, createdDate, updatedDate);
this.externalKey = externalKey;
this.apiKey = apiKey;
this.apiSecret = apiSecret;
diff --git a/tenant/src/main/java/com/ning/billing/tenant/dao/TenantMapper.java b/tenant/src/main/java/com/ning/billing/tenant/dao/TenantMapper.java
index 8c53237..558e507 100644
--- a/tenant/src/main/java/com/ning/billing/tenant/dao/TenantMapper.java
+++ b/tenant/src/main/java/com/ning/billing/tenant/dao/TenantMapper.java
@@ -20,6 +20,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
@@ -34,7 +35,9 @@ public class TenantMapper extends MapperBase implements ResultSetMapper<Tenant>
final UUID id = getUUID(result, "id");
final String externalKey = result.getString("external_key");
final String apiKey = result.getString("api_key");
+ final DateTime createdDate = getDateTime(result, "created_date");
+ final DateTime updatedDate = getDateTime(result, "updated_date");
- return new DefaultTenant(id, externalKey, apiKey, null);
+ return new DefaultTenant(id, createdDate, updatedDate, externalKey, apiKey, null);
}
}
diff --git a/tenant/src/test/java/com/ning/billing/tenant/dao/TestDefaultTenantDao.java b/tenant/src/test/java/com/ning/billing/tenant/dao/TestDefaultTenantDao.java
index c3ef3a7..c29aa21 100644
--- a/tenant/src/test/java/com/ning/billing/tenant/dao/TestDefaultTenantDao.java
+++ b/tenant/src/test/java/com/ning/billing/tenant/dao/TestDefaultTenantDao.java
@@ -36,7 +36,7 @@ public class TestDefaultTenantDao extends TenantTestSuiteWithEmbeddedDb {
public void testWeCanStoreAndMatchCredentials() throws Exception {
final DefaultTenantDao tenantDao = new DefaultTenantDao(getMysqlTestingHelper().getDBI(), Mockito.mock(Bus.class));
- final DefaultTenant tenant = new DefaultTenant(UUID.randomUUID(), UUID.randomUUID().toString(),
+ final DefaultTenant tenant = new DefaultTenant(UUID.randomUUID(), null, null, UUID.randomUUID().toString(),
UUID.randomUUID().toString(), UUID.randomUUID().toString());
tenantDao.create(tenant, internalCallContext);
usage/pom.xml 2(+1 -1)
diff --git a/usage/pom.xml b/usage/pom.xml
index 2ccbaf7..b025d46 100644
--- a/usage/pom.xml
+++ b/usage/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-usage</artifactId>
util/pom.xml 2(+1 -1)
diff --git a/util/pom.xml b/util/pom.xml
index 9835309..0eba882 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -13,7 +13,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill</artifactId>
- <version>0.1.36-SNAPSHOT</version>
+ <version>0.1.37-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-util</artifactId>
diff --git a/util/src/main/java/com/ning/billing/util/entity/EntityBase.java b/util/src/main/java/com/ning/billing/util/entity/EntityBase.java
index 1ac2fd0..4b8810c 100644
--- a/util/src/main/java/com/ning/billing/util/entity/EntityBase.java
+++ b/util/src/main/java/com/ning/billing/util/entity/EntityBase.java
@@ -47,12 +47,12 @@ public abstract class EntityBase implements Entity {
return id;
}
- // TODO surface it in Entity
+ @Override
public DateTime getCreatedDate() {
return createdDate;
}
- // TODO surface it in Entity
+ @Override
public DateTime getUpdatedDate() {
return updatedDate;
}
diff --git a/util/src/main/java/com/ning/billing/util/svcapi/invoice/InvoiceInternalApi.java b/util/src/main/java/com/ning/billing/util/svcapi/invoice/InvoiceInternalApi.java
index 92242f6..c54efe0 100644
--- a/util/src/main/java/com/ning/billing/util/svcapi/invoice/InvoiceInternalApi.java
+++ b/util/src/main/java/com/ning/billing/util/svcapi/invoice/InvoiceInternalApi.java
@@ -13,18 +13,26 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.util.svcapi.invoice;
+import java.math.BigDecimal;
import java.util.Collection;
import java.util.UUID;
import org.joda.time.LocalDate;
import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.util.callcontext.InternalTenantContext;
public interface InvoiceInternalApi {
+ public Invoice getInvoiceById(UUID invoiceId, InternalTenantContext context) throws InvoiceApiException;
+
public Collection<Invoice> getUnpaidInvoicesByAccountId(UUID accountId, LocalDate upToDate, InternalTenantContext context);
+ public Collection<Invoice> getInvoicesByAccountId(UUID accountId, InternalTenantContext context);
+
+ public BigDecimal getAccountBalance(UUID accountId, InternalTenantContext context);
}
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagMapper.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagMapper.java
index fe40e0d..6ce665b 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagMapper.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagMapper.java
@@ -20,6 +20,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
@@ -30,6 +31,7 @@ import com.ning.billing.util.tag.DescriptiveTag;
import com.ning.billing.util.tag.Tag;
public class TagMapper extends MapperBase implements ResultSetMapper<Tag> {
+
@Override
public Tag map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
@@ -43,10 +45,11 @@ public class TagMapper extends MapperBase implements ResultSetMapper<Tag> {
}
final UUID id = getUUID(result, "id");
+ final DateTime createdDate = getDateTime(result, "created_date");
if (thisTagType == null) {
- return new DescriptiveTag(id, tagDefinitionId);
+ return new DescriptiveTag(id, createdDate, tagDefinitionId);
} else {
- return new DefaultControlTag(id, thisTagType);
+ return new DefaultControlTag(id, createdDate, thisTagType);
}
}
}
diff --git a/util/src/main/java/com/ning/billing/util/tag/DefaultControlTag.java b/util/src/main/java/com/ning/billing/util/tag/DefaultControlTag.java
index c9b624f..f18844f 100644
--- a/util/src/main/java/com/ning/billing/util/tag/DefaultControlTag.java
+++ b/util/src/main/java/com/ning/billing/util/tag/DefaultControlTag.java
@@ -18,7 +18,12 @@ package com.ning.billing.util.tag;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
+
public class DefaultControlTag extends DescriptiveTag implements ControlTag {
+
private final ControlTagType controlTagType;
// use to create new objects
@@ -28,8 +33,8 @@ public class DefaultControlTag extends DescriptiveTag implements ControlTag {
}
// use to hydrate objects when loaded from the persistence layer
- public DefaultControlTag(final UUID id, final ControlTagType controlTagType) {
- super(id, controlTagType.getId());
+ public DefaultControlTag(final UUID id, @Nullable final DateTime createdDate, final ControlTagType controlTagType) {
+ super(id, createdDate, controlTagType.getId());
this.controlTagType = controlTagType;
}
@@ -48,7 +53,7 @@ public class DefaultControlTag extends DescriptiveTag implements ControlTag {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((controlTagType == null) ? 0
- : controlTagType.hashCode());
+ : controlTagType.hashCode());
return result;
}
diff --git a/util/src/main/java/com/ning/billing/util/tag/DescriptiveTag.java b/util/src/main/java/com/ning/billing/util/tag/DescriptiveTag.java
index 772d391..e916d3e 100644
--- a/util/src/main/java/com/ning/billing/util/tag/DescriptiveTag.java
+++ b/util/src/main/java/com/ning/billing/util/tag/DescriptiveTag.java
@@ -18,6 +18,10 @@ package com.ning.billing.util.tag;
import java.util.UUID;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
+
import com.ning.billing.util.entity.EntityBase;
public class DescriptiveTag extends EntityBase implements Tag {
@@ -25,8 +29,8 @@ public class DescriptiveTag extends EntityBase implements Tag {
private final UUID tagDefinitionId;
// use to hydrate objects from the persistence layer
- public DescriptiveTag(final UUID id, final UUID tagDefinitionId) {
- super(id);
+ public DescriptiveTag(final UUID id, @Nullable final DateTime createdDate, final UUID tagDefinitionId) {
+ super(id, createdDate, createdDate);
this.tagDefinitionId = tagDefinitionId;
}
@@ -36,13 +40,11 @@ public class DescriptiveTag extends EntityBase implements Tag {
this.tagDefinitionId = tagDefinitionId;
}
-
@Override
public UUID getTagDefinitionId() {
return tagDefinitionId;
}
-
@Override
public String toString() {
return "DescriptiveTag [tagDefinitionId=" + tagDefinitionId + ", id=" + id + "]";
@@ -53,7 +55,7 @@ public class DescriptiveTag extends EntityBase implements Tag {
final int prime = 31;
int result = 1;
result = prime * result + ((tagDefinitionId == null) ? 0
- : tagDefinitionId.hashCode());
+ : tagDefinitionId.hashCode());
return result;
}
diff --git a/util/src/test/java/com/ning/billing/mock/api/MockEntitlementUserApi.java b/util/src/test/java/com/ning/billing/mock/api/MockEntitlementUserApi.java
index 4d92c2a..8a9a6dc 100644
--- a/util/src/test/java/com/ning/billing/mock/api/MockEntitlementUserApi.java
+++ b/util/src/test/java/com/ning/billing/mock/api/MockEntitlementUserApi.java
@@ -64,6 +64,16 @@ public class MockEntitlementUserApi implements EntitlementUserApi {
}
@Override
+ public DateTime getCreatedDate() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public String getKey() {
return key;
}
diff --git a/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java b/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java
index 01d5257..28d59a7 100644
--- a/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java
+++ b/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java
@@ -18,6 +18,7 @@ package com.ning.billing.mock;
import java.util.UUID;
+import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import com.ning.billing.account.api.Account;
@@ -28,6 +29,7 @@ import com.ning.billing.catalog.api.Currency;
import com.ning.billing.junction.api.BlockingState;
public class MockAccountBuilder {
+
private final UUID id;
private String externalKey = "";
private String email = "";
@@ -178,6 +180,16 @@ public class MockAccountBuilder {
public Account build() {
return new Account() {
@Override
+ public DateTime getCreatedDate() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public String getExternalKey() {
return externalKey;
}
diff --git a/util/src/test/java/com/ning/billing/mock/MockSubscription.java b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
index 9286a9a..baf4543 100644
--- a/util/src/test/java/com/ning/billing/mock/MockSubscription.java
+++ b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
@@ -39,6 +39,7 @@ import com.ning.billing.util.callcontext.CallContext;
import com.google.common.collect.ImmutableList;
public class MockSubscription implements Subscription {
+
private final UUID id;
private final UUID bundleId;
private final SubscriptionState state;
@@ -76,7 +77,7 @@ public class MockSubscription implements Subscription {
@Override
public boolean cancelWithPolicy(DateTime requestedDate,
- ActionPolicy policy, CallContext context)
+ ActionPolicy policy, CallContext context)
throws EntitlementUserApiException {
return sub.cancelWithPolicy(requestedDate, policy, context);
}
@@ -110,6 +111,16 @@ public class MockSubscription implements Subscription {
}
@Override
+ public DateTime getCreatedDate() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public UUID getBundleId() {
return bundleId;
}
diff --git a/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDao.java b/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDao.java
index 5a073e3..127b794 100644
--- a/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDao.java
+++ b/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDao.java
@@ -25,6 +25,7 @@ import java.util.UUID;
import javax.annotation.Nullable;
+import org.joda.time.DateTime;
import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
import com.ning.billing.util.callcontext.InternalCallContext;
@@ -82,6 +83,16 @@ public class MockTagDao implements TagDao {
public UUID getId() {
return id;
}
+
+ @Override
+ public DateTime getCreatedDate() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ throw new UnsupportedOperationException();
+ }
};
if (tagStore.get(objectId) == null) {