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

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new dafd4c343 FINERACT-1785: Specified due date charges/fees cannot be 
applied on disbursement date
dafd4c343 is described below

commit dafd4c3436a15b0d0279a2981ca7ac4eb9307c6d
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Sat Jan 7 17:08:27 2023 -0600

    FINERACT-1785: Specified due date charges/fees cannot be applied on 
disbursement date
---
 .../domain/LoanRepaymentScheduleProcessingWrapper.java   | 16 ++++++++++++----
 .../integrationtests/LoanChargeSpecificDueDateTest.java  |  4 ++--
 2 files changed, 14 insertions(+), 6 deletions(-)

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<LoanCharge> loanCharges, final MonetaryCurrency 
currency, boolean isInstallmentChargeApplicable) {
+            final Set<LoanCharge> 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<LoanCharge> loanCharges, final MonetaryCurrency 
currency, boolean isInstallmentChargeApplicable) {
+            final Set<LoanCharge> 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);

Reply via email to