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 87204d5a8 Added reschedule loans api resource to Fineract Client and
batch; minor swagger polishing
87204d5a8 is described below
commit 87204d5a8a70d7e1c5659233190c8aa7165181c6
Author: Arnold Galovics <[email protected]>
AuthorDate: Fri Jul 29 15:35:23 2022 +0200
Added reschedule loans api resource to Fineract Client and batch; minor
swagger polishing
---
.../fineract/client/util/FineractClient.java | 3 +
.../batch/command/CommandStrategyProvider.java | 2 +
...CreateLoanRescheduleRequestCommandStrategy.java | 65 +++
.../client/api/ClientsApiResourceSwagger.java | 3 +-
.../loanaccount/api/LoansApiResourceSwagger.java | 609 ++++++++++++++++-----
.../api/RescheduleLoansApiResource.java | 24 +
.../api/RescheduleLoansApiResourceSwagger.java | 221 ++++++++
.../service/LoanReadPlatformServiceImpl.java | 4 +-
.../api/SelfLoansApiResourceSwagger.java | 148 ++---
.../batch/command/CommandStrategyProviderTest.java | 3 +
...teLoanRescheduleRequestCommandStrategyTest.java | 113 ++++
.../fineract/integrationtests/BatchApiTest.java | 83 +++
.../integrationtests/common/BatchHelper.java | 66 ++-
.../integrationtests/common/ClientHelper.java | 5 +-
14 files changed, 1154 insertions(+), 195 deletions(-)
diff --git
a/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java
b/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java
index 3c44b1e59..06062d49c 100644
---
a/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java
+++
b/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java
@@ -103,6 +103,7 @@ import
org.apache.fineract.client.services.RecurringDepositAccountTransactionsAp
import org.apache.fineract.client.services.RecurringDepositProductApi;
import org.apache.fineract.client.services.ReportMailingJobsApi;
import org.apache.fineract.client.services.ReportsApi;
+import org.apache.fineract.client.services.RescheduleLoansApi;
import org.apache.fineract.client.services.RolesApi;
import org.apache.fineract.client.services.RunReportsApi;
import org.apache.fineract.client.services.SavingsAccountApi;
@@ -234,6 +235,7 @@ public final class FineractClient {
public final RecurringDepositProductApi recurringDepositProducts;
public final ReportMailingJobsApi reportMailingJobs;
public final ReportsApi reports;
+ public final RescheduleLoansApi rescheduleLoans;
public final RolesApi roles;
public final RunReportsApi reportsRun;
public final SavingsAccountApi savingsAccounts;
@@ -346,6 +348,7 @@ public final class FineractClient {
recurringDepositProducts =
retrofit.create(RecurringDepositProductApi.class);
reportMailingJobs = retrofit.create(ReportMailingJobsApi.class);
reports = retrofit.create(ReportsApi.class);
+ rescheduleLoans = retrofit.create(RescheduleLoansApi.class);
roles = retrofit.create(RolesApi.class);
reportsRun = retrofit.create(RunReportsApi.class);
savingsAccounts = retrofit.create(SavingsAccountApi.class);
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java
index 634450304..5b8d37d38 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java
@@ -102,6 +102,8 @@ public class CommandStrategyProvider {
"approveLoanCommandStrategy");
this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\?command=disburse").method("POST").build(),
"disburseLoanCommandStrategy");
+
this.commandStrategies.put(CommandContext.resource("rescheduleloans").method("POST").build(),
+ "createLoanRescheduleRequestCommandStrategy");
this.commandStrategies.put(CommandContext.resource("rescheduleloans\\/\\d+\\?command=approve").method("POST").build(),
"approveLoanRescheduleCommandStrategy");
this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\/\\d+").method("GET").build(),
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/CreateLoanRescheduleRequestCommandStrategy.java
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/CreateLoanRescheduleRequestCommandStrategy.java
new file mode 100644
index 000000000..256c5f050
--- /dev/null
+++
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/CreateLoanRescheduleRequestCommandStrategy.java
@@ -0,0 +1,65 @@
+/**
+ * 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.batch.command.internal;
+
+import javax.ws.rs.core.UriInfo;
+import lombok.RequiredArgsConstructor;
+import org.apache.fineract.batch.command.CommandStrategy;
+import org.apache.fineract.batch.domain.BatchRequest;
+import org.apache.fineract.batch.domain.BatchResponse;
+import
org.apache.fineract.portfolio.loanaccount.rescheduleloan.api.RescheduleLoansApiResource;
+import org.springframework.stereotype.Component;
+
+/**
+ * Implements {@link CommandStrategy} and applies a new reschedule loan
request on an existing loan. It passes the
+ * contents of the body from the BatchRequest to {@link
RescheduleLoansApiResource} and gets back the response. This
+ * class will also catch any errors raised by {@link
RescheduleLoansApiResource} and map those errors to appropriate
+ * status codes in BatchResponse.
+ *
+ * @see CommandStrategy
+ * @see BatchRequest
+ * @see BatchResponse
+ */
+@Component
+@RequiredArgsConstructor
+public class CreateLoanRescheduleRequestCommandStrategy implements
CommandStrategy {
+
+ private final RescheduleLoansApiResource rescheduleLoansApiResource;
+
+ @Override
+ public BatchResponse execute(BatchRequest request,
@SuppressWarnings("unused") UriInfo uriInfo) {
+
+ final BatchResponse response = new BatchResponse();
+ final String responseBody;
+
+ response.setRequestId(request.getRequestId());
+ response.setHeaders(request.getHeaders());
+
+ // Calls 'createLoanRescheduleRequest' function from
+ // 'RescheduleLoansApiResource' to create a reschedule request on an
existing loan
+ responseBody =
rescheduleLoansApiResource.createLoanRescheduleRequest(request.getBody());
+
+ response.setStatusCode(200);
+ // Sets the body of the response after savings is successfully
+ // applied
+ response.setBody(responseBody);
+
+ return response;
+ }
+}
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
index 2fe5583d3..6f5beda69 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
@@ -320,7 +320,8 @@ final class ClientsApiResourceSwagger {
public List<PostClientsDatatable> datatables;
@Schema(description = "Address requests")
public List<PostClientsAddressRequest> address;
-
+ @Schema(example = "[email protected]")
+ public String emailAddress;
}
@Schema(description = "PostClientsResponse")
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
index 6b12d2d02..0a72a8dd6 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
@@ -291,44 +291,44 @@ final class LoansApiResourceSwagger {
public Double principalDue;
@Schema(example = "200.000000")
public Double principalPaid;
- @Schema(example = "0")
- public Long principalWrittenOff;
+ @Schema(example = "0.000000")
+ public Double principalWrittenOff;
@Schema(example = "20.000000")
public Double principalOutstanding;
@Schema(example = "20.000000")
public Double principalLoanBalanceOutstanding;
- @Schema(example = "0")
- public Long interestOriginalDue;
- @Schema(example = "0")
- public Long interestDue;
- @Schema(example = "0")
- public Long interestPaid;
- @Schema(example = "0")
- public Long interestWaived;
- @Schema(example = "0")
- public Long interestWrittenOff;
- @Schema(example = "0")
- public Long interestOutstanding;
- @Schema(example = "0")
- public Long feeChargesDue;
- @Schema(example = "20")
- public Long feeChargesPaid;
- @Schema(example = "20")
- public Long feeChargesWaived;
- @Schema(example = "20")
- public Long feeChargesWrittenOff;
- @Schema(example = "20")
- public Long feeChargesOutstanding;
- @Schema(example = "20")
- public Long penaltyChargesDue;
- @Schema(example = "20")
- public Long penaltyChargesPaid;
- @Schema(example = "20")
- public Long penaltyChargesWaived;
- @Schema(example = "20")
- public Long penaltyChargesWrittenOff;
- @Schema(example = "20")
- public Long penaltyChargesOutstanding;
+ @Schema(example = "0.000000")
+ public Double interestOriginalDue;
+ @Schema(example = "0.000000")
+ public Double interestDue;
+ @Schema(example = "0.000000")
+ public Double interestPaid;
+ @Schema(example = "0.000000")
+ public Double interestWaived;
+ @Schema(example = "0.000000")
+ public Double interestWrittenOff;
+ @Schema(example = "0.000000")
+ public Double interestOutstanding;
+ @Schema(example = "0.000000")
+ public Double feeChargesDue;
+ @Schema(example = "20.000000")
+ public Double feeChargesPaid;
+ @Schema(example = "20.000000")
+ public Double feeChargesWaived;
+ @Schema(example = "20.000000")
+ public Double feeChargesWrittenOff;
+ @Schema(example = "20.000000")
+ public Double feeChargesOutstanding;
+ @Schema(example = "20.000000")
+ public Double penaltyChargesDue;
+ @Schema(example = "20.000000")
+ public Double penaltyChargesPaid;
+ @Schema(example = "20.000000")
+ public Double penaltyChargesWaived;
+ @Schema(example = "20.000000")
+ public Double penaltyChargesWrittenOff;
+ @Schema(example = "20.000000")
+ public Double penaltyChargesOutstanding;
@Schema(example = "20.000000")
public Double totalOriginalDueForPeriod;
@Schema(example = "20.000000")
@@ -337,20 +337,48 @@ final class LoansApiResourceSwagger {
public Double totalPaidForPeriod;
@Schema(example = "20.000000")
public Double totalPaidInAdvanceForPeriod;
- @Schema(example = "20")
- public Long totalPaidLateForPeriod;
- @Schema(example = "20")
- public Long totalWaivedForPeriod;
- @Schema(example = "20")
- public Long totalWrittenOffForPeriod;
+ @Schema(example = "20.000000")
+ public Double totalPaidLateForPeriod;
+ @Schema(example = "20.000000")
+ public Double totalWaivedForPeriod;
+ @Schema(example = "20.000000")
+ public Double totalWrittenOffForPeriod;
@Schema(example = "200.000000")
public Double totalOutstandingForPeriod;
- @Schema(example = "20")
- public Long totalActualCostOfLoanForPeriod;
+ @Schema(example = "20.000000")
+ public Double totalActualCostOfLoanForPeriod;
@Schema(example = "200.000000")
public Double totalInstallmentAmountForPeriod;
}
+ static final class GetLoansLoanIdDisbursementDetails {
+
+ private GetLoansLoanIdDisbursementDetails() {}
+
+ @Schema(example = "71")
+ public Integer id;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate expectedDisbursementDate;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate actualDisbursementDate;
+ @Schema(example = "22000.000000")
+ public Double principal;
+ @Schema(example = "22000.000000")
+ public Double netDisbursalAmount;
+ @Schema(example = "1")
+ public String loanChargeId;
+ @Schema(example = "22000.000000")
+ public Double chargeAmount;
+ @Schema(example = "22000.000000")
+ public Double waivedChargeAmount;
+ @Schema(example = "dd MMMM yyyy")
+ public String dateFormat;
+ @Schema(example = "de_DE")
+ public String locale;
+ @Schema(example = "some note")
+ public String note;
+ }
+
static final class GetLoansLoanIdSummary {
private GetLoansLoanIdSummary() {}
@@ -370,20 +398,6 @@ final class LoansApiResourceSwagger {
public Long accountNo;
}
- static final class GetLoansLoanIdDisbursementDetails {
-
- private GetLoansLoanIdDisbursementDetails() {}
-
- @Schema(example = "71")
- public Integer id;
- @Schema(example = "[2013, 11, 1]")
- public LocalDate expectedDisbursementDate;
- @Schema(example = "22000.000000")
- public Float principal;
- @Schema(example = "22000.000000")
- public Float approvedPrincipal;
- }
-
static final class GetLoansLoanIdOverdueCharges {
private GetLoansLoanIdOverdueCharges() {}
@@ -457,78 +471,84 @@ final class LoansApiResourceSwagger {
}
public GetLoansLoanIdCurrency currency;
- @Schema(example = "1000000")
- public Long principalDisbursed;
- @Schema(example = "0")
- public Long principalPaid;
- @Schema(example = "0")
- public Long principalWrittenOff;
- @Schema(example = "1000000")
- public Long principalOutstanding;
- @Schema(example = "833333.3")
+ @Schema(example = "1000000.000000")
+ public Double principalDisbursed;
+ @Schema(example = "0.000000")
+ public Double principalPaid;
+ @Schema(example = "0.000000")
+ public Double principalWrittenOff;
+ @Schema(example = "1000000.000000")
+ public Double principalOutstanding;
+ @Schema(example = "833333.300000")
public Double principalOverdue;
- @Schema(example = "240000")
- public Long interestCharged;
- @Schema(example = "0")
- public Long interestPaid;
- @Schema(example = "0")
- public Long interestWaived;
- @Schema(example = "0")
- public Long interestWrittenOff;
- @Schema(example = "240000")
- public Long interestOutstanding;
- @Schema(example = "200000")
- public Long interestOverdue;
- @Schema(example = "18000")
- public Long feeChargesCharged;
- @Schema(example = "0")
- public Long feeChargesDueAtDisbursementCharged;
- @Schema(example = "0")
- public Long feeChargesPaid;
- @Schema(example = "0")
- public Long feeChargesWaived;
- @Schema(example = "0")
- public Long feeChargesWrittenOff;
- @Schema(example = "18000")
- public Long feeChargesOutstanding;
- @Schema(example = "15000")
- public Long feeChargesOverdue;
- @Schema(example = "0")
- public Long penaltyChargesCharged;
- @Schema(example = "0")
- public Long penaltyChargesPaid;
- @Schema(example = "0")
- public Long penaltyChargesWaived;
- @Schema(example = "0")
- public Long penaltyChargesWrittenOff;
- @Schema(example = "0")
- public Long penaltyChargesOutstanding;
- @Schema(example = "0")
- public Long penaltyChargesOverdue;
- @Schema(example = "1258000")
- public Long totalExpectedRepayment;
- @Schema(example = "0")
- public Long totalRepayment;
- @Schema(example = "258000")
- public Long totalExpectedCostOfLoan;
- @Schema(example = "0")
- public Long totalCostOfLoan;
- @Schema(example = "0")
- public Long totalWaived;
- @Schema(example = "0")
- public Long totalWrittenOff;
- @Schema(example = "1258000")
- public Long totalOutstanding;
- @Schema(example = "1048333.3")
+ @Schema(example = "240000.000000")
+ public Double interestCharged;
+ @Schema(example = "0.000000")
+ public Double interestPaid;
+ @Schema(example = "0.000000")
+ public Double interestWaived;
+ @Schema(example = "0.000000")
+ public Double interestWrittenOff;
+ @Schema(example = "240000.000000")
+ public Double interestOutstanding;
+ @Schema(example = "200000.000000")
+ public Double interestOverdue;
+ @Schema(example = "18000.000000")
+ public Double feeChargesCharged;
+ @Schema(example = "0.000000")
+ public Double feeChargesDueAtDisbursementCharged;
+ @Schema(example = "0.000000")
+ public Double feeChargesPaid;
+ @Schema(example = "0.000000")
+ public Double feeChargesWaived;
+ @Schema(example = "0.000000")
+ public Double feeChargesWrittenOff;
+ @Schema(example = "18000.000000")
+ public Double feeChargesOutstanding;
+ @Schema(example = "15000.000000")
+ public Double feeChargesOverdue;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesCharged;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesPaid;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesWaived;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesWrittenOff;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesOutstanding;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesOverdue;
+ @Schema(example = "1258000.000000")
+ public Double totalExpectedRepayment;
+ @Schema(example = "0.000000")
+ public Double totalRepayment;
+ @Schema(example = "258000.000000")
+ public Double totalExpectedCostOfLoan;
+ @Schema(example = "0.000000")
+ public Double totalCostOfLoan;
+ @Schema(example = "0.000000")
+ public Double totalWaived;
+ @Schema(example = "0.000000")
+ public Double totalWrittenOff;
+ @Schema(example = "1258000.000000")
+ public Double totalOutstanding;
+ @Schema(example = "1048333.30000")
public Double totalOverdue;
+ @Schema(example = "2456.30000")
+ public Double totalRecovered;
@Schema(example = "[2012, 5, 10]")
public LocalDate overdueSinceDate;
+ @Schema(example = "1")
+ public Long writeoffReasonId;
+ @Schema(example = "reason")
+ public String writeoffReason;
public GetLoansLoanIdLinkedAccount linkedAccount;
public Set<GetLoansLoanIdDisbursementDetails> disbursementDetails;
@Schema(example = "1100.000000")
- public Float fixedEmiAmount;
- @Schema(example = "35000")
- public Long maxOutstandingLoanBalance;
+ public Double fixedEmiAmount;
+ @Schema(example = "35000.000000")
+ public Double maxOutstandingLoanBalance;
@Schema(example = "false")
public Boolean canDisburse;
public Set<GetLoansLoanIdEmiVariations> emiAmountVariations;
@@ -539,6 +559,343 @@ final class LoansApiResourceSwagger {
public Set<GetLoansLoanIdOverdueCharges> overdueCharges;
}
+ static final class GetLoansLoanIdPaymentType {
+
+ private GetLoansLoanIdPaymentType() {}
+
+ @Schema(example = "11")
+ public Integer id;
+ @Schema(example = "Cash")
+ public String name;
+ @Schema(example = "Cash Payment")
+ public String description;
+ @Schema(example = "true")
+ public Boolean isCashPayment;
+ @Schema(example = "0")
+ public Long position;
+ }
+
+ static final class GetLoansLoanIdTransactions {
+
+ private GetLoansLoanIdTransactions() {}
+
+ static final class GetLoansLoanIdLoanTransactionEnumData {
+
+ private GetLoansLoanIdLoanTransactionEnumData() {}
+
+ @Schema(example = "1")
+ public Long id;
+ @Schema(example = "loanTransactionType.repayment")
+ public String code;
+ @Schema(example = "2")
+ public String value;
+
+ @Schema(example = "false")
+ public boolean disbursement;
+ @Schema(example = "false")
+ public boolean repaymentAtDisbursement;
+ @Schema(example = "true")
+ public boolean repayment;
+ @Schema(example = "false")
+ public boolean merchantIssuedRefund;
+ @Schema(example = "false")
+ public boolean payoutRefund;
+ @Schema(example = "false")
+ public boolean goodwillCredit;
+ @Schema(example = "false")
+ public boolean contra;
+ @Schema(example = "false")
+ public boolean waiveInterest;
+ @Schema(example = "false")
+ public boolean waiveCharges;
+ @Schema(example = "false")
+ public boolean accrual;
+ @Schema(example = "false")
+ public boolean writeOff;
+ @Schema(example = "false")
+ public boolean recoveryRepayment;
+ @Schema(example = "false")
+ public boolean initiateTransfer;
+ @Schema(example = "false")
+ public boolean approveTransfer;
+ @Schema(example = "false")
+ public boolean withdrawTransfer;
+ @Schema(example = "false")
+ public boolean rejectTransfer;
+ @Schema(example = "false")
+ public boolean chargePayment;
+ @Schema(example = "false")
+ public boolean refund;
+ @Schema(example = "false")
+ public boolean refundForActiveLoans;
+ @Schema(example = "false")
+ public boolean creditBalanceRefund;
+ }
+
+ static final class GetLoansLoanIdPaymentDetailData {
+
+ private GetLoansLoanIdPaymentDetailData() {}
+
+ @Schema(example = "62")
+ public Integer id;
+ public GetLoansLoanIdPaymentType paymentType;
+ @Schema(example = "acc123")
+ public String accountNumber;
+ @Schema(example = "che123")
+ public String checkNumber;
+ @Schema(example = "rou123")
+ public String routingCode;
+ @Schema(example = "rec123")
+ public String receiptNumber;
+ @Schema(example = "ban123")
+ public String bankNumber;
+ }
+
+ static final class GetLoansLoanIdLoanChargePaidByData {
+
+ private GetLoansLoanIdLoanChargePaidByData() {}
+
+ @Schema(example = "11")
+ public Long id;
+ @Schema(example = "100.000000")
+ public Double amount;
+ @Schema(example = "9679")
+ public Integer installmentNumber;
+ @Schema(example = "1")
+ public Long chargeId;
+ @Schema(example = "636")
+ public Long transactionId;
+ @Schema(example = "name")
+ public String name;
+ }
+
+ static final class GetLoansLoanIdCodeValueData {
+
+ private GetLoansLoanIdCodeValueData() {}
+
+ @Schema(example = "1")
+ public Long id;
+ @Schema(example = "code name")
+ public String name;
+ @Schema(example = "0")
+ public Integer position;
+ @Schema(example = "code description")
+ public String description;
+ @Schema(example = "true")
+ public Boolean active;
+ @Schema(example = "false")
+ public Boolean mandatory;
+ }
+
+ static final class
GetLoansLoanIdLoanRepaymentScheduleInstallmentData {
+
+ private GetLoansLoanIdLoanRepaymentScheduleInstallmentData() {}
+
+ @Schema(example = "1")
+ public Long id;
+ @Schema(example = "11")
+ public Integer installmentId;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate date;
+ @Schema(example = "100.000000")
+ public BigDecimal amount;
+ }
+
+ @Schema(example = "1")
+ public Long id;
+ @Schema(example = "1")
+ public Long officeId;
+ @Schema(example = "Head Office")
+ public String officeName;
+ @Schema(description = "Transaction type")
+ public GetLoansLoanIdLoanTransactionEnumData type;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate date;
+ @Schema(description = "Currency")
+ public GetLoansLoanIdCurrency currency;
+ @Schema(description = "Payment detail")
+ public GetLoansLoanIdPaymentDetailData paymentDetailData;
+ @Schema(example = "100.000000")
+ public Double amount;
+ @Schema(example = "100.000000")
+ public Double netDisbursalAmount;
+ @Schema(example = "100.000000")
+ public Double principalPortion;
+ @Schema(example = "100.000000")
+ public Double interestPortion;
+ @Schema(example = "100.000000")
+ public Double feeChargesPortion;
+ @Schema(example = "100.000000")
+ public Double penaltyChargesPortion;
+ @Schema(example = "100.000000")
+ public Double overpaymentPortion;
+ @Schema(example = "100.000000")
+ public Double unrecognizedIncomePortion;
+ @Schema(example = "3")
+ public String externalId;
+ @Schema(example = "100.000000")
+ public Double fixedEmiAmount;
+ @Schema(example = "100.000000")
+ public Double outstandingLoanBalance;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate submittedOnDate;
+ public boolean manuallyReversed;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate possibleNextRepaymentDate;
+ @Schema(description = "List of GetLoansLoanIdLoanChargePaidByData")
+ public List<GetLoansLoanIdLoanChargePaidByData>
loanChargePaidByList;
+ @Schema(description = "List of GetLoansLoanIdPaymentType")
+ public List<GetLoansLoanIdPaymentType> paymentTypeOptions;
+ @Schema(description = "List of GetLoansLoanIdCodeValueData")
+ public List<GetLoansLoanIdCodeValueData> writeOffReasonOptions;
+ @Schema(example = "4")
+ public Integer numberOfRepayments;
+ @Schema(example = "dd MMMM yyyy")
+ public String dateFormat;
+ @Schema(example = "de_DE")
+ public String locale;
+ @Schema(example = "100.000000")
+ public Double transactionAmount;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate transactionDate;
+ @Schema(example = "101")
+ public Long paymentTypeId;
+ @Schema(example = "acct123")
+ public String accountNumber;
+ @Schema(example = "10001")
+ public Integer checkNumber;
+ @Schema(example = "6337")
+ public Integer routingCode;
+ @Schema(example = "67863")
+ public Integer receiptNumber;
+ @Schema(example = "34645568")
+ public Integer bankNumber;
+ @Schema(example = "7327")
+ public Long accountId;
+ @Schema(example = "repayment")
+ public String transactionType;
+ @Schema(description = "List of
GetLoansLoanIdLoanRepaymentScheduleInstallmentData")
+ public List<GetLoansLoanIdLoanRepaymentScheduleInstallmentData>
loanRepaymentScheduleInstallments;
+ }
+
+ static final class GetLoansLoanIdLoanChargeData {
+
+ private GetLoansLoanIdLoanChargeData() {}
+
+ static final class GetLoansLoanIdEnumOptionData {
+
+ private GetLoansLoanIdEnumOptionData() {}
+
+ @Schema(example = "2")
+ public Long id;
+ @Schema(example = "chargeTimeType.specifiedDueDate")
+ public String code;
+ @Schema(example = "Specified due date")
+ public String value;
+ }
+
+ static final class GetLoansLoanIdLoanInstallmentChargeData {
+
+ private GetLoansLoanIdLoanInstallmentChargeData() {}
+
+ @Schema(example = "2")
+ public Integer installmentNumber;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate dueDate;
+ @Schema(example = "13.560000")
+ public Double amount;
+ @Schema(example = "13.560000")
+ public Double amountOutstanding;
+ @Schema(example = "13.560000")
+ public Double amountWaived;
+ @Schema(example = "false")
+ public boolean paid;
+ @Schema(example = "false")
+ public boolean waived;
+ @Schema(example = "13.560000")
+ public Double amountAccrued;
+ @Schema(example = "13.560000")
+ public Double amountUnrecognized;
+ }
+
+ @Schema(example = "3")
+ public Long id;
+ @Schema(example = "5")
+ public Long chargeId;
+ @Schema(example = "snooze fee")
+ public String name;
+ @Schema(description = "Enum option data")
+ public GetLoansLoanIdEnumOptionData chargeTimeType;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate dueDate;
+ @Schema(description = "Enum option data")
+ public GetLoansLoanIdEnumOptionData chargeCalculationType;
+ @Schema(example = "3.400000")
+ public Double percentage;
+ @Schema(example = "13.560000")
+ public Double amountPercentageAppliedTo;
+ @Schema(description = "currency")
+ public GetLoansLoanIdCurrency currency;
+ @Schema(example = "102.000000")
+ public Double amount;
+ @Schema(example = "12.000000")
+ public Double amountPaid;
+ @Schema(example = "14.000000")
+ public Double amountWaived;
+ @Schema(example = "102.000000")
+ public Double amountWrittenOff;
+ @Schema(example = "102.000000")
+ public Double amountOutstanding;
+ @Schema(example = "102.000000")
+ public Double amountOrPercentage;
+ @Schema(example = "false")
+ public boolean penalty;
+ @Schema(description = "Enum option data")
+ public GetLoansLoanIdEnumOptionData chargePaymentMode;
+ @Schema(example = "false")
+ public boolean paid;
+ @Schema(example = "false")
+ public boolean waived;
+ @Schema(example = "false")
+ public boolean chargePayable;
+ @Schema(example = "3")
+ public Long loanId;
+ @Schema(example = "30.000000")
+ public Double minCap;
+ @Schema(example = "30.000000")
+ public Double maxCap;
+ @Schema(description = "List of
GetLoansLoanIdLoanInstallmentChargeData")
+ public List<GetLoansLoanIdLoanInstallmentChargeData>
installmentChargeData;
+ @Schema(example = "30.000000")
+ private Double amountAccrued;
+ @Schema(example = "30.000000")
+ private Double amountUnrecognized;
+ @Schema(example = "3ert3453")
+ private String externalId;
+ }
+
+ static final class GetLoansLoanIdCollectionData {
+
+ private GetLoansLoanIdCollectionData() {}
+
+ @Schema(example = "100.000000")
+ public Double availableDisbursementAmount;
+ @Schema(example = "12")
+ public Integer pastDueDays;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate nextPaymentDueDate;
+ @Schema(example = "4")
+ public Integer delinquentDays;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate delinquentDate;
+ @Schema(example = "100.000000")
+ public Double delinquentAmount;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate lastPaymentDate;
+ @Schema(example = "100.000000")
+ public Double lastPaymentAmount;
+ }
+
@Schema(example = "1")
public Long id;
@Schema(example = "000000001")
@@ -566,7 +923,7 @@ final class LoansApiResourceSwagger {
public String loanOfficerName;
public GetLoansLoanIdLoanType loanType;
public GetLoansLoanIdCurrency currency;
- @Schema(example = "1000000")
+ @Schema(example = "1000000.00")
public BigDecimal principal;
@Schema(example = "1000.000000")
public Double approvedPrincipal;
@@ -595,6 +952,14 @@ final class LoansApiResourceSwagger {
public GetLoansLoanIdTimeline timeline;
public GetLoansLoanIdSummary summary;
public GetLoansLoanIdRepaymentSchedule repaymentSchedule;
+ @Schema(description = "Set of GetLoansLoanIdDisbursementDetails")
+ public Set<GetLoansLoanIdTransactions> transactions;
+ @Schema(description = "Set of GetLoansLoanIdDisbursementDetails")
+ public Set<GetLoansLoanIdDisbursementDetails> disbursementDetails;
+ @Schema(description = "Delinquent data")
+ public GetLoansLoanIdCollectionData delinquent;
+ @Schema(description = "Set of charges")
+ public Set<GetLoansLoanIdLoanChargeData> charges;
}
@Schema(description = "GetLoansResponse")
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResource.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResource.java
index 2496f8f78..490321146 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResource.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResource.java
@@ -18,6 +18,13 @@
*/
package org.apache.fineract.portfolio.loanaccount.rescheduleloan.api;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
+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 java.util.HashSet;
import java.util.List;
@@ -86,6 +93,9 @@ public class RescheduleLoansApiResource {
@Path("template")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
+ @Operation(summary = "Retrieve all reschedule loan reasons", description =
"Retrieve all reschedule loan reasons as a template")
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "OK", content =
@Content(schema = @Schema(implementation =
RescheduleLoansApiResourceSwagger.GetRescheduleReasonsTemplateResponse.class)))
})
public String retrieveTemplate(@Context final UriInfo uriInfo) {
this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RescheduleLoansApiConstants.ENTITY_NAME);
@@ -102,6 +112,9 @@ public class RescheduleLoansApiResource {
@Path("{scheduleId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
+ @Operation(summary = "Retrieve loan reschedule request by schedule id",
description = "Retrieve loan reschedule request by schedule id")
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "OK", content =
@Content(schema = @Schema(implementation =
RescheduleLoansApiResourceSwagger.GetLoanRescheduleRequestResponse.class))) })
public String readLoanRescheduleRequest(@Context final UriInfo uriInfo,
@PathParam("scheduleId") final Long scheduleId,
@QueryParam("command") final String command) {
this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RescheduleLoansApiConstants.ENTITY_NAME);
@@ -123,6 +136,10 @@ public class RescheduleLoansApiResource {
@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
+ @Operation(summary = "Create loan reschedule request", description =
"Create a loan reschedule request.")
+ @RequestBody(required = true, content = @Content(schema =
@Schema(implementation = String.class)), description = "{\"submittedOnDate\":
\"05/02/2022\",\"rescheduleFromDate\": \"05/02/2022\",\"rescheduleReasonId\":
67,\"adjustedDueDate\": \"07/01/2022\",\"loanId\": \"18\",\"dateFormat\":
\"MM/dd/yyyy\",\"locale\": \"en\"}")
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "OK", content =
@Content(schema = @Schema(implementation =
RescheduleLoansApiResourceSwagger.PostCreateRescheduleLoansResponse.class))) })
public String createLoanRescheduleRequest(final String
apiRequestBodyAsJson) {
final CommandWrapper commandWrapper = new CommandWrapperBuilder()
.createLoanRescheduleRequest(RescheduleLoansApiConstants.ENTITY_NAME).withJson(apiRequestBodyAsJson).build();
@@ -136,6 +153,10 @@ public class RescheduleLoansApiResource {
@Path("{scheduleId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
+ @Operation(summary = "Update loan reschedule request", description =
"Update a loan reschedule request by either approving/rejecting it.")
+ @RequestBody(required = true, content = @Content(schema =
@Schema(implementation = String.class)), description = "{\"approvedOnDate\":
\"05/02/2022\",\"dateFormat\": \"MM/dd/yyyy\",\"locale\": \"en\"}")
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "OK", content =
@Content(schema = @Schema(implementation =
RescheduleLoansApiResourceSwagger.PostUpdateRescheduleLoansResponse.class))) })
public String updateLoanRescheduleRequest(@PathParam("scheduleId") final
Long scheduleId, @QueryParam("command") final String command,
final String apiRequestBodyAsJson) {
CommandWrapper commandWrapper = null;
@@ -175,6 +196,9 @@ public class RescheduleLoansApiResource {
@GET
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
+ @Operation(summary = "Retrieve all reschedule requests", description =
"Retrieve all reschedule requests.")
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "OK", content =
@Content(array = @ArraySchema(schema = @Schema(implementation =
RescheduleLoansApiResourceSwagger.GetLoanRescheduleRequestResponse.class)))) })
public String retrieveAllRescheduleRequest(@Context final UriInfo uriInfo,
@QueryParam("command") final String command) {
this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RescheduleLoansApiConstants.ENTITY_NAME);
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResourceSwagger.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResourceSwagger.java
new file mode 100644
index 000000000..49dc52762
--- /dev/null
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResourceSwagger.java
@@ -0,0 +1,221 @@
+/**
+ * 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.loanaccount.rescheduleloan.api;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Reschedule Loans Api Resource Swagger.
+ */
+final class RescheduleLoansApiResourceSwagger {
+
+ private RescheduleLoansApiResourceSwagger() {}
+
+ @Schema(description = "GetRescheduleReasonsTemplateResponse")
+ public static final class GetRescheduleReasonsTemplateResponse {
+
+ private GetRescheduleReasonsTemplateResponse() {}
+
+ static final class GetRescheduleReasonsAllowedTypes {
+
+ private GetRescheduleReasonsAllowedTypes() {}
+
+ @Schema(example = "1")
+ public Integer id;
+ @Schema(example = "reason")
+ public String name;
+ @Schema(example = "0")
+ public Integer position;
+ @Schema(example = "description")
+ public String description;
+ @Schema(example = "true")
+ public Boolean active;
+ @Schema(example = "false")
+ public Boolean mandatory;
+ }
+
+ public Set<GetRescheduleReasonsAllowedTypes> rescheduleReasons;
+ }
+
+ @Schema(description = "GetLoanRescheduleRequestResponse")
+ public static final class GetLoanRescheduleRequestResponse {
+
+ private GetLoanRescheduleRequestResponse() {}
+
+ static final class GetLoanRescheduleRequestStatus {
+
+ private GetLoanRescheduleRequestStatus() {}
+
+ @Schema(example = "100")
+ public Integer id;
+ @Schema(example = "loanStatusType.submitted.and.pending.approval")
+ public String code;
+ @Schema(example = "Submitted and pending approval")
+ public String value;
+ @Schema(example = "true")
+ public Boolean pendingApproval;
+ @Schema(example = "false")
+ public Boolean approved;
+ @Schema(example = "false")
+ public Boolean rejected;
+ }
+
+ static final class RescheduleReasonsCodeValue {
+
+ private RescheduleReasonsCodeValue() {}
+
+ @Schema(example = "1")
+ public Integer id;
+ @Schema(example = "reason")
+ public String name;
+ @Schema(example = "true")
+ public Boolean active;
+ @Schema(example = "false")
+ public Boolean mandatory;
+ }
+
+ static final class RescheduleReasonsTimeline {
+
+ private RescheduleReasonsTimeline() {}
+
+ @Schema(example = "[2014, 5, 1]")
+ public LocalDate submittedOnDate;
+ @Schema(example = "mifos")
+ public String submittedByUsername;
+ @Schema(example = "App")
+ public String submittedByFirstname;
+ @Schema(example = "Administrator")
+ public String submittedByLastname;
+ @Schema(example = "[2014, 5, 1]")
+ public LocalDate approvedOnDate;
+ @Schema(example = "mifos")
+ public String approvedByUsername;
+ @Schema(example = "App")
+ public String approvedByFirstname;
+ @Schema(example = "Administrator")
+ public String approvedByLastname;
+ }
+
+ static final class LoanTermTypeOptions {
+
+ private LoanTermTypeOptions() {}
+
+ @Schema(example = "2")
+ public Integer id;
+ @Schema(example = "loanTermType.dueDate")
+ public String code;
+ @Schema(example = "dueDate")
+ public String value;
+ }
+
+ static final class LoanTermVariationsData {
+
+ private LoanTermVariationsData() {}
+
+ @Schema(example = "1")
+ public Integer id;
+ public LoanTermTypeOptions termType;
+ @Schema(example = "[2022, 5, 1]")
+ public LocalDate termVariationApplicableFrom;
+ @Schema(example = "100.00")
+ public BigDecimal decimalValue;
+ @Schema(example = "[2022, 5, 2]")
+ public LocalDate dateValue;
+ @Schema(example = "true")
+ public Boolean isSpecificToInstallment;
+ @Schema(example = "true")
+ public Boolean isProcessed;
+
+ }
+
+ @Schema(example = "1")
+ public Integer id;
+ @Schema(example = "18")
+ public Integer loanId;
+ @Schema(example = "15")
+ public Integer clientId;
+ @Schema(example = "clientName")
+ public String clientName;
+ @Schema(example = "000000018")
+ public String loanAccountNumber;
+
+ public GetLoanRescheduleRequestStatus statusEnum;
+
+ @Schema(example = "1")
+ public Integer rescheduleFromInstallment;
+ @Schema(example = "[2022, 5, 1]")
+ public LocalDate rescheduleFromDate;
+ @Schema(example = "false")
+ public Boolean recalculateInterest;
+ public RescheduleReasonsCodeValue rescheduleReasonCodeValue;
+ public RescheduleReasonsTimeline timeline;
+ @Schema(example = "rescheduleReasonComment")
+ public String rescheduleReasonComment;
+ public Set<LoanTermVariationsData> loanTermVariationsData;
+ }
+
+ @Schema(description = "PostCreateRescheduleLoansResponse ")
+ public static final class PostCreateRescheduleLoansResponse {
+
+ private PostCreateRescheduleLoansResponse() {}
+
+ @Schema(example = "1")
+ public Long officeId;
+ @Schema(example = "12")
+ public Long clientId;
+ @Schema(example = "18")
+ public Long loanId;
+ @Schema(example = "12")
+ public Long resourceId;
+ }
+
+ @Schema(description = "PostUpdateRescheduleLoansResponse ")
+ public static final class PostUpdateRescheduleLoansResponse {
+
+ private PostUpdateRescheduleLoansResponse() {}
+
+ static final class PostUpdateRescheduleLoanChanges {
+
+ private PostUpdateRescheduleLoanChanges() {}
+
+ @Schema(example = "en")
+ public String locale;
+ @Schema(example = "en")
+ public String dateFormat;
+ @Schema(example = "05/02/2022")
+ public String approvedOnDate;
+ @Schema(example = "1")
+ public Long approvedByUserId;
+ }
+
+ @Schema(example = "1")
+ public Long officeId;
+ @Schema(example = "12")
+ public Long clientId;
+ @Schema(example = "18")
+ public Long loanId;
+ @Schema(example = "12")
+ public Long resourceId;
+ public PostUpdateRescheduleLoanChanges changes;
+ }
+
+}
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
index 7c7dffe66..1c92ad6f5 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
@@ -2332,7 +2332,7 @@ public class LoanReadPlatformServiceImpl implements
LoanReadPlatformService {
public CollectionData retrieveLoanCollectionData(Long loanId) {
final CollectionDataMapper mapper = new
CollectionDataMapper(sqlGenerator);
String sql = "select " + mapper.schema();
- CollectionData collectionData = this.jdbcTemplate.queryForObject(sql,
mapper, loanId); // NOSONAR
+ CollectionData collectionData = this.jdbcTemplate.queryForObject(sql,
mapper, loanId, loanId); // NOSONAR
return collectionData;
}
@@ -2363,7 +2363,7 @@ public class LoanReadPlatformServiceImpl implements
LoanReadPlatformService {
sqlBuilder.append(
"left join (select lt.loan_id, lt.transaction_date as
transactionDate, lt.amount as amount from m_loan_transaction lt ");
sqlBuilder.append(
- "where lt.is_reversed = false and
lt.transaction_type_enum=2 order by lt.transaction_date desc limit 1) lre on
lre.loan_id = l.id ");
+ "where lt.loan_id =? and lt.is_reversed = false and
lt.transaction_type_enum=2 order by lt.transaction_date desc limit 1) lre on
lre.loan_id = l.id ");
sqlBuilder.append("where l.id=? ");
return sqlBuilder.toString();
}
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/loanaccount/api/SelfLoansApiResourceSwagger.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/loanaccount/api/SelfLoansApiResourceSwagger.java
index 2f3091c58..36c943c19 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/loanaccount/api/SelfLoansApiResourceSwagger.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/loanaccount/api/SelfLoansApiResourceSwagger.java
@@ -228,10 +228,26 @@ final class SelfLoansApiResourceSwagger {
public Integer id;
@Schema(example = "[2013, 11, 1]")
public LocalDate expectedDisbursementDate;
+ @Schema(example = "[2022, 07, 01]")
+ public LocalDate actualDisbursementDate;
@Schema(example = "22000.000000")
- public Float principal;
+ public Double principal;
+ @Schema(example = "22000.000000")
+ public Double netDisbursalAmount;
+ @Schema(example = "1")
+ public String loanChargeId;
+ @Schema(example = "22000.000000")
+ public Double chargeAmount;
+ @Schema(example = "22000.000000")
+ public Double waivedChargeAmount;
@Schema(example = "22000.000000")
public Float approvedPrincipal;
+ @Schema(example = "dd MMMM yyyy")
+ public String dateFormat;
+ @Schema(example = "de_DE")
+ public String locale;
+ @Schema(example = "some note")
+ public String note;
}
static final class GetLoansLoanIdOverdueCharges {
@@ -337,78 +353,78 @@ final class SelfLoansApiResourceSwagger {
}
public GetLoansLoanIdCurrency currency;
- @Schema(example = "1000000")
- public Long principalDisbursed;
- @Schema(example = "0")
- public Long principalPaid;
- @Schema(example = "0")
- public Long principalWrittenOff;
- @Schema(example = "1000000")
- public Long principalOutstanding;
- @Schema(example = "833333.3")
+ @Schema(example = "1000000.000000")
+ public Double principalDisbursed;
+ @Schema(example = "0.000000")
+ public Double principalPaid;
+ @Schema(example = "0.000000")
+ public Double principalWrittenOff;
+ @Schema(example = "1000000.000000")
+ public Double principalOutstanding;
+ @Schema(example = "833333.300000")
public Double principalOverdue;
- @Schema(example = "240000")
- public Long interestCharged;
- @Schema(example = "0")
- public Long interestPaid;
- @Schema(example = "0")
- public Long interestWaived;
- @Schema(example = "0")
- public Long interestWrittenOff;
- @Schema(example = "240000")
- public Long interestOutstanding;
- @Schema(example = "200000")
- public Long interestOverdue;
- @Schema(example = "18000")
- public Long feeChargesCharged;
- @Schema(example = "0")
- public Long feeChargesDueAtDisbursementCharged;
- @Schema(example = "0")
- public Long feeChargesPaid;
- @Schema(example = "0")
- public Long feeChargesWaived;
- @Schema(example = "0")
- public Long feeChargesWrittenOff;
- @Schema(example = "18000")
- public Long feeChargesOutstanding;
- @Schema(example = "15000")
- public Long feeChargesOverdue;
- @Schema(example = "0")
- public Long penaltyChargesCharged;
- @Schema(example = "0")
- public Long penaltyChargesPaid;
- @Schema(example = "0")
- public Long penaltyChargesWaived;
- @Schema(example = "0")
- public Long penaltyChargesWrittenOff;
- @Schema(example = "0")
- public Long penaltyChargesOutstanding;
- @Schema(example = "0")
- public Long penaltyChargesOverdue;
- @Schema(example = "1258000")
- public Long totalExpectedRepayment;
- @Schema(example = "0")
- public Long totalRepayment;
- @Schema(example = "258000")
- public Long totalExpectedCostOfLoan;
- @Schema(example = "0")
- public Long totalCostOfLoan;
- @Schema(example = "0")
- public Long totalWaived;
- @Schema(example = "0")
- public Long totalWrittenOff;
- @Schema(example = "1258000")
- public Long totalOutstanding;
- @Schema(example = "1048333.3")
+ @Schema(example = "240000.000000")
+ public Double interestCharged;
+ @Schema(example = "0.000000")
+ public Double interestPaid;
+ @Schema(example = "0.000000")
+ public Double interestWaived;
+ @Schema(example = "0.000000")
+ public Double interestWrittenOff;
+ @Schema(example = "240000.000000")
+ public Double interestOutstanding;
+ @Schema(example = "200000.000000")
+ public Double interestOverdue;
+ @Schema(example = "18000.000000")
+ public Double feeChargesCharged;
+ @Schema(example = "0.000000")
+ public Double feeChargesDueAtDisbursementCharged;
+ @Schema(example = "0.000000")
+ public Double feeChargesPaid;
+ @Schema(example = "0.000000")
+ public Double feeChargesWaived;
+ @Schema(example = "0.000000")
+ public Double feeChargesWrittenOff;
+ @Schema(example = "18000.000000")
+ public Double feeChargesOutstanding;
+ @Schema(example = "15000.000000")
+ public Double feeChargesOverdue;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesCharged;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesPaid;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesWaived;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesWrittenOff;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesOutstanding;
+ @Schema(example = "0.000000")
+ public Double penaltyChargesOverdue;
+ @Schema(example = "1258000.000000")
+ public Double totalExpectedRepayment;
+ @Schema(example = "0.000000")
+ public Double totalRepayment;
+ @Schema(example = "258000.000000")
+ public Double totalExpectedCostOfLoan;
+ @Schema(example = "0.000000")
+ public Double totalCostOfLoan;
+ @Schema(example = "0.000000")
+ public Double totalWaived;
+ @Schema(example = "0.000000")
+ public Double totalWrittenOff;
+ @Schema(example = "1258000.000000")
+ public Double totalOutstanding;
+ @Schema(example = "1048333.30000")
public Double totalOverdue;
@Schema(example = "[2012, 5, 10]")
public LocalDate overdueSinceDate;
public GetLoansLoanIdLinkedAccount linkedAccount;
public Set<GetLoansLoanIdDisbursementDetails> disbursementDetails;
@Schema(example = "1100.000000")
- public Float fixedEmiAmount;
- @Schema(example = "35000")
- public Long maxOutstandingLoanBalance;
+ public Double fixedEmiAmount;
+ @Schema(example = "35000.000000")
+ public Double maxOutstandingLoanBalance;
@Schema(example = "false")
public Boolean canDisburse;
public Set<GetLoansLoanIdEmiVariations> emiAmountVariations;
diff --git
a/fineract-provider/src/test/java/org/apache/fineract/batch/command/CommandStrategyProviderTest.java
b/fineract-provider/src/test/java/org/apache/fineract/batch/command/CommandStrategyProviderTest.java
index 22e8811d8..acf818ce3 100644
---
a/fineract-provider/src/test/java/org/apache/fineract/batch/command/CommandStrategyProviderTest.java
+++
b/fineract-provider/src/test/java/org/apache/fineract/batch/command/CommandStrategyProviderTest.java
@@ -32,6 +32,7 @@ import
org.apache.fineract.batch.command.internal.ApproveLoanRescheduleCommandSt
import
org.apache.fineract.batch.command.internal.CollectChargesCommandStrategy;
import org.apache.fineract.batch.command.internal.CreateChargeCommandStrategy;
import org.apache.fineract.batch.command.internal.CreateClientCommandStrategy;
+import
org.apache.fineract.batch.command.internal.CreateLoanRescheduleRequestCommandStrategy;
import
org.apache.fineract.batch.command.internal.CreateTransactionLoanCommandStrategy;
import org.apache.fineract.batch.command.internal.DisburseLoanCommandStrategy;
import
org.apache.fineract.batch.command.internal.GetDatatableEntryByAppTableIdCommandStrategy;
@@ -77,6 +78,8 @@ public class CommandStrategyProviderTest {
mock(ApproveLoanCommandStrategy.class)),
Arguments.of("loans/123?command=disburse", HttpMethod.POST,
"disburseLoanCommandStrategy",
mock(DisburseLoanCommandStrategy.class)),
+ Arguments.of("rescheduleloans", HttpMethod.POST,
"createLoanRescheduleRequestCommandStrategy",
+
mock(CreateLoanRescheduleRequestCommandStrategy.class)),
Arguments.of("rescheduleloans/123?command=approve",
HttpMethod.POST, "approveLoanRescheduleCommandStrategy",
mock(ApproveLoanRescheduleCommandStrategy.class)),
Arguments.of("loans/123/transactions/123", HttpMethod.GET,
"getTransactionByIdCommandStrategy",
diff --git
a/fineract-provider/src/test/java/org/apache/fineract/batch/command/internal/CreateLoanRescheduleRequestCommandStrategyTest.java
b/fineract-provider/src/test/java/org/apache/fineract/batch/command/internal/CreateLoanRescheduleRequestCommandStrategyTest.java
new file mode 100644
index 000000000..0cdf40599
--- /dev/null
+++
b/fineract-provider/src/test/java/org/apache/fineract/batch/command/internal/CreateLoanRescheduleRequestCommandStrategyTest.java
@@ -0,0 +1,113 @@
+/**
+ * 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.batch.command.internal;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import javax.ws.rs.HttpMethod;
+import javax.ws.rs.core.UriInfo;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.fineract.batch.domain.BatchRequest;
+import org.apache.fineract.batch.domain.BatchResponse;
+import
org.apache.fineract.portfolio.loanaccount.rescheduleloan.api.RescheduleLoansApiResource;
+import org.apache.http.HttpStatus;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Test class fpr {@link CreateLoanRescheduleRequestCommandStrategy}.
+ */
+public class CreateLoanRescheduleRequestCommandStrategyTest {
+
+ /**
+ * Test {@link CreateLoanRescheduleRequestCommandStrategy#execute} happy
path scenario.
+ */
+ @Test
+ public void testExecuteSuccessScenario() {
+ final TestContext testContext = new TestContext();
+ final BatchRequest batchRequest = getBatchRequest();
+ final String responseBody = "myResponseBody";
+
+
when(testContext.rescheduleLoansApiResource.createLoanRescheduleRequest(batchRequest.getBody())).thenReturn(responseBody);
+
+ BatchResponse batchResponse =
testContext.subjectToTest.execute(batchRequest, testContext.uriInfo);
+
+ assertEquals(HttpStatus.SC_OK, batchResponse.getStatusCode());
+ assertSame(responseBody, batchResponse.getBody());
+ assertEquals(batchRequest.getRequestId(),
batchResponse.getRequestId());
+ assertEquals(batchRequest.getHeaders(), batchResponse.getHeaders());
+
+
verify(testContext.rescheduleLoansApiResource).createLoanRescheduleRequest(batchRequest.getBody());
+ }
+
+ /**
+ * Creates and returns a request with the given loan id and command value.
+ *
+ *
+ * @return BatchRequest
+ */
+ private BatchRequest getBatchRequest() {
+
+ final BatchRequest br = new BatchRequest();
+ String relativeUrl = "rescheduleloans";
+
+ br.setRequestId(Long.valueOf(RandomStringUtils.randomNumeric(5)));
+ br.setRelativeUrl(relativeUrl);
+ br.setMethod(HttpMethod.POST);
+ br.setReference(Long.valueOf(RandomStringUtils.randomNumeric(5)));
+ br.setBody("{}");
+
+ return br;
+ }
+
+ /**
+ * Private test context class used since testng runs in parallel to avoid
state between tests
+ */
+ private static class TestContext {
+
+ /**
+ * Mock URI info.
+ */
+ @Mock
+ private UriInfo uriInfo;
+
+ /**
+ * Mock reschedule loans API resource.
+ */
+ @Mock
+ private RescheduleLoansApiResource rescheduleLoansApiResource;
+
+ /**
+ * The {@link CreateLoanRescheduleRequestCommandStrategy} under test.
+ */
+ private final CreateLoanRescheduleRequestCommandStrategy subjectToTest;
+
+ /**
+ * Constructor.
+ */
+ TestContext() {
+ MockitoAnnotations.openMocks(this);
+ subjectToTest = new
CreateLoanRescheduleRequestCommandStrategy(rescheduleLoansApiResource);
+ }
+ }
+}
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java
index 49bded81a..0123dd4be 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java
@@ -27,8 +27,11 @@ import io.restassured.builder.ResponseSpecBuilder;
import io.restassured.http.ContentType;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
+import java.time.LocalDate;
+import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
import
org.apache.fineract.batch.command.internal.CreateTransactionLoanCommandStrategy;
import org.apache.fineract.batch.domain.BatchRequest;
@@ -41,12 +44,15 @@ import org.apache.fineract.integrationtests.common.Utils;
import
org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper;
import
org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
+import org.apache.fineract.integrationtests.common.system.CodeHelper;
import org.apache.fineract.integrationtests.common.system.DatatableHelper;
import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
import org.apache.http.HttpStatus;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Test class for {@link
org.apache.fineract.batch.command.CommandStrategyProvider}. This tests the
response provided by
@@ -59,6 +65,8 @@ import org.junit.jupiter.api.Test;
*/
public class BatchApiTest {
+ private static final Logger LOG =
LoggerFactory.getLogger(BatchApiTest.class);
+
/**
* The response specification
*/
@@ -718,6 +726,81 @@ public class BatchApiTest {
Assertions.assertEquals(HttpStatus.SC_OK,
responses.get(3).getStatusCode(), "Verify Status Code 200 for Get Transaction
By Id");
}
+ /**
+ * Test for the successful new loan reschedule request and approval for
the same. A '200' status code is expected on
+ * successful responses.
+ *
+ * @see
org.apache.fineract.batch.command.internal.CreateLoanRescheduleRequestCommandStrategy
+ * @see
org.apache.fineract.batch.command.internal.ApproveLoanRescheduleCommandStrategy
+ */
+ @Test
+ public void
shouldReturnOkStatusOnSuccessfulDisbursementAndRescheduleLoan() {
+ final String loanProductJSON = new LoanProductTestBuilder() //
+ .withPrincipal("10000000.00") //
+ .withNumberOfRepayments("24") //
+ .withRepaymentAfterEvery("1") //
+ .withRepaymentTypeAsMonth() //
+ .withinterestRatePerPeriod("2") //
+ .withInterestRateFrequencyTypeAsMonths() //
+ .withAmortizationTypeAsEqualPrincipalPayment() //
+ .withInterestTypeAsDecliningBalance() //
+ .currencyDetails("0", "100").build(null);
+
+ final Long createActiveClientRequestId = 8462L;
+ final Long applyLoanRequestId = createActiveClientRequestId + 1;
+ final Long approveLoanRequestId = applyLoanRequestId + 1;
+ final Long disburseLoanRequestId = approveLoanRequestId + 1;
+ final Long rescheduleLoanRequestId = disburseLoanRequestId + 1;
+ final Long approveRescheduleLoanRequestId = rescheduleLoanRequestId +
1;
+
+ // Create product
+ LOG.info("LoanProduct {}", loanProductJSON);
+ final Integer productId = new LoanTransactionHelper(this.requestSpec,
this.responseSpec).getLoanProductId(loanProductJSON);
+
+ // Create client
+ final Integer clientId = ClientHelper.createClient(this.requestSpec,
this.responseSpec);
+ ClientHelper.verifyClientCreatedOnServer(this.requestSpec,
this.responseSpec, clientId);
+
+ /* Retrieve/Create Code Values for the Code "LoanRescheduleReason =
23" */
+ final HashMap<String, Object> codeValue =
CodeHelper.retrieveOrCreateCodeValue(23, this.requestSpec, this.responseSpec);
+
+ final Integer codeValueId = (Integer) codeValue.get("id");
+
+ // Create an ApplyLoan request
+ final BatchRequest applyLoanRequestWithClientId =
BatchHelper.applyLoanRequestWithClientId(applyLoanRequestId, clientId,
productId);
+
+ // Create an approveLoan request
+ final BatchRequest approveLoanRequest =
BatchHelper.approveLoanRequest(approveLoanRequestId, applyLoanRequestId);
+
+ // Create a disbursement request
+ final LocalDate disburseLoanDate =
LocalDate.now(ZoneId.systemDefault()).minusDays(1);
+ final BatchRequest disburseLoanRequest =
BatchHelper.disburseLoanRequest(disburseLoanRequestId, approveLoanRequestId,
+ disburseLoanDate);
+
+ // Create a reschedule loan request
+ final BatchRequest rescheduleLoanRequest =
BatchHelper.createRescheduleLoanRequest(rescheduleLoanRequestId,
disburseLoanRequestId,
+ disburseLoanDate.plusMonths(1), codeValueId);
+
+ // Approve reschedule loan request
+ final BatchRequest approveRescheduleLoanRequest =
BatchHelper.approveRescheduleLoanRequest(approveRescheduleLoanRequestId,
+ rescheduleLoanRequestId);
+
+ final List<BatchRequest> batchRequests =
Arrays.asList(applyLoanRequestWithClientId, approveLoanRequest,
disburseLoanRequest,
+ rescheduleLoanRequest, approveRescheduleLoanRequest);
+
+
LOG.info("shouldReturnOkStatusOnSuccessfulDisbursementAndRescheduleLoan Request
- {}", BatchHelper.toJsonString(batchRequests));
+ final List<BatchResponse> responses =
BatchHelper.postBatchRequestsWithoutEnclosingTransaction(this.requestSpec,
this.responseSpec,
+ BatchHelper.toJsonString(batchRequests));
+
+ Assertions.assertEquals(HttpStatus.SC_OK,
responses.get(0).getStatusCode(), "Verify Status Code 200 for Apply Loan");
+ Assertions.assertEquals(HttpStatus.SC_OK,
responses.get(1).getStatusCode(), "Verify Status Code 200 for Approve Loan");
+ Assertions.assertEquals(HttpStatus.SC_OK,
responses.get(2).getStatusCode(), "Verify Status Code 200 for Disburse Loan");
+ Assertions.assertEquals(HttpStatus.SC_OK,
responses.get(3).getStatusCode(),
+ "Verify Status Code 200 for Create Reschedule Loan request");
+ Assertions.assertEquals(HttpStatus.SC_OK,
responses.get(4).getStatusCode(),
+ "Verify Status Code 200 for Approve Reschedule Loan request");
+ }
+
/**
* Test for the successful create client, creat, approve and get loan. A
'200' status code is expected on successful
* responses.
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/BatchHelper.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/BatchHelper.java
index ff45e9974..3284f2785 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/BatchHelper.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/BatchHelper.java
@@ -98,6 +98,7 @@ public final class BatchHelper {
public static List<BatchResponse>
postBatchRequestsWithoutEnclosingTransaction(final RequestSpecification
requestSpec,
final ResponseSpecification responseSpec, final String
jsonifiedBatchRequests) {
final String response = Utils.performServerPost(requestSpec,
responseSpec, BATCH_API_URL, jsonifiedBatchRequests, null);
+ LOG.info("BatchHelper Response {}", response);
return BatchHelper.fromJsonString(response);
}
@@ -501,8 +502,6 @@ public final class BatchHelper {
* the reference ID
* @param amount
* the amount
- * @param date
- * the transaction date
* @return BatchRequest the batch request
*/
public static BatchRequest repayLoanRequest(final Long requestId, final
Long reference, final String amount) {
@@ -578,6 +577,69 @@ public final class BatchHelper {
return br;
}
+ /**
+ * Creates and returns a
+ * {@link
org.apache.fineract.batch.command.internal.CreateLoanRescheduleRequestCommandStrategy}
request with given
+ * request ID.
+ *
+ *
+ * @param requestId
+ * the request ID
+ * @param reference
+ * teh reference
+ * @param rescheduleFromDate
+ * the reschedule from date
+ * @param rescheduleReasonId
+ * the reschedule reason code value id
+ *
+ * @return BatchRequest the created {@link BatchRequest}
+ */
+ public static BatchRequest createRescheduleLoanRequest(final Long
requestId, final Long reference, final LocalDate rescheduleFromDate,
+ final Integer rescheduleReasonId) {
+ final BatchRequest br = new BatchRequest();
+
+ br.setRequestId(requestId);
+ br.setReference(reference);
+ br.setRelativeUrl("rescheduleloans");
+ br.setMethod("POST");
+ final LocalDate today = LocalDate.now(ZoneId.systemDefault());
+ final LocalDate adjustedDueDate =
LocalDate.now(ZoneId.systemDefault()).plusDays(40);
+ final String submittedOnDate =
today.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
+ final String rescheduleFromDateString =
rescheduleFromDate.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
+ final String adjustedDueDateString =
adjustedDueDate.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
+ br.setBody(String.format("{\"locale\": \"en\", \"dateFormat\": \"dd
MMMM yyyy\", "
+ + "\"submittedOnDate\": \"%s\", \"rescheduleFromDate\":
\"%s\", \"rescheduleReasonId\": %d, \"adjustedDueDate\": \"%s\", \"loanId\":
\"$.loanId\"}",
+ submittedOnDate, rescheduleFromDateString, rescheduleReasonId,
adjustedDueDateString));
+
+ return br;
+ }
+
+ /**
+ * Creates and returns a {@link
org.apache.fineract.batch.command.internal.ApproveLoanRescheduleCommandStrategy}
+ * request with given request ID.
+ *
+ *
+ * @param requestId
+ * the request ID
+ * @param reference
+ * teh reference
+ * @return BatchRequest the created {@link BatchRequest}
+ */
+ public static BatchRequest approveRescheduleLoanRequest(final Long
requestId, final Long reference) {
+ final BatchRequest br = new BatchRequest();
+
+ br.setRequestId(requestId);
+ br.setReference(reference);
+ br.setRelativeUrl("rescheduleloans/$.resourceId?command=approve");
+ br.setMethod("POST");
+ final LocalDate approvedOnDate = LocalDate.now(ZoneId.systemDefault());
+ final String approvedOnDateString =
approvedOnDate.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
+ br.setBody(String.format("{\"locale\": \"en\", \"dateFormat\": \"dd
MMMM yyyy\", " + "\"approvedOnDate\": \"%s\"}",
+ approvedOnDateString));
+
+ return br;
+ }
+
/**
* Checks that the client with given externalId is not created on the
server.
*
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java
index 63d2bf5d3..3318787e5 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java
@@ -207,8 +207,9 @@ public class ClientHelper {
map.put("locale", "en");
map.put("active", "true");
map.put("activationDate", dateOfJoining);
- log.info("map : {}", map);
- return GSON.toJson(map);
+ final String testClientAsJson = GSON.toJson(map);
+ log.info("TestClient Request : {}", testClientAsJson);
+ return testClientAsJson;
}
public static String getTestClientAsJSONPending(final String
submittedOnDate, final String officeId) {