public String createOrFindCaseAccountForLedgerAssignment()

in service/src/main/java/org/apache/fineract/cn/portfolio/service/internal/util/AccountingAdapter.java [304:347]


  public String createOrFindCaseAccountForLedgerAssignment(
      final String customerIdentifier,
      final AccountAssignment ledgerAssignment,
      final BigDecimal currentBalance) {
    if (ledgerAssignment.getAccountIdentifier() != null) try
    {
      final Account existingAccount = ledgerManager.findAccount(ledgerAssignment.getAccountIdentifier());
      return existingAccount.getIdentifier();
    }
    catch (final AccountNotFoundException ignored) {
      //If the "existing" account doesn't exist after all, create a new one.
    }
    final Ledger ledger = ledgerManager.findLedger(ledgerAssignment.getLedgerIdentifier());
    final AccountPage accountsOfLedger = ledgerManager.fetchAccountsOfLedger(ledger.getIdentifier(), null, null, null, null);

    final Account generatedAccount = new Account();
    generatedAccount.setBalance(currentBalance.doubleValue());
    generatedAccount.setType(ledger.getType());
    generatedAccount.setState(Account.State.OPEN.name());
    generatedAccount.setHolders(Sets.newHashSet(customerIdentifier));
    long guestimatedAccountIndex = accountsOfLedger.getTotalElements() + 1;
    generatedAccount.setLedger(ledger.getIdentifier());
    final Optional<String> createdAccountNumber =
        Stream.iterate(guestimatedAccountIndex, i -> i + 1).limit(99999 - guestimatedAccountIndex)
        .map(i -> {
          final String accountNumber = createCaseAccountNumber(customerIdentifier, ledgerAssignment.getDesignator(), i);
          generatedAccount.setIdentifier(accountNumber);
          generatedAccount.setName(accountNumber);
          generatedAccount.setAlternativeAccountNumber(ledgerAssignment.getAlternativeAccountNumber());
          try {
            ledgerManager.createAccount(generatedAccount);
            return Optional.of(accountNumber);
          } catch (final AccountAlreadyExistsException e) {
            logger.error("Account '{}' could not be created because it already exists.", accountNumber);
            return Optional.<String>empty();
          }
        })
        .filter(Optional::isPresent).map(Optional::get)
        .findFirst();

    return createdAccountNumber.orElseThrow(() ->
        ServiceException.conflict("Failed to create an account for customer ''{0}'' and ''{1}'', in ledger ''{2}''.",
            customerIdentifier, ledgerAssignment.getDesignator(), ledgerAssignment.getLedgerIdentifier()));
  }