diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java index fb7f80f20..f65f6c703 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java @@ -45,14 +45,14 @@ public class LoanRepaymentScheduleProcessingWrapper { final Money feeChargesDueForRepaymentPeriod = cumulativeFeeChargesDueWithin(startDate, period.getDueDate(), loanCharges, currency, period, totalPrincipal, totalInterest, !period.isRecalculatedInterestComponent()); final Money feeChargesWaivedForRepaymentPeriod = cumulativeFeeChargesWaivedWithin(startDate, period.getDueDate(), loanCharges, - currency, !period.isRecalculatedInterestComponent()); + currency, !period.isRecalculatedInterestComponent(), period.isFirstPeriod()); final Money feeChargesWrittenOffForRepaymentPeriod = cumulativeFeeChargesWrittenOffWithin(startDate, period.getDueDate(), loanCharges, currency, !period.isRecalculatedInterestComponent()); final Money penaltyChargesDueForRepaymentPeriod = cumulativePenaltyChargesDueWithin(startDate, period.getDueDate(), loanCharges, currency, period, totalPrincipal, totalInterest, !period.isRecalculatedInterestComponent()); final Money penaltyChargesWaivedForRepaymentPeriod = cumulativePenaltyChargesWaivedWithin(startDate, period.getDueDate(), - loanCharges, currency, !period.isRecalculatedInterestComponent()); + loanCharges, currency, !period.isRecalculatedInterestComponent(), period.isFirstPeriod()); final Money penaltyChargesWrittenOffForRepaymentPeriod = cumulativePenaltyChargesWrittenOffWithin(startDate, period.getDueDate(), loanCharges, currency, !period.isRecalculatedInterestComponent()); @@ -129,7 +129,8 @@ public class LoanRepaymentScheduleProcessingWrapper { } private Money cumulativeFeeChargesWaivedWithin(final LocalDate periodStart, final LocalDate periodEnd, - final Set loanCharges, final MonetaryCurrency currency, boolean isInstallmentChargeApplicable) { + final Set loanCharges, final MonetaryCurrency currency, boolean isInstallmentChargeApplicable, + boolean isFirstPeriod) { Money cumulative = Money.zero(currency); @@ -142,6 +143,9 @@ public class LoanRepaymentScheduleProcessingWrapper { } } else if (loanCharge.isDueForCollectionFromAndUpToAndIncluding(periodStart, periodEnd)) { cumulative = cumulative.plus(loanCharge.getAmountWaived(currency)); + // Special case for Loan Charges (Due Date) added the same disbursement date + } else if (isFirstPeriod && periodStart.equals(loanCharge.getDueDate())) { + cumulative = cumulative.plus(loanCharge.getAmountWaived(currency)); } } } @@ -223,7 +227,8 @@ public class LoanRepaymentScheduleProcessingWrapper { } private Money cumulativePenaltyChargesWaivedWithin(final LocalDate periodStart, final LocalDate periodEnd, - final Set loanCharges, final MonetaryCurrency currency, boolean isInstallmentChargeApplicable) { + final Set loanCharges, final MonetaryCurrency currency, boolean isInstallmentChargeApplicable, + boolean isFirstPeriod) { Money cumulative = Money.zero(currency); @@ -236,6 +241,9 @@ public class LoanRepaymentScheduleProcessingWrapper { } } else if (loanCharge.isDueForCollectionFromAndUpToAndIncluding(periodStart, periodEnd)) { cumulative = cumulative.plus(loanCharge.getAmountWaived(currency)); + // Special case for Loan Charges (Due Date) added the same disbursement date + } else if (isFirstPeriod && periodStart.equals(loanCharge.getDueDate())) { + cumulative = cumulative.plus(loanCharge.getAmountWaived(currency)); } } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeSpecificDueDateTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeSpecificDueDateTest.java index 1b5df8419..7b8e599ec 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeSpecificDueDateTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeSpecificDueDateTest.java @@ -218,10 +218,10 @@ public class LoanChargeSpecificDueDateTest { // evaluate the outstanding getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, Double.valueOf(principalAmount), Double.valueOf("10.00"), true); + validateLoanAccount(getLoansLoanIdResponse, Double.valueOf(principalAmount), Double.valueOf("0.00"), true); // Make a full repayment to close the Loan - Float amount = Float.valueOf("1010.00"); + Float amount = Float.valueOf("1000.00"); PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, amount, loanId); assertNotNull(loanIdTransactionsResponse);