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

manojvm 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 eaad5fdf0 FINERACT-1920:Create Interoperation Loan Repayment API 
(#3119)
eaad5fdf0 is described below

commit eaad5fdf0cf62035740283e1d82d52ae58a67515
Author: logoutdhaval <[email protected]>
AuthorDate: Thu Apr 27 15:14:32 2023 +0530

    FINERACT-1920:Create Interoperation Loan Repayment API (#3119)
---
 .../interoperation/api/InteropApiResource.java     | 10 ++++
 .../interoperation/service/InteropService.java     |  3 ++
 .../interoperation/service/InteropServiceImpl.java | 13 +++++
 .../ClientLoanIntegrationTest.java                 | 55 ++++++++++++++++++++++
 .../common/loans/LoanTransactionHelper.java        |  9 ++++
 5 files changed, 90 insertions(+)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/interoperation/api/InteropApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/interoperation/api/InteropApiResource.java
index cc093fb68..3703416bb 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/interoperation/api/InteropApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/interoperation/api/InteropApiResource.java
@@ -416,4 +416,14 @@ public class InteropApiResource {
         return interopService.disburseLoan(accountId, apiRequestBodyAsJson);
     }
 
+    @POST
+    @Consumes({ MediaType.APPLICATION_JSON })
+    @Produces({ MediaType.APPLICATION_JSON })
+    @Path("transactions/{accountId}/loanrepayment")
+    @Operation(summary = "Disburse Loan by Account Id", description = "")
+    public String loanRepayment(@PathParam("accountId") @Parameter(description 
= "accountId") String accountId,
+            @Parameter(hidden = true) final String apiRequestBodyAsJson, 
@Context UriInfo uriInfo) {
+        return interopService.loanRepayment(accountId, apiRequestBodyAsJson);
+    }
+
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropService.java
index 92b0473d7..9dcb1a859 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropService.java
@@ -81,4 +81,7 @@ public interface InteropService {
 
     @NotNull
     String disburseLoan(@NotNull String accountId, String 
apiRequestBodyAsJson);
+
+    @NotNull
+    String loanRepayment(@NotNull String accountId, String 
apiRequestBodyAsJson);
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java
index c045c09aa..398f22218 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java
@@ -544,6 +544,19 @@ public class InteropServiceImpl implements InteropService {
         return this.toApiJsonSerializer.serialize(result);
     }
 
+    @Override
+    public @NotNull String loanRepayment(@NotNull String accountId, String 
apiRequestBodyAsJson) {
+        Loan loan = validateAndGetLoan(accountId);
+        Long loanId = loan.getId();
+
+        final CommandWrapperBuilder builder = new 
CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
+
+        final CommandWrapper commandRequest = 
builder.loanRepaymentTransaction(loanId).build();
+        CommandProcessingResult result = 
this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
+
+        return this.toApiJsonSerializer.serialize(result);
+    }
+
     private SavingsAccount validateAndGetSavingAccount(String accountId) {
         SavingsAccount savingsAccount = 
savingsAccountRepository.findByExternalId(accountId);
         if (savingsAccount == null) {
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
index 04884c44f..b204a2e88 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
@@ -3983,6 +3983,61 @@ public class ClientLoanIntegrationTest {
 
     }
 
+    @Test
+    public void testInteroperationLoanRepaymentAPI() {
+        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
+        final ResponseSpecification errorResponse = new 
ResponseSpecBuilder().expectStatusCode(403).build();
+        DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", 
Locale.US);
+        dateFormat.setTimeZone(Utils.getTimeZoneOfTenant());
+        
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(this.requestSpec,
 this.responseSpec, "42", true);
+        Calendar startDate = Calendar.getInstance(Utils.getTimeZoneOfTenant());
+        startDate.add(Calendar.MONTH, -8);
+
+        Calendar firstRepaymentDate = (Calendar) startDate.clone();
+        firstRepaymentDate.add(Calendar.MONTH, 1);
+        firstRepaymentDate.add(Calendar.DAY_OF_MONTH, 
firstRepaymentDate.getActualMaximum(Calendar.DAY_OF_MONTH) - 
Calendar.DAY_OF_MONTH);
+        String firstRepayment = 
dateFormat.format(firstRepaymentDate.getTime());
+
+        final String loanDisbursementDate = 
dateFormat.format(startDate.getTime());
+        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
+        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
+        final Integer loanProductID = 
createLoanProductWithInterestRecalculationAndCompoundingDetails(
+                
LoanProductTestBuilder.INTEREST_PRINCIPAL_PENALTIES_FEES_ORDER_STRATEGY,
+                LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_NONE,
+                
LoanProductTestBuilder.RECALCULATION_STRATEGY_REDUCE_NUMBER_OF_INSTALLMENTS,
+                
LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD,
+                
LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, 
"12");
+
+        final Integer loanID = 
applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, 
loanDisbursementDate,
+                
LoanApplicationTestBuilder.INTEREST_PRINCIPAL_PENALTIES_FEES_ORDER_STRATEGY, 
firstRepayment);
+
+        Assertions.assertNotNull(loanID);
+        HashMap loanStatusHashMap = 
LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
+        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
+
+        LOG.info("-----------------------------------APPROVE 
LOAN-----------------------------------------");
+        loanStatusHashMap = 
this.loanTransactionHelper.approveLoan(loanDisbursementDate, loanID);
+        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
+        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
+
+        LOG.info("-------------------------------DISBURSE 
LOAN-------------------------------------------");
+        String loanDetails = 
this.loanTransactionHelper.getLoanDetails(this.requestSpec, this.responseSpec, 
loanID);
+        loanStatusHashMap = 
this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount(loanDisbursementDate,
 loanID,
+                
JsonPath.from(loanDetails).get("netDisbursalAmount").toString());
+        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
+
+        ArrayList<HashMap> loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
+        Assertions.assertNotNull(loanSchedule);
+        startDate.add(Calendar.DAY_OF_MONTH, 2);
+        String loanFirstRepaymentDate = dateFormat.format(startDate.getTime());
+
+        Float earlyPayment = Float.parseFloat("3000");
+        String accountNo = 
JsonPath.from(loanDetails).get("accountNo").toString();
+
+        HashMap loanRepayment = 
this.loanTransactionHelper.makeRepaymentWithAccountNo(loanFirstRepaymentDate, 
earlyPayment, accountNo);
+        assertNotNull(loanRepayment);
+    }
+
     @Test
     public void 
testLoanScheduleWithInterestRecalculation_WITH_REST_WEEKLY_INTEREST_COMPOUND_INTEREST_FEE_STRATEGY_REDUCE_NEXT_INSTALLMENTS()
 {
         this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
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 0af276d95..fb475c1d2 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
@@ -507,6 +507,11 @@ public class LoanTransactionHelper extends IntegrationTest 
{
                 getRepaymentBodyAsJSON(date, amountToBePaid), "");
     }
 
+    public HashMap makeRepaymentWithAccountNo(final String date, final Float 
amountToBePaid, final String accountNo) {
+        return (HashMap) 
performLoanTransaction(createInteroperationLoanTransactionURL(accountNo),
+                getRepaymentBodyAsJSON(date, amountToBePaid), "");
+    }
+
     public HashMap reverseRepayment(final Integer loanId, final Integer 
transactionId, String date) {
         return (HashMap) performLoanTransaction(createLoanTransactionURL(UNDO, 
loanId, transactionId),
                 getAdjustTransactionJsonBody(date, "0"), "");
@@ -1285,6 +1290,10 @@ public class LoanTransactionHelper extends 
IntegrationTest {
         return "/fineract-provider/api/v1/loans/" + loanID + 
"/transactions?command=" + command + "&" + Utils.TENANT_IDENTIFIER;
     }
 
+    private String createInteroperationLoanTransactionURL(final String 
accountNo) {
+        return "/fineract-provider/api/v1/interoperation/transactions/" + 
accountNo + "/loanrepayment";
+    }
+
     private String createLoanTransactionURL(final String command, final 
Integer loanID, final Integer transactionId) {
         String url = "/fineract-provider/api/v1/loans/" + loanID + 
"/transactions/" + transactionId + "?";
         if (command != null) {

Reply via email to