You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by pt...@apache.org on 2021/12/25 12:57:38 UTC

[fineract] branch develop updated: FINERACT-1391:AccountNumberPrefixPreference

This is an automated email from the ASF dual-hosted git repository.

ptuomola pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new b6a9a27  FINERACT-1391:AccountNumberPrefixPreference
b6a9a27 is described below

commit b6a9a2791df84d80035dc089600b96075c4aab8a
Author: rrpawar96 <rr...@gmail.com>
AuthorDate: Sat Dec 18 17:16:40 2021 +0530

    FINERACT-1391:AccountNumberPrefixPreference
---
 .../data/AccountNumberFormatData.java              | 13 +++++---
 .../data/AccountNumberFormatDataValidator.java     | 12 +++++--
 .../domain/AccountNumberFormat.java                | 14 +++++++-
 .../domain/AccountNumberFormatEnumerations.java    | 16 +++++----
 .../service/AccountNumberFormatConstants.java      |  2 ++
 ...AccountNumberFormatReadPlatformServiceImpl.java |  6 ++--
 ...ormatWritePlatformServiceJpaRepositoryImpl.java | 11 ++++++-
 .../client/domain/AccountNumberGenerator.java      | 38 ++++++++++++++++++++--
 .../core_db/V220_1__prefix_type_account_number.sql | 23 +++++++++++++
 9 files changed, 117 insertions(+), 18 deletions(-)

diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatData.java
index 3739322..c04979f 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatData.java
@@ -34,12 +34,15 @@ public class AccountNumberFormatData implements Serializable {
     private List<EnumOptionData> accountTypeOptions;
     private Map<String, List<EnumOptionData>> prefixTypeOptions;
 
-    public AccountNumberFormatData(final Long id, final EnumOptionData accountType, final EnumOptionData prefixType) {
-        this(id, accountType, prefixType, null, null);
+    private String prefixCharacter;
+
+    public AccountNumberFormatData(final Long id, final EnumOptionData accountType, final EnumOptionData prefixType,
+            final String prefixCharacter) {
+        this(id, accountType, prefixType, null, null, prefixCharacter);
     }
 
     public AccountNumberFormatData(final List<EnumOptionData> accountTypeOptions, Map<String, List<EnumOptionData>> prefixTypeOptions) {
-        this(null, null, null, accountTypeOptions, prefixTypeOptions);
+        this(null, null, null, accountTypeOptions, prefixTypeOptions, null);
     }
 
     public void templateOnTop(List<EnumOptionData> accountTypeOptions, Map<String, List<EnumOptionData>> prefixTypeOptions) {
@@ -48,12 +51,14 @@ public class AccountNumberFormatData implements Serializable {
     }
 
     private AccountNumberFormatData(final Long id, final EnumOptionData accountType, final EnumOptionData prefixType,
-            final List<EnumOptionData> accountTypeOptions, Map<String, List<EnumOptionData>> prefixTypeOptions) {
+            final List<EnumOptionData> accountTypeOptions, Map<String, List<EnumOptionData>> prefixTypeOptions,
+            final String prefixCharacter) {
         this.id = id;
         this.accountType = accountType;
         this.prefixType = prefixType;
         this.accountTypeOptions = accountTypeOptions;
         this.prefixTypeOptions = prefixTypeOptions;
+        this.prefixCharacter = prefixCharacter;
     }
 
     public Long getId() {
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatDataValidator.java
index 09c8a42..7bdbe22 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatDataValidator.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatDataValidator.java
@@ -51,10 +51,11 @@ public class AccountNumberFormatDataValidator {
     private static final Logger LOG = LoggerFactory.getLogger(AccountNumberFormatDataValidator.class);
 
     private static final Set<String> ACCOUNT_NUMBER_FORMAT_CREATE_REQUEST_DATA_PARAMETERS = new HashSet<>(
-            Arrays.asList(AccountNumberFormatConstants.accountTypeParamName, AccountNumberFormatConstants.prefixTypeParamName));
+            Arrays.asList(AccountNumberFormatConstants.accountTypeParamName, AccountNumberFormatConstants.prefixTypeParamName,
+                    AccountNumberFormatConstants.prefixCharacterParamName));
 
     private static final Set<String> ACCOUNT_NUMBER_FORMAT_UPDATE_REQUEST_DATA_PARAMETERS = new HashSet<>(
-            Arrays.asList(AccountNumberFormatConstants.prefixTypeParamName));
+            Arrays.asList(AccountNumberFormatConstants.prefixTypeParamName, AccountNumberFormatConstants.prefixCharacterParamName));
 
     @Autowired
     public AccountNumberFormatDataValidator(final FromJsonHelper fromApiJsonHelper) {
@@ -84,6 +85,13 @@ public class AccountNumberFormatDataValidator {
             DataValidatorBuilder dataValidatorForValidatingPrefixType = baseDataValidator.reset()
                     .parameter(AccountNumberFormatConstants.prefixTypeParamName).value(prefixType).notNull().integerGreaterThanZero();
 
+            if (prefixType.equals(AccountNumberPrefixType.PREFIX_SHORT_NAME.getValue())) {
+                final String prefixCharacter = this.fromApiJsonHelper
+                        .extractStringNamed(AccountNumberFormatConstants.prefixCharacterParamName, element);
+
+                baseDataValidator.reset().parameter(AccountNumberFormatConstants.prefixTypeParamName).value(prefixCharacter).notBlank();
+            }
+
             /**
              * Permitted values for prefix type vary based on the actual selected accountType, carry out this validation
              * only if data validation errors do not exist for both entity type and prefix type
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/domain/AccountNumberFormat.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/domain/AccountNumberFormat.java
index fa40253..77be4fc 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/domain/AccountNumberFormat.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/domain/AccountNumberFormat.java
@@ -37,21 +37,29 @@ public class AccountNumberFormat extends AbstractPersistableCustom {
     @Column(name = AccountNumberFormatConstants.PREFIX_TYPE_ENUM_COLUMN_NAME, nullable = true)
     private Integer prefixEnum;
 
+    @Column(name = AccountNumberFormatConstants.PREFIX_CHARACTER_COLUMN_NAME, nullable = true)
+    private String prefixCharacter;
+
     protected AccountNumberFormat() {
         //
     }
 
-    public AccountNumberFormat(EntityAccountType entityAccountType, AccountNumberPrefixType prefixType) {
+    public AccountNumberFormat(EntityAccountType entityAccountType, AccountNumberPrefixType prefixType, String prefixCharacter) {
         this.accountTypeEnum = entityAccountType.getValue();
         if (prefixType != null) {
             this.prefixEnum = prefixType.getValue();
         }
+        this.prefixCharacter = prefixCharacter;
     }
 
     public Integer getAccountTypeEnum() {
         return this.accountTypeEnum;
     }
 
+    public String getPrefixCharacter() {
+        return this.prefixCharacter;
+    }
+
     public EntityAccountType getAccountType() {
         return EntityAccountType.fromInt(this.accountTypeEnum);
     }
@@ -75,4 +83,8 @@ public class AccountNumberFormat extends AbstractPersistableCustom {
     public void setPrefix(AccountNumberPrefixType accountNumberPrefixType) {
         setPrefixEnum(accountNumberPrefixType.getValue());
     }
+
+    public void setPrefixCharacter(String prefixCharacter) {
+        this.prefixCharacter = prefixCharacter;
+    }
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/domain/AccountNumberFormatEnumerations.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/domain/AccountNumberFormatEnumerations.java
index 37649e2..8e1b2f5 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/domain/AccountNumberFormatEnumerations.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/domain/AccountNumberFormatEnumerations.java
@@ -35,13 +35,16 @@ public final class AccountNumberFormatEnumerations {
     }
 
     public static final Set<AccountNumberPrefixType> accountNumberPrefixesForClientAccounts = Collections
-            .unmodifiableSet(new HashSet<>(Arrays.asList(AccountNumberPrefixType.OFFICE_NAME, AccountNumberPrefixType.CLIENT_TYPE)));
+            .unmodifiableSet(new HashSet<>(Arrays.asList(AccountNumberPrefixType.OFFICE_NAME, AccountNumberPrefixType.CLIENT_TYPE,
+                    AccountNumberPrefixType.PREFIX_SHORT_NAME)));
 
-    public static final Set<AccountNumberPrefixType> accountNumberPrefixesForLoanAccounts = Collections.unmodifiableSet(
-            new HashSet<>(Arrays.asList(AccountNumberPrefixType.OFFICE_NAME, AccountNumberPrefixType.LOAN_PRODUCT_SHORT_NAME)));
+    public static final Set<AccountNumberPrefixType> accountNumberPrefixesForLoanAccounts = Collections
+            .unmodifiableSet(new HashSet<>(Arrays.asList(AccountNumberPrefixType.OFFICE_NAME,
+                    AccountNumberPrefixType.LOAN_PRODUCT_SHORT_NAME, AccountNumberPrefixType.PREFIX_SHORT_NAME)));
 
-    public static final Set<AccountNumberPrefixType> accountNumberPrefixesForSavingsAccounts = Collections.unmodifiableSet(
-            new HashSet<>(Arrays.asList(AccountNumberPrefixType.OFFICE_NAME, AccountNumberPrefixType.SAVINGS_PRODUCT_SHORT_NAME)));
+    public static final Set<AccountNumberPrefixType> accountNumberPrefixesForSavingsAccounts = Collections
+            .unmodifiableSet(new HashSet<>(Arrays.asList(AccountNumberPrefixType.OFFICE_NAME,
+                    AccountNumberPrefixType.SAVINGS_PRODUCT_SHORT_NAME, AccountNumberPrefixType.PREFIX_SHORT_NAME)));
 
     public static final Set<AccountNumberPrefixType> accountNumberPrefixesForCenters = Collections
             .unmodifiableSet(new HashSet<>(Collections.singletonList(AccountNumberPrefixType.OFFICE_NAME)));
@@ -54,7 +57,8 @@ public final class AccountNumberFormatEnumerations {
         OFFICE_NAME(1, "accountNumberPrefixType.officeName"), CLIENT_TYPE(101,
                 "accountNumberPrefixType.clientType"), LOAN_PRODUCT_SHORT_NAME(201,
                         "accountNumberPrefixType.loanProductShortName"), SAVINGS_PRODUCT_SHORT_NAME(301,
-                                "accountNumberPrefixType.savingsProductShortName");
+                                "accountNumberPrefixType.savingsProductShortName"), PREFIX_SHORT_NAME(401,
+                                        "accountNumberPrefixType.prefixShortName");
 
         private final Integer value;
         private final String code;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatConstants.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatConstants.java
index 0bce265..5800e23 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatConstants.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatConstants.java
@@ -40,6 +40,7 @@ public final class AccountNumberFormatConstants {
     public static final String idParamName = "id";
     public static final String accountTypeParamName = "accountType";
     public static final String prefixTypeParamName = "prefixType";
+    public static final String prefixCharacterParamName = "prefixCharacter";
 
     // response parameters
 
@@ -62,5 +63,6 @@ public final class AccountNumberFormatConstants {
     public static final String ACCOUNT_TYPE_ENUM_COLUMN_NAME = "account_type_enum";
     public static final String PREFIX_TYPE_ENUM_COLUMN_NAME = "prefix_type_enum";
     public static final String ACCOUNT_TYPE_UNIQUE_CONSTRAINT_NAME = "account_type_enum";
+    public static final String PREFIX_CHARACTER_COLUMN_NAME = "prefix_character";
 
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatReadPlatformServiceImpl.java
index d25c291..22a8878 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatReadPlatformServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatReadPlatformServiceImpl.java
@@ -64,7 +64,8 @@ public class AccountNumberFormatReadPlatformServiceImpl implements AccountNumber
         AccountNumberFormatMapper() {
             final StringBuilder builder = new StringBuilder(400);
 
-            builder.append(" anf.id as id, anf.account_type_enum as accountTypeEnum, anf.prefix_type_enum as prefixTypeEnum");
+            builder.append(
+                    " anf.id as id, anf.account_type_enum as accountTypeEnum, anf.prefix_type_enum as prefixTypeEnum, anf.prefix_character as prefixCharacter");
             builder.append(" from c_account_number_format anf ");
 
             this.schema = builder.toString();
@@ -80,13 +81,14 @@ public class AccountNumberFormatReadPlatformServiceImpl implements AccountNumber
             final Long id = rs.getLong("id");
             final Integer accountTypeEnum = rs.getInt("accountTypeEnum");
             final Integer prefixTypeEnum = JdbcSupport.getInteger(rs, "prefixTypeEnum");
+            final String prefixCharacter = rs.getString("prefixCharacter");
 
             final EnumOptionData accountNumberType = AccountNumberFormatEnumerations.entityAccountType(accountTypeEnum);
             EnumOptionData prefixType = null;
             if (prefixTypeEnum != null) {
                 prefixType = AccountNumberFormatEnumerations.accountNumberPrefixType(prefixTypeEnum);
             }
-            return new AccountNumberFormatData(id, accountNumberType, prefixType);
+            return new AccountNumberFormatData(id, accountNumberType, prefixType, prefixCharacter);
         }
     }
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatWritePlatformServiceJpaRepositoryImpl.java
index 36ae1e3..f458187 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatWritePlatformServiceJpaRepositoryImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatWritePlatformServiceJpaRepositoryImpl.java
@@ -68,7 +68,9 @@ public class AccountNumberFormatWritePlatformServiceJpaRepositoryImpl implements
                 accountNumberPrefixType = AccountNumberPrefixType.fromInt(prefixTypeId);
             }
 
-            AccountNumberFormat accountNumberFormat = new AccountNumberFormat(entityAccountType, accountNumberPrefixType);
+            String prefixCharacter = command.stringValueOfParameterNamed(AccountNumberFormatConstants.prefixCharacterParamName);
+
+            AccountNumberFormat accountNumberFormat = new AccountNumberFormat(entityAccountType, accountNumberPrefixType, prefixCharacter);
 
             this.accountNumberFormatRepository.save(accountNumberFormat);
 
@@ -106,6 +108,13 @@ public class AccountNumberFormatWritePlatformServiceJpaRepositoryImpl implements
                 accountNumberFormatForUpdate.setPrefix(accountNumberPrefixType);
             }
 
+            if (command.isChangeInStringParameterNamed(AccountNumberFormatConstants.prefixCharacterParamName,
+                    accountNumberFormatForUpdate.getPrefixCharacter())) {
+                final String newValue = command.stringValueOfParameterNamed(AccountNumberFormatConstants.prefixCharacterParamName);
+                actualChanges.put(AccountNumberFormatConstants.prefixCharacterParamName, newValue);
+                accountNumberFormatForUpdate.setPrefixCharacter(newValue);
+            }
+
             if (!actualChanges.isEmpty()) {
                 this.accountNumberFormatRepository.saveAndFlush(accountNumberFormatForUpdate);
             }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java
index 6a3bb31..1195bd6 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormat;
 import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormatEnumerations.AccountNumberPrefixType;
+import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormatRepository;
 import org.apache.fineract.infrastructure.codes.domain.CodeValue;
 import org.apache.fineract.infrastructure.configuration.data.GlobalConfigurationPropertyData;
 import org.apache.fineract.infrastructure.configuration.service.ConfigurationReadPlatformService;
@@ -48,11 +49,15 @@ public class AccountNumberGenerator {
     private static final String LOAN_PRODUCT_SHORT_NAME = "loanProductShortName";
     private static final String SAVINGS_PRODUCT_SHORT_NAME = "savingsProductShortName";
     private static final String SHARE_PRODUCT_SHORT_NAME = "sharesProductShortName";
+    private static final String PREFIX_SHORT_NAME = "prefixShortName";
+    private final AccountNumberFormatRepository accountNumberFormatRepository;
     private final ConfigurationReadPlatformService configurationReadPlatformService;
 
     @Autowired
-    public AccountNumberGenerator(final ConfigurationReadPlatformService configurationReadPlatformService) {
+    public AccountNumberGenerator(final ConfigurationReadPlatformService configurationReadPlatformService,
+            final AccountNumberFormatRepository accountNumberFormatRepository) {
         this.configurationReadPlatformService = configurationReadPlatformService;
+        this.accountNumberFormatRepository = accountNumberFormatRepository;
     }
 
     public String generate(Client client, AccountNumberFormat accountNumberFormat) {
@@ -101,7 +106,6 @@ public class AccountNumberGenerator {
             if (customLength.getValue() != null) {
                 accountMaxLength = customLength.getValue().intValue();
             }
-
         }
 
         String accountNumber = StringUtils.leftPad(propertyMap.get(ID), accountMaxLength, '0');
@@ -125,6 +129,10 @@ public class AccountNumberGenerator {
                     prefix = propertyMap.get(SAVINGS_PRODUCT_SHORT_NAME);
                 break;
 
+                case PREFIX_SHORT_NAME:
+                    generatePrefix(propertyMap, propertyMap.get(ID), accountMaxLength, accountNumberFormat);
+                    prefix = propertyMap.get(PREFIX_SHORT_NAME);
+                break;
             }
 
             // FINERACT-590
@@ -133,12 +141,38 @@ public class AccountNumberGenerator {
             if (prefix != null) {
                 prefix = prefix.substring(0, Math.min(prefix.length(), 10));
             }
+            if (accountNumberPrefixType.getValue().equals(AccountNumberPrefixType.PREFIX_SHORT_NAME.getValue())) {
+                Integer prefixLength = prefix.length();
+                Integer numberLength = accountMaxLength - prefixLength;
+                accountNumber = StringUtils.leftPad(propertyMap.get(ID), numberLength, '0');
+            } else {
+                accountNumber = StringUtils.leftPad(accountNumber, Integer.valueOf(propertyMap.get(ID).length()), '0');
+            }
 
             accountNumber = StringUtils.overlay(accountNumber, prefix, 0, 0);
         }
         return accountNumber;
     }
 
+    private Map<String, String> generatePrefix(Map<String, String> propertyMap, String accountNumber, Integer accountMaxLength,
+            AccountNumberFormat accountNumberFormat) {
+
+        String prefix = accountNumberFormat.getPrefixCharacter();
+        Integer prefixLength = prefix.length();
+
+        Integer totalLength = prefixLength + Integer.valueOf(propertyMap.get(ID).length());
+
+        prefixLength = totalLength - accountMaxLength;
+
+        if (prefixLength > 0) {
+            prefix = prefix.substring(0, prefix.length() - prefixLength);
+        }
+
+        propertyMap.put(PREFIX_SHORT_NAME, prefix);
+
+        return propertyMap;
+    }
+
     public String generateGroupAccountNumber(Group group, AccountNumberFormat accountNumberFormat) {
         Map<String, String> propertyMap = new HashMap<>();
         propertyMap.put(ID, group.getId().toString());
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V220_1__prefix_type_account_number.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V220_1__prefix_type_account_number.sql
new file mode 100644
index 0000000..47bab73
--- /dev/null
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V220_1__prefix_type_account_number.sql
@@ -0,0 +1,23 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied. See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+--
+
+
+
+ALTER TABLE `c_account_number_format`
+    ADD COLUMN `prefix_character` VARCHAR(50) NULL DEFAULT NULL AFTER `prefix_type_enum`;