FINERACT-2181: fix api double values in loan definitions

This commit is contained in:
mark.vituska
2025-05-27 10:02:25 +02:00
committed by Adam Saghy
parent a40c0d4703
commit c89ec910d8
65 changed files with 1669 additions and 3133 deletions
@@ -43,8 +43,8 @@ public class AcmeNoteWritePlatformService implements NoteWritePlatformService, I
} }
@Override @Override
public void createLoanTransactionNote(Long loanTransactionId, String note) { public void createLoanNote(Long loanId, String note) {
throw new UnsupportedOperationException("createLoanTransactionNote() is not yet implemented."); throw new UnsupportedOperationException("createLoanNote() is not yet implemented.");
} }
@Override @Override
@@ -310,12 +310,6 @@ public final class DateUtils {
return isBeforeBusinessDate(localDate); return isBeforeBusinessDate(localDate);
} }
public static boolean isDateInRangeFromInclusiveToExclusive(final LocalDate fromInclusive, final LocalDate upToNotInclusive,
final LocalDate target) {
return (DateUtils.isEqual(target, fromInclusive) || DateUtils.isAfter(target, fromInclusive))
&& DateUtils.isBefore(target, upToNotInclusive);
}
public static int compare(LocalDate first, LocalDate second) { public static int compare(LocalDate first, LocalDate second) {
return compare(first, second, true); return compare(first, second, true);
} }
@@ -26,7 +26,7 @@ public interface NoteWritePlatformService {
CommandProcessingResult createNote(JsonCommand command); CommandProcessingResult createNote(JsonCommand command);
void createLoanTransactionNote(Long loanTransactionId, String note); void createLoanNote(Long loanId, String note);
CommandProcessingResult updateNote(JsonCommand command); CommandProcessingResult updateNote(JsonCommand command);
@@ -420,8 +420,8 @@ public class EventCheckHelper {
.getGlobalConfiguration("outstanding-interest-calculation-strategy-for-external-asset-transfer"); .getGlobalConfiguration("outstanding-interest-calculation-strategy-for-external-asset-transfer");
if ("PAYABLE_OUTSTANDING_INTEREST".equals(outstandingInterestStrategy.getStringValue())) { if ("PAYABLE_OUTSTANDING_INTEREST".equals(outstandingInterestStrategy.getStringValue())) {
Response<GetLoansLoanIdResponse> loanDetails = loansApi.retrieveLoan(loanId, false, "all", null, null).execute(); Response<GetLoansLoanIdResponse> loanDetails = loansApi.retrieveLoan(loanId, false, "all", null, null).execute();
totalOutstandingBalanceAmountExpected = loanDetails.body().getSummary().getTotalOutstanding(); totalOutstandingBalanceAmountExpected = zeroConversion(loanDetails.body().getSummary().getTotalOutstanding());
outstandingInterestPortionExpected = loanDetails.body().getSummary().getInterestOutstanding(); outstandingInterestPortionExpected = zeroConversion(loanDetails.body().getSummary().getInterestOutstanding());
} }
String ownerExternalIdExpected = filtered.getStatus().getValue().equals("BUYBACK") ? null : filtered.getOwner().getExternalId(); String ownerExternalIdExpected = filtered.getStatus().getValue().equals("BUYBACK") ? null : filtered.getOwner().getExternalId();
@@ -59,6 +59,7 @@ import org.apache.fineract.test.data.LoanStatus;
import org.apache.fineract.test.helper.ErrorHelper; import org.apache.fineract.test.helper.ErrorHelper;
import org.apache.fineract.test.helper.ErrorMessageHelper; import org.apache.fineract.test.helper.ErrorMessageHelper;
import org.apache.fineract.test.helper.ErrorResponse; import org.apache.fineract.test.helper.ErrorResponse;
import org.apache.fineract.test.helper.Utils;
import org.apache.fineract.test.messaging.EventAssertion; import org.apache.fineract.test.messaging.EventAssertion;
import org.apache.fineract.test.messaging.event.EventCheckHelper; import org.apache.fineract.test.messaging.event.EventCheckHelper;
import org.apache.fineract.test.messaging.event.loan.delinquency.LoanDelinquencyRangeChangeEvent; import org.apache.fineract.test.messaging.event.loan.delinquency.LoanDelinquencyRangeChangeEvent;
@@ -538,7 +539,9 @@ public class LoanDelinquencyStepDef extends AbstractStepDef {
String actualDelinquencyRangeValue = loanDetails.body().getDelinquencyRange() == null ? "NO_DELINQUENCY" String actualDelinquencyRangeValue = loanDetails.body().getDelinquencyRange() == null ? "NO_DELINQUENCY"
: loanDetails.body().getDelinquencyRange().getClassification(); : loanDetails.body().getDelinquencyRange().getClassification();
GetLoansLoanIdDelinquencySummary delinquent = loanDetails.body().getDelinquent(); GetLoansLoanIdDelinquencySummary delinquent = loanDetails.body().getDelinquent();
List<String> actualValuesList = List.of(actualDelinquencyRangeValue, delinquent.getDelinquentAmount().toString(), String delinquentAmount = delinquent.getDelinquentAmount() == null ? null
: new Utils.DoubleFormatter(delinquent.getDelinquentAmount().doubleValue()).format();
List<String> actualValuesList = List.of(actualDelinquencyRangeValue, delinquentAmount,
delinquent.getDelinquentDate() == null ? "null" : FORMATTER.format(delinquent.getDelinquentDate()), delinquent.getDelinquentDate() == null ? "null" : FORMATTER.format(delinquent.getDelinquentDate()),
delinquent.getDelinquentDays().toString(), delinquent.getPastDueDays().toString()); delinquent.getDelinquentDays().toString(), delinquent.getPastDueDays().toString());
@@ -1121,9 +1121,11 @@ public class LoanStepDef extends AbstractStepDef {
ErrorHelper.checkSuccessfulApiCall(loanDetailsResponse); ErrorHelper.checkSuccessfulApiCall(loanDetailsResponse);
GetLoansLoanIdDelinquencySummary delinquent = loanDetailsResponse.body().getDelinquent(); GetLoansLoanIdDelinquencySummary delinquent = loanDetailsResponse.body().getDelinquent();
String lastPaymentAmountActual = new Utils.DoubleFormatter(delinquent.getLastPaymentAmount().doubleValue()).format(); String lastPaymentAmountActual = delinquent.getLastPaymentAmount() == null ? null
: new Utils.DoubleFormatter(delinquent.getLastPaymentAmount().doubleValue()).format();
String lastPaymentDateActual = FORMATTER.format(delinquent.getLastPaymentDate()); String lastPaymentDateActual = FORMATTER.format(delinquent.getLastPaymentDate());
String lastRepaymentAmountActual = new Utils.DoubleFormatter(delinquent.getLastRepaymentAmount().doubleValue()).format(); String lastRepaymentAmountActual = delinquent.getLastRepaymentAmount() == null ? null
: new Utils.DoubleFormatter(delinquent.getLastRepaymentAmount().doubleValue()).format();
String lastRepaymentDateActual = FORMATTER.format(delinquent.getLastRepaymentDate()); String lastRepaymentDateActual = FORMATTER.format(delinquent.getLastRepaymentDate());
assertThat(lastPaymentAmountActual) assertThat(lastPaymentAmountActual)
@@ -1163,7 +1165,8 @@ public class LoanStepDef extends AbstractStepDef {
String amountEventActual = loanChargePaidByListEvent.get(i).getAmount().setScale(1, RoundingMode.HALF_DOWN).toString(); String amountEventActual = loanChargePaidByListEvent.get(i).getAmount().setScale(1, RoundingMode.HALF_DOWN).toString();
String nameEventActual = loanChargePaidByListEvent.get(i).getName(); String nameEventActual = loanChargePaidByListEvent.get(i).getName();
String amountActual = String.valueOf(loanChargePaidByList.get(i).getAmount()); String amountActual = loanChargePaidByList.get(i).getAmount() == null ? null
: new Utils.DoubleFormatter(loanChargePaidByList.get(i).getAmount().doubleValue()).format();
String nameActual = loanChargePaidByList.get(i).getName(); String nameActual = loanChargePaidByList.get(i).getName();
String amountExpected = data.get(i + 1).get(0); String amountExpected = data.get(i + 1).get(0);
@@ -2682,9 +2685,11 @@ public class LoanStepDef extends AbstractStepDef {
ErrorHelper.checkSuccessfulApiCall(loanDetailsResponse); ErrorHelper.checkSuccessfulApiCall(loanDetailsResponse);
GetLoansLoanIdDelinquencySummary delinquent = loanDetailsResponse.body().getDelinquent(); GetLoansLoanIdDelinquencySummary delinquent = loanDetailsResponse.body().getDelinquent();
String lastPaymentAmountActual = new Utils.DoubleFormatter(delinquent.getLastPaymentAmount().doubleValue()).format(); String lastPaymentAmountActual = delinquent.getLastPaymentAmount() == null ? null
: new Utils.DoubleFormatter(delinquent.getLastPaymentAmount().doubleValue()).format();
String lastPaymentDateActual = FORMATTER.format(delinquent.getLastPaymentDate()); String lastPaymentDateActual = FORMATTER.format(delinquent.getLastPaymentDate());
String lastRepaymentAmountActual = new Utils.DoubleFormatter(delinquent.getLastRepaymentAmount().doubleValue()).format(); String lastRepaymentAmountActual = delinquent.getLastRepaymentAmount() == null ? null
: new Utils.DoubleFormatter(delinquent.getLastRepaymentAmount().doubleValue()).format();
String lastRepaymentDateActual = FORMATTER.format(delinquent.getLastRepaymentDate()); String lastRepaymentDateActual = FORMATTER.format(delinquent.getLastRepaymentDate());
assertThat(lastPaymentAmountActual) assertThat(lastPaymentAmountActual)
@@ -3857,8 +3862,8 @@ public class LoanStepDef extends AbstractStepDef {
actualValues.add(emiVariation.getTermType().getValue() == null ? null : emiVariation.getTermType().getValue()); actualValues.add(emiVariation.getTermType().getValue() == null ? null : emiVariation.getTermType().getValue());
case "Applicable From" -> actualValues.add(emiVariation.getTermVariationApplicableFrom() == null ? null case "Applicable From" -> actualValues.add(emiVariation.getTermVariationApplicableFrom() == null ? null
: FORMATTER.format(emiVariation.getTermVariationApplicableFrom())); : FORMATTER.format(emiVariation.getTermVariationApplicableFrom()));
case "Decimal Value" -> case "Decimal Value" -> actualValues.add(emiVariation.getDecimalValue() == null ? null
actualValues.add(emiVariation.getDecimalValue() == null ? null : new Utils.DoubleFormatter(emiVariation.getDecimalValue().doubleValue()).format()); : new Utils.DoubleFormatter(emiVariation.getDecimalValue().doubleValue()).format());
case "Date Value" -> case "Date Value" ->
actualValues.add(emiVariation.getDateValue() == null ? null : FORMATTER.format(emiVariation.getDateValue())); actualValues.add(emiVariation.getDateValue() == null ? null : FORMATTER.format(emiVariation.getDateValue()));
case "Is Specific To Installment" -> actualValues.add(String.valueOf(emiVariation.getIsSpecificToInstallment())); case "Is Specific To Installment" -> actualValues.add(String.valueOf(emiVariation.getIsSpecificToInstallment()));
File diff suppressed because it is too large Load Diff
@@ -30,7 +30,7 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanSchedul
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
@Getter @Getter
public final class DisbursementData implements LoanPrincipalRelatedDataHolder, Comparable<DisbursementData> { public final class DisbursementData implements Comparable<DisbursementData> {
private final Long id; private final Long id;
private final LocalDate expectedDisbursementDate; private final LocalDate expectedDisbursementDate;
@@ -102,7 +102,8 @@ public final class DisbursementData implements LoanPrincipalRelatedDataHolder, C
private boolean occursOnDayFromAndIncludingAndUpTo(final LocalDate fromInclusive, final LocalDate upToNotInclusive, private boolean occursOnDayFromAndIncludingAndUpTo(final LocalDate fromInclusive, final LocalDate upToNotInclusive,
final LocalDate target) { final LocalDate target) {
return DateUtils.isDateInRangeFromInclusiveToExclusive(fromInclusive, upToNotInclusive, target); return (DateUtils.isEqual(target, fromInclusive) || DateUtils.isAfter(target, fromInclusive))
&& DateUtils.isBefore(target, upToNotInclusive);
} }
public BigDecimal getWaivedChargeAmount() { public BigDecimal getWaivedChargeAmount() {
@@ -34,8 +34,6 @@ import org.apache.fineract.organisation.monetary.data.CurrencyData;
public class LoanSummaryData { public class LoanSummaryData {
private final CurrencyData currency; private final CurrencyData currency;
private final BigDecimal totalPrincipal;
private final BigDecimal totalPrincipalFromCapitalizedIncome;
private final BigDecimal principalDisbursed; private final BigDecimal principalDisbursed;
private final BigDecimal principalAdjustments; private final BigDecimal principalAdjustments;
private final BigDecimal principalPaid; private final BigDecimal principalPaid;
@@ -38,12 +38,6 @@ import org.apache.fineract.organisation.monetary.domain.Money;
public class LoanSummary { public class LoanSummary {
// derived totals fields // derived totals fields
@Column(name = "total_principal_derived", scale = 6, precision = 19)
private BigDecimal totalPrincipal;
@Column(name = "capitalized_income_derived", scale = 6, precision = 19)
private BigDecimal totalPrincipalFromCapitalizedIncome;
@Column(name = "principal_disbursed_derived", scale = 6, precision = 19) @Column(name = "principal_disbursed_derived", scale = 6, precision = 19)
private BigDecimal totalPrincipalDisbursed; private BigDecimal totalPrincipalDisbursed;
@@ -172,8 +166,6 @@ public class LoanSummary {
this.totalPenaltyChargesWaived = BigDecimal.ZERO; this.totalPenaltyChargesWaived = BigDecimal.ZERO;
this.totalPenaltyChargesWrittenOff = BigDecimal.ZERO; this.totalPenaltyChargesWrittenOff = BigDecimal.ZERO;
this.totalPrincipalAdjustments = BigDecimal.ZERO; this.totalPrincipalAdjustments = BigDecimal.ZERO;
this.totalPrincipal = BigDecimal.ZERO;
this.totalPrincipalFromCapitalizedIncome = BigDecimal.ZERO;
this.totalPrincipalDisbursed = BigDecimal.ZERO; this.totalPrincipalDisbursed = BigDecimal.ZERO;
this.totalPrincipalOutstanding = BigDecimal.ZERO; this.totalPrincipalOutstanding = BigDecimal.ZERO;
this.totalPrincipalRepaid = BigDecimal.ZERO; this.totalPrincipalRepaid = BigDecimal.ZERO;
@@ -184,22 +176,17 @@ public class LoanSummary {
} }
public void updateSummary(final MonetaryCurrency currency, final Money principal, public void updateSummary(final MonetaryCurrency currency, final Money principal,
final List<LoanRepaymentScheduleInstallment> repaymentScheduleInstallments, Set<LoanCharge> charges, final List<LoanRepaymentScheduleInstallment> repaymentScheduleInstallments, Set<LoanCharge> charges) {
List<LoanTransaction> capitalizedIncomeTransactions) {
final BigDecimal principalFromCapitalizedIncome = capitalizedIncomeTransactions.stream().filter(LoanTransaction::isNotReversed)
.map(LoanTransaction::getPrincipalPortion).reduce(BigDecimal.ZERO, BigDecimal::add);
this.totalPrincipalDisbursed = principal.getAmount(); this.totalPrincipalDisbursed = principal.getAmount();
this.totalPrincipalFromCapitalizedIncome = principalFromCapitalizedIncome;
this.totalPrincipal = principal.plus(principalFromCapitalizedIncome).getAmount();
this.totalPrincipalAdjustments = calculateTotalPrincipalAdjusted(repaymentScheduleInstallments, currency).getAmount(); this.totalPrincipalAdjustments = calculateTotalPrincipalAdjusted(repaymentScheduleInstallments, currency).getAmount();
this.totalFeeAdjustments = calculateTotalFeeAdjusted(repaymentScheduleInstallments, currency).getAmount(); this.totalFeeAdjustments = calculateTotalFeeAdjusted(repaymentScheduleInstallments, currency).getAmount();
this.totalPenaltyAdjustments = calculateTotalPenaltyAdjusted(repaymentScheduleInstallments, currency).getAmount(); this.totalPenaltyAdjustments = calculateTotalPenaltyAdjusted(repaymentScheduleInstallments, currency).getAmount();
this.totalPrincipalRepaid = calculateTotalPrincipalRepaid(repaymentScheduleInstallments, currency).getAmount(); this.totalPrincipalRepaid = calculateTotalPrincipalRepaid(repaymentScheduleInstallments, currency).getAmount();
this.totalPrincipalWrittenOff = calculateTotalPrincipalWrittenOff(repaymentScheduleInstallments, currency).getAmount(); this.totalPrincipalWrittenOff = calculateTotalPrincipalWrittenOff(repaymentScheduleInstallments, currency).getAmount();
this.totalPrincipalOutstanding = principal.plus(principalFromCapitalizedIncome).plus(this.totalPrincipalAdjustments) this.totalPrincipalOutstanding = principal.plus(this.totalPrincipalAdjustments).minus(this.totalPrincipalRepaid)
.minus(this.totalPrincipalRepaid).minus(this.totalPrincipalWrittenOff).getAmount(); .minus(this.totalPrincipalWrittenOff).getAmount();
final Money totalInterestCharged = calculateTotalInterestCharged(repaymentScheduleInstallments, currency); final Money totalInterestCharged = calculateTotalInterestCharged(repaymentScheduleInstallments, currency);
this.totalInterestCharged = totalInterestCharged.getAmount(); this.totalInterestCharged = totalInterestCharged.getAmount();
@@ -238,7 +225,7 @@ public class LoanSummary {
this.totalPenaltyChargesOutstanding = totalPenaltyChargesCharged.minus(this.totalPenaltyChargesRepaid) this.totalPenaltyChargesOutstanding = totalPenaltyChargesCharged.minus(this.totalPenaltyChargesRepaid)
.minus(this.totalPenaltyChargesWaived).minus(this.totalPenaltyChargesWrittenOff).getAmount(); .minus(this.totalPenaltyChargesWaived).minus(this.totalPenaltyChargesWrittenOff).getAmount();
final Money totalExpectedRepayment = Money.of(currency, this.totalPrincipal).plus(this.totalInterestCharged) final Money totalExpectedRepayment = Money.of(currency, this.totalPrincipalDisbursed).plus(this.totalInterestCharged)
.plus(this.totalFeeChargesCharged).plus(this.totalPenaltyChargesCharged); .plus(this.totalFeeChargesCharged).plus(this.totalPenaltyChargesCharged);
this.totalExpectedRepayment = totalExpectedRepayment.getAmount(); this.totalExpectedRepayment = totalExpectedRepayment.getAmount();
@@ -1,53 +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.loanaccount.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import org.apache.fineract.portfolio.loanaccount.data.LoanPrincipalRelatedDataHolder;
/**
* Immutable data object representing a subset of loan transaction data.
*/
@Getter
@EqualsAndHashCode
public class LoanTransactionRepaymentPeriodData implements LoanPrincipalRelatedDataHolder, Serializable {
private final Long transactionId;
private final Long loanId;
private final LocalDate date;
private final boolean reversed;
private final BigDecimal amount;
private final BigDecimal unrecognizedAmount;
private final BigDecimal feeChargesPortion;
public LoanTransactionRepaymentPeriodData(Long transactionId, Long loanId, LocalDate date, boolean reversed, BigDecimal amount,
BigDecimal unrecognizedAmount, BigDecimal feeChargesPortion) {
this.transactionId = transactionId;
this.loanId = loanId;
this.date = date;
this.reversed = reversed;
this.amount = amount;
this.unrecognizedAmount = unrecognizedAmount;
this.feeChargesPortion = feeChargesPortion;
}
}
@@ -104,10 +104,7 @@ public final class LoanRefundValidator {
if (loan.getLoanProduct().isMultiDisburseLoan() && adjustedTransaction == null) { if (loan.getLoanProduct().isMultiDisburseLoan() && adjustedTransaction == null) {
final BigDecimal totalDisbursed = loan.getDisbursedAmount(); final BigDecimal totalDisbursed = loan.getDisbursedAmount();
final BigDecimal totalPrincipalAdjusted = loan.getSummary().getTotalPrincipalAdjustments(); final BigDecimal totalPrincipalAdjusted = loan.getSummary().getTotalPrincipalAdjustments();
final BigDecimal totalPrincipalFromCapitalizedIncome = loan.getLoanTransactions(LoanTransaction::isCapitalizedIncome).stream() final BigDecimal totalPrincipalCredited = totalDisbursed.add(totalPrincipalAdjusted);
.filter(LoanTransaction::isNotReversed).map(LoanTransaction::getPrincipalPortion)
.reduce(BigDecimal.ZERO, BigDecimal::add);
final BigDecimal totalPrincipalCredited = totalDisbursed.add(totalPrincipalAdjusted).add(totalPrincipalFromCapitalizedIncome);
if (totalPrincipalCredited.compareTo(loan.getSummary().getTotalPrincipalRepaid()) < 0) { if (totalPrincipalCredited.compareTo(loan.getSummary().getTotalPrincipalRepaid()) < 0) {
final String errorMessage = "The transaction amount cannot exceed threshold."; final String errorMessage = "The transaction amount cannot exceed threshold.";
throw new InvalidLoanStateTransitionException("transaction", "amount.exceeds.threshold", errorMessage); throw new InvalidLoanStateTransitionException("transaction", "amount.exceeds.threshold", errorMessage);
@@ -97,8 +97,7 @@ public class LoanBalanceService {
loan.setTotalRecovered(recoveredAmount.getAmountDefaultedToNullIfZero()); loan.setTotalRecovered(recoveredAmount.getAmountDefaultedToNullIfZero());
final Money principal = loan.getLoanRepaymentScheduleDetail().getPrincipal(); final Money principal = loan.getLoanRepaymentScheduleDetail().getPrincipal();
List<LoanTransaction> capitalizedIncomeTransactions = loan.getLoanTransactions(LoanTransaction::isCapitalizedIncome); loan.getSummary().updateSummary(loan.getCurrency(), principal, loan.getRepaymentScheduleInstallments(), loan.getLoanCharges());
loan.getSummary().updateSummary(loan.getCurrency(), principal, loan.getRepaymentScheduleInstallments(), loan.getLoanCharges(), capitalizedIncomeTransactions);
loan.updateLoanOutstandingBalances(); loan.updateLoanOutstandingBalances();
} }
} }
@@ -173,10 +173,7 @@ public class LoanDownPaymentHandlerServiceImpl implements LoanDownPaymentHandler
if (loan.getLoanProduct().isMultiDisburseLoan()) { if (loan.getLoanProduct().isMultiDisburseLoan()) {
final BigDecimal totalDisbursed = loan.getDisbursedAmount(); final BigDecimal totalDisbursed = loan.getDisbursedAmount();
final BigDecimal totalPrincipalAdjusted = loan.getSummary().getTotalPrincipalAdjustments(); final BigDecimal totalPrincipalAdjusted = loan.getSummary().getTotalPrincipalAdjustments();
final BigDecimal totalPrincipalFromCapitalizedIncome = loan.getLoanTransactions(LoanTransaction::isCapitalizedIncome).stream() final BigDecimal totalPrincipalCredited = totalDisbursed.add(totalPrincipalAdjusted);
.filter(LoanTransaction::isNotReversed).map(LoanTransaction::getPrincipalPortion)
.reduce(BigDecimal.ZERO, BigDecimal::add);
final BigDecimal totalPrincipalCredited = totalDisbursed.add(totalPrincipalAdjusted).add(totalPrincipalFromCapitalizedIncome);
if (totalPrincipalCredited.compareTo(loan.getSummary().getTotalPrincipalRepaid()) < 0 if (totalPrincipalCredited.compareTo(loan.getSummary().getTotalPrincipalRepaid()) < 0
&& loan.repaymentScheduleDetail().getPrincipal().minus(totalDisbursed).isGreaterThanZero()) { && loan.repaymentScheduleDetail().getPrincipal().minus(totalDisbursed).isGreaterThanZero()) {
final String errorMessage = "The transaction amount cannot exceed threshold."; final String errorMessage = "The transaction amount cannot exceed threshold.";
@@ -37,7 +37,6 @@ import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData;
import org.apache.fineract.portfolio.loanaccount.data.PaidInAdvanceData; import org.apache.fineract.portfolio.loanaccount.data.PaidInAdvanceData;
import org.apache.fineract.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData; import org.apache.fineract.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepaymentPeriodData;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleData; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleData;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData;
@@ -51,8 +50,7 @@ public interface LoanReadPlatformService {
LoanAccountData fetchRepaymentScheduleData(LoanAccountData accountData); LoanAccountData fetchRepaymentScheduleData(LoanAccountData accountData);
LoanScheduleData retrieveRepaymentSchedule(Long loanId, RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData, LoanScheduleData retrieveRepaymentSchedule(Long loanId, RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData,
Collection<DisbursementData> disbursementData, Collection<LoanTransactionRepaymentPeriodData> capitalizedIncomeData, Collection<DisbursementData> disbursementData, boolean isInterestRecalculationEnabled, LoanScheduleType loanScheduleType);
boolean isInterestRecalculationEnabled, LoanScheduleType loanScheduleType);
Collection<LoanTransactionData> retrieveLoanTransactions(Long loanId); Collection<LoanTransactionData> retrieveLoanTransactions(Long loanId);
@@ -344,7 +344,6 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
case REAMORTIZE -> handleReAmortization(loanTransaction, ctx); case REAMORTIZE -> handleReAmortization(loanTransaction, ctx);
case REAGE -> handleReAge(loanTransaction, ctx); case REAGE -> handleReAge(loanTransaction, ctx);
case ACCRUAL_ACTIVITY -> calculateAccrualActivity(loanTransaction, ctx); case ACCRUAL_ACTIVITY -> calculateAccrualActivity(loanTransaction, ctx);
case CAPITALIZED_INCOME -> handleCapitalizedIncome(loanTransaction, ctx);
// TODO: Cover rest of the transaction types // TODO: Cover rest of the transaction types
default -> log.warn("Unhandled transaction processing for transaction type: {}", loanTransaction.getTypeOf()); default -> log.warn("Unhandled transaction processing for transaction type: {}", loanTransaction.getTypeOf());
} }
@@ -1200,7 +1199,18 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
emiCalculator.addDisbursement(model, transactionDate, amortizableAmount); emiCalculator.addDisbursement(model, transactionDate, amortizableAmount);
disbursementTransaction.resetDerivedComponents(); disbursementTransaction.resetDerivedComponents();
recalculateRepaymentPeriodsWithEMICalculation(amortizableAmount, model, installments, transactionDate, currency); if (amortizableAmount.isGreaterThanZero()) {
model.repaymentPeriods().forEach(rm -> {
LoanRepaymentScheduleInstallment installment = installments.stream().filter(
ri -> ri.getDueDate().equals(rm.getDueDate()) && !ri.isDownPayment() && !ri.getDueDate().isBefore(transactionDate))
.findFirst().orElse(null);
if (installment != null) {
installment.updatePrincipal(rm.getDuePrincipal().getAmount());
installment.updateInterestCharged(rm.getDueInterest().getAmount());
installment.updateObligationsMet(currency, transactionDate);
}
});
}
allocateOverpayment(disbursementTransaction, transactionCtx); allocateOverpayment(disbursementTransaction, transactionCtx);
} }
@@ -1212,6 +1222,7 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
List<LoanRepaymentScheduleInstallment> candidateRepaymentInstallments = installments.stream().filter( List<LoanRepaymentScheduleInstallment> candidateRepaymentInstallments = installments.stream().filter(
i -> i.getDueDate().isAfter(disbursementTransaction.getTransactionDate()) && !i.isDownPayment() && !i.isAdditional()) i -> i.getDueDate().isAfter(disbursementTransaction.getTransactionDate()) && !i.isDownPayment() && !i.isAdditional())
.toList(); .toList();
int noCandidateRepaymentInstallments = candidateRepaymentInstallments.size();
LoanProductRelatedDetail loanProductRelatedDetail = disbursementTransaction.getLoan().getLoanRepaymentScheduleDetail(); LoanProductRelatedDetail loanProductRelatedDetail = disbursementTransaction.getLoan().getLoanRepaymentScheduleDetail();
Integer installmentAmountInMultiplesOf = disbursementTransaction.getLoan().getLoanProduct().getInstallmentAmountInMultiplesOf(); Integer installmentAmountInMultiplesOf = disbursementTransaction.getLoan().getLoanProduct().getInstallmentAmountInMultiplesOf();
Money downPaymentAmount = Money.zero(currency); Money downPaymentAmount = Money.zero(currency);
@@ -1229,73 +1240,7 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
Money amortizableAmount = disbursementTransaction.getAmount(currency).minus(downPaymentAmount); Money amortizableAmount = disbursementTransaction.getAmount(currency).minus(downPaymentAmount);
recalculateRepaymentInstallmentsWithoutEMICalculation(disbursementTransaction, amortizableAmount, candidateRepaymentInstallments,
currency, installmentAmountInMultiplesOf);
allocateOverpayment(disbursementTransaction, transactionCtx);
}
private void handleCapitalizedIncome(LoanTransaction capitalizedIncomeTransaction, TransactionCtx transactionCtx) {
if (capitalizedIncomeTransaction.getLoan().isInterestBearing()) {
handleCapitalizedIncomeWithEMICalculator(capitalizedIncomeTransaction, transactionCtx);
} else {
handleCapitalizedIncomeWithoutEMICalculator(capitalizedIncomeTransaction, transactionCtx);
}
}
private void handleCapitalizedIncomeWithEMICalculator(LoanTransaction capitalizedIncomeTransaction, TransactionCtx transactionCtx) {
ProgressiveLoanInterestScheduleModel model;
if (!(transactionCtx instanceof ProgressiveTransactionCtx)
|| (model = ((ProgressiveTransactionCtx) transactionCtx).getModel()) == null) {
throw new IllegalStateException("TransactionCtx has no model");
}
List<LoanRepaymentScheduleInstallment> installments = transactionCtx.getInstallments();
LocalDate transactionDate = capitalizedIncomeTransaction.getTransactionDate();
MonetaryCurrency currency = transactionCtx.getCurrency();
Money amortizableAmount = capitalizedIncomeTransaction.getAmount(currency);
emiCalculator.addCapitalizedIncome(model, transactionDate, amortizableAmount);
recalculateRepaymentPeriodsWithEMICalculation(amortizableAmount, model, installments, transactionDate, currency);
allocateOverpayment(capitalizedIncomeTransaction, transactionCtx);
}
private void handleCapitalizedIncomeWithoutEMICalculator(LoanTransaction capitalizedIncomeTransaction, TransactionCtx transactionCtx) {
MonetaryCurrency currency = transactionCtx.getCurrency();
List<LoanRepaymentScheduleInstallment> installments = transactionCtx.getInstallments();
List<LoanRepaymentScheduleInstallment> candidateRepaymentInstallments = installments.stream().filter(
i -> i.getDueDate().isAfter(capitalizedIncomeTransaction.getTransactionDate()) && !i.isDownPayment() && !i.isAdditional())
.toList();
Integer installmentAmountInMultiplesOf = capitalizedIncomeTransaction.getLoan().getLoanProduct()
.getInstallmentAmountInMultiplesOf();
Money amortizableAmount = capitalizedIncomeTransaction.getAmount(currency);
recalculateRepaymentInstallmentsWithoutEMICalculation(capitalizedIncomeTransaction, amortizableAmount,
candidateRepaymentInstallments, currency, installmentAmountInMultiplesOf);
allocateOverpayment(capitalizedIncomeTransaction, transactionCtx);
}
private void recalculateRepaymentPeriodsWithEMICalculation(Money amortizableAmount, ProgressiveLoanInterestScheduleModel model,
List<LoanRepaymentScheduleInstallment> installments, LocalDate transactionDate, MonetaryCurrency currency) {
if (amortizableAmount.isGreaterThanZero()) { if (amortizableAmount.isGreaterThanZero()) {
model.repaymentPeriods().forEach(rm -> {
LoanRepaymentScheduleInstallment installment = installments.stream().filter(
ri -> ri.getDueDate().equals(rm.getDueDate()) && !ri.isDownPayment() && !ri.getDueDate().isBefore(transactionDate))
.findFirst().orElse(null);
if (installment != null) {
installment.updatePrincipal(rm.getDuePrincipal().getAmount());
installment.updateInterestCharged(rm.getDueInterest().getAmount());
installment.updateObligationsMet(currency, transactionDate);
}
});
}
}
private void recalculateRepaymentInstallmentsWithoutEMICalculation(LoanTransaction loanTransaction, Money amortizableAmount,
List<LoanRepaymentScheduleInstallment> candidateRepaymentInstallments, MonetaryCurrency currency,
Integer installmentAmountInMultiplesOf) {
if (amortizableAmount.isGreaterThanZero()) {
int noCandidateRepaymentInstallments = candidateRepaymentInstallments.size();
Money increasePrincipalBy = amortizableAmount.dividedBy(noCandidateRepaymentInstallments, MoneyHelper.getMathContext()); Money increasePrincipalBy = amortizableAmount.dividedBy(noCandidateRepaymentInstallments, MoneyHelper.getMathContext());
MoneyHolder moneyHolder = new MoneyHolder(amortizableAmount); MoneyHolder moneyHolder = new MoneyHolder(amortizableAmount);
@@ -1307,12 +1252,14 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
} }
i.updatePrincipal(newPrincipal.getAmount()); i.updatePrincipal(newPrincipal.getAmount());
moneyHolder.setMoneyObject(moneyHolder.getMoneyObject().minus(newPrincipal).plus(previousPrincipal)); moneyHolder.setMoneyObject(moneyHolder.getMoneyObject().minus(newPrincipal).plus(previousPrincipal));
i.updateObligationsMet(currency, loanTransaction.getTransactionDate()); i.updateObligationsMet(currency, disbursementTransaction.getTransactionDate());
}); });
// Hence the rounding, we might need to amend the last installment amount // Hence the rounding, we might need to amend the last installment amount
candidateRepaymentInstallments.get(noCandidateRepaymentInstallments - 1).addToPrincipal(loanTransaction.getTransactionDate(), candidateRepaymentInstallments.get(noCandidateRepaymentInstallments - 1)
moneyHolder.getMoneyObject()); .addToPrincipal(disbursementTransaction.getTransactionDate(), moneyHolder.getMoneyObject());
} }
allocateOverpayment(disbursementTransaction, transactionCtx);
} }
private void allocateOverpayment(LoanTransaction loanTransaction, TransactionCtx transactionCtx) { private void allocateOverpayment(LoanTransaction loanTransaction, TransactionCtx transactionCtx) {
@@ -20,20 +20,13 @@ package org.apache.fineract.portfolio.loanaccount.repository;
import java.util.List; import java.util.List;
import org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeBalance; import org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeBalance;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepaymentPeriodData;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
public interface LoanCapitalizedIncomeBalanceRepository public interface LoanCapitalizedIncomeBalanceRepository
extends JpaRepository<LoanCapitalizedIncomeBalance, Long>, JpaSpecificationExecutor<LoanCapitalizedIncomeBalance> { extends JpaRepository<LoanCapitalizedIncomeBalance, Long>, JpaSpecificationExecutor<LoanCapitalizedIncomeBalance> {
String FIND_BALANCE_REPAYMENT_SCHEDULE_DATA = "SELECT new org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepaymentPeriodData(lcib.loanTransaction.id, lcib.loan.id, lcib.loanTransaction.dateOf, lcib.loanTransaction.reversed, lcib.amount, lcib.unrecognizedAmount, lcib.loanTransaction.feeChargesPortion) FROM LoanCapitalizedIncomeBalance lcib ";
List<LoanCapitalizedIncomeBalance> findAllByLoanId(Long loanId); List<LoanCapitalizedIncomeBalance> findAllByLoanId(Long loanId);
LoanCapitalizedIncomeBalance findByLoanIdAndLoanTransactionId(Long loanId, Long transactionId); LoanCapitalizedIncomeBalance findByLoanIdAndLoanTransactionId(Long loanId, Long transactionId);
@Query(FIND_BALANCE_REPAYMENT_SCHEDULE_DATA + " WHERE lcib.loan.id = :loanId")
List<LoanTransactionRepaymentPeriodData> findRepaymentPeriodDataByLoanId(Long loanId);
} }
@@ -30,7 +30,6 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
import org.apache.fineract.infrastructure.core.domain.ExternalId; import org.apache.fineract.infrastructure.core.domain.ExternalId;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.infrastructure.core.service.ExternalIdFactory; import org.apache.fineract.infrastructure.core.service.ExternalIdFactory;
import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.Loan;
@@ -55,7 +54,6 @@ public class CapitalizedIncomeWritePlatformServiceImpl implements CapitalizedInc
private final NoteWritePlatformService noteWritePlatformService; private final NoteWritePlatformService noteWritePlatformService;
private final ExternalIdFactory externalIdFactory; private final ExternalIdFactory externalIdFactory;
private final LoanCapitalizedIncomeBalanceRepository capitalizedIncomeBalanceRepository; private final LoanCapitalizedIncomeBalanceRepository capitalizedIncomeBalanceRepository;
private final ReprocessLoanTransactionsService reprocessLoanTransactionsService;
@Transactional @Transactional
@Override @Override
@@ -76,10 +74,9 @@ public class CapitalizedIncomeWritePlatformServiceImpl implements CapitalizedInc
final Money capitalizedIncomeAmount = calculateCapitalizedIncomeAmount(loan, transactionAmount); final Money capitalizedIncomeAmount = calculateCapitalizedIncomeAmount(loan, transactionAmount);
final LoanTransaction capitalizedIncomeTransaction = LoanTransaction.capitalizedIncome(loan, capitalizedIncomeAmount, paymentDetail, final LoanTransaction capitalizedIncomeTransaction = LoanTransaction.capitalizedIncome(loan, capitalizedIncomeAmount, paymentDetail,
transactionDate, txnExternalId); transactionDate, txnExternalId);
// TODO: Transaction reverse-replay + loan repayment schedule update (follow-up story)
// Update loan with capitalized income // Update loan with capitalized income
loan.addLoanTransaction(capitalizedIncomeTransaction); loan.addLoanTransaction(capitalizedIncomeTransaction);
// Recalculate loan transactions
recalculateLoanTransactions(loan, transactionDate, capitalizedIncomeTransaction);
// Create capitalized income balances // Create capitalized income balances
createCapitalizedIncomeBalance(capitalizedIncomeTransaction); createCapitalizedIncomeBalance(capitalizedIncomeTransaction);
// Save and flush (PK is set) // Save and flush (PK is set)
@@ -91,7 +88,7 @@ public class CapitalizedIncomeWritePlatformServiceImpl implements CapitalizedInc
// Create a note if provided // Create a note if provided
final String noteText = command.stringValueOfParameterNamed("note"); final String noteText = command.stringValueOfParameterNamed("note");
if (noteText != null && !noteText.isEmpty()) { if (noteText != null && !noteText.isEmpty()) {
noteWritePlatformService.createLoanTransactionNote(capitalizedIncomeTransaction.getId(), noteText); noteWritePlatformService.createLoanNote(loanId, noteText);
} }
// Post journal entries // Post journal entries
journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds);
@@ -102,14 +99,6 @@ public class CapitalizedIncomeWritePlatformServiceImpl implements CapitalizedInc
.build(); .build();
} }
private void recalculateLoanTransactions(Loan loan, LocalDate transactionDate, LoanTransaction capitalizedIncomeTransaction) {
if (loan.isInterestBearingAndInterestRecalculationEnabled() || DateUtils.isBeforeBusinessDate(transactionDate)) {
reprocessLoanTransactionsService.reprocessTransactions(loan);
} else {
reprocessLoanTransactionsService.processLatestTransaction(capitalizedIncomeTransaction, loan);
}
}
@Override @Override
public void resetBalance(final Long loanId) { public void resetBalance(final Long loanId) {
capitalizedIncomeBalanceRepository capitalizedIncomeBalanceRepository
@@ -30,7 +30,6 @@ import org.apache.fineract.portfolio.loanaccount.service.LoanAssembler;
import org.apache.fineract.portfolio.loanaccount.service.LoanJournalEntryPoster; import org.apache.fineract.portfolio.loanaccount.service.LoanJournalEntryPoster;
import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanTransactionValidator; import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanTransactionValidator;
import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanTransactionValidatorImpl; import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanTransactionValidatorImpl;
import org.apache.fineract.portfolio.loanaccount.service.ReprocessLoanTransactionsService;
import org.apache.fineract.portfolio.note.service.NoteWritePlatformService; import org.apache.fineract.portfolio.note.service.NoteWritePlatformService;
import org.apache.fineract.portfolio.paymentdetail.service.PaymentDetailWritePlatformService; import org.apache.fineract.portfolio.paymentdetail.service.PaymentDetailWritePlatformService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -46,11 +45,10 @@ public class ProgressiveLoanAccountConfiguration {
LoanAssembler loanAssembler, LoanTransactionRepository loanTransactionRepository, LoanAssembler loanAssembler, LoanTransactionRepository loanTransactionRepository,
PaymentDetailWritePlatformService paymentDetailWritePlatformService, LoanJournalEntryPoster journalEntryPoster, PaymentDetailWritePlatformService paymentDetailWritePlatformService, LoanJournalEntryPoster journalEntryPoster,
NoteWritePlatformService noteWritePlatformService, ExternalIdFactory externalIdFactory, NoteWritePlatformService noteWritePlatformService, ExternalIdFactory externalIdFactory,
LoanCapitalizedIncomeBalanceRepository capitalizedIncomeBalanceRepository, LoanCapitalizedIncomeBalanceRepository capitalizedIncomeBalanceRepository) {
ReprocessLoanTransactionsService reprocessLoanTransactionsService) {
return new CapitalizedIncomeWritePlatformServiceImpl(loanTransactionValidator, loanAssembler, loanTransactionRepository, return new CapitalizedIncomeWritePlatformServiceImpl(loanTransactionValidator, loanAssembler, loanTransactionRepository,
paymentDetailWritePlatformService, journalEntryPoster, noteWritePlatformService, externalIdFactory, paymentDetailWritePlatformService, journalEntryPoster, noteWritePlatformService, externalIdFactory,
capitalizedIncomeBalanceRepository, reprocessLoanTransactionsService); capitalizedIncomeBalanceRepository);
} }
@Bean @Bean
@@ -65,12 +65,6 @@ public interface EMICalculator {
*/ */
void addDisbursement(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate disbursementDueDate, Money disbursedAmount); void addDisbursement(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate disbursementDueDate, Money disbursedAmount);
/**
* Applies the capitalized income transaction on the interest model. This method recalculates the EMI amounts from
* the action date.
*/
void addCapitalizedIncome(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate transactionDueDate, Money transactionAmount);
/** /**
* Applies the interest rate change on the interest model. This method recalculates the EMI amounts from the action * Applies the interest rate change on the interest model. This method recalculates the EMI amounts from the action
* date. * date.
@@ -119,7 +119,7 @@ public final class ProgressiveEMICalculator implements EMICalculator {
private void addDisbursement(final ProgressiveLoanInterestScheduleModel scheduleModel, final EmiChangeOperation operation) { private void addDisbursement(final ProgressiveLoanInterestScheduleModel scheduleModel, final EmiChangeOperation operation) {
scheduleModel scheduleModel
.changeOutstandingBalanceAndUpdateInterestPeriods(operation.getSubmittedOnDate(), operation.getAmount(), .changeOutstandingBalanceAndUpdateInterestPeriods(operation.getSubmittedOnDate(), operation.getAmount(),
scheduleModel.zero(), scheduleModel.zero()) scheduleModel.zero())
.ifPresent((repaymentPeriod) -> calculateEMIValueAndRateFactors( .ifPresent((repaymentPeriod) -> calculateEMIValueAndRateFactors(
getEffectiveRepaymentDueDate(scheduleModel, repaymentPeriod, operation.getSubmittedOnDate()), scheduleModel, getEffectiveRepaymentDueDate(scheduleModel, repaymentPeriod, operation.getSubmittedOnDate()), scheduleModel,
operation)); operation));
@@ -140,24 +140,6 @@ public final class ProgressiveEMICalculator implements EMICalculator {
return changedRepaymentPeriod.getDueDate(); return changedRepaymentPeriod.getDueDate();
} }
/**
* Add capitalized income to Interest Period
*/
@Override
public void addCapitalizedIncome(final ProgressiveLoanInterestScheduleModel scheduleModel, final LocalDate transactionDueDate,
final Money transactionAmount) {
addCapitalizedIncome(scheduleModel, EmiChangeOperation.capitalizedIncome(transactionDueDate, transactionAmount));
}
private void addCapitalizedIncome(final ProgressiveLoanInterestScheduleModel scheduleModel, final EmiChangeOperation operation) {
scheduleModel.changeOutstandingBalanceAndUpdateInterestPeriods(operation.getSubmittedOnDate(), scheduleModel.zero(),
scheduleModel.zero(), operation.getAmount()).ifPresent((repaymentPeriod) -> {
calculateEMIValueAndRateFactors(
getEffectiveRepaymentDueDate(scheduleModel, repaymentPeriod, operation.getSubmittedOnDate()), scheduleModel,
operation);
});
}
@Override @Override
public void changeInterestRate(final ProgressiveLoanInterestScheduleModel scheduleModel, final LocalDate newInterestSubmittedOnDate, public void changeInterestRate(final ProgressiveLoanInterestScheduleModel scheduleModel, final LocalDate newInterestSubmittedOnDate,
final BigDecimal newInterestRate) { final BigDecimal newInterestRate) {
@@ -169,7 +151,7 @@ public final class ProgressiveEMICalculator implements EMICalculator {
scheduleModel.addInterestRate(interestRateChangeEffectiveDate, operation.getInterestRate()); scheduleModel.addInterestRate(interestRateChangeEffectiveDate, operation.getInterestRate());
scheduleModel scheduleModel
.changeOutstandingBalanceAndUpdateInterestPeriods(interestRateChangeEffectiveDate, scheduleModel.zero(), .changeOutstandingBalanceAndUpdateInterestPeriods(interestRateChangeEffectiveDate, scheduleModel.zero(),
scheduleModel.zero(), scheduleModel.zero()) scheduleModel.zero())
.ifPresent(repaymentPeriod -> calculateEMIValueAndRateFactors( .ifPresent(repaymentPeriod -> calculateEMIValueAndRateFactors(
getEffectiveRepaymentDueDate(scheduleModel, repaymentPeriod, interestRateChangeEffectiveDate), scheduleModel, getEffectiveRepaymentDueDate(scheduleModel, repaymentPeriod, interestRateChangeEffectiveDate), scheduleModel,
operation)); operation));
@@ -178,8 +160,8 @@ public final class ProgressiveEMICalculator implements EMICalculator {
@Override @Override
public void addBalanceCorrection(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate balanceCorrectionDate, public void addBalanceCorrection(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate balanceCorrectionDate,
Money balanceCorrectionAmount) { Money balanceCorrectionAmount) {
scheduleModel.changeOutstandingBalanceAndUpdateInterestPeriods(balanceCorrectionDate, scheduleModel.zero(), balanceCorrectionAmount, scheduleModel.changeOutstandingBalanceAndUpdateInterestPeriods(balanceCorrectionDate, scheduleModel.zero(), balanceCorrectionAmount)
scheduleModel.zero()).ifPresent(repaymentPeriod -> { .ifPresent(repaymentPeriod -> {
calculateRateFactorForRepaymentPeriod(repaymentPeriod, scheduleModel); calculateRateFactorForRepaymentPeriod(repaymentPeriod, scheduleModel);
calculateOutstandingBalance(scheduleModel); calculateOutstandingBalance(scheduleModel);
calculateLastUnpaidRepaymentPeriodEMI(scheduleModel); calculateLastUnpaidRepaymentPeriodEMI(scheduleModel);
@@ -255,7 +237,7 @@ public final class ProgressiveEMICalculator implements EMICalculator {
private void addCredit(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate transactionDate, Money creditedPrincipalAmount, private void addCredit(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate transactionDate, Money creditedPrincipalAmount,
Money creditedInterestAmount) { Money creditedInterestAmount) {
scheduleModel.changeOutstandingBalanceAndUpdateInterestPeriods(transactionDate, scheduleModel.zero(), creditedPrincipalAmount, scheduleModel.zero()) scheduleModel.changeOutstandingBalanceAndUpdateInterestPeriods(transactionDate, scheduleModel.zero(), creditedPrincipalAmount)
.ifPresent(repaymentPeriod -> { .ifPresent(repaymentPeriod -> {
addCreditedAmountsToInterestPeriod(scheduleModel, transactionDate, creditedPrincipalAmount, creditedInterestAmount); addCreditedAmountsToInterestPeriod(scheduleModel, transactionDate, creditedPrincipalAmount, creditedInterestAmount);
calculateRateFactorForRepaymentPeriod(repaymentPeriod, scheduleModel); calculateRateFactorForRepaymentPeriod(repaymentPeriod, scheduleModel);
@@ -460,11 +442,8 @@ public final class ProgressiveEMICalculator implements EMICalculator {
.flatMap(rp -> rp.getInterestPeriods().stream().map(InterestPeriod::getDisbursementAmount)) .flatMap(rp -> rp.getInterestPeriods().stream().map(InterestPeriod::getDisbursementAmount))
.reduce(scheduleModel.zero(), (m1, m2) -> m1.plus(m2, mc)) // 100 .reduce(scheduleModel.zero(), (m1, m2) -> m1.plus(m2, mc)) // 100
.plus(scheduleModel.getTotalCreditedPrincipal(), mc); // .plus(scheduleModel.getTotalCreditedPrincipal(), mc); //
Money totalCapitalizedIncome = scheduleModel.repaymentPeriods().stream()
.flatMap(rp -> rp.getInterestPeriods().stream().map(InterestPeriod::getCapitalizedIncomePrincipal))
.reduce(scheduleModel.zero(), (m1, m2) -> m1.plus(m2, mc)); // 100
Money diff = totalDisbursedAmount.plus(totalCapitalizedIncome, mc).plus(totalDueInterest, mc).minus(totalEMI, mc); Money diff = totalDisbursedAmount.plus(totalDueInterest, mc).minus(totalEMI, mc);
Optional<RepaymentPeriod> findLastUnpaidRepaymentPeriod = scheduleModel.repaymentPeriods().stream().filter(rp -> !rp.isFullyPaid()) Optional<RepaymentPeriod> findLastUnpaidRepaymentPeriod = scheduleModel.repaymentPeriods().stream().filter(rp -> !rp.isFullyPaid())
.reduce((first, second) -> second); .reduce((first, second) -> second);
findLastUnpaidRepaymentPeriod.ifPresent(repaymentPeriod -> { findLastUnpaidRepaymentPeriod.ifPresent(repaymentPeriod -> {
@@ -830,9 +809,7 @@ public final class ProgressiveEMICalculator implements EMICalculator {
return; return;
} }
final ProgressiveLoanInterestScheduleModel scheduleModelCopy = scheduleModel.copyWithoutPaidAmounts(); final ProgressiveLoanInterestScheduleModel scheduleModelCopy = scheduleModel.copyWithoutPaidAmounts();
addDisbursement(scheduleModelCopy, operation.withZeroAmount()); addDisbursement(scheduleModelCopy, operation.withZeroAmount());
addCapitalizedIncome(scheduleModelCopy, operation.withZeroAmount());
final LocalDate firstDueDate = repaymentPeriods.get(0).getDueDate(); final LocalDate firstDueDate = repaymentPeriods.get(0).getDueDate();
scheduleModel.copyPeriodsFrom(firstDueDate, scheduleModelCopy.repaymentPeriods(), (newRepaymentPeriod, actualRepaymentPeriod) -> { scheduleModel.copyPeriodsFrom(firstDueDate, scheduleModelCopy.repaymentPeriods(), (newRepaymentPeriod, actualRepaymentPeriod) -> {
@@ -31,8 +31,7 @@ public class EmiChangeOperation {
public enum Action { // public enum Action { //
DISBURSEMENT, // DISBURSEMENT, //
INTEREST_RATE_CHANGE, // INTEREST_RATE_CHANGE //
CAPITALIZED_INCOME //
} }
private final Action action; private final Action action;
@@ -49,12 +48,8 @@ public class EmiChangeOperation {
return new EmiChangeOperation(EmiChangeOperation.Action.INTEREST_RATE_CHANGE, newInterestSubmittedOnDate, null, newInterestRate); return new EmiChangeOperation(EmiChangeOperation.Action.INTEREST_RATE_CHANGE, newInterestSubmittedOnDate, null, newInterestRate);
} }
public static EmiChangeOperation capitalizedIncome(final LocalDate transactionDueDate, final Money transactionAmount) {
return new EmiChangeOperation(Action.CAPITALIZED_INCOME, transactionDueDate, transactionAmount, null);
}
public EmiChangeOperation withZeroAmount() { public EmiChangeOperation withZeroAmount() {
if (action == Action.DISBURSEMENT || action == Action.CAPITALIZED_INCOME) { if (action == Action.DISBURSEMENT) {
return new EmiChangeOperation(action, submittedOnDate, amount.zero(), null); return new EmiChangeOperation(action, submittedOnDate, amount.zero(), null);
} }
return null; return null;
@@ -62,8 +62,6 @@ public class InterestPeriod implements Comparable<InterestPeriod> {
private Money balanceCorrectionAmount; private Money balanceCorrectionAmount;
private Money outstandingLoanBalance; private Money outstandingLoanBalance;
private Money capitalizedIncomePrincipal;
@JsonExclude @JsonExclude
private final MathContext mc; private final MathContext mc;
private final boolean isPaused; private final boolean isPaused;
@@ -72,38 +70,38 @@ public class InterestPeriod implements Comparable<InterestPeriod> {
return new InterestPeriod(repaymentPeriod, interestPeriod.getFromDate(), interestPeriod.getDueDate(), return new InterestPeriod(repaymentPeriod, interestPeriod.getFromDate(), interestPeriod.getDueDate(),
interestPeriod.getRateFactor(), interestPeriod.getRateFactorTillPeriodDueDate(), interestPeriod.getCreditedPrincipal(), interestPeriod.getRateFactor(), interestPeriod.getRateFactorTillPeriodDueDate(), interestPeriod.getCreditedPrincipal(),
interestPeriod.getCreditedInterest(), interestPeriod.getDisbursementAmount(), interestPeriod.getBalanceCorrectionAmount(), interestPeriod.getCreditedInterest(), interestPeriod.getDisbursementAmount(), interestPeriod.getBalanceCorrectionAmount(),
interestPeriod.getOutstandingLoanBalance(), interestPeriod.getCapitalizedIncomePrincipal(), mc, interestPeriod.isPaused()); interestPeriod.getOutstandingLoanBalance(), mc, interestPeriod.isPaused());
} }
public static InterestPeriod empty(@NotNull RepaymentPeriod repaymentPeriod, MathContext mc) { public static InterestPeriod empty(@NotNull RepaymentPeriod repaymentPeriod, MathContext mc) {
return new InterestPeriod(repaymentPeriod, null, null, null, null, null, null, null, null, null, null, mc, false); return new InterestPeriod(repaymentPeriod, null, null, null, null, null, null, null, null, null, mc, false);
} }
public static InterestPeriod copy(@NotNull RepaymentPeriod repaymentPeriod, @NotNull InterestPeriod interestPeriod) { public static InterestPeriod copy(@NotNull RepaymentPeriod repaymentPeriod, @NotNull InterestPeriod interestPeriod) {
return new InterestPeriod(repaymentPeriod, interestPeriod.getFromDate(), interestPeriod.getDueDate(), return new InterestPeriod(repaymentPeriod, interestPeriod.getFromDate(), interestPeriod.getDueDate(),
interestPeriod.getRateFactor(), interestPeriod.getRateFactorTillPeriodDueDate(), interestPeriod.getCreditedPrincipal(), interestPeriod.getRateFactor(), interestPeriod.getRateFactorTillPeriodDueDate(), interestPeriod.getCreditedPrincipal(),
interestPeriod.getCreditedInterest(), interestPeriod.getDisbursementAmount(), interestPeriod.getBalanceCorrectionAmount(), interestPeriod.getCreditedInterest(), interestPeriod.getDisbursementAmount(), interestPeriod.getBalanceCorrectionAmount(),
interestPeriod.getOutstandingLoanBalance(), interestPeriod.getCapitalizedIncomePrincipal(), interestPeriod.getMc(), interestPeriod.isPaused()); interestPeriod.getOutstandingLoanBalance(), interestPeriod.getMc(), interestPeriod.isPaused());
} }
public static InterestPeriod withEmptyAmounts(@NotNull RepaymentPeriod repaymentPeriod, @NotNull LocalDate fromDate, public static InterestPeriod withEmptyAmounts(@NotNull RepaymentPeriod repaymentPeriod, @NotNull LocalDate fromDate,
LocalDate dueDate) { LocalDate dueDate) {
final Money zero = repaymentPeriod.getEmi().zero(); final Money zero = repaymentPeriod.getEmi().zero();
return new InterestPeriod(repaymentPeriod, fromDate, dueDate, BigDecimal.ZERO, BigDecimal.ZERO, zero, zero, zero, zero, zero, zero, return new InterestPeriod(repaymentPeriod, fromDate, dueDate, BigDecimal.ZERO, BigDecimal.ZERO, zero, zero, zero, zero, zero,
zero.getMc(), false); zero.getMc(), false);
} }
public static InterestPeriod withEmptyAmounts(@NotNull RepaymentPeriod repaymentPeriod, @NotNull LocalDate fromDate, LocalDate dueDate, public static InterestPeriod withEmptyAmounts(@NotNull RepaymentPeriod repaymentPeriod, @NotNull LocalDate fromDate, LocalDate dueDate,
boolean isPaused) { boolean isPaused) {
final Money zero = repaymentPeriod.getEmi().zero(); final Money zero = repaymentPeriod.getEmi().zero();
return new InterestPeriod(repaymentPeriod, fromDate, dueDate, BigDecimal.ZERO, BigDecimal.ZERO, zero, zero, zero, zero, zero, zero, return new InterestPeriod(repaymentPeriod, fromDate, dueDate, BigDecimal.ZERO, BigDecimal.ZERO, zero, zero, zero, zero, zero,
zero.getMc(), isPaused); zero.getMc(), isPaused);
} }
public static InterestPeriod withPausedAndEmptyAmounts(@NotNull RepaymentPeriod repaymentPeriod, @NotNull LocalDate fromDate, public static InterestPeriod withPausedAndEmptyAmounts(@NotNull RepaymentPeriod repaymentPeriod, @NotNull LocalDate fromDate,
LocalDate dueDate) { LocalDate dueDate) {
final Money zero = repaymentPeriod.getEmi().zero(); final Money zero = repaymentPeriod.getEmi().zero();
return new InterestPeriod(repaymentPeriod, fromDate, dueDate, BigDecimal.ZERO, BigDecimal.ZERO, zero, zero, zero, zero, zero, zero, return new InterestPeriod(repaymentPeriod, fromDate, dueDate, BigDecimal.ZERO, BigDecimal.ZERO, zero, zero, zero, zero, zero,
zero.getMc(), true); zero.getMc(), true);
} }
@@ -128,10 +126,6 @@ public class InterestPeriod implements Comparable<InterestPeriod> {
this.creditedInterest = MathUtil.plus(this.creditedInterest, creditedInterest, mc); this.creditedInterest = MathUtil.plus(this.creditedInterest, creditedInterest, mc);
} }
public void addCapitalizedIncomePrincipalAmount(final Money capitalizedIncomePrincipal) {
this.capitalizedIncomePrincipal = MathUtil.plus(this.capitalizedIncomePrincipal, capitalizedIncomePrincipal, mc);
}
public BigDecimal getCalculatedDueInterest() { public BigDecimal getCalculatedDueInterest() {
if (isPaused) { if (isPaused) {
return creditedInterest.getAmount(); return creditedInterest.getAmount();
@@ -162,7 +156,6 @@ public class InterestPeriod implements Comparable<InterestPeriod> {
InterestPeriod previousInterestPeriod = previousRepaymentPeriod.get().getLastInterestPeriod(); InterestPeriod previousInterestPeriod = previousRepaymentPeriod.get().getLastInterestPeriod();
this.outstandingLoanBalance = MathUtil.negativeToZero(previousInterestPeriod.getOutstandingLoanBalance()// this.outstandingLoanBalance = MathUtil.negativeToZero(previousInterestPeriod.getOutstandingLoanBalance()//
.plus(previousInterestPeriod.getDisbursementAmount(), mc)// .plus(previousInterestPeriod.getDisbursementAmount(), mc)//
.plus(previousInterestPeriod.getCapitalizedIncomePrincipal(), mc)//
.plus(previousInterestPeriod.getBalanceCorrectionAmount(), mc)// .plus(previousInterestPeriod.getBalanceCorrectionAmount(), mc)//
.minus(previousRepaymentPeriod.get().getDuePrincipal(), mc)// .minus(previousRepaymentPeriod.get().getDuePrincipal(), mc)//
.plus(previousRepaymentPeriod.get().getPaidPrincipal(), mc), mc);// .plus(previousRepaymentPeriod.get().getPaidPrincipal(), mc), mc);//
@@ -172,7 +165,6 @@ public class InterestPeriod implements Comparable<InterestPeriod> {
InterestPeriod previousInterestPeriod = getRepaymentPeriod().getInterestPeriods().get(index - 1); InterestPeriod previousInterestPeriod = getRepaymentPeriod().getInterestPeriods().get(index - 1);
this.outstandingLoanBalance = MathUtil.negativeToZero(previousInterestPeriod.getOutstandingLoanBalance() // this.outstandingLoanBalance = MathUtil.negativeToZero(previousInterestPeriod.getOutstandingLoanBalance() //
.plus(previousInterestPeriod.getBalanceCorrectionAmount(), mc) // .plus(previousInterestPeriod.getBalanceCorrectionAmount(), mc) //
.plus(previousInterestPeriod.getCapitalizedIncomePrincipal(), mc) //
.plus(previousInterestPeriod.getDisbursementAmount(), mc)); // .plus(previousInterestPeriod.getDisbursementAmount(), mc)); //
} }
} }
@@ -181,7 +173,7 @@ public class InterestPeriod implements Comparable<InterestPeriod> {
* Include principal like amounts (all disbursement amount + credited principal) * Include principal like amounts (all disbursement amount + credited principal)
*/ */
public Money getCreditedAmounts() { public Money getCreditedAmounts() {
return getDisbursementAmount().plus(getCreditedPrincipal(), mc).plus(getCapitalizedIncomePrincipal(), mc); return getDisbursementAmount().plus(getCreditedPrincipal(), mc);
} }
public boolean isFirstInterestPeriod() { public boolean isFirstInterestPeriod() {
@@ -175,10 +175,9 @@ public class ProgressiveLoanInterestScheduleModel {
} }
public Optional<RepaymentPeriod> changeOutstandingBalanceAndUpdateInterestPeriods(final LocalDate balanceChangeDate, public Optional<RepaymentPeriod> changeOutstandingBalanceAndUpdateInterestPeriods(final LocalDate balanceChangeDate,
final Money disbursedAmount, final Money correctionAmount, final Money capitalizedIncomePrincipal) { final Money disbursedAmount, final Money correctionAmount) {
return findRepaymentPeriodForBalanceChange(balanceChangeDate).stream()// return findRepaymentPeriodForBalanceChange(balanceChangeDate).stream()//
.peek(updateInterestPeriodOnRepaymentPeriod(balanceChangeDate, disbursedAmount, correctionAmount, .peek(updateInterestPeriodOnRepaymentPeriod(balanceChangeDate, disbursedAmount, correctionAmount))//
capitalizedIncomePrincipal))//
.findFirst();// .findFirst();//
} }
@@ -215,7 +214,7 @@ public class ProgressiveLoanInterestScheduleModel {
} }
private Consumer<RepaymentPeriod> updateInterestPeriodOnRepaymentPeriod(final LocalDate balanceChangeDate, final Money disbursedAmount, private Consumer<RepaymentPeriod> updateInterestPeriodOnRepaymentPeriod(final LocalDate balanceChangeDate, final Money disbursedAmount,
final Money correctionAmount, final Money capitalizedIncomePrincipal) { final Money correctionAmount) {
return repaymentPeriod -> { return repaymentPeriod -> {
final boolean isChangeOnMaturityDate = isLastRepaymentPeriod(repaymentPeriod) final boolean isChangeOnMaturityDate = isLastRepaymentPeriod(repaymentPeriod)
&& balanceChangeDate.isEqual(repaymentPeriod.getDueDate()); && balanceChangeDate.isEqual(repaymentPeriod.getDueDate());
@@ -223,10 +222,9 @@ public class ProgressiveLoanInterestScheduleModel {
isChangeOnMaturityDate); isChangeOnMaturityDate);
if (interestPeriodOptional.isPresent()) { if (interestPeriodOptional.isPresent()) {
interestPeriodOptional.get().addDisbursementAmount(disbursedAmount); interestPeriodOptional.get().addDisbursementAmount(disbursedAmount);
interestPeriodOptional.get().addCapitalizedIncomePrincipalAmount(capitalizedIncomePrincipal);
interestPeriodOptional.get().addBalanceCorrectionAmount(correctionAmount); interestPeriodOptional.get().addBalanceCorrectionAmount(correctionAmount);
} else { } else {
insertInterestPeriod(repaymentPeriod, balanceChangeDate, disbursedAmount, correctionAmount, capitalizedIncomePrincipal); insertInterestPeriod(repaymentPeriod, balanceChangeDate, disbursedAmount, correctionAmount);
} }
}; };
} }
@@ -248,7 +246,7 @@ public class ProgressiveLoanInterestScheduleModel {
} }
void insertInterestPeriod(final RepaymentPeriod repaymentPeriod, final LocalDate balanceChangeDate, final Money disbursedAmount, void insertInterestPeriod(final RepaymentPeriod repaymentPeriod, final LocalDate balanceChangeDate, final Money disbursedAmount,
final Money correctionAmount, Money capitalizedIncomePrincipal) { final Money correctionAmount) {
final InterestPeriod previousInterestPeriod = findPreviousInterestPeriod(repaymentPeriod, balanceChangeDate); final InterestPeriod previousInterestPeriod = findPreviousInterestPeriod(repaymentPeriod, balanceChangeDate);
final LocalDate originalDueDate = previousInterestPeriod.getDueDate(); final LocalDate originalDueDate = previousInterestPeriod.getDueDate();
final LocalDate newDueDate = calculateNewDueDate(previousInterestPeriod, balanceChangeDate); final LocalDate newDueDate = calculateNewDueDate(previousInterestPeriod, balanceChangeDate);
@@ -256,7 +254,6 @@ public class ProgressiveLoanInterestScheduleModel {
previousInterestPeriod.setDueDate(newDueDate); previousInterestPeriod.setDueDate(newDueDate);
previousInterestPeriod.addDisbursementAmount(disbursedAmount); previousInterestPeriod.addDisbursementAmount(disbursedAmount);
previousInterestPeriod.addCapitalizedIncomePrincipalAmount(capitalizedIncomePrincipal);
previousInterestPeriod.addBalanceCorrectionAmount(correctionAmount); previousInterestPeriod.addBalanceCorrectionAmount(correctionAmount);
final InterestPeriod interestPeriod = InterestPeriod.withEmptyAmounts(repaymentPeriod, newDueDate, originalDueDate, isPaused); final InterestPeriod interestPeriod = InterestPeriod.withEmptyAmounts(repaymentPeriod, newDueDate, originalDueDate, isPaused);
@@ -225,17 +225,6 @@ public final class RepaymentPeriod {
.reduce(getZero(mc), (value, previous) -> value.plus(previous, mc)), mc); // .reduce(getZero(mc), (value, previous) -> value.plus(previous, mc)), mc); //
} }
/**
* Sum of capitalized income principals
*
* @return
*/
public Money getCapitalizedIncomePrincipal() {
return MathUtil.negativeToZero(interestPeriods.stream() //
.map(InterestPeriod::getCapitalizedIncomePrincipal) //
.reduce(getZero(mc), (value, previous) -> value.plus(previous, mc)), mc); //
}
/** /**
* Gives back due principal + credited principal or paid principal * Gives back due principal + credited principal or paid principal
* *
@@ -289,7 +278,6 @@ public final class RepaymentPeriod {
InterestPeriod lastInterestPeriod = getInterestPeriods().get(getInterestPeriods().size() - 1); InterestPeriod lastInterestPeriod = getInterestPeriods().get(getInterestPeriods().size() - 1);
Money calculatedOutStandingLoanBalance = lastInterestPeriod.getOutstandingLoanBalance() // Money calculatedOutStandingLoanBalance = lastInterestPeriod.getOutstandingLoanBalance() //
.plus(lastInterestPeriod.getBalanceCorrectionAmount(), mc) // .plus(lastInterestPeriod.getBalanceCorrectionAmount(), mc) //
.plus(lastInterestPeriod.getCapitalizedIncomePrincipal(), mc) //
.plus(lastInterestPeriod.getDisbursementAmount(), mc) // .plus(lastInterestPeriod.getDisbursementAmount(), mc) //
.minus(getDuePrincipal(), mc)// .minus(getDuePrincipal(), mc)//
.plus(getPaidPrincipal(), mc);// .plus(getPaidPrincipal(), mc);//
@@ -317,10 +305,7 @@ public final class RepaymentPeriod {
Money totalDisbursedAmount = getInterestPeriods().stream() // Money totalDisbursedAmount = getInterestPeriods().stream() //
.map(InterestPeriod::getDisbursementAmount) // .map(InterestPeriod::getDisbursementAmount) //
.reduce(getZero(mc), (m1, m2) -> m1.plus(m2, mc)); // .reduce(getZero(mc), (m1, m2) -> m1.plus(m2, mc)); //
Money totalCapitalizedIncomeAmount = getInterestPeriods().stream() // return initialBalance.add(totalDisbursedAmount, mc);
.map(InterestPeriod::getCapitalizedIncomePrincipal) //
.reduce(getZero(mc), (m1, m2) -> m1.plus(m2, mc)); //
return initialBalance.add(totalDisbursedAmount, mc).add(totalCapitalizedIncomeAmount, mc);
} }
private Money getZero(MathContext mc) { private Money getZero(MathContext mc) {
@@ -464,7 +464,6 @@ public class LoanImportHandler implements ImportHandler {
JsonObject loanRepaymentJsonob = gsonBuilder.create().toJsonTree(loanRepayments.get(rowIndex)).getAsJsonObject(); JsonObject loanRepaymentJsonob = gsonBuilder.create().toJsonTree(loanRepayments.get(rowIndex)).getAsJsonObject();
loanRepaymentJsonob.remove("manuallyReversed"); loanRepaymentJsonob.remove("manuallyReversed");
loanRepaymentJsonob.remove("numberOfRepayments"); loanRepaymentJsonob.remove("numberOfRepayments");
loanRepaymentJsonob.remove("reversed");
String payload = loanRepaymentJsonob.toString(); String payload = loanRepaymentJsonob.toString();
final CommandWrapper commandRequest = new CommandWrapperBuilder() // final CommandWrapper commandRequest = new CommandWrapperBuilder() //
.loanRepaymentTransaction(result.getLoanId()) // .loanRepaymentTransaction(result.getLoanId()) //
@@ -139,7 +139,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeTyp
import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryBalancesRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryBalancesRepository;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepaymentPeriodData;
import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
import org.apache.fineract.portfolio.loanaccount.exception.LoanTemplateTypeRequiredException; import org.apache.fineract.portfolio.loanaccount.exception.LoanTemplateTypeRequiredException;
import org.apache.fineract.portfolio.loanaccount.exception.NotSupportedLoanTemplateTypeException; import org.apache.fineract.portfolio.loanaccount.exception.NotSupportedLoanTemplateTypeException;
@@ -151,7 +150,6 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanSchedul
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
import org.apache.fineract.portfolio.loanaccount.loanschedule.service.LoanScheduleCalculationPlatformService; import org.apache.fineract.portfolio.loanaccount.loanschedule.service.LoanScheduleCalculationPlatformService;
import org.apache.fineract.portfolio.loanaccount.loanschedule.service.LoanScheduleHistoryReadPlatformService; import org.apache.fineract.portfolio.loanaccount.loanschedule.service.LoanScheduleHistoryReadPlatformService;
import org.apache.fineract.portfolio.loanaccount.repository.LoanCapitalizedIncomeBalanceRepository;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanTermVariationsRepository; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanTermVariationsRepository;
import org.apache.fineract.portfolio.loanaccount.service.GLIMAccountInfoReadPlatformService; import org.apache.fineract.portfolio.loanaccount.service.GLIMAccountInfoReadPlatformService;
import org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService;
@@ -299,7 +297,6 @@ public class LoansApiResource {
private final ClientReadPlatformService clientReadPlatformService; private final ClientReadPlatformService clientReadPlatformService;
private final LoanTermVariationsRepository loanTermVariationsRepository; private final LoanTermVariationsRepository loanTermVariationsRepository;
private final LoanSummaryProviderDelegate loanSummaryProviderDelegate; private final LoanSummaryProviderDelegate loanSummaryProviderDelegate;
private final LoanCapitalizedIncomeBalanceRepository loanCapitalizedIncomeBalanceRepository;
/* /*
* This template API is used for loan approval, ideally this should be invoked on loan that are pending for * This template API is used for loan approval, ideally this should be invoked on loan that are pending for
@@ -501,13 +498,11 @@ public class LoansApiResource {
loanBasicDetails.getPageItems().forEach(i -> { loanBasicDetails.getPageItems().forEach(i -> {
if (i.getSummary() != null) { if (i.getSummary() != null) {
Collection<DisbursementData> disbursementData = this.loanReadPlatformService.retrieveLoanDisbursementDetails(i.getId()); Collection<DisbursementData> disbursementData = this.loanReadPlatformService.retrieveLoanDisbursementDetails(i.getId());
List<LoanTransactionRepaymentPeriodData> capitalizedIncomeData = this.loanCapitalizedIncomeBalanceRepository
.findRepaymentPeriodDataByLoanId(i.getId());
final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = new RepaymentScheduleRelatedLoanData( final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = new RepaymentScheduleRelatedLoanData(
i.getTimeline().getExpectedDisbursementDate(), i.getTimeline().getActualDisbursementDate(), i.getCurrency(), i.getTimeline().getExpectedDisbursementDate(), i.getTimeline().getActualDisbursementDate(), i.getCurrency(),
i.getPrincipal(), i.getInArrearsTolerance(), i.getFeeChargesAtDisbursementCharged()); i.getPrincipal(), i.getInArrearsTolerance(), i.getFeeChargesAtDisbursementCharged());
final LoanScheduleData repaymentSchedule = this.loanReadPlatformService.retrieveRepaymentSchedule(i.getId(), final LoanScheduleData repaymentSchedule = this.loanReadPlatformService.retrieveRepaymentSchedule(i.getId(),
repaymentScheduleRelatedData, disbursementData, capitalizedIncomeData, i.isInterestRecalculationEnabled(), repaymentScheduleRelatedData, disbursementData, i.isInterestRecalculationEnabled(),
LoanScheduleType.fromEnumOptionData(i.getLoanScheduleType())); LoanScheduleType.fromEnumOptionData(i.getLoanScheduleType()));
LoanSummaryDataProvider loanSummaryDataProvider = loanSummaryProviderDelegate LoanSummaryDataProvider loanSummaryDataProvider = loanSummaryProviderDelegate
.resolveLoanSummaryDataProvider(i.getTransactionProcessingStrategyCode()); .resolveLoanSummaryDataProvider(i.getTransactionProcessingStrategyCode());
@@ -986,15 +981,13 @@ public class LoansApiResource {
if (associationParameters.contains(DataTableApiConstant.repaymentScheduleAssociateParamName)) { if (associationParameters.contains(DataTableApiConstant.repaymentScheduleAssociateParamName)) {
mandatoryResponseParameters.add(DataTableApiConstant.repaymentScheduleAssociateParamName); mandatoryResponseParameters.add(DataTableApiConstant.repaymentScheduleAssociateParamName);
List<LoanTransactionRepaymentPeriodData> capitalizedIncomeData = this.loanCapitalizedIncomeBalanceRepository
.findRepaymentPeriodDataByLoanId(resolvedLoanId);
final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = new RepaymentScheduleRelatedLoanData( final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = new RepaymentScheduleRelatedLoanData(
loanBasicDetails.getTimeline().getExpectedDisbursementDate(), loanBasicDetails.getTimeline().getExpectedDisbursementDate(),
loanBasicDetails.getTimeline().getActualDisbursementDate(), loanBasicDetails.getCurrency(), loanBasicDetails.getTimeline().getActualDisbursementDate(), loanBasicDetails.getCurrency(),
loanBasicDetails.getPrincipal(), loanBasicDetails.getInArrearsTolerance(), loanBasicDetails.getPrincipal(), loanBasicDetails.getInArrearsTolerance(),
loanBasicDetails.getFeeChargesAtDisbursementCharged()); loanBasicDetails.getFeeChargesAtDisbursementCharged());
repaymentSchedule = this.loanReadPlatformService.retrieveRepaymentSchedule(resolvedLoanId, repaymentScheduleRelatedData, repaymentSchedule = this.loanReadPlatformService.retrieveRepaymentSchedule(resolvedLoanId, repaymentScheduleRelatedData,
disbursementData, capitalizedIncomeData, loanBasicDetails.isInterestRecalculationEnabled(), disbursementData, loanBasicDetails.isInterestRecalculationEnabled(),
LoanScheduleType.fromEnumOptionData(loanBasicDetails.getLoanScheduleType())); LoanScheduleType.fromEnumOptionData(loanBasicDetails.getLoanScheduleType()));
if (associationParameters.contains(DataTableApiConstant.futureScheduleAssociateParamName) if (associationParameters.contains(DataTableApiConstant.futureScheduleAssociateParamName)
@@ -517,11 +517,7 @@ final class LoansApiResourceSwagger {
public GetLoansLoanIdCurrency currency; public GetLoansLoanIdCurrency currency;
@Schema(example = "1000000.000000") @Schema(example = "1000000.000000")
public BigDecimal totalPrincipal;
@Schema(example = "1000000.000000")
public BigDecimal principalDisbursed; public BigDecimal principalDisbursed;
@Schema(example = "1000000.000000")
public BigDecimal totalPrincipalFromCapitalizedIncome;
@Schema(example = "0.000000") @Schema(example = "0.000000")
public BigDecimal principalPaid; public BigDecimal principalPaid;
@Schema(example = "0.00") @Schema(example = "0.00")
@@ -97,8 +97,7 @@ public abstract class CommonLoanSummaryDataProvider implements LoanSummaryDataPr
} }
return LoanSummaryData.builder().currency(defaultSummaryData.getCurrency()) return LoanSummaryData.builder().currency(defaultSummaryData.getCurrency())
.principalDisbursed(defaultSummaryData.getPrincipalDisbursed()).totalPrincipal(defaultSummaryData.getTotalPrincipal()) .principalDisbursed(defaultSummaryData.getPrincipalDisbursed())
.totalPrincipalFromCapitalizedIncome(defaultSummaryData.getTotalPrincipalFromCapitalizedIncome())
.principalAdjustments(defaultSummaryData.getPrincipalAdjustments()).principalPaid(defaultSummaryData.getPrincipalPaid()) .principalAdjustments(defaultSummaryData.getPrincipalAdjustments()).principalPaid(defaultSummaryData.getPrincipalPaid())
.principalWrittenOff(defaultSummaryData.getPrincipalWrittenOff()) .principalWrittenOff(defaultSummaryData.getPrincipalWrittenOff())
.principalOutstanding(defaultSummaryData.getPrincipalOutstanding()) .principalOutstanding(defaultSummaryData.getPrincipalOutstanding())
@@ -21,12 +21,10 @@ package org.apache.fineract.portfolio.loanaccount.service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
import org.apache.fineract.infrastructure.core.domain.ExternalId; import org.apache.fineract.infrastructure.core.domain.ExternalId;
import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.infrastructure.core.service.MathUtil;
import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAdjustTransactionBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAdjustTransactionBusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent;
import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService;
@@ -53,10 +51,9 @@ public class LoanCapitalizedIncomeAmortizationProcessingServiceImpl implements L
@Transactional @Transactional
public void processCapitalizedIncomeAmortizationOnLoanClosure(@NotNull final Loan loan) { public void processCapitalizedIncomeAmortizationOnLoanClosure(@NotNull final Loan loan) {
final LocalDate transactionDate = getFinalCapitalizedIncomeAmortizationTransactionDate(loan); final LocalDate transactionDate = getFinalCapitalizedIncomeAmortizationTransactionDate(loan);
final Optional<LoanTransaction> amortizationTransaction = createCapitalizedIncomeAmortizationTransaction(loan, transactionDate, final LoanTransaction amortizationTransaction = createCapitalizedIncomeAmortizationTransaction(loan, transactionDate, false);
false); businessEventNotifierService
amortizationTransaction.ifPresent(loanTransaction -> businessEventNotifierService .notifyPostBusinessEvent(new LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent(amortizationTransaction));
.notifyPostBusinessEvent(new LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent(loanTransaction)));
} }
@Override @Override
@@ -70,16 +67,13 @@ public class LoanCapitalizedIncomeAmortizationProcessingServiceImpl implements L
transactionDate = DateUtils.getBusinessLocalDate(); transactionDate = DateUtils.getBusinessLocalDate();
} }
final Optional<LoanTransaction> amortizationTransaction = createCapitalizedIncomeAmortizationTransaction(loan, transactionDate, final LoanTransaction amortizationTransaction = createCapitalizedIncomeAmortizationTransaction(loan, transactionDate, true);
true); journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds);
if (amortizationTransaction.isPresent()) { businessEventNotifierService
journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); .notifyPostBusinessEvent(new LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent(amortizationTransaction));
businessEventNotifierService.notifyPostBusinessEvent(
new LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent(amortizationTransaction.get()));
}
} }
private Optional<LoanTransaction> createCapitalizedIncomeAmortizationTransaction(final Loan loan, final LocalDate transactionDate, private LoanTransaction createCapitalizedIncomeAmortizationTransaction(final Loan loan, final LocalDate transactionDate,
final boolean isChargeOff) { final boolean isChargeOff) {
ExternalId externalId = ExternalId.empty(); ExternalId externalId = ExternalId.empty();
BigDecimal totalUnrecognizedAmount = BigDecimal.ZERO; BigDecimal totalUnrecognizedAmount = BigDecimal.ZERO;
@@ -98,17 +92,13 @@ public class LoanCapitalizedIncomeAmortizationProcessingServiceImpl implements L
balance.setUnrecognizedAmount(BigDecimal.ZERO); balance.setUnrecognizedAmount(BigDecimal.ZERO);
} }
if (MathUtil.isLessThanOrEqualZero(totalUnrecognizedAmount)) {
return Optional.empty();
}
final LoanTransaction amortizationTransaction = LoanTransaction.capitalizedIncomeAmortization(loan, loan.getOffice(), final LoanTransaction amortizationTransaction = LoanTransaction.capitalizedIncomeAmortization(loan, loan.getOffice(),
transactionDate, totalUnrecognizedAmount, externalId); transactionDate, totalUnrecognizedAmount, externalId);
loan.addLoanTransaction(amortizationTransaction); loan.addLoanTransaction(amortizationTransaction);
loanTransactionRepository.saveAndFlush(amortizationTransaction); loanTransactionRepository.saveAndFlush(amortizationTransaction);
return Optional.of(amortizationTransaction); return amortizationTransaction;
} }
@Override @Override
@@ -98,7 +98,6 @@ import org.apache.fineract.portfolio.loanaccount.data.LoanApprovalData;
import org.apache.fineract.portfolio.loanaccount.data.LoanChargePaidByData; import org.apache.fineract.portfolio.loanaccount.data.LoanChargePaidByData;
import org.apache.fineract.portfolio.loanaccount.data.LoanInterestRecalculationData; import org.apache.fineract.portfolio.loanaccount.data.LoanInterestRecalculationData;
import org.apache.fineract.portfolio.loanaccount.data.LoanRepaymentScheduleInstallmentData; import org.apache.fineract.portfolio.loanaccount.data.LoanRepaymentScheduleInstallmentData;
import org.apache.fineract.portfolio.loanaccount.data.LoanSchedulePeriodDataWrapper;
import org.apache.fineract.portfolio.loanaccount.data.LoanStatusEnumData; import org.apache.fineract.portfolio.loanaccount.data.LoanStatusEnumData;
import org.apache.fineract.portfolio.loanaccount.data.LoanSummaryData; import org.apache.fineract.portfolio.loanaccount.data.LoanSummaryData;
import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData; import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData;
@@ -119,7 +118,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepaymentPeriodData;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType;
import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
@@ -251,10 +249,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
accountData.getFeeChargesAtDisbursementCharged()); accountData.getFeeChargesAtDisbursementCharged());
final Collection<DisbursementData> disbursementData = retrieveLoanDisbursementDetails(accountData.getId()); final Collection<DisbursementData> disbursementData = retrieveLoanDisbursementDetails(accountData.getId());
List<LoanTransactionRepaymentPeriodData> capitalizedIncomeData = loanCapitalizedIncomeBalanceRepository
.findRepaymentPeriodDataByLoanId(accountData.getId());
final LoanScheduleData repaymentSchedule = retrieveRepaymentSchedule(accountData.getId(), repaymentScheduleRelatedData, final LoanScheduleData repaymentSchedule = retrieveRepaymentSchedule(accountData.getId(), repaymentScheduleRelatedData,
disbursementData, capitalizedIncomeData, accountData.isInterestRecalculationEnabled(), disbursementData, accountData.isInterestRecalculationEnabled(),
LoanScheduleType.fromEnumOptionData(accountData.getLoanScheduleType())); LoanScheduleType.fromEnumOptionData(accountData.getLoanScheduleType()));
accountData.setRepaymentSchedule(repaymentSchedule); accountData.setRepaymentSchedule(repaymentSchedule);
return accountData; return accountData;
@@ -263,15 +259,13 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
@Override @Override
public LoanScheduleData retrieveRepaymentSchedule(final Long loanId, public LoanScheduleData retrieveRepaymentSchedule(final Long loanId,
final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedLoanData, Collection<DisbursementData> disbursementData, final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedLoanData, Collection<DisbursementData> disbursementData,
Collection<LoanTransactionRepaymentPeriodData> capitalizedIncomeData, boolean isInterestRecalculationEnabled, boolean isInterestRecalculationEnabled, LoanScheduleType loanScheduleType) {
LoanScheduleType loanScheduleType) {
try { try {
this.context.authenticatedUser(); this.context.authenticatedUser();
final LoanScheduleResultSetExtractor fullResultsetExtractor = new LoanScheduleResultSetExtractor( final LoanScheduleResultSetExtractor fullResultsetExtractor = new LoanScheduleResultSetExtractor(
repaymentScheduleRelatedLoanData, disbursementData, capitalizedIncomeData, isInterestRecalculationEnabled, repaymentScheduleRelatedLoanData, disbursementData, isInterestRecalculationEnabled, loanScheduleType);
loanScheduleType);
final String sql = "select " + fullResultsetExtractor.schema() + " where ls.loan_id = ? order by ls.loan_id, ls.installment"; final String sql = "select " + fullResultsetExtractor.schema() + " where ls.loan_id = ? order by ls.loan_id, ls.installment";
return this.jdbcTemplate.query(sql, fullResultsetExtractor, loanId); // NOSONAR return this.jdbcTemplate.query(sql, fullResultsetExtractor, loanId); // NOSONAR
@@ -755,7 +749,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
+ " l.expected_disbursedon_date as expectedDisbursementDate, l.disbursedon_date as actualDisbursementDate, dbu.username as disbursedByUsername, dbu.firstname as disbursedByFirstname, dbu.lastname as disbursedByLastname," + " l.expected_disbursedon_date as expectedDisbursementDate, l.disbursedon_date as actualDisbursementDate, dbu.username as disbursedByUsername, dbu.firstname as disbursedByFirstname, dbu.lastname as disbursedByLastname,"
+ " l.closedon_date as closedOnDate, cbu.username as closedByUsername, cbu.firstname as closedByFirstname, cbu.lastname as closedByLastname, l.writtenoffon_date as writtenOffOnDate, " + " l.closedon_date as closedOnDate, cbu.username as closedByUsername, cbu.firstname as closedByFirstname, cbu.lastname as closedByLastname, l.writtenoffon_date as writtenOffOnDate, "
+ " l.expected_firstrepaymenton_date as expectedFirstRepaymentOnDate, l.interest_calculated_from_date as interestChargedFromDate, l.maturedon_date as actualMaturityDate, l.expected_maturedon_date as expectedMaturityDate, " + " l.expected_firstrepaymenton_date as expectedFirstRepaymentOnDate, l.interest_calculated_from_date as interestChargedFromDate, l.maturedon_date as actualMaturityDate, l.expected_maturedon_date as expectedMaturityDate, "
+ " l.principal_amount_proposed as proposedPrincipal, l.principal_amount as principal, l.total_principal_derived as totalPrincipal, l.approved_principal as approvedPrincipal, l.net_disbursal_amount as netDisbursalAmount, l.arrearstolerance_amount as inArrearsTolerance, l.number_of_repayments as numberOfRepayments, l.repay_every as repaymentEvery," + " l.principal_amount_proposed as proposedPrincipal, l.principal_amount as principal, l.approved_principal as approvedPrincipal, l.net_disbursal_amount as netDisbursalAmount, l.arrearstolerance_amount as inArrearsTolerance, l.number_of_repayments as numberOfRepayments, l.repay_every as repaymentEvery,"
+ " l.grace_on_principal_periods as graceOnPrincipalPayment, l.recurring_moratorium_principal_periods as recurringMoratoriumOnPrincipalPeriods, l.grace_on_interest_periods as graceOnInterestPayment, l.grace_interest_free_periods as graceOnInterestCharged,l.grace_on_arrears_ageing as graceOnArrearsAgeing," + " l.grace_on_principal_periods as graceOnPrincipalPayment, l.recurring_moratorium_principal_periods as recurringMoratoriumOnPrincipalPeriods, l.grace_on_interest_periods as graceOnInterestPayment, l.grace_interest_free_periods as graceOnInterestCharged,l.grace_on_arrears_ageing as graceOnArrearsAgeing,"
+ " l.nominal_interest_rate_per_period as interestRatePerPeriod, l.annual_nominal_interest_rate as annualInterestRate, " + " l.nominal_interest_rate_per_period as interestRatePerPeriod, l.annual_nominal_interest_rate as annualInterestRate, "
+ " l.repayment_period_frequency_enum as repaymentFrequencyType, l.interest_period_frequency_enum as interestRateFrequencyType, " + " l.repayment_period_frequency_enum as repaymentFrequencyType, l.interest_period_frequency_enum as interestRateFrequencyType, "
@@ -770,7 +764,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
+ sqlGenerator.escape("name") + sqlGenerator.escape("name")
+ " as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode, " + " as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode, "
+ " l.loan_officer_id as loanOfficerId, s.display_name as loanOfficerName, " + " l.loan_officer_id as loanOfficerId, s.display_name as loanOfficerName, "
+ " l.principal_disbursed_derived as principalDisbursed, l.capitalized_income_derived as totalPrincipalFromCapitalizedIncome, l.principal_repaid_derived as principalPaid," + " l.principal_disbursed_derived as principalDisbursed, l.principal_repaid_derived as principalPaid,"
+ " l.principal_adjustments_derived as principalAdjustments, l.principal_writtenoff_derived as principalWrittenOff," + " l.principal_adjustments_derived as principalAdjustments, l.principal_writtenoff_derived as principalWrittenOff,"
+ " l.fee_adjustments_derived as feeAdjustments, l.penalty_adjustments_derived as penaltyAdjustments," + " l.fee_adjustments_derived as feeAdjustments, l.penalty_adjustments_derived as penaltyAdjustments,"
+ " l.principal_outstanding_derived as principalOutstanding, l.interest_charged_derived as interestCharged," + " l.principal_outstanding_derived as principalOutstanding, l.interest_charged_derived as interestCharged,"
@@ -1029,9 +1023,6 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
// loan summary // loan summary
final BigDecimal principalDisbursed = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalDisbursed"); final BigDecimal principalDisbursed = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalDisbursed");
final BigDecimal totalPrincipal = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "totalPrincipal");
final BigDecimal totalPrincipalFromCapitalizedIncome = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs,
"totalPrincipalFromCapitalizedIncome");
final BigDecimal principalAdjustments = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalAdjustments"); final BigDecimal principalAdjustments = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalAdjustments");
final BigDecimal principalPaid = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalPaid"); final BigDecimal principalPaid = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalPaid");
final BigDecimal principalWrittenOff = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalWrittenOff"); final BigDecimal principalWrittenOff = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalWrittenOff");
@@ -1075,7 +1066,6 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
inArrears = (overdueSinceDate != null); inArrears = (overdueSinceDate != null);
loanSummary = LoanSummaryData.builder().currency(currencyData).principalDisbursed(principalDisbursed) loanSummary = LoanSummaryData.builder().currency(currencyData).principalDisbursed(principalDisbursed)
.totalPrincipal(totalPrincipal).totalPrincipalFromCapitalizedIncome(totalPrincipalFromCapitalizedIncome)
.principalAdjustments(principalAdjustments).principalPaid(principalPaid).principalWrittenOff(principalWrittenOff) .principalAdjustments(principalAdjustments).principalPaid(principalPaid).principalWrittenOff(principalWrittenOff)
.principalOutstanding(principalOutstanding).principalOverdue(principalOverdue).interestCharged(interestCharged) .principalOutstanding(principalOutstanding).principalOverdue(principalOverdue).interestCharged(interestCharged)
.interestPaid(interestPaid).interestWaived(interestWaived).interestWrittenOff(interestWrittenOff) .interestPaid(interestPaid).interestWaived(interestWaived).interestWrittenOff(interestWrittenOff)
@@ -1281,18 +1271,15 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
private final DisbursementData disbursement; private final DisbursementData disbursement;
private final BigDecimal totalFeeChargesDueAtDisbursement; private final BigDecimal totalFeeChargesDueAtDisbursement;
private final Collection<DisbursementData> disbursementData; private final Collection<DisbursementData> disbursementData;
private final Collection<LoanTransactionRepaymentPeriodData> capitalizedIncomeData;
private final LoanScheduleType loanScheduleType; private final LoanScheduleType loanScheduleType;
private LocalDate lastDueDate; private LocalDate lastDueDate;
private BigDecimal outstandingLoanPrincipalBalance; private BigDecimal outstandingLoanPrincipalBalance;
private boolean excludePastUnDisbursed; private boolean excludePastUnDisbursed;
LoanScheduleResultSetExtractor(final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedLoanData, LoanScheduleResultSetExtractor(final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedLoanData,
Collection<DisbursementData> disbursementData, Collection<LoanTransactionRepaymentPeriodData> capitalizedIncomeData, Collection<DisbursementData> disbursementData, boolean isInterestRecalculationEnabled, LoanScheduleType loanScheduleType) {
boolean isInterestRecalculationEnabled, LoanScheduleType loanScheduleType) {
this.currency = repaymentScheduleRelatedLoanData.getCurrency(); this.currency = repaymentScheduleRelatedLoanData.getCurrency();
this.disbursement = repaymentScheduleRelatedLoanData.disbursementData(); this.disbursement = repaymentScheduleRelatedLoanData.disbursementData();
this.capitalizedIncomeData = capitalizedIncomeData;
this.totalFeeChargesDueAtDisbursement = repaymentScheduleRelatedLoanData.getTotalFeeChargesAtDisbursement(); this.totalFeeChargesDueAtDisbursement = repaymentScheduleRelatedLoanData.getTotalFeeChargesAtDisbursement();
this.lastDueDate = this.disbursement.disbursementDate(); this.lastDueDate = this.disbursement.disbursementDate();
this.outstandingLoanPrincipalBalance = this.disbursement.getPrincipal(); this.outstandingLoanPrincipalBalance = this.disbursement.getPrincipal();
@@ -1372,15 +1359,10 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
final LocalDate dueDate = JdbcSupport.getLocalDate(rs, "dueDate"); final LocalDate dueDate = JdbcSupport.getLocalDate(rs, "dueDate");
final LocalDate obligationsMetOnDate = JdbcSupport.getLocalDate(rs, "obligationsMetOnDate"); final LocalDate obligationsMetOnDate = JdbcSupport.getLocalDate(rs, "obligationsMetOnDate");
final boolean complete = rs.getBoolean("complete"); final boolean complete = rs.getBoolean("complete");
BigDecimal disbursedAmount = BigDecimal.ZERO;
List<LoanSchedulePeriodDataWrapper> combinedDataList = new ArrayList<>(); disbursedAmount = processDisbursementData(loanScheduleType, disbursementData, fromDate, dueDate, disbursementPeriodIds,
combinedDataList.addAll( disbursementChargeAmount, waivedChargeAmount, periods);
collectEligibleDisbursementData(loanScheduleType, disbursementData, fromDate, dueDate, disbursementPeriodIds));
combinedDataList.addAll(collectEligibleCapitalizedIncomeData(fromDate, dueDate, disbursementPeriodIds));
combinedDataList.sort(this::sortPeriodDataHolders);
fillLoanSchedulePeriodData(periods, combinedDataList, disbursementChargeAmount, waivedChargeAmount);
BigDecimal disbursedAmount = calculateDisbursedAmount(combinedDataList);
// Add the Charge back or Credits to the initial amount to avoid negative balance // Add the Charge back or Credits to the initial amount to avoid negative balance
final BigDecimal principalCredits = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalCredits"); final BigDecimal principalCredits = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalCredits");
@@ -1491,82 +1473,26 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
totalPaidLate.getAmount(), totalOutstanding.getAmount(), totalCredits.getAmount()); totalPaidLate.getAmount(), totalOutstanding.getAmount(), totalCredits.getAmount());
} }
private List<LoanSchedulePeriodDataWrapper> collectEligibleDisbursementData(LoanScheduleType loanScheduleType, private BigDecimal processDisbursementData(LoanScheduleType loanScheduleType, Collection<DisbursementData> disbursementData,
Collection<DisbursementData> disbursementData, LocalDate fromDate, LocalDate dueDate, Set<Long> disbursementPeriodIds) { LocalDate fromDate, LocalDate dueDate, Set<Long> disbursementPeriodIds, BigDecimal disbursementChargeAmount,
List<LoanSchedulePeriodDataWrapper> disbursementDataList = new ArrayList<>(); BigDecimal waivedChargeAmount, List<LoanSchedulePeriodData> periods) {
// Collect eligible disbursement data BigDecimal disbursedAmount = BigDecimal.ZERO;
for (final DisbursementData data : disbursementData) { for (final DisbursementData data : disbursementData) {
boolean isDueForDisbursement = data.isDueForDisbursement(loanScheduleType, fromDate, dueDate); boolean isDueForDisbursement = data.isDueForDisbursement(loanScheduleType, fromDate, dueDate);
boolean isEligible = ((fromDate.equals(this.disbursement.disbursementDate()) && data.disbursementDate().equals(fromDate)) if (((fromDate.equals(this.disbursement.disbursementDate()) && data.disbursementDate().equals(fromDate))
|| (fromDate.equals(dueDate) && data.disbursementDate().equals(fromDate)) || (fromDate.equals(dueDate) && data.disbursementDate().equals(fromDate))
|| canAddDisbursementData(data, isDueForDisbursement, excludePastUnDisbursed)) || canAddDisbursementData(data, isDueForDisbursement, excludePastUnDisbursed))
&& !disbursementPeriodIds.contains(data.getId()); && !disbursementPeriodIds.contains(data.getId())) {
disbursedAmount = disbursedAmount.add(data.getPrincipal());
if (isEligible) { LoanSchedulePeriodData periodData = createLoanSchedulePeriodData(data, disbursementChargeAmount, waivedChargeAmount);
disbursementDataList.add(new LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true)); periods.add(periodData);
this.outstandingLoanPrincipalBalance = this.outstandingLoanPrincipalBalance.add(periodData.getPrincipalDisbursed());
disbursementPeriodIds.add(data.getId()); disbursementPeriodIds.add(data.getId());
} }
} }
return disbursementDataList;
}
private List<LoanSchedulePeriodDataWrapper> collectEligibleCapitalizedIncomeData(LocalDate fromDate, LocalDate dueDate,
Set<Long> disbursementPeriodIds) {
List<LoanSchedulePeriodDataWrapper> capitalizedIncomeDataList = new ArrayList<>();
// Collect eligible capitalized income data
for (LoanTransactionRepaymentPeriodData data : capitalizedIncomeData) {
boolean isEligible = canAddCapitalizedIncomeData(data, fromDate, dueDate)
&& !disbursementPeriodIds.contains(data.getTransactionId());
if (isEligible) {
capitalizedIncomeDataList.add(new LoanSchedulePeriodDataWrapper(data, data.getDate(), false));
disbursementPeriodIds.add(data.getTransactionId());
}
}
return capitalizedIncomeDataList;
}
private void fillLoanSchedulePeriodData(List<LoanSchedulePeriodData> periods, List<LoanSchedulePeriodDataWrapper> combinedDataList,
BigDecimal disbursementChargeAmount, BigDecimal waivedChargeAmount) {
// Process all collected data in chronological order
for (LoanSchedulePeriodDataWrapper dataItem : combinedDataList) {
LoanSchedulePeriodData periodData;
if (dataItem.isDisbursement()) {
// Process disbursement data
DisbursementData data = (DisbursementData) dataItem.getData();
periodData = createLoanSchedulePeriodData(data, disbursementChargeAmount, waivedChargeAmount);
} else {
// Process capitalized income data
LoanTransactionRepaymentPeriodData data = (LoanTransactionRepaymentPeriodData) dataItem.getData();
periodData = createLoanSchedulePeriodData(data);
}
// Common processing for both data types
periods.add(periodData);
this.outstandingLoanPrincipalBalance = this.outstandingLoanPrincipalBalance.add(periodData.getPrincipalDisbursed());
}
}
private BigDecimal calculateDisbursedAmount(List<LoanSchedulePeriodDataWrapper> combinedDataList) {
BigDecimal disbursedAmount = BigDecimal.ZERO;
for (LoanSchedulePeriodDataWrapper dataItem : combinedDataList) {
if (dataItem.isDisbursement()) {
DisbursementData data = (DisbursementData) dataItem.getData();
disbursedAmount = disbursedAmount.add(data.getPrincipal());
}
}
return disbursedAmount; return disbursedAmount;
} }
private int sortPeriodDataHolders(LoanSchedulePeriodDataWrapper item1, LoanSchedulePeriodDataWrapper item2) {
int dateComparison = item1.getDate().compareTo(item2.getDate());
if (dateComparison == 0 && item1.isDisbursement() != item2.isDisbursement()) {
// If dates are equal, prioritize disbursement data
return item1.isDisbursement() ? -1 : 1;
}
return dateComparison;
}
private LoanSchedulePeriodData createLoanSchedulePeriodData(final DisbursementData data, BigDecimal disbursementChargeAmount, private LoanSchedulePeriodData createLoanSchedulePeriodData(final DisbursementData data, BigDecimal disbursementChargeAmount,
BigDecimal waivedChargeAmount) { BigDecimal waivedChargeAmount) {
BigDecimal chargeAmount = data.getChargeAmount() == null ? disbursementChargeAmount BigDecimal chargeAmount = data.getChargeAmount() == null ? disbursementChargeAmount
@@ -1575,20 +1501,11 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
data.isDisbursed()); data.isDisbursed());
} }
private LoanSchedulePeriodData createLoanSchedulePeriodData(final LoanTransactionRepaymentPeriodData data) {
BigDecimal feeCharges = Objects.isNull(data.getFeeChargesPortion()) ? BigDecimal.ZERO : data.getFeeChargesPortion();
return LoanSchedulePeriodData.disbursementOnlyPeriod(data.getDate(), data.getAmount(), feeCharges, !data.isReversed());
}
private boolean canAddDisbursementData(DisbursementData data, boolean isDueForDisbursement, boolean excludePastUnDisbursed) { private boolean canAddDisbursementData(DisbursementData data, boolean isDueForDisbursement, boolean excludePastUnDisbursed) {
return (!excludePastUnDisbursed || data.isDisbursed() || !DateUtils.isBeforeBusinessDate(data.disbursementDate())) return (!excludePastUnDisbursed || data.isDisbursed() || !DateUtils.isBeforeBusinessDate(data.disbursementDate()))
&& isDueForDisbursement; && isDueForDisbursement;
} }
private boolean canAddCapitalizedIncomeData(LoanTransactionRepaymentPeriodData data, LocalDate fromDate, LocalDate dueDate) {
return !data.isReversed() && DateUtils.isDateInRangeFromInclusiveToExclusive(fromDate, dueDate, data.getDate());
}
} }
private static final class LoanTransactionsMapper implements RowMapper<LoanTransactionData> { private static final class LoanTransactionsMapper implements RowMapper<LoanTransactionData> {
@@ -2251,7 +2168,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.REPAYMENT); final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.REPAYMENT);
final Collection<PaymentTypeData> paymentTypeOptions = this.paymentTypeReadPlatformService.retrieveAllPaymentTypes(); final Collection<PaymentTypeData> paymentTypeOptions = this.paymentTypeReadPlatformService.retrieveAllPaymentTypes();
final BigDecimal outstandingLoanBalance = loanRepaymentScheduleInstallment.getPrincipalOutstanding(currency).getAmount(); final BigDecimal outstandingLoanBalance = loanRepaymentScheduleInstallment.getPrincipalOutstanding(currency).getAmount();
final Boolean isManuallyReversed = false; final Boolean isReversed = false;
final Money outStandingAmount = loanRepaymentScheduleInstallment.getTotalOutstanding(currency); final Money outStandingAmount = loanRepaymentScheduleInstallment.getTotalOutstanding(currency);
@@ -2261,8 +2178,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
loanRepaymentScheduleInstallment.getInterestOutstanding(currency).getAmount(), loanRepaymentScheduleInstallment.getInterestOutstanding(currency).getAmount(),
loanRepaymentScheduleInstallment.getFeeChargesOutstanding(currency).getAmount(), loanRepaymentScheduleInstallment.getFeeChargesOutstanding(currency).getAmount(),
loanRepaymentScheduleInstallment.getPenaltyChargesOutstanding(currency).getAmount(), null, unrecognizedIncomePortion, loanRepaymentScheduleInstallment.getPenaltyChargesOutstanding(currency).getAmount(), null, unrecognizedIncomePortion,
paymentTypeOptions, ExternalId.empty(), null, null, outstandingLoanBalance, isManuallyReversed, loanId, paymentTypeOptions, ExternalId.empty(), null, null, outstandingLoanBalance, isReversed, loanId, loan.getExternalId());
loan.getExternalId());
} }
private static final class CurrencyMapper implements RowMapper<CurrencyData> { private static final class CurrencyMapper implements RowMapper<CurrencyData> {
@@ -64,7 +64,6 @@ import org.apache.fineract.portfolio.loanaccount.service.LoanBalanceService;
import org.apache.fineract.portfolio.loanaccount.service.LoanDownPaymentHandlerService; import org.apache.fineract.portfolio.loanaccount.service.LoanDownPaymentHandlerService;
import org.apache.fineract.portfolio.loanaccount.service.LoanJournalEntryPoster; import org.apache.fineract.portfolio.loanaccount.service.LoanJournalEntryPoster;
import org.apache.fineract.portfolio.loanaccount.service.LoanUtilService; import org.apache.fineract.portfolio.loanaccount.service.LoanUtilService;
import org.apache.fineract.portfolio.loanaccount.service.ReprocessLoanTransactionsService;
import org.apache.fineract.portfolio.note.domain.Note; import org.apache.fineract.portfolio.note.domain.Note;
import org.apache.fineract.portfolio.note.domain.NoteRepository; import org.apache.fineract.portfolio.note.domain.NoteRepository;
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail; import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
@@ -94,7 +93,6 @@ public class LoanAdjustmentServiceImpl implements LoanAdjustmentService {
private final LoanChargeValidator loanChargeValidator; private final LoanChargeValidator loanChargeValidator;
private final LoanJournalEntryPoster journalEntryPoster; private final LoanJournalEntryPoster journalEntryPoster;
private final LoanBalanceService loanBalanceService; private final LoanBalanceService loanBalanceService;
private final ReprocessLoanTransactionsService reprocessLoanTransactionsService;
@Override @Override
public CommandProcessingResult adjustLoanTransaction(Loan loan, LoanTransaction transactionToAdjust, LoanAdjustmentParameter parameter, public CommandProcessingResult adjustLoanTransaction(Loan loan, LoanTransaction transactionToAdjust, LoanAdjustmentParameter parameter,
@@ -247,9 +245,8 @@ public class LoanAdjustmentServiceImpl implements LoanAdjustmentService {
transactionForAdjustment.getTransactionDate()); transactionForAdjustment.getTransactionDate());
if (!transactionForAdjustment.isAccrualRelated() && transactionForAdjustment.isNotRepaymentLikeType() if (!transactionForAdjustment.isAccrualRelated() && transactionForAdjustment.isNotRepaymentLikeType()
&& transactionForAdjustment.isNotWaiver() && transactionForAdjustment.isNotCreditBalanceRefund() && transactionForAdjustment.isNotWaiver() && transactionForAdjustment.isNotCreditBalanceRefund()) {
&& !transactionForAdjustment.isCapitalizedIncome()) { final String errorMessage = "Only (non-reversed) transactions of type repayment, waiver, accrual or credit balance refund can be adjusted.";
final String errorMessage = "Only (non-reversed) transactions of type repayment, waiver, capitalized income, accrual or credit balance refund can be adjusted.";
throw new InvalidLoanTransactionTypeException("transaction", throw new InvalidLoanTransactionTypeException("transaction",
"adjustment.is.only.allowed.to.repayment.or.waiver.or.creditbalancerefund.transactions", errorMessage); "adjustment.is.only.allowed.to.repayment.or.waiver.or.creditbalancerefund.transactions", errorMessage);
} }
@@ -288,10 +285,6 @@ public class LoanAdjustmentServiceImpl implements LoanAdjustmentService {
loanDownPaymentHandlerService.handleRepaymentOrRecoveryOrWaiverTransaction(loan, newTransactionDetail, transactionForAdjustment, loanDownPaymentHandlerService.handleRepaymentOrRecoveryOrWaiverTransaction(loan, newTransactionDetail, transactionForAdjustment,
scheduleGeneratorDTO); scheduleGeneratorDTO);
} }
if (transactionForAdjustment.getTypeOf().equals(LoanTransactionType.CAPITALIZED_INCOME)) {
reprocessLoanTransactionsService.reprocessTransactions(loan);
}
} }
private Loan saveAndFlushLoanWithDataIntegrityViolationChecks(final Loan loan) { private Loan saveAndFlushLoanWithDataIntegrityViolationChecks(final Loan loan) {
@@ -204,13 +204,9 @@ public class NoteWritePlatformServiceJpaRepositoryImpl implements NoteWritePlatf
} }
@Override @Override
public void createLoanTransactionNote(final Long loanTransactionId, final String note) { public void createLoanNote(final Long loanId, final String note) {
final LoanTransaction loanTransaction = this.loanTransactionRepository.findById(loanTransactionId) final Loan loan = this.loanRepository.findOneWithNotFoundDetection(loanId);
.orElseThrow(() -> new LoanTransactionNotFoundException(loanTransactionId)); final Note newNote = Note.loanNote(loan, note);
final Loan loan = loanTransaction.getLoan();
final Note newNote = Note.loanTransactionNote(loan, loanTransaction, note);
this.noteRepository.save(newNote); this.noteRepository.save(newNote);
} }
@@ -196,5 +196,4 @@
<include file="parts/0175_add_fk_acc_product_mapping.xml" relativeToChangelogFile="true" /> <include file="parts/0175_add_fk_acc_product_mapping.xml" relativeToChangelogFile="true" />
<include file="parts/0176_add_capitalized_income_amortization_transaction.xml" relativeToChangelogFile="true" /> <include file="parts/0176_add_capitalized_income_amortization_transaction.xml" relativeToChangelogFile="true" />
<include file="parts/0177_acc_journal_entry_index.xml" relativeToChangelogFile="true" /> <include file="parts/0177_acc_journal_entry_index.xml" relativeToChangelogFile="true" />
<include file="parts/0178_add_principal_from_capitalized_income_to_loan_summary.xml" relativeToChangelogFile="true" />
</databaseChangeLog> </databaseChangeLog>
@@ -1,35 +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 author="fineract" id="1">
<addColumn tableName="m_loan">
<column defaultValueNumeric="0.000000" name="capitalized_income_derived" type="DECIMAL(19, 6)">
<constraints nullable="false"/>
</column>
<column defaultValueNumeric="0.000000" name="total_principal_derived" type="DECIMAL(19, 6)">
<constraints nullable="false"/>
</column>
</addColumn>
</changeSet>
</databaseChangeLog>
@@ -31,6 +31,7 @@ import org.apache.fineract.client.models.PostLoanProductsRequest;
import org.apache.fineract.client.models.PostLoanProductsResponse; import org.apache.fineract.client.models.PostLoanProductsResponse;
import org.apache.fineract.client.models.PostLoansLoanIdChargesChargeIdRequest; import org.apache.fineract.client.models.PostLoansLoanIdChargesChargeIdRequest;
import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleProcessingType; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleProcessingType;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
@@ -72,7 +73,7 @@ public class AdvancedPaymentAllocationWaiveLoanCharges extends BaseLoanIntegrati
Assertions.assertNotNull(waiveTransaction.getLoanChargePaidByList()); Assertions.assertNotNull(waiveTransaction.getLoanChargePaidByList());
Assertions.assertEquals(1, waiveTransaction.getLoanChargePaidByList().size()); Assertions.assertEquals(1, waiveTransaction.getLoanChargePaidByList().size());
Assertions.assertEquals(loanChargeId, waiveTransaction.getLoanChargePaidByList().get(0).getChargeId()); Assertions.assertEquals(loanChargeId, waiveTransaction.getLoanChargePaidByList().get(0).getChargeId());
Assertions.assertEquals(50.0, waiveTransaction.getLoanChargePaidByList().get(0).getAmount()); Assertions.assertEquals(50.0, Utils.getDoubleValue(waiveTransaction.getLoanChargePaidByList().get(0).getAmount()));
}); });
} }
@@ -105,7 +106,7 @@ public class AdvancedPaymentAllocationWaiveLoanCharges extends BaseLoanIntegrati
Assertions.assertNotNull(waiveTransaction.getLoanChargePaidByList()); Assertions.assertNotNull(waiveTransaction.getLoanChargePaidByList());
Assertions.assertEquals(1, waiveTransaction.getLoanChargePaidByList().size()); Assertions.assertEquals(1, waiveTransaction.getLoanChargePaidByList().size());
Assertions.assertEquals(loanChargeId, waiveTransaction.getLoanChargePaidByList().get(0).getChargeId()); Assertions.assertEquals(loanChargeId, waiveTransaction.getLoanChargePaidByList().get(0).getChargeId());
Assertions.assertEquals(50.0, waiveTransaction.getLoanChargePaidByList().get(0).getAmount()); Assertions.assertEquals(50.0, Utils.getDoubleValue(waiveTransaction.getLoanChargePaidByList().get(0).getAmount()));
}); });
} }
@@ -143,7 +144,7 @@ public class AdvancedPaymentAllocationWaiveLoanCharges extends BaseLoanIntegrati
Assertions.assertNotNull(waiveTransaction.getLoanChargePaidByList()); Assertions.assertNotNull(waiveTransaction.getLoanChargePaidByList());
Assertions.assertEquals(1, waiveTransaction.getLoanChargePaidByList().size()); Assertions.assertEquals(1, waiveTransaction.getLoanChargePaidByList().size());
Assertions.assertEquals(loanChargeId, waiveTransaction.getLoanChargePaidByList().get(0).getChargeId()); Assertions.assertEquals(loanChargeId, waiveTransaction.getLoanChargePaidByList().get(0).getChargeId());
Assertions.assertEquals(50.0, waiveTransaction.getLoanChargePaidByList().get(0).getAmount()); Assertions.assertEquals(50.0, Utils.getDoubleValue(waiveTransaction.getLoanChargePaidByList().get(0).getAmount()));
addRepaymentForLoan(loanId, 200.0, "03 January 2023"); addRepaymentForLoan(loanId, 200.0, "03 January 2023");
@@ -5435,9 +5435,9 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
GetLoansLoanIdTransactions replayedTransaction = loanDetails.getTransactions().stream() GetLoansLoanIdTransactions replayedTransaction = loanDetails.getTransactions().stream()
.filter(t -> externalId.equals(t.getExternalId())).findFirst().get(); .filter(t -> externalId.equals(t.getExternalId())).findFirst().get();
assertEquals(10.0, replayedTransaction.getAmount()); assertEquals(10.0, Utils.getDoubleValue(replayedTransaction.getAmount()));
assertEquals(5.0, replayedTransaction.getPenaltyChargesPortion()); assertEquals(5.0, Utils.getDoubleValue(replayedTransaction.getPenaltyChargesPortion()));
assertEquals(5.0, replayedTransaction.getPrincipalPortion()); assertEquals(5.0, Utils.getDoubleValue(replayedTransaction.getPrincipalPortion()));
assertEquals("loanTransactionType.chargeAdjustment", replayedTransaction.getType().getCode()); assertEquals("loanTransactionType.chargeAdjustment", replayedTransaction.getType().getCode());
assertEquals(externalId, replayedTransaction.getExternalId()); assertEquals(externalId, replayedTransaction.getExternalId());
@@ -5549,10 +5549,10 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
List<GetLoansLoanIdRepaymentPeriod> loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); List<GetLoansLoanIdRepaymentPeriod> loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods();
assertEquals(2, loanSchedulePeriods.size()); assertEquals(2, loanSchedulePeriods.size());
assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesDue()));
assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()));
assertEquals(1000.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); assertEquals(1000.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalDueForPeriod()));
assertEquals(1000.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); assertEquals(1000.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()));
LocalDate targetDate = LocalDate.of(2022, 9, 7); LocalDate targetDate = LocalDate.of(2022, 9, 7);
final String penaltyCharge1AddedDate = DATE_TIME_FORMATTER.format(targetDate); final String penaltyCharge1AddedDate = DATE_TIME_FORMATTER.format(targetDate);
@@ -5564,9 +5564,9 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
List<GetLoansLoanIdTransactions> transactions = loanDetails.getTransactions(); List<GetLoansLoanIdTransactions> transactions = loanDetails.getTransactions();
assertEquals(10.0, transactions.get(1).getAmount()); assertEquals(10.0, Utils.getDoubleValue(transactions.get(1).getAmount()));
assertTrue(transactions.get(1).getType().getAccrual()); assertTrue(transactions.get(1).getType().getAccrual());
assertEquals(10.0, transactions.get(1).getPenaltyChargesPortion()); assertEquals(10.0, Utils.getDoubleValue(transactions.get(1).getPenaltyChargesPortion()));
Long accrualTransactionId = transactions.get(1).getId(); Long accrualTransactionId = transactions.get(1).getId();
List<HashMap> journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + accrualTransactionId); List<HashMap> journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + accrualTransactionId);
@@ -5579,15 +5579,15 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods();
assertEquals(2, loanSchedulePeriods.size()); assertEquals(2, loanSchedulePeriods.size());
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesDue()));
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()));
assertEquals(1010.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); assertEquals(1010.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalDueForPeriod()));
assertEquals(1010.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); assertEquals(1010.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()));
GetLoansLoanIdSummary loanSummary = loanDetails.getSummary(); GetLoansLoanIdSummary loanSummary = loanDetails.getSummary();
assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesCharged()));
assertEquals(10.0, loanSummary.getPenaltyChargesOutstanding()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesOutstanding()));
assertEquals(1010.0, loanSummary.getTotalOutstanding()); assertEquals(1010.0, Utils.getDoubleValue(loanSummary.getTotalOutstanding()));
String externalId = UUID.randomUUID().toString(); String externalId = UUID.randomUUID().toString();
PostLoansLoanIdChargesChargeIdResponse chargeAdjustmentResponse = LOAN_TRANSACTION_HELPER.chargeAdjustment((long) loanID, PostLoansLoanIdChargesChargeIdResponse chargeAdjustmentResponse = LOAN_TRANSACTION_HELPER.chargeAdjustment((long) loanID,
@@ -5597,23 +5597,23 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods();
assertEquals(2, loanSchedulePeriods.size()); assertEquals(2, loanSchedulePeriods.size());
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesDue()));
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesPaid()));
assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()));
assertEquals(1010.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); assertEquals(1010.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalDueForPeriod()));
assertEquals(1000.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); assertEquals(1000.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()));
assertEquals(10.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalPaidForPeriod()));
loanSummary = loanDetails.getSummary(); loanSummary = loanDetails.getSummary();
assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesCharged()));
assertEquals(0.0, loanSummary.getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesOutstanding()));
assertEquals(10.0, loanSummary.getPenaltyChargesPaid()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesPaid()));
assertEquals(1000.0, loanSummary.getTotalOutstanding()); assertEquals(1000.0, Utils.getDoubleValue(loanSummary.getTotalOutstanding()));
transactions = loanDetails.getTransactions(); transactions = loanDetails.getTransactions();
assertEquals(10.0, transactions.get(2).getAmount()); assertEquals(10.0, Utils.getDoubleValue(transactions.get(2).getAmount()));
assertTrue(transactions.get(2).getType().getChargeAdjustment()); assertTrue(transactions.get(2).getType().getChargeAdjustment());
assertEquals(10.0, transactions.get(2).getPenaltyChargesPortion()); assertEquals(10.0, Utils.getDoubleValue(transactions.get(2).getPenaltyChargesPortion()));
Long chargeAdjustmentTransactionId = transactions.get(2).getId(); Long chargeAdjustmentTransactionId = transactions.get(2).getId();
journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId);
@@ -5654,9 +5654,9 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
transactions = loanDetails.getTransactions(); transactions = loanDetails.getTransactions();
assertEquals(3.0, transactions.get(2).getAmount()); assertEquals(3.0, Utils.getDoubleValue(transactions.get(2).getAmount()));
assertTrue(transactions.get(2).getType().getAccrual()); assertTrue(transactions.get(2).getType().getAccrual());
assertEquals(3.0, transactions.get(2).getFeeChargesPortion()); assertEquals(3.0, Utils.getDoubleValue(transactions.get(2).getFeeChargesPortion()));
assertTrue(StringUtils.isNotBlank(transactions.get(2).getExternalId())); assertTrue(StringUtils.isNotBlank(transactions.get(2).getExternalId()));
accrualTransactionId = transactions.get(2).getId(); accrualTransactionId = transactions.get(2).getId();
@@ -5670,19 +5670,19 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods();
assertEquals(2, loanSchedulePeriods.size()); assertEquals(2, loanSchedulePeriods.size());
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesDue()));
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()));
assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); assertEquals(3.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesDue()));
assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); assertEquals(3.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesOutstanding()));
assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); assertEquals(1013.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalDueForPeriod()));
assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); assertEquals(1013.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()));
loanSummary = loanDetails.getSummary(); loanSummary = loanDetails.getSummary();
assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesCharged()));
assertEquals(10.0, loanSummary.getPenaltyChargesOutstanding()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesOutstanding()));
assertEquals(3.0, loanSummary.getFeeChargesCharged()); assertEquals(3.0, Utils.getDoubleValue(loanSummary.getFeeChargesCharged()));
assertEquals(3.0, loanSummary.getFeeChargesOutstanding()); assertEquals(3.0, Utils.getDoubleValue(loanSummary.getFeeChargesOutstanding()));
assertEquals(1013.0, loanSummary.getTotalOutstanding()); assertEquals(1013.0, Utils.getDoubleValue(loanSummary.getTotalOutstanding()));
LOAN_TRANSACTION_HELPER.makeLoanRepayment((long) loanID, new PostLoansLoanIdTransactionsRequest().dateFormat(DATETIME_PATTERN) LOAN_TRANSACTION_HELPER.makeLoanRepayment((long) loanID, new PostLoansLoanIdTransactionsRequest().dateFormat(DATETIME_PATTERN)
.transactionDate("11 September 2022").locale("en").transactionAmount(5.0)); .transactionDate("11 September 2022").locale("en").transactionAmount(5.0));
@@ -5695,37 +5695,37 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods();
assertEquals(2, loanSchedulePeriods.size()); assertEquals(2, loanSchedulePeriods.size());
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesDue()));
assertEquals(7.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); assertEquals(7.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesPaid()));
assertEquals(3.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); assertEquals(3.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()));
assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); assertEquals(3.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesDue()));
assertEquals(0.0, loanSchedulePeriods.get(1).getFeeChargesPaid()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesPaid()));
assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); assertEquals(3.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesOutstanding()));
assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalDue()); assertEquals(1000.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPrincipalDue()));
assertEquals(0.0, loanSchedulePeriods.get(1).getPrincipalPaid()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPrincipalPaid()));
assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalOutstanding()); assertEquals(1000.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPrincipalOutstanding()));
assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); assertEquals(1013.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalDueForPeriod()));
assertEquals(1006.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); assertEquals(1006.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()));
assertEquals(7.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); assertEquals(7.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalPaidForPeriod()));
loanSummary = loanDetails.getSummary(); loanSummary = loanDetails.getSummary();
assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesCharged()));
assertEquals(3.0, loanSummary.getPenaltyChargesOutstanding()); assertEquals(3.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesOutstanding()));
assertEquals(7.0, loanSummary.getPenaltyChargesPaid()); assertEquals(7.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesPaid()));
assertEquals(3.0, loanSummary.getFeeChargesCharged()); assertEquals(3.0, Utils.getDoubleValue(loanSummary.getFeeChargesCharged()));
assertEquals(3.0, loanSummary.getFeeChargesOutstanding()); assertEquals(3.0, Utils.getDoubleValue(loanSummary.getFeeChargesOutstanding()));
assertEquals(0.0, loanSummary.getFeeChargesPaid()); assertEquals(0.0, Utils.getDoubleValue(loanSummary.getFeeChargesPaid()));
assertEquals(1000.0, loanSummary.getPrincipalOutstanding()); assertEquals(1000.0, Utils.getDoubleValue(loanSummary.getPrincipalOutstanding()));
assertEquals(0.0, loanSummary.getPrincipalPaid()); assertEquals(0.0, Utils.getDoubleValue(loanSummary.getPrincipalPaid()));
assertEquals(7.0, loanSummary.getTotalRepayment()); assertEquals(7.0, Utils.getDoubleValue(loanSummary.getTotalRepayment()));
assertEquals(1006.0, loanSummary.getTotalOutstanding()); assertEquals(1006.0, Utils.getDoubleValue(loanSummary.getTotalOutstanding()));
transactions = loanDetails.getTransactions(); transactions = loanDetails.getTransactions();
assertEquals(2.0, transactions.get(5).getAmount()); assertEquals(2.0, Utils.getDoubleValue(transactions.get(5).getAmount()));
assertTrue(transactions.get(4).getType().getChargeAdjustment()); assertTrue(transactions.get(4).getType().getChargeAdjustment());
assertEquals(2.0, transactions.get(5).getPenaltyChargesPortion()); assertEquals(2.0, Utils.getDoubleValue(transactions.get(5).getPenaltyChargesPortion()));
assertEquals(0.0, transactions.get(5).getFeeChargesPortion()); assertEquals(0.0, Utils.getDoubleValue(transactions.get(5).getFeeChargesPortion()));
assertEquals(0.0, transactions.get(5).getPrincipalPortion()); assertEquals(0.0, Utils.getDoubleValue(transactions.get(5).getPrincipalPortion()));
chargeAdjustmentTransactionId = transactions.get(5).getId(); chargeAdjustmentTransactionId = transactions.get(5).getId();
journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId);
@@ -5744,37 +5744,37 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods();
assertEquals(2, loanSchedulePeriods.size()); assertEquals(2, loanSchedulePeriods.size());
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesDue()));
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesPaid()));
assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()));
assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); assertEquals(3.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesDue()));
assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesPaid()); assertEquals(3.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesPaid()));
assertEquals(0.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesOutstanding()));
assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalDue()); assertEquals(1000.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPrincipalDue()));
assertEquals(1.0, loanSchedulePeriods.get(1).getPrincipalPaid()); assertEquals(1.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPrincipalPaid()));
assertEquals(999.0, loanSchedulePeriods.get(1).getPrincipalOutstanding()); assertEquals(999.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPrincipalOutstanding()));
assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); assertEquals(1013.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalDueForPeriod()));
assertEquals(999.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); assertEquals(999.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()));
assertEquals(14.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); assertEquals(14.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalPaidForPeriod()));
loanSummary = loanDetails.getSummary(); loanSummary = loanDetails.getSummary();
assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesCharged()));
assertEquals(0.0, loanSummary.getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesOutstanding()));
assertEquals(10.0, loanSummary.getPenaltyChargesPaid()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesPaid()));
assertEquals(3.0, loanSummary.getFeeChargesCharged()); assertEquals(3.0, Utils.getDoubleValue(loanSummary.getFeeChargesCharged()));
assertEquals(0.0, loanSummary.getFeeChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSummary.getFeeChargesOutstanding()));
assertEquals(3.0, loanSummary.getFeeChargesPaid()); assertEquals(3.0, Utils.getDoubleValue(loanSummary.getFeeChargesPaid()));
assertEquals(999.0, loanSummary.getPrincipalOutstanding()); assertEquals(999.0, Utils.getDoubleValue(loanSummary.getPrincipalOutstanding()));
assertEquals(1.0, loanSummary.getPrincipalPaid()); assertEquals(1.0, Utils.getDoubleValue(loanSummary.getPrincipalPaid()));
assertEquals(14.0, loanSummary.getTotalRepayment()); assertEquals(14.0, Utils.getDoubleValue(loanSummary.getTotalRepayment()));
assertEquals(999.0, loanSummary.getTotalOutstanding()); assertEquals(999.0, Utils.getDoubleValue(loanSummary.getTotalOutstanding()));
transactions = loanDetails.getTransactions(); transactions = loanDetails.getTransactions();
assertEquals(7.0, transactions.get(6).getAmount()); assertEquals(7.0, Utils.getDoubleValue(transactions.get(6).getAmount()));
assertTrue(transactions.get(6).getType().getChargeAdjustment()); assertTrue(transactions.get(6).getType().getChargeAdjustment());
assertEquals(3.0, transactions.get(6).getPenaltyChargesPortion()); assertEquals(3.0, Utils.getDoubleValue(transactions.get(6).getPenaltyChargesPortion()));
assertEquals(3.0, transactions.get(6).getFeeChargesPortion()); assertEquals(3.0, Utils.getDoubleValue(transactions.get(6).getFeeChargesPortion()));
assertEquals(1.0, transactions.get(6).getPrincipalPortion()); assertEquals(1.0, Utils.getDoubleValue(transactions.get(6).getPrincipalPortion()));
chargeAdjustmentTransactionId = transactions.get(6).getId(); chargeAdjustmentTransactionId = transactions.get(6).getId();
journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId);
@@ -5810,37 +5810,37 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods();
assertEquals(2, loanSchedulePeriods.size()); assertEquals(2, loanSchedulePeriods.size());
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesDue()));
assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); assertEquals(10.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesPaid()));
assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()));
assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); assertEquals(3.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesDue()));
assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesPaid()); assertEquals(3.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesPaid()));
assertEquals(0.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getFeeChargesOutstanding()));
assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalDue()); assertEquals(1000.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPrincipalDue()));
assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalPaid()); assertEquals(1000.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPrincipalPaid()));
assertEquals(0.0, loanSchedulePeriods.get(1).getPrincipalOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getPrincipalOutstanding()));
assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); assertEquals(1013.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalDueForPeriod()));
assertEquals(0.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); assertEquals(0.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()));
assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); assertEquals(1013.0, Utils.getDoubleValue(loanSchedulePeriods.get(1).getTotalPaidForPeriod()));
loanSummary = loanDetails.getSummary(); loanSummary = loanDetails.getSummary();
assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesCharged()));
assertEquals(0.0, loanSummary.getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesOutstanding()));
assertEquals(10.0, loanSummary.getPenaltyChargesPaid()); assertEquals(10.0, Utils.getDoubleValue(loanSummary.getPenaltyChargesPaid()));
assertEquals(3.0, loanSummary.getFeeChargesCharged()); assertEquals(3.0, Utils.getDoubleValue(loanSummary.getFeeChargesCharged()));
assertEquals(0.0, loanSummary.getFeeChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSummary.getFeeChargesOutstanding()));
assertEquals(3.0, loanSummary.getFeeChargesPaid()); assertEquals(3.0, Utils.getDoubleValue(loanSummary.getFeeChargesPaid()));
assertEquals(0.0, loanSummary.getPrincipalOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSummary.getPrincipalOutstanding()));
assertEquals(1000.0, loanSummary.getPrincipalPaid()); assertEquals(1000.0, Utils.getDoubleValue(loanSummary.getPrincipalPaid()));
assertEquals(1013.0, loanSummary.getTotalRepayment()); assertEquals(1013.0, Utils.getDoubleValue(loanSummary.getTotalRepayment()));
assertEquals(0.0, loanSummary.getTotalOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanSummary.getTotalOutstanding()));
transactions = loanDetails.getTransactions(); transactions = loanDetails.getTransactions();
assertEquals(1.0, transactions.get(8).getAmount()); assertEquals(1.0, Utils.getDoubleValue(transactions.get(8).getAmount()));
assertTrue(transactions.get(8).getType().getChargeAdjustment()); assertTrue(transactions.get(8).getType().getChargeAdjustment());
assertEquals(0.0, transactions.get(8).getPenaltyChargesPortion()); assertEquals(0.0, Utils.getDoubleValue(transactions.get(8).getPenaltyChargesPortion()));
assertEquals(0.0, transactions.get(8).getFeeChargesPortion()); assertEquals(0.0, Utils.getDoubleValue(transactions.get(8).getFeeChargesPortion()));
assertEquals(1.0, transactions.get(8).getPrincipalPortion()); assertEquals(1.0, Utils.getDoubleValue(transactions.get(8).getPrincipalPortion()));
chargeAdjustmentTransactionId = transactions.get(8).getId(); chargeAdjustmentTransactionId = transactions.get(8).getId();
journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId);
@@ -5860,12 +5860,12 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
transactions = loanDetails.getTransactions(); transactions = loanDetails.getTransactions();
assertEquals(1.0, transactions.get(9).getAmount()); assertEquals(1.0, Utils.getDoubleValue(transactions.get(9).getAmount()));
assertTrue(transactions.get(9).getType().getChargeAdjustment()); assertTrue(transactions.get(9).getType().getChargeAdjustment());
assertEquals(0.0, transactions.get(9).getPenaltyChargesPortion()); assertEquals(0.0, Utils.getDoubleValue(transactions.get(9).getPenaltyChargesPortion()));
assertEquals(0.0, transactions.get(9).getFeeChargesPortion()); assertEquals(0.0, Utils.getDoubleValue(transactions.get(9).getFeeChargesPortion()));
assertEquals(0.0, transactions.get(9).getPrincipalPortion()); assertEquals(0.0, Utils.getDoubleValue(transactions.get(9).getPrincipalPortion()));
assertEquals(1.0, transactions.get(9).getOverpaymentPortion()); assertEquals(1.0, Utils.getDoubleValue(transactions.get(9).getOverpaymentPortion()));
chargeAdjustmentTransactionId = transactions.get(9).getId(); chargeAdjustmentTransactionId = transactions.get(9).getId();
journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); journalEntries = JOURNAL_ENTRY_HELPER.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId);
@@ -6227,7 +6227,7 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertEquals(2000.0, loanDetails.getSummary().getTotalOutstanding()); assertEquals(2000.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
assertFalse(loanDetails.getChargedOff()); assertFalse(loanDetails.getChargedOff());
assertNull(loanDetails.getSummary().getChargeOffReasonId()); assertNull(loanDetails.getSummary().getChargeOffReasonId());
assertNull(loanDetails.getSummary().getChargeOffReason()); assertNull(loanDetails.getSummary().getChargeOffReason());
@@ -6253,7 +6253,7 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertEquals(2003.0, loanDetails.getSummary().getTotalOutstanding()); assertEquals(2003.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
assertTrue(loanDetails.getChargedOff()); assertTrue(loanDetails.getChargedOff());
assertEquals((long) chargeOffReasonId, loanDetails.getSummary().getChargeOffReasonId()); assertEquals((long) chargeOffReasonId, loanDetails.getSummary().getChargeOffReasonId());
assertEquals(randomText, loanDetails.getSummary().getChargeOffReason()); assertEquals(randomText, loanDetails.getSummary().getChargeOffReason());
@@ -6264,9 +6264,9 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
GetLoansLoanIdTransactions chargeOffTransaction = loanDetails.getTransactions().get(loanDetails.getTransactions().size() - 1); GetLoansLoanIdTransactions chargeOffTransaction = loanDetails.getTransactions().get(loanDetails.getTransactions().size() - 1);
assertEquals(2003.0, chargeOffTransaction.getAmount()); assertEquals(2003.0, Utils.getDoubleValue(chargeOffTransaction.getAmount()));
assertEquals(2000.0, chargeOffTransaction.getPrincipalPortion()); assertEquals(2000.0, Utils.getDoubleValue(chargeOffTransaction.getPrincipalPortion()));
assertEquals(3.0, chargeOffTransaction.getPenaltyChargesPortion()); assertEquals(3.0, Utils.getDoubleValue(chargeOffTransaction.getPenaltyChargesPortion()));
exception = assertThrows(CallFailedRuntimeException.class, () -> { exception = assertThrows(CallFailedRuntimeException.class, () -> {
errorLoanTransactionHelper.chargeOffLoan((long) loanID, errorLoanTransactionHelper.chargeOffLoan((long) loanID,
@@ -6333,8 +6333,8 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
chargeOffTransaction = loanDetails.getTransactions().get(loanDetails.getTransactions().size() - 1); chargeOffTransaction = loanDetails.getTransactions().get(loanDetails.getTransactions().size() - 1);
assertEquals(1998.0, chargeOffTransaction.getAmount()); assertEquals(1998.0, Utils.getDoubleValue(chargeOffTransaction.getAmount()));
assertEquals(1998.0, chargeOffTransaction.getPrincipalPortion()); assertEquals(1998.0, Utils.getDoubleValue(chargeOffTransaction.getPrincipalPortion()));
LOAN_TRANSACTION_HELPER.makeLoanRepayment((long) loanID, new PostLoansLoanIdTransactionsRequest().dateFormat(DATETIME_PATTERN) LOAN_TRANSACTION_HELPER.makeLoanRepayment((long) loanID, new PostLoansLoanIdTransactionsRequest().dateFormat(DATETIME_PATTERN)
.transactionDate("07 September 2022").locale("en").transactionAmount(5.0)); .transactionDate("07 September 2022").locale("en").transactionAmount(5.0));
@@ -6531,23 +6531,23 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertEquals(300.0, loanDetails.getTotalOverpaid()); assertEquals(300.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate()); assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate());
assertEquals(10.0, loanDetails.getTransactions().get(2).getAmount()); assertEquals(10.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getAmount()));
assertEquals(10.0, loanDetails.getTransactions().get(2).getPrincipalPortion()); assertEquals(10.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate()); assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate());
assertEquals(400.0, loanDetails.getTransactions().get(3).getAmount()); assertEquals(400.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getAmount()));
assertEquals(400.0, loanDetails.getTransactions().get(3).getPrincipalPortion()); assertEquals(400.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate()); assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate());
assertEquals(390.0, loanDetails.getTransactions().get(4).getAmount()); assertEquals(390.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getAmount()));
assertEquals(90.0, loanDetails.getTransactions().get(4).getPrincipalPortion()); assertEquals(90.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getPrincipalPortion()));
assertEquals(300.0, loanDetails.getTransactions().get(4).getOverpaymentPortion()); assertEquals(300.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate()); assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate());
LOAN_TRANSACTION_HELPER.reverseLoanTransaction((long) loanID, loanDetails.getTransactions().get(2).getId(), LOAN_TRANSACTION_HELPER.reverseLoanTransaction((long) loanID, loanDetails.getTransactions().get(2).getId(),
@@ -6556,24 +6556,24 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertEquals(290.0, loanDetails.getTotalOverpaid()); assertEquals(290.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate()); assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate());
assertEquals(10.0, loanDetails.getTransactions().get(2).getAmount()); assertEquals(10.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getAmount()));
assertEquals(10.0, loanDetails.getTransactions().get(2).getPrincipalPortion()); assertEquals(10.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate()); assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate());
assertTrue(loanDetails.getTransactions().get(2).getManuallyReversed()); assertTrue(loanDetails.getTransactions().get(2).getManuallyReversed());
assertEquals(400.0, loanDetails.getTransactions().get(3).getAmount()); assertEquals(400.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getAmount()));
assertEquals(400.0, loanDetails.getTransactions().get(3).getPrincipalPortion()); assertEquals(400.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate()); assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate());
assertEquals(390.0, loanDetails.getTransactions().get(4).getAmount()); assertEquals(390.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getAmount()));
assertEquals(100.0, loanDetails.getTransactions().get(4).getPrincipalPortion()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getPrincipalPortion()));
assertEquals(290.0, loanDetails.getTransactions().get(4).getOverpaymentPortion()); assertEquals(290.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate()); assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate());
LOAN_TRANSACTION_HELPER.reverseLoanTransaction((long) loanID, loanDetails.getTransactions().get(1).getId(), LOAN_TRANSACTION_HELPER.reverseLoanTransaction((long) loanID, loanDetails.getTransactions().get(1).getId(),
@@ -6582,53 +6582,53 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertEquals(210.0, loanDetails.getSummary().getTotalOutstanding()); assertEquals(210.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate()); assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate());
assertTrue(loanDetails.getTransactions().get(2).getManuallyReversed()); assertTrue(loanDetails.getTransactions().get(2).getManuallyReversed());
assertEquals(10.0, loanDetails.getTransactions().get(2).getAmount()); assertEquals(10.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getAmount()));
assertEquals(10.0, loanDetails.getTransactions().get(2).getPrincipalPortion()); assertEquals(10.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate()); assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate());
assertTrue(loanDetails.getTransactions().get(2).getManuallyReversed()); assertTrue(loanDetails.getTransactions().get(2).getManuallyReversed());
assertEquals(400.0, loanDetails.getTransactions().get(3).getAmount()); assertEquals(400.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getAmount()));
assertEquals(400.0, loanDetails.getTransactions().get(3).getPrincipalPortion()); assertEquals(400.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate()); assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate());
assertEquals(390.0, loanDetails.getTransactions().get(4).getAmount()); assertEquals(390.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getAmount()));
assertEquals(390.0, loanDetails.getTransactions().get(4).getPrincipalPortion()); assertEquals(390.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate()); assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate());
LOAN_TRANSACTION_HELPER.makeRepayment("04 September 2022", Float.parseFloat("500"), loanID); LOAN_TRANSACTION_HELPER.makeRepayment("04 September 2022", Float.parseFloat("500"), loanID);
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertEquals(290.0, loanDetails.getTotalOverpaid()); assertEquals(290.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate()); assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate());
assertTrue(loanDetails.getTransactions().get(1).getManuallyReversed()); assertTrue(loanDetails.getTransactions().get(1).getManuallyReversed());
assertEquals(500.0, loanDetails.getTransactions().get(2).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(2).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(2).getDate()); assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(2).getDate());
assertEquals(10.0, loanDetails.getTransactions().get(3).getAmount()); assertEquals(10.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getAmount()));
assertEquals(10.0, loanDetails.getTransactions().get(3).getPrincipalPortion()); assertEquals(10.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(3).getDate()); assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(3).getDate());
assertTrue(loanDetails.getTransactions().get(3).getManuallyReversed()); assertTrue(loanDetails.getTransactions().get(3).getManuallyReversed());
assertEquals(400.0, loanDetails.getTransactions().get(4).getAmount()); assertEquals(400.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getAmount()));
assertEquals(400.0, loanDetails.getTransactions().get(4).getPrincipalPortion()); assertEquals(400.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(4).getDate()); assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(4).getDate());
assertEquals(390.0, loanDetails.getTransactions().get(5).getAmount()); assertEquals(390.0, Utils.getDoubleValue(loanDetails.getTransactions().get(5).getAmount()));
assertEquals(100.0, loanDetails.getTransactions().get(5).getPrincipalPortion()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(5).getPrincipalPortion()));
assertEquals(290.0, loanDetails.getTransactions().get(5).getOverpaymentPortion()); assertEquals(290.0, Utils.getDoubleValue(loanDetails.getTransactions().get(5).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(5).getDate()); assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(5).getDate());
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_AUTO_GENERATED_EXTERNAL_ID, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_AUTO_GENERATED_EXTERNAL_ID,
@@ -6672,7 +6672,7 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
LOAN_TRANSACTION_HELPER.makeRepayment("05 September 2022", Float.parseFloat("1100"), loanID); LOAN_TRANSACTION_HELPER.makeRepayment("05 September 2022", Float.parseFloat("1100"), loanID);
GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertEquals(200.0, loanDetails.getTotalOverpaid()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
assertTrue(loanDetails.getStatus().getOverpaid()); assertTrue(loanDetails.getStatus().getOverpaid());
LOAN_TRANSACTION_HELPER.makeCreditBalanceRefund((long) loanID, new PostLoansLoanIdTransactionsRequest().transactionAmount(200.0) LOAN_TRANSACTION_HELPER.makeCreditBalanceRefund((long) loanID, new PostLoansLoanIdTransactionsRequest().transactionAmount(200.0)
@@ -6682,21 +6682,21 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
assertTrue(loanDetails.getStatus().getClosedObligationsMet()); assertTrue(loanDetails.getStatus().getClosedObligationsMet());
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(1000, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalDue()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalDue()));
assertEquals(100.0, loanDetails.getTransactions().get(1).getAmount()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getAmount()));
assertEquals(100.0, loanDetails.getTransactions().get(1).getPrincipalPortion()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate()); assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate());
assertEquals(900.0, loanDetails.getTransactions().get(1).getOutstandingLoanBalance()); assertEquals(900.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getOutstandingLoanBalance()));
assertEquals(1100.0, loanDetails.getTransactions().get(2).getAmount()); assertEquals(1100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getAmount()));
assertEquals(900.0, loanDetails.getTransactions().get(2).getPrincipalPortion()); assertEquals(900.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getPrincipalPortion()));
assertEquals(200.0, loanDetails.getTransactions().get(2).getOverpaymentPortion()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate()); assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate());
assertEquals(0.0, loanDetails.getTransactions().get(2).getOutstandingLoanBalance()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getOutstandingLoanBalance()));
assertEquals(200.0, loanDetails.getTransactions().get(3).getAmount()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getAmount()));
assertEquals(200.0, loanDetails.getTransactions().get(3).getOverpaymentPortion()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 10, 10), loanDetails.getTransactions().get(3).getDate()); assertEquals(LocalDate.of(2022, 10, 10), loanDetails.getTransactions().get(3).getDate());
assertEquals(0.0, loanDetails.getTransactions().get(3).getOutstandingLoanBalance()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getOutstandingLoanBalance()));
assertEquals(1L, loanDetails.getTransactions().get(3).getPaymentDetailData().getPaymentType().getId()); assertEquals(1L, loanDetails.getTransactions().get(3).getPaymentDetailData().getPaymentType().getId());
GetJournalEntriesTransactionIdResponse journalEntriesForTransaction = JOURNAL_ENTRY_HELPER GetJournalEntriesTransactionIdResponse journalEntriesForTransaction = JOURNAL_ENTRY_HELPER
.getJournalEntries("L" + loanDetails.getTransactions().get(3).getId()); .getJournalEntries("L" + loanDetails.getTransactions().get(3).getId());
@@ -6716,34 +6716,34 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertEquals(100.0, loanDetails.getTransactions().get(1).getAmount()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getAmount()));
assertEquals(100.0, loanDetails.getTransactions().get(1).getPrincipalPortion()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate()); assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate());
assertTrue(loanDetails.getTransactions().get(1).getManuallyReversed()); assertTrue(loanDetails.getTransactions().get(1).getManuallyReversed());
assertEquals(1100.0, loanDetails.getTransactions().get(2).getAmount()); assertEquals(1100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getAmount()));
assertEquals(1000.0, loanDetails.getTransactions().get(2).getPrincipalPortion()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getPrincipalPortion()));
assertEquals(100.0, loanDetails.getTransactions().get(2).getOverpaymentPortion()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate()); assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate());
assertEquals(0.0, loanDetails.getTransactions().get(2).getOutstandingLoanBalance()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getOutstandingLoanBalance()));
assertEquals(1, loanDetails.getTransactions().get(2).getTransactionRelations().size()); assertEquals(1, loanDetails.getTransactions().get(2).getTransactionRelations().size());
assertEquals(200.0, loanDetails.getTransactions().get(3).getAmount()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getAmount()));
assertEquals(100.0, loanDetails.getTransactions().get(3).getPrincipalPortion()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getPrincipalPortion()));
assertEquals(100.0, loanDetails.getTransactions().get(3).getOverpaymentPortion()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getOverpaymentPortion()));
assertEquals(100.0, loanDetails.getTransactions().get(3).getOutstandingLoanBalance()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getOutstandingLoanBalance()));
assertEquals(LocalDate.of(2022, 10, 10), loanDetails.getTransactions().get(3).getDate()); assertEquals(LocalDate.of(2022, 10, 10), loanDetails.getTransactions().get(3).getDate());
assertEquals(1, loanDetails.getTransactions().get(3).getTransactionRelations().size()); assertEquals(1, loanDetails.getTransactions().get(3).getTransactionRelations().size());
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(1000, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalDue()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalDue()));
assertTrue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertTrue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
assertEquals(200, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPrincipalDue()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getPrincipalDue()));
assertFalse(loanDetails.getRepaymentSchedule().getPeriods().get(2).getComplete()); assertFalse(loanDetails.getRepaymentSchedule().getPeriods().get(2).getComplete());
assertEquals(100.0, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPrincipalPaid()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getPrincipalPaid()));
assertEquals(100.0, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPrincipalOutstanding()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getPrincipalOutstanding()));
journalEntriesForTransaction = JOURNAL_ENTRY_HELPER.getJournalEntries("L" + loanDetails.getTransactions().get(3).getId()); journalEntriesForTransaction = JOURNAL_ENTRY_HELPER.getJournalEntries("L" + loanDetails.getTransactions().get(3).getId());
journalItems = journalEntriesForTransaction.getPageItems(); journalItems = journalEntriesForTransaction.getPageItems();
@@ -6808,7 +6808,7 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
LOAN_TRANSACTION_HELPER.makeRepayment("05 September 2022", Float.parseFloat("700"), loanID); LOAN_TRANSACTION_HELPER.makeRepayment("05 September 2022", Float.parseFloat("700"), loanID);
GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); GetLoansLoanIdResponse loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertEquals(200.0, loanDetails.getTotalOverpaid()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
assertTrue(loanDetails.getStatus().getOverpaid()); assertTrue(loanDetails.getStatus().getOverpaid());
LOAN_TRANSACTION_HELPER.makeCreditBalanceRefund((long) loanID, new PostLoansLoanIdTransactionsRequest().transactionAmount(200.0) LOAN_TRANSACTION_HELPER.makeCreditBalanceRefund((long) loanID, new PostLoansLoanIdTransactionsRequest().transactionAmount(200.0)
@@ -6824,33 +6824,33 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
assertTrue(loanDetails.getStatus().getClosedObligationsMet()); assertTrue(loanDetails.getStatus().getClosedObligationsMet());
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(1000, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalDue()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalDue()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate()); assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate());
assertEquals(500.0, loanDetails.getTransactions().get(1).getOutstandingLoanBalance()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getOutstandingLoanBalance()));
assertEquals(700.0, loanDetails.getTransactions().get(2).getAmount()); assertEquals(700.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(2).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getPrincipalPortion()));
assertEquals(200.0, loanDetails.getTransactions().get(2).getOverpaymentPortion()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate()); assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate());
assertEquals(0.0, loanDetails.getTransactions().get(2).getOutstandingLoanBalance()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getOutstandingLoanBalance()));
assertEquals(200.0, loanDetails.getTransactions().get(3).getAmount()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getAmount()));
assertEquals(200.0, loanDetails.getTransactions().get(3).getOverpaymentPortion()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate()); assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate());
assertEquals(0.0, loanDetails.getTransactions().get(3).getOutstandingLoanBalance()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getOutstandingLoanBalance()));
assertEquals(500.0, loanDetails.getTransactions().get(4).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(4).getOverpaymentPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate()); assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate());
assertEquals(0.0, loanDetails.getTransactions().get(4).getOutstandingLoanBalance()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getOutstandingLoanBalance()));
assertEquals(500.0, loanDetails.getTransactions().get(5).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(5).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(5).getOverpaymentPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(5).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 8), loanDetails.getTransactions().get(5).getDate()); assertEquals(LocalDate.of(2022, 9, 8), loanDetails.getTransactions().get(5).getDate());
assertEquals(0.0, loanDetails.getTransactions().get(5).getOutstandingLoanBalance()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getTransactions().get(5).getOutstandingLoanBalance()));
LOAN_TRANSACTION_HELPER.reverseLoanTransaction(loanDetails.getId(), loanDetails.getTransactions().get(2).getId(), LOAN_TRANSACTION_HELPER.reverseLoanTransaction(loanDetails.getId(), loanDetails.getTransactions().get(2).getId(),
new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat(DATETIME_PATTERN).transactionAmount(0.0) new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat(DATETIME_PATTERN).transactionAmount(0.0)
@@ -6858,43 +6858,43 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID); loanDetails = LOAN_TRANSACTION_HELPER.getLoanDetails((long) loanID);
assertEquals(500.0, loanDetails.getTransactions().get(1).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(1).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate()); assertEquals(LocalDate.of(2022, 9, 4), loanDetails.getTransactions().get(1).getDate());
assertEquals(500.0, loanDetails.getTransactions().get(1).getOutstandingLoanBalance()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(1).getOutstandingLoanBalance()));
assertEquals(700.0, loanDetails.getTransactions().get(2).getAmount()); assertEquals(700.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(2).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getPrincipalPortion()));
assertEquals(200.0, loanDetails.getTransactions().get(2).getOverpaymentPortion()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getOverpaymentPortion()));
assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate()); assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(2).getDate());
assertEquals(0.0, loanDetails.getTransactions().get(2).getOutstandingLoanBalance()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getTransactions().get(2).getOutstandingLoanBalance()));
assertTrue(loanDetails.getTransactions().get(2).getManuallyReversed()); assertTrue(loanDetails.getTransactions().get(2).getManuallyReversed());
assertEquals(200.0, loanDetails.getTransactions().get(3).getAmount()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getAmount()));
assertEquals(200.0, loanDetails.getTransactions().get(3).getPrincipalPortion()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate()); assertEquals(LocalDate.of(2022, 9, 6), loanDetails.getTransactions().get(3).getDate());
assertEquals(700.0, loanDetails.getTransactions().get(3).getOutstandingLoanBalance()); assertEquals(700.0, Utils.getDoubleValue(loanDetails.getTransactions().get(3).getOutstandingLoanBalance()));
assertEquals(1, loanDetails.getTransactions().get(3).getTransactionRelations().size()); assertEquals(1, loanDetails.getTransactions().get(3).getTransactionRelations().size());
assertEquals(500.0, loanDetails.getTransactions().get(4).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(4).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate()); assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getTransactions().get(4).getDate());
assertEquals(200.0, loanDetails.getTransactions().get(4).getOutstandingLoanBalance()); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTransactions().get(4).getOutstandingLoanBalance()));
assertEquals(1, loanDetails.getTransactions().get(4).getTransactionRelations().size()); assertEquals(1, loanDetails.getTransactions().get(4).getTransactionRelations().size());
assertEquals(500.0, loanDetails.getTransactions().get(5).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(5).getAmount()));
assertEquals(500.0, loanDetails.getTransactions().get(5).getPrincipalPortion()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getTransactions().get(5).getPrincipalPortion()));
assertEquals(LocalDate.of(2022, 9, 8), loanDetails.getTransactions().get(5).getDate()); assertEquals(LocalDate.of(2022, 9, 8), loanDetails.getTransactions().get(5).getDate());
assertEquals(700.0, loanDetails.getTransactions().get(5).getOutstandingLoanBalance()); assertEquals(700.0, Utils.getDoubleValue(loanDetails.getTransactions().get(5).getOutstandingLoanBalance()));
assertEquals(1, loanDetails.getTransactions().get(5).getTransactionRelations().size()); assertEquals(1, loanDetails.getTransactions().get(5).getTransactionRelations().size());
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(1700, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalDue()); assertEquals(1700.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalDue()));
assertFalse(loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertFalse(loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalPaid()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalPaid()));
assertEquals(700.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()); assertEquals(700.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()));
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_AUTO_GENERATED_EXTERNAL_ID, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_AUTO_GENERATED_EXTERNAL_ID,
@@ -6961,9 +6961,9 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
GetLoansLoanIdTransactions lastAccrualTransaction = loanDetails.getTransactions().stream() GetLoansLoanIdTransactions lastAccrualTransaction = loanDetails.getTransactions().stream()
.filter(t -> Boolean.TRUE.equals(t.getType().getAccrual())).findFirst().get(); .filter(t -> Boolean.TRUE.equals(t.getType().getAccrual())).findFirst().get();
assertEquals(15, lastAccrualTransaction.getAmount()); assertEquals(15.0, Utils.getDoubleValue(lastAccrualTransaction.getAmount()));
assertEquals(5, lastAccrualTransaction.getPenaltyChargesPortion()); assertEquals(5.0, Utils.getDoubleValue(lastAccrualTransaction.getPenaltyChargesPortion()));
assertEquals(10, lastAccrualTransaction.getFeeChargesPortion()); assertEquals(10.0, Utils.getDoubleValue(lastAccrualTransaction.getFeeChargesPortion()));
GetLoansLoanIdTransactionsTransactionIdResponse accrualTransactionDetails = LOAN_TRANSACTION_HELPER GetLoansLoanIdTransactionsTransactionIdResponse accrualTransactionDetails = LOAN_TRANSACTION_HELPER
.getLoanTransactionDetails((long) loanID, lastAccrualTransaction.getId()); .getLoanTransactionDetails((long) loanID, lastAccrualTransaction.getId());
@@ -6971,9 +6971,9 @@ public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest {
assertEquals(2, accrualTransactionDetails.getLoanChargePaidByList().size()); assertEquals(2, accrualTransactionDetails.getLoanChargePaidByList().size());
accrualTransactionDetails.getLoanChargePaidByList().forEach(loanCharge -> { accrualTransactionDetails.getLoanChargePaidByList().forEach(loanCharge -> {
if (loanCharge.getChargeId().equals((long) penalty1LoanChargeId)) { if (loanCharge.getChargeId().equals((long) penalty1LoanChargeId)) {
assertEquals(5, loanCharge.getAmount()); assertEquals(5.0, Utils.getDoubleValue(loanCharge.getAmount()));
} else { } else {
assertEquals(10, loanCharge.getAmount()); assertEquals(10.0, Utils.getDoubleValue(loanCharge.getAmount()));
} }
}); });
@@ -1269,7 +1269,7 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse); loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse);
delinquent = getLoansLoanIdResponse.getDelinquent(); delinquent = getLoansLoanIdResponse.getDelinquent();
assertEquals(amount, delinquent.getDelinquentAmount()); assertEquals(amount, Utils.getDoubleValue(delinquent.getDelinquentAmount()));
assertEquals(LocalDate.parse(date, dateTimeFormatter), delinquent.getDelinquentDate()); assertEquals(LocalDate.parse(date, dateTimeFormatter), delinquent.getDelinquentDate());
assertEquals(delinquentDays, delinquent.getDelinquentDays()); assertEquals(delinquentDays, delinquent.getDelinquentDays());
} }
@@ -1344,7 +1344,7 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse); loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse);
GetLoansLoanIdDelinquencySummary delinquent = getLoansLoanIdResponse.getDelinquent(); GetLoansLoanIdDelinquencySummary delinquent = getLoansLoanIdResponse.getDelinquent();
assertEquals(2049.99, delinquent.getDelinquentAmount()); assertEquals(2049.99, Utils.getDoubleValue(delinquent.getDelinquentAmount()));
assertEquals(LocalDate.of(2012, 2, 1), delinquent.getDelinquentDate()); assertEquals(LocalDate.of(2012, 2, 1), delinquent.getDelinquentDate());
assertEquals(31, delinquent.getDelinquentDays()); assertEquals(31, delinquent.getDelinquentDays());
assertEquals(2, delinquent.getInstallmentLevelDelinquency().size()); assertEquals(2, delinquent.getInstallmentLevelDelinquency().size());
@@ -1395,7 +1395,7 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
assertNotNull(getLoansLoanIdResponse); assertNotNull(getLoansLoanIdResponse);
assertNotNull(getLoansLoanIdResponse.getDelinquent()); assertNotNull(getLoansLoanIdResponse.getDelinquent());
assertEquals(0, getLoansLoanIdResponse.getDelinquent().getDelinquentDays()); assertEquals(0, getLoansLoanIdResponse.getDelinquent().getDelinquentDays());
assertEquals(0, getLoansLoanIdResponse.getDelinquent().getDelinquentAmount()); assertEquals(0.0, Utils.getDoubleValue(getLoansLoanIdResponse.getDelinquent().getDelinquentAmount()));
// Loan Disbursement // Loan Disbursement
disburseLoanAccount(loanTransactionHelper, loanId, operationDate); disburseLoanAccount(loanTransactionHelper, loanId, operationDate);
@@ -1404,7 +1404,7 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
assertNotNull(getLoansLoanIdResponse); assertNotNull(getLoansLoanIdResponse);
assertNotNull(getLoansLoanIdResponse.getDelinquent()); assertNotNull(getLoansLoanIdResponse.getDelinquent());
assertNotEquals(0, getLoansLoanIdResponse.getDelinquent().getDelinquentDays()); assertNotEquals(0, getLoansLoanIdResponse.getDelinquent().getDelinquentDays());
assertNotEquals(0, getLoansLoanIdResponse.getDelinquent().getDelinquentAmount()); assertNotEquals(0, Utils.getDoubleValue(getLoansLoanIdResponse.getDelinquent().getDelinquentAmount()));
} }
@Test @Test
@@ -1459,7 +1459,7 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
assertNotNull(getLoansLoanIdResponse); assertNotNull(getLoansLoanIdResponse);
assertNotNull(delinquent); assertNotNull(delinquent);
assertEquals(0, delinquent.getDelinquentDays()); assertEquals(0, delinquent.getDelinquentDays());
assertEquals(0, delinquent.getDelinquentAmount()); assertEquals(0.0, Utils.getDoubleValue(delinquent.getDelinquentAmount()));
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
@@ -875,8 +875,8 @@ public class ExternalIdSupportIntegrationTest extends BaseLoanIntegrationTest {
GetLoansApprovalTemplateResponse loanApprovalResult = this.loanTransactionHelper.getLoanApprovalTemplate(loanExternalIdStr); GetLoansApprovalTemplateResponse loanApprovalResult = this.loanTransactionHelper.getLoanApprovalTemplate(loanExternalIdStr);
assertEquals(actualDate, loanApprovalResult.getApprovalDate()); assertEquals(actualDate, loanApprovalResult.getApprovalDate());
assertEquals(1000.0, loanApprovalResult.getApprovalAmount()); assertEquals(1000.0, Utils.getDoubleValue(loanApprovalResult.getApprovalAmount()));
assertEquals(1000.0, loanApprovalResult.getNetDisbursalAmount()); assertEquals(1000.0, Utils.getDoubleValue(loanApprovalResult.getNetDisbursalAmount()));
assertNotNull(loanApprovalResult.getCurrency()); assertNotNull(loanApprovalResult.getCurrency());
assertNotNull(loanApprovalResult.getCurrency().getCode()); assertNotNull(loanApprovalResult.getCurrency().getCode());
assertEquals("USD", loanApprovalResult.getCurrency().getCode()); assertEquals("USD", loanApprovalResult.getCurrency().getCode());
@@ -129,16 +129,16 @@ public class LoanAccountArrearsAgeingCOBBusinessStepTest extends BaseLoanIntegra
GetLoansLoanIdSummary loan1Summary = loan1Details.getSummary(); GetLoansLoanIdSummary loan1Summary = loan1Details.getSummary();
assertNotNull(loan1Summary); assertNotNull(loan1Summary);
assertNotNull(loan1Summary.getOverdueSinceDate()); assertNotNull(loan1Summary.getOverdueSinceDate());
assertEquals(loan1Summary.getPrincipalOverdue(), 1000.00); assertEquals(1000.00, Utils.getDoubleValue(loan1Summary.getPrincipalOverdue()));
assertEquals(loan1Summary.getTotalOverdue(), 1000.00); assertEquals(1000.00, Utils.getDoubleValue(loan1Summary.getTotalOverdue()));
// Retrieve Loan 2 with loanId // Retrieve Loan 2 with loanId
GetLoansLoanIdResponse loan2Details = loanTransactionHelper.getLoanDetails((long) loanId_2); GetLoansLoanIdResponse loan2Details = loanTransactionHelper.getLoanDetails((long) loanId_2);
GetLoansLoanIdSummary loan2Summary = loan2Details.getSummary(); GetLoansLoanIdSummary loan2Summary = loan2Details.getSummary();
assertNotNull(loan2Summary); assertNotNull(loan2Summary);
assertNotNull(loan2Summary.getOverdueSinceDate()); assertNotNull(loan2Summary.getOverdueSinceDate());
assertEquals(loan2Summary.getPrincipalOverdue(), 1000.00); assertEquals(1000.00, Utils.getDoubleValue(loan2Summary.getPrincipalOverdue()));
assertEquals(loan2Summary.getTotalOverdue(), 1000.00); assertEquals(1000.00, Utils.getDoubleValue(loan2Summary.getTotalOverdue()));
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
new PutGlobalConfigurationsRequest().enabled(false)); new PutGlobalConfigurationsRequest().enabled(false));
@@ -115,31 +115,35 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// verify schedule is according to expected disbursement date // verify schedule is according to expected disbursement date
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment // fourth installment
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// first disbursement on a future date (7 March 2023) // first disbursement on a future date (7 March 2023)
businessDate = LocalDate.of(2023, 3, 7); businessDate = LocalDate.of(2023, 3, 7);
@@ -155,31 +159,35 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// first installment down payment repayment // first installment down payment repayment
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment // fourth installment
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// make repayment on 7 March to pay down payment installment // make repayment on 7 March to pay down payment installment
final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
@@ -192,35 +200,39 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
assertEquals(375.0, loanDetails.getRepaymentSchedule().getTotalOutstanding()); assertEquals(375.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalOutstanding()));
// first installment down payment repayment // first installment down payment repayment
// check down payment installment gets paid // check down payment installment gets paid
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(125.00, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment // fourth installment
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// set business date // set business date
@@ -240,44 +252,49 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
assertEquals(875.0, loanDetails.getRepaymentSchedule().getTotalOutstanding()); assertEquals(875.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalOutstanding()));
// first installment down payment repayment for 5 March disbursal // first installment down payment repayment for 5 March disbursal
// check down payment installment gets paid // check down payment installment gets paid
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(125.00, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
// second installment down payment repayment for 7 March disbursal // second installment down payment repayment for 7 March disbursal
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(3).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(3).getComplete());
// third installment [5 March 2023 - 5 April 2023] // third installment [5 March 2023 - 5 April 2023]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(250.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(250.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getComplete());
// fourth installment [5 April 2023 - 5 May 2023] // fourth installment [5 April 2023 - 5 May 2023]
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(5).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(5).getPeriod());
assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(5).getFromDate()); assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(5).getFromDate());
assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(5).getDueDate()); assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(5).getDueDate());
assertEquals(250.00, loanDetails.getRepaymentSchedule().getPeriods().get(5).getTotalInstallmentAmountForPeriod()); assertEquals(250.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(5).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(5).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(5).getComplete());
// fifth installment [5 May 2023 - 5 June 2023] // fifth installment [5 May 2023 - 5 June 2023]
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().get(6).getPeriod()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().get(6).getPeriod());
assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(6).getFromDate()); assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(6).getFromDate());
assertEquals(LocalDate.of(2023, 6, 5), loanDetails.getRepaymentSchedule().getPeriods().get(6).getDueDate()); assertEquals(LocalDate.of(2023, 6, 5), loanDetails.getRepaymentSchedule().getPeriods().get(6).getDueDate());
assertEquals(250.00, loanDetails.getRepaymentSchedule().getPeriods().get(6).getTotalInstallmentAmountForPeriod()); assertEquals(250.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(6).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(6).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(6).getComplete());
} finally { } finally {
@@ -339,31 +356,35 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// verify schedule is according to expected disbursement date // verify schedule is according to expected disbursement date
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment // fourth installment
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// first disbursement on a future date (7 March 2023) // first disbursement on a future date (7 March 2023)
@@ -380,31 +401,35 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// first installment down payment repayment for 7 March disbursal // first installment down payment repayment for 7 March disbursal
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second installment [3 March 2023 - 3 April 2023] // second installment [3 March 2023 - 3 April 2023]
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment [3 April 2023 - 3 May 2023] // third installment [3 April 2023 - 3 May 2023]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment [3 May 2023 - 3 June 2023] // fourth installment [3 May 2023 - 3 June 2023]
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// make repayment on 7 March to pay downpayment insatllment // make repayment on 7 March to pay downpayment insatllment
final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
@@ -421,27 +446,31 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(125.00, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
// second installment [3 March 2023 - 3 April 2023] // second installment [3 March 2023 - 3 April 2023]
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment [3 April 2023 - 3 May 2023] // third installment [3 April 2023 - 3 May 2023]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment [3 May 2023 - 3 June 2023] // fourth installment [3 May 2023 - 3 June 2023]
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
businessDate = LocalDate.of(2023, 3, 8); businessDate = LocalDate.of(2023, 3, 8);
@@ -462,36 +491,41 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(125.00, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
// second installment down payment repayment for 7 March disbursal // second installment down payment repayment for 7 March disbursal
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(3).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(3).getComplete());
// third installment [3 March 2023 - 3 April 2023] // third installment [3 March 2023 - 3 April 2023]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(250.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(250.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getComplete());
// fourth installment [3 April 2023 - 3 May 2023] // fourth installment [3 April 2023 - 3 May 2023]
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(5).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(5).getPeriod());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(5).getFromDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(5).getFromDate());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(5).getDueDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(5).getDueDate());
assertEquals(250.00, loanDetails.getRepaymentSchedule().getPeriods().get(5).getTotalInstallmentAmountForPeriod()); assertEquals(250.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(5).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(5).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(5).getComplete());
// fifth installment [3 May 2023 - 3 June 2023] // fifth installment [3 May 2023 - 3 June 2023]
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().get(6).getPeriod()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().get(6).getPeriod());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(6).getFromDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(6).getFromDate());
assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(6).getDueDate()); assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(6).getDueDate());
assertEquals(250.00, loanDetails.getRepaymentSchedule().getPeriods().get(6).getTotalInstallmentAmountForPeriod()); assertEquals(250.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(6).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(6).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(6).getComplete());
} finally { } finally {
@@ -553,31 +587,35 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// verify schedule is according to expected disbursement date // verify schedule is according to expected disbursement date
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment // fourth installment
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// first disbursement on a future date (7 March 2023) // first disbursement on a future date (7 March 2023)
@@ -594,31 +632,35 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// first installment down payment repayment // first installment down payment repayment
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment // fourth installment
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// make repayment on 7 March to pay downpayment insatllment // make repayment on 7 March to pay downpayment insatllment
final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
@@ -632,35 +674,39 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
// check down payment installment gets paid // check down payment installment gets paid
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
assertEquals(375.0, loanDetails.getRepaymentSchedule().getTotalOutstanding()); assertEquals(375.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalOutstanding()));
// first installment down payment repayment // first installment down payment repayment
// check down payment installment gets paid // check down payment installment gets paid
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(125.00, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment // fourth installment
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// set business date to next repayment due business date // set business date to next repayment due business date
businessDate = LocalDate.of(2023, 4, 7); businessDate = LocalDate.of(2023, 4, 7);
@@ -677,36 +723,40 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails); assertNotNull(loanDetails);
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getTotalOutstanding()); assertEquals(250.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalOutstanding()));
// first installment down payment repayment // first installment down payment repayment
// check down payment installment gets paid // check down payment installment gets paid
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(125.00, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
assertEquals(125.00, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(2).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(2).getComplete());
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment // fourth installment
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// make backdate disbursement for 5 march with business date 7 April // make backdate disbursement for 5 march with business date 7 April
@@ -720,44 +770,49 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify transactions get reprocessed and installments paid accordingly // verify transactions get reprocessed and installments paid accordingly
assertEquals(750.0, loanDetails.getRepaymentSchedule().getTotalOutstanding()); assertEquals(750.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalOutstanding()));
// first installment down payment repayment for 5 March disbursal // first installment down payment repayment for 5 March disbursal
// check down payment installment gets paid // check down payment installment gets paid
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(125.00, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
// second installment down payment repayment for 7 March disbursal // second installment down payment repayment for 7 March disbursal
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(125.00,
assertEquals(125.00, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
assertEquals(125.00, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(3).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(3).getComplete());
// third installment [5 March 2023 - 5 April 2023] // third installment [5 March 2023 - 5 April 2023]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(250.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(250.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getComplete());
// fourth installment [5 April 2023 - 5 May 2023] // fourth installment [5 April 2023 - 5 May 2023]
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(5).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(5).getPeriod());
assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(5).getFromDate()); assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(5).getFromDate());
assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(5).getDueDate()); assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(5).getDueDate());
assertEquals(250.00, loanDetails.getRepaymentSchedule().getPeriods().get(5).getTotalInstallmentAmountForPeriod()); assertEquals(250.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(5).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(5).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(5).getComplete());
// fifth installment [5 May 2023 - 5 June 2023] // fifth installment [5 May 2023 - 5 June 2023]
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().get(6).getPeriod()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().get(6).getPeriod());
assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(6).getFromDate()); assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(6).getFromDate());
assertEquals(LocalDate.of(2023, 6, 5), loanDetails.getRepaymentSchedule().getPeriods().get(6).getDueDate()); assertEquals(LocalDate.of(2023, 6, 5), loanDetails.getRepaymentSchedule().getPeriods().get(6).getDueDate());
assertEquals(250.00, loanDetails.getRepaymentSchedule().getPeriods().get(6).getTotalInstallmentAmountForPeriod()); assertEquals(250.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(6).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(6).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(6).getComplete());
} finally { } finally {
@@ -817,30 +872,34 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// verify schedule is according to expected disbursement date // verify schedule is according to expected disbursement date
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// fourth installment // fourth installment
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
// first disbursement on a future date (7 March 2023) // first disbursement on a future date (7 March 2023)
businessDate = LocalDate.of(2023, 3, 7); businessDate = LocalDate.of(2023, 3, 7);
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
@@ -920,26 +979,29 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// verify schedule is according to expected disbursement date // verify schedule is according to expected disbursement date
// first installment // first installment
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(333.34, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(333.34,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// first disbursement on a future date (7 March 2023) // first disbursement on a future date (7 March 2023)
businessDate = LocalDate.of(2023, 3, 7); businessDate = LocalDate.of(2023, 3, 7);
@@ -955,7 +1017,7 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// disbursement period // disbursement period
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(0).getDueDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(0).getDueDate());
@@ -964,19 +1026,22 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(166.67,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(166.67,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(166.66, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(166.66,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// make repayment on 7 March to pay installment // make repayment on 7 March to pay installment
final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
@@ -989,29 +1054,32 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
assertEquals(333.33, loanDetails.getRepaymentSchedule().getTotalOutstanding()); assertEquals(333.33, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalOutstanding()));
// first installment // first installment
// check installment gets paid // check installment gets paid
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(166.67,
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(166.67, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalPaidForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getComplete());
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(166.67,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(166.66, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(166.66,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// set business date // set business date
businessDate = LocalDate.of(2023, 3, 8); businessDate = LocalDate.of(2023, 3, 8);
@@ -1030,8 +1098,8 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
assertEquals(833.33, loanDetails.getRepaymentSchedule().getTotalOutstanding()); assertEquals(833.33, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalOutstanding()));
// verify disbursement period order // verify disbursement period order
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(0).getDueDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(0).getDueDate());
@@ -1042,22 +1110,25 @@ public class LoanAccountBackdatedDisbursementTest extends BaseLoanIntegrationTes
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalPaidForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
assertEquals(166.67, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalPaidForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(2).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(2).getComplete());
// second installment // second installment
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 5), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(3).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(3).getComplete());
// third installment // third installment
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 5), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(333.34, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(333.34,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getComplete()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getComplete());
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
@@ -169,10 +169,11 @@ public class LoanAccountChargeReveseReplayWithAdvancedPaymentAllocationTest exte
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
assertNotNull(loanDetails.getRepaymentSchedule().getPeriods()); assertNotNull(loanDetails.getRepaymentSchedule().getPeriods());
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(20.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPenaltyChargesOutstanding()); assertEquals(20.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPenaltyChargesOutstanding()));
assertEquals(10.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getFeeChargesOutstanding()); assertEquals(10.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getFeeChargesOutstanding()));
assertEquals(900.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()); assertEquals(900.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()));
assertEquals(930.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalOutstandingForPeriod()); assertEquals(930.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalOutstandingForPeriod()));
}); });
} }
@@ -212,10 +213,11 @@ public class LoanAccountChargeReveseReplayWithAdvancedPaymentAllocationTest exte
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
assertNotNull(loanDetails.getRepaymentSchedule().getPeriods()); assertNotNull(loanDetails.getRepaymentSchedule().getPeriods());
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(0.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPenaltyChargesOutstanding()));
assertEquals(0.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getFeeChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getFeeChargesOutstanding()));
assertEquals(930.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()); assertEquals(930.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()));
assertEquals(930.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalOutstandingForPeriod()); assertEquals(930.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalOutstandingForPeriod()));
}); });
} }
@@ -257,10 +259,11 @@ public class LoanAccountChargeReveseReplayWithAdvancedPaymentAllocationTest exte
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
assertNotNull(loanDetails.getRepaymentSchedule().getPeriods()); assertNotNull(loanDetails.getRepaymentSchedule().getPeriods());
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(0.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPenaltyChargesOutstanding()));
assertEquals(0.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getFeeChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getFeeChargesOutstanding()));
assertEquals(930.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()); assertEquals(930.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()));
assertEquals(930.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalOutstandingForPeriod()); assertEquals(930.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalOutstandingForPeriod()));
}); });
} }
@@ -308,10 +311,10 @@ public class LoanAccountChargeReveseReplayWithAdvancedPaymentAllocationTest exte
assertNotNull(loanDetails.getRepaymentSchedule()); assertNotNull(loanDetails.getRepaymentSchedule());
assertNotNull(loanDetails.getRepaymentSchedule().getPeriods()); assertNotNull(loanDetails.getRepaymentSchedule().getPeriods());
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(0.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPenaltyChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPenaltyChargesOutstanding()));
assertEquals(0.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getFeeChargesOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getFeeChargesOutstanding()));
assertEquals(0.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding()));
assertEquals(0.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalOutstandingForPeriod()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalOutstandingForPeriod()));
// adding an extra charge after maturity // adding an extra charge after maturity
updateBusinessDate("11 October 2022"); updateBusinessDate("11 October 2022");
@@ -817,7 +817,7 @@ public class LoanAccountPaymentAllocationWithOverlappingDownPaymentInstallmentTe
private void verifyDisbursementPeriod(GetLoansLoanIdRepaymentPeriod period, LocalDate disbursementDate, double disbursedAmount) { private void verifyDisbursementPeriod(GetLoansLoanIdRepaymentPeriod period, LocalDate disbursementDate, double disbursedAmount) {
assertEquals(disbursementDate, period.getDueDate()); assertEquals(disbursementDate, period.getDueDate());
assertEquals(disbursedAmount, period.getPrincipalLoanBalanceOutstanding()); assertEquals(disbursedAmount, Utils.getDoubleValue(period.getPrincipalLoanBalanceOutstanding()));
} }
private void verifyPeriodDetails(GetLoansLoanIdRepaymentPeriod period, Integer periodNumber, double periodAmount, private void verifyPeriodDetails(GetLoansLoanIdRepaymentPeriod period, Integer periodNumber, double periodAmount,
@@ -826,14 +826,14 @@ public class LoanAccountPaymentAllocationWithOverlappingDownPaymentInstallmentTe
assertEquals(periodNumber, period.getPeriod()); assertEquals(periodNumber, period.getPeriod());
assertEquals(periodFromDate, period.getFromDate()); assertEquals(periodFromDate, period.getFromDate());
assertEquals(periodDueDate, period.getDueDate()); assertEquals(periodDueDate, period.getDueDate());
assertEquals(periodAmount, period.getTotalInstallmentAmountForPeriod()); assertEquals(periodAmount, Utils.getDoubleValue(period.getTotalInstallmentAmountForPeriod()));
assertEquals(periodAmountPaid, period.getTotalPaidForPeriod()); assertEquals(periodAmountPaid, Utils.getDoubleValue(period.getTotalPaidForPeriod()));
assertEquals(principalPaid, period.getPrincipalPaid()); assertEquals(principalPaid, Utils.getDoubleValue(period.getPrincipalPaid()));
assertEquals(outstandingAmount, period.getTotalOutstandingForPeriod()); assertEquals(outstandingAmount, Utils.getDoubleValue(period.getTotalOutstandingForPeriod()));
assertEquals(feeDue, period.getFeeChargesDue()); assertEquals(feeDue, Utils.getDoubleValue(period.getFeeChargesDue()));
assertEquals(feePaid, period.getFeeChargesPaid()); assertEquals(feePaid, Utils.getDoubleValue(period.getFeeChargesPaid()));
assertEquals(penaltyDue, period.getPenaltyChargesDue()); assertEquals(penaltyDue, Utils.getDoubleValue(period.getPenaltyChargesDue()));
assertEquals(penaltyPaid, period.getPenaltyChargesPaid()); assertEquals(penaltyPaid, Utils.getDoubleValue(period.getPenaltyChargesPaid()));
assertEquals(isComplete, period.getComplete()); assertEquals(isComplete, period.getComplete());
} }
@@ -416,7 +416,7 @@ public class LoanAccountRepaymentCalculationTest extends BaseLoanIntegrationTest
assertEquals(expectedPeriodNumber, period.getPeriod()); assertEquals(expectedPeriodNumber, period.getPeriod());
assertEquals(expectedPeriodFromDate, period.getFromDate()); assertEquals(expectedPeriodFromDate, period.getFromDate());
assertEquals(expectedPeriodDueDate, period.getDueDate()); assertEquals(expectedPeriodDueDate, period.getDueDate());
assertEquals(expectedAmount, period.getTotalInstallmentAmountForPeriod()); assertEquals(expectedAmount, Utils.getDoubleValue(period.getTotalInstallmentAmountForPeriod()));
assertEquals(isComplete, period.getComplete()); assertEquals(isComplete, period.getComplete());
} }
@@ -78,7 +78,7 @@ public class LoanCapitalizedIncomeTest extends BaseLoanIntegrationTest {
transaction(100.0, "Disbursement", "01 January 2024"), // transaction(100.0, "Disbursement", "01 January 2024"), //
transaction(50.0, "Capitalized Income", "01 January 2024"), // transaction(50.0, "Capitalized Income", "01 January 2024"), //
transaction(0.55, "Capitalized Income Amortization", "01 January 2024"), // transaction(0.55, "Capitalized Income Amortization", "01 January 2024"), //
transaction(0.03, "Accrual", "02 January 2024"), // transaction(0.02, "Accrual", "02 January 2024"), //
transaction(0.55, "Capitalized Income Amortization", "02 January 2024") // transaction(0.55, "Capitalized Income Amortization", "02 January 2024") //
); );
@@ -89,8 +89,8 @@ public class LoanCapitalizedIncomeTest extends BaseLoanIntegrationTest {
journalEntry(50, deferredIncomeLiabilityAccount, "CREDIT"), // journalEntry(50, deferredIncomeLiabilityAccount, "CREDIT"), //
journalEntry(0.55, deferredIncomeLiabilityAccount, "DEBIT"), // journalEntry(0.55, deferredIncomeLiabilityAccount, "DEBIT"), //
journalEntry(0.55, feeIncomeAccount, "CREDIT"), // journalEntry(0.55, feeIncomeAccount, "CREDIT"), //
journalEntry(0.03, interestReceivableAccount, "DEBIT"), // journalEntry(0.02, interestReceivableAccount, "DEBIT"), //
journalEntry(0.03, interestIncomeAccount, "CREDIT"), // journalEntry(0.02, interestIncomeAccount, "CREDIT"), //
journalEntry(0.55, deferredIncomeLiabilityAccount, "DEBIT"), // journalEntry(0.55, deferredIncomeLiabilityAccount, "DEBIT"), //
journalEntry(0.55, feeIncomeAccount, "CREDIT") // journalEntry(0.55, feeIncomeAccount, "CREDIT") //
); );
@@ -212,24 +212,30 @@ public class LoanChargePaymentWithAdvancedPaymentAllocationTest extends BaseLoan
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails((long) loanId); GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails((long) loanId);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, loanDetails.getRepaymentSchedule().getPeriods().get(2).getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getFeeChargesDue()));
assertEquals(feePortion, loanDetails.getRepaymentSchedule().getPeriods().get(2).getFeeChargesOutstanding()); assertEquals(feePortion,
assertEquals(penaltyPortion, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPenaltyChargesDue()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getFeeChargesOutstanding()));
assertEquals(penaltyPortion, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPenaltyChargesOutstanding()); assertEquals(penaltyPortion,
assertEquals(400.0d, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalDueForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getPenaltyChargesDue()));
assertEquals(400.0d, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalOutstandingForPeriod()); assertEquals(penaltyPortion,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getPenaltyChargesOutstanding()));
assertEquals(400.0d, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalDueForPeriod()));
assertEquals(400.0d,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 16), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 1, 16), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
scheduleJobHelper.executeAndAwaitJob(jobName); scheduleJobHelper.executeAndAwaitJob(jobName);
loanDetails = loanTransactionHelper.getLoanDetails((long) loanId); loanDetails = loanTransactionHelper.getLoanDetails((long) loanId);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, loanDetails.getRepaymentSchedule().getPeriods().get(2).getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getFeeChargesDue()));
assertEquals(0.0d, loanDetails.getRepaymentSchedule().getPeriods().get(2).getFeeChargesOutstanding()); assertEquals(0.0d, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getFeeChargesOutstanding()));
assertEquals(penaltyPortion, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPenaltyChargesDue()); assertEquals(penaltyPortion,
assertEquals(0.0d, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPenaltyChargesOutstanding()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getPenaltyChargesDue()));
assertEquals(400.0d, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalDueForPeriod()); assertEquals(0.0d, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getPenaltyChargesOutstanding()));
assertEquals(250.0d, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalOutstandingForPeriod()); assertEquals(400.0d, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalDueForPeriod()));
assertEquals(250.0d,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 16), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 1, 16), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
@@ -113,7 +113,7 @@ public class LoanChargebackOnPaymentTypeRepaymentTransactionsTest {
assertNotNull(loanDetails); assertNotNull(loanDetails);
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertNotNull(loanDetails.getSummary()); assertNotNull(loanDetails.getSummary());
assertEquals(loanDetails.getSummary().getTotalOutstanding(), 500.0); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
// chargeback on Repayment // chargeback on Repayment
PostLoansLoanIdTransactionsResponse chargebackTransactionResponse = loanTransactionHelper.chargebackLoanTransaction( PostLoansLoanIdTransactionsResponse chargebackTransactionResponse = loanTransactionHelper.chargebackLoanTransaction(
@@ -128,7 +128,7 @@ public class LoanChargebackOnPaymentTypeRepaymentTransactionsTest {
assertNotNull(loanDetails); assertNotNull(loanDetails);
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertNotNull(loanDetails.getSummary()); assertNotNull(loanDetails.getSummary());
assertEquals(loanDetails.getSummary().getTotalOutstanding(), 1000.0); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
// Goodwill Credit // Goodwill Credit
final PostLoansLoanIdTransactionsResponse goodwillCredit_1 = loanTransactionHelper.makeGoodwillCredit((long) loanId, final PostLoansLoanIdTransactionsResponse goodwillCredit_1 = loanTransactionHelper.makeGoodwillCredit((long) loanId,
@@ -142,7 +142,7 @@ public class LoanChargebackOnPaymentTypeRepaymentTransactionsTest {
assertNotNull(loanDetails); assertNotNull(loanDetails);
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertNotNull(loanDetails.getSummary()); assertNotNull(loanDetails.getSummary());
assertEquals(loanDetails.getSummary().getTotalOutstanding(), 800.0); assertEquals(800.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
// chargeback on Goodwill Credit Transaction // chargeback on Goodwill Credit Transaction
chargebackTransactionResponse = loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr, goodwillCredit_1.getResourceId(), chargebackTransactionResponse = loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr, goodwillCredit_1.getResourceId(),
@@ -166,7 +166,7 @@ public class LoanChargebackOnPaymentTypeRepaymentTransactionsTest {
assertNotNull(loanDetails); assertNotNull(loanDetails);
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertNotNull(loanDetails.getSummary()); assertNotNull(loanDetails.getSummary());
assertEquals(loanDetails.getSummary().getTotalOutstanding(), 700.0); assertEquals(700.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
// chargeback on Payout Refund Transaction // chargeback on Payout Refund Transaction
chargebackTransactionResponse = loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr, payoutRefund_1.getResourceId(), chargebackTransactionResponse = loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr, payoutRefund_1.getResourceId(),
@@ -181,7 +181,7 @@ public class LoanChargebackOnPaymentTypeRepaymentTransactionsTest {
assertNotNull(loanDetails); assertNotNull(loanDetails);
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertNotNull(loanDetails.getSummary()); assertNotNull(loanDetails.getSummary());
assertEquals(loanDetails.getSummary().getTotalOutstanding(), 1000.0); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
// Merchant Issued Refund // Merchant Issued Refund
@@ -196,7 +196,7 @@ public class LoanChargebackOnPaymentTypeRepaymentTransactionsTest {
assertNotNull(loanDetails); assertNotNull(loanDetails);
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertNotNull(loanDetails.getSummary()); assertNotNull(loanDetails.getSummary());
assertEquals(loanDetails.getSummary().getTotalOutstanding(), 900.0); assertEquals(900.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
// chargeback on Merchant Issued Refund Transaction // chargeback on Merchant Issued Refund Transaction
chargebackTransactionResponse = loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr, chargebackTransactionResponse = loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr,
@@ -212,7 +212,7 @@ public class LoanChargebackOnPaymentTypeRepaymentTransactionsTest {
assertNotNull(loanDetails); assertNotNull(loanDetails);
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertNotNull(loanDetails.getSummary()); assertNotNull(loanDetails.getSummary());
assertEquals(loanDetails.getSummary().getTotalOutstanding(), 1000.0); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
} }
@@ -35,6 +35,7 @@ import org.apache.fineract.client.models.PostLoansLoanIdResponse;
import org.apache.fineract.client.models.PostLoansRequest; import org.apache.fineract.client.models.PostLoansRequest;
import org.apache.fineract.client.models.PostLoansResponse; import org.apache.fineract.client.models.PostLoansResponse;
import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleProcessingType; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleProcessingType;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
import org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationType; import org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationType;
@@ -1777,10 +1778,10 @@ public class LoanChargebackWithCreditAllocationsIntegrationTests extends BaseLoa
GetLoansLoanIdResponse loanResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId.intValue()); GetLoansLoanIdResponse loanResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId.intValue());
GetLoansLoanIdSummary summary = loanResponse.getSummary(); GetLoansLoanIdSummary summary = loanResponse.getSummary();
Assertions.assertNotNull(summary); Assertions.assertNotNull(summary);
Assertions.assertEquals(creditedPrincipal, summary.getPrincipalAdjustments()); Assertions.assertEquals(creditedPrincipal, Utils.getDoubleValue(summary.getPrincipalAdjustments()));
Assertions.assertEquals(creditedFee, summary.getFeeAdjustments()); Assertions.assertEquals(creditedFee, Utils.getDoubleValue(summary.getFeeAdjustments()));
Assertions.assertEquals(creditedPenalty, summary.getPenaltyAdjustments()); Assertions.assertEquals(creditedPenalty, Utils.getDoubleValue(summary.getPenaltyAdjustments()));
Assertions.assertEquals(totalOutstanding, summary.getTotalOutstanding()); Assertions.assertEquals(totalOutstanding, Utils.getDoubleValue(summary.getTotalOutstanding()));
} }
private Long applyAndApproveLoan(Long clientId, Long loanProductId, int numberOfRepayments) { private Long applyAndApproveLoan(Long clientId, Long loanProductId, int numberOfRepayments) {
@@ -1254,7 +1254,7 @@ public class LoanInterestRefundTest extends BaseLoanIntegrationTest {
Assertions.assertNotNull(loanDetails); Assertions.assertNotNull(loanDetails);
Assertions.assertNotNull(loanDetails.getStatus()); Assertions.assertNotNull(loanDetails.getStatus());
Assertions.assertEquals(700, loanDetails.getStatus().getId()); Assertions.assertEquals(700, loanDetails.getStatus().getId());
Assertions.assertEquals(160.16D, loanDetails.getTotalOverpaid()); Assertions.assertEquals(160.16D, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
}); });
} }
@@ -1630,7 +1630,7 @@ public class LoanInterestRefundTest extends BaseLoanIntegrationTest {
); );
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId); GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
verifyLoanStatus(loanDetails, LoanStatus.OVERPAID); verifyLoanStatus(loanDetails, LoanStatus.OVERPAID);
Assertions.assertEquals(0.36, loanDetails.getTotalOverpaid()); Assertions.assertEquals(0.36, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
}); });
} }
} }
@@ -100,7 +100,7 @@ public class LoanLastRepaymentDetailsTest {
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertNotNull(loanDetails.getDelinquent()); assertNotNull(loanDetails.getDelinquent());
assertNotNull(loanDetails.getDelinquent().getLastRepaymentAmount()); assertNotNull(loanDetails.getDelinquent().getLastRepaymentAmount());
assertEquals(loanDetails.getDelinquent().getLastRepaymentAmount(), 500); assertEquals(500.00, Utils.getDoubleValue(loanDetails.getDelinquent().getLastRepaymentAmount()));
assertNotNull(loanDetails.getDelinquent().getLastRepaymentDate()); assertNotNull(loanDetails.getDelinquent().getLastRepaymentDate());
assertEquals(loanDetails.getDelinquent().getLastRepaymentDate(), lastRepaymentDate_1); assertEquals(loanDetails.getDelinquent().getLastRepaymentDate(), lastRepaymentDate_1);
@@ -117,7 +117,7 @@ public class LoanLastRepaymentDetailsTest {
assertTrue(loanDetails.getStatus().getClosedObligationsMet()); assertTrue(loanDetails.getStatus().getClosedObligationsMet());
assertNotNull(loanDetails.getDelinquent()); assertNotNull(loanDetails.getDelinquent());
assertNotNull(loanDetails.getDelinquent().getLastRepaymentAmount()); assertNotNull(loanDetails.getDelinquent().getLastRepaymentAmount());
assertEquals(loanDetails.getDelinquent().getLastRepaymentAmount(), 500); assertEquals(500.00, Utils.getDoubleValue(loanDetails.getDelinquent().getLastRepaymentAmount()));
assertNotNull(loanDetails.getDelinquent().getLastRepaymentDate()); assertNotNull(loanDetails.getDelinquent().getLastRepaymentDate());
assertEquals(loanDetails.getDelinquent().getLastRepaymentDate(), lastRepaymentDate_2); assertEquals(loanDetails.getDelinquent().getLastRepaymentDate(), lastRepaymentDate_2);
@@ -155,7 +155,7 @@ public class LoanLastRepaymentDetailsTest {
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertNotNull(loanDetails.getDelinquent()); assertNotNull(loanDetails.getDelinquent());
assertNotNull(loanDetails.getDelinquent().getLastRepaymentAmount()); assertNotNull(loanDetails.getDelinquent().getLastRepaymentAmount());
assertEquals(loanDetails.getDelinquent().getLastRepaymentAmount(), 500); assertEquals(500.00, Utils.getDoubleValue(loanDetails.getDelinquent().getLastRepaymentAmount()));
assertNotNull(loanDetails.getDelinquent().getLastRepaymentDate()); assertNotNull(loanDetails.getDelinquent().getLastRepaymentDate());
assertEquals(loanDetails.getDelinquent().getLastRepaymentDate(), lastRepaymentDate_1); assertEquals(loanDetails.getDelinquent().getLastRepaymentDate(), lastRepaymentDate_1);
@@ -171,7 +171,7 @@ public class LoanLastRepaymentDetailsTest {
assertTrue(loanDetails.getStatus().getOverpaid()); assertTrue(loanDetails.getStatus().getOverpaid());
assertNotNull(loanDetails.getDelinquent()); assertNotNull(loanDetails.getDelinquent());
assertNotNull(loanDetails.getDelinquent().getLastRepaymentAmount()); assertNotNull(loanDetails.getDelinquent().getLastRepaymentAmount());
assertEquals(loanDetails.getDelinquent().getLastRepaymentAmount(), 600); assertEquals(600.00, Utils.getDoubleValue(loanDetails.getDelinquent().getLastRepaymentAmount()));
assertNotNull(loanDetails.getDelinquent().getLastRepaymentDate()); assertNotNull(loanDetails.getDelinquent().getLastRepaymentDate());
assertEquals(loanDetails.getDelinquent().getLastRepaymentDate(), lastRepaymentDate_2); assertEquals(loanDetails.getDelinquent().getLastRepaymentDate(), lastRepaymentDate_2);
@@ -170,25 +170,28 @@ public class LoanProductRepaymentStartDateConfigurationTest {
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().size());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// first period [2023-03-03 to 2023-04-03] // first period [2023-03-03 to 2023-04-03]
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second period [2023-04-03 to 2023-05-03] // second period [2023-04-03 to 2023-05-03]
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third period [2023-05-03 to 2023-06-03] // third period [2023-05-03 to 2023-06-03]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(333.34, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(333.34,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// first disbursement on a future date (7 March 2023) // first disbursement on a future date (7 March 2023)
@@ -208,26 +211,29 @@ public class LoanProductRepaymentStartDateConfigurationTest {
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().size());
// verify amounts // verify amounts
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalDisbursed()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalDisbursed()));
// first period [2023-03-03 to 2023-04-03] // first period [2023-03-03 to 2023-04-03]
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(166.67,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second period [2023-04-03 to 2023-05-03] // second period [2023-04-03 to 2023-05-03]
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(166.67,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third period [2023-05-03 to 2023-06-03] // third period [2023-05-03 to 2023-06-03]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(166.66, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(166.66,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// second disbursement next month (7 April 2023) // second disbursement next month (7 April 2023)
@@ -248,26 +254,29 @@ public class LoanProductRepaymentStartDateConfigurationTest {
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalDisbursed()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalDisbursed()));
// first period [2023-03-03 to 2023-04-03] // first period [2023-03-03 to 2023-04-03]
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(166.67,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second period [2023-04-03 to 2023-05-03] // second period [2023-04-03 to 2023-05-03]
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// third period [2023-05-03 to 2023-06-03] // third period [2023-05-03 to 2023-06-03]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 3), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(500.00, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(500.00,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
@@ -327,25 +336,28 @@ public class LoanProductRepaymentStartDateConfigurationTest {
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().size());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
// first period [2023-03-07 to 2023-04-07] // first period [2023-03-07 to 2023-04-07]
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second period [2023-04-07 to 2023-05-07] // second period [2023-04-07 to 2023-05-07]
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third period [2023-05-07 to 2023-06-07] // third period [2023-05-07 to 2023-06-07]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(333.34, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(333.34,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// first disbursement (7 March 2023) // first disbursement (7 March 2023)
@@ -366,26 +378,29 @@ public class LoanProductRepaymentStartDateConfigurationTest {
assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(4, loanDetails.getRepaymentSchedule().getPeriods().size());
// verify amounts // verify amounts
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
assertEquals(500.0, loanDetails.getRepaymentSchedule().getTotalPrincipalDisbursed()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalDisbursed()));
// first period [2023-03-07 to 2023-04-07] // first period [2023-03-07 to 2023-04-07]
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(166.67,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
// second period [2023-04-07 to 2023-05-07] // second period [2023-04-07 to 2023-05-07]
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(166.67, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(166.67,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// third period [2023-05-07 to 2023-06-07] // third period [2023-05-07 to 2023-06-07]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(166.66, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(166.66,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// second disbursement next month (7 April 2023) // second disbursement next month (7 April 2023)
@@ -407,26 +422,29 @@ public class LoanProductRepaymentStartDateConfigurationTest {
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
// verify amounts // verify amounts
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalExpected()));
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getTotalPrincipalDisbursed()); assertEquals(1000.0, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getTotalPrincipalDisbursed()));
// first period [2023-03-07 to 2023-04-07] // first period [2023-03-07 to 2023-04-07]
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate()); assertEquals(LocalDate.of(2023, 3, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getFromDate());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
// second period [2023-04-07 to 2023-05-07] // second period [2023-04-07 to 2023-05-07]
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate()); assertEquals(LocalDate.of(2023, 4, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getFromDate());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(333.33, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(333.33,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
// third period [2023-05-07 to 2023-06-07] // third period [2023-05-07 to 2023-06-07]
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate()); assertEquals(LocalDate.of(2023, 5, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getFromDate());
assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 6, 7), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(333.34, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(333.34,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
@@ -160,7 +160,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
.anyMatch(period -> expectedDownPaymentAmount.equals(Utils.getDoubleValue(period.getTotalPaidForPeriod())) // .anyMatch(period -> expectedDownPaymentAmount.equals(Utils.getDoubleValue(period.getTotalPaidForPeriod())) //
&& expectedDownPaymentDueDate.equals(period.getDueDate()))); && expectedDownPaymentDueDate.equals(period.getDueDate())));
assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(summary.getTotalOutstanding())); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(summary.getTotalOutstanding()));
assertEquals(expectedDownPaymentAmount, summary.getTotalRepaymentTransaction()); assertEquals(expectedDownPaymentAmount, Utils.getDoubleValue(summary.getTotalRepaymentTransaction()));
assertTrue(periods.stream().anyMatch(period -> expectedRepaymentAmount.equals(Utils.getDoubleValue(period.getTotalDueForPeriod())) assertTrue(periods.stream().anyMatch(period -> expectedRepaymentAmount.equals(Utils.getDoubleValue(period.getTotalDueForPeriod()))
&& expectedRepaymentDueDate.equals(period.getDueDate()))); && expectedRepaymentDueDate.equals(period.getDueDate())));
} }
@@ -363,30 +363,31 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
LocalDate expectedThirdRepaymentDueDate = LocalDate.of(2022, 12, 3); LocalDate expectedThirdRepaymentDueDate = LocalDate.of(2022, 12, 3);
Double outstandingBalanceOnThirdRepayment = 0.00; Double outstandingBalanceOnThirdRepayment = 0.00;
assertEquals(expectedDownPaymentAmount, summary.getTotalRepaymentTransaction()); assertEquals(expectedDownPaymentAmount, Utils.getDoubleValue(summary.getTotalRepaymentTransaction()));
GetLoansLoanIdRepaymentPeriod firstDisbursementPeriod = periods.get(0); GetLoansLoanIdRepaymentPeriod firstDisbursementPeriod = periods.get(0);
assertEquals(expectedDownPaymentDueDate, firstDisbursementPeriod.getDueDate()); assertEquals(expectedDownPaymentDueDate, firstDisbursementPeriod.getDueDate());
assertEquals(expectedOutstandingLoanBalanceOnDisbursement, firstDisbursementPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(expectedOutstandingLoanBalanceOnDisbursement,
Utils.getDoubleValue(firstDisbursementPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod firstDownPaymentPeriod = periods.get(1); GetLoansLoanIdRepaymentPeriod firstDownPaymentPeriod = periods.get(1);
assertEquals(expectedDownPaymentAmount, firstDownPaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedDownPaymentAmount, Utils.getDoubleValue(firstDownPaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedDownPaymentDueDate, firstDownPaymentPeriod.getDueDate()); assertEquals(expectedDownPaymentDueDate, firstDownPaymentPeriod.getDueDate());
GetLoansLoanIdRepaymentPeriod firstRepaymentPeriod = periods.get(2); GetLoansLoanIdRepaymentPeriod firstRepaymentPeriod = periods.get(2);
assertEquals(expectedRepaymentAmount, firstRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(firstRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedFirstRepaymentDueDate, firstRepaymentPeriod.getDueDate()); assertEquals(expectedFirstRepaymentDueDate, firstRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnFirstRepayment, firstRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnFirstRepayment, Utils.getDoubleValue(firstRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod secondRepaymentPeriod = periods.get(3); GetLoansLoanIdRepaymentPeriod secondRepaymentPeriod = periods.get(3);
assertEquals(expectedRepaymentAmount, secondRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(secondRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedSecondRepaymentDueDate, secondRepaymentPeriod.getDueDate()); assertEquals(expectedSecondRepaymentDueDate, secondRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnSecondRepayment, secondRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnSecondRepayment, Utils.getDoubleValue(secondRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod thirdRepaymentPeriod = periods.get(4); GetLoansLoanIdRepaymentPeriod thirdRepaymentPeriod = periods.get(4);
assertEquals(expectedRepaymentAmount, thirdRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(thirdRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedThirdRepaymentDueDate, thirdRepaymentPeriod.getDueDate()); assertEquals(expectedThirdRepaymentDueDate, thirdRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnThirdRepayment, thirdRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnThirdRepayment, Utils.getDoubleValue(thirdRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
} }
@Test @Test
@@ -441,38 +442,40 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
Double outstandingBalanceOnThirdRepayment = 0.00; Double outstandingBalanceOnThirdRepayment = 0.00;
Double expectedTotalRepaymentAmount = expectedFirstDownPaymentAmount + expectedSecondDownPaymentAmount; Double expectedTotalRepaymentAmount = expectedFirstDownPaymentAmount + expectedSecondDownPaymentAmount;
assertEquals(expectedTotalRepaymentAmount, summary.getTotalRepaymentTransaction()); assertEquals(expectedTotalRepaymentAmount, Utils.getDoubleValue(summary.getTotalRepaymentTransaction()));
GetLoansLoanIdRepaymentPeriod firstDisbursementPeriod = periods.get(0); GetLoansLoanIdRepaymentPeriod firstDisbursementPeriod = periods.get(0);
assertEquals(expectedFirstDownPaymentDueDate, firstDisbursementPeriod.getDueDate()); assertEquals(expectedFirstDownPaymentDueDate, firstDisbursementPeriod.getDueDate());
assertEquals(expectedOutstandingLoanBalanceOnFirstDisbursement, firstDisbursementPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(expectedOutstandingLoanBalanceOnFirstDisbursement,
Utils.getDoubleValue(firstDisbursementPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod firstDownPaymentPeriod = periods.get(1); GetLoansLoanIdRepaymentPeriod firstDownPaymentPeriod = periods.get(1);
assertEquals(expectedFirstDownPaymentAmount, firstDownPaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedFirstDownPaymentAmount, Utils.getDoubleValue(firstDownPaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedFirstDownPaymentDueDate, firstDownPaymentPeriod.getDueDate()); assertEquals(expectedFirstDownPaymentDueDate, firstDownPaymentPeriod.getDueDate());
GetLoansLoanIdRepaymentPeriod secondDisbursementPeriod = periods.get(2); GetLoansLoanIdRepaymentPeriod secondDisbursementPeriod = periods.get(2);
assertEquals(expectedSecondDownPaymentDueDate, secondDisbursementPeriod.getDueDate()); assertEquals(expectedSecondDownPaymentDueDate, secondDisbursementPeriod.getDueDate());
assertEquals(expectedOutstandingLoanBalanceOnSecondDisbursement, secondDisbursementPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(expectedOutstandingLoanBalanceOnSecondDisbursement,
Utils.getDoubleValue(secondDisbursementPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod secondDownPaymentPeriod = periods.get(3); GetLoansLoanIdRepaymentPeriod secondDownPaymentPeriod = periods.get(3);
assertEquals(expectedSecondDownPaymentAmount, secondDownPaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedSecondDownPaymentAmount, Utils.getDoubleValue(secondDownPaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedSecondDownPaymentDueDate, secondDownPaymentPeriod.getDueDate()); assertEquals(expectedSecondDownPaymentDueDate, secondDownPaymentPeriod.getDueDate());
GetLoansLoanIdRepaymentPeriod firstRepaymentPeriod = periods.get(4); GetLoansLoanIdRepaymentPeriod firstRepaymentPeriod = periods.get(4);
assertEquals(expectedRepaymentAmount, firstRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(firstRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedFirstRepaymentDueDate, firstRepaymentPeriod.getDueDate()); assertEquals(expectedFirstRepaymentDueDate, firstRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnFirstRepayment, firstRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnFirstRepayment, Utils.getDoubleValue(firstRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod secondRepaymentPeriod = periods.get(5); GetLoansLoanIdRepaymentPeriod secondRepaymentPeriod = periods.get(5);
assertEquals(expectedRepaymentAmount, secondRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(secondRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedSecondRepaymentDueDate, secondRepaymentPeriod.getDueDate()); assertEquals(expectedSecondRepaymentDueDate, secondRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnSecondRepayment, secondRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnSecondRepayment, Utils.getDoubleValue(secondRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod thirdRepaymentPeriod = periods.get(6); GetLoansLoanIdRepaymentPeriod thirdRepaymentPeriod = periods.get(6);
assertEquals(expectedRepaymentAmount, thirdRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(thirdRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedThirdRepaymentDueDate, thirdRepaymentPeriod.getDueDate()); assertEquals(expectedThirdRepaymentDueDate, thirdRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnThirdRepayment, thirdRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnThirdRepayment, Utils.getDoubleValue(thirdRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
} }
@Test @Test
@@ -605,39 +608,41 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
Double outstandingBalanceOnThirdRepayment = 0.00; Double outstandingBalanceOnThirdRepayment = 0.00;
Double expectedTotalRepaymentAmount = expectedFirstDownPaymentAmount + expectedSecondDownPaymentAmount; Double expectedTotalRepaymentAmount = expectedFirstDownPaymentAmount + expectedSecondDownPaymentAmount;
assertEquals(expectedTotalRepaymentAmount, summary.getTotalRepaymentTransaction()); assertEquals(expectedTotalRepaymentAmount, Utils.getDoubleValue(summary.getTotalRepaymentTransaction()));
GetLoansLoanIdRepaymentPeriod firstDisbursementPeriod = periods.get(0); GetLoansLoanIdRepaymentPeriod firstDisbursementPeriod = periods.get(0);
assertEquals(expectedFirstDownPaymentDueDate, firstDisbursementPeriod.getDueDate()); assertEquals(expectedFirstDownPaymentDueDate, firstDisbursementPeriod.getDueDate());
assertEquals(expectedOutstandingLoanBalanceOnFirstDisbursement, firstDisbursementPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(expectedOutstandingLoanBalanceOnFirstDisbursement,
Utils.getDoubleValue(firstDisbursementPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod firstDownPaymentPeriod = periods.get(1); GetLoansLoanIdRepaymentPeriod firstDownPaymentPeriod = periods.get(1);
assertEquals(expectedFirstDownPaymentAmount, firstDownPaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedFirstDownPaymentAmount, Utils.getDoubleValue(firstDownPaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedFirstDownPaymentDueDate, firstDownPaymentPeriod.getDueDate()); assertEquals(expectedFirstDownPaymentDueDate, firstDownPaymentPeriod.getDueDate());
GetLoansLoanIdRepaymentPeriod secondDisbursementPeriod = periods.get(2); GetLoansLoanIdRepaymentPeriod secondDisbursementPeriod = periods.get(2);
assertEquals(expectedSecondDownPaymentDueDate, secondDisbursementPeriod.getDueDate()); assertEquals(expectedSecondDownPaymentDueDate, secondDisbursementPeriod.getDueDate());
assertEquals(expectedOutstandingLoanBalanceOnSecondDisbursement, secondDisbursementPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(expectedOutstandingLoanBalanceOnSecondDisbursement,
Utils.getDoubleValue(secondDisbursementPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod secondDownPaymentPeriod = periods.get(3); GetLoansLoanIdRepaymentPeriod secondDownPaymentPeriod = periods.get(3);
assertEquals(expectedSecondDownPaymentAmount, secondDownPaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedSecondDownPaymentAmount, Utils.getDoubleValue(secondDownPaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedSecondDownPaymentDueDate, secondDownPaymentPeriod.getDueDate()); assertEquals(expectedSecondDownPaymentDueDate, secondDownPaymentPeriod.getDueDate());
GetLoansLoanIdRepaymentPeriod firstRepaymentPeriod = periods.get(4); GetLoansLoanIdRepaymentPeriod firstRepaymentPeriod = periods.get(4);
assertEquals(expectedRepaymentAmount, firstRepaymentPeriod.getPrincipalDue()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(firstRepaymentPeriod.getPrincipalDue()));
assertEquals(expectedRepaymentTotalDueWithCharge, firstRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentTotalDueWithCharge, Utils.getDoubleValue(firstRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedFirstRepaymentDueDate, firstRepaymentPeriod.getDueDate()); assertEquals(expectedFirstRepaymentDueDate, firstRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnFirstRepayment, firstRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnFirstRepayment, Utils.getDoubleValue(firstRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod secondRepaymentPeriod = periods.get(5); GetLoansLoanIdRepaymentPeriod secondRepaymentPeriod = periods.get(5);
assertEquals(expectedRepaymentAmount, secondRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(secondRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedSecondRepaymentDueDate, secondRepaymentPeriod.getDueDate()); assertEquals(expectedSecondRepaymentDueDate, secondRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnSecondRepayment, secondRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnSecondRepayment, Utils.getDoubleValue(secondRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod thirdRepaymentPeriod = periods.get(6); GetLoansLoanIdRepaymentPeriod thirdRepaymentPeriod = periods.get(6);
assertEquals(expectedRepaymentAmount, thirdRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(thirdRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedThirdRepaymentDueDate, thirdRepaymentPeriod.getDueDate()); assertEquals(expectedThirdRepaymentDueDate, thirdRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnThirdRepayment, thirdRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnThirdRepayment, Utils.getDoubleValue(thirdRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
} }
@Test @Test
@@ -775,44 +780,46 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
Double outstandingBalanceOnThirdRepayment = 0.00; Double outstandingBalanceOnThirdRepayment = 0.00;
Double expectedTotalRepaymentAmount = expectedFirstDownPaymentAmount + expectedSecondDownPaymentAmount; Double expectedTotalRepaymentAmount = expectedFirstDownPaymentAmount + expectedSecondDownPaymentAmount;
assertEquals(expectedTotalRepaymentAmount, summary.getTotalRepaymentTransaction()); assertEquals(expectedTotalRepaymentAmount, Utils.getDoubleValue(summary.getTotalRepaymentTransaction()));
GetLoansLoanIdRepaymentPeriod firstDisbursementPeriod = periods.get(0); GetLoansLoanIdRepaymentPeriod firstDisbursementPeriod = periods.get(0);
assertEquals(expectedFirstDownPaymentDueDate, firstDisbursementPeriod.getDueDate()); assertEquals(expectedFirstDownPaymentDueDate, firstDisbursementPeriod.getDueDate());
assertEquals(expectedOutstandingLoanBalanceOnFirstDisbursement, firstDisbursementPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(expectedOutstandingLoanBalanceOnFirstDisbursement,
Utils.getDoubleValue(firstDisbursementPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod firstDownPaymentPeriod = periods.get(1); GetLoansLoanIdRepaymentPeriod firstDownPaymentPeriod = periods.get(1);
assertEquals(expectedFirstDownPaymentAmount, firstDownPaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedFirstDownPaymentAmount, Utils.getDoubleValue(firstDownPaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedFirstDownPaymentDueDate, firstDownPaymentPeriod.getDueDate()); assertEquals(expectedFirstDownPaymentDueDate, firstDownPaymentPeriod.getDueDate());
assertEquals(expectedDownPaymentInterest, firstDownPaymentPeriod.getInterestDue()); assertEquals(expectedDownPaymentInterest, Utils.getDoubleValue(firstDownPaymentPeriod.getInterestDue()));
GetLoansLoanIdRepaymentPeriod secondDisbursementPeriod = periods.get(2); GetLoansLoanIdRepaymentPeriod secondDisbursementPeriod = periods.get(2);
assertEquals(expectedSecondDownPaymentDueDate, secondDisbursementPeriod.getDueDate()); assertEquals(expectedSecondDownPaymentDueDate, secondDisbursementPeriod.getDueDate());
assertEquals(expectedOutstandingLoanBalanceOnSecondDisbursement, secondDisbursementPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(expectedOutstandingLoanBalanceOnSecondDisbursement,
Utils.getDoubleValue(secondDisbursementPeriod.getPrincipalLoanBalanceOutstanding()));
GetLoansLoanIdRepaymentPeriod secondDownPaymentPeriod = periods.get(3); GetLoansLoanIdRepaymentPeriod secondDownPaymentPeriod = periods.get(3);
assertEquals(expectedSecondDownPaymentAmount, secondDownPaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedSecondDownPaymentAmount, Utils.getDoubleValue(secondDownPaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedSecondDownPaymentDueDate, secondDownPaymentPeriod.getDueDate()); assertEquals(expectedSecondDownPaymentDueDate, secondDownPaymentPeriod.getDueDate());
assertEquals(expectedDownPaymentInterest, secondDownPaymentPeriod.getInterestDue()); assertEquals(expectedDownPaymentInterest, Utils.getDoubleValue(secondDownPaymentPeriod.getInterestDue()));
GetLoansLoanIdRepaymentPeriod firstRepaymentPeriod = periods.get(4); GetLoansLoanIdRepaymentPeriod firstRepaymentPeriod = periods.get(4);
assertEquals(expectedRepaymentAmount, firstRepaymentPeriod.getPrincipalDue()); assertEquals(expectedRepaymentAmount, Utils.getDoubleValue(firstRepaymentPeriod.getPrincipalDue()));
assertEquals(expectedRepaymentTotalDueWithChargeAndInterest, firstRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentTotalDueWithChargeAndInterest, Utils.getDoubleValue(firstRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedFirstRepaymentDueDate, firstRepaymentPeriod.getDueDate()); assertEquals(expectedFirstRepaymentDueDate, firstRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnFirstRepayment, firstRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnFirstRepayment, Utils.getDoubleValue(firstRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
assertEquals(expectedRepaymentInterest, firstRepaymentPeriod.getInterestDue()); assertEquals(expectedRepaymentInterest, Utils.getDoubleValue(firstRepaymentPeriod.getInterestDue()));
GetLoansLoanIdRepaymentPeriod secondRepaymentPeriod = periods.get(5); GetLoansLoanIdRepaymentPeriod secondRepaymentPeriod = periods.get(5);
assertEquals(expectedRepaymentAmountWithInterest, secondRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmountWithInterest, Utils.getDoubleValue(secondRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedSecondRepaymentDueDate, secondRepaymentPeriod.getDueDate()); assertEquals(expectedSecondRepaymentDueDate, secondRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnSecondRepayment, secondRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnSecondRepayment, Utils.getDoubleValue(secondRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
assertEquals(expectedRepaymentInterest, secondRepaymentPeriod.getInterestDue()); assertEquals(expectedRepaymentInterest, Utils.getDoubleValue(secondRepaymentPeriod.getInterestDue()));
GetLoansLoanIdRepaymentPeriod thirdRepaymentPeriod = periods.get(6); GetLoansLoanIdRepaymentPeriod thirdRepaymentPeriod = periods.get(6);
assertEquals(expectedRepaymentAmountWithInterest, thirdRepaymentPeriod.getTotalDueForPeriod()); assertEquals(expectedRepaymentAmountWithInterest, Utils.getDoubleValue(thirdRepaymentPeriod.getTotalDueForPeriod()));
assertEquals(expectedThirdRepaymentDueDate, thirdRepaymentPeriod.getDueDate()); assertEquals(expectedThirdRepaymentDueDate, thirdRepaymentPeriod.getDueDate());
assertEquals(outstandingBalanceOnThirdRepayment, thirdRepaymentPeriod.getPrincipalLoanBalanceOutstanding()); assertEquals(outstandingBalanceOnThirdRepayment, Utils.getDoubleValue(thirdRepaymentPeriod.getPrincipalLoanBalanceOutstanding()));
assertEquals(expectedRepaymentInterest, thirdRepaymentPeriod.getInterestDue()); assertEquals(expectedRepaymentInterest, Utils.getDoubleValue(thirdRepaymentPeriod.getInterestDue()));
} }
@Test @Test
@@ -1059,14 +1066,17 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
// verify installment details // verify installment details
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(0).getDueDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(0).getDueDate());
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getPeriods().get(0).getPrincipalLoanBalanceOutstanding()); assertEquals(1000.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(0).getPrincipalLoanBalanceOutstanding()));
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getDownPaymentPeriod()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getDownPaymentPeriod());
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPeriod());
assertEquals(LocalDate.of(2023, 4, 2), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 4, 2), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(750.0, loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()); assertEquals(750.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(2).getDownPaymentPeriod()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(2).getDownPaymentPeriod());
// second disbursement // second disbursement
@@ -1079,21 +1089,26 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
loanDetails = loanTransactionHelper.getLoanDetails(loanId.longValue()); loanDetails = loanTransactionHelper.getLoanDetails(loanId.longValue());
// verify installment details // verify installment details
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(0).getDueDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(0).getDueDate());
assertEquals(1000.0, loanDetails.getRepaymentSchedule().getPeriods().get(0).getPrincipalLoanBalanceOutstanding()); assertEquals(1000.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(0).getPrincipalLoanBalanceOutstanding()));
assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod()); assertEquals(1, loanDetails.getRepaymentSchedule().getPeriods().get(1).getPeriod());
assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate()); assertEquals(LocalDate.of(2023, 3, 3), loanDetails.getRepaymentSchedule().getPeriods().get(1).getDueDate());
assertEquals(250.0, loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()); assertEquals(250.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(1).getTotalInstallmentAmountForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getDownPaymentPeriod()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(1).getDownPaymentPeriod());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(2).getDueDate());
assertEquals(200.0, loanDetails.getRepaymentSchedule().getPeriods().get(2).getPrincipalLoanBalanceOutstanding()); assertEquals(200.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(2).getPrincipalLoanBalanceOutstanding()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(2).getDownPaymentPeriod()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(2).getDownPaymentPeriod());
assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod()); assertEquals(2, loanDetails.getRepaymentSchedule().getPeriods().get(3).getPeriod());
assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate()); assertEquals(LocalDate.of(2023, 3, 5), loanDetails.getRepaymentSchedule().getPeriods().get(3).getDueDate());
assertEquals(50.0, loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()); assertEquals(50.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(3).getTotalInstallmentAmountForPeriod()));
assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(3).getDownPaymentPeriod()); assertEquals(true, loanDetails.getRepaymentSchedule().getPeriods().get(3).getDownPaymentPeriod());
assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod()); assertEquals(3, loanDetails.getRepaymentSchedule().getPeriods().get(4).getPeriod());
assertEquals(LocalDate.of(2023, 4, 2), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate()); assertEquals(LocalDate.of(2023, 4, 2), loanDetails.getRepaymentSchedule().getPeriods().get(4).getDueDate());
assertEquals(900.0, loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()); assertEquals(900.0,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(4).getTotalInstallmentAmountForPeriod()));
assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getDownPaymentPeriod()); assertEquals(false, loanDetails.getRepaymentSchedule().getPeriods().get(4).getDownPaymentPeriod());
// verify journal entries for down-payment // verify journal entries for down-payment
@@ -1284,7 +1299,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
transaction(800.0, "Repayment", "03 March 2023", 0.0, 750.0, 0.0, 0.0, 0.0, 0.0, 50.0) // transaction(800.0, "Repayment", "03 March 2023", 0.0, 750.0, 0.0, 0.0, 0.0, 0.0, 50.0) //
); );
assertTrue(loanDetails.getStatus().getOverpaid()); assertTrue(loanDetails.getStatus().getOverpaid());
assertEquals(50.0, loanDetails.getTotalOverpaid()); assertEquals(50.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
// second disbursement // second disbursement
disbursementDate = LocalDate.of(2023, 3, 5); disbursementDate = LocalDate.of(2023, 3, 5);
@@ -1311,7 +1326,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
transaction(20.0, "Disbursement", "05 March 2023", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0) // transaction(20.0, "Disbursement", "05 March 2023", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0) //
); );
assertTrue(loanDetails.getStatus().getOverpaid()); assertTrue(loanDetails.getStatus().getOverpaid());
assertEquals(30.0, loanDetails.getTotalOverpaid()); assertEquals(30.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
loanTransactionHelper.disburseLoan(loanResponse.getResourceId(), loanTransactionHelper.disburseLoan(loanResponse.getResourceId(),
new PostLoansLoanIdRequest().actualDisbursementDate("05 March 2023").dateFormat(DATETIME_PATTERN) new PostLoansLoanIdRequest().actualDisbursementDate("05 March 2023").dateFormat(DATETIME_PATTERN)
@@ -1338,8 +1353,8 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
); );
assertTrue(loanDetails.getStatus().getClosedObligationsMet()); assertTrue(loanDetails.getStatus().getClosedObligationsMet());
assertEquals(0.0, loanDetails.getSummary().getTotalOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
assertEquals(null, loanDetails.getTotalOverpaid()); assertEquals(null, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
PostLoansLoanIdTransactionsResponse repayment = loanTransactionHelper.makeLoanRepayment(loanResponse.getResourceId(), PostLoansLoanIdTransactionsResponse repayment = loanTransactionHelper.makeLoanRepayment(loanResponse.getResourceId(),
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("05 March 2023").locale("en") new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("05 March 2023").locale("en")
@@ -1356,7 +1371,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
transaction(1.0, "Repayment", "05 March 2023", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0) // transaction(1.0, "Repayment", "05 March 2023", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0) //
); );
assertTrue(loanDetails.getStatus().getOverpaid()); assertTrue(loanDetails.getStatus().getOverpaid());
assertEquals(1.0, loanDetails.getTotalOverpaid()); assertEquals(1.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
loanTransactionHelper.disburseLoan(loanResponse.getResourceId(), loanTransactionHelper.disburseLoan(loanResponse.getResourceId(),
new PostLoansLoanIdRequest().actualDisbursementDate("05 March 2023").dateFormat(DATETIME_PATTERN) new PostLoansLoanIdRequest().actualDisbursementDate("05 March 2023").dateFormat(DATETIME_PATTERN)
@@ -1387,7 +1402,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
); );
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertEquals(30.0, loanDetails.getSummary().getTotalOutstanding()); assertEquals(30.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
loanTransactionHelper.reverseLoanTransaction(repayment.getLoanId(), repayment.getResourceId(), loanTransactionHelper.reverseLoanTransaction(repayment.getLoanId(), repayment.getResourceId(),
new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat(DATETIME_PATTERN).transactionDate("05 March 2023") new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat(DATETIME_PATTERN).transactionDate("05 March 2023")
@@ -1419,7 +1434,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
); );
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertEquals(31.0, loanDetails.getSummary().getTotalOutstanding()); assertEquals(31.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
}); });
} }
@@ -1499,7 +1514,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
transaction(800.0, "Repayment", "03 March 2023", 0.0, 750.0, 0.0, 0.0, 0.0, 0.0, 50.0) // transaction(800.0, "Repayment", "03 March 2023", 0.0, 750.0, 0.0, 0.0, 0.0, 0.0, 50.0) //
); );
assertTrue(loanDetails.getStatus().getOverpaid()); assertTrue(loanDetails.getStatus().getOverpaid());
assertEquals(50.0, loanDetails.getTotalOverpaid()); assertEquals(50.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
// second disbursement // second disbursement
disbursementDate = LocalDate.of(2023, 3, 5); disbursementDate = LocalDate.of(2023, 3, 5);
@@ -1526,7 +1541,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
transaction(20.0, "Disbursement", "05 March 2023", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) // transaction(20.0, "Disbursement", "05 March 2023", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) //
); );
assertTrue(loanDetails.getStatus().getOverpaid()); assertTrue(loanDetails.getStatus().getOverpaid());
assertEquals(30.0, loanDetails.getTotalOverpaid()); assertEquals(30.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
loanTransactionHelper.disburseLoan(loanResponse.getResourceId(), loanTransactionHelper.disburseLoan(loanResponse.getResourceId(),
new PostLoansLoanIdRequest().actualDisbursementDate("05 March 2023").dateFormat(DATETIME_PATTERN) new PostLoansLoanIdRequest().actualDisbursementDate("05 March 2023").dateFormat(DATETIME_PATTERN)
@@ -1553,8 +1568,8 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
); );
assertTrue(loanDetails.getStatus().getClosedObligationsMet()); assertTrue(loanDetails.getStatus().getClosedObligationsMet());
assertEquals(0.0, loanDetails.getSummary().getTotalOutstanding()); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
assertEquals(null, loanDetails.getTotalOverpaid()); assertEquals(null, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
loanTransactionHelper.disburseLoan(loanResponse.getResourceId(), loanTransactionHelper.disburseLoan(loanResponse.getResourceId(),
new PostLoansLoanIdRequest().actualDisbursementDate("05 March 2023").dateFormat(DATETIME_PATTERN) new PostLoansLoanIdRequest().actualDisbursementDate("05 March 2023").dateFormat(DATETIME_PATTERN)
@@ -1584,7 +1599,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
); );
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertEquals(30.0, loanDetails.getSummary().getTotalOutstanding()); assertEquals(30.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
loanTransactionHelper.reverseLoanTransaction(loanResponse.getLoanId(), externalId, loanTransactionHelper.reverseLoanTransaction(loanResponse.getLoanId(), externalId,
new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat(DATETIME_PATTERN).transactionDate("05 March 2023") new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat(DATETIME_PATTERN).transactionDate("05 March 2023")
@@ -1615,7 +1630,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
); );
assertTrue(loanDetails.getStatus().getActive()); assertTrue(loanDetails.getStatus().getActive());
assertEquals(830.0, loanDetails.getSummary().getTotalOutstanding()); assertEquals(830.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
}); });
} }
@@ -1666,7 +1681,7 @@ public class LoanRepaymentScheduleWithDownPaymentTest extends BaseLoanIntegratio
.anyMatch(period -> expectedDownPaymentAmount.equals(Utils.getDoubleValue(period.getTotalOutstandingForPeriod())) // .anyMatch(period -> expectedDownPaymentAmount.equals(Utils.getDoubleValue(period.getTotalOutstandingForPeriod())) //
&& expectedDownPaymentDueDate.equals(period.getDueDate()))); && expectedDownPaymentDueDate.equals(period.getDueDate())));
assertEquals(expectedTotalOutstandingAmount, Utils.getDoubleValue(summary.getTotalOutstanding())); assertEquals(expectedTotalOutstandingAmount, Utils.getDoubleValue(summary.getTotalOutstanding()));
assertEquals(expectedTotalRepaymentTransactionAmount, summary.getTotalRepaymentTransaction()); assertEquals(expectedTotalRepaymentTransactionAmount, Utils.getDoubleValue(summary.getTotalRepaymentTransaction()));
assertTrue(periods.stream() assertTrue(periods.stream()
.anyMatch(period -> expectedRepaymentAmount.equals(Utils.getDoubleValue(period.getTotalOutstandingForPeriod())) .anyMatch(period -> expectedRepaymentAmount.equals(Utils.getDoubleValue(period.getTotalOutstandingForPeriod()))
&& expectedRepaymentDueDate.equals(period.getDueDate()))); && expectedRepaymentDueDate.equals(period.getDueDate())));
@@ -563,31 +563,38 @@ public class LoanSpecificDueDateChargeAfterMaturityTest extends BaseLoanIntegrat
private static void validateLoanTransaction(GetLoansLoanIdResponse loanDetails, int index, double transactionAmount, private static void validateLoanTransaction(GetLoansLoanIdResponse loanDetails, int index, double transactionAmount,
double principalPortion, double overPaidPortion, double loanBalance) { double principalPortion, double overPaidPortion, double loanBalance) {
assertEquals(transactionAmount, loanDetails.getTransactions().get(index).getAmount()); assertEquals(transactionAmount, Utils.getDoubleValue(loanDetails.getTransactions().get(index).getAmount()));
assertEquals(principalPortion, loanDetails.getTransactions().get(index).getPrincipalPortion()); assertEquals(principalPortion, Utils.getDoubleValue(loanDetails.getTransactions().get(index).getPrincipalPortion()));
assertEquals(overPaidPortion, loanDetails.getTransactions().get(index).getOverpaymentPortion()); assertEquals(overPaidPortion, Utils.getDoubleValue(loanDetails.getTransactions().get(index).getOverpaymentPortion()));
assertEquals(loanBalance, loanDetails.getTransactions().get(index).getOutstandingLoanBalance()); assertEquals(loanBalance, Utils.getDoubleValue(loanDetails.getTransactions().get(index).getOutstandingLoanBalance()));
} }
private static void validateRepaymentPeriod(GetLoansLoanIdResponse loanDetails, int index, double principalDue, double principalPaid, private static void validateRepaymentPeriod(GetLoansLoanIdResponse loanDetails, int index, double principalDue, double principalPaid,
double principalOutstanding, double paidInAdvance, double paidLate) { double principalOutstanding, double paidInAdvance, double paidLate) {
assertEquals(principalDue, loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalDue()); assertEquals(principalDue, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalDue()));
assertEquals(principalPaid, loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalPaid()); assertEquals(principalPaid, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalPaid()));
assertEquals(principalOutstanding, loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalOutstanding()); assertEquals(principalOutstanding,
assertEquals(paidInAdvance, loanDetails.getRepaymentSchedule().getPeriods().get(index).getTotalPaidInAdvanceForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalOutstanding()));
assertEquals(paidLate, loanDetails.getRepaymentSchedule().getPeriods().get(index).getTotalPaidLateForPeriod()); assertEquals(paidInAdvance,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getTotalPaidInAdvanceForPeriod()));
assertEquals(paidLate,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getTotalPaidLateForPeriod()));
} }
private static void validateRepaymentPeriod(GetLoansLoanIdResponse loanDetails, int index, double principalDue, double principalPaid, private static void validateRepaymentPeriod(GetLoansLoanIdResponse loanDetails, int index, double principalDue, double principalPaid,
double principalOutstanding, double penaltyDue, double penaltyPaid, double penaltyOutstanding, double paidInAdvance, double principalOutstanding, double penaltyDue, double penaltyPaid, double penaltyOutstanding, double paidInAdvance,
double paidLate) { double paidLate) {
assertEquals(principalDue, loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalDue()); assertEquals(principalDue, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalDue()));
assertEquals(principalPaid, loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalPaid()); assertEquals(principalPaid, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalPaid()));
assertEquals(principalOutstanding, loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalOutstanding()); assertEquals(principalOutstanding,
assertEquals(penaltyDue, loanDetails.getRepaymentSchedule().getPeriods().get(index).getPenaltyChargesDue()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getPrincipalOutstanding()));
assertEquals(penaltyPaid, loanDetails.getRepaymentSchedule().getPeriods().get(index).getPenaltyChargesPaid()); assertEquals(penaltyDue, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getPenaltyChargesDue()));
assertEquals(penaltyOutstanding, loanDetails.getRepaymentSchedule().getPeriods().get(index).getPenaltyChargesOutstanding()); assertEquals(penaltyPaid, Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getPenaltyChargesPaid()));
assertEquals(paidInAdvance, loanDetails.getRepaymentSchedule().getPeriods().get(index).getTotalPaidInAdvanceForPeriod()); assertEquals(penaltyOutstanding,
assertEquals(paidLate, loanDetails.getRepaymentSchedule().getPeriods().get(index).getTotalPaidLateForPeriod()); Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getPenaltyChargesOutstanding()));
assertEquals(paidInAdvance,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getTotalPaidInAdvanceForPeriod()));
assertEquals(paidLate,
Utils.getDoubleValue(loanDetails.getRepaymentSchedule().getPeriods().get(index).getTotalPaidLateForPeriod()));
} }
} }
@@ -19,9 +19,7 @@
package org.apache.fineract.integrationtests; package org.apache.fineract.integrationtests;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List; import java.util.List;
import org.apache.fineract.client.models.GetLoansLoanIdRepaymentPeriod;
import org.apache.fineract.client.models.GetLoansLoanIdResponse; import org.apache.fineract.client.models.GetLoansLoanIdResponse;
import org.apache.fineract.client.models.PostLoanProductsResponse; import org.apache.fineract.client.models.PostLoanProductsResponse;
import org.apache.fineract.client.models.PostLoansResponse; import org.apache.fineract.client.models.PostLoansResponse;
@@ -250,38 +248,4 @@ public class LoanSummaryTest extends BaseLoanIntegrationTest {
}); });
} }
@Test
public void testCapitalizedIncomeExistsInRepaymentScheduleAndModifiesPrincipal() {
runAt("01 March 2023", () -> {
final PostLoanProductsResponse loanProductsResponse = loanProductHelper
.createLoanProduct(create4IProgressiveWithCapitalizedIncome());
PostLoansResponse postLoansResponse = loanTransactionHelper.applyLoan(applyLP2ProgressiveLoanRequest(clientId,
loanProductsResponse.getResourceId(), "01 March 2023", 10000.00, 12.00, 4, null));
loanId = postLoansResponse.getLoanId();
loanTransactionHelper.approveLoan(loanId, approveLoanRequest(10000.00, "01 March 2023"));
disburseLoan(loanId, BigDecimal.valueOf(1000.00), "01 March 2023");
});
runAt("02 March 2023", () -> {
loanTransactionHelper.addCapitalizedIncome(loanId, "02 March 2023", 100.00);
});
BigDecimal thousand = BigDecimal.valueOf(1000.0);
BigDecimal hundred = BigDecimal.valueOf(100.0);
BigDecimal thousandOneHundred = BigDecimal.valueOf(1100.0);
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
Assertions.assertEquals(thousand, loanDetails.getPrincipal().setScale(1, RoundingMode.HALF_UP));
Assertions.assertEquals(thousand, loanDetails.getSummary().getPrincipalDisbursed().setScale(1, RoundingMode.HALF_UP));
Assertions.assertEquals(hundred,
loanDetails.getSummary().getTotalPrincipalFromCapitalizedIncome().setScale(1, RoundingMode.HALF_UP));
Assertions.assertEquals(thousandOneHundred, loanDetails.getSummary().getTotalPrincipal().setScale(1, RoundingMode.HALF_UP));
Assertions.assertEquals(thousandOneHundred, loanDetails.getSummary().getPrincipalOutstanding().setScale(1, RoundingMode.HALF_UP));
List<GetLoansLoanIdRepaymentPeriod> periods = loanDetails.getRepaymentSchedule().getPeriods();
Assertions.assertEquals(6, periods.size());
Assertions.assertEquals(thousand, periods.get(0).getPrincipalLoanBalanceOutstanding().setScale(1, RoundingMode.HALF_UP));
Assertions.assertEquals(hundred, periods.get(1).getPrincipalLoanBalanceOutstanding().setScale(1, RoundingMode.HALF_UP));
}
} }
@@ -255,7 +255,7 @@ public class LoanTransactionChargebackTest extends BaseLoanIntegrationTest {
if (period.getPeriod() != null && period.getPeriod() == 3) { if (period.getPeriod() != null && period.getPeriod() == 3) {
log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(), log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(),
period.getTotalDueForPeriod()); period.getTotalDueForPeriod());
assertEquals(Double.valueOf("666.67"), period.getTotalDueForPeriod()); assertEquals(Double.valueOf("666.67"), Utils.getDoubleValue(period.getTotalDueForPeriod()));
} }
} }
@@ -356,7 +356,7 @@ public class LoanTransactionChargebackTest extends BaseLoanIntegrationTest {
if (period.getPeriod() != null && period.getPeriod() == 2) { if (period.getPeriod() != null && period.getPeriod() == 2) {
log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(), log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(),
period.getTotalDueForPeriod()); period.getTotalDueForPeriod());
assertEquals(Double.valueOf("500.00"), period.getPrincipalDue()); assertEquals(Double.valueOf("500.00"), Utils.getDoubleValue(period.getPrincipalDue()));
} }
} }
@@ -385,7 +385,7 @@ public class LoanTransactionChargebackTest extends BaseLoanIntegrationTest {
if (period.getPeriod() != null && period.getPeriod() == 2) { if (period.getPeriod() != null && period.getPeriod() == 2) {
log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(), log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(),
period.getTotalDueForPeriod()); period.getTotalDueForPeriod());
assertEquals(Double.valueOf("800.00"), period.getPrincipalDue()); assertEquals(Double.valueOf("800.00"), Utils.getDoubleValue(period.getPrincipalDue()));
} }
} }
@@ -121,19 +121,19 @@ public class LoanTransactionFullAmountChargebackForOverpaidLoanTest {
// verify loan is overpaid // verify loan is overpaid
assertNotNull(loanDetails); assertNotNull(loanDetails);
assertTrue(loanDetails.getStatus().getOverpaid()); assertTrue(loanDetails.getStatus().getOverpaid());
assertEquals(loanDetails.getTotalOverpaid(), 200.0); assertEquals(200.0, Utils.getDoubleValue(loanDetails.getTotalOverpaid()));
// verify loan outstanding // verify loan outstanding
assertNotNull(loanDetails.getSummary()); assertNotNull(loanDetails.getSummary());
assertEquals(loanDetails.getSummary().getTotalOutstanding(), 0.0); assertEquals(0.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
// verify last transaction amount distribution // verify last transaction amount distribution
GetLoansLoanIdTransactionsTransactionIdResponse loanTransaction = loanTransactionHelper.getLoanTransaction(loanId, GetLoansLoanIdTransactionsTransactionIdResponse loanTransaction = loanTransactionHelper.getLoanTransaction(loanId,
repaymentTransaction_3.getResourceId().intValue()); repaymentTransaction_3.getResourceId().intValue());
assertNotNull(loanTransaction); assertNotNull(loanTransaction);
assertEquals(loanTransaction.getAmount(), 300.0); assertEquals(300.0, loanTransaction.getAmount());
assertEquals(loanTransaction.getPrincipalPortion(), 100.0); assertEquals(100.0, loanTransaction.getPrincipalPortion());
// chargeback for full amount on last repayment for which the amount is 300 and principal is 100 due to // chargeback for full amount on last repayment for which the amount is 300 and principal is 100 due to
// overpayment adjustment // overpayment adjustment
@@ -150,15 +150,15 @@ public class LoanTransactionFullAmountChargebackForOverpaidLoanTest {
// verify loan outstanding // verify loan outstanding
assertNotNull(loanDetailsAfterChargeback.getSummary()); assertNotNull(loanDetailsAfterChargeback.getSummary());
assertEquals(loanDetailsAfterChargeback.getSummary().getTotalOutstanding(), 100.0); assertEquals(100.0, Utils.getDoubleValue(loanDetailsAfterChargeback.getSummary().getTotalOutstanding()));
// verify chargeback transaction amount distribution // verify chargeback transaction amount distribution
GetLoansLoanIdTransactionsTransactionIdResponse chargebackTransaction = loanTransactionHelper.getLoanTransaction(loanId, GetLoansLoanIdTransactionsTransactionIdResponse chargebackTransaction = loanTransactionHelper.getLoanTransaction(loanId,
chargebackTransactionResponse.getResourceId().intValue()); chargebackTransactionResponse.getResourceId().intValue());
assertNotNull(chargebackTransaction); assertNotNull(chargebackTransaction);
assertEquals(chargebackTransaction.getAmount(), 300.0); assertEquals(300.0, chargebackTransaction.getAmount());
assertEquals(chargebackTransaction.getPrincipalPortion(), 100.0); assertEquals(100.0, chargebackTransaction.getPrincipalPortion());
} }
@@ -1748,19 +1748,19 @@ public class LoanTransactionInterestPaymentWaiverTest extends BaseLoanIntegratio
private static void validateLoanTransaction(GetLoansLoanIdResponse loanDetails, int index, double transactionAmount, private static void validateLoanTransaction(GetLoansLoanIdResponse loanDetails, int index, double transactionAmount,
double principalPortion, double overPaidPortion, double loanBalance) { double principalPortion, double overPaidPortion, double loanBalance) {
assertEquals(transactionAmount, loanDetails.getTransactions().get(index).getAmount()); assertEquals(transactionAmount, Utils.getDoubleValue(loanDetails.getTransactions().get(index).getAmount()));
assertEquals(principalPortion, loanDetails.getTransactions().get(index).getPrincipalPortion()); assertEquals(principalPortion, Utils.getDoubleValue(loanDetails.getTransactions().get(index).getPrincipalPortion()));
assertEquals(overPaidPortion, loanDetails.getTransactions().get(index).getOverpaymentPortion()); assertEquals(overPaidPortion, Utils.getDoubleValue(loanDetails.getTransactions().get(index).getOverpaymentPortion()));
assertEquals(loanBalance, loanDetails.getTransactions().get(index).getOutstandingLoanBalance()); assertEquals(loanBalance, Utils.getDoubleValue(loanDetails.getTransactions().get(index).getOutstandingLoanBalance()));
} }
private void validateLoanCharge(GetLoansLoanIdResponse loanDetails, int index, LocalDate dueDate, double charged, double paid, private void validateLoanCharge(GetLoansLoanIdResponse loanDetails, int index, LocalDate dueDate, double charged, double paid,
double outstanding) { double outstanding) {
GetLoansLoanIdLoanChargeData chargeData = loanDetails.getCharges().get(index); GetLoansLoanIdLoanChargeData chargeData = loanDetails.getCharges().get(index);
assertEquals(dueDate, chargeData.getDueDate()); assertEquals(dueDate, chargeData.getDueDate());
assertEquals(charged, chargeData.getAmount()); assertEquals(charged, Utils.getDoubleValue(chargeData.getAmount()));
assertEquals(paid, chargeData.getAmountPaid()); assertEquals(paid, Utils.getDoubleValue(chargeData.getAmountPaid()));
assertEquals(outstanding, chargeData.getAmountOutstanding()); assertEquals(outstanding, Utils.getDoubleValue(chargeData.getAmountOutstanding()));
} }
} }
@@ -144,7 +144,7 @@ public class LoanTransactionReverseReplayTest extends BaseLoanIntegrationTest {
GetLoansLoanIdResponse loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr); GetLoansLoanIdResponse loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr);
int lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1; int lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1;
assertTrue(loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getType().getAccrual()); assertTrue(loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getType().getAccrual());
assertEquals(10.0, loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount()); assertEquals(10.0, Utils.getDoubleValue(loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount()));
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
new PutGlobalConfigurationsRequest().enabled(false)); new PutGlobalConfigurationsRequest().enabled(false));
@@ -193,7 +193,7 @@ public class LoanTransactionReverseReplayTest extends BaseLoanIntegrationTest {
GetLoansLoanIdResponse loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr); GetLoansLoanIdResponse loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr);
int lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1; int lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1;
assertTrue(loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getType().getAccrual()); assertTrue(loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getType().getAccrual());
assertEquals(10.0, loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount()); assertEquals(10.0, Utils.getDoubleValue(loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount()));
int lastPeriodIndex = loansLoanIdResponse.getRepaymentSchedule().getPeriods().size() - 1; int lastPeriodIndex = loansLoanIdResponse.getRepaymentSchedule().getPeriods().size() - 1;
assertEquals(LocalDate.of(2022, 10, 10), assertEquals(LocalDate.of(2022, 10, 10),
loansLoanIdResponse.getRepaymentSchedule().getPeriods().get(lastPeriodIndex).getDueDate()); loansLoanIdResponse.getRepaymentSchedule().getPeriods().get(lastPeriodIndex).getDueDate());
@@ -286,7 +286,7 @@ public class LoanTransactionReverseReplayTest extends BaseLoanIntegrationTest {
GetLoansLoanIdResponse loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr); GetLoansLoanIdResponse loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr);
int lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1; int lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1;
assertEquals(500.0, loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount()));
ArrayList<HashMap> journalEntriesForCBR = journalEntryHelper ArrayList<HashMap> journalEntriesForCBR = journalEntryHelper
.getJournalEntriesByTransactionId("L" + cbrTransactionResponse.getResourceId().toString()); .getJournalEntriesByTransactionId("L" + cbrTransactionResponse.getResourceId().toString());
@@ -327,7 +327,7 @@ public class LoanTransactionReverseReplayTest extends BaseLoanIntegrationTest {
inlineLoanCOBHelper.executeInlineCOB(List.of(loanId.longValue())); inlineLoanCOBHelper.executeInlineCOB(List.of(loanId.longValue()));
loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr); loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr);
lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1; lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1;
assertEquals(500.0, loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount()); assertEquals(500.0, Utils.getDoubleValue(loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount()));
// replayed CBR transaction // replayed CBR transaction
GetLoansLoanIdTransactions newCBRTransaction = loansLoanIdResponse.getTransactions().stream() GetLoansLoanIdTransactions newCBRTransaction = loansLoanIdResponse.getTransactions().stream()
@@ -180,25 +180,25 @@ public class LoanTransactionSummaryTest {
assertNotNull(loanSummary); assertNotNull(loanSummary);
// repayment // repayment
assertEquals(loanSummary.getTotalRepaymentTransaction(), 350.00); assertEquals(350.00, Utils.getDoubleValue(loanSummary.getTotalRepaymentTransaction()));
// repayment reversed // repayment reversed
assertEquals(loanSummary.getTotalRepaymentTransactionReversed(), 50.00); assertEquals(50.00, Utils.getDoubleValue(loanSummary.getTotalRepaymentTransactionReversed()));
// merchant refund // merchant refund
assertEquals(loanSummary.getTotalMerchantRefund(), 100.00); assertEquals(100.00, Utils.getDoubleValue(loanSummary.getTotalMerchantRefund()));
// merchant refund reversed // merchant refund reversed
assertEquals(loanSummary.getTotalMerchantRefundReversed(), 50.00); assertEquals(50.00, Utils.getDoubleValue(loanSummary.getTotalMerchantRefundReversed()));
// payout refund // payout refund
assertEquals(loanSummary.getTotalPayoutRefund(), 100.00); assertEquals(100.00, Utils.getDoubleValue(loanSummary.getTotalPayoutRefund()));
// payout refund reversed // payout refund reversed
assertEquals(loanSummary.getTotalPayoutRefundReversed(), 50.00); assertEquals(50.00, Utils.getDoubleValue(loanSummary.getTotalPayoutRefundReversed()));
// goodwill credit // goodwill credit
assertEquals(loanSummary.getTotalGoodwillCredit(), 100.00); assertEquals(100.00, Utils.getDoubleValue(loanSummary.getTotalGoodwillCredit()));
// goodwill credit reversed // goodwill credit reversed
assertEquals(loanSummary.getTotalGoodwillCreditReversed(), 50.00); assertEquals(50.00, Utils.getDoubleValue(loanSummary.getTotalGoodwillCreditReversed()));
// charge adjustment // charge adjustment
assertEquals(loanSummary.getTotalChargeAdjustment(), 10.00); assertEquals(10.00, Utils.getDoubleValue(loanSummary.getTotalChargeAdjustment()));
// charge // charge
assertEquals(loanSummary.getTotalChargeback(), 50.00); assertEquals(50.00, Utils.getDoubleValue(loanSummary.getTotalChargeback()));
} }
@Test @Test
@@ -236,10 +236,10 @@ public class LoanTransactionSummaryTest {
// Retrieve Loan with loanId // Retrieve Loan with loanId
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails((long) loanId); GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails((long) loanId);
assertEquals(20.0, loanDetails.getDelinquent().getLastPaymentAmount()); assertEquals(20.0, Utils.getDoubleValue(loanDetails.getDelinquent().getLastPaymentAmount()));
assertEquals(LocalDate.of(2022, 9, 8), loanDetails.getDelinquent().getLastPaymentDate()); assertEquals(LocalDate.of(2022, 9, 8), loanDetails.getDelinquent().getLastPaymentDate());
assertEquals(100.0, loanDetails.getDelinquent().getLastRepaymentAmount()); assertEquals(100.0, Utils.getDoubleValue(loanDetails.getDelinquent().getLastRepaymentAmount()));
assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getDelinquent().getLastRepaymentDate()); assertEquals(LocalDate.of(2022, 9, 7), loanDetails.getDelinquent().getLastRepaymentDate());
} }
@@ -111,8 +111,8 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
new PostLoansLoanIdRequest().actualDisbursementDate("01 January 2023").dateFormat(DATETIME_PATTERN) new PostLoansLoanIdRequest().actualDisbursementDate("01 January 2023").dateFormat(DATETIME_PATTERN)
.transactionAmount(BigDecimal.valueOf(1000.00)).locale("en")); .transactionAmount(BigDecimal.valueOf(1000.00)).locale("en"));
final float feePortion = 50.0f; final double feePortion = 50.00;
final float penaltyPortion = 100.0f; final double penaltyPortion = 100.00;
Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper
.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, String.valueOf(feePortion), false)); .getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, String.valueOf(feePortion), false));
@@ -141,30 +141,30 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
GetLoansLoanIdRepaymentPeriod thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4); GetLoansLoanIdRepaymentPeriod thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesDue()));
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalDue()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalOutstanding()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate());
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesDue()));
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate());
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalDueForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate());
businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName())
@@ -178,30 +178,30 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4); thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPrincipalOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(0.0f, firstRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate());
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, secondRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, secondRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(0.0f, secondRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate());
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalDueForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(240.0f, thirdRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(240.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate());
loanTransactionHelper.makeRefundByCash("01 March 2023", 15.0f, loanId); loanTransactionHelper.makeRefundByCash("01 March 2023", 15.0f, loanId);
@@ -213,32 +213,32 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4); thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPrincipalOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(0.0f, firstRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate());
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, secondRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, secondRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, secondRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(secondRepaymentInstallment.getPrincipalDue()));
assertEquals(5.0f, secondRepaymentInstallment.getPrincipalOutstanding()); assertEquals(5.00, Utils.getDoubleValue(secondRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(5.0f, secondRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(5.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate());
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalDueForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate());
loanTransactionHelper.makeRefundByCash("01 March 2023", 265.0f, loanId); loanTransactionHelper.makeRefundByCash("01 March 2023", 265.0f, loanId);
@@ -250,32 +250,32 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4); thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPrincipalOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(0.0f, firstRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate());
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesDue()));
assertEquals(20.0f, secondRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(20.00, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, secondRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, secondRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(secondRepaymentInstallment.getPrincipalDue()));
assertEquals(250.0f, secondRepaymentInstallment.getPrincipalOutstanding()); assertEquals(250.00, Utils.getDoubleValue(secondRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(270.0f, secondRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(270.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate());
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalDueForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate());
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
@@ -312,8 +312,8 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
new PostLoansLoanIdRequest().actualDisbursementDate("01 January 2023").dateFormat(DATETIME_PATTERN) new PostLoansLoanIdRequest().actualDisbursementDate("01 January 2023").dateFormat(DATETIME_PATTERN)
.transactionAmount(BigDecimal.valueOf(1000.00)).locale("en")); .transactionAmount(BigDecimal.valueOf(1000.00)).locale("en"));
final float feePortion = 50.0f; final double feePortion = 50.00;
final float penaltyPortion = 100.0f; final double penaltyPortion = 100.00;
Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper
.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, String.valueOf(feePortion), false)); .getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, String.valueOf(feePortion), false));
@@ -342,30 +342,30 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
GetLoansLoanIdRepaymentPeriod thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4); GetLoansLoanIdRepaymentPeriod thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesDue()));
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalDue()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalOutstanding()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate());
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesDue()));
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate());
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalDueForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate());
businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName())
@@ -379,30 +379,30 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4); thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPrincipalOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(0.0f, firstRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate());
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, secondRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, secondRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(0.0f, secondRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate());
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalDueForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(240.0f, thirdRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(240.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate());
loanTransactionHelper.makeRefundByCash("28 January 2023", 15.0f, loanId); loanTransactionHelper.makeRefundByCash("28 January 2023", 15.0f, loanId);
@@ -414,32 +414,32 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4); thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPrincipalOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(0.0f, firstRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate());
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, secondRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, secondRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, secondRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(secondRepaymentInstallment.getPrincipalDue()));
assertEquals(5.0f, secondRepaymentInstallment.getPrincipalOutstanding()); assertEquals(5.00, Utils.getDoubleValue(secondRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(5.0f, secondRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(5.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate());
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalDueForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate());
// fully unpaying the second installment // fully unpaying the second installment
@@ -452,32 +452,32 @@ public class RefundForActiveLoansWithAdvancedPaymentAllocationTest extends BaseL
thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4); thirdRepaymentInstallment = loanDetails.getRepaymentSchedule().getPeriods().get(4);
assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size()); assertEquals(5, loanDetails.getRepaymentSchedule().getPeriods().size());
assertEquals(feePortion, firstRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, firstRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, firstRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalDue()));
assertEquals(0.0f, firstRepaymentInstallment.getPrincipalOutstanding()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, firstRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(0.0f, firstRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(0.00, Utils.getDoubleValue(firstRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 1, 31), firstRepaymentInstallment.getDueDate());
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesDue()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesDue()));
assertEquals(feePortion, secondRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(feePortion, Utils.getDoubleValue(secondRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesDue()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(penaltyPortion, secondRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(penaltyPortion, Utils.getDoubleValue(secondRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, secondRepaymentInstallment.getPrincipalDue()); assertEquals(250.00, Utils.getDoubleValue(secondRepaymentInstallment.getPrincipalDue()));
assertEquals(250.0f, secondRepaymentInstallment.getPrincipalOutstanding()); assertEquals(250.00, Utils.getDoubleValue(secondRepaymentInstallment.getPrincipalOutstanding()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalDueForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(400.0f, secondRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(400.00, Utils.getDoubleValue(secondRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 3, 2), secondRepaymentInstallment.getDueDate());
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getFeeChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getFeeChargesOutstanding()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesDue()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesDue()));
assertEquals(0.0f, thirdRepaymentInstallment.getPenaltyChargesOutstanding()); assertEquals(0.00, Utils.getDoubleValue(thirdRepaymentInstallment.getPenaltyChargesOutstanding()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalDueForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalDueForPeriod()));
assertEquals(250.0f, thirdRepaymentInstallment.getTotalOutstandingForPeriod()); assertEquals(250.00, Utils.getDoubleValue(thirdRepaymentInstallment.getTotalOutstandingForPeriod()));
assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate()); assertEquals(LocalDate.of(2023, 4, 1), thirdRepaymentInstallment.getDueDate());
} finally { } finally {
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
@@ -968,7 +968,7 @@ public class SchedulerJobsTestResults extends IntegrationTest {
GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID);
// First accrual transaction // First accrual transaction
assertTrue(getLoansLoanIdResponse.getTransactions().get(1).getType().getAccrual()); assertTrue(getLoansLoanIdResponse.getTransactions().get(1).getType().getAccrual());
assertEquals(10.0f, getLoansLoanIdResponse.getTransactions().get(1).getFeeChargesPortion()); assertEquals(10.00, Utils.getDoubleValue(getLoansLoanIdResponse.getTransactions().get(1).getFeeChargesPortion()));
assertEquals(LocalDate.of(2020, 6, 2), getLoansLoanIdResponse.getTransactions().get(1).getDate()); assertEquals(LocalDate.of(2020, 6, 2), getLoansLoanIdResponse.getTransactions().get(1).getDate());
Long transactionId = getLoansLoanIdResponse.getTransactions().get(1).getId(); Long transactionId = getLoansLoanIdResponse.getTransactions().get(1).getId();
@@ -191,7 +191,7 @@ public class UndoRepaymentWithDownPaymentIntegrationTest extends BaseLoanIntegra
assertNotNull(postLoansLoanIdTransactionsResponse1); assertNotNull(postLoansLoanIdTransactionsResponse1);
loanDetails = loanTransactionHelper.getLoanDetails(loanId.longValue()); loanDetails = loanTransactionHelper.getLoanDetails(loanId.longValue());
assertEquals(500, loanDetails.getSummary().getTotalOutstanding()); assertEquals(500.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
} }
private Integer createLoanProductWithPeriodicAccrualAccountingAndAdvancedPaymentAllocationStrategy() { private Integer createLoanProductWithPeriodicAccrualAccountingAndAdvancedPaymentAllocationStrategy() {
@@ -2793,7 +2793,7 @@ public class LoanTransactionHelper {
GetLoansLoanIdSummary getLoansLoanIdSummary = getLoansLoanIdResponse.getSummary(); GetLoansLoanIdSummary getLoansLoanIdSummary = getLoansLoanIdResponse.getSummary();
if (getLoansLoanIdSummary != null) { if (getLoansLoanIdSummary != null) {
log.info("Loan with Principal Adjustments {} expected {}", getLoansLoanIdSummary.getPrincipalAdjustments(), amountExpected); log.info("Loan with Principal Adjustments {} expected {}", getLoansLoanIdSummary.getPrincipalAdjustments(), amountExpected);
assertEquals(amountExpected, getLoansLoanIdSummary.getPrincipalAdjustments()); assertEquals(amountExpected, Utils.getDoubleValue(getLoansLoanIdSummary.getPrincipalAdjustments()));
} }
} }
@@ -183,7 +183,7 @@ public class DelinquencyBucketsHelper {
log.info("Loan Delinquency Data in Days {} and Amount {}", getCollectionData.getPastDueDays(), log.info("Loan Delinquency Data in Days {} and Amount {}", getCollectionData.getPastDueDays(),
getCollectionData.getDelinquentAmount()); getCollectionData.getDelinquentAmount());
assertEquals(pastDueDays, getCollectionData.getPastDueDays(), "Past due days"); assertEquals(pastDueDays, getCollectionData.getPastDueDays(), "Past due days");
assertEquals(amountExpected, getCollectionData.getDelinquentAmount(), "Amount expected"); assertEquals(amountExpected, Utils.getDoubleValue(getCollectionData.getDelinquentAmount()), "Amount expected");
} else { } else {
log.info("Loan Delinquency Data is null"); log.info("Loan Delinquency Data is null");
} }