You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ra...@apache.org on 2016/05/04 14:26:18 UTC
[06/10] incubator-fineract git commit: FINERACT-60 : Interest
compounding, nth day rest frequency and meeting calendar date changes
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/763cf18b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java
index fe071f5..a56c004 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java
@@ -18,23 +18,16 @@
*/
package org.apache.fineract.portfolio.loanaccount.domain;
-import java.util.Date;
-import java.util.Map;
-
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
import org.apache.fineract.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
+import org.apache.fineract.portfolio.loanproduct.domain.LoanProductInterestRecalculationDetails;
import org.apache.fineract.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
import org.apache.fineract.portfolio.loanproduct.domain.RecalculationFrequencyType;
-import org.joda.time.LocalDate;
import org.springframework.data.jpa.domain.AbstractPersistable;
/**
@@ -70,9 +63,14 @@ public class LoanInterestRecalculationDetails extends AbstractPersistable<Long>
@Column(name = "rest_frequency_interval", nullable = false)
private Integer restInterval;
- @Temporal(TemporalType.DATE)
- @Column(name = "rest_freqency_date")
- private Date restFrequencyDate;
+ @Column(name = "rest_frequency_nth_day_enum", nullable = true)
+ private Integer restFrequencyNthDay;
+
+ @Column(name = "rest_frequency_weekday_enum", nullable = true)
+ private Integer restFrequencyWeekday;
+
+ @Column(name = "rest_frequency_on_day", nullable = true)
+ private Integer restFrequencyOnDay;
@Column(name = "compounding_frequency_type_enum", nullable = true)
private Integer compoundingFrequencyType;
@@ -80,78 +78,63 @@ public class LoanInterestRecalculationDetails extends AbstractPersistable<Long>
@Column(name = "compounding_frequency_interval", nullable = true)
private Integer compoundingInterval;
- @Temporal(TemporalType.DATE)
- @Column(name = "compounding_freqency_date")
- private Date compoundingFrequencyDate;
+ @Column(name = "compounding_frequency_nth_day_enum", nullable = true)
+ private Integer compoundingFrequencyNthDay;
+ @Column(name = "compounding_frequency_weekday_enum", nullable = true)
+ private Integer compoundingFrequencyWeekday;
+ @Column(name = "compounding_frequency_on_day", nullable = true)
+ private Integer compoundingFrequencyOnDay;
+
+ @Column(name = "is_compounding_to_be_posted_as_transaction")
+ private Boolean isCompoundingToBePostedAsTransaction;
+ @Column(name = "allow_compounding_on_eod")
+ private Boolean allowCompoundingOnEod;
protected LoanInterestRecalculationDetails() {
// Default constructor for jpa repository
}
private LoanInterestRecalculationDetails(final Integer interestRecalculationCompoundingMethod, final Integer rescheduleStrategyMethod,
- final Integer restFrequencyType, final Integer restInterval, final Date restFrequencyDate, Integer compoundingFrequencyType,
- Integer compoundingInterval, Date compoundingFrequencyDate) {
+ final Integer restFrequencyType, final Integer restInterval, final Integer restFrequencyNthDay, Integer restFrequencyWeekday,
+ Integer restFrequencyOnDay, Integer compoundingFrequencyType, Integer compoundingInterval, Integer compoundingFrequencyNthDay,
+ Integer compoundingFrequencyWeekday, Integer compoundingFrequencyOnDay, final boolean isCompoundingToBePostedAsTransaction,
+ final boolean allowCompoundingOnEod) {
this.interestRecalculationCompoundingMethod = interestRecalculationCompoundingMethod;
this.rescheduleStrategyMethod = rescheduleStrategyMethod;
- this.restFrequencyDate = restFrequencyDate;
+ this.restFrequencyNthDay = restFrequencyNthDay;
+ this.restFrequencyWeekday = restFrequencyWeekday;
+ this.restFrequencyOnDay = restFrequencyOnDay;
this.restFrequencyType = restFrequencyType;
this.restInterval = restInterval;
- this.compoundingFrequencyDate = compoundingFrequencyDate;
+ this.compoundingFrequencyNthDay = compoundingFrequencyNthDay;
+ this.compoundingFrequencyWeekday = compoundingFrequencyWeekday;
+ this.compoundingFrequencyOnDay = compoundingFrequencyOnDay;
this.compoundingFrequencyType = compoundingFrequencyType;
this.compoundingInterval = compoundingInterval;
+ this.isCompoundingToBePostedAsTransaction = isCompoundingToBePostedAsTransaction;
+ this.allowCompoundingOnEod = allowCompoundingOnEod;
}
- public static LoanInterestRecalculationDetails createFrom(final Integer interestRecalculationCompoundingMethod,
- final Integer rescheduleStrategyMethod, final Integer restFrequencyType, final Integer restInterval,
- final Date restFrequencyDate, final Integer compoundingFrequencyType, final Integer compoundingInterval,
- final Date compoundingFrequencyDate) {
- return new LoanInterestRecalculationDetails(interestRecalculationCompoundingMethod, rescheduleStrategyMethod, restFrequencyType,
- restInterval, restFrequencyDate, compoundingFrequencyType, compoundingInterval, compoundingFrequencyDate);
+ public static LoanInterestRecalculationDetails createFrom(
+ final LoanProductInterestRecalculationDetails loanProductInterestRecalculationDetails) {
+ return new LoanInterestRecalculationDetails(loanProductInterestRecalculationDetails.getInterestRecalculationCompoundingMethod(),
+ loanProductInterestRecalculationDetails.getRescheduleStrategyMethod(), loanProductInterestRecalculationDetails
+ .getRestFrequencyType().getValue(), loanProductInterestRecalculationDetails.getRestInterval(),
+ loanProductInterestRecalculationDetails.getRestFrequencyNthDay(),
+ loanProductInterestRecalculationDetails.getRestFrequencyWeekday(),
+ loanProductInterestRecalculationDetails.getRestFrequencyOnDay(), loanProductInterestRecalculationDetails
+ .getCompoundingFrequencyType().getValue(), loanProductInterestRecalculationDetails.getCompoundingInterval(),
+ loanProductInterestRecalculationDetails.getCompoundingFrequencyNthDay(),
+ loanProductInterestRecalculationDetails.getCompoundingFrequencyWeekday(),
+ loanProductInterestRecalculationDetails.getCompoundingFrequencyOnDay(),
+ loanProductInterestRecalculationDetails.getIsCompoundingToBePostedAsTransaction(),
+ loanProductInterestRecalculationDetails.allowCompoundingOnEod());
}
public void updateLoan(final Loan loan) {
this.loan = loan;
}
- public void update(final JsonCommand command, final Map<String, Object> actualChanges) {
- if (command.isChangeInLocalDateParameterNamed(LoanProductConstants.recalculationRestFrequencyDateParamName,
- getRestFrequencyLocalDate())) {
- final String dateFormatAsInput = command.dateFormat();
- final String localeAsInput = command.locale();
- final String valueAsInput = command.stringValueOfParameterNamed(LoanProductConstants.recalculationRestFrequencyDateParamName);
- actualChanges.put(LoanProductConstants.recalculationRestFrequencyDateParamName, valueAsInput);
- actualChanges.put("dateFormat", dateFormatAsInput);
- actualChanges.put("locale", localeAsInput);
-
- final LocalDate newValue = command.localDateValueOfParameterNamed(LoanProductConstants.recalculationRestFrequencyDateParamName);
- if (newValue == null || getRestFrequencyType().isSameAsRepayment()) {
- this.restFrequencyDate = null;
- } else {
- this.restFrequencyDate = newValue.toDate();
- }
- }
-
- if (command.isChangeInLocalDateParameterNamed(LoanProductConstants.recalculationCompoundingFrequencyDateParamName,
- getCompoundingFrequencyLocalDate())) {
- final String dateFormatAsInput = command.dateFormat();
- final String localeAsInput = command.locale();
- final String valueAsInput = command
- .stringValueOfParameterNamed(LoanProductConstants.recalculationCompoundingFrequencyDateParamName);
- actualChanges.put(LoanProductConstants.recalculationCompoundingFrequencyDateParamName, valueAsInput);
- actualChanges.put("dateFormat", dateFormatAsInput);
- actualChanges.put("locale", localeAsInput);
-
- final LocalDate newValue = command
- .localDateValueOfParameterNamed(LoanProductConstants.recalculationCompoundingFrequencyDateParamName);
- if (newValue == null || !getInterestRecalculationCompoundingMethod().isCompoundingEnabled()
- || getCompoundingFrequencyType().isSameAsRepayment()) {
- this.compoundingFrequencyDate = null;
- } else {
- this.compoundingFrequencyDate = newValue.toDate();
- }
- }
- }
-
public InterestRecalculationCompoundingMethod getInterestRecalculationCompoundingMethod() {
return InterestRecalculationCompoundingMethod.fromInt(this.interestRecalculationCompoundingMethod);
}
@@ -160,14 +143,6 @@ public class LoanInterestRecalculationDetails extends AbstractPersistable<Long>
return LoanRescheduleStrategyMethod.fromInt(this.rescheduleStrategyMethod);
}
- public LocalDate getRestFrequencyLocalDate() {
- LocalDate recurrenceOnLocalDate = null;
- if (this.restFrequencyDate != null) {
- recurrenceOnLocalDate = new LocalDate(this.restFrequencyDate);
- }
- return recurrenceOnLocalDate;
- }
-
public RecalculationFrequencyType getRestFrequencyType() {
return RecalculationFrequencyType.fromInt(this.restFrequencyType);
}
@@ -176,14 +151,6 @@ public class LoanInterestRecalculationDetails extends AbstractPersistable<Long>
return this.restInterval;
}
- public LocalDate getCompoundingFrequencyLocalDate() {
- LocalDate recurrenceOnLocalDate = null;
- if (this.compoundingFrequencyDate != null) {
- recurrenceOnLocalDate = new LocalDate(this.compoundingFrequencyDate);
- }
- return recurrenceOnLocalDate;
- }
-
public RecalculationFrequencyType getCompoundingFrequencyType() {
return RecalculationFrequencyType.fromInt(this.compoundingFrequencyType);
}
@@ -191,4 +158,36 @@ public class LoanInterestRecalculationDetails extends AbstractPersistable<Long>
public Integer getCompoundingInterval() {
return this.compoundingInterval;
}
+
+ public Integer getRestFrequencyNthDay() {
+ return this.restFrequencyNthDay;
+ }
+
+ public Integer getRestFrequencyWeekday() {
+ return this.restFrequencyWeekday;
+ }
+
+ public Integer getRestFrequencyOnDay() {
+ return this.restFrequencyOnDay;
+ }
+
+ public Integer getCompoundingFrequencyNthDay() {
+ return this.compoundingFrequencyNthDay;
+ }
+
+ public Integer getCompoundingFrequencyWeekday() {
+ return this.compoundingFrequencyWeekday;
+ }
+
+ public Integer getCompoundingFrequencyOnDay() {
+ return this.compoundingFrequencyOnDay;
+ }
+
+ public boolean isCompoundingToBePostedAsTransaction() {
+ return null == this.isCompoundingToBePostedAsTransaction ? false : this.isCompoundingToBePostedAsTransaction;
+ }
+
+ public boolean allowCompoundingOnEod() {
+ return this.allowCompoundingOnEod;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/763cf18b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java
index 73aedb6..711a313 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java
@@ -19,13 +19,17 @@
package org.apache.fineract.portfolio.loanaccount.domain;
import java.math.BigDecimal;
+import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
+import java.util.List;
+import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@@ -34,6 +38,8 @@ import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.useradministration.domain.AppUser;
+import org.hibernate.annotations.LazyCollection;
+import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
@Entity
@@ -125,6 +131,10 @@ public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCus
@Column(name = "recalculated_interest_component", nullable = false)
private boolean recalculatedInterestComponent;
+ @LazyCollection(LazyCollectionOption.FALSE)
+ @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
+ @JoinColumn(name = "loan_repayment_schedule_id", referencedColumnName = "id", nullable = false)
+ private List<LoanInterestRecalcualtionAdditionalDetails> loanCompoundingDetails = new ArrayList<>();
protected LoanRepaymentScheduleInstallment() {
this.installmentNumber = null;
this.fromDate = null;
@@ -134,7 +144,8 @@ public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCus
public LoanRepaymentScheduleInstallment(final Loan loan, final Integer installmentNumber, final LocalDate fromDate,
final LocalDate dueDate, final BigDecimal principal, final BigDecimal interest, final BigDecimal feeCharges,
- final BigDecimal penaltyCharges, boolean recalculatedInterestComponent) {
+ final BigDecimal penaltyCharges, final boolean recalculatedInterestComponent,
+ final List<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails) {
this.loan = loan;
this.installmentNumber = installmentNumber;
this.fromDate = fromDate.toDateTimeAtStartOfDay().toDate();
@@ -145,6 +156,7 @@ public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCus
this.penaltyCharges = defaultToNullIfZero(penaltyCharges);
this.obligationsMet = false;
this.recalculatedInterestComponent = recalculatedInterestComponent;
+ this.loanCompoundingDetails = compoundingDetails;
}
public LoanRepaymentScheduleInstallment(final Loan loan) {
@@ -770,4 +782,7 @@ public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCus
public Money getDue(MonetaryCurrency currency) {
return getPrincipal(currency).plus(getInterestCharged(currency)).plus(getFeeChargesCharged(currency)).plus(getPenaltyChargesCharged(currency));
}
+ public List<LoanInterestRecalcualtionAdditionalDetails> getLoanCompoundingDetails() {
+ return this.loanCompoundingDetails;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/763cf18b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java
index 6d4783a..8172d0b 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java
@@ -146,6 +146,19 @@ public final class LoanTransaction extends AbstractPersistable<Long> {
this.appUser = null;
}
+ public static LoanTransaction incomePosting(final Loan loan, final Office office, final Date dateOf,
+ final BigDecimal amount, final BigDecimal interestPortion, final BigDecimal feeChargesPortion,
+ final BigDecimal penaltyChargesPortion, final AppUser appUser){
+ final Integer typeOf = LoanTransactionType.INCOME_POSTING.getValue();
+ final BigDecimal principalPortion = BigDecimal.ZERO;
+ final BigDecimal overPaymentPortion = BigDecimal.ZERO;
+ final boolean reversed = false;
+ final PaymentDetail paymentDetail = null;
+ final String externalId = null;
+ final LocalDateTime createdDate = DateUtils.getLocalDateTimeOfTenant();
+ return new LoanTransaction(loan, office, typeOf, dateOf, amount, principalPortion, interestPortion, feeChargesPortion,
+ penaltyChargesPortion, overPaymentPortion, reversed, paymentDetail, externalId, createdDate, appUser);
+ }
public static LoanTransaction disbursement(final Office office, final Money amount, final PaymentDetail paymentDetail,
final LocalDate disbursementDate, final String externalId, final LocalDateTime createdDate, final AppUser appUser) {
return new LoanTransaction(null, office, LoanTransactionType.DISBURSEMENT, paymentDetail, amount.getAmount(), disbursementDate,
@@ -199,6 +212,19 @@ public final class LoanTransaction extends AbstractPersistable<Long> {
principalPortion, interestPortion, feesPortion, penaltiesPortion, overPaymentPortion, reversed, paymentDetail, externalId,
createdDate, appUser);
}
+ public static LoanTransaction accrueTransaction(final Loan loan, final Office office, final LocalDate dateOf, final BigDecimal amount,
+ final BigDecimal interestPortion, final BigDecimal feeChargesPortion,
+ final BigDecimal penaltyChargesPortion, final AppUser appUser) {
+ BigDecimal principalPortion = null;
+ BigDecimal overPaymentPortion = null;
+ boolean reversed = false;
+ PaymentDetail paymentDetail = null;
+ String externalId = null;
+ LocalDateTime createdDate = DateUtils.getLocalDateTimeOfTenant();
+ return new LoanTransaction(loan, office, LoanTransactionType.ACCRUAL.getValue(), dateOf.toDate(), amount,
+ principalPortion, interestPortion, feeChargesPortion, penaltyChargesPortion, overPaymentPortion, reversed, paymentDetail, externalId,
+ createdDate, appUser);
+ }
public static LoanTransaction initiateTransfer(final Office office, final Loan loan, final LocalDate transferDate,
final LocalDateTime createdDate, final AppUser appUser) {
@@ -461,6 +487,9 @@ public final class LoanTransaction extends AbstractPersistable<Long> {
return !isRepayment();
}
+ public boolean isIncomePosting() {
+ return LoanTransactionType.INCOME_POSTING.equals(getTypeOf()) && isNotReversed();
+ }
public boolean isDisbursement() {
return LoanTransactionType.DISBURSEMENT.equals(getTypeOf()) && isNotReversed();
}
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/763cf18b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java
index 2e1ae0d..d898561 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java
@@ -51,7 +51,8 @@ public enum LoanTransactionType {
REJECT_TRANSFER(15, "loanTransactionType.rejectTransfer"), //
REFUND(16, "loanTransactionType.refund"), //
CHARGE_PAYMENT(17, "loanTransactionType.chargePayment"), //
- REFUND_FOR_ACTIVE_LOAN(18, "loanTransactionType.refund");
+ REFUND_FOR_ACTIVE_LOAN(18, "loanTransactionType.refund"), //
+ INCOME_POSTING(19,"loanTransactionType.incomePosting");
private final Integer value;
private final String code;
@@ -126,6 +127,9 @@ public enum LoanTransactionType {
case 18:
loanTransactionType = LoanTransactionType.REFUND_FOR_ACTIVE_LOAN;
break;
+ case 19:
+ loanTransactionType = LoanTransactionType.INCOME_POSTING;
+ break;
default:
loanTransactionType = LoanTransactionType.INVALID;
break;
@@ -172,4 +176,7 @@ public enum LoanTransactionType {
public boolean isRefundForActiveLoan() {
return this.value.equals(LoanTransactionType.REFUND_FOR_ACTIVE_LOAN.getValue());
}
+ public boolean isIncomePosting() {
+ return this.value.equals(LoanTransactionType.INCOME_POSTING.getValue());
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/763cf18b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleParams.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleParams.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleParams.java
index 679964a..446c64e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleParams.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleParams.java
@@ -69,8 +69,19 @@ public class LoanScheduleParams {
// date(after applying compounding frequency)
// from when these amounts will effect the outstanding balance for
// interest calculation
- private final TreeMap<LocalDate, Money> compoundingMap;
- private final Map<LocalDate, TreeMap<LocalDate, Money>> compoundingDateVariations = new HashMap<>();
+ private final Map<LocalDate, Money> compoundingMap;
+ private final Map<LocalDate, Map<LocalDate, Money>> compoundingDateVariations = new HashMap<>();
+ private Money unCompoundedAmount;
+ private Money compoundedInLastInstallment;
+
+
+ public Money getCompoundedInLastInstallment() {
+ return this.compoundedInLastInstallment;
+ }
+
+ public void setCompoundedInLastInstallment(Money compoundedInLastInstallment) {
+ this.compoundedInLastInstallment = compoundedInLastInstallment;
+ }
// disbursement map for tranche details(will added to outstanding
// balance as per the start date)
@@ -94,7 +105,7 @@ public class LoanScheduleParams {
final LocalDate actualRepaymentDate, final Money totalCumulativePrincipal, final Money totalCumulativeInterest,
final Money totalFeeChargesCharged, final Money totalPenaltyChargesCharged, final Money totalRepaymentExpected,
Money totalOutstandingInterestPaymentDueToGrace, final Money reducePrincipal, final Map<LocalDate, Money> principalPortionMap,
- final Map<LocalDate, Money> latePaymentMap, final TreeMap<LocalDate, Money> compoundingMap,
+ final Map<LocalDate, Money> latePaymentMap, final Map<LocalDate, Money> compoundingMap, final Money unCompoundedAmount,
final Map<LocalDate, Money> disburseDetailMap, Money principalToBeScheduled, final Money outstandingBalance,
final Money outstandingBalanceAsPerRest, final List<LoanRepaymentScheduleInstallment> installments,
final Collection<RecalculationDetail> recalculationDetails,
@@ -115,6 +126,7 @@ public class LoanScheduleParams {
this.principalPortionMap = principalPortionMap;
this.latePaymentMap = latePaymentMap;
this.compoundingMap = compoundingMap;
+ this.unCompoundedAmount = unCompoundedAmount;
this.disburseDetailMap = disburseDetailMap;
this.principalToBeScheduled = principalToBeScheduled;
this.outstandingBalance = outstandingBalance;
@@ -126,6 +138,9 @@ public class LoanScheduleParams {
this.partialUpdate = partialUpdate;
this.currency = currency;
this.applyInterestRecalculation = applyInterestRecalculation;
+ if (this.currency != null) {
+ this.compoundedInLastInstallment = Money.zero(this.currency);
+ }
}
public static LoanScheduleParams createLoanScheduleParamsForPartialUpdate(final int periodNumber, final int instalmentNumber,
@@ -133,8 +148,8 @@ public class LoanScheduleParams {
final Money totalCumulativeInterest, final Money totalFeeChargesCharged, final Money totalPenaltyChargesCharged,
final Money totalRepaymentExpected, Money totalOutstandingInterestPaymentDueToGrace, final Money reducePrincipal,
final Map<LocalDate, Money> principalPortionMap, final Map<LocalDate, Money> latePaymentMap,
- final TreeMap<LocalDate, Money> compoundingMap, final Map<LocalDate, Money> disburseDetailMap, Money principalToBeScheduled,
- final Money outstandingBalance, final Money outstandingBalanceAsPerRest,
+ final Map<LocalDate, Money> compoundingMap, Money unCompoundedAmount, final Map<LocalDate, Money> disburseDetailMap,
+ final Money principalToBeScheduled, final Money outstandingBalance, final Money outstandingBalanceAsPerRest,
final List<LoanRepaymentScheduleInstallment> installments, final Collection<RecalculationDetail> recalculationDetails,
final LoanRepaymentScheduleTransactionProcessor loanRepaymentScheduleTransactionProcessor, final LocalDate scheduleTillDate,
final MonetaryCurrency currency, final boolean applyInterestRecalculation) {
@@ -142,9 +157,9 @@ public class LoanScheduleParams {
return new LoanScheduleParams(periodNumber, instalmentNumber, loanTermInDays, periodStartDate, actualRepaymentDate,
totalCumulativePrincipal, totalCumulativeInterest, totalFeeChargesCharged, totalPenaltyChargesCharged,
totalRepaymentExpected, totalOutstandingInterestPaymentDueToGrace, reducePrincipal, principalPortionMap, latePaymentMap,
- compoundingMap, disburseDetailMap, principalToBeScheduled, outstandingBalance, outstandingBalanceAsPerRest, installments,
- recalculationDetails, loanRepaymentScheduleTransactionProcessor, scheduleTillDate, partialUpdate, currency,
- applyInterestRecalculation);
+ compoundingMap, unCompoundedAmount, disburseDetailMap, principalToBeScheduled, outstandingBalance,
+ outstandingBalanceAsPerRest, installments, recalculationDetails, loanRepaymentScheduleTransactionProcessor,
+ scheduleTillDate, partialUpdate, currency, applyInterestRecalculation);
}
public static LoanScheduleParams createLoanScheduleParamsForCompleteUpdate(final Collection<RecalculationDetail> recalculationDetails,
@@ -162,7 +177,7 @@ public class LoanScheduleParams {
final Money reducePrincipal = null;
final Map<LocalDate, Money> principalPortionMap = null;
final Map<LocalDate, Money> latePaymentMap = null;
- final TreeMap<LocalDate, Money> compoundingMap = null;
+ final Map<LocalDate, Money> compoundingMap = null;
final Map<LocalDate, Money> disburseDetailMap = null;
final Money principalToBeScheduled = null;
final Money outstandingBalance = null;
@@ -172,12 +187,13 @@ public class LoanScheduleParams {
final int loanTermInDays = 0;
final Money totalOutstandingInterestPaymentDueToGrace = null;
final MonetaryCurrency currency = null;
+ final Money unCompoundedAmount = null;
return new LoanScheduleParams(periodNumber, instalmentNumber, loanTermInDays, periodStartDate, actualRepaymentDate,
totalCumulativePrincipal, totalCumulativeInterest, totalFeeChargesCharged, totalPenaltyChargesCharged,
totalRepaymentExpected, totalOutstandingInterestPaymentDueToGrace, reducePrincipal, principalPortionMap, latePaymentMap,
- compoundingMap, disburseDetailMap, principalToBeScheduled, outstandingBalance, outstandingBalanceAsPerRest, installments,
- recalculationDetails, loanRepaymentScheduleTransactionProcessor, scheduleTillDate, partialUpdate, currency,
- applyInterestRecalculation);
+ compoundingMap, unCompoundedAmount, disburseDetailMap, principalToBeScheduled, outstandingBalance,
+ outstandingBalanceAsPerRest, installments, recalculationDetails, loanRepaymentScheduleTransactionProcessor,
+ scheduleTillDate, partialUpdate, currency, applyInterestRecalculation);
}
public static LoanScheduleParams createLoanScheduleParams(final MonetaryCurrency currency, final Money chargesDueAtTimeOfDisbursement,
@@ -195,7 +211,7 @@ public class LoanScheduleParams {
final Money reducePrincipal = Money.zero(currency);
final Map<LocalDate, Money> principalPortionMap = new HashMap<>();
final Map<LocalDate, Money> latePaymentMap = new HashMap<>();
- final TreeMap<LocalDate, Money> compoundingMap = new TreeMap<>();
+ final Map<LocalDate, Money> compoundingMap = new TreeMap<>();
final Map<LocalDate, Money> disburseDetailMap = new TreeMap<>();
final Money outstandingBalance = principalToBeScheduled;
final Money outstandingBalanceAsPerRest = principalToBeScheduled;
@@ -205,12 +221,13 @@ public class LoanScheduleParams {
final LoanRepaymentScheduleTransactionProcessor loanRepaymentScheduleTransactionProcessor = null;
final LocalDate scheduleTillDate = null;
final boolean applyInterestRecalculation = false;
+ final Money unCompoundedAmount = Money.zero(currency);
return new LoanScheduleParams(periodNumber, instalmentNumber, loanTermInDays, periodStartDate, actualRepaymentDate,
totalCumulativePrincipal, totalCumulativeInterest, totalFeeChargesCharged, totalPenaltyChargesCharged,
totalRepaymentExpected, totalOutstandingInterestPaymentDueToGrace, reducePrincipal, principalPortionMap, latePaymentMap,
- compoundingMap, disburseDetailMap, principalToBeScheduled, outstandingBalance, outstandingBalanceAsPerRest, installments,
- recalculationDetails, loanRepaymentScheduleTransactionProcessor, scheduleTillDate, partialUpdate, currency,
- applyInterestRecalculation);
+ compoundingMap, unCompoundedAmount, disburseDetailMap, principalToBeScheduled, outstandingBalance,
+ outstandingBalanceAsPerRest, installments, recalculationDetails, loanRepaymentScheduleTransactionProcessor,
+ scheduleTillDate, partialUpdate, currency, applyInterestRecalculation);
}
public static LoanScheduleParams createLoanScheduleParams(final MonetaryCurrency currency, final Money chargesDueAtTimeOfDisbursement,
@@ -228,7 +245,7 @@ public class LoanScheduleParams {
final Money reducePrincipal = Money.zero(currency);
final Map<LocalDate, Money> principalPortionMap = new HashMap<>();
final Map<LocalDate, Money> latePaymentMap = new HashMap<>();
- final TreeMap<LocalDate, Money> compoundingMap = new TreeMap<>();
+ final Map<LocalDate, Money> compoundingMap = new TreeMap<>();
final Map<LocalDate, Money> disburseDetailMap = new TreeMap<>();
final Money outstandingBalance = principalToBeScheduled;
final Money outstandingBalanceAsPerRest = principalToBeScheduled;
@@ -238,12 +255,13 @@ public class LoanScheduleParams {
final LoanRepaymentScheduleTransactionProcessor loanRepaymentScheduleTransactionProcessor = loanScheduleParams.loanRepaymentScheduleTransactionProcessor;
final LocalDate scheduleTillDate = loanScheduleParams.scheduleTillDate;
final boolean applyInterestRecalculation = loanScheduleParams.applyInterestRecalculation;
+ final Money unCompoundedAmount = Money.zero(currency);
return new LoanScheduleParams(periodNumber, instalmentNumber, loanTermInDays, periodStartDate, actualRepaymentDate,
totalCumulativePrincipal, totalCumulativeInterest, totalFeeChargesCharged, totalPenaltyChargesCharged,
totalRepaymentExpected, totalOutstandingInterestPaymentDueToGrace, reducePrincipal, principalPortionMap, latePaymentMap,
- compoundingMap, disburseDetailMap, principalToBeScheduled, outstandingBalance, outstandingBalanceAsPerRest, installments,
- recalculationDetails, loanRepaymentScheduleTransactionProcessor, scheduleTillDate, partialUpdate, currency,
- applyInterestRecalculation);
+ compoundingMap, unCompoundedAmount, disburseDetailMap, principalToBeScheduled, outstandingBalance,
+ outstandingBalanceAsPerRest, installments, recalculationDetails, loanRepaymentScheduleTransactionProcessor,
+ scheduleTillDate, partialUpdate, currency, applyInterestRecalculation);
}
public int getPeriodNumber() {
@@ -310,7 +328,7 @@ public class LoanScheduleParams {
return this.latePaymentMap;
}
- public TreeMap<LocalDate, Money> getCompoundingMap() {
+ public Map<LocalDate, Money> getCompoundingMap() {
return this.compoundingMap;
}
@@ -434,7 +452,7 @@ public class LoanScheduleParams {
this.totalOutstandingInterestPaymentDueToGrace = totalOutstandingInterestPaymentDueToGrace;
}
- public Map<LocalDate, TreeMap<LocalDate, Money>> getCompoundingDateVariations() {
+ public Map<LocalDate, Map<LocalDate, Money>> getCompoundingDateVariations() {
return this.compoundingDateVariations;
}
@@ -446,4 +464,18 @@ public class LoanScheduleParams {
return this.applyInterestRecalculation;
}
+ public Money getUnCompoundedAmount() {
+ return this.unCompoundedAmount;
+ }
+ public void addUnCompoundedAmount(Money unCompoundedAmount) {
+ this.unCompoundedAmount = this.unCompoundedAmount.plus(unCompoundedAmount);
+ }
+
+ public void minusUnCompoundedAmount(Money unCompoundedAmount) {
+ this.unCompoundedAmount = this.unCompoundedAmount.minus(unCompoundedAmount);
+ }
+
+ public void setUnCompoundedAmount(Money unCompoundedAmount) {
+ this.unCompoundedAmount = unCompoundedAmount;
+ }
}