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

arnold 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 fb0556c20 Specify query parameters for LoansApi retrieveLoan
fb0556c20 is described below

commit fb0556c20ea92628a953f371b8cd500681e5bcb0
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Thu Jun 16 10:02:39 2022 -0500

    Specify query parameters for LoansApi retrieveLoan
---
 .../AdHocScheduledJobRunnerServiceImpl.java        |  2 +-
 .../internal/GetLoanByIdCommandStrategy.java       | 22 ++++++++++-
 .../core/api/ApiParameterHelper.java               | 28 +++++++-------
 .../loanaccount/api/LoanApiConstants.java          |  5 +++
 .../loanaccount/api/LoansApiResource.java          | 18 ++++-----
 .../LoanWritePlatformServiceJpaRepositoryImpl.java | 14 ++-----
 .../self/loanaccount/api/SelfLoansApiResource.java |  6 ++-
 .../internal/GetLoanByIdCommandStrategyTest.java   | 44 +++++++++++++++-------
 8 files changed, 89 insertions(+), 50 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java
index e5f62bcc3..f2a81e238 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java
@@ -82,7 +82,7 @@ public class AdHocScheduledJobRunnerServiceImpl implements 
AdHocScheduledJobRunn
                                 run = 
Math.toIntExact(ChronoUnit.YEARS.between(start, end)) >= 1;
                             break;
                             case CUSTOM:
-                                next = start.plusDays((int) (long) 
adhoc.getReportRunEvery());
+                                next = start.plusDays((long) 
adhoc.getReportRunEvery());
                                 run = 
