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'
 ]