Merge pull request #2 from markusgeiss/develop

Cleanup and adding daily accrual beat
diff --git a/api/src/main/java/io/mifos/deposit/api/v1/definition/domain/DividendDistribution.java b/api/src/main/java/io/mifos/deposit/api/v1/definition/domain/DividendDistribution.java
index 3186deb..01c9a12 100644
--- a/api/src/main/java/io/mifos/deposit/api/v1/definition/domain/DividendDistribution.java
+++ b/api/src/main/java/io/mifos/deposit/api/v1/definition/domain/DividendDistribution.java
@@ -15,12 +15,15 @@
  */
 package io.mifos.deposit.api.v1.definition.domain;
 
+import io.mifos.core.lang.DateOfBirth;
 import org.hibernate.validator.constraints.NotBlank;
 
+import javax.validation.constraints.NotNull;
+
 public class DividendDistribution {
 
-  @NotBlank
-  private String dueDate;
+  @NotNull
+  private DateOfBirth dueDate;
   @NotBlank
   private String dividendRate;
 
@@ -28,11 +31,11 @@
     super();
   }
 
-  public String getDueDate() {
+  public DateOfBirth getDueDate() {
     return this.dueDate;
   }
 
-  public void setDueDate(final String dueDate) {
+  public void setDueDate(final DateOfBirth dueDate) {
     this.dueDate = dueDate;
   }
 
@@ -51,13 +54,13 @@
 
     final DividendDistribution that = (DividendDistribution) o;
 
-    if (!dueDate.equals(that.dueDate)) return false;
+    if (!dueDate.toLocalDate().isEqual(that.dueDate.toLocalDate())) return false;
     return dividendRate.equals(that.dividendRate);
   }
 
   @Override
   public int hashCode() {
-    int result = dueDate.hashCode();
+    int result = dueDate.toLocalDate().hashCode();
     result = 31 * result + dividendRate.hashCode();
     return result;
   }
diff --git a/component-test/src/main/java/io/mifos/deposit/TestDividendDistribution.java b/component-test/src/main/java/io/mifos/deposit/TestDividendDistribution.java
index e6360ed..27f2410 100644
--- a/component-test/src/main/java/io/mifos/deposit/TestDividendDistribution.java
+++ b/component-test/src/main/java/io/mifos/deposit/TestDividendDistribution.java
@@ -18,6 +18,7 @@
 import io.mifos.accounting.api.v1.domain.Account;
 import io.mifos.accounting.api.v1.domain.AccountType;
 import io.mifos.accounting.api.v1.domain.JournalEntry;
+import io.mifos.core.lang.DateOfBirth;
 import io.mifos.deposit.api.v1.EventConstants;
 import io.mifos.deposit.api.v1.definition.domain.DividendDistribution;
 import io.mifos.deposit.api.v1.definition.domain.ProductDefinition;
@@ -74,7 +75,11 @@
         .when(super.accountingServiceSpy).findAccount(shareAccount.getIdentifier());
 
     final DividendDistribution dividendDistribution = new DividendDistribution();
-    dividendDistribution.setDueDate("2017-07-31Z");
+    final DateOfBirth dueDate = new DateOfBirth();
+    dueDate.setYear(2017);
+    dueDate.setMonth(7);
+    dueDate.setDay(31);
+    dividendDistribution.setDueDate(dueDate);
     dividendDistribution.setDividendRate("2.5");
     this.depositAccountManager.dividendDistribution(productDefinition.getIdentifier(), dividendDistribution);
 
diff --git a/component-test/src/main/java/io/mifos/deposit/TestProductInstance.java b/component-test/src/main/java/io/mifos/deposit/TestProductInstance.java
index d023ee9..cb875e5 100644
--- a/component-test/src/main/java/io/mifos/deposit/TestProductInstance.java
+++ b/component-test/src/main/java/io/mifos/deposit/TestProductInstance.java
@@ -322,8 +322,8 @@
         super.depositAccountManager.fetchPossibleTransactionTypes(productInstance.getCustomerIdentifier());
 
     Assert.assertFalse(availableTransactionTypesAfterActivation.isEmpty());
-    Assert.assertTrue(availableTransactionTypesAfterActivation.size() == 4);
-    final HashSet<String> expectedTransactionTypes = Sets.newHashSet("ACCC", "ACCT", "CDPT", "CWDL");
+    Assert.assertTrue(availableTransactionTypesAfterActivation.size() == 5);
+    final HashSet<String> expectedTransactionTypes = Sets.newHashSet("ACCC", "ACCT", "CDPT", "CWDL", "CCHQ");
     availableTransactionTypesAfterActivation.forEach(availableTransactionType ->
         expectedTransactionTypes.remove(availableTransactionType.getTransactionType())
     );
diff --git a/service/src/main/java/io/mifos/deposit/service/DepositAccountManagementConfiguration.java b/service/src/main/java/io/mifos/deposit/service/DepositAccountManagementConfiguration.java
index 0500302..f3f97cf 100644
--- a/service/src/main/java/io/mifos/deposit/service/DepositAccountManagementConfiguration.java
+++ b/service/src/main/java/io/mifos/deposit/service/DepositAccountManagementConfiguration.java
@@ -23,6 +23,7 @@
 import io.mifos.core.lang.config.EnableServiceException;
 import io.mifos.core.lang.config.EnableTenantContext;
 import io.mifos.core.mariadb.config.EnableMariaDB;
+import io.mifos.rhythm.api.v1.client.RhythmManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -47,7 +48,8 @@
 @EnableAnubis
 @EnableServiceException
 @EnableFeignClients(clients = {
-    LedgerManager.class
+    LedgerManager.class,
+    RhythmManager.class
 })
 @ComponentScan({
     "io.mifos.deposit.service.rest",
diff --git a/service/src/main/java/io/mifos/deposit/service/internal/command/handler/MigrationAggregate.java b/service/src/main/java/io/mifos/deposit/service/internal/command/handler/MigrationAggregate.java
index 436cf42..524b6a8 100644
--- a/service/src/main/java/io/mifos/deposit/service/internal/command/handler/MigrationAggregate.java
+++ b/service/src/main/java/io/mifos/deposit/service/internal/command/handler/MigrationAggregate.java
@@ -23,6 +23,7 @@
 import io.mifos.deposit.api.v1.EventConstants;
 import io.mifos.deposit.service.ServiceConstants;
 import io.mifos.deposit.service.internal.command.MigrationCommand;
+import io.mifos.deposit.service.internal.service.helper.RhythmService;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -37,17 +38,20 @@
   private final DataSource dataSource;
   private final FlywayFactoryBean flywayFactoryBean;
   private final ApplicationName applicationName;
+  private final RhythmService rhythmService;
 
   @Autowired
   public MigrationAggregate(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
                             final DataSource dataSource,
                             final FlywayFactoryBean flywayFactoryBean,
-                            final ApplicationName applicationName) {
+                            final ApplicationName applicationName,
+                            final RhythmService rhythmService) {
     super();
     this.logger = logger;
     this.dataSource = dataSource;
     this.flywayFactoryBean = flywayFactoryBean;
     this.applicationName = applicationName;
+    this.rhythmService = rhythmService;
   }
 
   @CommandHandler
@@ -57,6 +61,8 @@
     this.logger.info("Starting migration for deposit account management version: {}.", applicationName.getVersionString());
     this.flywayFactoryBean.create(this.dataSource).migrate();
 
+    this.rhythmService.setBeat();
+
     this.logger.info("Migration finished.");
     return this.applicationName.getVersionString();
   }
diff --git a/service/src/main/java/io/mifos/deposit/service/internal/command/handler/ProductDefinitionAggregate.java b/service/src/main/java/io/mifos/deposit/service/internal/command/handler/ProductDefinitionAggregate.java
index 3e51c69..788c4c4 100644
--- a/service/src/main/java/io/mifos/deposit/service/internal/command/handler/ProductDefinitionAggregate.java
+++ b/service/src/main/java/io/mifos/deposit/service/internal/command/handler/ProductDefinitionAggregate.java
@@ -109,7 +109,7 @@
   @CommandHandler
   @EventEmitter(selectorName = EventConstants.SELECTOR_NAME, selectorValue = EventConstants.POST_PRODUCT_DEFINITION_COMMAND)
   @Transactional
-  public String activateProductdefintion(final ActivateProductDefinitionCommand activateProductDefinitionCommand) {
+  public String activateProductDefinition(final ActivateProductDefinitionCommand activateProductDefinitionCommand) {
     final Optional<ProductDefinitionEntity> optionalProductDefinition = productDefinitionRepository.findByIdentifier(activateProductDefinitionCommand.identifier());
 
     if (optionalProductDefinition.isPresent()) {
@@ -137,7 +137,7 @@
   @CommandHandler
   @EventEmitter(selectorName = EventConstants.SELECTOR_NAME, selectorValue = EventConstants.POST_PRODUCT_DEFINITION_COMMAND)
   @Transactional
-  public String deactivateProductdefintion(final DeactivateProductDefinitionCommand activateProductDefinitionCommand) {
+  public String deactivateProductDefinition(final DeactivateProductDefinitionCommand activateProductDefinitionCommand) {
     final Optional<ProductDefinitionEntity> optionalProductDefinition = productDefinitionRepository.findByIdentifier(activateProductDefinitionCommand.identifier());
 
     if (optionalProductDefinition.isPresent()) {
@@ -207,6 +207,7 @@
       this.productDefinitionCommandRepository.delete(
           this.productDefinitionCommandRepository.findByProductDefinition(productDefinitionEntity)
       );
+      this.productDefinitionCommandRepository.flush();
 
       this.deleteDependingEntities(productDefinitionEntity);
 
diff --git a/service/src/main/java/io/mifos/deposit/service/internal/mapper/DividendDistributionMapper.java b/service/src/main/java/io/mifos/deposit/service/internal/mapper/DividendDistributionMapper.java
index 7c01a8f..6503836 100644
--- a/service/src/main/java/io/mifos/deposit/service/internal/mapper/DividendDistributionMapper.java
+++ b/service/src/main/java/io/mifos/deposit/service/internal/mapper/DividendDistributionMapper.java
@@ -17,6 +17,7 @@
 
 import io.mifos.core.api.util.UserContextHolder;
 import io.mifos.core.lang.DateConverter;
+import io.mifos.core.lang.DateOfBirth;
 import io.mifos.deposit.api.v1.definition.domain.DividendDistribution;
 import io.mifos.deposit.service.internal.repository.DividendDistributionEntity;
 import io.mifos.deposit.service.internal.repository.ProductDefinitionEntity;
@@ -36,7 +37,7 @@
     final DividendDistributionEntity dividendDistributionEntity = new DividendDistributionEntity();
 
     dividendDistributionEntity.setProductDefinition(productDefinitionEntity);
-    final Date dueDate = Date.valueOf(DateConverter.dateFromIsoString(dividendDistribution.getDueDate()));
+    final Date dueDate = Date.valueOf(dividendDistribution.getDueDate().toLocalDate());
     dividendDistributionEntity.setDueDate(dueDate);
     dividendDistributionEntity.setRate(Double.valueOf(dividendDistribution.getDividendRate()));
     dividendDistributionEntity.setCreatedOn(LocalDateTime.now(Clock.systemUTC()));
@@ -49,7 +50,7 @@
     final DividendDistribution dividendDistribution = new DividendDistribution();
 
     dividendDistribution.setDividendRate(dividendDistributionEntity.getRate().toString());
-    dividendDistribution.setDueDate(DateConverter.toIsoString(dividendDistributionEntity.getDueDate().toLocalDate()));
+    dividendDistribution.setDueDate(DateOfBirth.fromLocalDate(dividendDistributionEntity.getDueDate().toLocalDate()));
 
     return dividendDistribution;
   }
diff --git a/service/src/main/java/io/mifos/deposit/service/internal/service/helper/RhythmService.java b/service/src/main/java/io/mifos/deposit/service/internal/service/helper/RhythmService.java
new file mode 100644
index 0000000..dfa7d18
--- /dev/null
+++ b/service/src/main/java/io/mifos/deposit/service/internal/service/helper/RhythmService.java
@@ -0,0 +1,45 @@
+package io.mifos.deposit.service.internal.service.helper;
+
+import io.mifos.core.api.util.NotFoundException;
+import io.mifos.core.lang.ApplicationName;
+import io.mifos.deposit.service.ServiceConstants;
+import io.mifos.rhythm.api.v1.client.RhythmManager;
+import io.mifos.rhythm.api.v1.domain.Beat;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RhythmService {
+
+  private final Logger logger;
+  private final RhythmManager rhythmManager;
+  private final ApplicationName applicationName;
+
+  @Autowired
+  public RhythmService(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+                       final RhythmManager rhythmManager,
+                       final ApplicationName applicationName) {
+    super();
+    this.logger = logger;
+    this.rhythmManager = rhythmManager;
+    this.applicationName = applicationName;
+  }
+
+  public void setBeat() {
+    try {
+      rhythmManager.getBeat(this.applicationName.toString(), "deposit-interest-accrual");
+    } catch (final NotFoundException nfex) {
+      final Beat beat = new Beat();
+      beat.setIdentifier("deposit-interest-accrual");
+      beat.setAlignmentHour(22);
+
+      try {
+        this.rhythmManager.createBeat(applicationName.toString(), beat);
+      } catch (final Throwable th) {
+        this.logger.error("Error while creating beat: ", th);
+      }
+    }
+  }
+}
diff --git a/service/src/main/java/io/mifos/deposit/service/rest/ProductDefinitionRestController.java b/service/src/main/java/io/mifos/deposit/service/rest/ProductDefinitionRestController.java
index 7c8f875..dfd1c1f 100644
--- a/service/src/main/java/io/mifos/deposit/service/rest/ProductDefinitionRestController.java
+++ b/service/src/main/java/io/mifos/deposit/service/rest/ProductDefinitionRestController.java
@@ -258,7 +258,7 @@
       }
     }
 
-    final LocalDate dueDate = DateConverter.dateFromIsoString(dividendDistribution.getDueDate());
+    final LocalDate dueDate = dividendDistribution.getDueDate().toLocalDate();
     final Double amount = Double.valueOf(dividendDistribution.getDividendRate());
 
     this.commandGateway.process(new DividendDistributionCommand(identifier, dueDate, amount));
diff --git a/service/src/main/java/io/mifos/deposit/service/rest/ProductInstanceRestController.java b/service/src/main/java/io/mifos/deposit/service/rest/ProductInstanceRestController.java
index 205fd91..0d0deb4 100644
--- a/service/src/main/java/io/mifos/deposit/service/rest/ProductInstanceRestController.java
+++ b/service/src/main/java/io/mifos/deposit/service/rest/ProductInstanceRestController.java
@@ -121,6 +121,9 @@
         final AvailableTransactionType actionClose = new AvailableTransactionType();
         actionClose.setTransactionType("ACCC");
         availableTransactionTypes.add(actionClose);
+        final AvailableTransactionType actionCheque = new AvailableTransactionType();
+        actionCheque.setTransactionType("CCHQ");
+        availableTransactionTypes.add(actionCheque);
       }
     });
     return ResponseEntity.ok(availableTransactionTypes);