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

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

commit cb8cbd2043fe2d3074594d5331eb81bfa8c3809a
Author: adam.magyari <[email protected]>
AuthorDate: Mon Apr 14 12:14:13 2025 +0200

    FINERACT-2232: Generalization of StringEnumOptionData enums
---
 .../infrastructure/core/api/ApiFacingEnum.java     | 31 ++++++++++------------
 .../domain/DaysInYearCustomStrategyType.java       | 17 ++----------
 .../LoanCapitalizedIncomeCalculationType.java      | 18 ++-----------
 .../domain/LoanCapitalizedIncomeStrategy.java      | 17 ++----------
 .../loanaccount/domain/LoanChargeOffBehaviour.java | 13 ++-------
 .../loanproduct/data/LoanProductData.java          |  8 +++---
 .../domain/LoanSupportedInterestRefundTypes.java   | 13 ++-------
 .../loanaccount/api/LoansApiResource.java          |  7 ++---
 .../service/LoanReadPlatformServiceImpl.java       | 13 ++++-----
 .../loanproduct/api/LoanProductsApiResource.java   | 20 +++++++-------
 .../LoanProductReadPlatformServiceImpl.java        | 13 ++++-----
 11 files changed, 58 insertions(+), 112 deletions(-)

diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargeOffBehaviour.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ApiFacingEnum.java
similarity index 51%
copy from 
fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargeOffBehaviour.java
copy to 
fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ApiFacingEnum.java
index 7d7ee2a387..9b73a7f90e 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargeOffBehaviour.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ApiFacingEnum.java
@@ -16,31 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.portfolio.loanaccount.domain;
+package org.apache.fineract.infrastructure.core.api;
 
 import java.util.Arrays;
 import java.util.List;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
 
