killbill-memoizeit

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")