added installment fee for add charges
This commit is contained in:
+67
-8
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.mifosplatform.portfolio.loanaccount.domain;
|
package org.mifosplatform.portfolio.loanaccount.domain;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -25,14 +26,14 @@ public class LoanRepaymentScheduleProcessingWrapper {
|
|||||||
for (final LoanRepaymentScheduleInstallment period : repaymentPeriods) {
|
for (final LoanRepaymentScheduleInstallment period : repaymentPeriods) {
|
||||||
|
|
||||||
final Money feeChargesDueForRepaymentPeriod = cumulativeFeeChargesDueWithin(startDate, period.getDueDate(), loanCharges,
|
final Money feeChargesDueForRepaymentPeriod = cumulativeFeeChargesDueWithin(startDate, period.getDueDate(), loanCharges,
|
||||||
currency);
|
currency,period,repaymentPeriods.size());
|
||||||
final Money feeChargesWaivedForRepaymentPeriod = cumulativeFeeChargesWaivedWithin(startDate, period.getDueDate(), loanCharges,
|
final Money feeChargesWaivedForRepaymentPeriod = cumulativeFeeChargesWaivedWithin(startDate, period.getDueDate(), loanCharges,
|
||||||
currency);
|
currency);
|
||||||
final Money feeChargesWrittenOffForRepaymentPeriod = cumulativeFeeChargesWrittenOffWithin(startDate, period.getDueDate(),
|
final Money feeChargesWrittenOffForRepaymentPeriod = cumulativeFeeChargesWrittenOffWithin(startDate, period.getDueDate(),
|
||||||
loanCharges, currency);
|
loanCharges, currency);
|
||||||
|
|
||||||
final Money penaltyChargesDueForRepaymentPeriod = cumulativePenaltyChargesDueWithin(startDate, period.getDueDate(),
|
final Money penaltyChargesDueForRepaymentPeriod = cumulativePenaltyChargesDueWithin(startDate, period.getDueDate(),
|
||||||
loanCharges, currency);
|
loanCharges, currency,period,repaymentPeriods.size());
|
||||||
final Money penaltyChargesWaivedForRepaymentPeriod = cumulativePenaltyChargesWaivedWithin(startDate, period.getDueDate(),
|
final Money penaltyChargesWaivedForRepaymentPeriod = cumulativePenaltyChargesWaivedWithin(startDate, period.getDueDate(),
|
||||||
loanCharges, currency);
|
loanCharges, currency);
|
||||||
final Money penaltyChargesWrittenOffForRepaymentPeriod = cumulativePenaltyChargesWrittenOffWithin(startDate,
|
final Money penaltyChargesWrittenOffForRepaymentPeriod = cumulativePenaltyChargesWrittenOffWithin(startDate,
|
||||||
@@ -47,13 +48,42 @@ public class LoanRepaymentScheduleProcessingWrapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Money cumulativeFeeChargesDueWithin(final LocalDate periodStart, final LocalDate periodEnd, final Set<LoanCharge> loanCharges,
|
private Money cumulativeFeeChargesDueWithin(final LocalDate periodStart, final LocalDate periodEnd, final Set<LoanCharge> loanCharges,
|
||||||
final MonetaryCurrency monetaryCurrency) {
|
final MonetaryCurrency monetaryCurrency,LoanRepaymentScheduleInstallment period,int numberOfRepayments) {
|
||||||
|
|
||||||
Money cumulative = Money.zero(monetaryCurrency);
|
Money cumulative = Money.zero(monetaryCurrency);
|
||||||
|
|
||||||
for (final LoanCharge loanCharge : loanCharges) {
|
for (final LoanCharge loanCharge : loanCharges) {
|
||||||
if (loanCharge.isDueForCollectionFromAndUpToAndIncluding(periodStart, periodEnd) && loanCharge.isFeeCharge()) {
|
if (loanCharge.isFeeCharge()) {
|
||||||
cumulative = cumulative.plus(loanCharge.amount());
|
if (loanCharge.isInstalmentFee()) {
|
||||||
|
if (loanCharge.getChargeCalculation().isPercentageBased()) {
|
||||||
|
BigDecimal amount = BigDecimal.ZERO;
|
||||||
|
if (loanCharge.getChargeCalculation().isPercentageOfAmountAndInterest()) {
|
||||||
|
amount = amount.add(period.getPrincipal(monetaryCurrency).getAmount()).add(
|
||||||
|
period.getInterestCharged(monetaryCurrency).getAmount());
|
||||||
|
} else if (loanCharge.getChargeCalculation().isPercentageOfInterest()) {
|
||||||
|
amount = amount.add(period.getInterestCharged(monetaryCurrency).getAmount());
|
||||||
|
} else {
|
||||||
|
amount = amount.add(period.getPrincipal(monetaryCurrency).getAmount());
|
||||||
|
}
|
||||||
|
BigDecimal loanChargeAmt = amount.multiply(loanCharge.getPercentage()).divide(BigDecimal.valueOf(100));
|
||||||
|
cumulative = cumulative.plus(loanChargeAmt);
|
||||||
|
} else {
|
||||||
|
cumulative = cumulative.plus(loanCharge.amount().divide(BigDecimal.valueOf(numberOfRepayments)));
|
||||||
|
}
|
||||||
|
} else if (loanCharge.getChargeCalculation().isPercentageBased()) {
|
||||||
|
BigDecimal amount = BigDecimal.ZERO;
|
||||||
|
if (loanCharge.getChargeCalculation().isPercentageOfAmountAndInterest()) {
|
||||||
|
amount = amount.add(period.getLoan().getSummary().getTotalPrincipalDisbursed()).add(period.getLoan().getSummary().getTotalInterestCharged());
|
||||||
|
} else if (loanCharge.getChargeCalculation().isPercentageOfInterest()) {
|
||||||
|
amount = amount.add(period.getLoan().getSummary().getTotalInterestCharged());
|
||||||
|
} else {
|
||||||
|
amount = amount.add(period.getLoan().getSummary().getTotalPrincipalDisbursed());
|
||||||
|
}
|
||||||
|
BigDecimal loanChargeAmt = amount.multiply(loanCharge.getPercentage()).divide(BigDecimal.valueOf(100));
|
||||||
|
cumulative = cumulative.plus(loanChargeAmt);
|
||||||
|
} else if (loanCharge.isDueForCollectionFromAndUpToAndIncluding(periodStart, periodEnd)) {
|
||||||
|
cumulative = cumulative.plus(loanCharge.amount());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,13 +119,42 @@ public class LoanRepaymentScheduleProcessingWrapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Money cumulativePenaltyChargesDueWithin(final LocalDate periodStart, final LocalDate periodEnd,
|
private Money cumulativePenaltyChargesDueWithin(final LocalDate periodStart, final LocalDate periodEnd,
|
||||||
final Set<LoanCharge> loanCharges, final MonetaryCurrency currency) {
|
final Set<LoanCharge> loanCharges, final MonetaryCurrency currency,LoanRepaymentScheduleInstallment period,int numberOfRepayments) {
|
||||||
|
|
||||||
Money cumulative = Money.zero(currency);
|
Money cumulative = Money.zero(currency);
|
||||||
|
|
||||||
for (final LoanCharge loanCharge : loanCharges) {
|
for (final LoanCharge loanCharge : loanCharges) {
|
||||||
if (loanCharge.isDueForCollectionFromAndUpToAndIncluding(periodStart, periodEnd) && loanCharge.isPenaltyCharge()) {
|
if (loanCharge.isPenaltyCharge()) {
|
||||||
cumulative = cumulative.plus(loanCharge.amount());
|
if (loanCharge.isInstalmentFee()) {
|
||||||
|
if (loanCharge.getChargeCalculation().isPercentageBased()) {
|
||||||
|
BigDecimal amount = BigDecimal.ZERO;
|
||||||
|
if (loanCharge.getChargeCalculation().isPercentageOfAmountAndInterest()) {
|
||||||
|
amount = amount.add(period.getPrincipal(currency).getAmount())
|
||||||
|
.add(period.getInterestCharged(currency).getAmount());
|
||||||
|
} else if (loanCharge.getChargeCalculation().isPercentageOfInterest()) {
|
||||||
|
amount = amount.add(period.getInterestCharged(currency).getAmount());
|
||||||
|
} else {
|
||||||
|
amount = amount.add(period.getPrincipal(currency).getAmount());
|
||||||
|
}
|
||||||
|
BigDecimal loanChargeAmt = amount.multiply(loanCharge.getPercentage()).divide(BigDecimal.valueOf(100));
|
||||||
|
cumulative = cumulative.plus(loanChargeAmt);
|
||||||
|
} else {
|
||||||
|
cumulative = cumulative.plus(loanCharge.amount().divide(BigDecimal.valueOf(numberOfRepayments)));
|
||||||
|
}
|
||||||
|
} else if (loanCharge.getChargeCalculation().isPercentageBased()) {
|
||||||
|
BigDecimal amount = BigDecimal.ZERO;
|
||||||
|
if (loanCharge.getChargeCalculation().isPercentageOfAmountAndInterest()) {
|
||||||
|
amount = amount.add(period.getLoan().getSummary().getTotalPrincipalDisbursed()).add(period.getLoan().getSummary().getTotalInterestCharged());
|
||||||
|
} else if (loanCharge.getChargeCalculation().isPercentageOfInterest()) {
|
||||||
|
amount = amount.add(period.getLoan().getSummary().getTotalInterestCharged());
|
||||||
|
} else {
|
||||||
|
amount = amount.add(period.getLoan().getSummary().getTotalPrincipalDisbursed());
|
||||||
|
}
|
||||||
|
BigDecimal loanChargeAmt = amount.multiply(loanCharge.getPercentage()).divide(BigDecimal.valueOf(100));
|
||||||
|
cumulative = cumulative.plus(loanChargeAmt);
|
||||||
|
} else if (loanCharge.isDueForCollectionFromAndUpToAndIncluding(periodStart, periodEnd)) {
|
||||||
|
cumulative = cumulative.plus(loanCharge.amount());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
@@ -274,4 +274,9 @@ public final class LoanSummary {
|
|||||||
.plus(this.totalFeeChargesOutstanding).plus(this.totalPenaltyChargesOutstanding);
|
.plus(this.totalFeeChargesOutstanding).plus(this.totalPenaltyChargesOutstanding);
|
||||||
this.totalOutstanding = totalOutstanding.getAmount();
|
this.totalOutstanding = totalOutstanding.getAmount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public BigDecimal getTotalPrincipalDisbursed() {
|
||||||
|
return this.totalPrincipalDisbursed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+9
-2
@@ -257,14 +257,21 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen
|
|||||||
|
|
||||||
private LoanCharge findEarliestUnpaidChargeFromUnOrderedSet(final Set<LoanCharge> charges) {
|
private LoanCharge findEarliestUnpaidChargeFromUnOrderedSet(final Set<LoanCharge> charges) {
|
||||||
LoanCharge earliestUnpaidCharge = null;
|
LoanCharge earliestUnpaidCharge = null;
|
||||||
|
LoanCharge installemntCharge = null;
|
||||||
for (final LoanCharge loanCharge : charges) {
|
for (final LoanCharge loanCharge : charges) {
|
||||||
if (loanCharge.isNotFullyPaid() && !loanCharge.isDueAtDisbursement()) {
|
if (loanCharge.isNotFullyPaid() && !loanCharge.isDueAtDisbursement()) {
|
||||||
if (earliestUnpaidCharge == null || loanCharge.getDueLocalDate().isBefore(earliestUnpaidCharge.getDueLocalDate())) {
|
if(loanCharge.isInstalmentFee()){
|
||||||
|
if(installemntCharge == null){
|
||||||
|
installemntCharge = loanCharge;
|
||||||
|
}
|
||||||
|
}else if (earliestUnpaidCharge == null || loanCharge.getDueLocalDate().isBefore(earliestUnpaidCharge.getDueLocalDate())) {
|
||||||
earliestUnpaidCharge = loanCharge;
|
earliestUnpaidCharge = loanCharge;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(earliestUnpaidCharge == null || earliestUnpaidCharge.getDueLocalDate().isAfter(new LocalDate())){
|
||||||
|
earliestUnpaidCharge = installemntCharge;
|
||||||
|
}
|
||||||
|
|
||||||
return earliestUnpaidCharge;
|
return earliestUnpaidCharge;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user