This is an automated email from the ASF dual-hosted git repository.
adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git
The following commit(s) were added to refs/heads/develop by this push:
new d57906d4f FINERACT-2081: Refactor - Simplify
`LoanSchedulePeriodData.java` class
d57906d4f is described below
commit d57906d4fa4073a2a8e2f42c04aeca6e680be027
Author: Adam Saghy <[email protected]>
AuthorDate: Mon Dec 9 18:57:35 2024 +0100
FINERACT-2081: Refactor - Simplify `LoanSchedulePeriodData.java` class
---
.../infrastructure/core/service/MathUtil.java | 168 +++----
.../LoanArrearsAgeingUpdateHandler.java | 15 +-
.../data/LoanScheduleModelDownPaymentPeriod.java | 2 +-
.../loanschedule/data/LoanSchedulePeriodData.java | 538 ++++++++-------------
.../domain/LoanScheduleModelRepaymentPeriod.java | 2 +-
.../domain/LoanRescheduleModelRepaymentPeriod.java | 2 +-
.../service/LoanArrearsAgingServiceImpl.java | 16 +-
...LoanScheduleCalculationPlatformServiceImpl.java | 15 +-
...LoanScheduleHistoryReadPlatformServiceImpl.java | 5 +-
.../service/CommonLoanSummaryDataProvider.java | 7 +-
.../service/CumulativeLoanSummaryDataProvider.java | 6 +-
.../service/LoanReadPlatformServiceImpl.java | 11 +-
12 files changed, 293 insertions(+), 494 deletions(-)
diff --git
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/MathUtil.java
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/MathUtil.java
index a543a3f1d..9eab9a85e 100644
---
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/MathUtil.java
+++
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/MathUtil.java
@@ -113,8 +113,12 @@ public final class MathUtil {
* @param notNull
* if true then null parameter is omitted, otherwise returns
null
*/
- public static Long min(Long first, Long second, Long third, boolean
notNull) {
- return min(min(first, second, notNull), third, notNull);
+ public static Long min(boolean notNull, Long first, Long... amounts) {
+ Long result = first;
+ for (Long amount : amounts) {
+ result = min(result, amount, notNull);
+ }
+ return result;
}
/** @return sum the two values considering null values */
@@ -123,18 +127,12 @@ public final class MathUtil {
}
/** @return sum the values considering null values */
- public static Long add(Long first, Long second, Long third) {
- return add(add(first, second), third);
- }
-
- /** @return sum the values considering null values */
- public static Long add(Long first, Long second, Long third, Long fourth) {
- return add(add(add(first, second), third), fourth);
- }
-
- /** @return sum the values considering null values */
- public static Long add(Long first, Long second, Long third, Long fourth,
Long fifth) {
- return add(add(add(add(first, second), third), fourth), fifth);
+ public static Long add(Long... amounts) {
+ Long result = null;
+ for (Long amount : amounts) {
+ result = add(result, amount);
+ }
+ return result;
}
/** @return first minus second considering null values, maybe negative */
@@ -142,18 +140,24 @@ public final class MathUtil {
return first == null ? null : second == null ? first :
Math.subtractExact(first, second);
}
- /**
- * @return first minus the others considering null values, maybe negative
- */
- public static Long subtractToZero(Long first, Long second, Long third) {
- return subtractToZero(subtract(first, second), third);
+ /** @return first minus second considering null values, maybe negative */
+ public static Long subtract(Long first, Long... amounts) {
+ Long result = first;
+ for (Long amount : amounts) {
+ result = subtract(result, amount);
+ }
+ return result;
}
/**
* @return first minus the others considering null values, maybe negative
*/
- public static Long subtractToZero(Long first, Long second, Long third,
Long fourth) {
- return subtractToZero(subtract(subtract(first, second), third),
fourth);
+ public static Long subtractToZero(Long first, Long... amounts) {
+ Long result = first;
+ for (Long amount : amounts) {
+ result = subtractToZero(result, amount);
+ }
+ return result;
}
/** @return NONE negative first minus second considering null values */
@@ -241,8 +245,12 @@ public final class MathUtil {
* @param notNull
* if true then null parameter is omitted, otherwise returns
null
*/
- public static BigDecimal min(BigDecimal first, BigDecimal second,
BigDecimal third, boolean notNull) {
- return min(min(first, second, notNull), third, notNull);
+ public static BigDecimal min(boolean notNull, BigDecimal first,
BigDecimal... amounts) {
+ BigDecimal result = first;
+ for (BigDecimal amount : amounts) {
+ result = min(result, amount, notNull);
+ }
+ return result;
}
/** @return sum the two values considering null values */
@@ -256,44 +264,21 @@ public final class MathUtil {
}
/** @return sum the values considering null values */
- public static BigDecimal add(BigDecimal first, BigDecimal second,
BigDecimal third) {
- return add(first, second, third, MoneyHelper.getMathContext());
- }
-
- /** @return sum the values considering null values */
- public static BigDecimal add(BigDecimal first, BigDecimal second,
BigDecimal third, MathContext mc) {
- return add(add(first, second, mc), third, mc);
- }
-
- /** @return sum the values considering null values */
- public static BigDecimal add(BigDecimal first, BigDecimal second,
BigDecimal third, BigDecimal fourth) {
- return add(first, second, third, fourth, MoneyHelper.getMathContext());
- }
-
- /** @return sum the values considering null values */
- public static BigDecimal add(BigDecimal first, BigDecimal second,
BigDecimal third, BigDecimal fourth, MathContext mc) {
- return add(add(add(first, second, mc), third, mc), fourth, mc);
- }
-
- /** @return sum the values considering null values */
- public static BigDecimal add(BigDecimal first, BigDecimal second,
BigDecimal third, BigDecimal fourth, BigDecimal fifth) {
- return add(first, second, third, fourth, fifth,
MoneyHelper.getMathContext());
- }
-
- /** @return sum the values considering null values */
- public static BigDecimal add(BigDecimal first, BigDecimal second,
BigDecimal third, BigDecimal fourth, BigDecimal fifth,
- MathContext mc) {
- return add(add(add(add(first, second, mc), third, mc), fourth, mc),
fifth, mc);
+ public static BigDecimal add(BigDecimal... amounts) {
+ BigDecimal result = null;
+ for (BigDecimal amount : amounts) {
+ result = add(result, amount, MoneyHelper.getMathContext());
+ }
+ return result;
}
/** @return first minus second considering null values, maybe negative */
- public static BigDecimal subtract(BigDecimal first, BigDecimal second) {
- return subtract(first, second, MoneyHelper.getMathContext());
- }
-
- /** @return first minus the others considering null values, maybe negative
*/
- public static BigDecimal subtract(BigDecimal first, BigDecimal second,
BigDecimal third) {
- return subtract(subtract(first, second), third);
+ public static BigDecimal subtract(BigDecimal first, BigDecimal... amounts)
{
+ BigDecimal result = first;
+ for (BigDecimal amount : amounts) {
+ result = subtract(result, amount, MoneyHelper.getMathContext());
+ }
+ return result;
}
/** @return first minus second considering null values, maybe negative */
@@ -302,22 +287,9 @@ public final class MathUtil {
}
/** @return NONE negative first minus second considering null values */
- public static BigDecimal subtractToZero(BigDecimal first, BigDecimal
second) {
- return negativeToZero(subtract(first, second));
- }
-
- /**
- * @return first minus the others considering null values, maybe negative
- */
- public static BigDecimal subtractToZero(BigDecimal first, BigDecimal
second, BigDecimal third) {
- return subtractToZero(subtract(first, second), third);
- }
-
- /**
- * @return first minus the others considering null values, maybe negative
- */
- public static BigDecimal subtractToZero(BigDecimal first, BigDecimal
second, BigDecimal third, BigDecimal fourth) {
- return subtractToZero(subtract(subtract(first, second), third),
fourth);
+ public static BigDecimal subtractToZero(BigDecimal first, BigDecimal...
amounts) {
+ BigDecimal result = subtract(first, amounts);
+ return negativeToZero(result);
}
/**
@@ -409,39 +381,39 @@ public final class MathUtil {
return first == null ? second : second == null ? first :
first.plus(second, mc);
}
- public static Money plus(Money first, Money second, Money third) {
- return plus(plus(first, second), third);
- }
-
- public static Money plus(Money first, Money second, Money third,
MathContext mc) {
- return plus(plus(first, second), third, mc);
+ public static Money plus(Money... multipleAmounts) {
+ Money result = null;
+ for (Money amount : multipleAmounts) {
+ result = plus(result, amount);
+ }
+ return result;
}
- public static Money plus(Money first, Money second, Money third, Money
fourth) {
- return plus(plus(plus(first, second), third), fourth);
+ public static Money plus(MathContext mc, Money... multipleAmounts) {
+ Money result = null;
+ for (Money amount : multipleAmounts) {
+ result = plus(result, amount, mc);
+ }
+ return result;
}
public static Money minus(Money first, Money second) {
return first == null ? null : second == null ? first :
first.minus(second);
}
- /**
- * @return first minus the others considering null values, maybe negative
- */
- public static Money minusToZero(Money first, Money second, Money third) {
- return minusToZero(minus(first, second), third);
+ public static Money minus(Money first, Money... multipleAmounts) {
+ Money result = first;
+ for (Money amount : multipleAmounts) {
+ result = minus(result, amount);
+ }
+ return result;
}
/**
* @return first minus the others considering null values, maybe negative
*/
- public static Money minusToZero(Money first, Money second, Money third,
Money fourth) {
- return minusToZero(minus(minus(first, second), third), fourth);
- }
-
- /** @return NONE negative first minus second considering null values */
- public static Money minusToZero(Money first, Money second) {
- return negativeToZero(minus(first, second));
+ public static Money minusToZero(Money first, Money... multipleAmounts) {
+ return negativeToZero(minus(first, multipleAmounts));
}
/**
@@ -459,8 +431,12 @@ public final class MathUtil {
* @param notNull
* if true then null parameter is omitted, otherwise returns
null
*/
- public static Money min(Money first, Money second, Money third, boolean
notNull) {
- return min(min(first, second, notNull), third, notNull);
+ public static Money min(boolean notNull, Money first, Money... amounts) {
+ Money result = first;
+ for (Money amount : amounts) {
+ result = min(result, amount, notNull);
+ }
+ return result;
}
/** @return Money null safe negate */
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/LoanArrearsAgeingUpdateHandler.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/LoanArrearsAgeingUpdateHandler.java
index aac6e0df9..c9bf5bf86 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/LoanArrearsAgeingUpdateHandler.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/LoanArrearsAgeingUpdateHandler.java
@@ -227,7 +227,8 @@ public class LoanArrearsAgeingUpdateHandler {
LoanOriginalScheduleExtractor(DatabaseSpecificSQLGenerator
sqlGenerator) {
final StringBuilder scheduleDetail = new StringBuilder();
- scheduleDetail.append("select ml.id as loanId, mr.duedate as
dueDate, mr.principal_amount as principalAmount, ");
+ scheduleDetail.append(
+ "select ml.id as loanId, mr.installment as
installmentNumber, mr.fromdate as fromDate, mr.duedate as dueDate,
mr.principal_amount as principalAmount, ");
scheduleDetail.append(
"mr.interest_amount as interestAmount,
mr.fee_charges_amount as feeAmount, mr.penalty_charges_amount as penaltyAmount
");
scheduleDetail.append("from m_loan ml INNER JOIN
m_loan_repayment_schedule_history mr on mr.loan_id = ml.id ");
@@ -253,19 +254,15 @@ public class LoanArrearsAgeingUpdateHandler {
}
private LoanSchedulePeriodData fetchLoanSchedulePeriodData(ResultSet
rs) throws SQLException {
+ final Integer installmentNumber = JdbcSupport.getInteger(rs,
"installmentNumber");
+ final LocalDate fromDate = JdbcSupport.getLocalDate(rs,
"fromDate");
final LocalDate dueDate = JdbcSupport.getLocalDate(rs, "dueDate");
final BigDecimal principalDue =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalAmount");
final BigDecimal interestDueOnPrincipalOutstanding =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "interestAmount");
- final BigDecimal totalInstallmentAmount =
principalDue.add(interestDueOnPrincipalOutstanding);
final BigDecimal feeChargesDueForPeriod =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "feeAmount");
final BigDecimal penaltyChargesDueForPeriod =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "penaltyAmount");
- final Integer periodNumber = null;
- final LocalDate fromDate = null;
- final BigDecimal principalOutstanding = null;
- final BigDecimal totalDueForPeriod = null;
- return LoanSchedulePeriodData.repaymentOnlyPeriod(periodNumber,
fromDate, dueDate, principalDue, principalOutstanding,
- interestDueOnPrincipalOutstanding, feeChargesDueForPeriod,
penaltyChargesDueForPeriod, totalDueForPeriod,
- totalInstallmentAmount);
+ return
LoanSchedulePeriodData.repaymentOnlyPeriod(installmentNumber, fromDate,
dueDate, principalDue, null,
+ interestDueOnPrincipalOutstanding, feeChargesDueForPeriod,
penaltyChargesDueForPeriod);
}
}
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleModelDownPaymentPeriod.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleModelDownPaymentPeriod.java
index ad31e819b..774b1a776 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleModelDownPaymentPeriod.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleModelDownPaymentPeriod.java
@@ -31,7 +31,7 @@ public final class LoanScheduleModelDownPaymentPeriod
implements LoanScheduleMod
private final int periodNumber;
private final LocalDate periodDate;
- private Money principalDue;
+ private final Money principalDue;
private final Money outstandingLoanBalance;
public static LoanScheduleModelDownPaymentPeriod downPayment(final int
periodNumber, final LocalDate periodDate,
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java
index 5be2758e9..e5fdb22ba 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java
@@ -20,14 +20,17 @@ package
org.apache.fineract.portfolio.loanaccount.loanschedule.data;
import java.math.BigDecimal;
import java.time.LocalDate;
+import lombok.Builder;
import lombok.Getter;
import org.apache.fineract.infrastructure.core.service.DateUtils;
+import org.apache.fineract.infrastructure.core.service.MathUtil;
/**
* Immutable data object that represents a period of a loan schedule.
*
*/
@Getter
+@Builder
public final class LoanSchedulePeriodData {
private final Integer period;
@@ -72,434 +75,275 @@ public final class LoanSchedulePeriodData {
private final BigDecimal totalInstallmentAmountForPeriod;
private final BigDecimal totalCredits;
private final BigDecimal totalAccruedInterest;
- private final Boolean downPaymentPeriod;
+ private final boolean downPaymentPeriod;
public static LoanSchedulePeriodData disbursementOnlyPeriod(final
LocalDate disbursementDate, final BigDecimal principalDisbursed,
final BigDecimal feeChargesDueAtTimeOfDisbursement, final boolean
isDisbursed) {
- final Integer periodNumber = null;
- final LocalDate from = null;
- return new LoanSchedulePeriodData(periodNumber, from,
disbursementDate, principalDisbursed, feeChargesDueAtTimeOfDisbursement,
- isDisbursed);
+ return builder().dueDate(disbursementDate) //
+ .principalDisbursed(principalDisbursed) //
+ .principalLoanBalanceOutstanding(principalDisbursed) //
+ .feeChargesDue(feeChargesDueAtTimeOfDisbursement) //
+ .feeChargesPaid(isDisbursed ?
feeChargesDueAtTimeOfDisbursement : null) //
+ .feeChargesOutstanding(isDisbursed ? null :
feeChargesDueAtTimeOfDisbursement) //
+ .totalOriginalDueForPeriod(feeChargesDueAtTimeOfDisbursement)
//
+ .totalDueForPeriod(feeChargesDueAtTimeOfDisbursement) //
+ .totalPaidForPeriod(isDisbursed ?
feeChargesDueAtTimeOfDisbursement : null) //
+ .totalOutstandingForPeriod(isDisbursed ? null :
feeChargesDueAtTimeOfDisbursement) //
+
.totalActualCostOfLoanForPeriod(feeChargesDueAtTimeOfDisbursement) //
+ .totalOverdue(DateUtils.isBeforeBusinessDate(disbursementDate)
&& !isDisbursed ? feeChargesDueAtTimeOfDisbursement : null) //
+ .build();
}
public static LoanSchedulePeriodData repaymentOnlyPeriod(final Integer
periodNumber, final LocalDate fromDate, final LocalDate dueDate,
- final BigDecimal principalDue, final BigDecimal
principalOutstanding, final BigDecimal interestDueOnPrincipalOutstanding,
- final BigDecimal feeChargesDueForPeriod, final BigDecimal
penaltyChargesDueForPeriod, final BigDecimal totalDueForPeriod,
- final BigDecimal totalInstallmentAmountForPeriod) {
-
- return new LoanSchedulePeriodData(periodNumber, fromDate, dueDate,
principalDue, principalOutstanding,
- interestDueOnPrincipalOutstanding, feeChargesDueForPeriod,
penaltyChargesDueForPeriod, totalDueForPeriod,
- totalInstallmentAmountForPeriod);
+ final BigDecimal principalDue, final BigDecimal
outstandingLoanBalance, final BigDecimal interestDue, final BigDecimal feeDue,
+ final BigDecimal penaltyDue) {
+
+ BigDecimal totalDue = MathUtil.add(principalDue, interestDue, feeDue,
penaltyDue);
+ BigDecimal totalActualCostOfLoanForPeriod = MathUtil.add(interestDue,
feeDue, penaltyDue);
+ BigDecimal totalInstallmentAmount = MathUtil.add(principalDue,
interestDue);
+
+ return builder().period(periodNumber) //
+ .fromDate(fromDate) //
+ .dueDate(dueDate) //
+ .daysInPeriod(DateUtils.getExactDifferenceInDays(fromDate,
dueDate)) //
+ .principalDue(principalDue) //
+ .principalOriginalDue(principalDue) //
+ .principalOutstanding(principalDue) //
+ .principalLoanBalanceOutstanding(outstandingLoanBalance) //
+ .interestDue(interestDue) //
+ .interestOriginalDue(interestDue) //
+ .interestOutstanding(interestDue) //
+ .feeChargesDue(feeDue) //
+ .feeChargesOutstanding(feeDue) //
+ .penaltyChargesDue(penaltyDue) //
+ .penaltyChargesOutstanding(penaltyDue) //
+ .totalOriginalDueForPeriod(totalDue) //
+ .totalDueForPeriod(totalDue) //
+ .totalOutstandingForPeriod(totalDue) //
+
.totalActualCostOfLoanForPeriod(totalActualCostOfLoanForPeriod) //
+ .totalInstallmentAmountForPeriod(totalInstallmentAmount) //
+ .totalOverdue(DateUtils.isBeforeBusinessDate(dueDate) ?
totalDue : null) //
+ .build();
}
public static LoanSchedulePeriodData downPaymentOnlyPeriod(final Integer
periodNumber, final LocalDate periodDate,
- final BigDecimal principalDue, final BigDecimal
principalOutstanding) {
- return new LoanSchedulePeriodData(periodNumber, periodDate,
periodDate, principalDue, principalOutstanding);
- }
-
- public static LoanSchedulePeriodData
periodWithPayments(@SuppressWarnings("unused") final Long loanId, final Integer
periodNumber,
- final LocalDate fromDate, final LocalDate dueDate, final LocalDate
obligationsMetOnDate, final boolean complete,
- final BigDecimal principalOriginalDue, final BigDecimal
principalPaid, final BigDecimal principalWrittenOff,
- final BigDecimal principalOutstanding, final BigDecimal
outstandingPrincipalBalanceOfLoan,
- final BigDecimal interestDueOnPrincipalOutstanding, final
BigDecimal interestPaid, final BigDecimal interestWaived,
- final BigDecimal interestWrittenOff, final BigDecimal
interestOutstanding, final BigDecimal feeChargesDue,
- final BigDecimal feeChargesPaid, final BigDecimal
feeChargesWaived, final BigDecimal feeChargesWrittenOff,
- final BigDecimal feeChargesOutstanding, final BigDecimal
penaltyChargesDue, final BigDecimal penaltyChargesPaid,
- final BigDecimal penaltyChargesWaived, final BigDecimal
penaltyChargesWrittenOff, final BigDecimal penaltyChargesOutstanding,
- final BigDecimal totalDueForPeriod, final BigDecimal totalPaid,
final BigDecimal totalPaidInAdvanceForPeriod,
- final BigDecimal totalPaidLateForPeriod, final BigDecimal
totalWaived, final BigDecimal totalWrittenOff,
- final BigDecimal totalOutstanding, final BigDecimal
totalActualCostOfLoanForPeriod,
- final BigDecimal totalInstallmentAmountForPeriod, final BigDecimal
totalCredits, final boolean isDownPayment,
- final BigDecimal totalAccruedInterest) {
-
- return new LoanSchedulePeriodData(periodNumber, fromDate, dueDate,
obligationsMetOnDate, complete, principalOriginalDue,
- principalPaid, principalWrittenOff, principalOutstanding,
outstandingPrincipalBalanceOfLoan,
- interestDueOnPrincipalOutstanding, interestPaid,
interestWaived, interestWrittenOff, interestOutstanding, feeChargesDue,
- feeChargesPaid, feeChargesWaived, feeChargesWrittenOff,
feeChargesOutstanding, penaltyChargesDue, penaltyChargesPaid,
- penaltyChargesWaived, penaltyChargesWrittenOff,
penaltyChargesOutstanding, totalDueForPeriod, totalPaid,
- totalPaidInAdvanceForPeriod, totalPaidLateForPeriod,
totalWaived, totalWrittenOff, totalOutstanding,
- totalActualCostOfLoanForPeriod,
totalInstallmentAmountForPeriod, totalCredits, isDownPayment,
totalAccruedInterest);
- }
-
- public static LoanSchedulePeriodData withPaidDetail(final
LoanSchedulePeriodData loanSchedulePeriodData, final boolean complete,
- final BigDecimal principalPaid, final BigDecimal interestPaid,
final BigDecimal feeChargesPaid,
- final BigDecimal penaltyChargesPaid) {
-
- return new LoanSchedulePeriodData(loanSchedulePeriodData.period,
loanSchedulePeriodData.fromDate, loanSchedulePeriodData.dueDate,
- loanSchedulePeriodData.obligationsMetOnDate, complete,
loanSchedulePeriodData.principalOriginalDue, principalPaid,
- loanSchedulePeriodData.principalWrittenOff,
loanSchedulePeriodData.principalOutstanding,
- loanSchedulePeriodData.principalLoanBalanceOutstanding,
loanSchedulePeriodData.interestDue, interestPaid,
- loanSchedulePeriodData.interestWaived,
loanSchedulePeriodData.interestWrittenOff,
- loanSchedulePeriodData.interestOutstanding,
loanSchedulePeriodData.feeChargesDue, feeChargesPaid,
- loanSchedulePeriodData.feeChargesWaived,
loanSchedulePeriodData.feeChargesWrittenOff,
- loanSchedulePeriodData.feeChargesOutstanding,
loanSchedulePeriodData.penaltyChargesDue, penaltyChargesPaid,
- loanSchedulePeriodData.penaltyChargesWaived,
loanSchedulePeriodData.penaltyChargesWrittenOff,
- loanSchedulePeriodData.penaltyChargesOutstanding,
loanSchedulePeriodData.totalDueForPeriod,
- loanSchedulePeriodData.totalPaidForPeriod,
loanSchedulePeriodData.totalPaidInAdvanceForPeriod,
- loanSchedulePeriodData.totalPaidLateForPeriod,
loanSchedulePeriodData.totalWaivedForPeriod,
- loanSchedulePeriodData.totalWrittenOffForPeriod,
loanSchedulePeriodData.totalOutstandingForPeriod,
- loanSchedulePeriodData.totalActualCostOfLoanForPeriod,
loanSchedulePeriodData.totalInstallmentAmountForPeriod,
- loanSchedulePeriodData.totalCredits,
loanSchedulePeriodData.getDownPaymentPeriod(),
- loanSchedulePeriodData.totalAccruedInterest);
- }
-
- /*
- * constructor used for creating period on loan schedule that is only a
disbursement (typically first period)
- */
- private LoanSchedulePeriodData(final Integer periodNumber, final LocalDate
fromDate, final LocalDate dueDate,
- final BigDecimal principalDisbursed, final BigDecimal
chargesDueAtTimeOfDisbursement, final boolean isDisbursed) {
- this.period = periodNumber;
- this.fromDate = fromDate;
- this.dueDate = dueDate;
- this.obligationsMetOnDate = null;
- this.complete = null;
- if (fromDate != null) {
- this.daysInPeriod =
DateUtils.getExactDifferenceInDays(this.fromDate, this.dueDate);
- } else {
- this.daysInPeriod = null;
- }
- this.principalDisbursed = principalDisbursed;
- this.principalOriginalDue = null;
- this.principalDue = null;
- this.principalPaid = null;
- this.principalWrittenOff = null;
- this.principalOutstanding = null;
- this.principalLoanBalanceOutstanding = principalDisbursed;
-
- this.interestOriginalDue = null;
- this.interestDue = null;
- this.interestPaid = null;
- this.interestWaived = null;
- this.interestWrittenOff = null;
- this.interestOutstanding = null;
-
- this.feeChargesDue = chargesDueAtTimeOfDisbursement;
- if (isDisbursed) {
- this.feeChargesPaid = chargesDueAtTimeOfDisbursement;
- this.feeChargesWaived = null;
- this.feeChargesWrittenOff = null;
- this.feeChargesOutstanding = null;
- } else {
- this.feeChargesPaid = null;
- this.feeChargesWaived = null;
- this.feeChargesWrittenOff = null;
- this.feeChargesOutstanding = chargesDueAtTimeOfDisbursement;
- }
-
- this.penaltyChargesDue = null;
- this.penaltyChargesPaid = null;
- this.penaltyChargesWaived = null;
- this.penaltyChargesWrittenOff = null;
- this.penaltyChargesOutstanding = null;
-
- this.totalOriginalDueForPeriod = chargesDueAtTimeOfDisbursement;
- this.totalDueForPeriod = chargesDueAtTimeOfDisbursement;
- this.totalPaidForPeriod = this.feeChargesPaid;
- this.totalPaidInAdvanceForPeriod = null;
- this.totalPaidLateForPeriod = null;
- this.totalWaivedForPeriod = null;
- this.totalWrittenOffForPeriod = null;
- this.totalOutstandingForPeriod = this.feeChargesOutstanding;
- this.totalActualCostOfLoanForPeriod = this.feeChargesDue;
- this.totalInstallmentAmountForPeriod = null;
- this.totalOverdue = DateUtils.isBeforeBusinessDate(dueDate) ?
this.totalOutstandingForPeriod : null;
- this.totalCredits = BigDecimal.ZERO;
- this.totalAccruedInterest = BigDecimal.ZERO;
- this.downPaymentPeriod = false;
- }
-
- /*
- * used for repayment only period when creating an empty loan schedule for
preview etc
- */
- private LoanSchedulePeriodData(final Integer periodNumber, final LocalDate
fromDate, final LocalDate dueDate,
- final BigDecimal principalOriginalDue, final BigDecimal
principalOutstanding,
- final BigDecimal interestDueOnPrincipalOutstanding, final
BigDecimal feeChargesDueForPeriod,
- final BigDecimal penaltyChargesDueForPeriod, final BigDecimal
totalDueForPeriod, BigDecimal totalInstallmentAmountForPeriod) {
- this.period = periodNumber;
- this.fromDate = fromDate;
- this.dueDate = dueDate;
- this.obligationsMetOnDate = null;
- this.complete = null;
- if (fromDate != null) {
- this.daysInPeriod =
DateUtils.getExactDifferenceInDays(this.fromDate, this.dueDate);
- } else {
- this.daysInPeriod = null;
- }
- this.principalDisbursed = null;
- this.principalOriginalDue = principalOriginalDue;
- this.principalDue = principalOriginalDue;
- this.principalPaid = null;
- this.principalWrittenOff = null;
- this.principalOutstanding = principalOriginalDue;
- this.principalLoanBalanceOutstanding = principalOutstanding;
-
- this.interestOriginalDue = interestDueOnPrincipalOutstanding;
- this.interestDue = interestDueOnPrincipalOutstanding;
- this.interestPaid = null;
- this.interestWaived = null;
- this.interestWrittenOff = null;
- this.interestOutstanding = interestDueOnPrincipalOutstanding;
-
- this.feeChargesDue = feeChargesDueForPeriod;
- this.feeChargesPaid = null;
- this.feeChargesWaived = null;
- this.feeChargesWrittenOff = null;
- this.feeChargesOutstanding = null;
-
- this.penaltyChargesDue = penaltyChargesDueForPeriod;
- this.penaltyChargesPaid = null;
- this.penaltyChargesWaived = null;
- this.penaltyChargesWrittenOff = null;
- this.penaltyChargesOutstanding = null;
-
- this.totalOriginalDueForPeriod = totalDueForPeriod;
- this.totalDueForPeriod = totalDueForPeriod;
- this.totalPaidForPeriod = BigDecimal.ZERO;
- this.totalPaidInAdvanceForPeriod = null;
- this.totalPaidLateForPeriod = null;
- this.totalWaivedForPeriod = null;
- this.totalWrittenOffForPeriod = null;
- this.totalOutstandingForPeriod = totalDueForPeriod;
- this.totalActualCostOfLoanForPeriod =
interestDueOnPrincipalOutstanding.add(feeChargesDueForPeriod);
- this.totalInstallmentAmountForPeriod = totalInstallmentAmountForPeriod;
- this.totalOverdue = DateUtils.isBeforeBusinessDate(dueDate) ?
this.totalOutstandingForPeriod : null;
- this.totalCredits = BigDecimal.ZERO;
- this.totalAccruedInterest = BigDecimal.ZERO;
- this.downPaymentPeriod = false;
- }
-
- // TODO refactor the class to builder pattern
- /*
- * used for down payment only period when creating an empty loan schedule
for preview etc
- */
- private LoanSchedulePeriodData(Integer periodNumber, LocalDate fromDate,
LocalDate dueDate, BigDecimal principalDue,
- BigDecimal principalOutstanding) {
- this.period = periodNumber;
- this.fromDate = fromDate;
- this.dueDate = dueDate;
- this.obligationsMetOnDate = null;
- this.complete = null;
- this.daysInPeriod = 1; // TODO: check this may should be 0 or
somewhere else should be 1?
- this.principalDisbursed = null;
- this.principalOriginalDue = principalDue;
- this.principalDue = principalOriginalDue;
- this.principalPaid = null;
- this.principalWrittenOff = null;
- this.principalOutstanding = principalOriginalDue;
- this.principalLoanBalanceOutstanding = principalOutstanding;
-
- this.interestOriginalDue = null;
- this.interestDue = null;
- this.interestPaid = null;
- this.interestWaived = null;
- this.interestWrittenOff = null;
- this.interestOutstanding = null;
-
- this.feeChargesDue = null;
- this.feeChargesPaid = null;
- this.feeChargesWaived = null;
- this.feeChargesWrittenOff = null;
- this.feeChargesOutstanding = null;
-
- this.penaltyChargesDue = null;
- this.penaltyChargesPaid = null;
- this.penaltyChargesWaived = null;
- this.penaltyChargesWrittenOff = null;
- this.penaltyChargesOutstanding = null;
-
- this.totalOriginalDueForPeriod = principalDue;
- this.totalDueForPeriod = principalDue;
- this.totalPaidForPeriod = BigDecimal.ZERO;
- this.totalPaidInAdvanceForPeriod = null;
- this.totalPaidLateForPeriod = null;
- this.totalWaivedForPeriod = null;
- this.totalWrittenOffForPeriod = null;
- this.totalOutstandingForPeriod = totalDueForPeriod;
- this.totalActualCostOfLoanForPeriod = null;
- this.totalInstallmentAmountForPeriod = totalDueForPeriod;
- this.totalOverdue = DateUtils.isBeforeBusinessDate(dueDate) ?
this.totalOutstandingForPeriod : null;
- this.totalCredits = BigDecimal.ZERO;
- this.downPaymentPeriod = true;
- this.totalAccruedInterest = BigDecimal.ZERO;
- }
-
- /*
- * Used for creating loan schedule periods with full information on
expected principal, interest & charges along
- * with what portion of each is paid.
- */
- private LoanSchedulePeriodData(final Integer periodNumber, final LocalDate
fromDate, final LocalDate dueDate,
+ final BigDecimal principalDue, final BigDecimal
outstandingLoanBalance) {
+ return builder().period(periodNumber) //
+ .fromDate(periodDate) //
+ .dueDate(periodDate) //
+ .principalOriginalDue(principalDue) //
+ .principalDue(principalDue) //
+ .principalOutstanding(principalDue) //
+ .principalLoanBalanceOutstanding(outstandingLoanBalance) //
+ .totalOriginalDueForPeriod(principalDue) //
+ .totalDueForPeriod(principalDue) //
+ .totalOutstandingForPeriod(principalDue) //
+ .totalInstallmentAmountForPeriod(principalDue) //
+ .downPaymentPeriod(true) //
+ .totalOverdue(DateUtils.isBeforeBusinessDate(periodDate) ?
principalDue : null) //
+ .build();
+ }
+
+ public static LoanSchedulePeriodData periodWithPayments(final Integer
periodNumber, final LocalDate fromDate, final LocalDate dueDate,
final LocalDate obligationsMetOnDate, final boolean complete,
final BigDecimal principalOriginalDue,
final BigDecimal principalPaid, final BigDecimal
principalWrittenOff, final BigDecimal principalOutstanding,
- final BigDecimal principalLoanBalanceOutstanding, final BigDecimal
interestDueOnPrincipalOutstanding,
- final BigDecimal interestPaid, final BigDecimal interestWaived,
final BigDecimal interestWrittenOff,
- final BigDecimal interestOutstanding, final BigDecimal
feeChargesDue, final BigDecimal feeChargesPaid,
- final BigDecimal feeChargesWaived, final BigDecimal
feeChargesWrittenOff, final BigDecimal feeChargesOutstanding,
- final BigDecimal penaltyChargesDue, final BigDecimal
penaltyChargesPaid, final BigDecimal penaltyChargesWaived,
- final BigDecimal penaltyChargesWrittenOff, final BigDecimal
penaltyChargesOutstanding, final BigDecimal totalDueForPeriod,
- final BigDecimal totalPaid, final BigDecimal
totalPaidInAdvanceForPeriod, final BigDecimal totalPaidLateForPeriod,
- final BigDecimal totalWaived, final BigDecimal totalWrittenOff,
final BigDecimal totalOutstanding,
- final BigDecimal totalActualCostOfLoanForPeriod, final BigDecimal
totalInstallmentAmountForPeriod,
+ final BigDecimal outstandingPrincipalBalanceOfLoan, final
BigDecimal interestDue, final BigDecimal interestPaid,
+ final BigDecimal interestWaived, final BigDecimal
interestWrittenOff, final BigDecimal interestOutstanding,
+ final BigDecimal feeChargesDue, final BigDecimal feeChargesPaid,
final BigDecimal feeChargesWaived,
+ final BigDecimal feeChargesWrittenOff, final BigDecimal
feeChargesOutstanding, final BigDecimal penaltyChargesDue,
+ final BigDecimal penaltyChargesPaid, final BigDecimal
penaltyChargesWaived, final BigDecimal penaltyChargesWrittenOff,
+ final BigDecimal penaltyChargesOutstanding, final BigDecimal
totalPaid, final BigDecimal totalPaidInAdvanceForPeriod,
+ final BigDecimal totalPaidLateForPeriod, final BigDecimal
totalWaived, final BigDecimal totalWrittenOff,
final BigDecimal totalCredits, final boolean isDownPayment, final
BigDecimal totalAccruedInterest) {
- this.period = periodNumber;
- this.fromDate = fromDate;
- this.dueDate = dueDate;
- this.obligationsMetOnDate = obligationsMetOnDate;
- this.complete = complete;
- if (fromDate != null) {
- this.daysInPeriod =
DateUtils.getExactDifferenceInDays(this.fromDate, this.dueDate);
- } else {
- this.daysInPeriod = null;
- }
- this.principalDisbursed = null;
- this.principalOriginalDue = principalOriginalDue;
- this.principalDue = principalOriginalDue;
- this.principalPaid = principalPaid;
- this.principalWrittenOff = principalWrittenOff;
- this.principalOutstanding = principalOutstanding;
- this.principalLoanBalanceOutstanding = principalLoanBalanceOutstanding;
-
- this.interestOriginalDue = interestDueOnPrincipalOutstanding;
- this.interestDue = interestDueOnPrincipalOutstanding;
- this.interestPaid = interestPaid;
- this.interestWaived = interestWaived;
- this.interestWrittenOff = interestWrittenOff;
- this.interestOutstanding = interestOutstanding;
-
- this.feeChargesDue = feeChargesDue;
- this.feeChargesPaid = feeChargesPaid;
- this.feeChargesWaived = feeChargesWaived;
- this.feeChargesWrittenOff = feeChargesWrittenOff;
- this.feeChargesOutstanding = feeChargesOutstanding;
-
- this.penaltyChargesDue = penaltyChargesDue;
- this.penaltyChargesPaid = penaltyChargesPaid;
- this.penaltyChargesWaived = penaltyChargesWaived;
- this.penaltyChargesWrittenOff = penaltyChargesWrittenOff;
- this.penaltyChargesOutstanding = penaltyChargesOutstanding;
-
- this.totalOriginalDueForPeriod = totalDueForPeriod;
- this.totalDueForPeriod = totalDueForPeriod;
- this.totalPaidForPeriod = totalPaid;
- this.totalPaidInAdvanceForPeriod = totalPaidInAdvanceForPeriod;
- this.totalPaidLateForPeriod = totalPaidLateForPeriod;
- this.totalWaivedForPeriod = totalWaived;
- this.totalWrittenOffForPeriod = totalWrittenOff;
- this.totalOutstandingForPeriod = totalOutstanding;
- this.totalActualCostOfLoanForPeriod = totalActualCostOfLoanForPeriod;
- this.totalInstallmentAmountForPeriod = totalInstallmentAmountForPeriod;
- this.totalOverdue = DateUtils.isBeforeBusinessDate(dueDate) ?
this.totalOutstandingForPeriod : null;
- this.totalCredits = totalCredits;
- this.downPaymentPeriod = isDownPayment;
- this.totalAccruedInterest = totalAccruedInterest;
- }
- private BigDecimal defaultToZeroIfNull(final BigDecimal possibleNullValue)
{
- BigDecimal value = BigDecimal.ZERO;
- if (possibleNullValue != null) {
- value = possibleNullValue;
- }
- return value;
+ BigDecimal totalDue = MathUtil.add(principalOriginalDue, interestDue,
feeChargesDue, penaltyChargesDue);
+ BigDecimal totalOutstanding = MathUtil.add(principalOutstanding,
interestOutstanding, feeChargesOutstanding,
+ penaltyChargesOutstanding);
+ BigDecimal totalActualCostOfLoanForPeriod = MathUtil.add(interestDue,
feeChargesDue, penaltyChargesDue);
+ BigDecimal totalInstallmentAmount = MathUtil.add(principalOriginalDue,
interestDue);
+
+ return builder().period(periodNumber) //
+ .fromDate(fromDate) //
+ .dueDate(dueDate) //
+ .obligationsMetOnDate(obligationsMetOnDate) //
+ .complete(complete) //
+ .daysInPeriod(DateUtils.getExactDifferenceInDays(fromDate,
dueDate)) //
+ .principalDue(principalOriginalDue) //
+ .principalOriginalDue(principalOriginalDue) //
+ .principalPaid(principalPaid) //
+ .principalWrittenOff(principalWrittenOff) //
+ .principalOutstanding(principalOutstanding) //
+
.principalLoanBalanceOutstanding(outstandingPrincipalBalanceOfLoan) //
+ .interestDue(interestDue) //
+ .interestOriginalDue(interestDue) //
+ .interestPaid(interestPaid) //
+ .interestWaived(interestWaived) //
+ .interestWrittenOff(interestWrittenOff) //
+ .interestOutstanding(interestOutstanding) //
+ .feeChargesDue(feeChargesDue) //
+ .feeChargesPaid(feeChargesPaid) //
+ .feeChargesWaived(feeChargesWaived) //
+ .feeChargesWrittenOff(feeChargesWrittenOff) //
+ .feeChargesOutstanding(feeChargesOutstanding) //
+ .penaltyChargesDue(penaltyChargesDue) //
+ .penaltyChargesPaid(penaltyChargesPaid) //
+ .penaltyChargesWaived(penaltyChargesWaived) //
+ .penaltyChargesWrittenOff(penaltyChargesWrittenOff) //
+ .penaltyChargesOutstanding(penaltyChargesOutstanding) //
+ .totalOriginalDueForPeriod(totalDue) //
+ .totalDueForPeriod(totalDue) //
+ .totalPaidForPeriod(totalPaid) //
+ .totalPaidInAdvanceForPeriod(totalPaidInAdvanceForPeriod) //
+ .totalPaidLateForPeriod(totalPaidLateForPeriod) //
+ .totalWaivedForPeriod(totalWaived) //
+ .totalWrittenOffForPeriod(totalWrittenOff) //
+ .totalOutstandingForPeriod(totalOutstanding) //
+
.totalActualCostOfLoanForPeriod(totalActualCostOfLoanForPeriod) //
+ .totalInstallmentAmountForPeriod(totalInstallmentAmount) //
+ .totalOverdue(DateUtils.isBeforeBusinessDate(dueDate) ?
totalOutstanding : null) //
+ .totalCredits(totalCredits) //
+ .downPaymentPeriod(isDownPayment) //
+ .totalAccruedInterest(totalAccruedInterest) //
+ .build();
}
- public boolean isActualPeriodForNotDuePayableCalculation(final LocalDate
businessDate) {
- boolean actualPeriod = false;
- if (getPeriod() != null) {
- if (getPeriod() == 1) {
- actualPeriod = ((businessDate.compareTo(getFromDate()) >= 0)
&& businessDate.compareTo(getDueDate()) < 0);
- } else {
- actualPeriod = ((businessDate.compareTo(getFromDate()) >= 0)
&& businessDate.compareTo(getDueDate()) < 0);
- }
- }
-
- return actualPeriod;
+ public static LoanSchedulePeriodData withPaidDetail(final
LoanSchedulePeriodData loanSchedulePeriodData, final boolean complete,
+ final BigDecimal principalPaid, final BigDecimal interestPaid,
final BigDecimal feeChargesPaid,
+ final BigDecimal penaltyChargesPaid) {
+ BigDecimal totalOutstanding =
MathUtil.subtract(loanSchedulePeriodData.totalDueForPeriod, principalPaid,
interestPaid,
+ feeChargesPaid, penaltyChargesPaid);
+
+ return builder().period(loanSchedulePeriodData.period) //
+ .fromDate(loanSchedulePeriodData.fromDate) //
+ .dueDate(loanSchedulePeriodData.dueDate) //
+
.obligationsMetOnDate(loanSchedulePeriodData.obligationsMetOnDate) //
+ .complete(complete) //
+
.daysInPeriod(DateUtils.getExactDifferenceInDays(loanSchedulePeriodData.fromDate,
loanSchedulePeriodData.dueDate)) //
+ .principalDue(loanSchedulePeriodData.principalOriginalDue) //
+
.principalOriginalDue(loanSchedulePeriodData.principalOriginalDue) //
+ .principalPaid(principalPaid) //
+
.principalWrittenOff(loanSchedulePeriodData.principalWrittenOff) //
+
.principalOutstanding(MathUtil.subtract(loanSchedulePeriodData.principalOriginalDue,
principalPaid)) //
+
.principalLoanBalanceOutstanding(loanSchedulePeriodData.principalLoanBalanceOutstanding)
//
+ .interestDue(loanSchedulePeriodData.interestDue) //
+ .interestOriginalDue(loanSchedulePeriodData.interestDue) //
+ .interestPaid(interestPaid) //
+ .interestWaived(loanSchedulePeriodData.interestWaived) //
+ .interestWrittenOff(loanSchedulePeriodData.interestWrittenOff)
//
+
.interestOutstanding(MathUtil.subtract(loanSchedulePeriodData.interestDue,
interestPaid)) //
+ .feeChargesDue(loanSchedulePeriodData.feeChargesDue) //
+ .feeChargesPaid(feeChargesPaid) //
+ .feeChargesWaived(loanSchedulePeriodData.feeChargesWaived) //
+
.feeChargesWrittenOff(loanSchedulePeriodData.feeChargesWrittenOff) //
+
.feeChargesOutstanding(MathUtil.subtract(loanSchedulePeriodData.feeChargesDue,
feeChargesPaid)) //
+ .penaltyChargesDue(loanSchedulePeriodData.penaltyChargesDue) //
+ .penaltyChargesPaid(penaltyChargesPaid) //
+
.penaltyChargesWaived(loanSchedulePeriodData.penaltyChargesWaived) //
+
.penaltyChargesWrittenOff(loanSchedulePeriodData.penaltyChargesWrittenOff) //
+
.penaltyChargesOutstanding(MathUtil.subtract(loanSchedulePeriodData.penaltyChargesDue,
penaltyChargesPaid)) //
+
.totalOriginalDueForPeriod(loanSchedulePeriodData.totalDueForPeriod) //
+ .totalDueForPeriod(loanSchedulePeriodData.totalDueForPeriod) //
+ .totalPaidForPeriod(MathUtil.add(principalPaid, interestPaid,
feeChargesPaid, penaltyChargesPaid)) //
+
.totalPaidInAdvanceForPeriod(loanSchedulePeriodData.totalPaidInAdvanceForPeriod)
//
+
.totalPaidLateForPeriod(loanSchedulePeriodData.totalPaidLateForPeriod) //
+
.totalWaivedForPeriod(loanSchedulePeriodData.totalWaivedForPeriod) //
+
.totalWrittenOffForPeriod(loanSchedulePeriodData.totalWrittenOffForPeriod) //
+ .totalOutstandingForPeriod(totalOutstanding) //
+
.totalActualCostOfLoanForPeriod(loanSchedulePeriodData.totalActualCostOfLoanForPeriod)
//
+
.totalInstallmentAmountForPeriod(loanSchedulePeriodData.totalInstallmentAmountForPeriod)
//
+
.totalOverdue(DateUtils.isBeforeBusinessDate(loanSchedulePeriodData.dueDate) ?
totalOutstanding : null) //
+ .totalCredits(loanSchedulePeriodData.totalCredits) //
+
.downPaymentPeriod(loanSchedulePeriodData.isDownPaymentPeriod()) //
+
.totalAccruedInterest(loanSchedulePeriodData.totalAccruedInterest) //
+ .build();
}
public BigDecimal getPrincipalDisbursed() {
- return defaultToZeroIfNull(this.principalDisbursed);
+ return MathUtil.nullToDefault(this.principalDisbursed,
BigDecimal.ZERO);
}
public BigDecimal getPrincipalDue() {
- return defaultToZeroIfNull(this.principalDue);
+ return MathUtil.nullToDefault(this.principalDue, BigDecimal.ZERO);
}
public BigDecimal getPrincipalPaid() {
- return defaultToZeroIfNull(this.principalPaid);
+ return MathUtil.nullToDefault(this.principalPaid, BigDecimal.ZERO);
}
public BigDecimal getPrincipalWrittenOff() {
- return defaultToZeroIfNull(this.principalWrittenOff);
+ return MathUtil.nullToDefault(this.principalWrittenOff,
BigDecimal.ZERO);
}
public BigDecimal getPrincipalOutstanding() {
- return defaultToZeroIfNull(this.principalOutstanding);
+ return MathUtil.nullToDefault(this.principalOutstanding,
BigDecimal.ZERO);
}
public BigDecimal getInterestDue() {
- return defaultToZeroIfNull(this.interestDue);
+ return MathUtil.nullToDefault(this.interestDue, BigDecimal.ZERO);
}
public BigDecimal getInterestPaid() {
- return defaultToZeroIfNull(this.interestPaid);
+ return MathUtil.nullToDefault(this.interestPaid, BigDecimal.ZERO);
}
public BigDecimal getInterestWaived() {
- return defaultToZeroIfNull(this.interestWaived);
+ return MathUtil.nullToDefault(this.interestWaived, BigDecimal.ZERO);
}
public BigDecimal getInterestWrittenOff() {
- return defaultToZeroIfNull(this.interestWrittenOff);
+ return MathUtil.nullToDefault(this.interestWrittenOff,
BigDecimal.ZERO);
}
public BigDecimal getInterestOutstanding() {
- return defaultToZeroIfNull(this.interestOutstanding);
+ return MathUtil.nullToDefault(this.interestOutstanding,
BigDecimal.ZERO);
}
public BigDecimal getFeeChargesDue() {
- return defaultToZeroIfNull(this.feeChargesDue);
+ return MathUtil.nullToDefault(this.feeChargesDue, BigDecimal.ZERO);
}
public BigDecimal getFeeChargesWaived() {
- return defaultToZeroIfNull(this.feeChargesWaived);
+ return MathUtil.nullToDefault(this.feeChargesWaived, BigDecimal.ZERO);
}
public BigDecimal getFeeChargesWrittenOff() {
- return defaultToZeroIfNull(this.feeChargesWrittenOff);
+ return MathUtil.nullToDefault(this.feeChargesWrittenOff,
BigDecimal.ZERO);
}
public BigDecimal getFeeChargesPaid() {
- return defaultToZeroIfNull(this.feeChargesPaid);
+ return MathUtil.nullToDefault(this.feeChargesPaid, BigDecimal.ZERO);
}
public BigDecimal getFeeChargesOutstanding() {
- return defaultToZeroIfNull(this.feeChargesOutstanding);
+ return MathUtil.nullToDefault(this.feeChargesOutstanding,
BigDecimal.ZERO);
}
public BigDecimal getPenaltyChargesDue() {
- return defaultToZeroIfNull(this.penaltyChargesDue);
+ return MathUtil.nullToDefault(this.penaltyChargesDue, BigDecimal.ZERO);
}
public BigDecimal getPenaltyChargesWaived() {
- return defaultToZeroIfNull(this.penaltyChargesWaived);
+ return MathUtil.nullToDefault(this.penaltyChargesWaived,
BigDecimal.ZERO);
}
public BigDecimal getPenaltyChargesWrittenOff() {
- return defaultToZeroIfNull(this.penaltyChargesWrittenOff);
+ return MathUtil.nullToDefault(this.penaltyChargesWrittenOff,
BigDecimal.ZERO);
}
public BigDecimal getPenaltyChargesPaid() {
- return defaultToZeroIfNull(this.penaltyChargesPaid);
+ return MathUtil.nullToDefault(this.penaltyChargesPaid,
BigDecimal.ZERO);
}
public BigDecimal getPenaltyChargesOutstanding() {
- return defaultToZeroIfNull(this.penaltyChargesOutstanding);
+ return MathUtil.nullToDefault(this.penaltyChargesOutstanding,
BigDecimal.ZERO);
}
public BigDecimal getTotalOverdue() {
- return defaultToZeroIfNull(this.totalOverdue);
+ return MathUtil.nullToDefault(this.totalOverdue, BigDecimal.ZERO);
}
public BigDecimal totalOutstandingForPeriod() {
- return defaultToZeroIfNull(this.totalOutstandingForPeriod);
+ return MathUtil.nullToDefault(this.totalOutstandingForPeriod,
BigDecimal.ZERO);
}
}
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModelRepaymentPeriod.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModelRepaymentPeriod.java
index 4460cfe8d..a358d4b91 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModelRepaymentPeriod.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModelRepaymentPeriod.java
@@ -78,7 +78,7 @@ public final class LoanScheduleModelRepaymentPeriod
implements LoanScheduleModel
public LoanSchedulePeriodData toData() {
return LoanSchedulePeriodData.repaymentOnlyPeriod(this.periodNumber,
this.fromDate, this.dueDate, this.principalDue.getAmount(),
this.outstandingLoanBalance.getAmount(),
this.interestDue.getAmount(), this.feeChargesDue.getAmount(),
- this.penaltyChargesDue.getAmount(), this.totalDue.getAmount(),
this.principalDue.plus(this.interestDue).getAmount());
+ this.penaltyChargesDue.getAmount());
}
@Override
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleModelRepaymentPeriod.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleModelRepaymentPeriod.java
index 7f7327288..06a5428ac 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleModelRepaymentPeriod.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleModelRepaymentPeriod.java
@@ -65,7 +65,7 @@ public final class LoanRescheduleModelRepaymentPeriod
implements LoanRescheduleM
public LoanSchedulePeriodData toData() {
return LoanSchedulePeriodData.repaymentOnlyPeriod(this.periodNumber,
this.fromDate, this.dueDate, this.principalDue.getAmount(),
this.outstandingLoanBalance.getAmount(),
this.interestDue.getAmount(), this.feeChargesDue.getAmount(),
- this.penaltyChargesDue.getAmount(), this.totalDue.getAmount(),
this.principalDue.plus(this.interestDue).getAmount());
+ this.penaltyChargesDue.getAmount());
}
@Override
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java
index d4169fb80..377de9310 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java
@@ -341,7 +341,8 @@ public class LoanArrearsAgingServiceImpl implements
LoanArrearsAgingService {
OriginalScheduleExtractor(final String loanIdsAsString,
DatabaseSpecificSQLGenerator sqlGenerator) {
final StringBuilder scheduleDetail = new StringBuilder();
- scheduleDetail.append("select ml.id as loanId, mr.duedate as
dueDate, mr.principal_amount as principalAmount, ");
+ scheduleDetail.append(
+ "select ml.id as loanId, mr.installment as
installmentNumber, mr.fromdate as fromDate, mr.duedate as dueDate,
mr.principal_amount as principalAmount, ");
scheduleDetail.append(
"mr.interest_amount as interestAmount,
mr.fee_charges_amount as feeAmount, mr.penalty_charges_amount as penaltyAmount
");
scheduleDetail.append("from m_loan ml INNER JOIN
m_loan_repayment_schedule_history mr on mr.loan_id = ml.id ");
@@ -369,19 +370,16 @@ public class LoanArrearsAgingServiceImpl implements
LoanArrearsAgingService {
}
private LoanSchedulePeriodData fetchLoanSchedulePeriodData(ResultSet
rs) throws SQLException {
+ final Integer installmentNumber = JdbcSupport.getInteger(rs,
"installmentNumber");
+ final LocalDate fromDate = JdbcSupport.getLocalDate(rs,
"fromDate");
final LocalDate dueDate = JdbcSupport.getLocalDate(rs, "dueDate");
final BigDecimal principalDue =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "principalAmount");
final BigDecimal interestDueOnPrincipalOutstanding =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "interestAmount");
- final BigDecimal totalInstallmentAmount =
principalDue.add(interestDueOnPrincipalOutstanding);
final BigDecimal feeChargesDueForPeriod =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "feeAmount");
final BigDecimal penaltyChargesDueForPeriod =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "penaltyAmount");
- final Integer periodNumber = null;
- final LocalDate fromDate = null;
- final BigDecimal principalOutstanding = null;
- final BigDecimal totalDueForPeriod = null;
- return LoanSchedulePeriodData.repaymentOnlyPeriod(periodNumber,
fromDate, dueDate, principalDue, principalOutstanding,
- interestDueOnPrincipalOutstanding, feeChargesDueForPeriod,
penaltyChargesDueForPeriod, totalDueForPeriod,
- totalInstallmentAmount);
+
+ return
LoanSchedulePeriodData.repaymentOnlyPeriod(installmentNumber, fromDate,
dueDate, principalDue, null,
+ interestDueOnPrincipalOutstanding, feeChargesDueForPeriod,
penaltyChargesDueForPeriod);
}
}
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 1edb542bc..72bf1d2e5 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
@@ -122,13 +122,7 @@ public class LoanScheduleCalculationPlatformServiceImpl
implements LoanScheduleC
outstandingAmountsDTO.principal().getAmount(),
outstandingAmountsDTO.interest().getAmount(),
outstandingAmountsDTO.feeCharges().getAmount(),
outstandingAmountsDTO.penaltyCharges().getAmount(), false, null);
- Money totalAmount =
totalPrincipal.plus(loanRepaymentScheduleInstallment.getFeeChargesOutstanding(currency))
-
.plus(loanRepaymentScheduleInstallment.getPenaltyChargesOutstanding(currency));
- Money interestDue = Money.zero(currency);
- if (loanRepaymentScheduleInstallment.isInterestDue(currency)) {
- interestDue =
loanRepaymentScheduleInstallment.getInterestOutstanding(currency);
- totalAmount = totalAmount.plus(interestDue);
- }
+ Money interestDue =
loanRepaymentScheduleInstallment.getInterestOutstanding(currency);
boolean isNewPaymentRequired =
loanRepaymentScheduleInstallment.isInterestDue(currency) ||
totalPrincipal.isGreaterThanZero();
LoanScheduleModel model =
this.loanScheduleAssembler.assembleForInterestRecalculation(loanApplicationTerms,
loan.getOfficeId(),
@@ -141,14 +135,12 @@ public class LoanScheduleCalculationPlatformServiceImpl
implements LoanScheduleC
periodData.getFromDate(), periodData.getDueDate(),
totalPrincipal.getAmount(),
periodData.getPrincipalLoanBalanceOutstanding(),
interestDue.getAmount(),
loanRepaymentScheduleInstallment.getFeeChargesCharged(currency).getAmount(),
-
loanRepaymentScheduleInstallment.getPenaltyChargesCharged(currency).getAmount(),
totalAmount.getAmount(),
- totalPrincipal.plus(interestDue).getAmount());
+
loanRepaymentScheduleInstallment.getPenaltyChargesCharged(currency).getAmount());
futureInstallments.add(loanSchedulePeriodData);
isNewPaymentRequired = false;
} else if (DateUtils.isAfter(periodData.getDueDate(), today)) {
futureInstallments.add(periodData);
}
-
}
loanScheduleData.updateFuturePeriods(futureInstallments);
}
@@ -198,8 +190,7 @@ public class LoanScheduleCalculationPlatformServiceImpl
implements LoanScheduleC
LoanSchedulePeriodData loanSchedulePeriodData =
LoanSchedulePeriodData.repaymentOnlyPeriod(installment.getInstallmentNumber(),
installment.getFromDate(), installment.getDueDate(),
installment.getPrincipal(currency).getAmount(),
outstanding.getAmount(),
installment.getInterestCharged(currency).getAmount(),
- installment.getFeeChargesCharged(currency).getAmount(),
installment.getPenaltyChargesCharged(currency).getAmount(),
- installment.getDue(currency).getAmount(),
installment.getTotalPrincipalAndInterest(currency).getAmount());
+ installment.getFeeChargesCharged(currency).getAmount(),
installment.getPenaltyChargesCharged(currency).getAmount());
installmentData.add(loanSchedulePeriodData);
totalInterest =
totalInterest.plus(installment.getInterestCharged(currency));
totalCharge =
totalCharge.plus(installment.getFeeChargesCharged(currency));
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformServiceImpl.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformServiceImpl.java
index 308a54107..2d13c898b 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformServiceImpl.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformServiceImpl.java
@@ -191,9 +191,6 @@ public class LoanScheduleHistoryReadPlatformServiceImpl
implements LoanScheduleH
final BigDecimal interestExpectedDue =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "interestDue");
totalInterestCharged =
totalInterestCharged.plus(interestExpectedDue);
- final BigDecimal totalInstallmentAmount =
totalPrincipalExpected.zero().plus(principalDue).plus(interestExpectedDue)
- .getAmount();
-
final BigDecimal feeChargesExpectedDue =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "feeChargesDue");
totalFeeChargesCharged =
totalFeeChargesCharged.plus(feeChargesExpectedDue);
@@ -218,7 +215,7 @@ public class LoanScheduleHistoryReadPlatformServiceImpl
implements LoanScheduleH
final LoanSchedulePeriodData periodData =
LoanSchedulePeriodData.repaymentOnlyPeriod(period, fromDate, dueDate,
principalDue, outstandingPrincipalBalanceOfLoan,
interestExpectedDue, feeChargesExpectedDue,
- penaltyChargesExpectedDue, totalDueForPeriod,
totalInstallmentAmount);
+ penaltyChargesExpectedDue);
periods.add(periodData);
}
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CommonLoanSummaryDataProvider.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CommonLoanSummaryDataProvider.java
index 6e1ce2dab..10b1ffcbb 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CommonLoanSummaryDataProvider.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CommonLoanSummaryDataProvider.java
@@ -159,15 +159,12 @@ public abstract class CommonLoanSummaryDataProvider
implements LoanSummaryDataPr
@Override
public BigDecimal
computeTotalUnpaidPayableDueInterestAmount(Collection<LoanSchedulePeriodData>
periods, final LocalDate businessDate) {
- return periods.stream().filter(period ->
!period.getDownPaymentPeriod() && businessDate.compareTo(period.getDueDate())
>= 0)
+ return periods.stream().filter(period -> !period.isDownPaymentPeriod()
&& !businessDate.isBefore(period.getDueDate()))
.map(LoanSchedulePeriodData::getInterestOutstanding).reduce(BigDecimal.ZERO,
BigDecimal::add);
}
@Override
public LoanSummaryData withOnlyCurrencyData(CurrencyData currencyData) {
- {
- return LoanSummaryData.builder().currency(currencyData).build();
- }
+ return LoanSummaryData.builder().currency(currencyData).build();
}
-
}
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CumulativeLoanSummaryDataProvider.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CumulativeLoanSummaryDataProvider.java
index 2d4e06d9d..b798baa39 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CumulativeLoanSummaryDataProvider.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CumulativeLoanSummaryDataProvider.java
@@ -46,8 +46,10 @@ public class CumulativeLoanSummaryDataProvider extends
CommonLoanSummaryDataProv
public BigDecimal
computeTotalUnpaidPayableNotDueInterestAmountOnActualPeriod(final Loan loan,
final Collection<LoanSchedulePeriodData> periods, final LocalDate
businessDate, final CurrencyData currency) {
// Find the current Period (If exists one) based on the Business date
- final Optional<LoanSchedulePeriodData> optCurrentPeriod =
periods.stream()
- .filter(period -> !period.getDownPaymentPeriod() &&
period.isActualPeriodForNotDuePayableCalculation(businessDate))
+ final Optional<LoanSchedulePeriodData> optCurrentPeriod =
periods.stream().filter(period -> !period.isDownPaymentPeriod() //
+ && period.getPeriod() != null //
+ && !businessDate.isBefore(period.getFromDate()) //
+ && businessDate.isBefore(period.getDueDate())) //
.findFirst();
if (optCurrentPeriod.isPresent()) {
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 43fa53688..d9fbc49b0 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
@@ -1263,8 +1263,6 @@ public class LoanReadPlatformServiceImpl implements
LoanReadPlatformService, Loa
final BigDecimal interestPaid =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "interestPaid");
final BigDecimal interestWaived =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "interestWaived");
final BigDecimal interestWrittenOff =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "interestWrittenOff");
- final BigDecimal totalInstallmentAmount =
totalPrincipalPaid.zero().plus(principalDue).plus(interestExpectedDue)
- .getAmount();
final BigDecimal accrualInterest =
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "accrualInterest");
final BigDecimal interestActualDue =
interestExpectedDue.subtract(interestWaived).subtract(interestWrittenOff);
@@ -1330,14 +1328,13 @@ public class LoanReadPlatformServiceImpl implements
LoanReadPlatformService, Loa
LoanSchedulePeriodData periodData;
- periodData = LoanSchedulePeriodData.periodWithPayments(loanId,
period, fromDate, dueDate, obligationsMetOnDate, complete,
+ periodData = LoanSchedulePeriodData.periodWithPayments(period,
fromDate, dueDate, obligationsMetOnDate, complete,
principalDue, principalPaid, principalWrittenOff,
principalOutstanding, outstandingPrincipalBalanceOfLoan,
interestExpectedDue, interestPaid, interestWaived,
interestWrittenOff, interestOutstanding, feeChargesExpectedDue,
feeChargesPaid, feeChargesWaived,
feeChargesWrittenOff, feeChargesOutstanding, penaltyChargesExpectedDue,
- penaltyChargesPaid, penaltyChargesWaived,
penaltyChargesWrittenOff, penaltyChargesOutstanding, totalDueForPeriod,
- totalPaidForPeriod, totalPaidInAdvanceForPeriod,
totalPaidLateForPeriod, totalWaivedForPeriod,
- totalWrittenOffForPeriod, totalOutstandingForPeriod,
totalActualCostOfLoanForPeriod, totalInstallmentAmount,
- credits, isDownPayment, accrualInterest);
+ penaltyChargesPaid, penaltyChargesWaived,
penaltyChargesWrittenOff, penaltyChargesOutstanding, totalPaidForPeriod,
+ totalPaidInAdvanceForPeriod, totalPaidLateForPeriod,
totalWaivedForPeriod, totalWrittenOffForPeriod, credits,
+ isDownPayment, accrualInterest);
periods.add(periodData);
}