diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java index 906c854ec..946a37156 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java @@ -4954,7 +4954,7 @@ public class Loan extends AbstractPersistable { for (LoanTransaction loanTransaction : allNonContraTransactionsPostDisbursement) { copyTransactions.add(LoanTransaction.copyTransactionProperties(loanTransaction)); } - loanRepaymentScheduleTransactionProcessor.populateDerivedFeildsWithoutReprocess(getDisbursementDate(), copyTransactions, + loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), copyTransactions, getCurrency(), this.repaymentScheduleInstallments, charges()); updateLoanSummaryDerivedFields(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java index c36893d4e..2a039638f 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java @@ -615,6 +615,10 @@ public class LoanCharge extends AbstractPersistable { public BigDecimal amountOutstanding() { return this.amountOutstanding; } + + public Money getAmountOutstanding(final MonetaryCurrency currency) { + return Money.of(currency, this.amountOutstanding); + } public boolean hasNotLoanIdentifiedBy(final Long loanId) { return !hasLoanIdentifiedBy(loanId); @@ -645,6 +649,10 @@ public class LoanCharge extends AbstractPersistable { public boolean isNotFullyPaid() { return !isPaid(); } + + public boolean isChargePending(){ + return isNotFullyPaid() && !isWaived(); + } public boolean isPaid() { return this.paid; @@ -881,7 +889,7 @@ public class LoanCharge extends AbstractPersistable { final Money amountWaived = chargePerInstallment.updateWaivedAndAmountPaidThroughChargePaymentAmount(currency); this.amountWaived = this.amountWaived.add(amountWaived.getAmount()); this.amountOutstanding = this.amountOutstanding.subtract(amountWaived.getAmount()); - if (determineIfFullyPaid()) { + if (determineIfFullyPaid() && Money.of(currency, this.amountWaived).isGreaterThanZero()) { this.paid = false; this.waived = true; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java index 5c962cfec..fc3df588e 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java @@ -48,17 +48,11 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen * falls before existing transactions or and adjustment is made to an * existing in which case the entire loan schedule needs to be re-processed. */ + @Override public ChangedTransactionDetail handleTransaction(final LocalDate disbursementDate, final List transactionsPostDisbursement, final MonetaryCurrency currency, final List installments, final Set charges) { - final boolean reprocessCharges = true; - return handleTransaction(disbursementDate, transactionsPostDisbursement, currency, installments, charges, reprocessCharges); - } - - private ChangedTransactionDetail handleTransaction(final LocalDate disbursementDate, - final List transactionsPostDisbursement, final MonetaryCurrency currency, - final List installments, final Set charges, boolean reprocessCharges) { if (charges != null) { for (final LoanCharge loanCharge : charges) { @@ -75,10 +69,8 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen // re-process loan charges over repayment periods (picking up on waived // loan charges) - if (reprocessCharges) { - final LoanRepaymentScheduleProcessingWrapper wrapper = new LoanRepaymentScheduleProcessingWrapper(); - wrapper.reprocess(currency, disbursementDate, installments, charges); - } + final LoanRepaymentScheduleProcessingWrapper wrapper = new LoanRepaymentScheduleProcessingWrapper(); + wrapper.reprocess(currency, disbursementDate, installments, charges); final ChangedTransactionDetail changedTransactionDetail = new ChangedTransactionDetail(); final List transactionstoBeProcessed = new ArrayList<>(); @@ -328,7 +320,7 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen Money amountRemaining = feeCharges; while (amountRemaining.isGreaterThanZero()) { - final LoanCharge unpaidCharge = findEarliestUnpaidChargeFromUnOrderedSet(charges); + final LoanCharge unpaidCharge = findEarliestUnpaidChargeFromUnOrderedSet(charges, feeCharges.getCurrency()); Money feeAmount = feeCharges.zero(); if (loanTransaction.isChargePayment()) { feeAmount = feeCharges; @@ -355,12 +347,12 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen } - private LoanCharge findEarliestUnpaidChargeFromUnOrderedSet(final Set charges) { + private LoanCharge findEarliestUnpaidChargeFromUnOrderedSet(final Set charges, final MonetaryCurrency currency) { LoanCharge earliestUnpaidCharge = null; LoanCharge installemntCharge = null; LoanInstallmentCharge chargePerInstallment = null; for (final LoanCharge loanCharge : charges) { - if (loanCharge.isNotFullyPaid() && !loanCharge.isDueAtDisbursement()) { + if (loanCharge.getAmountOutstanding(currency).isGreaterThanZero() && !loanCharge.isDueAtDisbursement()) { if (loanCharge.isInstalmentFee()) { LoanInstallmentCharge unpaidLoanChargePerInstallment = loanCharge.getUnpaidInstallmentLoanCharge(); if (chargePerInstallment == null @@ -587,14 +579,6 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen } - @Override - public ChangedTransactionDetail populateDerivedFeildsWithoutReprocess(final LocalDate disbursementDate, - final List transactionsPostDisbursement, final MonetaryCurrency currency, - final List installments, final Set charges) { - final boolean reprocessCharges = false; - return handleTransaction(disbursementDate, transactionsPostDisbursement, currency, installments, charges, reprocessCharges); - } - private LoanCharge findLatestPaidChargeFromUnOrderedSet(final Set charges, MonetaryCurrency currency) { LoanCharge latestPaidCharge = null; LoanCharge installemntCharge = null; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java index 44c619695..adb1e0c18 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java @@ -36,10 +36,6 @@ public interface LoanRepaymentScheduleTransactionProcessor { */ boolean isInterestFirstRepaymentScheduleTransactionProcessor(); - ChangedTransactionDetail populateDerivedFeildsWithoutReprocess(LocalDate disbursementDate, - List transactionsPostDisbursement, MonetaryCurrency currency, - List installments, Set charges); - void handleRefund(LoanTransaction loanTransaction, MonetaryCurrency currency, List installments, final Set charges); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java index e4ebd1c9e..63cff273b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java @@ -488,7 +488,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener final ScheduleCurrentPeriodParams currentPeriodParams, final Money lastTotalOutstandingInterestPaymentDueToGrace, final LocalDate transactionDate, final LoanScheduleModelPeriod installment) { LoanScheduleModelPeriod modifiedInstallment = installment; - if (scheduleParams.getOutstandingBalance().isLessThan(currentPeriodParams.getInterestForThisPeriod()) + if (!scheduleParams.getOutstandingBalance().isGreaterThan(currentPeriodParams.getInterestForThisPeriod()) && !scheduledDueDate.equals(transactionDate)) { final Collection interestRates = loanApplicationTerms.getLoanTermVariations().getInterestRateChanges(); LocalDate calculateTill = transactionDate; @@ -602,7 +602,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener && scheduleParams.getLoanRepaymentScheduleTransactionProcessor() .isInterestFirstRepaymentScheduleTransactionProcessor()) { List currentTransactions = createCurrentTransactionList(detail); - if (!transactionDate.isEqual(scheduleParams.getPeriodStartDate())) { + if (!transactionDate.isEqual(scheduleParams.getPeriodStartDate()) || scheduleParams.getInstalmentNumber() == 1) { int periodDays = Days.daysBetween(scheduleParams.getPeriodStartDate(), transactionDate).getDays(); // calculates period start date for interest diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java index 933c7bdee..1aa1232fc 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java @@ -454,7 +454,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche for (LoanCharge loanCharge : loanCharges) { - if (loanCharge.isNotFullyPaid() && !loanCharge.isWaived()) { + if (loanCharge.isChargePending()) { Integer loanInstallmentNumber = null; if (loanCharge.isInstalmentFee()) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 9a9e62ddf..25991c0be 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -372,7 +372,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final Map disBuLoanCharges = new HashMap<>(); for (final LoanCharge loanCharge : loanCharges) { if (loanCharge.isDueAtDisbursement() && loanCharge.getChargePaymentMode().isPaymentModeAccountTransfer() - && loanCharge.isNotFullyPaid() && !loanCharge.isWaived()) { + && loanCharge.isChargePending()) { disBuLoanCharges.put(loanCharge.getId(), loanCharge.amountOutstanding()); } } @@ -599,7 +599,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final Map disBuLoanCharges = new HashMap<>(); for (final LoanCharge loanCharge : loanCharges) { if (loanCharge.isDueAtDisbursement() && loanCharge.getChargePaymentMode().isPaymentModeAccountTransfer() - && loanCharge.isNotFullyPaid() && !loanCharge.isWaived()) { + && loanCharge.isChargePending()) { disBuLoanCharges.put(loanCharge.getId(), loanCharge.amountOutstanding()); } }