diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index 27bb50d75a..c6524c9d9f 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -363,8 +363,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Transient private LoanLifecycleStateMachine loanLifecycleStateMachine; - @Transient - private LoanSummaryWrapper loanSummaryWrapper; @Setter() @Column(name = "principal_amount_proposed", scale = 6, precision = 19, nullable = false) @@ -971,7 +969,7 @@ private Money getTotalAllTrancheDisbursementAmount() { } public BigDecimal getTotalInterest() { - return this.loanSummaryWrapper.calculateTotalInterestCharged(getRepaymentScheduleInstallments(), getCurrency()).getAmount(); + return this.summary.calculateTotalInterestCharged(getRepaymentScheduleInstallments(), getCurrency()).getAmount(); } public BigDecimal calculatePerInstallmentChargeAmount(final LoanCharge loanCharge) { @@ -1189,7 +1187,7 @@ public void updateLoanSummaryDerivedFields() { this.totalRecovered = recoveredAmount.getAmountDefaultedToNullIfZero(); final Money principal = this.loanRepaymentScheduleDetail.getPrincipal(); - this.summary.updateSummary(getCurrency(), principal, getRepaymentScheduleInstallments(), this.loanSummaryWrapper, this.charges); + this.summary.updateSummary(getCurrency(), principal, getRepaymentScheduleInstallments(), this.charges); updateLoanOutstandingBalances(); } } @@ -2316,10 +2314,9 @@ public Money getReceivableInterest(final LocalDate tillDate) { return receivableInterest; } - public void setHelpers(final LoanLifecycleStateMachine loanLifecycleStateMachine, final LoanSummaryWrapper loanSummaryWrapper, + public void setHelpers(final LoanLifecycleStateMachine loanLifecycleStateMachine, final LoanRepaymentScheduleTransactionProcessorFactory transactionProcessorFactory) { this.loanLifecycleStateMachine = loanLifecycleStateMachine; - this.loanSummaryWrapper = loanSummaryWrapper; this.transactionProcessorFactory = transactionProcessorFactory; } diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummary.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummary.java index 1956682eb5..9dcc97934f 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummary.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummary.java @@ -176,60 +176,51 @@ public void zeroFields() { } public void updateSummary(final MonetaryCurrency currency, final Money principal, - final List repaymentScheduleInstallments, final LoanSummaryWrapper summaryWrapper, - Set charges) { + final List repaymentScheduleInstallments, Set charges) { this.totalPrincipalDisbursed = principal.getAmount(); - this.totalPrincipalAdjustments = summaryWrapper.calculateTotalPrincipalAdjusted(repaymentScheduleInstallments, currency) - .getAmount(); - this.totalFeeAdjustments = summaryWrapper.calculateTotalFeeAdjusted(repaymentScheduleInstallments, currency).getAmount(); - this.totalPenaltyAdjustments = summaryWrapper.calculateTotalPenaltyAdjusted(repaymentScheduleInstallments, currency).getAmount(); - this.totalPrincipalRepaid = summaryWrapper.calculateTotalPrincipalRepaid(repaymentScheduleInstallments, currency).getAmount(); - this.totalPrincipalWrittenOff = summaryWrapper.calculateTotalPrincipalWrittenOff(repaymentScheduleInstallments, currency) - .getAmount(); + this.totalPrincipalAdjustments = calculateTotalPrincipalAdjusted(repaymentScheduleInstallments, currency).getAmount(); + this.totalFeeAdjustments = calculateTotalFeeAdjusted(repaymentScheduleInstallments, currency).getAmount(); + this.totalPenaltyAdjustments = calculateTotalPenaltyAdjusted(repaymentScheduleInstallments, currency).getAmount(); + this.totalPrincipalRepaid = calculateTotalPrincipalRepaid(repaymentScheduleInstallments, currency).getAmount(); + this.totalPrincipalWrittenOff = calculateTotalPrincipalWrittenOff(repaymentScheduleInstallments, currency).getAmount(); this.totalPrincipalOutstanding = principal.plus(this.totalPrincipalAdjustments).minus(this.totalPrincipalRepaid) .minus(this.totalPrincipalWrittenOff).getAmount(); - final Money totalInterestCharged = summaryWrapper.calculateTotalInterestCharged(repaymentScheduleInstallments, currency); + final Money totalInterestCharged = calculateTotalInterestCharged(repaymentScheduleInstallments, currency); this.totalInterestCharged = totalInterestCharged.getAmount(); - this.totalInterestRepaid = summaryWrapper.calculateTotalInterestRepaid(repaymentScheduleInstallments, currency).getAmount(); - this.totalInterestWaived = summaryWrapper.calculateTotalInterestWaived(repaymentScheduleInstallments, currency).getAmount(); - this.totalInterestWrittenOff = summaryWrapper.calculateTotalInterestWrittenOff(repaymentScheduleInstallments, currency).getAmount(); + this.totalInterestRepaid = calculateTotalInterestRepaid(repaymentScheduleInstallments, currency).getAmount(); + this.totalInterestWaived = calculateTotalInterestWaived(repaymentScheduleInstallments, currency).getAmount(); + this.totalInterestWrittenOff = calculateTotalInterestWrittenOff(repaymentScheduleInstallments, currency).getAmount(); this.totalInterestOutstanding = totalInterestCharged.minus(this.totalInterestRepaid).minus(this.totalInterestWaived) .minus(this.totalInterestWrittenOff).getAmount(); - final Money totalFeeChargesCharged = summaryWrapper.calculateTotalFeeChargesCharged(repaymentScheduleInstallments, currency) + final Money totalFeeChargesCharged = calculateTotalFeeChargesCharged(repaymentScheduleInstallments, currency) .plus(this.totalFeeChargesDueAtDisbursement); this.totalFeeChargesCharged = totalFeeChargesCharged.getAmount(); - Money totalFeeChargesRepaidAtDisbursement = summaryWrapper.calculateTotalChargesRepaidAtDisbursement(charges, currency); - Money totalFeeChargesRepaidAfterDisbursement = summaryWrapper.calculateTotalFeeChargesRepaid(repaymentScheduleInstallments, - currency); + Money totalFeeChargesRepaidAtDisbursement = calculateTotalChargesRepaidAtDisbursement(charges, currency); + Money totalFeeChargesRepaidAfterDisbursement = calculateTotalFeeChargesRepaid(repaymentScheduleInstallments, currency); this.totalFeeChargesRepaid = totalFeeChargesRepaidAfterDisbursement.plus(totalFeeChargesRepaidAtDisbursement).getAmount(); if (charges != null) { - this.totalFeeChargesWaived = summaryWrapper.calculateTotalFeeChargesWaived(charges, currency).getAmount(); + this.totalFeeChargesWaived = calculateTotalFeeChargesWaived(charges, currency).getAmount(); } else { this.totalFeeChargesWaived = BigDecimal.ZERO; } - this.totalFeeChargesWrittenOff = summaryWrapper.calculateTotalFeeChargesWrittenOff(repaymentScheduleInstallments, currency) - .getAmount(); + this.totalFeeChargesWrittenOff = calculateTotalFeeChargesWrittenOff(repaymentScheduleInstallments, currency).getAmount(); this.totalFeeChargesOutstanding = totalFeeChargesCharged.minus(this.totalFeeChargesRepaid).minus(this.totalFeeChargesWaived) .minus(this.totalFeeChargesWrittenOff).getAmount(); - final Money totalPenaltyChargesCharged = summaryWrapper.calculateTotalPenaltyChargesCharged(repaymentScheduleInstallments, - currency); + final Money totalPenaltyChargesCharged = calculateTotalPenaltyChargesCharged(repaymentScheduleInstallments, currency); this.totalPenaltyChargesCharged = totalPenaltyChargesCharged.getAmount(); - this.totalPenaltyChargesRepaid = summaryWrapper.calculateTotalPenaltyChargesRepaid(repaymentScheduleInstallments, currency) - .getAmount(); - this.totalPenaltyChargesWaived = summaryWrapper.calculateTotalPenaltyChargesWaived(repaymentScheduleInstallments, currency) - .getAmount(); - this.totalPenaltyChargesWrittenOff = summaryWrapper.calculateTotalPenaltyChargesWrittenOff(repaymentScheduleInstallments, currency) - .getAmount(); + this.totalPenaltyChargesRepaid = calculateTotalPenaltyChargesRepaid(repaymentScheduleInstallments, currency).getAmount(); + this.totalPenaltyChargesWaived = calculateTotalPenaltyChargesWaived(repaymentScheduleInstallments, currency).getAmount(); + this.totalPenaltyChargesWrittenOff = calculateTotalPenaltyChargesWrittenOff(repaymentScheduleInstallments, currency).getAmount(); this.totalPenaltyChargesOutstanding = totalPenaltyChargesCharged.minus(this.totalPenaltyChargesRepaid) .minus(this.totalPenaltyChargesWaived).minus(this.totalPenaltyChargesWrittenOff).getAmount(); @@ -302,4 +293,173 @@ public void updateTotalOutstanding(final BigDecimal newTotalOutstanding) { public void updateTotalWaived(final BigDecimal totalWaived) { this.totalWaived = totalWaived; } + + protected Money calculateTotalPrincipalRepaid(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getPrincipalCompleted(currency)); + } + return total; + } + + protected Money calculateTotalPrincipalAdjusted(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getCreditedPrincipal(currency)); + } + return total; + } + + protected Money calculateTotalFeeAdjusted(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getCreditedFee(currency)); + } + return total; + } + + protected Money calculateTotalPenaltyAdjusted(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getCreditedPenalty(currency)); + } + return total; + } + + protected Money calculateTotalPrincipalWrittenOff(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getPrincipalWrittenOff(currency)); + } + return total; + } + + protected Money calculateTotalInterestCharged(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getInterestCharged(currency)); + } + return total; + } + + protected Money calculateTotalInterestRepaid(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getInterestPaid(currency)); + } + return total; + } + + protected Money calculateTotalInterestWaived(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getInterestWaived(currency)); + } + return total; + } + + protected Money calculateTotalInterestWrittenOff(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getInterestWrittenOff(currency)); + } + return total; + } + + protected Money calculateTotalFeeChargesCharged(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getFeeChargesCharged(currency)); + } + return total; + } + + protected Money calculateTotalFeeChargesRepaid(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getFeeChargesPaid(currency)); + } + return total; + } + + protected Money calculateTotalFeeChargesWaived(Set charges, final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanCharge charge : charges) { + if (charge.isActive() && !charge.isPenaltyCharge()) { + total = total.plus(charge.getAmountWaived(currency)); + } + } + return total; + } + + protected Money calculateTotalFeeChargesWrittenOff(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getFeeChargesWrittenOff(currency)); + } + return total; + } + + protected Money calculateTotalPenaltyChargesCharged(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getPenaltyChargesCharged(currency)); + } + return total; + } + + protected Money calculateTotalPenaltyChargesRepaid(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getPenaltyChargesPaid(currency)); + } + return total; + } + + protected Money calculateTotalPenaltyChargesWaived(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getPenaltyChargesWaived(currency)); + } + return total; + } + + protected Money calculateTotalPenaltyChargesWrittenOff(final List repaymentScheduleInstallments, + final MonetaryCurrency currency) { + Money total = Money.zero(currency); + for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { + total = total.plus(installment.getPenaltyChargesWrittenOff(currency)); + } + return total; + } + + protected Money calculateTotalChargesRepaidAtDisbursement(Set charges, MonetaryCurrency currency) { + Money total = Money.zero(currency); + if (charges == null) { + return total; + } + for (final LoanCharge loanCharge : charges) { + if (!loanCharge.isPenaltyCharge() && loanCharge.getAmountPaid(currency).isGreaterThanZero() + && loanCharge.isDisbursementCharge()) { + total = total.plus(loanCharge.getAmountPaid(currency)); + } + } + return total; + + } } diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryWrapper.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryWrapper.java deleted file mode 100644 index 8ad10df39a..0000000000 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryWrapper.java +++ /dev/null @@ -1,276 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.fineract.portfolio.loanaccount.domain; - -import java.time.LocalDate; -import java.util.List; -import java.util.Set; -import org.apache.fineract.infrastructure.core.service.DateUtils; -import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; -import org.apache.fineract.organisation.monetary.domain.Money; -import org.springframework.stereotype.Component; - -/** - * A wrapper for dealing with side-effect free functionality related to a loans transactions and repayment schedule. - */ -@Component -public final class LoanSummaryWrapper { - - public Money calculateTotalPrincipalRepaid(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getPrincipalCompleted(currency)); - } - return total; - } - - public Money calculateTotalPrincipalAdjusted(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getCreditedPrincipal(currency)); - } - return total; - } - - public Money calculateTotalFeeAdjusted(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getCreditedFee(currency)); - } - return total; - } - - public Money calculateTotalPenaltyAdjusted(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getCreditedPenalty(currency)); - } - return total; - } - - public Money calculateTotalPrincipalWrittenOff(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getPrincipalWrittenOff(currency)); - } - return total; - } - - public Money calculateTotalPrincipalOverdueOn(final List repaymentScheduleInstallments, - final MonetaryCurrency currency, final LocalDate overdueAsOf) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - if (installment.isOverdueOn(overdueAsOf)) { - total = total.plus(installment.getPrincipalOutstanding(currency)); - } - } - return total; - } - - public Money calculateTotalInterestCharged(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getInterestCharged(currency)); - } - return total; - } - - public Money calculateTotalInterestRepaid(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getInterestPaid(currency)); - } - return total; - } - - public Money calculateTotalInterestWaived(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getInterestWaived(currency)); - } - return total; - } - - public Money calculateTotalInterestWrittenOff(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getInterestWrittenOff(currency)); - } - return total; - } - - public Money calculateTotalInterestOverdueOn(final List repaymentScheduleInstallments, - final MonetaryCurrency currency, final LocalDate overdueAsOf) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - if (installment.isOverdueOn(overdueAsOf)) { - total = total.plus(installment.getInterestOutstanding(currency)); - } - } - return total; - } - - public Money calculateTotalFeeChargesCharged(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getFeeChargesCharged(currency)); - } - return total; - } - - public Money calculateTotalFeeChargesRepaid(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getFeeChargesPaid(currency)); - } - return total; - } - - public Money calculateTotalFeeChargesWaived(Set charges, final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanCharge charge : charges) { - if (charge.isActive() && !charge.isPenaltyCharge()) { - total = total.plus(charge.getAmountWaived(currency)); - } - } - return total; - } - - public Money calculateTotalFeeChargesWrittenOff(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getFeeChargesWrittenOff(currency)); - } - return total; - } - - public Money calculateTotalFeeChargesOverdueOn(final List repaymentScheduleInstallments, - final MonetaryCurrency currency, final LocalDate overdueAsOf) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - if (installment.isOverdueOn(overdueAsOf)) { - total = total.plus(installment.getFeeChargesOutstanding(currency)); - } - } - return total; - } - - public Money calculateTotalPenaltyChargesCharged(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getPenaltyChargesCharged(currency)); - } - return total; - } - - public Money calculateTotalPenaltyChargesRepaid(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getPenaltyChargesPaid(currency)); - } - return total; - } - - public Money calculateTotalPenaltyChargesWaived(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getPenaltyChargesWaived(currency)); - } - return total; - } - - public Money calculateTotalPenaltyChargesWrittenOff(final List repaymentScheduleInstallments, - final MonetaryCurrency currency) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - total = total.plus(installment.getPenaltyChargesWrittenOff(currency)); - } - return total; - } - - public Money calculateTotalPenaltyChargesOverdueOn(final List repaymentScheduleInstallments, - final MonetaryCurrency currency, final LocalDate overdueAsOf) { - Money total = Money.zero(currency); - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - if (installment.isOverdueOn(overdueAsOf)) { - total = total.plus(installment.getPenaltyChargesOutstanding(currency)); - } - } - return total; - } - - public Money calculateTotalOverdueOn(final List repaymentScheduleInstallments, - final MonetaryCurrency currency, final LocalDate overdueAsOf) { - - final Money principalOverdue = calculateTotalPrincipalOverdueOn(repaymentScheduleInstallments, currency, overdueAsOf); - final Money interestOverdue = calculateTotalInterestOverdueOn(repaymentScheduleInstallments, currency, overdueAsOf); - final Money feeChargesOverdue = calculateTotalFeeChargesOverdueOn(repaymentScheduleInstallments, currency, overdueAsOf); - final Money penaltyChargesOverdue = calculateTotalPenaltyChargesOverdueOn(repaymentScheduleInstallments, currency, overdueAsOf); - - return principalOverdue.plus(interestOverdue).plus(feeChargesOverdue).plus(penaltyChargesOverdue); - } - - public LocalDate determineOverdueSinceDateFrom(final List repaymentScheduleInstallments, - final MonetaryCurrency currency, final LocalDate from) { - - LocalDate overdueSince = null; - final Money totalOverdue = calculateTotalOverdueOn(repaymentScheduleInstallments, currency, from); - if (totalOverdue.isGreaterThanZero()) { - for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) { - if (installment.isOverdueOn(from)) { - if (overdueSince == null || DateUtils.isAfter(overdueSince, installment.getDueDate())) { - overdueSince = installment.getDueDate(); - } - } - } - } - - return overdueSince; - } - - public Money calculateTotalChargesRepaidAtDisbursement(Set charges, MonetaryCurrency currency) { - Money total = Money.zero(currency); - if (charges == null) { - return total; - } - for (final LoanCharge loanCharge : charges) { - if (!loanCharge.isPenaltyCharge() && loanCharge.getAmountPaid(currency).isGreaterThanZero() - && loanCharge.isDisbursementCharge()) { - total = total.plus(loanCharge.getAmountPaid(currency)); - } - } - return total; - - } -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java index 72bf1d2e57..6baf6e320b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java @@ -39,7 +39,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; -import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.LoanRepaymentScheduleTransactionProcessor; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleData; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanSchedulePeriodData; @@ -64,7 +63,6 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC private final LoanUtilService loanUtilService; private final LoanRepositoryWrapper loanRepository; private final LoanLifecycleStateMachine defaultLoanLifecycleStateMachine; - private final LoanSummaryWrapper loanSummaryWrapper; @Override public LoanScheduleModel calculateLoanSchedule(final JsonQuery query, Boolean validateParams) { @@ -212,8 +210,7 @@ private LoanApplicationTerms constructLoanApplicationTerms(final Loan loan) { private Loan fetchLoan(final Long accountId) { final Loan loanAccount = this.loanRepository.findOneWithNotFoundDetection(accountId, true); - loanAccount.setHelpers(defaultLoanLifecycleStateMachine, this.loanSummaryWrapper, - this.loanRepaymentScheduleTransactionProcessorFactory); + loanAccount.setHelpers(defaultLoanLifecycleStateMachine, this.loanRepaymentScheduleTransactionProcessorFactory); return loanAccount; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java index e8df96f894..f568095a18 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java @@ -30,7 +30,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; import org.apache.fineract.portfolio.loanaccount.domain.LoanRescheduleRequestToTermVariationMapping; -import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.LoanRepaymentScheduleTransactionProcessor; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleDTO; @@ -53,19 +52,17 @@ public class LoanReschedulePreviewPlatformServiceImpl implements LoanRescheduleP private final LoanUtilService loanUtilService; private final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory; private final LoanScheduleGeneratorFactory loanScheduleFactory; - private final LoanSummaryWrapper loanSummaryWrapper; private static final DefaultScheduledDateGenerator DEFAULT_SCHEDULED_DATE_GENERATOR = new DefaultScheduledDateGenerator(); @Autowired public LoanReschedulePreviewPlatformServiceImpl(final LoanRescheduleRequestRepositoryWrapper loanRescheduleRequestRepository, final LoanUtilService loanUtilService, final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory, - final LoanScheduleGeneratorFactory loanScheduleFactory, final LoanSummaryWrapper loanSummaryWrapper) { + final LoanScheduleGeneratorFactory loanScheduleFactory) { this.loanRescheduleRequestRepository = loanRescheduleRequestRepository; this.loanUtilService = loanUtilService; this.loanRepaymentScheduleTransactionProcessorFactory = loanRepaymentScheduleTransactionProcessorFactory; this.loanScheduleFactory = loanScheduleFactory; - this.loanSummaryWrapper = loanSummaryWrapper; } @Override @@ -132,7 +129,7 @@ public LoanScheduleModel previewLoanReschedule(Long requestId) { .determineProcessor(loan.transactionProcessingStrategy()); final LoanScheduleGenerator loanScheduleGenerator = this.loanScheduleFactory.create(loanApplicationTerms.getLoanScheduleType(), loanApplicationTerms.getInterestMethod()); - loan.setHelpers(null, this.loanSummaryWrapper, this.loanRepaymentScheduleTransactionProcessorFactory); + loan.setHelpers(null, this.loanRepaymentScheduleTransactionProcessorFactory); final LoanScheduleDTO loanSchedule = loanScheduleGenerator.rescheduleNextInstallments(mathContext, loanApplicationTerms, loan, loanApplicationTerms.getHolidayDetailDTO(), loanRepaymentScheduleTransactionProcessor, rescheduleFromDate); final LoanScheduleModel loanScheduleModel = loanSchedule.getLoanScheduleModel(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java index e1df63373e..9837dc8081 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java @@ -60,7 +60,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanRescheduleRequestToTermVariationMapping; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; -import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; @@ -113,7 +112,6 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche private final LoanUtilService loanUtilService; private final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory; private final LoanScheduleGeneratorFactory loanScheduleFactory; - private final LoanSummaryWrapper loanSummaryWrapper; private final AccountTransfersWritePlatformService accountTransfersWritePlatformService; private static final DefaultScheduledDateGenerator DEFAULT_SCHEDULED_DATE_GENERATOR = new DefaultScheduledDateGenerator(); private final LoanAccountDomainService loanAccountDomainService; @@ -430,7 +428,7 @@ public CommandProcessingResult approve(JsonCommand jsonCommand) { final LoanScheduleGenerator loanScheduleGenerator = this.loanScheduleFactory.create(loanApplicationTerms.getLoanScheduleType(), loanApplicationTerms.getInterestMethod()); final LoanLifecycleStateMachine loanLifecycleStateMachine = null; - loan.setHelpers(loanLifecycleStateMachine, this.loanSummaryWrapper, this.loanRepaymentScheduleTransactionProcessorFactory); + loan.setHelpers(loanLifecycleStateMachine, this.loanRepaymentScheduleTransactionProcessorFactory); final LoanScheduleDTO loanSchedule = loanScheduleGenerator.rescheduleNextInstallments(mathContext, loanApplicationTerms, loan, loanApplicationTerms.getHolidayDetailDTO(), loanRepaymentScheduleTransactionProcessor, rescheduleFromDate); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationValidator.java index f9db634b50..cc4067996a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationValidator.java @@ -95,7 +95,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; -import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.impl.AdvancedPaymentScheduleTransactionProcessor; import org.apache.fineract.portfolio.loanaccount.exception.ExceedingTrancheCountException; @@ -195,7 +194,6 @@ public final class LoanApplicationValidator { private final HolidayRepository holidayRepository; private final SavingsAccountRepositoryWrapper savingsAccountRepository; private final LoanLifecycleStateMachine defaultLoanLifecycleStateMachine; - private final LoanSummaryWrapper loanSummaryWrapper; private final CalendarInstanceRepository calendarInstanceRepository; private final LoanUtilService loanUtilService; private final EntityDatatableChecksWritePlatformService entityDatatableChecksWritePlatformService; @@ -1987,8 +1985,7 @@ public void validateApproval(JsonCommand command, Long loanId) { baseDataValidator.reset().parameter(LoanApiConstants.noteParameterName).value(note).notExceedingLengthOf(1000); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); - loan.setHelpers(defaultLoanLifecycleStateMachine, this.loanSummaryWrapper, - this.loanRepaymentScheduleTransactionProcessorFactory); + loan.setHelpers(defaultLoanLifecycleStateMachine, this.loanRepaymentScheduleTransactionProcessorFactory); final Client client = loan.client(); if (client != null && client.isNotActive()) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java index 55d5de5b70..fb53d65ba5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java @@ -1208,6 +1208,6 @@ public boolean isProgressiveAccrual(@NotNull Loan loan) { } private void setSetHelpers(Loan loan) { - loan.setHelpers(null, null, transactionProcessorFactory); + loan.setHelpers(null, transactionProcessorFactory); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index f17de8edef..4499fae5ef 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -79,7 +79,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; -import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; import org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeDeleted; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms; import org.apache.fineract.portfolio.loanaccount.loanschedule.service.LoanScheduleAssembler; @@ -109,7 +108,6 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa private final LoanRepositoryWrapper loanRepositoryWrapper; private final NoteRepository noteRepository; private final LoanAssembler loanAssembler; - private final LoanSummaryWrapper loanSummaryWrapper; private final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory; private final CalendarRepository calendarRepository; private final CalendarInstanceRepository calendarInstanceRepository; @@ -767,7 +765,7 @@ public CommandProcessingResult applicantWithdrawsFromApplication(final Long loan private Loan retrieveLoanBy(final Long loanId) { final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); - loan.setHelpers(defaultLoanLifecycleStateMachine, this.loanSummaryWrapper, this.loanRepaymentScheduleTransactionProcessorFactory); + loan.setHelpers(defaultLoanLifecycleStateMachine, this.loanRepaymentScheduleTransactionProcessorFactory); return loan; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java index 5a683baa8d..8c08bae3a5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java @@ -80,7 +80,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; -import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanTopupDetails; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.LoanRepaymentScheduleTransactionProcessor; import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.impl.AdvancedPaymentScheduleTransactionProcessor; @@ -117,7 +116,6 @@ public class LoanAssemblerImpl implements LoanAssembler { private final LoanScheduleAssembler loanScheduleAssembler; private final LoanChargeAssembler loanChargeAssembler; private final LoanCollateralAssembler collateralAssembler; - private final LoanSummaryWrapper loanSummaryWrapper; private final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory; private final HolidayRepository holidayRepository; private final ConfigurationDomainService configurationDomainService; @@ -142,16 +140,14 @@ public class LoanAssemblerImpl implements LoanAssembler { @Override public Loan assembleFrom(final Long accountId) { final Loan loanAccount = this.loanRepository.findOneWithNotFoundDetection(accountId, true); - loanAccount.setHelpers(defaultLoanLifecycleStateMachine, this.loanSummaryWrapper, - this.loanRepaymentScheduleTransactionProcessorFactory); + loanAccount.setHelpers(defaultLoanLifecycleStateMachine, this.loanRepaymentScheduleTransactionProcessorFactory); return loanAccount; } @Override public void setHelpers(final Loan loanAccount) { - loanAccount.setHelpers(defaultLoanLifecycleStateMachine, this.loanSummaryWrapper, - this.loanRepaymentScheduleTransactionProcessorFactory); + loanAccount.setHelpers(defaultLoanLifecycleStateMachine, this.loanRepaymentScheduleTransactionProcessorFactory); } @Override @@ -276,8 +272,7 @@ public Loan assembleFrom(final JsonCommand command) { } copyAdvancedPaymentRulesIfApplicable(transactionProcessingStrategyCode, loanProduct, loanApplication); - loanApplication.setHelpers(defaultLoanLifecycleStateMachine, this.loanSummaryWrapper, - this.loanRepaymentScheduleTransactionProcessorFactory); + loanApplication.setHelpers(defaultLoanLifecycleStateMachine, this.loanRepaymentScheduleTransactionProcessorFactory); // TODO: review loanChargeService.recalculateAllCharges(loanApplication); topUpLoanConfiguration(element, loanApplication); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java index d9fbc49b03..4d252e876f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -459,7 +459,7 @@ public LoanTransactionData retrieveLoanPrePaymentTemplate(final LoanTransactionT this.loanUtilService.validateRepaymentTransactionType(repaymentTransactionType); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); - loan.setHelpers(null, null, loanRepaymentScheduleTransactionProcessorFactory); + loan.setHelpers(null, loanRepaymentScheduleTransactionProcessorFactory); final MonetaryCurrency currency = loan.getCurrency(); final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index b6ed00e670..4e36091677 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -170,7 +170,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus; -import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; @@ -256,7 +255,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf private final BusinessEventNotifierService businessEventNotifierService; private final GuarantorDomainService guarantorDomainService; private final LoanUtilService loanUtilService; - private final LoanSummaryWrapper loanSummaryWrapper; private final EntityDatatableChecksWritePlatformService entityDatatableChecksWritePlatformService; private final LoanRepaymentScheduleTransactionProcessorFactory transactionProcessingStrategy; private final CodeValueRepositoryWrapper codeValueRepository; @@ -2380,7 +2378,7 @@ public void applyMeetingDateChanges(final Calendar calendar, final Collection