added account number creation
added account creation
diff --git a/component-test/src/main/java/io/mifos/deposit/AbstractDepositAccountManagementTest.java b/component-test/src/main/java/io/mifos/deposit/AbstractDepositAccountManagementTest.java
index 3dad546..6899007 100644
--- a/component-test/src/main/java/io/mifos/deposit/AbstractDepositAccountManagementTest.java
+++ b/component-test/src/main/java/io/mifos/deposit/AbstractDepositAccountManagementTest.java
@@ -27,6 +27,7 @@
import io.mifos.deposit.api.v1.EventConstants;
import io.mifos.deposit.api.v1.client.DepositAccountManager;
import io.mifos.deposit.service.DepositAccountManagementConfiguration;
+import io.mifos.deposit.service.internal.service.helper.AccountingService;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
@@ -39,6 +40,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
@@ -87,6 +89,9 @@
@Autowired
EventRecorder eventRecorder;
+ @MockBean
+ AccountingService accountingServiceSpy;
+
private AutoUserContext autoUserContext;
AbstractDepositAccountManagementTest() {
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 59454b3..34b4682 100644
--- a/component-test/src/main/java/io/mifos/deposit/TestProductInstance.java
+++ b/component-test/src/main/java/io/mifos/deposit/TestProductInstance.java
@@ -49,5 +49,9 @@
final List<ProductInstance> productInstances = super.depositAccountManager.findProductInstances(productDefinition.getIdentifier());
Assert.assertNotNull(productInstances);
Assert.assertEquals(1, productInstances.size());
+ final ProductInstance foundProductInstance = productInstances.get(0);
+
+ Assert.assertEquals(productDefinition.getEquityLedgerIdentifier() + "." + customerIdentifier + ".00001",
+ foundProductInstance.getAccountIdentifier());
}
}
diff --git a/service/build.gradle b/service/build.gradle
index ea8af07..bee970e 100644
--- a/service/build.gradle
+++ b/service/build.gradle
@@ -38,6 +38,7 @@
[group: 'io.mifos.core', name: 'cassandra', version: versions.frameworkcassandra],
[group: 'io.mifos.core', name: 'mariadb', version: versions.frameworkmariadb],
[group: 'io.mifos.core', name: 'command', version: versions.frameworkcommand],
+ [group: 'io.mifos.accounting', name: 'api', version: versions.frameworkledger],
[group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator]
)
}
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 ae070bf..0500302 100644
--- a/service/src/main/java/io/mifos/deposit/service/DepositAccountManagementConfiguration.java
+++ b/service/src/main/java/io/mifos/deposit/service/DepositAccountManagementConfiguration.java
@@ -15,6 +15,7 @@
*/
package io.mifos.deposit.service;
+import io.mifos.accounting.api.v1.client.LedgerManager;
import io.mifos.anubis.config.EnableAnubis;
import io.mifos.core.async.config.EnableAsync;
import io.mifos.core.cassandra.config.EnableCassandra;
@@ -26,6 +27,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -44,6 +46,9 @@
@EnableCommandProcessing
@EnableAnubis
@EnableServiceException
+@EnableFeignClients(clients = {
+ LedgerManager.class
+})
@ComponentScan({
"io.mifos.deposit.service.rest",
"io.mifos.deposit.service.internal.service",
diff --git a/service/src/main/java/io/mifos/deposit/service/internal/command/handler/ProductInstanceAggregate.java b/service/src/main/java/io/mifos/deposit/service/internal/command/handler/ProductInstanceAggregate.java
index 33743d1..4612e0e 100644
--- a/service/src/main/java/io/mifos/deposit/service/internal/command/handler/ProductInstanceAggregate.java
+++ b/service/src/main/java/io/mifos/deposit/service/internal/command/handler/ProductInstanceAggregate.java
@@ -24,9 +24,11 @@
import io.mifos.deposit.service.ServiceConstants;
import io.mifos.deposit.service.internal.command.CreateProductInstanceCommand;
import io.mifos.deposit.service.internal.mapper.ProductInstanceMapper;
+import io.mifos.deposit.service.internal.repository.ProductDefinitionEntity;
import io.mifos.deposit.service.internal.repository.ProductDefinitionRepository;
import io.mifos.deposit.service.internal.repository.ProductInstanceEntity;
import io.mifos.deposit.service.internal.repository.ProductInstanceRepository;
+import io.mifos.deposit.service.internal.service.helper.AccountingService;
import org.apache.commons.lang.RandomStringUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -35,6 +37,8 @@
import java.time.Clock;
import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Optional;
@Aggregate
public class ProductInstanceAggregate {
@@ -42,14 +46,17 @@
private final Logger logger;
private final ProductInstanceRepository productInstanceRepository;
private final ProductDefinitionRepository productDefinitionRepository;
+ private final AccountingService accountingService;
@Autowired
public ProductInstanceAggregate(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
final ProductInstanceRepository productInstanceRepository,
- final ProductDefinitionRepository productDefinitionRepository) {
+ final ProductDefinitionRepository productDefinitionRepository,
+ final AccountingService accountingService) {
this.logger = logger;
this.productInstanceRepository = productInstanceRepository;
this.productDefinitionRepository = productDefinitionRepository;
+ this.accountingService = accountingService;
}
@CommandHandler
@@ -62,7 +69,31 @@
ProductInstanceMapper.map(productInstance, this.productDefinitionRepository);
if (productInstance.getAccountIdentifier() == null) {
- productInstanceEntity.setAccountIdentifier(RandomStringUtils.randomNumeric(32));
+ final Optional<ProductDefinitionEntity> optionalProductDefinition =
+ productDefinitionRepository.findByIdentifier(productInstance.getProductIdentifier());
+
+ optionalProductDefinition.ifPresent(productDefinitionEntity -> {
+
+ final List<ProductInstanceEntity> currentProductInstances =
+ this.productInstanceRepository.findByProductDefinitionAndCustomerIdentifier(productDefinitionEntity,
+ productInstance.getCustomerIdentifier());
+
+ final int accountSuffix = currentProductInstances.size() + 1;
+
+ final StringBuilder stringBuilder = new StringBuilder();
+ final String accountNumber = stringBuilder
+ .append(productDefinitionEntity.getEquityLedgerIdentifier())
+ .append(".")
+ .append(productInstance.getCustomerIdentifier())
+ .append(".")
+ .append(String.format("%05d", accountSuffix))
+ .toString();
+
+ productInstanceEntity.setAccountIdentifier(accountNumber);
+
+ this.accountingService.createAccount(productDefinitionEntity.getEquityLedgerIdentifier(), accountNumber,
+ productDefinitionEntity.getName());
+ });
}
productInstanceEntity.setCreatedBy(UserContextHolder.checkedGetUser());
diff --git a/service/src/main/java/io/mifos/deposit/service/internal/repository/ProductInstanceRepository.java b/service/src/main/java/io/mifos/deposit/service/internal/repository/ProductInstanceRepository.java
index ff29575..930986d 100644
--- a/service/src/main/java/io/mifos/deposit/service/internal/repository/ProductInstanceRepository.java
+++ b/service/src/main/java/io/mifos/deposit/service/internal/repository/ProductInstanceRepository.java
@@ -24,4 +24,7 @@
List<ProductInstanceEntity> findByCustomerIdentifier(final String customerIdentifier);
List<ProductInstanceEntity> findByProductDefinition(final ProductDefinitionEntity productDefinitionEntity);
+
+ List<ProductInstanceEntity> findByProductDefinitionAndCustomerIdentifier(
+ final ProductDefinitionEntity productDefinitionEntity, final String customerIdentifier);
}
diff --git a/service/src/main/java/io/mifos/deposit/service/internal/service/helper/AccountingService.java b/service/src/main/java/io/mifos/deposit/service/internal/service/helper/AccountingService.java
new file mode 100644
index 0000000..1d1f1dd
--- /dev/null
+++ b/service/src/main/java/io/mifos/deposit/service/internal/service/helper/AccountingService.java
@@ -0,0 +1,33 @@
+package io.mifos.deposit.service.internal.service.helper;
+
+import io.mifos.accounting.api.v1.client.LedgerManager;
+import io.mifos.accounting.api.v1.domain.Account;
+import io.mifos.deposit.service.ServiceConstants;
+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 AccountingService {
+
+ private final Logger logger;
+ private final LedgerManager ledgerManager;
+
+ @Autowired
+ public AccountingService(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+ final LedgerManager ledgerManager) {
+ super();
+ this.logger = logger;
+ this.ledgerManager = ledgerManager;
+ }
+
+ public void createAccount(final String ledgerIdentifier, final String accountIdentifier, final String productName) {
+ final Account account = new Account();
+ account.setIdentifier(accountIdentifier);
+ account.setLedger(ledgerIdentifier);
+ account.setName(productName);
+ account.setBalance(0.00D);
+ this.ledgerManager.createAccount(account);
+ }
+}
diff --git a/shared.gradle b/shared.gradle
index 11f514a..76062ad 100644
--- a/shared.gradle
+++ b/shared.gradle
@@ -10,6 +10,7 @@
frameworkcommand : '0.1.0-BUILD-SNAPSHOT',
frameworktest : '0.1.0-BUILD-SNAPSHOT',
frameworkanubis : '0.1.0-BUILD-SNAPSHOT',
+ frameworkledger : '0.1.0-BUILD-SNAPSHOT',
validator : '5.3.0.Final'
]