You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ad...@apache.org on 2025/01/08 15:21:39 UTC
(fineract) branch revert-4235-FINERACT-2152/delete_and_update_interest_pause_period created (now f0cad9ece)
This is an automated email from the ASF dual-hosted git repository.
adamsaghy pushed a change to branch revert-4235-FINERACT-2152/delete_and_update_interest_pause_period
in repository https://gitbox.apache.org/repos/asf/fineract.git
at f0cad9ece Revert "FINERACT-2152: API update and delete interest pause"
This branch includes the following new commits:
new f0cad9ece Revert "FINERACT-2152: API update and delete interest pause"
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(fineract) 01/01: Revert "FINERACT-2152: API update and delete interest pause"
Posted by ad...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
adamsaghy pushed a commit to branch revert-4235-FINERACT-2152/delete_and_update_interest_pause_period
in repository https://gitbox.apache.org/repos/asf/fineract.git
commit f0cad9ece8aee77bbf49a83529813bbf9433dc7a
Author: Adam Saghy <ad...@gmail.com>
AuthorDate: Wed Jan 8 16:21:33 2025 +0100
Revert "FINERACT-2152: API update and delete interest pause"
This reverts commit 8663c054a076ca52e49b8df3987f8da46c929e51.
---
.../fineract/commands/domain/CommandSource.java | 3 +-
.../fineract/commands/domain/CommandWrapper.java | 12 +-
.../commands/service/CommandWrapperBuilder.java | 18 --
.../SynchronousCommandProcessingService.java | 12 +-
.../api/LoanInterestPauseApiResource.java | 42 +--
.../handler/DeleteInterestPauseCommandHandler.java | 41 ---
...ndler.java => InterestPauseCommandHandler.java} | 12 +-
.../handler/UpdateInterestPauseCommandHandler.java | 45 ---
.../service/InterestPauseWritePlatformService.java | 50 ----
.../InterestPauseWritePlatformServiceImpl.java | 91 +-----
.../loanaccount/domain/LoanTermVariations.java | 48 ---
.../domain/LoanTermVariationsRepository.java | 9 -
.../starter/LoanAccountConfiguration.java | 4 +-
.../db/changelog/tenant/changelog-tenant.xml | 1 -
..._additional_audit_fields_to_term_variations.xml | 51 ----
.../integrationtests/LoanInterestPauseApiTest.java | 328 +++++++--------------
.../common/loans/LoanProductTestBuilder.java | 1 -
.../common/loans/LoanTransactionHelper.java | 38 +--
18 files changed, 131 insertions(+), 675 deletions(-)
diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandSource.java b/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandSource.java
index e468e4a17..ad28f696c 100644
--- a/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandSource.java
+++ b/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandSource.java
@@ -159,7 +159,8 @@ public class CommandSource extends AbstractPersistableCustom<Long> {
.transactionId(command.getTransactionId()) //
.creditBureauId(command.getCreditBureauId()) //
.organisationCreditBureauId(command.getOrganisationCreditBureauId()) //
- .loanExternalId(command.getLoanExternalId()).build(); //
+ .loanExternalId(command.getLoanExternalId()) //
+ .build(); //
}
public String getPermissionCode() {
diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapper.java b/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapper.java
index fd73b43b9..5b51f40de 100644
--- a/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapper.java
+++ b/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapper.java
@@ -251,16 +251,8 @@ public class CommandWrapper {
return this.entityName.equalsIgnoreCase("INTEREST_PAUSE");
}
- public boolean isInterestPauseCreateResource() {
- return this.entityName.equalsIgnoreCase("INTEREST_PAUSE") && "CREATE".equalsIgnoreCase(this.actionName);
- }
-
- public boolean isInterestPauseUpdateResource() {
- return this.entityName.equalsIgnoreCase("INTEREST_PAUSE") && "UPDATE".equalsIgnoreCase(this.actionName);
- }
-
- public boolean isInterestPauseDeleteResource() {
- return this.entityName.equalsIgnoreCase("INTEREST_PAUSE") && "DELETE".equalsIgnoreCase(this.actionName);
+ public boolean isInterestPauseExternalIdResource() {
+ return this.entityName.equalsIgnoreCase("INTEREST_PAUSE") && this.href.contains("/external-id/");
}
public Long commandId() {
diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java b/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
index 740fbbbc6..497862cbf 100644
--- a/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
+++ b/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
@@ -3732,22 +3732,4 @@ public class CommandWrapperBuilder {
this.href = "/v1/loans/external-id/" + loanExternalId + "/interest-pauses";
return this;
}
-
- public CommandWrapperBuilder deleteInterestPause(final long loanId, final long variationId) {
- this.actionName = "DELETE";
- this.entityName = "INTEREST_PAUSE";
- this.loanId = loanId;
- this.entityId = variationId;
- this.href = "/v1/loans/" + loanId + "/interest-pauses/" + variationId;
- return this;
- }
-
- public CommandWrapperBuilder updateInterestPause(final long loanId, final long variationId) {
- this.actionName = "UPDATE";
- this.entityName = "INTEREST_PAUSE";
- this.loanId = loanId;
- this.entityId = variationId;
- this.href = "/v1/loans/" + loanId + "/interest-pauses/" + variationId;
- return this;
- }
}
diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java b/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java
index f021cb23c..9b525d5cd 100644
--- a/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java
+++ b/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java
@@ -249,16 +249,8 @@ public class SynchronousCommandProcessingService implements CommandProcessingSer
} else {
throw new UnsupportedCommandException(wrapper.commandName());
}
- } else if (wrapper.isInterestPauseResource()) {
- if (wrapper.isInterestPauseCreateResource()) {
- handler = applicationContext.getBean("createInterestPauseCommandHandler", NewCommandSourceHandler.class);
- } else if (wrapper.isInterestPauseUpdateResource()) {
- handler = applicationContext.getBean("updateInterestPauseCommandHandler", NewCommandSourceHandler.class);
- } else if (wrapper.isInterestPauseDeleteResource()) {
- handler = applicationContext.getBean("deleteInterestPauseCommandHandler", NewCommandSourceHandler.class);
- } else {
- throw new UnsupportedCommandException(wrapper.commandName());
- }
+ } else if (wrapper.isInterestPauseResource() || wrapper.isInterestPauseExternalIdResource()) {
+ handler = applicationContext.getBean("interestPauseCommandHandler", NewCommandSourceHandler.class);
} else {
handler = commandHandlerProvider.getHandler(wrapper.entityName(), wrapper.actionName());
}
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/api/LoanInterestPauseApiResource.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/api/LoanInterestPauseApiResource.java
index 253727547..1b08ad6d8 100644
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/api/LoanInterestPauseApiResource.java
+++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/api/LoanInterestPauseApiResource.java
@@ -25,15 +25,12 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.ws.rs.Consumes;
-import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
-import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.apache.fineract.commands.domain.CommandWrapper;
@@ -53,7 +50,6 @@ import org.springframework.stereotype.Component;
public class LoanInterestPauseApiResource {
private static final String RESOURCE_NAME_FOR_PERMISSIONS = "LOAN";
- private static final String MODIFY_RESOURCE_NAME_FOR_PERMISSIONS = "UPDATE LOAN";
private final PlatformSecurityContext context;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@@ -68,7 +64,7 @@ public class LoanInterestPauseApiResource {
public CommandProcessingResult createInterestPause(@PathParam("loanId") @Parameter(description = "loanId") final Long loanId,
@RequestBody(required = true) final InterestPauseRequestDto request) {
- this.context.authenticatedUser().validateHasReadPermission(MODIFY_RESOURCE_NAME_FOR_PERMISSIONS);
+ this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
final CommandWrapper commandRequest = new CommandWrapperBuilder().createInterestPause(loanId).withJson(request.toJson()).build();
@@ -85,7 +81,7 @@ public class LoanInterestPauseApiResource {
@PathParam("loanExternalId") @Parameter(description = "loanExternalId") final String loanExternalId,
@RequestBody(required = true) final InterestPauseRequestDto request) {
- this.context.authenticatedUser().validateHasReadPermission(MODIFY_RESOURCE_NAME_FOR_PERMISSIONS);
+ this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
final CommandWrapper commandRequest = new CommandWrapperBuilder().createInterestPauseByExternalId(loanExternalId)
.withJson(request.toJson()).build();
@@ -118,38 +114,4 @@ public class LoanInterestPauseApiResource {
return this.interestPauseReadPlatformService.retrieveInterestPauses(loanExternalId);
}
-
- @DELETE
- @Path("/{loanId}/interest-pauses/{variationId}")
- @Operation(summary = "Delete an interest pause period", description = "Deletes a specific interest pause period by its variation ID.")
- @ApiResponses({ @ApiResponse(responseCode = "204", description = "No Content") })
- public Response deleteInterestPause(@PathParam("loanId") @Parameter(description = "loanId") final Long loanId,
- @PathParam("variationId") @Parameter(description = "variationId") final Long variationId) {
-
- this.context.authenticatedUser().validateHasReadPermission(MODIFY_RESOURCE_NAME_FOR_PERMISSIONS);
-
- final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteInterestPause(loanId, variationId).build();
-
- this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
-
- return Response.noContent().build();
- }
-
- @PUT
- @Path("/{loanId}/interest-pauses/{variationId}")
- @Consumes({ MediaType.APPLICATION_JSON })
- @Produces({ MediaType.APPLICATION_JSON })
- @Operation(summary = "Update an interest pause period", description = "Updates a specific interest pause period by its variation ID.")
- @ApiResponses({ @ApiResponse(responseCode = "200", description = "OK") })
- public CommandProcessingResult updateInterestPause(@PathParam("loanId") @Parameter(description = "loanId") final Long loanId,
- @PathParam("variationId") @Parameter(description = "variationId") final Long variationId,
- @RequestBody(required = true) final InterestPauseRequestDto request) {
-
- this.context.authenticatedUser().validateHasReadPermission(MODIFY_RESOURCE_NAME_FOR_PERMISSIONS);
-
- final CommandWrapper commandRequest = new CommandWrapperBuilder().updateInterestPause(loanId, variationId)
- .withJson(request.toJson()).build();
-
- return this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
- }
}
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/DeleteInterestPauseCommandHandler.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/DeleteInterestPauseCommandHandler.java
deleted file mode 100644
index 8068c8c5a..000000000
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/DeleteInterestPauseCommandHandler.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * 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.
- */
-package org.apache.fineract.portfolio.interestpauses.handler;
-
-import lombok.RequiredArgsConstructor;
-import org.apache.fineract.commands.handler.NewCommandSourceHandler;
-import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.apache.fineract.portfolio.interestpauses.service.InterestPauseWritePlatformService;
-import org.springframework.stereotype.Component;
-
-@Component("deleteInterestPauseCommandHandler")
-@RequiredArgsConstructor
-public class DeleteInterestPauseCommandHandler implements NewCommandSourceHandler {
-
- private final InterestPauseWritePlatformService interestPauseService;
-
- @Override
- public CommandProcessingResult processCommand(final JsonCommand command) {
- final Long loanId = command.getLoanId();
- final Long termVariationId = command.getResourceId();
-
- return interestPauseService.deleteInterestPause(loanId, termVariationId);
- }
-}
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/CreateInterestPauseCommandHandler.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/InterestPauseCommandHandler.java
similarity index 85%
rename from fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/CreateInterestPauseCommandHandler.java
rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/InterestPauseCommandHandler.java
index 6246f278c..5747625dd 100644
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/CreateInterestPauseCommandHandler.java
+++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/InterestPauseCommandHandler.java
@@ -27,14 +27,16 @@ import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidati
import org.apache.fineract.portfolio.interestpauses.service.InterestPauseWritePlatformService;
import org.springframework.stereotype.Component;
-@Component("createInterestPauseCommandHandler")
+@Component("interestPauseCommandHandler")
@RequiredArgsConstructor
-public class CreateInterestPauseCommandHandler implements NewCommandSourceHandler {
+public class InterestPauseCommandHandler implements NewCommandSourceHandler {
private final InterestPauseWritePlatformService interestPauseService;
@Override
public CommandProcessingResult processCommand(final JsonCommand command) {
+ CommandProcessingResult result;
+
final String startDate = command.stringValueOfParameterNamed("startDate");
final String endDate = command.stringValueOfParameterNamed("endDate");
final String dateFormat = command.stringValueOfParameterNamed("dateFormat");
@@ -42,13 +44,15 @@ public class CreateInterestPauseCommandHandler implements NewCommandSourceHandle
if (command.getLoanId() != null) {
final Long loanId = command.getLoanId();
- return interestPauseService.createInterestPause(loanId, startDate, endDate, dateFormat, locale);
+ result = interestPauseService.createInterestPause(loanId, startDate, endDate, dateFormat, locale);
} else if (command.getLoanExternalId() != null) {
final ExternalId loanExternalId = command.getLoanExternalId();
- return interestPauseService.createInterestPause(loanExternalId, startDate, endDate, dateFormat, locale);
+ result = interestPauseService.createInterestPause(loanExternalId, startDate, endDate, dateFormat, locale);
} else {
throw new PlatformApiDataValidationException("validation.msg.missing.loan.id.or.external.id",
"Either loanId or loanExternalId must be provided.", "loanId");
}
+
+ return result;
}
}
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/UpdateInterestPauseCommandHandler.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/UpdateInterestPauseCommandHandler.java
deleted file mode 100644
index 04a9b2f03..000000000
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/handler/UpdateInterestPauseCommandHandler.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * 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.
- */
-package org.apache.fineract.portfolio.interestpauses.handler;
-
-import lombok.RequiredArgsConstructor;
-import org.apache.fineract.commands.handler.NewCommandSourceHandler;
-import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.apache.fineract.portfolio.interestpauses.service.InterestPauseWritePlatformService;
-import org.springframework.stereotype.Component;
-
-@Component("updateInterestPauseCommandHandler")
-@RequiredArgsConstructor
-public class UpdateInterestPauseCommandHandler implements NewCommandSourceHandler {
-
- private final InterestPauseWritePlatformService interestPauseService;
-
- @Override
- public CommandProcessingResult processCommand(final JsonCommand command) {
- final Long loanId = command.getLoanId();
- final Long termVariationId = command.getResourceId();
- final String startDate = command.stringValueOfParameterNamed("startDate");
- final String endDate = command.stringValueOfParameterNamed("endDate");
- final String dateFormat = command.stringValueOfParameterNamed("dateFormat");
- final String locale = command.stringValueOfParameterNamed("locale");
-
- return interestPauseService.updateInterestPause(loanId, termVariationId, startDate, endDate, dateFormat, locale);
- }
-}
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/service/InterestPauseWritePlatformService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/service/InterestPauseWritePlatformService.java
index 491a45171..e3b8c397a 100644
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/service/InterestPauseWritePlatformService.java
+++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/service/InterestPauseWritePlatformService.java
@@ -23,21 +23,6 @@ import org.apache.fineract.infrastructure.core.domain.ExternalId;
public interface InterestPauseWritePlatformService {
- /**
- * Create a new interest pause period for a loan identified by its external ID.
- *
- * @param loanExternalId
- * the external ID of the loan
- * @param startDate
- * the start date of the interest pause period (inclusive)
- * @param endDate
- * the end date of the interest pause period (inclusive)
- * @param dateFormat
- * the format of the provided dates
- * @param locale
- * the locale used for date parsing
- * @return the ID of the created loan term variation representing the interest pause
- */
CommandProcessingResult createInterestPause(ExternalId loanExternalId, String startDate, String endDate, String dateFormat,
String locale);
@@ -50,42 +35,7 @@ public interface InterestPauseWritePlatformService {
* the start date of the interest pause period (inclusive)
* @param endDate
* the end date of the interest pause period (inclusive)
- * @param dateFormat
- * the format of the provided dates
- * @param locale
- * the locale used for date parsing
* @return the ID of the created loan term variation representing the interest pause
*/
CommandProcessingResult createInterestPause(Long loanId, String startDate, String endDate, String dateFormat, String locale);
-
- /**
- * Delete an existing interest pause period for a loan.
- *
- * @param loanId
- * the ID of the loan
- * @param variationId
- * the ID of the loan term variation representing the interest pause
- * @return the result of the delete operation
- */
- CommandProcessingResult deleteInterestPause(Long loanId, Long variationId);
-
- /**
- * Update an existing interest pause period for a loan identified by its internal ID.
- *
- * @param loanId
- * the ID of the loan
- * @param variationId
- * the ID of the loan term variation representing the interest pause to be updated
- * @param startDateString
- * the new start date of the interest pause period (inclusive) as a string
- * @param endDateString
- * the new end date of the interest pause period (inclusive) as a string
- * @param dateFormat
- * the format of the provided dates (e.g., "yyyy-MM-dd")
- * @param locale
- * the locale used for parsing the provided dates
- * @return the updated loan term variation ID along with the updated fields
- */
- CommandProcessingResult updateInterestPause(Long loanId, Long variationId, String startDateString, String endDateString,
- String dateFormat, String locale);
}
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/service/InterestPauseWritePlatformServiceImpl.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/service/InterestPauseWritePlatformServiceImpl.java
index 095ec4024..272ba3f9f 100644
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/service/InterestPauseWritePlatformServiceImpl.java
+++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/service/InterestPauseWritePlatformServiceImpl.java
@@ -18,19 +18,12 @@
*/
package org.apache.fineract.portfolio.interestpauses.service;
-import static org.apache.fineract.portfolio.loanaccount.domain.LoanStatus.ACTIVE;
-import static org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType.INTEREST_PAUSE;
-import static org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType.PROGRESSIVE;
-
import java.time.LocalDate;
-import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
-import java.util.Map;
-import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;
import lombok.AllArgsConstructor;
@@ -41,13 +34,11 @@ import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
import org.apache.fineract.infrastructure.core.domain.ExternalId;
import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException;
import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
-import org.apache.fineract.infrastructure.core.service.DateUtils;
-import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanTermVariationsRepository;
-import org.apache.fineract.useradministration.domain.AppUser;
import org.springframework.transaction.annotation.Transactional;
@AllArgsConstructor
@@ -56,7 +47,6 @@ public class InterestPauseWritePlatformServiceImpl implements InterestPauseWrite
private final LoanTermVariationsRepository loanTermVariationsRepository;
private final LoanRepositoryWrapper loanRepositoryWrapper;
- private final PlatformSecurityContext context;
@Override
public CommandProcessingResult createInterestPause(ExternalId loanExternalId, String startDateString, String endDateString,
@@ -78,59 +68,14 @@ public class InterestPauseWritePlatformServiceImpl implements InterestPauseWrite
locale);
}
- @Override
- public CommandProcessingResult deleteInterestPause(Long loanId, Long variationId) {
- LoanTermVariations variation = loanTermVariationsRepository
- .findByIdAndLoanIdAndTermType(variationId, loanId, INTEREST_PAUSE.getValue())
- .orElseThrow(() -> new GeneralPlatformDomainRuleException("error.msg.variation.not.found",
- "Variation not found for the given loan ID"));
-
- loanTermVariationsRepository.delete(variation);
-
- return new CommandProcessingResultBuilder().withEntityId(variationId).build();
- }
-
- @Override
- public CommandProcessingResult updateInterestPause(Long loanId, Long variationId, String startDateString, String endDateString,
- String dateFormat, String locale) {
- Loan loan = loanRepositoryWrapper.findOneWithNotFoundDetection(loanId);
-
- LocalDate startDate = parseDate(startDateString, dateFormat, locale);
- LocalDate endDate = parseDate(endDateString, dateFormat, locale);
-
- validateInterestPauseDates(loan, startDate, endDate, dateFormat, locale);
-
- LoanTermVariations variation = loanTermVariationsRepository
- .findByIdAndLoanIdAndTermType(variationId, loanId, INTEREST_PAUSE.getValue())
- .orElseThrow(() -> new GeneralPlatformDomainRuleException("error.msg.variation.not.found",
- "Variation not found for the given loan ID"));
-
- validateVariations(loan, variation);
-
- variation.setTermApplicableFrom(startDate);
- variation.setDateValue(endDate);
-
- AppUser currentUser = context.authenticatedUser();
- variation.setUpdatedBy(currentUser != null ? currentUser.getId() : null);
- variation.setUpdatedOnDate(LocalDateTime.now(DateUtils.getDateTimeZoneOfTenant()));
-
- LoanTermVariations updatedVariation = loanTermVariationsRepository.save(variation);
-
- return new CommandProcessingResultBuilder().withEntityId(updatedVariation.getId())
- .with(Map.of("startDate", startDate.toString(), "endDate", endDate.toString())).build();
- }
-
private CommandProcessingResult processInterestPause(Supplier<Loan> loanSupplier, LocalDate startDate, LocalDate endDate,
String dateFormat, String locale) {
final Loan loan = loanSupplier.get();
validateInterestPauseDates(loan, startDate, endDate, dateFormat, locale);
- LoanTermVariations variation = new LoanTermVariations(INTEREST_PAUSE.getValue(), startDate, null, endDate, false, loan);
-
- AppUser currentUser = context.authenticatedUser();
- variation.setCreatedBy(currentUser != null ? currentUser.getId() : null);
- variation.setCreatedOnDate(LocalDateTime.now(DateUtils.getDateTimeZoneOfTenant()));
+ LoanTermVariations variation = new LoanTermVariations(LoanTermVariationType.INTEREST_PAUSE.getValue(), startDate, null, endDate,
+ false, loan);
LoanTermVariations savedVariation = loanTermVariationsRepository.saveAndFlush(variation);
@@ -164,36 +109,6 @@ public class InterestPauseWritePlatformServiceImpl implements InterestPauseWrite
.format("Interest pause end date (%s) must not be before the interest pause start date (%s).", endDate, startDate),
endDate, startDate);
}
-
- if (!Objects.equals(loan.getLoanStatus(), ACTIVE.getValue())) {
- throw new GeneralPlatformDomainRuleException("loan.must.be.active",
- "Operations on interest pauses are restricted to active loans.");
- }
-
- if (!PROGRESSIVE.equals(loan.getLoanRepaymentScheduleDetail().getLoanScheduleType())) {
- throw new GeneralPlatformDomainRuleException("loan.must.be.progressive",
- "Interest pause is only supported for progressive loans.");
- }
-
- if (!loan.getLoanRepaymentScheduleDetail().isInterestRecalculationEnabled()) {
- throw new GeneralPlatformDomainRuleException("loan.must.have.recalculate.interest.enabled",
- "Interest pause is only supported for loans with recalculate interest enabled.");
- }
- }
-
- private void validateVariations(Loan loan, LoanTermVariations variation) {
- if (variation == null) {
- throw new GeneralPlatformDomainRuleException("interest.pause.not.found",
- "The specified interest pause does not exist for the given loan.");
- }
-
- List<LoanTermVariations> existingVariations = loan.getLoanTermVariations();
- for (LoanTermVariations existingVariation : existingVariations) {
- if (!existingVariation.equals(variation) && variation.getTermApplicableFrom().isBefore(existingVariation.getDateValue())
- && variation.getDateValue().isAfter(existingVariation.getTermApplicableFrom())) {
- throw new GeneralPlatformDomainRuleException("interest.pause.overlapping", "Overlapping interest pauses are not allowed.");
- }
- }
}
private LocalDate parseDate(String date, String dateFormat, String locale) {
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java
index 891dde0e2..d5f41828d 100644
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java
+++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java
@@ -27,7 +27,6 @@ import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.math.BigDecimal;
import java.time.LocalDate;
-import java.time.LocalDateTime;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData;
@@ -62,18 +61,6 @@ public class LoanTermVariations extends AbstractPersistableCustom<Long> {
@Column(name = "is_active", nullable = false)
private Boolean isActive;
- @Column(name = "created_by")
- private Long createdBy;
-
- @Column(name = "created_on_date")
- private LocalDateTime createdOnDate;
-
- @Column(name = "updated_by")
- private Long updatedBy;
-
- @Column(name = "updated_on_date")
- private LocalDateTime updatedOnDate;
-
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private LoanTermVariations parent;
@@ -152,10 +139,6 @@ public class LoanTermVariations extends AbstractPersistableCustom<Long> {
return this.dateValue;
}
- public void setDateValue(LocalDate dateValue) {
- this.dateValue = dateValue;
- }
-
public void setTermApplicableFrom(LocalDate termApplicableFrom) {
this.termApplicableFrom = termApplicableFrom;
}
@@ -184,35 +167,4 @@ public class LoanTermVariations extends AbstractPersistableCustom<Long> {
this.isActive = false;
}
- public Long getCreatedBy() {
- return createdBy;
- }
-
- public void setCreatedBy(Long createdBy) {
- this.createdBy = createdBy;
- }
-
- public LocalDateTime getCreatedOnDate() {
- return createdOnDate;
- }
-
- public void setCreatedOnDate(LocalDateTime createdOnDate) {
- this.createdOnDate = createdOnDate;
- }
-
- public Long getUpdatedBy() {
- return updatedBy;
- }
-
- public void setUpdatedBy(Long updatedBy) {
- this.updatedBy = updatedBy;
- }
-
- public LocalDateTime getUpdatedOnDate() {
- return updatedOnDate;
- }
-
- public void setUpdatedOnDate(LocalDateTime updatedOnDate) {
- this.updatedOnDate = updatedOnDate;
- }
}
diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanTermVariationsRepository.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanTermVariationsRepository.java
index 57993fe05..0bf7209ff 100644
--- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanTermVariationsRepository.java
+++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanTermVariationsRepository.java
@@ -19,7 +19,6 @@
package org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain;
import java.util.List;
-import java.util.Optional;
import org.apache.fineract.infrastructure.core.domain.ExternalId;
import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations;
@@ -61,12 +60,4 @@ public interface LoanTermVariationsRepository
""")
List<LoanTermVariationsData> findLoanTermVariationsByExternalLoanIdAndTermType(@Param("loanExternalId") ExternalId loanExternalId,
@Param("termType") int termType);
-
- @Query("""
- select ltv
- from LoanTermVariations ltv
- where ltv.id = :variationId and ltv.loan.id = :loanId and ltv.termType = :termType
- """)
- Optional<LoanTermVariations> findByIdAndLoanIdAndTermType(@Param("variationId") long variationId, @Param("loanId") long loanId,
- @Param("termType") int termType);
}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java
index a1a1fddbb..b7b9a955d 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java
@@ -471,7 +471,7 @@ public class LoanAccountConfiguration {
@Bean
@ConditionalOnMissingBean(InterestPauseWritePlatformService.class)
public InterestPauseWritePlatformService interestPauseWritePlatformService(LoanTermVariationsRepository loanTermVariationsRepository,
- LoanRepositoryWrapper loanRepositoryWrapper, PlatformSecurityContext context) {
- return new InterestPauseWritePlatformServiceImpl(loanTermVariationsRepository, loanRepositoryWrapper, context);
+ LoanRepositoryWrapper loanRepositoryWrapper) {
+ return new InterestPauseWritePlatformServiceImpl(loanTermVariationsRepository, loanRepositoryWrapper);
}
}
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
index b058f2a2a..673a92f1f 100644
--- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
@@ -180,5 +180,4 @@
<include file="parts/0159_trial_balance_summary_with_asset_owner_year_end_summary.xml" relativeToChangelogFile="true" />
<include file="parts/0160_add_acc_product_mapping_product_id_index.xml" relativeToChangelogFile="true" />
<include file="parts/0161_add_loan_external_id_to_commands.xml" relativeToChangelogFile="true" />
- <include file="parts/0162_add_additional_audit_fields_to_term_variations.xml" relativeToChangelogFile="true" />
</databaseChangeLog>
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0162_add_additional_audit_fields_to_term_variations.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0162_add_additional_audit_fields_to_term_variations.xml
deleted file mode 100644
index fbb1ef2bf..000000000
--- a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0162_add_additional_audit_fields_to_term_variations.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- 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.
-
--->
-<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd">
-
- <changeSet id="1" author="fineract">
- <addColumn tableName="m_loan_term_variations">
- <column name="created_by" type="BIGINT">
- <constraints nullable="true"/>
- </column>
- </addColumn>
-
- <addColumn tableName="m_loan_term_variations">
- <column name="created_on_date" type="TIMESTAMP">
- <constraints nullable="true"/>
- </column>
- </addColumn>
-
- <addColumn tableName="m_loan_term_variations">
- <column name="updated_by" type="BIGINT">
- <constraints nullable="true"/>
- </column>
- </addColumn>
-
- <addColumn tableName="m_loan_term_variations">
- <column name="updated_on_date" type="TIMESTAMP">
- <constraints nullable="true"/>
- </column>
- </addColumn>
- </changeSet>
-</databaseChangeLog>
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestPauseApiTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestPauseApiTest.java
index d4f5d0dc0..347b72f23 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestPauseApiTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanInterestPauseApiTest.java
@@ -24,30 +24,38 @@ import io.restassured.http.ContentType;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.apache.fineract.client.models.AdvancedPaymentData;
-import org.apache.fineract.client.models.PostLoansLoanIdRequest;
+import org.apache.fineract.client.models.PaymentAllocationOrder;
+import org.apache.fineract.client.models.PostClientsResponse;
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsResponse;
+import org.apache.fineract.client.models.PostLoansRequest;
+import org.apache.fineract.client.models.PostLoansResponse;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.integrationtests.common.accounting.Account;
import org.apache.fineract.integrationtests.common.accounting.AccountHelper;
-import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension;
import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper;
+import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.impl.AdvancedPaymentScheduleTransactionProcessor;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleProcessingType;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
+import org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationType;
import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j
-@ExtendWith(LoanTestLifecycleExtension.class)
+@ExtendWith({ LoanTestLifecycleExtension.class })
public class LoanInterestPauseApiTest extends BaseLoanIntegrationTest {
private static final Logger LOG = LoggerFactory.getLogger(LoanInterestPauseApiTest.class);
@@ -55,56 +63,52 @@ public class LoanInterestPauseApiTest extends BaseLoanIntegrationTest {
private static RequestSpecification REQUEST_SPEC;
private static ResponseSpecification RESPONSE_SPEC;
private static ResponseSpecification RESPONSE_SPEC_403;
- private static ResponseSpecification RESPONSE_SPEC_204;
private static LoanTransactionHelper LOAN_TRANSACTIONAL_HELPER;
- private static LoanTransactionHelper LOAN_TRANSACTIONAL_HELPER_204;
private static LoanTransactionHelper LOAN_TRANSACTION_HELPER_403;
- private static AccountHelper ACCOUNT_HELPER;
- private static final Integer nonExistLoanId = 99999;
+ private static AccountHelper accountHelper;
+ private static PostClientsResponse client;
+ private static Integer loanProductId;
+ private static Long loanId;
+ private static Long nonExistLoanId = 99999L;
private static String externalId;
- private static final String nonExistExternalId = "7c4fb86f-a778-4d02-b7a8-ec3ec98941fa";
- private Integer clientId;
- private Integer loanProductId;
- private Integer loanId;
- private final String loanPrincipalAmount = "10000.00";
- private final String numberOfRepayments = "12";
- private final String interestRatePerPeriod = "18";
- private final String dateString = "01 January 2023";
-
- @BeforeEach
- public void initialize() {
+ private static String nonExistExternalId = "7c4fb86f-a778-4d02-b7a8-ec3ec98941fa";
+
+ @BeforeAll
+ public static void setupTests() {
Utils.initializeRESTAssured();
REQUEST_SPEC = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
REQUEST_SPEC.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
RESPONSE_SPEC = new ResponseSpecBuilder().expectStatusCode(200).build();
RESPONSE_SPEC_403 = new ResponseSpecBuilder().expectStatusCode(403).build();
- RESPONSE_SPEC_204 = new ResponseSpecBuilder().expectStatusCode(204).build();
LOAN_TRANSACTIONAL_HELPER = new LoanTransactionHelper(REQUEST_SPEC, RESPONSE_SPEC);
LOAN_TRANSACTION_HELPER_403 = new LoanTransactionHelper(REQUEST_SPEC, RESPONSE_SPEC_403);
- LOAN_TRANSACTIONAL_HELPER_204 = new LoanTransactionHelper(REQUEST_SPEC, RESPONSE_SPEC_204);
- ACCOUNT_HELPER = new AccountHelper(REQUEST_SPEC, RESPONSE_SPEC);
+ accountHelper = new AccountHelper(REQUEST_SPEC, RESPONSE_SPEC);
+ ClientHelper clientHelper = new ClientHelper(REQUEST_SPEC, RESPONSE_SPEC);
+ client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
+
+ final Account assetAccount = accountHelper.createAssetAccount();
+ final Account incomeAccount = accountHelper.createIncomeAccount();
+ final Account expenseAccount = accountHelper.createExpenseAccount();
+ final Account overpaymentAccount = accountHelper.createLiabilityAccount();
externalId = UUID.randomUUID().toString();
- createRequiredEntities();
+ loanProductId = createLoanProduct("500", "15", "4", true, "25", true, LoanScheduleType.PROGRESSIVE,
+ LoanScheduleProcessingType.HORIZONTAL, assetAccount, incomeAccount, expenseAccount, overpaymentAccount);
+
+ final PostLoansResponse loanResponse = applyForLoanApplication(client.getClientId(), loanProductId, BigDecimal.valueOf(500.0), 45,
+ 15, 3, BigDecimal.ZERO, "01 January 2023", "01 January 2023", externalId);
+
+ loanId = loanResponse.getLoanId();
Assertions.assertNotNull(loanProductId, "Loan Product ID should not be null after creation");
Assertions.assertNotNull(loanId, "Loan ID should not be null after creation");
Assertions.assertNotNull(externalId, "External Loan ID should not be null after creation");
}
- /**
- * Creates the client, loan product, and loan entities
- **/
- private void createRequiredEntities() {
- this.createClientEntity();
- this.createLoanProductEntity();
- this.createLoanEntity();
- }
-
@Test
public void testCreateInterestPauseByLoanId_validRequest_shouldSucceed() {
- PostLoansLoanIdTransactionsResponse response = LOAN_TRANSACTIONAL_HELPER.createInterestPauseByLoanId("2023-01-01", "2023-01-12",
+ PostLoansLoanIdTransactionsResponse response = LOAN_TRANSACTIONAL_HELPER.createInterestPauseByLoanId("2023-01-01", "2023-02-05",
"yyyy-MM-dd", "en", loanId);
Assertions.assertNotNull(response);
@@ -114,7 +118,7 @@ public class LoanInterestPauseApiTest extends BaseLoanIntegrationTest {
@Test
public void testCreateInterestPauseByLoanId_endDateBeforeStartDate_shouldFail() {
try {
- LOAN_TRANSACTION_HELPER_403.createInterestPauseByLoanId("2024-12-05", "2023-01-12", "yyyy-MM-dd", "en", loanId);
+ LOAN_TRANSACTION_HELPER_403.createInterestPauseByLoanId("2024-12-05", "2024-12-01", "yyyy-MM-dd", "en", loanId);
} catch (Exception e) {
String responseBody = e.getMessage();
Assertions.assertNotNull(responseBody, "Response body should not be null");
@@ -126,7 +130,7 @@ public class LoanInterestPauseApiTest extends BaseLoanIntegrationTest {
@Test
public void testCreateInterestPauseByLoanId_startDateBeforeLoanStart_shouldFail() {
try {
- LOAN_TRANSACTION_HELPER_403.createInterestPauseByLoanId("2022-12-01", "2023-01-12", "yyyy-MM-dd", "en", loanId);
+ LOAN_TRANSACTION_HELPER_403.createInterestPauseByLoanId("2022-12-01", "2024-12-05", "yyyy-MM-dd", "en", loanId);
} catch (Exception e) {
String responseBody = e.getMessage();
Assertions.assertNotNull(responseBody, "Response body should not be null");
@@ -159,18 +163,18 @@ public class LoanInterestPauseApiTest extends BaseLoanIntegrationTest {
@Test
public void testRetrieveInterestPausesByLoanId_shouldReturnData() {
- LOAN_TRANSACTIONAL_HELPER.createInterestPauseByLoanId("2023-01-01", "2023-01-12", "yyyy-MM-dd", "en", loanId);
+ LOAN_TRANSACTIONAL_HELPER.createInterestPauseByLoanId("2023-01-01", "2023-02-05", "yyyy-MM-dd", "en", loanId);
String response = LOAN_TRANSACTIONAL_HELPER.retrieveInterestPauseByLoanId(loanId);
Assertions.assertNotNull(response, "Response should not be null");
Assertions.assertTrue(response.contains("2023-01-01"));
- Assertions.assertTrue(response.contains("2023-01-12"));
+ Assertions.assertTrue(response.contains("2023-02-05"));
}
@Test
public void testCreateInterestPauseByExternalLoanId_validRequest_shouldSucceed() {
- PostLoansLoanIdTransactionsResponse response = LOAN_TRANSACTIONAL_HELPER.createInterestPauseByExternalId("2023-01-01", "2023-01-12",
+ PostLoansLoanIdTransactionsResponse response = LOAN_TRANSACTIONAL_HELPER.createInterestPauseByExternalId("2023-01-01", "2023-02-05",
"yyyy-MM-dd", "en", externalId);
Assertions.assertNotNull(response);
@@ -180,7 +184,7 @@ public class LoanInterestPauseApiTest extends BaseLoanIntegrationTest {
@Test
public void testCreateInterestPauseByExternalLoanId_endDateBeforeStartDate_shouldFail() {
try {
- LOAN_TRANSACTION_HELPER_403.createInterestPauseByExternalId("2023-01-01", "2022-01-12", "yyyy-MM-dd", "en", externalId);
+ LOAN_TRANSACTION_HELPER_403.createInterestPauseByExternalId("2024-12-05", "2024-12-01", "yyyy-MM-dd", "en", externalId);
} catch (Exception e) {
String responseBody = e.getMessage();
Assertions.assertNotNull(responseBody, "Response body should not be null");
@@ -225,207 +229,87 @@ public class LoanInterestPauseApiTest extends BaseLoanIntegrationTest {
@Test
public void testRetrieveInterestPausesByExternalLoanId_shouldReturnData() {
- LOAN_TRANSACTIONAL_HELPER.createInterestPauseByExternalId("2023-01-01", "2023-01-12", "yyyy-MM-dd", "en", externalId);
+ LOAN_TRANSACTIONAL_HELPER.createInterestPauseByExternalId("2023-01-01", "2023-02-05", "yyyy-MM-dd", "en", externalId);
String response = LOAN_TRANSACTIONAL_HELPER.retrieveInterestPauseByExternalId(externalId);
Assertions.assertNotNull(response, "Response should not be null");
Assertions.assertTrue(response.contains("2023-01-01"));
- Assertions.assertTrue(response.contains("2023-01-12"));
- }
-
- @Test
- public void testUpdateInterestPauseByLoanId_validRequest_shouldSucceed() {
- PostLoansLoanIdTransactionsResponse createResponse = LOAN_TRANSACTIONAL_HELPER.createInterestPauseByLoanId("2023-01-01",
- "2023-01-12", "yyyy-MM-dd", "en", loanId);
-
- Assertions.assertNotNull(createResponse);
- Assertions.assertNotNull(createResponse.getResourceId());
-
- Long variationId = createResponse.getResourceId();
-
- PostLoansLoanIdTransactionsResponse updateResponse = LOAN_TRANSACTIONAL_HELPER.updateInterestPauseByLoanId(variationId,
- "2023-01-01", "2023-01-12", "yyyy-MM-dd", "en", loanId);
-
- Assertions.assertNotNull(updateResponse);
- Assertions.assertNotNull(updateResponse.getResourceId());
- Assertions.assertEquals(variationId, updateResponse.getResourceId());
- }
-
- @Test
- public void testUpdateInterestPauseByLoanId_endDateBeforeStartDate_shouldFail() {
- PostLoansLoanIdTransactionsResponse createResponse = LOAN_TRANSACTIONAL_HELPER.createInterestPauseByLoanId("2023-01-01",
- "2023-01-12", "yyyy-MM-dd", "en", loanId);
-
- Assertions.assertNotNull(createResponse);
- Assertions.assertNotNull(createResponse.getResourceId());
-
- Long variationId = createResponse.getResourceId();
-
- try {
- LOAN_TRANSACTION_HELPER_403.updateInterestPauseByLoanId(variationId, "2023-03-01", "2023-01-12", "yyyy-MM-dd", "en", loanId);
- } catch (Exception e) {
- String responseBody = e.getMessage();
- Assertions.assertNotNull(responseBody, "Response body should not be null");
- Assertions.assertTrue(responseBody.contains("interest.pause.end.date.before.start.date"),
- "Response should contain the validation error message for end date before start date");
- }
- }
-
- @Test
- public void testUpdateInterestPauseByLoanId_startDateBeforeLoanStart_shouldFail() {
- PostLoansLoanIdTransactionsResponse createResponse = LOAN_TRANSACTIONAL_HELPER.createInterestPauseByLoanId("2023-01-01",
- "2023-01-12", "yyyy-MM-dd", "en", loanId);
-
- Assertions.assertNotNull(createResponse);
- Assertions.assertNotNull(createResponse.getResourceId());
-
- Long variationId = createResponse.getResourceId();
-
- try {
- LOAN_TRANSACTION_HELPER_403.updateInterestPauseByLoanId(variationId, "2022-12-01", "2023-01-12", "yyyy-MM-dd", "en", loanId);
- } catch (Exception e) {
- String responseBody = e.getMessage();
- Assertions.assertNotNull(responseBody, "Response body should not be null");
- Assertions.assertTrue(responseBody.contains("interest.pause.start.date.before.loan.start.date"),
- "Response should contain the validation error message for start date before loan start date");
- }
+ Assertions.assertTrue(response.contains("2023-02-05"));
}
- @Test
- public void testDeleteInterestPauseByLoanId_validRequest_shouldSucceed() {
- PostLoansLoanIdTransactionsResponse createResponse = LOAN_TRANSACTIONAL_HELPER.createInterestPauseByLoanId("2023-01-01",
- "2023-01-12", "yyyy-MM-dd", "en", loanId);
-
- Assertions.assertNotNull(createResponse, "Create response should not be null");
- Assertions.assertNotNull(createResponse.getResourceId(), "Resource ID should not be null");
-
- Long variationId = createResponse.getResourceId();
-
- try {
- LOAN_TRANSACTIONAL_HELPER_204.deleteInterestPauseByLoanId(variationId, loanId);
- } catch (Exception e) {
- Assertions.fail("Delete operation failed: " + e.getMessage());
- }
-
- String response = LOAN_TRANSACTIONAL_HELPER.retrieveInterestPauseByLoanId(loanId);
- Assertions.assertFalse(response.contains(String.valueOf(variationId)), "Response should not contain the deleted variation ID");
+ private static Integer createLoanProduct(final String principal, final String repaymentAfterEvery, final String numberOfRepayments,
+ boolean downPaymentEnabled, String downPaymentPercentage, boolean autoPayForDownPayment, LoanScheduleType loanScheduleType,
+ LoanScheduleProcessingType loanScheduleProcessingType, final Account... accounts) {
+ AdvancedPaymentData defaultAllocation = createDefaultPaymentAllocation();
+ final String loanProductJSON = new LoanProductTestBuilder().withMinPrincipal(principal).withPrincipal(principal)
+ .withRepaymentTypeAsDays().withRepaymentAfterEvery(repaymentAfterEvery).withNumberOfRepayments(numberOfRepayments)
+ .withEnableDownPayment(downPaymentEnabled, downPaymentPercentage, autoPayForDownPayment).withinterestRatePerPeriod("0")
+ .withInterestRateFrequencyTypeAsMonths()
+ .withRepaymentStrategy(AdvancedPaymentScheduleTransactionProcessor.ADVANCED_PAYMENT_ALLOCATION_STRATEGY)
+ .withAmortizationTypeAsEqualPrincipalPayment().withInterestTypeAsFlat().withAccountingRulePeriodicAccrual(accounts)
+ .addAdvancedPaymentAllocation(defaultAllocation).withInterestCalculationPeriodTypeAsRepaymentPeriod(true)
+ .withInterestTypeAsDecliningBalance().withMultiDisburse().withDisallowExpectedDisbursements(true)
+ .withLoanScheduleType(loanScheduleType).withLoanScheduleProcessingType(loanScheduleProcessingType).withDaysInMonth("30")
+ .withDaysInYear("365").withMoratorium("0", "0").build(null);
+ return LOAN_TRANSACTIONAL_HELPER.getLoanProductId(loanProductJSON);
}
- @Test
- public void testDeleteInterestPauseByLoanId_nonExistentVariation_shouldFail() {
- try {
- LOAN_TRANSACTION_HELPER_403.deleteInterestPauseByLoanId(99999L, loanId);
- } catch (Exception e) {
- String responseBody = e.getMessage();
- Assertions.assertNotNull(responseBody, "Response body should not be null");
- Assertions.assertTrue(responseBody.contains("error.msg.variation.not.found"),
- "Response should contain the validation error message for variation not found");
- }
- }
+ private static AdvancedPaymentData createDefaultPaymentAllocation() {
+ AdvancedPaymentData advancedPaymentData = new AdvancedPaymentData();
+ advancedPaymentData.setTransactionType("DEFAULT");
+ advancedPaymentData.setFutureInstallmentAllocationRule("NEXT_INSTALLMENT");
- @Test
- public void testDeleteInterestPauseByLoanId_invalidLoanId_shouldFail() {
- PostLoansLoanIdTransactionsResponse createResponse = LOAN_TRANSACTIONAL_HELPER.createInterestPauseByLoanId("2023-01-01",
- "2023-01-12", "yyyy-MM-dd", "en", loanId);
+ List<PaymentAllocationOrder> paymentAllocationOrders = getPaymentAllocationOrder(PaymentAllocationType.PAST_DUE_PENALTY,
+ PaymentAllocationType.PAST_DUE_FEE, PaymentAllocationType.PAST_DUE_PRINCIPAL, PaymentAllocationType.PAST_DUE_INTEREST,
+ PaymentAllocationType.DUE_PENALTY, PaymentAllocationType.DUE_FEE, PaymentAllocationType.DUE_PRINCIPAL,
+ PaymentAllocationType.DUE_INTEREST, PaymentAllocationType.IN_ADVANCE_PENALTY, PaymentAllocationType.IN_ADVANCE_FEE,
+ PaymentAllocationType.IN_ADVANCE_PRINCIPAL, PaymentAllocationType.IN_ADVANCE_INTEREST);
- Assertions.assertNotNull(createResponse);
- Assertions.assertNotNull(createResponse.getResourceId());
-
- Long variationId = createResponse.getResourceId();
-
- try {
- LOAN_TRANSACTION_HELPER_403.deleteInterestPauseByLoanId(variationId, nonExistLoanId);
- } catch (Exception e) {
- String responseBody = e.getMessage();
- Assertions.assertNotNull(responseBody, "Response body should not be null");
- Assertions.assertTrue(responseBody.contains("error.msg.variation.not.found"),
- "Response should contain the validation error message for variation not found");
- }
- }
-
- /**
- * create a new client
- **/
- private void createClientEntity() {
- this.clientId = ClientHelper.createClient(REQUEST_SPEC, RESPONSE_SPEC);
-
- ClientHelper.verifyClientCreatedOnServer(REQUEST_SPEC, RESPONSE_SPEC, clientId);
+ advancedPaymentData.setPaymentAllocationOrder(paymentAllocationOrders);
+ return advancedPaymentData;
}
- /**
- * create a new loan product
- **/
- private void createLoanProductEntity() {
- LOG.info("---------------------------------CREATING LOAN PRODUCT------------------------------------------");
-
- final String interestRecalculationCompoundingMethod = LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_NONE;
- final String rescheduleStrategyMethod = LoanProductTestBuilder.RECALCULATION_STRATEGY_ADJUST_LAST_UNPAID_PERIOD;
- final String preCloseInterestCalculationStrategy = LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE;
-
- final Account assetAccount = ACCOUNT_HELPER.createAssetAccount();
- final Account incomeAccount = ACCOUNT_HELPER.createIncomeAccount();
- final Account expenseAccount = ACCOUNT_HELPER.createExpenseAccount();
- final Account overpaymentAccount = ACCOUNT_HELPER.createLiabilityAccount();
-
- String futureInstallmentAllocationRule = "NEXT_INSTALLMENT";
- AdvancedPaymentData defaultAllocation = createDefaultPaymentAllocation(futureInstallmentAllocationRule);
- String loanProductJSON = new LoanProductTestBuilder().withPrincipal(loanPrincipalAmount).withNumberOfRepayments(numberOfRepayments)
- .withRepaymentAfterEvery("1").withRepaymentTypeAsMonth().withinterestRatePerPeriod(interestRatePerPeriod)
- .withInterestRateFrequencyTypeAsMonths().withAmortizationTypeAsEqualInstallments().withInterestTypeAsDecliningBalance()
- .withAccountingRulePeriodicAccrual(new Account[] { assetAccount, incomeAccount, expenseAccount, overpaymentAccount })
- .withInterestCalculationPeriodTypeAsRepaymentPeriod(true).addAdvancedPaymentAllocation(defaultAllocation)
- .withLoanScheduleType(LoanScheduleType.PROGRESSIVE).withLoanScheduleProcessingType(LoanScheduleProcessingType.HORIZONTAL)
- .withMultiDisburse().withDisallowExpectedDisbursements(true).withInterestRecalculationDetails(
- interestRecalculationCompoundingMethod, rescheduleStrategyMethod, preCloseInterestCalculationStrategy)
- .build();
-
- loanProductId = LOAN_TRANSACTIONAL_HELPER.getLoanProductId(loanProductJSON);
- LOG.info("Successfully created loan product (ID:{}) ", loanProductId);
+ private static List<PaymentAllocationOrder> getPaymentAllocationOrder(PaymentAllocationType... paymentAllocationTypes) {
+ AtomicInteger integer = new AtomicInteger(1);
+ return Arrays.stream(paymentAllocationTypes).map(pat -> {
+ PaymentAllocationOrder paymentAllocationOrder = new PaymentAllocationOrder();
+ paymentAllocationOrder.setPaymentAllocationRule(pat.name());
+ paymentAllocationOrder.setOrder(integer.getAndIncrement());
+ return paymentAllocationOrder;
+ }).collect(Collectors.toList());
}
- /**
- * submit a new loan application, approve and disburse the loan
- **/
- private void createLoanEntity() {
- LOG.info("---------------------------------NEW LOAN APPLICATION------------------------------------------");
-
- String loanApplicationJSON = new LoanApplicationTestBuilder().withPrincipal(loanPrincipalAmount)
- .withLoanTermFrequency(numberOfRepayments).withLoanTermFrequencyAsDays().withNumberOfRepayments(numberOfRepayments)
- .withRepaymentEveryAfter("1").withRepaymentFrequencyTypeAsDays().withInterestRatePerPeriod(interestRatePerPeriod)
- .withInterestTypeAsFlatBalance().withAmortizationTypeAsEqualPrincipalPayments()
- .withInterestCalculationPeriodTypeSameAsRepaymentPeriod().withExpectedDisbursementDate(dateString)
- .withSubmittedOnDate(dateString).withLoanType("individual").withExternalId(externalId)
- .withRepaymentStrategy("advanced-payment-allocation-strategy").build(clientId.toString(), loanProductId.toString(), null);
-
- loanId = LOAN_TRANSACTIONAL_HELPER.getLoanId(loanApplicationJSON);
-
- LOG.info("Sucessfully created loan (ID: {} )", loanId);
-
- approveLoanApplication();
- disburseLoan();
+ private static PostLoansResponse applyForLoanApplication(final Long clientId, final Integer loanProductId, final BigDecimal principal,
+ final int loanTermFrequency, final int repaymentAfterEvery, final int numberOfRepayments, final BigDecimal interestRate,
+ final String expectedDisbursementDate, final String submittedOnDate, final String externalId) {
+ return applyForLoanApplication(clientId, loanProductId, principal, loanTermFrequency, repaymentAfterEvery, numberOfRepayments,
+ interestRate, expectedDisbursementDate, submittedOnDate, LoanScheduleProcessingType.HORIZONTAL, externalId);
}
- /**
- * approve the loan application
- **/
- private void approveLoanApplication() {
-
- if (loanId != null) {
- LOAN_TRANSACTIONAL_HELPER.approveLoan(dateString, loanId);
- LOG.info("Successfully approved loan (ID: {} )", loanId);
- }
+ private static PostLoansResponse applyForLoanApplication(final Long clientId, final Integer loanProductId, final BigDecimal principal,
+ final int loanTermFrequency, final int repaymentAfterEvery, final int numberOfRepayments, final BigDecimal interestRate,
+ final String expectedDisbursementDate, final String submittedOnDate, LoanScheduleProcessingType loanScheduleProcessingType,
+ final String externalId) {
+ LOG.info("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------");
+ return applyForLoanApplication(clientId, loanProductId, principal, loanTermFrequency, repaymentAfterEvery, numberOfRepayments,
+ interestRate, expectedDisbursementDate, submittedOnDate,
+ AdvancedPaymentScheduleTransactionProcessor.ADVANCED_PAYMENT_ALLOCATION_STRATEGY, loanScheduleProcessingType.name(),
+ externalId);
}
- /**
- * disburse the newly created loan
- **/
- private void disburseLoan() {
-
- if (loanId != null) {
- LOAN_TRANSACTIONAL_HELPER.disburseLoan(externalId, new PostLoansLoanIdRequest().actualDisbursementDate(dateString)
- .transactionAmount(new BigDecimal(loanPrincipalAmount)).locale("en").dateFormat("dd MMMM yyyy"));
- LOG.info("Successfully disbursed loan (ID: {} )", loanId);
- }
+ private static PostLoansResponse applyForLoanApplication(final Long clientId, final Integer loanProductId, final BigDecimal principal,
+ final int loanTermFrequency, final int repaymentAfterEvery, final int numberOfRepayments, final BigDecimal interestRate,
+ final String expectedDisbursementDate, final String submittedOnDate, String transactionProcessorCode,
+ String loanScheduleProcessingType, final String externalId) {
+ LOG.info("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------");
+ return LOAN_TRANSACTIONAL_HELPER.applyLoan(new PostLoansRequest().clientId(clientId).productId(loanProductId.longValue())
+ .expectedDisbursementDate(expectedDisbursementDate).dateFormat(DATETIME_PATTERN)
+ .transactionProcessingStrategyCode(transactionProcessorCode).locale("en").submittedOnDate(submittedOnDate)
+ .amortizationType(1).interestRatePerPeriod(interestRate).interestCalculationPeriodType(1).interestType(0)
+ .repaymentFrequencyType(0).repaymentEvery(repaymentAfterEvery).repaymentFrequencyType(0)
+ .numberOfRepayments(numberOfRepayments).loanTermFrequency(loanTermFrequency).loanTermFrequencyType(0).principal(principal)
+ .loanType("individual").loanScheduleProcessingType(loanScheduleProcessingType).externalId(externalId)
+ .maxOutstandingLoanBalance(BigDecimal.valueOf(35000)));
}
}
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanProductTestBuilder.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanProductTestBuilder.java
index 507d789fe..40116b9ae 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanProductTestBuilder.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanProductTestBuilder.java
@@ -66,7 +66,6 @@ public class LoanProductTestBuilder {
public static final String RECALCULATION_STRATEGY_RESCHEDULE_NEXT_REPAYMENTS = "1";
public static final String RECALCULATION_STRATEGY_REDUCE_NUMBER_OF_INSTALLMENTS = "2";
public static final String RECALCULATION_STRATEGY_REDUCE_EMI_AMOUN = "3";
- public static final String RECALCULATION_STRATEGY_ADJUST_LAST_UNPAID_PERIOD = "4";
public static final String RECALCULATION_COMPOUNDING_METHOD_NONE = "0";
public static final String RECALCULATION_COMPOUNDING_METHOD_INTEREST = "1";
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
index 52e222d65..8785ec626 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
@@ -609,7 +609,7 @@ public class LoanTransactionHelper extends IntegrationTest {
}
public PostLoansLoanIdTransactionsResponse createInterestPauseByLoanId(final String startDate, final String endDate,
- final String dateFormat, final String locale, final Integer loanID) {
+ final String dateFormat, final String locale, final Long loanID) {
log.info("Creating interest pause for Loan {} from {} to {} with dateFormat {} and locale {}", loanID, startDate, endDate,
dateFormat, locale);
String body = getInterestPauseBodyAsJSON(startDate, endDate, dateFormat, locale);
@@ -624,20 +624,7 @@ public class LoanTransactionHelper extends IntegrationTest {
return postLoanTransaction(createInterestPause(INTEREST_PAUSE_COMMAND, externalId), body);
}
- public PostLoansLoanIdTransactionsResponse updateInterestPauseByLoanId(final Long termVariationId, final String startDate,
- final String endDate, final String dateFormat, final String locale, final Integer loanID) {
- log.info("Updating interest pause for Loan {} with Term Variation ID {}: startDate={} endDate={} dateFormat={} locale={}", loanID,
- termVariationId, startDate, endDate, dateFormat, locale);
- String body = getInterestPauseBodyAsJSON(startDate, endDate, dateFormat, locale);
- return putLoanTransaction(updateInterestPause(termVariationId, loanID), body);
- }
-
- public void deleteInterestPauseByLoanId(final Long termVariationId, final Integer loanID) {
- log.info("Deleting interest pause for Loan ID {} with Term Variation ID {}", loanID, termVariationId);
- deleteLoanTransaction(deleteInterestPause(termVariationId, loanID));
- }
-
- public String retrieveInterestPauseByLoanId(final Integer loanID) {
+ public String retrieveInterestPauseByLoanId(final Long loanID) {
log.info("Retrieving interest pauses for Loan ID {}", loanID);
String url = retrieveInterestPause(loanID);
return Utils.performServerGet(requestSpec, responseSpec, url);
@@ -1463,7 +1450,7 @@ public class LoanTransactionHelper extends IntegrationTest {
return "/fineract-provider/api/v1/loans/" + loanID + "/transactions?command=" + command + "&" + Utils.TENANT_IDENTIFIER;
}
- private String createInterestPause(final String command, final Integer loanID) {
+ private String createInterestPause(final String command, final Long loanID) {
return "/fineract-provider/api/v1/loans/" + loanID + "/interest-pauses?command=" + command + "&" + Utils.TENANT_IDENTIFIER;
}
@@ -1472,7 +1459,7 @@ public class LoanTransactionHelper extends IntegrationTest {
+ Utils.TENANT_IDENTIFIER;
}
- private String retrieveInterestPause(final Integer loanID) {
+ private String retrieveInterestPause(final Long loanID) {
return "/fineract-provider/api/v1/loans/" + loanID + "/interest-pauses?" + Utils.TENANT_IDENTIFIER;
}
@@ -1480,14 +1467,6 @@ public class LoanTransactionHelper extends IntegrationTest {
return "/fineract-provider/api/v1/loans/external-id/" + externalId + "/interest-pauses?" + Utils.TENANT_IDENTIFIER;
}
- private String updateInterestPause(final Long termVariationId, final Integer loanID) {
- return "/fineract-provider/api/v1/loans/" + loanID + "/interest-pauses/" + termVariationId + "?" + Utils.TENANT_IDENTIFIER;
- }
-
- private String deleteInterestPause(final Long termVariationId, final Integer loanID) {
- return "/fineract-provider/api/v1/loans/" + loanID + "/interest-pauses/" + termVariationId + "?" + Utils.TENANT_IDENTIFIER;
- }
-
private String createInteroperationLoanTransactionURL(final String accountNo) {
return "/fineract-provider/api/v1/interoperation/transactions/" + accountNo + "/loanrepayment";
}
@@ -1534,15 +1513,6 @@ public class LoanTransactionHelper extends IntegrationTest {
return GSON.fromJson(response, PostLoansLoanIdTransactionsResponse.class);
}
- private PostLoansLoanIdTransactionsResponse putLoanTransaction(final String putURLForLoanTransaction, final String jsonToBeSent) {
- final String response = Utils.performServerPut(this.requestSpec, this.responseSpec, putURLForLoanTransaction, jsonToBeSent);
- return GSON.fromJson(response, PostLoansLoanIdTransactionsResponse.class);
- }
-
- private void deleteLoanTransaction(final String deleteURLForLoanTransaction) {
- Utils.performServerDelete(this.requestSpec, this.responseSpec, deleteURLForLoanTransaction, null);
- }
-
private Object performLoanTransaction(final String postURLForLoanTransaction, final String jsonToBeSent,
ResponseSpecification responseValidationError) {