Cocoa-Puffs commented on code in PR #4798:
URL: https://github.com/apache/fineract/pull/4798#discussion_r2185482607
##########
fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java:
##########
@@ -2467,19 +2476,54 @@ private void
updateRepaymentPeriodBalances(PaymentAllocationType paymentAllocati
}
}
+ private boolean calculateIsPrepayAttempt(LoanTransaction loanTransaction,
ProgressiveTransactionCtx progressiveTransactionCtx) {
+ Loan loan = loanTransaction.getLoan();
+ LoanRepaymentScheduleInstallment installment =
loan.getRelatedRepaymentScheduleInstallment(loanTransaction.getTransactionDate());
+ if (installment == null) {
+ return false;
+ }
+ if (loan.getLoanInterestRecalculationDetails() == null) {
+ return false;
+ }
+ OutstandingDetails outstandingAmounts =
emiCalculator.getOutstandingAmountsTillDate(progressiveTransactionCtx.getModel(),
+ installment.getDueDate());
+ OutstandingAmountsDTO result = new
OutstandingAmountsDTO(progressiveTransactionCtx.getCurrency()) //
+ .principal(outstandingAmounts.getOutstandingPrincipal()) //
+ .interest(outstandingAmounts.getOutstandingInterest());//
+
+ return
loanTransaction.getAmount(progressiveTransactionCtx.getCurrency()).isGreaterThanOrEqualTo(result.getTotalOutstanding());
+ }
+
private LocalDate
calculateNewPayDateInCaseOfInAdvancePayment(LoanTransaction loanTransaction,
- LoanRepaymentScheduleInstallment inAdvanceInstallment) {
- LoanPreCloseInterestCalculationStrategy strategy =
loanTransaction.getLoan().getLoanInterestRecalculationDetails()
- .getPreCloseInterestCalculationStrategy();
-
- return switch (strategy) {
- case TILL_PRE_CLOSURE_DATE -> loanTransaction.getTransactionDate();
- // TODO use isInPeriod
- case TILL_REST_FREQUENCY_DATE ->
loanTransaction.getTransactionDate().isAfter(inAdvanceInstallment.getFromDate())
//
- &&
!loanTransaction.getTransactionDate().isAfter(inAdvanceInstallment.getDueDate())
//
- ? inAdvanceInstallment.getDueDate() //
- : loanTransaction.getTransactionDate(); //
- case NONE -> throw new IllegalStateException("Unexpected
PreClosureInterestCalculationStrategy: NONE");
+ LoanRepaymentScheduleInstallment inAdvanceInstallment, boolean
prepayAttempt) {
+ if
(shouldRecalculateTillInstallmentDueDate(loanTransaction.getLoan().getLoanInterestRecalculationDetails(),
prepayAttempt)) {
+ return isInPeriod(loanTransaction.getTransactionDate(),
inAdvanceInstallment, false) ? inAdvanceInstallment.getDueDate()
+ : loanTransaction.getTransactionDate();
+ } else {
+ return loanTransaction.getTransactionDate();
+ }
+ }
+
+ private boolean
shouldRecalculateTillInstallmentDueDate(LoanInterestRecalculationDetails
recalculationDetails,
+ boolean isPrepayAttempt) {
+ // Rest frequency type and pre close interest calculation strategy can
be controversial
+ // if restFrequencyType == DAILY and
preCloseInterestCalculationStrategy == TILL_PRE_CLOSURE_DATE
+ // no problem. Calculate till transaction date
+ // if restFrequencyType == SAME_AS_REPAYMENT_PERIOD and
preCloseInterestCalculationStrategy ==
+ // TILL_REST_FREQUENCY_DATE
+ // again, no problem. Calculate till due date of current installment
+ // if restFrequencyType == DAILY and
preCloseInterestCalculationStrategy == TILL_REST_FREQUENCY_DATE
+ // or restFrequencyType == SAME_AS_REPAYMENT_PERIOD and
preCloseInterestCalculationStrategy ==
+ // TILL_PRE_CLOSURE_DATE
+ // we cannot harmonize the two configs. Behaviour should mimic prepay
api.
+ return switch (recalculationDetails.getRestFrequencyType()) {
+ case DAILY ->
+ isPrepayAttempt &&
recalculationDetails.getPreCloseInterestCalculationStrategy().calculateTillRestFrequencyEnabled();
+ case SAME_AS_REPAYMENT_PERIOD ->
+
recalculationDetails.getPreCloseInterestCalculationStrategy().calculateTillRestFrequencyEnabled();
+ case WEEKLY -> throw new IllegalStateException("Unexpected
RecalculationFrequencyType: WEEKLY");
+ case MONTHLY -> throw new IllegalStateException("Unexpected
RecalculationFrequencyType: MONTHLY");
Review Comment:
I have added the validation to `LoanProductDataValidator`, however I've kept
the exceptions just to be sure we aren't processing loans we are not supporting.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]