[ https://issues.apache.org/jira/browse/FINERACT-167?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15322189#comment-15322189 ]
ASF GitHub Bot commented on FINERACT-167: ----------------------------------------- Github user nazeer1100126 commented on a diff in the pull request: https://github.com/apache/incubator-fineract/pull/130#discussion_r66404831 --- Diff: fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java --- @@ -5972,4 +5986,204 @@ public BigDecimal getDerivedAmountForCharge(LoanCharge loanCharge) { return amount; } + public LoanRepaymentScheduleInstallment fetchLoanForeclosureDetail(final LocalDate closureDate) { + Money totalPrincipal = Money.of(getCurrency(), this.getSummary().getTotalPrincipalOutstanding()); + Money[] receivables = retriveIncomeOutstandingTillDate(closureDate); + final List<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null; + return new LoanRepaymentScheduleInstallment(null, 0, LocalDate.now(), LocalDate.now(), totalPrincipal.getAmount(), + receivables[0].getAmount(), receivables[1].getAmount(), receivables[2].getAmount(), false, compoundingDetails); + } + + public Money[] retriveIncomeOutstandingTillDate(final LocalDate paymentDate) { + Money[] balances = new Money[3]; + final MonetaryCurrency currency = getCurrency(); + Money interest = Money.zero(currency); + Money fee = Money.zero(currency); + Money penalty = Money.zero(currency); + boolean isArrearsPresent = false; + for (final LoanRepaymentScheduleInstallment installment : this.repaymentScheduleInstallments) { + if (installment.isNotFullyPaidOff()) { + if (!isArrearsPresent || !installment.getDueDate().isAfter(paymentDate)) { + interest = interest.plus(installment.getInterestOutstanding(currency)); + fee = fee.plus(installment.getFeeChargesOutstanding(currency)); + penalty = penalty.plus(installment.getPenaltyChargesOutstanding(currency)); + isArrearsPresent = true; + } else if (installment.getFromDate().isBefore(paymentDate)) { + int totalPeriodDays = Days.daysBetween(installment.getFromDate(), installment.getDueDate()).getDays(); + int tillDays = Days.daysBetween(installment.getFromDate(), paymentDate).getDays(); + interest = interest.plus(calculateInterestForDays(totalPeriodDays, installment.getInterestOutstanding(currency) + .getAmount(), tillDays)); + for (LoanCharge loanCharge : this.charges) { + if (loanCharge.isActive() + && loanCharge.isDueForCollectionFromAndUpToAndIncluding(installment.getFromDate(), paymentDate)) { + if (loanCharge.isPenaltyCharge()) { + penalty = penalty.plus(loanCharge.getAmountOutstanding(currency)); + } else { + fee = fee.plus(loanCharge.getAmountOutstanding(currency)); + } + } + } + } + } + } + balances[0] = interest; + balances[1] = fee; + balances[2] = penalty; + return balances; + } + + private double calculateInterestForDays(int daysInPeriod, BigDecimal interest, int days) { + if (interest.doubleValue() == 0) { return 0; } + return ((interest.doubleValue()) / daysInPeriod) * days; + } + + public boolean canForecloseLoan() { --- End diff -- This method is not required as already validation is done > Implementation of loan foreclosure functionality > ------------------------------------------------ > > Key: FINERACT-167 > URL: https://issues.apache.org/jira/browse/FINERACT-167 > Project: Apache Fineract > Issue Type: New Feature > Components: Loan > Reporter: Vishwanath R > Assignee: Markus Geiss > > On foreclosure of the active loan application, the following things should > happen, > 1) Repay total loan outstanding principal amount. > 2) Repay total Interest amount (accrued and due) till Foreclosure date. > 3) Repay total Fee, Charges or Penalties due, if any till Foreclosure date. > 4) Accounting entries will be made as per product configuration for interest > and loan portfolio payments. > 5) Future installment Interest, Fee, Charge, or Penalty, if any, is waived > off (there won’t be any accounting entries for these transactions). -- This message was sent by Atlassian JIRA (v6.3.4#6332)