From 935d6146c00e5f13cc53baf44ba78800c3b3796b Mon Sep 17 00:00:00 2001 From: nazeer1100126 Date: Tue, 21 Mar 2017 17:50:32 +0530 Subject: [PATCH] FINERACT-270 : Unable to waive all Loan charges --- .../portfolio/loanaccount/domain/Loan.java | 8 +++---- .../loanaccount/domain/LoanCharge.java | 24 +++++++++++++------ .../domain/LoanInstallmentCharge.java | 12 ++++++++-- .../LoanRepaymentScheduleInstallment.java | 7 +++++- .../LoanChargeReadPlatformServiceImpl.java | 1 + 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index eb4895287..3b35c5394 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -4706,8 +4706,8 @@ public class Loan extends AbstractPersistableCustom { return loanCharges; } - public Set generateInstallmentLoanCharges(final LoanCharge loanCharge) { - final Set loanChargePerInstallments = new HashSet<>(); + public List generateInstallmentLoanCharges(final LoanCharge loanCharge) { + final List loanChargePerInstallments = new ArrayList<>(); if (loanCharge.isInstalmentFee()) { List installments = getRepaymentScheduleInstallments() ; for (final LoanRepaymentScheduleInstallment installment : installments) { @@ -5070,11 +5070,11 @@ public class Loan extends AbstractPersistableCustom { this.interestRecalculatedOn = DateUtils.getDateOfTenant(); LocalDate lastRepaymentDate = this.getLastRepaymentPeriodDueDate(true); Set charges = this.charges(); - for (LoanCharge loanCharge : charges) { + for (final LoanCharge loanCharge : charges) { if (!loanCharge.isDueAtDisbursement()) { updateOverdueScheduleInstallment(loanCharge); if (loanCharge.getDueLocalDate() == null || (!lastRepaymentDate.isBefore(loanCharge.getDueLocalDate()))) { - if (!loanCharge.isWaived() + if ((loanCharge.isInstalmentFee() || !loanCharge.isWaived()) && (loanCharge.getDueLocalDate() == null || !lastTransactionDate.isAfter(loanCharge.getDueLocalDate()))) { recalculateLoanCharge(loanCharge, generatorDTO.getPenaltyWaitPeriod()); loanCharge.updateWaivedAmount(getCurrency()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java index 05de5fa35..88a8aee49 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java @@ -22,6 +22,7 @@ import java.math.BigDecimal; import java.math.MathContext; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.LinkedHashMap; @@ -489,26 +490,35 @@ public class LoanCharge extends AbstractPersistableCustom { private void updateInstallmentCharges() { final Collection remove = new HashSet<>(); - final Set chargePerInstallments = this.loan.generateInstallmentLoanCharges(this); + final List newChargeInstallments = this.loan.generateInstallmentLoanCharges(this); if (this.loanInstallmentCharge.isEmpty()) { - this.loanInstallmentCharge.addAll(chargePerInstallments); + this.loanInstallmentCharge.addAll(newChargeInstallments); } else { int index = 0; - final LoanInstallmentCharge[] loanChargePerInstallments = new LoanInstallmentCharge[chargePerInstallments.size()]; - final LoanInstallmentCharge[] loanChargePerInstallmentArray = chargePerInstallments.toArray(loanChargePerInstallments); - for (final LoanInstallmentCharge chargePerInstallment : this.loanInstallmentCharge) { + final List oldChargeInstallments = new ArrayList<>(); + if(this.loanInstallmentCharge != null && !this.loanInstallmentCharge.isEmpty()){ + oldChargeInstallments.addAll(this.loanInstallmentCharge); + } + Collections.sort(oldChargeInstallments); + final LoanInstallmentCharge[] loanChargePerInstallmentArray = newChargeInstallments.toArray(new LoanInstallmentCharge[newChargeInstallments.size()]); + for (final LoanInstallmentCharge chargePerInstallment : oldChargeInstallments) { if (index == loanChargePerInstallmentArray.length) { remove.add(chargePerInstallment); - //chargePerInstallment.updateInstallment(null); + chargePerInstallment.updateInstallment(null); } else { chargePerInstallment.copyFrom(loanChargePerInstallmentArray[index++]); } } this.loanInstallmentCharge.removeAll(remove); - while (index < loanChargePerInstallmentArray.length - 1) { + while (index < loanChargePerInstallmentArray.length) { this.loanInstallmentCharge.add(loanChargePerInstallmentArray[index++]); } } + Money amount = Money.zero(this.loan.getCurrency()); + for(LoanInstallmentCharge charge:this.loanInstallmentCharge){ + amount =amount.plus(charge.getAmount()); + } + this.amount =amount.getAmount(); } public boolean isDueAtDisbursement() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInstallmentCharge.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInstallmentCharge.java index 22e23f56b..f0459a2f8 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInstallmentCharge.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInstallmentCharge.java @@ -20,6 +20,7 @@ package org.apache.fineract.portfolio.loanaccount.domain; import java.math.BigDecimal; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.JoinColumn; @@ -32,13 +33,13 @@ import org.apache.fineract.organisation.monetary.domain.Money; @Entity @Table(name = "m_loan_installment_charge") -public class LoanInstallmentCharge extends AbstractPersistableCustom { +public class LoanInstallmentCharge extends AbstractPersistableCustom implements Comparable { @ManyToOne(optional = false) @JoinColumn(name = "loan_charge_id", referencedColumnName = "id", nullable = false) private LoanCharge loancharge; - @ManyToOne(optional = false) + @ManyToOne(optional = false, cascade = CascadeType.ALL) @JoinColumn(name = "loan_schedule_id", referencedColumnName = "id", nullable = false) private LoanRepaymentScheduleInstallment installment; @@ -70,6 +71,11 @@ public class LoanInstallmentCharge extends AbstractPersistableCustom { // TODO Auto-generated constructor stub } + @Override + public int compareTo(LoanInstallmentCharge o) { + return this.installment.getInstallmentNumber().compareTo(o.installment.getInstallmentNumber()); + } + public LoanInstallmentCharge(final BigDecimal amount, final LoanCharge loanCharge, final LoanRepaymentScheduleInstallment installment) { this.loancharge = loanCharge; this.installment = installment; @@ -294,4 +300,6 @@ public class LoanInstallmentCharge extends AbstractPersistableCustom { public LoanRepaymentScheduleInstallment getInstallment() { return this.installment; } + + } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java index 81eff34fa..e46ed66cc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java @@ -43,7 +43,7 @@ import org.joda.time.LocalDate; @Entity @Table(name = "m_loan_repayment_schedule") -public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCustom { +public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCustom implements Comparable { @ManyToOne(optional = false) @JoinColumn(name = "loan_id", referencedColumnName="id") @@ -319,6 +319,11 @@ public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCus return !this.obligationsMet; } + @Override + public int compareTo(LoanRepaymentScheduleInstallment o) { + return this.installmentNumber.compareTo(o.installmentNumber); + } + public boolean isPrincipalNotCompleted(final MonetaryCurrency currency) { return !isPrincipalCompleted(currency); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java index 02ba736b0..783bad788 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java @@ -226,6 +226,7 @@ public class LoanChargeReadPlatformServiceImpl implements LoanChargeReadPlatform if (onlyPaymentPendingCharges) { sql = sql + "and lic.waived =0 and lic.is_paid_derived=0"; } + sql = sql + " order by lsi.installment"; return this.jdbcTemplate.query(sql, rm, new Object[] { loanChargeId }); }