killbill-memoizeit
Changes
beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationParentInvoice.java 22(+21 -1)
pom.xml 2(+1 -1)
Details
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
index a1b4fb2..07a8c84 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
@@ -1035,6 +1035,16 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
}
@Override
+ public String getParentAutoCommitUtcTime() {
+ return defaultInvoiceConfig.getParentAutoCommitUtcTime();
+ }
+
+ @Override
+ public String getParentAutoCommitUtcTime(final InternalTenantContext tenantContext) {
+ return defaultInvoiceConfig.getParentAutoCommitUtcTime();
+ }
+
+ @Override
public boolean isInvoicingSystemEnabled(final InternalTenantContext tenantContext) {
return isInvoicingSystemEnabled();
}
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationParentInvoice.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationParentInvoice.java
index 3526f3a..2f139e2 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationParentInvoice.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationParentInvoice.java
@@ -19,9 +19,12 @@ package org.killbill.billing.beatrix.integration;
import java.math.BigDecimal;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.UUID;
+import javax.inject.Inject;
+
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.killbill.billing.ErrorCode;
@@ -34,18 +37,23 @@ import org.killbill.billing.catalog.api.BillingActionPolicy;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
-import org.killbill.billing.catalog.api.PlanSpecifier;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.entitlement.api.DefaultEntitlement;
+import org.killbill.billing.invoice.api.DefaultInvoiceService;
import org.killbill.billing.invoice.api.Invoice;
import org.killbill.billing.invoice.api.InvoiceApiException;
import org.killbill.billing.invoice.api.InvoiceItem;
import org.killbill.billing.invoice.api.InvoiceItemType;
import org.killbill.billing.invoice.api.InvoiceStatus;
+import org.killbill.billing.invoice.notification.ParentInvoiceCommitmentNotifier;
import org.killbill.billing.payment.api.Payment;
import org.killbill.billing.payment.api.PaymentApiException;
import org.killbill.billing.payment.api.PluginProperty;
import org.killbill.billing.payment.invoice.InvoicePaymentControlPluginApi;
+import org.killbill.notificationq.api.NotificationEvent;
+import org.killbill.notificationq.api.NotificationEventWithMetadata;
+import org.killbill.notificationq.api.NotificationQueue;
+import org.killbill.notificationq.api.NotificationQueueService;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -58,6 +66,9 @@ import static org.testng.Assert.assertTrue;
public class TestIntegrationParentInvoice extends TestIntegrationBase {
+ @Inject
+ private NotificationQueueService notificationQueueService;
+
@Test(groups = "slow")
public void testParentInvoiceGeneration() throws Exception {
@@ -85,6 +96,15 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
assertTrue(parentInvoice.isParentInvoice());
assertEquals(parentInvoice.getBalance().compareTo(BigDecimal.ZERO), 0);
+ // Verify the notification exists and the efective time matches the default configuration '23:59:59'
+ final NotificationQueue notificationQueue = notificationQueueService.getNotificationQueue(DefaultInvoiceService.INVOICE_SERVICE_NAME, ParentInvoiceCommitmentNotifier.PARENT_INVOICE_COMMITMENT_NOTIFIER_QUEUE);
+ final Iterable<NotificationEventWithMetadata<NotificationEvent>> events = notificationQueue.getFutureNotificationForSearchKey2(new DateTime(2050, 5, 15, 0, 0, 0, 0, testTimeZone), internalCallContext.getTenantRecordId());
+ //
+ final Iterator<NotificationEventWithMetadata<NotificationEvent>> metadataEventIterator = events.iterator();
+ assertTrue(metadataEventIterator.hasNext());
+ final NotificationEventWithMetadata<NotificationEvent> notificationEvent = metadataEventIterator.next();
+ assertTrue(notificationEvent.getEffectiveDate().compareTo(new DateTime(2015, 5, 15, 23, 59, 59, 0, testTimeZone)) == 0);
+
// Moving a day the NotificationQ calls the commitInvoice. No payment is expected
busHandler.pushExpectedEvents(NextEvent.INVOICE);
clock.addDays(1);
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/config/MultiTenantInvoiceConfig.java b/invoice/src/main/java/org/killbill/billing/invoice/config/MultiTenantInvoiceConfig.java
index ba2e1e0..70f9c13 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/config/MultiTenantInvoiceConfig.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/config/MultiTenantInvoiceConfig.java
@@ -140,6 +140,20 @@ public class MultiTenantInvoiceConfig extends MultiTenantConfigBase implements I
}
@Override
+ public String getParentAutoCommitUtcTime() {
+ return staticConfig.getParentAutoCommitUtcTime();
+ }
+
+ @Override
+ public String getParentAutoCommitUtcTime(final InternalTenantContext tenantContext) {
+ final String result = getStringTenantConfig("getParentAutoCommitUtcTime", tenantContext);
+ if (result != null) {
+ return result;
+ }
+ return getParentAutoCommitUtcTime();
+ }
+
+ @Override
public boolean isInvoicingSystemEnabled(final InternalTenantContext tenantContext) {
final String result = getStringTenantConfig("isInvoicingSystemEnabled", tenantContext);
if (result != null) {
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
index f060623..7b17866 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
@@ -33,6 +33,7 @@ import javax.annotation.Nullable;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
+import org.joda.time.LocalTime;
import org.killbill.billing.ErrorCode;
import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.Account;
@@ -1137,8 +1138,15 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
private void notifyOfParentInvoiceCreation(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory,
final InvoiceModelDao parentInvoice,
final InternalCallContext context) {
- final DateTime futureNotificationDate = parentInvoice.getCreatedDate().withTimeAtStartOfDay().plusDays(1);
- parentInvoiceCommitmentPoster.insertParentInvoiceFromTransactionInternal(entitySqlDaoWrapperFactory, parentInvoice.getId(), futureNotificationDate, context);
+ final DateTime now = clock.getUTCNow();
+ final LocalTime localTime = LocalTime.parse(invoiceConfig.getParentAutoCommitUtcTime(context));
+
+ DateTime targetFutureNotificationDate = now.withTime(localTime);
+ while (targetFutureNotificationDate.compareTo(now) < 0) {
+ targetFutureNotificationDate = targetFutureNotificationDate.plusDays(1);
+ }
+
+ parentInvoiceCommitmentPoster.insertParentInvoiceFromTransactionInternal(entitySqlDaoWrapperFactory, parentInvoice.getId(), targetFutureNotificationDate, context);
}
@Override
pom.xml 2(+1 -1)
diff --git a/pom.xml b/pom.xml
index 2c7c2da..18444f3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
<parent>
<artifactId>killbill-oss-parent</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.141.16</version>
+ <version>0.141.19</version>
</parent>
<artifactId>killbill</artifactId>
<version>0.19.1-SNAPSHOT</version>
diff --git a/util/src/main/java/org/killbill/billing/util/config/definition/InvoiceConfig.java b/util/src/main/java/org/killbill/billing/util/config/definition/InvoiceConfig.java
index 7ed6ac9..65ea53b 100644
--- a/util/src/main/java/org/killbill/billing/util/config/definition/InvoiceConfig.java
+++ b/util/src/main/java/org/killbill/billing/util/config/definition/InvoiceConfig.java
@@ -103,6 +103,16 @@ public interface InvoiceConfig extends KillbillConfig {
@Description("Whether the invoicing system is enabled")
boolean isInvoicingSystemEnabled();
+ @Config("org.killbill.invoice.parent.commit.local.utc.time")
+ @Default("23:59:59.999")
+ @Description("UTC Time when parent invoice gets committed")
+ String getParentAutoCommitUtcTime();
+
+ @Config("org.killbill.invoice.parent.commit.local.utc.time")
+ @Default("23:59:59.999")
+ @Description("UTC Time when parent invoice gets committed")
+ String getParentAutoCommitUtcTime(@Param("dummy") final InternalTenantContext tenantContext);
+
@Config("org.killbill.invoice.enabled")
@Default("true")
@Description("Whether the invoicing system is enabled")