FINERACT-1983: Date handling improvements - general
This commit is contained in:
+4
-7
@@ -22,6 +22,7 @@ import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||
|
||||
/**
|
||||
* Immutable data object representing disbursement information.
|
||||
@@ -85,8 +86,7 @@ public final class DisbursementData implements Comparable<DisbursementData> {
|
||||
if (obj == null) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return obj.expectedDisbursementDate.compareTo(this.expectedDisbursementDate);
|
||||
return DateUtils.compare(obj.expectedDisbursementDate, this.expectedDisbursementDate);
|
||||
}
|
||||
|
||||
public boolean isDueForDisbursement(final LocalDate fromNotInclusive, final LocalDate upToAndInclusive) {
|
||||
@@ -96,14 +96,11 @@ public final class DisbursementData implements Comparable<DisbursementData> {
|
||||
|
||||
private boolean occursOnDayFromAndUpToAndIncluding(final LocalDate fromNotInclusive, final LocalDate upToAndInclusive,
|
||||
final LocalDate target) {
|
||||
return target != null && target.isAfter(fromNotInclusive) && !target.isAfter(upToAndInclusive);
|
||||
return DateUtils.isAfter(target, fromNotInclusive) && !DateUtils.isAfter(target, upToAndInclusive);
|
||||
}
|
||||
|
||||
public BigDecimal getWaivedChargeAmount() {
|
||||
if (this.waivedChargeAmount == null) {
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
return this.waivedChargeAmount;
|
||||
return this.waivedChargeAmount == null ? BigDecimal.ZERO : this.waivedChargeAmount;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+4
-3
@@ -22,6 +22,7 @@ import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import lombok.Getter;
|
||||
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
|
||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType;
|
||||
|
||||
@Getter
|
||||
@@ -64,7 +65,7 @@ public class LoanTermVariationsData implements Comparable<LoanTermVariationsData
|
||||
}
|
||||
|
||||
private boolean occursOnDayFromAndUpTo(final LocalDate fromNotInclusive, final LocalDate upToInclusive, final LocalDate target) {
|
||||
return target != null && target.isAfter(fromNotInclusive) && !target.isAfter(upToInclusive);
|
||||
return DateUtils.isAfter(target, fromNotInclusive) && !DateUtils.isAfter(target, upToInclusive);
|
||||
}
|
||||
|
||||
public boolean isApplicable(final LocalDate fromDate) {
|
||||
@@ -72,7 +73,7 @@ public class LoanTermVariationsData implements Comparable<LoanTermVariationsData
|
||||
}
|
||||
|
||||
private boolean occursBefore(final LocalDate date, final LocalDate target) {
|
||||
return target != null && !target.isAfter(date);
|
||||
return target != null && !DateUtils.isAfter(target, date);
|
||||
}
|
||||
|
||||
public boolean isSpecificToInstallment() {
|
||||
@@ -84,7 +85,7 @@ public class LoanTermVariationsData implements Comparable<LoanTermVariationsData
|
||||
}
|
||||
|
||||
public Boolean isProcessed() {
|
||||
return this.isProcessed == null ? false : this.isProcessed;
|
||||
return this.isProcessed != null && this.isProcessed;
|
||||
}
|
||||
|
||||
public void setProcessed(Boolean isProcessed) {
|
||||
|
||||
+3
-2
@@ -23,6 +23,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||
|
||||
public class LoanTermVariationsDataWrapper {
|
||||
|
||||
@@ -54,7 +55,7 @@ public class LoanTermVariationsDataWrapper {
|
||||
boolean hasVariation = false;
|
||||
if (iterator.hasNext()) {
|
||||
LoanTermVariationsData loanTermVariationsData = iterator.next();
|
||||
if (!loanTermVariationsData.getTermVariationApplicableFrom().isAfter(date)) {
|
||||
if (!DateUtils.isAfter(loanTermVariationsData.getTermVariationApplicableFrom(), date)) {
|
||||
hasVariation = true;
|
||||
}
|
||||
iterator.previous();
|
||||
@@ -123,7 +124,7 @@ public class LoanTermVariationsDataWrapper {
|
||||
public LoanTermVariationsData fetchLoanTermDueDateVariationsData(final LocalDate onDate) {
|
||||
LoanTermVariationsData data = null;
|
||||
for (LoanTermVariationsData termVariationsData : this.dueDateVariation) {
|
||||
if (onDate.isEqual(termVariationsData.getTermVariationApplicableFrom())) {
|
||||
if (DateUtils.isEqual(onDate, termVariationsData.getTermVariationApplicableFrom())) {
|
||||
data = termVariationsData;
|
||||
break;
|
||||
}
|
||||
|
||||
+8
-15
@@ -2352,8 +2352,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
|
||||
final LocalDate submittalDate = this.submittedOnDate;
|
||||
if (DateUtils.isBefore(approvedOn, submittalDate)) {
|
||||
final String errorMessage = "The date on which a loan is approved cannot be before its submittal date: "
|
||||
+ submittalDate.toString();
|
||||
final String errorMessage = "The date on which a loan is approved cannot be before its submittal date: " + submittalDate;
|
||||
throw new InvalidLoanStateTransitionException("approval", "cannot.be.before.submittal.date", errorMessage,
|
||||
getApprovedOnDate(), submittalDate);
|
||||
}
|
||||
@@ -3394,8 +3393,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
incomePostTransactions.add(transaction);
|
||||
}
|
||||
}
|
||||
final LoanTransactionComparator transactionComparator = new LoanTransactionComparator();
|
||||
Collections.sort(incomePostTransactions, transactionComparator);
|
||||
incomePostTransactions.sort(LoanTransactionComparator.INSTANCE);
|
||||
return incomePostTransactions;
|
||||
}
|
||||
|
||||
@@ -3408,8 +3406,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
repaymentsOrWaivers.add(transaction);
|
||||
}
|
||||
}
|
||||
final LoanTransactionComparator transactionComparator = new LoanTransactionComparator();
|
||||
Collections.sort(repaymentsOrWaivers, transactionComparator);
|
||||
repaymentsOrWaivers.sort(LoanTransactionComparator.INSTANCE);
|
||||
return repaymentsOrWaivers;
|
||||
}
|
||||
|
||||
@@ -3422,8 +3419,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
repaymentsOrWaivers.add(transaction);
|
||||
}
|
||||
}
|
||||
final LoanTransactionComparator transactionComparator = new LoanTransactionComparator();
|
||||
Collections.sort(repaymentsOrWaivers, transactionComparator);
|
||||
repaymentsOrWaivers.sort(LoanTransactionComparator.INSTANCE);
|
||||
return repaymentsOrWaivers;
|
||||
}
|
||||
|
||||
@@ -3434,8 +3430,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
repaymentsOrWaivers.add(transaction);
|
||||
}
|
||||
}
|
||||
final LoanTransactionComparator transactionComparator = new LoanTransactionComparator();
|
||||
Collections.sort(repaymentsOrWaivers, transactionComparator);
|
||||
repaymentsOrWaivers.sort(LoanTransactionComparator.INSTANCE);
|
||||
return repaymentsOrWaivers;
|
||||
}
|
||||
|
||||
@@ -3446,8 +3441,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
transactions.add(transaction);
|
||||
}
|
||||
}
|
||||
final LoanTransactionComparator transactionComparator = new LoanTransactionComparator();
|
||||
Collections.sort(transactions, transactionComparator);
|
||||
transactions.sort(LoanTransactionComparator.INSTANCE);
|
||||
return transactions;
|
||||
}
|
||||
|
||||
@@ -3458,8 +3452,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
transactions.add(transaction);
|
||||
}
|
||||
}
|
||||
final LoanTransactionComparator transactionComparator = new LoanTransactionComparator();
|
||||
Collections.sort(transactions, transactionComparator);
|
||||
transactions.sort(LoanTransactionComparator.INSTANCE);
|
||||
return transactions;
|
||||
}
|
||||
|
||||
@@ -6670,7 +6663,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
paidFromFutureInstallments = paidFromFutureInstallments.plus(balancesForCurrentPeroid[4])
|
||||
.minus(balancesForCurrentPeroid[2]);
|
||||
}
|
||||
} else if (installment.getDueDate().isAfter(paymentDate)) {
|
||||
} else {
|
||||
paidFromFutureInstallments = paidFromFutureInstallments.plus(installment.getInterestPaid(currency))
|
||||
.plus(installment.getPenaltyChargesPaid(currency)).plus(installment.getFeeChargesPaid(currency));
|
||||
}
|
||||
|
||||
+12
-13
@@ -363,13 +363,11 @@ public class LoanCharge extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
if (this.loan != null) {
|
||||
switch (ChargeCalculationType.fromInt(this.chargeCalculation)) {
|
||||
case PERCENT_OF_AMOUNT:
|
||||
// If charge type is specified due date and loan is multi
|
||||
// disburment loan.
|
||||
// Then we need to get as of this loan charge due date how
|
||||
// much amount disbursed.
|
||||
// If charge type is specified due date and loan is multi disburment loan.
|
||||
// Then we need to get as of this loan charge due date how much amount disbursed.
|
||||
if (this.loan.isMultiDisburmentLoan() && this.isSpecifiedDueDate()) {
|
||||
for (final LoanDisbursementDetails loanDisbursementDetails : this.loan.getDisbursementDetails()) {
|
||||
if (!loanDisbursementDetails.expectedDisbursementDate().isAfter(this.getDueDate())) {
|
||||
if (!DateUtils.isAfter(loanDisbursementDetails.expectedDisbursementDate(), this.getDueDate())) {
|
||||
amountPercentageAppliedTo = amountPercentageAppliedTo.add(loanDisbursementDetails.principal());
|
||||
}
|
||||
}
|
||||
@@ -635,13 +633,12 @@ public class LoanCharge extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
|
||||
private boolean occursOnDayFromExclusiveAndUpToAndIncluding(final LocalDate fromNotInclusive, final LocalDate upToAndInclusive,
|
||||
final LocalDate target) {
|
||||
return target != null && target.isAfter(fromNotInclusive) && !target.isAfter(upToAndInclusive);
|
||||
return DateUtils.isAfter(target, fromNotInclusive) && !DateUtils.isAfter(target, upToAndInclusive);
|
||||
}
|
||||
|
||||
private boolean occursOnDayFromAndUpToAndIncluding(final LocalDate fromAndInclusive, final LocalDate upToAndInclusive,
|
||||
final LocalDate target) {
|
||||
return target != null && (target.isEqual(fromAndInclusive) || target.isAfter(fromAndInclusive))
|
||||
&& !target.isAfter(upToAndInclusive);
|
||||
return target != null && !DateUtils.isBefore(target, fromAndInclusive) && !DateUtils.isAfter(target, upToAndInclusive);
|
||||
}
|
||||
|
||||
public boolean isFeeCharge() {
|
||||
@@ -792,8 +789,9 @@ public class LoanCharge extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
public LoanInstallmentCharge getUnpaidInstallmentLoanCharge() {
|
||||
LoanInstallmentCharge unpaidChargePerInstallment = null;
|
||||
for (final LoanInstallmentCharge loanChargePerInstallment : this.loanInstallmentCharge) {
|
||||
if (loanChargePerInstallment.isPending() && (unpaidChargePerInstallment == null || unpaidChargePerInstallment
|
||||
.getRepaymentInstallment().getDueDate().isAfter(loanChargePerInstallment.getRepaymentInstallment().getDueDate()))) {
|
||||
if (loanChargePerInstallment.isPending() && (unpaidChargePerInstallment == null
|
||||
|| DateUtils.isAfter(unpaidChargePerInstallment.getRepaymentInstallment().getDueDate(),
|
||||
loanChargePerInstallment.getRepaymentInstallment().getDueDate()))) {
|
||||
unpaidChargePerInstallment = loanChargePerInstallment;
|
||||
}
|
||||
}
|
||||
@@ -802,7 +800,7 @@ public class LoanCharge extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
|
||||
public LoanInstallmentCharge getInstallmentLoanCharge(final LocalDate periodDueDate) {
|
||||
for (final LoanInstallmentCharge loanChargePerInstallment : this.loanInstallmentCharge) {
|
||||
if (periodDueDate.isEqual(loanChargePerInstallment.getRepaymentInstallment().getDueDate())) {
|
||||
if (DateUtils.isEqual(periodDueDate, loanChargePerInstallment.getRepaymentInstallment().getDueDate())) {
|
||||
return loanChargePerInstallment;
|
||||
}
|
||||
}
|
||||
@@ -974,8 +972,9 @@ public class LoanCharge extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
Money outstanding = Money.of(currency, loanChargePerInstallment.getAmountOutstanding());
|
||||
final boolean partiallyPaid = outstanding.isGreaterThanZero()
|
||||
&& outstanding.isLessThan(loanChargePerInstallment.getAmount(currency));
|
||||
if ((partiallyPaid || loanChargePerInstallment.isPaid()) && (paidChargePerInstallment == null || paidChargePerInstallment
|
||||
.getRepaymentInstallment().getDueDate().isBefore(loanChargePerInstallment.getRepaymentInstallment().getDueDate()))) {
|
||||
if ((partiallyPaid || loanChargePerInstallment.isPaid()) && (paidChargePerInstallment == null
|
||||
|| DateUtils.isBefore(paidChargePerInstallment.getRepaymentInstallment().getDueDate(),
|
||||
loanChargePerInstallment.getRepaymentInstallment().getDueDate()))) {
|
||||
paidChargePerInstallment = loanChargePerInstallment;
|
||||
}
|
||||
}
|
||||
|
||||
+4
-8
@@ -27,6 +27,7 @@ import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Objects;
|
||||
import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
|
||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||
import org.apache.fineract.portfolio.loanaccount.data.DisbursementData;
|
||||
|
||||
@Entity
|
||||
@@ -71,16 +72,11 @@ public class LoanDisbursementDetails extends AbstractPersistableCustom {
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (!(obj instanceof LoanDisbursementDetails)) {
|
||||
if (!(obj instanceof LoanDisbursementDetails loanDisbursementDetails)) {
|
||||
return false;
|
||||
}
|
||||
final LoanDisbursementDetails loanDisbursementDetails = (LoanDisbursementDetails) obj;
|
||||
if (loanDisbursementDetails.principal.equals(this.principal)
|
||||
&& loanDisbursementDetails.expectedDisbursementDate.compareTo(this.expectedDisbursementDate) == 0 ? Boolean.TRUE
|
||||
: Boolean.FALSE) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return loanDisbursementDetails.principal.equals(this.principal)
|
||||
&& DateUtils.isEqual(loanDisbursementDetails.expectedDisbursementDate, this.expectedDisbursementDate);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-1
@@ -22,6 +22,7 @@ import java.math.BigDecimal;
|
||||
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;
|
||||
|
||||
@@ -114,7 +115,7 @@ public class LoanRepaymentScheduleProcessingWrapper {
|
||||
if (loanCharge.getLoan() != null && loanCharge.isSpecifiedDueDate()
|
||||
&& loanCharge.getLoan().isMultiDisburmentLoan()) {
|
||||
for (final LoanDisbursementDetails loanDisbursementDetails : loanCharge.getLoan().getDisbursementDetails()) {
|
||||
if (!loanDisbursementDetails.expectedDisbursementDate().isAfter(loanCharge.getDueDate())) {
|
||||
if (!DateUtils.isAfter(loanDisbursementDetails.expectedDisbursementDate(), loanCharge.getDueDate())) {
|
||||
amount = amount.add(loanDisbursementDetails.principal());
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -21,6 +21,7 @@ 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;
|
||||
@@ -230,7 +231,7 @@ public final class LoanSummaryWrapper {
|
||||
if (totalOverdue.isGreaterThanZero()) {
|
||||
for (final LoanRepaymentScheduleInstallment installment : repaymentScheduleInstallments) {
|
||||
if (installment.isOverdueOn(from)) {
|
||||
if (overdueSince == null || overdueSince.isAfter(installment.getDueDate())) {
|
||||
if (overdueSince == null || DateUtils.isAfter(overdueSince, installment.getDueDate())) {
|
||||
overdueSince = installment.getDueDate();
|
||||
}
|
||||
}
|
||||
|
||||
+12
-24
@@ -29,7 +29,6 @@ import jakarta.persistence.Table;
|
||||
import jakarta.persistence.UniqueConstraint;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
@@ -850,29 +849,6 @@ public class LoanTransaction extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
this.manuallyAdjustedOrReversed = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public OffsetDateTime getCreatedDateTime() {
|
||||
return (this.getCreatedDate().isPresent() ? this.getCreatedDate().get() : DateUtils.getOffsetDateTimeOfTenantWithMostPrecision());
|
||||
}
|
||||
|
||||
public boolean isLastTransaction(final LoanTransaction loanTransaction) {
|
||||
boolean isLatest = false;
|
||||
if (loanTransaction != null) {
|
||||
isLatest = this.getTransactionDate().isBefore(loanTransaction.getTransactionDate())
|
||||
|| (this.getTransactionDate().isEqual(loanTransaction.getTransactionDate())
|
||||
&& this.getCreatedDateTime().isBefore(loanTransaction.getCreatedDateTime()));
|
||||
}
|
||||
return isLatest;
|
||||
}
|
||||
|
||||
public boolean isLatestTransaction(final LoanTransaction loanTransaction) {
|
||||
boolean isLatest = false;
|
||||
if (loanTransaction != null) {
|
||||
isLatest = this.getCreatedDateTime().isBefore(loanTransaction.getCreatedDateTime());
|
||||
}
|
||||
return isLatest;
|
||||
}
|
||||
|
||||
public void updateLoanTransactionToRepaymentScheduleMappings(final Collection<LoanTransactionToRepaymentScheduleMapping> mappings) {
|
||||
Collection<LoanTransactionToRepaymentScheduleMapping> retainMappings = new ArrayList<>();
|
||||
for (LoanTransactionToRepaymentScheduleMapping updatedrepaymentScheduleMapping : mappings) {
|
||||
@@ -963,6 +939,18 @@ public class LoanTransaction extends AbstractAuditableWithUTCDateTimeCustom {
|
||||
return amount;
|
||||
}
|
||||
|
||||
public boolean isBefore(final LocalDate date) {
|
||||
return DateUtils.isBefore(getTransactionDate(), date);
|
||||
}
|
||||
|
||||
public boolean isAfter(final LocalDate date) {
|
||||
return DateUtils.isAfter(getTransactionDate(), date);
|
||||
}
|
||||
|
||||
public boolean isOn(final LocalDate date) {
|
||||
return DateUtils.isEqual(getTransactionDate(), date);
|
||||
}
|
||||
|
||||
// TODO missing hashCode(), equals(Object obj), but probably OK as long as
|
||||
// this is never stored in a Collection.
|
||||
}
|
||||
|
||||
+26
-33
@@ -19,47 +19,40 @@
|
||||
package org.apache.fineract.portfolio.loanaccount.domain;
|
||||
|
||||
import java.util.Comparator;
|
||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||
|
||||
/**
|
||||
* Sort loan transactions by transaction date, created date and transaction type placing
|
||||
*/
|
||||
public class LoanTransactionComparator implements Comparator<LoanTransaction> {
|
||||
|
||||
public static final LoanTransactionComparator INSTANCE = new LoanTransactionComparator();
|
||||
|
||||
@Override
|
||||
public int compare(final LoanTransaction o1, final LoanTransaction o2) {
|
||||
int compareResult = 0;
|
||||
final int comparsion = o1.getTransactionDate().compareTo(o2.getTransactionDate());
|
||||
/**
|
||||
* For transactions bearing the same transaction date, we sort transactions based on created date (when
|
||||
* available) after which sorting for waivers takes place
|
||||
**/
|
||||
if (comparsion == 0) {
|
||||
int comparisonBasedOnCreatedDate = 0;
|
||||
if (o1.isIncomePosting() && o2.isNotIncomePosting()) {
|
||||
compareResult = -1;
|
||||
} else if (o1.isNotIncomePosting() && o2.isIncomePosting()) {
|
||||
compareResult = 1;
|
||||
} else {
|
||||
compareResult = 0;
|
||||
}
|
||||
if (o1.getCreatedDateTime() != null && o2.getCreatedDateTime() != null) {
|
||||
comparisonBasedOnCreatedDate = o1.getCreatedDateTime().compareTo(o2.getCreatedDateTime());
|
||||
}
|
||||
// equal transaction dates
|
||||
if (comparisonBasedOnCreatedDate == 0) {
|
||||
if (o1.isWaiver() && o2.isNotWaiver()) {
|
||||
compareResult = -1;
|
||||
} else if (o1.isNotWaiver() && o2.isWaiver()) {
|
||||
compareResult = 1;
|
||||
} else {
|
||||
compareResult = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
compareResult = comparsion;
|
||||
int result = DateUtils.compare(o1.getTransactionDate(), o2.getTransactionDate());
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
return compareResult;
|
||||
// For transactions bearing the same transaction date, we sort transactions based on created date (when
|
||||
// available) after which sorting for waivers takes place
|
||||
result = o1.getCreatedDate().isPresent()
|
||||
? (o2.getCreatedDate().isPresent() ? DateUtils.compare(o1.getCreatedDateTime(), o2.getCreatedDateTime()) : -1)
|
||||
: (o2.getCreatedDate().isPresent() ? 1 : 0);
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
// equal transaction dates
|
||||
if (o1.isIncomePosting() != o2.isIncomePosting()) {
|
||||
return o1.isIncomePosting() ? -1 : 1;
|
||||
}
|
||||
if (o1.isWaiver() != o2.isWaiver()) {
|
||||
return o1.isWaiver() ? -1 : 1;
|
||||
}
|
||||
result = o1.getId() != null ? (o2.getId() != null ? Long.compare(o1.getId(), o2.getId()) : -1) : (o2.getId() != null ? 1 : 0);
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+4
-23
@@ -200,11 +200,7 @@ public final class LoanSchedulePeriodData {
|
||||
this.totalOutstandingForPeriod = this.feeChargesOutstanding;
|
||||
this.totalActualCostOfLoanForPeriod = this.feeChargesDue;
|
||||
this.totalInstallmentAmountForPeriod = null;
|
||||
if (dueDate.isBefore(DateUtils.getBusinessLocalDate())) {
|
||||
this.totalOverdue = this.totalOutstandingForPeriod;
|
||||
} else {
|
||||
this.totalOverdue = null;
|
||||
}
|
||||
this.totalOverdue = DateUtils.isBeforeBusinessDate(dueDate) ? this.totalOutstandingForPeriod : null;
|
||||
this.totalCredits = BigDecimal.ZERO;
|
||||
this.downPaymentPeriod = false;
|
||||
}
|
||||
@@ -263,12 +259,7 @@ public final class LoanSchedulePeriodData {
|
||||
this.totalOutstandingForPeriod = totalDueForPeriod;
|
||||
this.totalActualCostOfLoanForPeriod = interestDueOnPrincipalOutstanding.add(feeChargesDueForPeriod);
|
||||
this.totalInstallmentAmountForPeriod = totalInstallmentAmountForPeriod;
|
||||
|
||||
if (dueDate.isBefore(DateUtils.getBusinessLocalDate())) {
|
||||
this.totalOverdue = this.totalOutstandingForPeriod;
|
||||
} else {
|
||||
this.totalOverdue = null;
|
||||
}
|
||||
this.totalOverdue = DateUtils.isBeforeBusinessDate(dueDate) ? this.totalOutstandingForPeriod : null;
|
||||
this.totalCredits = BigDecimal.ZERO;
|
||||
this.downPaymentPeriod = false;
|
||||
}
|
||||
@@ -322,12 +313,7 @@ public final class LoanSchedulePeriodData {
|
||||
this.totalOutstandingForPeriod = totalDueForPeriod;
|
||||
this.totalActualCostOfLoanForPeriod = null;
|
||||
this.totalInstallmentAmountForPeriod = totalDueForPeriod;
|
||||
|
||||
if (dueDate.isBefore(DateUtils.getBusinessLocalDate())) {
|
||||
this.totalOverdue = this.totalOutstandingForPeriod;
|
||||
} else {
|
||||
this.totalOverdue = null;
|
||||
}
|
||||
this.totalOverdue = DateUtils.isBeforeBusinessDate(dueDate) ? this.totalOutstandingForPeriod : null;
|
||||
this.totalCredits = BigDecimal.ZERO;
|
||||
this.downPaymentPeriod = true;
|
||||
}
|
||||
@@ -396,12 +382,7 @@ public final class LoanSchedulePeriodData {
|
||||
this.totalOutstandingForPeriod = totalOutstanding;
|
||||
this.totalActualCostOfLoanForPeriod = totalActualCostOfLoanForPeriod;
|
||||
this.totalInstallmentAmountForPeriod = totalInstallmentAmountForPeriod;
|
||||
|
||||
if (dueDate.isBefore(DateUtils.getBusinessLocalDate())) {
|
||||
this.totalOverdue = this.totalOutstandingForPeriod;
|
||||
} else {
|
||||
this.totalOverdue = null;
|
||||
}
|
||||
this.totalOverdue = DateUtils.isBeforeBusinessDate(dueDate) ? this.totalOutstandingForPeriod : null;
|
||||
this.totalCredits = totalCredits;
|
||||
this.downPaymentPeriod = isDownPayment;
|
||||
}
|
||||
|
||||
+6
-3
@@ -18,6 +18,7 @@
|
||||
*/
|
||||
package org.apache.fineract.portfolio.loanaccount.loanschedule.domain;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.MathContext;
|
||||
import java.time.LocalDate;
|
||||
@@ -26,6 +27,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||
import org.apache.fineract.organisation.monetary.domain.ApplicationCurrency;
|
||||
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
|
||||
import org.apache.fineract.organisation.monetary.domain.Money;
|
||||
@@ -716,7 +718,7 @@ public final class LoanApplicationTerms {
|
||||
// number of days from 'ideal disbursement' to final date
|
||||
|
||||
LocalDate loanStartDate = getExpectedDisbursementDate();
|
||||
if (getInterestChargedFromDate() != null && loanStartDate.isBefore(getInterestChargedFromLocalDate())) {
|
||||
if (DateUtils.isBefore(loanStartDate, getInterestChargedFromLocalDate())) {
|
||||
loanStartDate = getInterestChargedFromLocalDate();
|
||||
}
|
||||
|
||||
@@ -773,7 +775,7 @@ public final class LoanApplicationTerms {
|
||||
CalendarUtils.getMeetingFrequencyFromPeriodFrequencyType(getLoanTermPeriodFrequencyType()),
|
||||
this.holidayDetailDTO.getWorkingDays(), isSkipRepaymentOnFirstDayOfMonth, numberOfDays);
|
||||
}
|
||||
if (!expectedStartDate.isEqual(startDate)) {
|
||||
if (!DateUtils.isEqual(expectedStartDate, startDate)) {
|
||||
diffDays = Math.toIntExact(ChronoUnit.DAYS.between(startDate, expectedStartDate));
|
||||
}
|
||||
if (numberOfMonths == 0) {
|
||||
@@ -1368,6 +1370,7 @@ public final class LoanApplicationTerms {
|
||||
return this.multiDisburseLoan;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Money getMaxOutstandingBalance() {
|
||||
return Money.of(getCurrency(), this.maxOutstandingBalance);
|
||||
}
|
||||
@@ -1440,7 +1443,7 @@ public final class LoanApplicationTerms {
|
||||
|
||||
int months = getPeriodsBetween(fromDate, toDate);
|
||||
fromDate = fromDate.plusMonths(months);
|
||||
isSameAsRepaymentPeriod = fromDate.isEqual(toDate);
|
||||
isSameAsRepaymentPeriod = DateUtils.isEqual(fromDate, toDate);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user