-@Getter
-@RequiredArgsConstructor
-public enum LoanChargeOffBehaviour {
+public interface ApiFacingEnum<T extends Enum<T> & ApiFacingEnum<T>> {
 
-    REGULAR("chargeOffBehaviour.regular", "Regular"), //
-    ZERO_INTEREST("chargeOffBehaviour.zeroInterest", "Zero interest after 
charge-off"), //
-    ACCELERATE_MATURITY("chargeOffBehaviour.accelerateMaturity", "Accelerate 
maturity to charge-off date"), //
-    ;
-
-    private final String code;
-    private final String humanReadableName;
+    static <T extends Enum<T> & ApiFacingEnum<T>> List<StringEnumOptionData> 
getValuesAsStringEnumOptionDataList(Class<T> clazz) {
+        return Arrays.stream(clazz.getEnumConstants()).map(v -> new 
StringEnumOptionData(v.name(), v.getCode(), v.getHumanReadableName()))
+                .toList();
+    }
 
-    public static List<StringEnumOptionData> 
getValuesAsStringEnumOptionDataList() {
-        return Arrays.stream(values()).map(v -> new 
StringEnumOptionData(v.name(), v.getCode(), v.getHumanReadableName())).toList();
+    static <T extends Enum<T> & ApiFacingEnum<T>> StringEnumOptionData 
getStringEnumOptionData(Class<T> clazz, String name) {
+        return name == null || name.trim().isEmpty() ? null : 
Enum.valueOf(clazz, name).getValueAsStringEnumOptionData();
     }
 
-    public StringEnumOptionData getValueAsStringEnumOptionData() {
-        return new StringEnumOptionData(name(), getCode(), 
getHumanReadableName());
+    default StringEnumOptionData getValueAsStringEnumOptionData() {
+        return new StringEnumOptionData(((Enum<T>) this).name(), getCode(), 
getHumanReadableName());
     }
+
+    String getCode();
+
+    String getHumanReadableName();
 }
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInYearCustomStrategyType.java
 
b/fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInYearCustomStrategyType.java
index 97bdf8c99b..80d62d90f8 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInYearCustomStrategyType.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInYearCustomStrategyType.java
@@ -18,11 +18,9 @@
  */
 package org.apache.fineract.portfolio.common.domain;
 
-import java.util.Arrays;
-import java.util.List;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 
 /**
  * Defines the method of leap year calculation for determining the number of 
days in a year.
@@ -53,7 +51,7 @@ import 
org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
  */
 @Getter
 @RequiredArgsConstructor
-public enum DaysInYearCustomStrategyType {
+public enum DaysInYearCustomStrategyType implements 
ApiFacingEnum<DaysInYearCustomStrategyType> {
 
     /** Always considers 366 days in a leap year. */
     FULL_LEAP_YEAR("DaysInYearCustomStrategyType.fullLeapYear", "Full Leap 
Year"),
@@ -64,15 +62,4 @@ public enum DaysInYearCustomStrategyType {
     private final String code;
     private final String humanReadableName;
 
-    public static List<StringEnumOptionData> 
getValuesAsStringEnumOptionDataList() {
-        return Arrays.stream(values()).map(v -> new 
StringEnumOptionData(v.name(), v.getCode(), v.getHumanReadableName())).toList();
-    }
-
-    public StringEnumOptionData getValueAsStringEnumOptionData() {
-        return new StringEnumOptionData(name(), getCode(), 
getHumanReadableName());
-    }
-
-    public static StringEnumOptionData getStringEnumOptionData(String name) {
-        return name == null || name.trim().isEmpty() ? null : 
DaysInYearCustomStrategyType.valueOf(name).getValueAsStringEnumOptionData();
-    }
 }
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCapitalizedIncomeCalculationType.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCapitalizedIncomeCalculationType.java
index 5916b0074e..8b30a94594 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCapitalizedIncomeCalculationType.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCapitalizedIncomeCalculationType.java
@@ -18,31 +18,17 @@
  */
 package org.apache.fineract.portfolio.loanaccount.domain;
 
-import java.util.Arrays;
-import java.util.List;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 
 @Getter
 @RequiredArgsConstructor
-public enum LoanCapitalizedIncomeCalculationType {
+public enum LoanCapitalizedIncomeCalculationType implements 
ApiFacingEnum<LoanCapitalizedIncomeCalculationType> {
 
     FLAT("loanCapitalizedIncomeCalculationType.flat", "Flat");
 
     private final String code;
     private final String humanReadableName;
 
-    public static List<StringEnumOptionData> 
getValuesAsStringEnumOptionDataList() {
-        return Arrays.stream(values()).map(v -> new 
StringEnumOptionData(v.name(), v.getCode(), v.getHumanReadableName())).toList();
-    }
-
-    public StringEnumOptionData getValueAsStringEnumOptionData() {
-        return new StringEnumOptionData(name(), getCode(), 
getHumanReadableName());
-    }
-
-    public static StringEnumOptionData getStringEnumOptionData(String name) {
-        return name == null || name.trim().isEmpty() ? null
-                : 
LoanCapitalizedIncomeCalculationType.valueOf(name).getValueAsStringEnumOptionData();
-    }
 }
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCapitalizedIncomeStrategy.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCapitalizedIncomeStrategy.java
index b0d489ce6b..16df54bae5 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCapitalizedIncomeStrategy.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCapitalizedIncomeStrategy.java
@@ -18,30 +18,17 @@
  */
 package org.apache.fineract.portfolio.loanaccount.domain;
 
-import java.util.Arrays;
-import java.util.List;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 
 @Getter
 @RequiredArgsConstructor
-public enum LoanCapitalizedIncomeStrategy {
+public enum LoanCapitalizedIncomeStrategy implements 
ApiFacingEnum<LoanCapitalizedIncomeStrategy> {
 
     EQUAL_AMORTIZATION("capitalizedIncome.strategy.equalAmortization", "Equal 
amortization");
 
     private final String code;
     private final String humanReadableName;
 
-    public static List<StringEnumOptionData> 
getValuesAsStringEnumOptionDataList() {
-        return Arrays.stream(values()).map(v -> new 
StringEnumOptionData(v.name(), v.getCode(), v.getHumanReadableName())).toList();
-    }
-
-    public StringEnumOptionData getValueAsStringEnumOptionData() {
-        return new StringEnumOptionData(name(), getCode(), 
getHumanReadableName());
-    }
-
-    public static StringEnumOptionData getStringEnumOptionData(String name) {
-        return name == null || name.trim().isEmpty() ? null : 
LoanCapitalizedIncomeStrategy.valueOf(name).getValueAsStringEnumOptionData();
-    }
 }
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargeOffBehaviour.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargeOffBehaviour.java
index 7d7ee2a387..0441e9fece 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargeOffBehaviour.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargeOffBehaviour.java
@@ -18,15 +18,13 @@
  */
 package org.apache.fineract.portfolio.loanaccount.domain;
 
-import java.util.Arrays;
-import java.util.List;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 
 @Getter
 @RequiredArgsConstructor
-public enum LoanChargeOffBehaviour {
+public enum LoanChargeOffBehaviour implements 
ApiFacingEnum<LoanChargeOffBehaviour> {
 
     REGULAR("chargeOffBehaviour.regular", "Regular"), //
     ZERO_INTEREST("chargeOffBehaviour.zeroInterest", "Zero interest after 
charge-off"), //
@@ -36,11 +34,4 @@ public enum LoanChargeOffBehaviour {
     private final String code;
     private final String humanReadableName;
 
-    public static List<StringEnumOptionData> 
getValuesAsStringEnumOptionDataList() {
-        return Arrays.stream(values()).map(v -> new 
StringEnumOptionData(v.name(), v.getCode(), v.getHumanReadableName())).toList();
-    }
-
-    public StringEnumOptionData getValueAsStringEnumOptionData() {
-        return new StringEnumOptionData(name(), getCode(), 
getHumanReadableName());
-    }
 }
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java
index 4ed7c23820..bcece9c7a4 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java
@@ -34,6 +34,7 @@ import 
org.apache.fineract.accounting.producttoaccountmapping.data.ChargeOffReas
 import 
org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper;
 import 
org.apache.fineract.accounting.producttoaccountmapping.data.PaymentTypeToGLAccountMapper;
 import org.apache.fineract.infrastructure.codes.data.CodeValueData;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
 import org.apache.fineract.organisation.monetary.data.CurrencyData;
@@ -976,9 +977,10 @@ public class LoanProductData implements Serializable {
         this.chargeOffBehaviourOptions = null;
         this.chargeOffReasonOptions = null;
         this.interestRecognitionOnDisbursementDate = 
interestRecognitionOnDisbursementDate;
-        this.daysInYearCustomStrategyOptions = 
DaysInYearCustomStrategyType.getValuesAsStringEnumOptionDataList();
-        this.capitalizedIncomeCalculationTypeOptions = 
LoanCapitalizedIncomeCalculationType.getValuesAsStringEnumOptionDataList();
-        this.capitalizedIncomeStrategyOptions = 
LoanCapitalizedIncomeStrategy.getValuesAsStringEnumOptionDataList();
+        this.daysInYearCustomStrategyOptions = 
ApiFacingEnum.getValuesAsStringEnumOptionDataList(DaysInYearCustomStrategyType.class);
+        this.capitalizedIncomeCalculationTypeOptions = ApiFacingEnum
+                
.getValuesAsStringEnumOptionDataList(LoanCapitalizedIncomeCalculationType.class);
+        this.capitalizedIncomeStrategyOptions = 
ApiFacingEnum.getValuesAsStringEnumOptionDataList(LoanCapitalizedIncomeStrategy.class);
     }
 
     public LoanProductData(final LoanProductData productData, final 
Collection<ChargeData> chargeOptions,
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanSupportedInterestRefundTypes.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanSupportedInterestRefundTypes.java
index 565c862ee4..9e89908006 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanSupportedInterestRefundTypes.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanSupportedInterestRefundTypes.java
@@ -18,16 +18,14 @@
  */
 package org.apache.fineract.portfolio.loanproduct.domain;
 
-import java.util.Arrays;
-import java.util.List;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType;
 
 @Getter
 @RequiredArgsConstructor
-public enum LoanSupportedInterestRefundTypes {
+public enum LoanSupportedInterestRefundTypes implements 
ApiFacingEnum<LoanSupportedInterestRefundTypes> {
 
     MERCHANT_ISSUED_REFUND(LoanTransactionType.MERCHANT_ISSUED_REFUND, 
"loanRefundType.merchant_issued_refund", "Merchant issued refund"), //
     PAYOUT_REFUND(LoanTransactionType.PAYOUT_REFUND, 
"loanRefundType.payout_refund", "Payout refund"), //
@@ -37,11 +35,4 @@ public enum LoanSupportedInterestRefundTypes {
     private final String code;
     private final String humanReadableName;
 
-    public static List<StringEnumOptionData> 
getValuesAsStringEnumOptionDataList() {
-        return Arrays.stream(values()).map(v -> new 
StringEnumOptionData(v.name(), v.getCode(), v.getHumanReadableName())).toList();
-    }
-
-    public StringEnumOptionData getValueAsStringEnumOptionData() {
-        return new StringEnumOptionData(name(), getCode(), 
getHumanReadableName());
-    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java
index b57888bc03..b3485d1788 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java
@@ -67,6 +67,7 @@ import 
org.apache.fineract.infrastructure.bulkimport.service.BulkImportWorkbookS
 import org.apache.fineract.infrastructure.codes.data.CodeValueData;
 import 
org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService;
 import 
org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 import org.apache.fineract.infrastructure.core.api.ApiParameterHelper;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.api.JsonQuery;
@@ -1137,9 +1138,9 @@ public class LoansApiResource {
                 loanCollateralOptions, calendarOptions, notes, 
accountLinkingOptions, linkedAccount, disbursementData, emiAmountVariations,
                 overdueCharges, paidInAdvanceTemplate, interestRatesPeriods, 
clientActiveLoanOptions, rates, isRatesEnabled, collectionData,
                 LoanScheduleType.getValuesAsEnumOptionDataList(), 
LoanScheduleProcessingType.getValuesAsEnumOptionDataList(),
-                loanTermVariations, 
DaysInYearCustomStrategyType.getValuesAsStringEnumOptionDataList(),
-                
LoanCapitalizedIncomeCalculationType.getValuesAsStringEnumOptionDataList(),
-                
LoanCapitalizedIncomeStrategy.getValuesAsStringEnumOptionDataList());
+                loanTermVariations, 
ApiFacingEnum.getValuesAsStringEnumOptionDataList(DaysInYearCustomStrategyType.class),
+                
ApiFacingEnum.getValuesAsStringEnumOptionDataList(LoanCapitalizedIncomeCalculationType.class),
+                
ApiFacingEnum.getValuesAsStringEnumOptionDataList(LoanCapitalizedIncomeStrategy.class));
 
         final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters(),
                 mandatoryResponseParameters);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
index e2399aeeab..6cdd349306 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
@@ -43,6 +43,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.fineract.infrastructure.codes.data.CodeValueData;
 import 
org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService;
 import 
org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
 import org.apache.fineract.infrastructure.core.domain.ExternalId;
@@ -1101,13 +1102,13 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService, Loa
             final Integer fixedLength = JdbcSupport.getInteger(rs, 
"fixedLength");
             final LoanChargeOffBehaviour chargeOffBehaviour = 
LoanChargeOffBehaviour.valueOf(rs.getString("chargeOffBehaviour"));
             final boolean interestRecognitionOnDisbursementDate = 
rs.getBoolean("interestRecognitionOnDisbursementDate");
-            final StringEnumOptionData daysInYearCustomStrategy = 
DaysInYearCustomStrategyType
-                    
.getStringEnumOptionData(rs.getString("daysInYearCustomStrategy"));
+            final StringEnumOptionData daysInYearCustomStrategy = 
ApiFacingEnum.getStringEnumOptionData(DaysInYearCustomStrategyType.class,
+                    rs.getString("daysInYearCustomStrategy"));
             final boolean enableIncomeCapitalization = 
rs.getBoolean("enableIncomeCapitalization");
-            final StringEnumOptionData capitalizedIncomeCalculationType = 
LoanCapitalizedIncomeCalculationType
-                    
.getStringEnumOptionData(rs.getString("capitalizedIncomeCalculationType"));
-            final StringEnumOptionData capitalizedIncomeStrategy = 
LoanCapitalizedIncomeStrategy
-                    
.getStringEnumOptionData(rs.getString("capitalizedIncomeStrategy"));
+            final StringEnumOptionData capitalizedIncomeCalculationType = 
ApiFacingEnum
+                    
.getStringEnumOptionData(LoanCapitalizedIncomeCalculationType.class, 
rs.getString("capitalizedIncomeCalculationType"));
+            final StringEnumOptionData capitalizedIncomeStrategy = 
ApiFacingEnum
+                    
.getStringEnumOptionData(LoanCapitalizedIncomeStrategy.class, 
rs.getString("capitalizedIncomeStrategy"));
 
             return LoanAccountData.basicLoanDetails(id, accountNo, status, 
externalId, clientId, clientAccountNo, clientName,
                     clientOfficeId, clientExternalId, groupData, loanType, 
loanProductId, loanProductName, loanProductDescription,
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java
index 271b1f7107..eb41c4228d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java
@@ -58,6 +58,7 @@ import 
org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformS
 import org.apache.fineract.infrastructure.codes.data.CodeValueData;
 import 
org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService;
 import 
org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 import org.apache.fineract.infrastructure.core.api.ApiParameterHelper;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
@@ -437,17 +438,18 @@ public class LoanProductsApiResource {
         final List<EnumOptionData> advancedPaymentAllocationTypes = 
PaymentAllocationType.getValuesAsEnumOptionDataList();
         final List<EnumOptionData> creditAllocationTransactionTypes = 
CreditAllocationTransactionType.getValuesAsEnumOptionDataList();
         final List<EnumOptionData> creditAllocationAllocationTypes = 
AllocationType.getValuesAsEnumOptionDataList();
-        final List<StringEnumOptionData> supportedInterestRefundTypesOptions = 
LoanSupportedInterestRefundTypes
-                .getValuesAsStringEnumOptionDataList();
-        final List<StringEnumOptionData> chargeOffBehaviourOptions = 
LoanChargeOffBehaviour.getValuesAsStringEnumOptionDataList();
+        final List<StringEnumOptionData> supportedInterestRefundTypesOptions = 
ApiFacingEnum
+                
.getValuesAsStringEnumOptionDataList(LoanSupportedInterestRefundTypes.class);
+        final List<StringEnumOptionData> chargeOffBehaviourOptions = 
ApiFacingEnum
+                
.getValuesAsStringEnumOptionDataList(LoanChargeOffBehaviour.class);
         final List<CodeValueData> chargeOffReasonOptions = 
codeValueReadPlatformService
                 .retrieveCodeValuesByCode(LoanApiConstants.CHARGE_OFF_REASONS);
-        final List<StringEnumOptionData> daysInYearCustomStrategyOptions = 
DaysInYearCustomStrategyType
-                .getValuesAsStringEnumOptionDataList();
-        final List<StringEnumOptionData> 
capitalizedIncomeCalculationTypeOptions = LoanCapitalizedIncomeCalculationType
-                .getValuesAsStringEnumOptionDataList();
-        final List<StringEnumOptionData> capitalizedIncomeStrategyOptions = 
LoanCapitalizedIncomeStrategy
-                .getValuesAsStringEnumOptionDataList();
+        final List<StringEnumOptionData> daysInYearCustomStrategyOptions = 
ApiFacingEnum
+                
.getValuesAsStringEnumOptionDataList(DaysInYearCustomStrategyType.class);
+        final List<StringEnumOptionData> 
capitalizedIncomeCalculationTypeOptions = ApiFacingEnum
+                
.getValuesAsStringEnumOptionDataList(LoanCapitalizedIncomeCalculationType.class);
+        final List<StringEnumOptionData> capitalizedIncomeStrategyOptions = 
ApiFacingEnum
+                
.getValuesAsStringEnumOptionDataList(LoanCapitalizedIncomeStrategy.class);
 
         return new LoanProductData(productData, chargeOptions, penaltyOptions, 
paymentTypeOptions, currencyOptions, amortizationTypeOptions,
                 interestTypeOptions, interestCalculationPeriodTypeOptions, 
repaymentFrequencyTypeOptions, interestRateFrequencyTypeOptions,
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
index 4c436216c1..7c316aa180 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
@@ -29,6 +29,7 @@ import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 import lombok.RequiredArgsConstructor;
 import org.apache.fineract.accounting.common.AccountingEnumerations;
+import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
 import org.apache.fineract.infrastructure.core.domain.ExternalId;
@@ -435,8 +436,8 @@ public class LoanProductReadPlatformServiceImpl implements 
LoanProductReadPlatfo
             final int daysInMonth = JdbcSupport.getInteger(rs, "daysInMonth");
             final EnumOptionData daysInMonthType = 
CommonEnumerations.daysInMonthType(daysInMonth);
             final int daysInYear = JdbcSupport.getInteger(rs, "daysInYear");
-            final StringEnumOptionData daysInYearCustomStrategy = 
DaysInYearCustomStrategyType
-                    
.getStringEnumOptionData(rs.getString("daysInYearCustomStrategy"));
+            final StringEnumOptionData daysInYearCustomStrategy = 
ApiFacingEnum.getStringEnumOptionData(DaysInYearCustomStrategyType.class,
+                    rs.getString("daysInYearCustomStrategy"));
             final EnumOptionData daysInYearType = 
CommonEnumerations.daysInYearType(daysInYear);
             final Integer installmentAmountInMultiplesOf = 
JdbcSupport.getInteger(rs, "installmentAmountInMultiplesOf");
             final boolean canDefineInstallmentAmount = 
rs.getBoolean("canDefineInstallmentAmount");
@@ -558,10 +559,10 @@ public class LoanProductReadPlatformServiceImpl 
implements LoanProductReadPlatfo
             final LoanChargeOffBehaviour loanChargeOffBehaviour = 
LoanChargeOffBehaviour.valueOf(chargeOffBehaviourStr);
             final boolean interestRecognitionOnDisbursementDate = 
rs.getBoolean("interestRecognitionOnDisbursementDate");
             final boolean enableIncomeCapitalization = 
rs.getBoolean("enableIncomeCapitalization");
-            final StringEnumOptionData capitalizedIncomeCalculationType = 
LoanCapitalizedIncomeCalculationType
-                    
.getStringEnumOptionData(rs.getString("capitalizedIncomeCalculationType"));
-            final StringEnumOptionData capitalizedIncomeStrategy = 
LoanCapitalizedIncomeStrategy
-                    
.getStringEnumOptionData(rs.getString("capitalizedIncomeStrategy"));
+            final StringEnumOptionData capitalizedIncomeCalculationType = 
ApiFacingEnum
+                    
.getStringEnumOptionData(LoanCapitalizedIncomeCalculationType.class, 
rs.getString("capitalizedIncomeCalculationType"));
+            final StringEnumOptionData capitalizedIncomeStrategy = 
ApiFacingEnum
+                    
.getStringEnumOptionData(LoanCapitalizedIncomeStrategy.class, 
rs.getString("capitalizedIncomeStrategy"));
 
             return new LoanProductData(id, name, shortName, description, 
currency, principal, minPrincipal, maxPrincipal, tolerance,
                     numberOfRepayments, minNumberOfRepayments, 
maxNumberOfRepayments, repaymentEvery, interestRatePerPeriod,

Reply via email to