Math.toIntExact(ChronoUnit.DAYS.between(start, end)) >= 
adhoc.getReportRunEvery();
                             break;
                             default:
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/GetLoanByIdCommandStrategy.java
 
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/GetLoanByIdCommandStrategy.java
index 7408aee42..66781ec3a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/GetLoanByIdCommandStrategy.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/GetLoanByIdCommandStrategy.java
@@ -72,9 +72,10 @@ public class GetLoanByIdCommandStrategy implements 
CommandStrategy {
             // - Add them to the UriInfo query parameters list
             // - Call loansApiResource.retrieveLoan(loanId, false, uriInfo)
             // - Remove the relative url query parameters from UriInfo in the 
finally (after loan details are retrieved)
+            Map<String, String> queryParameters = null;
             if (relativeUrl.indexOf('?') > 0) {
                 loanId = 
Long.parseLong(StringUtils.substringBetween(relativeUrl, "/", "?"));
-                Map<String, String> queryParameters = 
getQueryParameters(relativeUrl);
+                queryParameters = getQueryParameters(relativeUrl);
 
                 // Add the query parameters sent in the relative URL to UriInfo
                 addQueryParametersToUriInfo(parameterizedUriInfo, 
queryParameters);
@@ -84,7 +85,24 @@ public class GetLoanByIdCommandStrategy implements 
CommandStrategy {
 
             // Calls 'retrieveLoan' function from 'LoansApiResource' to
             // get the loan details based on the loan id
-            responseBody = loansApiResource.retrieveLoan(loanId, false, 
parameterizedUriInfo);
+            final boolean staffInSelectedOfficeOnly = false;
+            String associations = null;
+            String exclude = null;
+            String fields = null;
+            if (queryParameters != null && queryParameters.size() > 0) {
+                if (queryParameters.containsKey("associations")) {
+                    associations = queryParameters.get("associations");
+                }
+                if (queryParameters.containsKey("exclude")) {
+                    exclude = queryParameters.get("exclude");
+                }
+                if (queryParameters.containsKey("fields")) {
+                    fields = queryParameters.get("fields");
+                }
+            }
+
+            responseBody = loansApiResource.retrieveLoan(loanId, 
staffInSelectedOfficeOnly, associations, exclude, fields,
+                    parameterizedUriInfo);
 
             response.setStatusCode(HttpStatus.SC_OK);
 
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ApiParameterHelper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ApiParameterHelper.java
index d1e929fe4..b48d6c95b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ApiParameterHelper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ApiParameterHelper.java
@@ -48,11 +48,11 @@ public final class ApiParameterHelper {
 
     public static Set<String> extractFieldsForResponseIfProvided(final 
MultivaluedMap<String, String> queryParams) {
         Set<String> fields = new HashSet<>();
-        String commaSerperatedParameters = "";
+        String commaSeparatedParameters = "";
         if (queryParams.getFirst("fields") != null) {
-            commaSerperatedParameters = queryParams.getFirst("fields");
-            if (StringUtils.isNotBlank(commaSerperatedParameters)) {
-                fields = new 
HashSet<>(Arrays.asList(commaSerperatedParameters.split("\\s*,\\s*"))); // 
NOSONAR
+            commaSeparatedParameters = queryParams.getFirst("fields");
+            if (StringUtils.isNotBlank(commaSeparatedParameters)) {
+                fields = new 
HashSet<>(Arrays.asList(commaSeparatedParameters.split("\\s*,\\s*"))); // 
NOSONAR
             }
         }
         return fields;
@@ -60,23 +60,25 @@ public final class ApiParameterHelper {
 
     public static Set<String> extractAssociationsForResponseIfProvided(final 
MultivaluedMap<String, String> queryParams) {
         Set<String> fields = new HashSet<>();
-        String commaSerperatedParameters = "";
+        String commaSeparatedParameters = "";
         if (queryParams.getFirst("associations") != null) {
-            commaSerperatedParameters = queryParams.getFirst("associations");
-            if (StringUtils.isNotBlank(commaSerperatedParameters)) {
-                fields = new 
HashSet<>(Arrays.asList(commaSerperatedParameters.split("\\s*,\\s*"))); // 
NOSONAR
+            commaSeparatedParameters = queryParams.getFirst("associations");
+            if (StringUtils.isNotBlank(commaSeparatedParameters)) {
+                fields = new 
HashSet<>(Arrays.asList(commaSeparatedParameters.split("\\s*,\\s*"))); // 
NOSONAR
             }
         }
         return fields;
     }
 
+    public static void excludeAssociationsForResponseIfProvided(final String 
commaSeparatedParameters, Set<String> fields) {
+        if (StringUtils.isNotBlank(commaSeparatedParameters)) {
+            fields.removeAll(new 
HashSet<>(Arrays.asList(commaSeparatedParameters.split("\\s*,\\s*")))); // 
NOSONAR
+        }
+    }
+
     public static void excludeAssociationsForResponseIfProvided(final 
MultivaluedMap<String, String> queryParams, Set<String> fields) {
-        String commaSerperatedParameters = "";
         if (queryParams.getFirst("exclude") != null) {
-            commaSerperatedParameters = queryParams.getFirst("exclude");
-            if (StringUtils.isNotBlank(commaSerperatedParameters)) {
-                fields.removeAll(new 
HashSet<>(Arrays.asList(commaSerperatedParameters.split("\\s*,\\s*")))); // 
NOSONAR
-            }
+            
excludeAssociationsForResponseIfProvided(queryParams.getFirst("exclude"), 
fields);
         }
     }
 
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java
index 0bac3570e..60c4b81cb 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java
@@ -80,6 +80,10 @@ public interface LoanApiConstants {
     String daysInYearTypeParameterName = "daysInYearType";
     String daysInMonthTypeParameterName = "daysInMonthType";
 
+    String MULTIDISBURSE_DETAILS_PARAMNAME = "multiDisburseDetails";
+    String EMI_AMOUNT_VARIATIONS_PARAMNAME = "emiAmountVariations";
+    String COLLECTION_PARAMNAME = "collection";
+
     // Interest recalculation related
     String isInterestRecalculationEnabledParameterName = 
"isInterestRecalculationEnabled";
     String interestRecalculationCompoundingMethodParameterName = 
"interestRecalculationCompoundingMethod";
@@ -137,4 +141,5 @@ public interface LoanApiConstants {
 
     String fixedPrincipalPercentagePerInstallmentParamName = 
"fixedPrincipalPercentagePerInstallment";
 
+    String LOAN_ASSOCIATIONS_ALL = "all";
 }
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 702cb56cb..58e08f18b 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
@@ -23,7 +23,9 @@ import static 
org.apache.fineract.portfolio.loanproduct.service.LoanEnumerations
 import com.google.gson.JsonElement;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
 import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.ExampleObject;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -96,8 +98,6 @@ import org.apache.fineract.portfolio.charge.data.ChargeData;
 import org.apache.fineract.portfolio.charge.domain.ChargeTimeType;
 import org.apache.fineract.portfolio.charge.service.ChargeReadPlatformService;
 import org.apache.fineract.portfolio.client.data.ClientData;
-import org.apache.fineract.portfolio.collateral.data.CollateralData;
-import 
org.apache.fineract.portfolio.collateral.service.CollateralReadPlatformService;
 import 
org.apache.fineract.portfolio.collateralmanagement.data.LoanCollateralResponseData;
 import 
org.apache.fineract.portfolio.collateralmanagement.service.LoanCollateralManagementReadPlatformService;
 import org.apache.fineract.portfolio.floatingrates.data.InterestRatePeriodData;
@@ -220,7 +220,8 @@ public class LoansApiResource {
             "loanCounter", "loanProductCounter", "notes", 
"accountLinkingOptions", "linkedAccount", "interestRateDifferential",
             "isFloatingInterestRate", "interestRatesPeriods", 
LoanApiConstants.canUseForTopup, LoanApiConstants.isTopup,
             LoanApiConstants.loanIdToClose, LoanApiConstants.topupAmount, 
LoanApiConstants.clientActiveLoanOptions,
-            LoanApiConstants.datatables, 
LoanProductConstants.RATES_PARAM_NAME));
+            LoanApiConstants.datatables, 
LoanProductConstants.RATES_PARAM_NAME, 
LoanApiConstants.MULTIDISBURSE_DETAILS_PARAMNAME,
+            LoanApiConstants.EMI_AMOUNT_VARIATIONS_PARAMNAME, 
LoanApiConstants.COLLECTION_PARAMNAME));
 
     private final Set<String> loanApprovalDataParameters = new 
HashSet<>(Arrays.asList("approvalDate", "approvalAmount"));
     final Set<String> glimAccountsDataParameters = new 
HashSet<>(Arrays.asList("glimId", "groupId", "clientId", "parentLoanAccountNo",
@@ -234,7 +235,6 @@ public class LoansApiResource {
     private final FundReadPlatformService fundReadPlatformService;
     private final ChargeReadPlatformService chargeReadPlatformService;
     private final LoanChargeReadPlatformService loanChargeReadPlatformService;
-    private final CollateralReadPlatformService 
loanCollateralReadPlatformService;
     private final LoanScheduleCalculationPlatformService 
calculationPlatformService;
     private final GuarantorReadPlatformService guarantorReadPlatformService;
     private final CodeValueReadPlatformService codeValueReadPlatformService;
@@ -264,7 +264,6 @@ public class LoansApiResource {
             final LoanProductReadPlatformService 
loanProductReadPlatformService,
             final LoanDropdownReadPlatformService dropdownReadPlatformService, 
final FundReadPlatformService fundReadPlatformService,
             final ChargeReadPlatformService chargeReadPlatformService, final 
LoanChargeReadPlatformService loanChargeReadPlatformService,
-            final CollateralReadPlatformService 
loanCollateralReadPlatformService,
             final LoanScheduleCalculationPlatformService 
calculationPlatformService,
             final GuarantorReadPlatformService guarantorReadPlatformService,
             final CodeValueReadPlatformService codeValueReadPlatformService, 
final GroupReadPlatformService groupReadPlatformService,
@@ -292,7 +291,6 @@ public class LoansApiResource {
         this.fundReadPlatformService = fundReadPlatformService;
         this.chargeReadPlatformService = chargeReadPlatformService;
         this.loanChargeReadPlatformService = loanChargeReadPlatformService;
-        this.loanCollateralReadPlatformService = 
loanCollateralReadPlatformService;
         this.calculationPlatformService = calculationPlatformService;
         this.guarantorReadPlatformService = guarantorReadPlatformService;
         this.codeValueReadPlatformService = codeValueReadPlatformService;
@@ -495,6 +493,10 @@ public class LoansApiResource {
             @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = 
LoansApiResourceSwagger.GetLoansLoanIdResponse.class))) })
     public String retrieveLoan(@PathParam("loanId") @Parameter(description = 
"loanId") final Long loanId,
             @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") 
@Parameter(description = "staffInSelectedOfficeOnly") final boolean 
staffInSelectedOfficeOnly,
+            @DefaultValue("all") @QueryParam("associations") @Parameter(in = 
ParameterIn.QUERY, name = "associations", description = "Loan object relations 
to be included in the response", required = false, examples = {
+                    @ExampleObject(value = "all"), @ExampleObject(value = 
"repaymentSchedule,transactions") }) final String associations,
+            @QueryParam("exclude") @Parameter(in = ParameterIn.QUERY, name = 
"exclude", description = "Optional Loan object relation list to be filtered in 
the response", required = false, example = "guarantors,futureSchedule") final 
String exclude,
+            @QueryParam("fields") @Parameter(in = ParameterIn.QUERY, name = 
"fields", description = "Optional Loan attribute list to be in the response", 
required = false, example = "id,principal,annualInterestRate") final String 
fields,
             @Context final UriInfo uriInfo) {
         
this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -535,7 +537,6 @@ public class LoansApiResource {
         LoanScheduleData repaymentSchedule = null;
         Collection<LoanChargeData> charges = null;
         Collection<GuarantorData> guarantors = null;
-        Collection<CollateralData> collateral = null;
         CalendarData meeting = null;
         Collection<NoteData> notes = null;
         PortfolioAccountData linkedAccount = null;
@@ -548,7 +549,6 @@ public class LoansApiResource {
         final Set<String> mandatoryResponseParameters = new HashSet<>();
         final Set<String> associationParameters = 
ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters());
         if (!associationParameters.isEmpty()) {
-
             if 
(associationParameters.contains(DataTableApiConstant.allAssociateParamName)) {
                 
associationParameters.addAll(Arrays.asList(DataTableApiConstant.repaymentScheduleAssociateParamName,
                         DataTableApiConstant.futureScheduleAssociateParamName, 
DataTableApiConstant.originalScheduleAssociateParamName,
@@ -558,7 +558,7 @@ public class LoansApiResource {
                         
DataTableApiConstant.multiDisburseDetailsAssociateParamName, 
DataTableApiConstant.collectionAssociateParamName));
             }
 
-            
ApiParameterHelper.excludeAssociationsForResponseIfProvided(uriInfo.getQueryParameters(),
 associationParameters);
+            
ApiParameterHelper.excludeAssociationsForResponseIfProvided(exclude, 
associationParameters);
 
             if 
(associationParameters.contains(DataTableApiConstant.guarantorsAssociateParamName))
 {
                 
mandatoryResponseParameters.add(DataTableApiConstant.guarantorsAssociateParamName);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
index 1db8638a5..080f5a19e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
@@ -142,7 +142,6 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanAccountDomainService;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanChargePaidBy;
-import 
org.apache.fineract.portfolio.loanaccount.domain.LoanChargePaidByRepository;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanChargeRepository;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanCollateralManagement;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanDisbursementDetails;
@@ -152,7 +151,6 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.LoanInterestRecalcualtio
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanLifecycleStateMachine;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanOverdueInstallmentCharge;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
-import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
@@ -238,7 +236,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
     private final FromJsonHelper fromApiJsonHelper;
     private final AccountTransferRepository accountTransferRepository;
     private final CalendarRepository calendarRepository;
-    private final LoanRepaymentScheduleInstallmentRepository 
repaymentScheduleInstallmentRepository;
     private final LoanScheduleHistoryWritePlatformService 
loanScheduleHistoryWritePlatformService;
     private final LoanApplicationCommandFromApiJsonHelper 
loanApplicationCommandFromApiJsonHelper;
     private final AccountAssociationsRepository accountAssociationRepository;
@@ -255,7 +252,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
     private final LoanRepository loanRepository;
     private final RepaymentWithPostDatedChecksAssembler 
repaymentWithPostDatedChecksAssembler;
     private final PostDatedChecksRepository postDatedChecksRepository;
-    private final LoanChargePaidByRepository loanChargePaidByRepository;
 
     @Autowired
     public LoanWritePlatformServiceJpaRepositoryImpl(final 
PlatformSecurityContext context,
@@ -274,7 +270,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             final LoanChargeReadPlatformService loanChargeReadPlatformService, 
final LoanReadPlatformService loanReadPlatformService,
             final FromJsonHelper fromApiJsonHelper, final 
AccountTransferRepository accountTransferRepository,
             final CalendarRepository calendarRepository,
-            final LoanRepaymentScheduleInstallmentRepository 
repaymentScheduleInstallmentRepository,
             final LoanScheduleHistoryWritePlatformService 
loanScheduleHistoryWritePlatformService,
             final LoanApplicationCommandFromApiJsonHelper 
loanApplicationCommandFromApiJsonHelper,
             final AccountAssociationsRepository accountAssociationRepository,
@@ -286,7 +281,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             final CodeValueRepositoryWrapper codeValueRepository, final 
LoanRepositoryWrapper loanRepositoryWrapper,
             final CashierTransactionDataValidator 
cashierTransactionDataValidator, final GLIMAccountInfoRepository glimRepository,
             final LoanRepository loanRepository, final 
RepaymentWithPostDatedChecksAssembler repaymentWithPostDatedChecksAssembler,
-            final PostDatedChecksRepository postDatedChecksRepository, final 
LoanChargePaidByRepository loanChargePaidByRepository) {
+            final PostDatedChecksRepository postDatedChecksRepository) {
         this.context = context;
         this.loanEventApiJsonValidator = loanEventApiJsonValidator;
         this.loanAssembler = loanAssembler;
@@ -312,7 +307,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         this.fromApiJsonHelper = fromApiJsonHelper;
         this.accountTransferRepository = accountTransferRepository;
         this.calendarRepository = calendarRepository;
-        this.repaymentScheduleInstallmentRepository = 
repaymentScheduleInstallmentRepository;
         this.loanScheduleHistoryWritePlatformService = 
loanScheduleHistoryWritePlatformService;
         this.loanApplicationCommandFromApiJsonHelper = 
loanApplicationCommandFromApiJsonHelper;
         this.accountAssociationRepository = accountAssociationRepository;
@@ -329,7 +323,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         this.glimRepository = glimRepository;
         this.repaymentWithPostDatedChecksAssembler = 
repaymentWithPostDatedChecksAssembler;
         this.postDatedChecksRepository = postDatedChecksRepository;
-        this.loanChargePaidByRepository = loanChargePaidByRepository;
     }
 
     private LoanLifecycleStateMachine defaultLoanLifecycleStateMachine() {
@@ -1760,7 +1753,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             break;
         }
 
-        AppUser currentUser = getAppUserIfPresent();
         final Loan loan = this.loanAssembler.assembleFrom(loanId);
         checkClientOrGroupActive(loan);
         final LoanCharge loanCharge = retrieveLoanChargeBy(loanId, 
loanChargeId);
@@ -2813,10 +2805,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         LocalDate startDate = 
dueDate.plusDays(penaltyWaitPeriodValue.intValue() + 1);
         Integer frequencyNunber = 1;
         if (feeFrequency == null) {
-            scheduleDates.put(frequencyNunber++, 
startDate.minusDays(diff.intValue()));
+            scheduleDates.put(frequencyNunber++, startDate.minusDays(diff));
         } else {
             while (!startDate.isAfter(DateUtils.getLocalDateOfTenant())) {
-                scheduleDates.put(frequencyNunber++, 
startDate.minusDays(diff.intValue()));
+                scheduleDates.put(frequencyNunber++, 
startDate.minusDays(diff));
                 LocalDate scheduleDate = 
scheduledDateGenerator.getRepaymentPeriodDate(PeriodFrequencyType.fromInt(feeFrequency),
                         chargeDefinition.feeInterval(), startDate);
 
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/loanaccount/api/SelfLoansApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/loanaccount/api/SelfLoansApiResource.java
index a601b003f..6fc70e4b7 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/loanaccount/api/SelfLoansApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/loanaccount/api/SelfLoansApiResource.java
@@ -43,6 +43,7 @@ import org.apache.commons.lang3.StringUtils;
 import 
org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.portfolio.client.exception.ClientNotFoundException;
+import org.apache.fineract.portfolio.loanaccount.api.LoanApiConstants;
 import org.apache.fineract.portfolio.loanaccount.api.LoanChargesApiResource;
 import 
org.apache.fineract.portfolio.loanaccount.api.LoanTransactionsApiResource;
 import org.apache.fineract.portfolio.loanaccount.api.LoansApiResource;
@@ -106,7 +107,10 @@ public class SelfLoansApiResource {
         validateAppuserLoanMapping(loanId);
 
         final boolean staffInSelectedOfficeOnly = false;
-        return this.loansApiResource.retrieveLoan(loanId, 
staffInSelectedOfficeOnly, uriInfo);
+        final String associations = LoanApiConstants.LOAN_ASSOCIATIONS_ALL;
+        final String exclude = null;
+        final String fields = null;
+        return this.loansApiResource.retrieveLoan(loanId, 
staffInSelectedOfficeOnly, associations, exclude, fields, uriInfo);
     }
 
     @GET
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/batch/command/internal/GetLoanByIdCommandStrategyTest.java
 
b/fineract-provider/src/test/java/org/apache/fineract/batch/command/internal/GetLoanByIdCommandStrategyTest.java
index a16cea7a2..40a381488 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/batch/command/internal/GetLoanByIdCommandStrategyTest.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/batch/command/internal/GetLoanByIdCommandStrategyTest.java
@@ -24,6 +24,8 @@ import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.BDDMockito.given;
 import static org.mockito.Mockito.verify;
 
+import java.util.HashSet;
+import java.util.Set;
 import java.util.stream.Stream;
 import javax.ws.rs.HttpMethod;
 import javax.ws.rs.core.UriInfo;
@@ -46,8 +48,10 @@ import org.mockito.MockitoAnnotations;
 public class GetLoanByIdCommandStrategyTest {
 
     private static Stream<Arguments> provideQueryParameters() {
-        return Stream.of(Arguments.of(null, 0), 
Arguments.of("associations=all", 1),
-                
Arguments.of("fields=id,principal,annualInterestRate&associations=repaymentSchedule,transactions",
 2));
+        return Stream.of(Arguments.of(null, null, null, 0), 
Arguments.of("all", null, null, 1),
+                Arguments.of("repaymentSchedule,transactions", null, 
"guarantors,futureSchedule", 2),
+                Arguments.of("repaymentSchedule,transactions", 
"id,principal,annualInterestRate", null, 2),
+                Arguments.of("repaymentSchedule,transactions", 
"id,principal,annualInterestRate", "guarantors,futureSchedule", 3));
     }
 
     /**
@@ -56,15 +60,17 @@ public class GetLoanByIdCommandStrategyTest {
      */
     @ParameterizedTest
     @MethodSource("provideQueryParameters")
-    public void testExecuteSuccessScenario(final String queryParameter, final 
int noOfQueryParams) {
+    public void testExecuteSuccessScenario(final String associations, final 
String fields, final String exclude,
+            final int noOfQueryParams) {
         // given
         final TestContext testContext = new TestContext();
 
         final Long loanId = Long.valueOf(RandomStringUtils.randomNumeric(4));
-        final BatchRequest request = getBatchRequest(loanId, queryParameter);
+        final BatchRequest request = getBatchRequest(loanId, associations, 
exclude, fields);
         final String responseBody = 
"{\\\"id\\\":2,\\\"accountNo\\\":\\\"000000002\\\"}";
 
-        given(testContext.loansApiResource.retrieveLoan(eq(loanId), eq(false), 
any(UriInfo.class))).willReturn(responseBody);
+        given(testContext.loansApiResource.retrieveLoan(eq(loanId), eq(false), 
eq(associations), eq(exclude), eq(fields),
+                any(UriInfo.class))).willReturn(responseBody);
 
         // when
         final BatchResponse response = testContext.underTest.execute(request, 
testContext.uriInfo);
@@ -75,7 +81,8 @@ public class GetLoanByIdCommandStrategyTest {
         assertThat(response.getHeaders()).isEqualTo(request.getHeaders());
         assertThat(response.getBody()).isEqualTo(responseBody);
 
-        verify(testContext.loansApiResource).retrieveLoan(eq(loanId), 
eq(false), testContext.uriInfoCaptor.capture());
+        verify(testContext.loansApiResource).retrieveLoan(eq(loanId), 
eq(false), eq(associations), eq(exclude), eq(fields),
+                testContext.uriInfoCaptor.capture());
         MutableUriInfo mutableUriInfo = testContext.uriInfoCaptor.getValue();
         
assertThat(mutableUriInfo.getAdditionalQueryParameters()).hasSize(noOfQueryParams);
     }
@@ -88,9 +95,9 @@ public class GetLoanByIdCommandStrategyTest {
         // given
         final TestContext testContext = new TestContext();
         final Long loanId = Long.valueOf(RandomStringUtils.randomNumeric(4));
-        final BatchRequest request = getBatchRequest(loanId, null);
+        final BatchRequest request = getBatchRequest(loanId, null, null, null);
 
-        given(testContext.loansApiResource.retrieveLoan(eq(loanId), eq(false), 
any(UriInfo.class)))
+        given(testContext.loansApiResource.retrieveLoan(eq(loanId), eq(false), 
eq(null), eq(null), eq(null), any(UriInfo.class)))
                 .willThrow(new RuntimeException("Some error"));
 
         // when
@@ -111,9 +118,9 @@ public class GetLoanByIdCommandStrategyTest {
         // given
         final TestContext testContext = new TestContext();
         final Long loanId = Long.valueOf(RandomStringUtils.randomNumeric(4));
-        final BatchRequest request = getBatchRequest(loanId, null);
+        final BatchRequest request = getBatchRequest(loanId, null, null, null);
 
-        given(testContext.loansApiResource.retrieveLoan(eq(loanId), eq(false), 
any(UriInfo.class)))
+        given(testContext.loansApiResource.retrieveLoan(eq(loanId), eq(false), 
eq(null), eq(null), eq(null), any(UriInfo.class)))
                 .willThrow(new LoanNotFoundException(loanId));
 
         // when
@@ -145,12 +152,23 @@ public class GetLoanByIdCommandStrategyTest {
      *            the loan id
      * @return BatchRequest
      */
-    private BatchRequest getBatchRequest(final Long loanId, final String 
queryParamStr) {
+    private BatchRequest getBatchRequest(final Long loanId, final String 
associations, final String exclude, final String fields) {
 
         final BatchRequest br = new BatchRequest();
         String relativeUrl = "loans/" + loanId;
-        if (queryParamStr != null) {
-            relativeUrl = relativeUrl + "?" + queryParamStr;
+
+        Set<String> queryParams = new HashSet<>();
+        if (associations != null) {
+            queryParams.add("associations=" + associations);
+        }
+        if (exclude != null) {
+            queryParams.add("exclude=" + exclude);
+        }
+        if (fields != null) {
+            queryParams.add("fields=" + fields);
+        }
+        if (!queryParams.isEmpty()) {
+            relativeUrl = relativeUrl + "?" + String.join("&", queryParams);
         }
 
         br.setRequestId(Long.valueOf(RandomStringUtils.randomNumeric(5)));

Reply via email to