Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1636,6 +1636,10 @@ public List<LoanTermVariations> getActiveLoanTermVariations() {
return this.loanTermVariations.stream().filter(LoanTermVariations::isActive).collect(Collectors.toList());
}

public void setLoanTermVariations(List<LoanTermVariations> loanTermVariations) {
this.loanTermVariations = loanTermVariations;
}

public boolean isTopup() {
return this.isTopup;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,11 @@ public ChangedTransactionDetail reprocessLoanTransactions(final LocalDate disbur
}

if (loanTransaction.isRepaymentLikeType() || loanTransaction.isInterestWaiver() || loanTransaction.isRecoveryRepayment()) {
Loan loan = loanTransaction.getLoan();
// pass through for new transactions
if (loanTransaction.getId() == null) {
processLatestTransaction(loanTransaction, new TransactionCtx(currency, installments, charges, overpaymentHolder, null));
processLatestTransaction(loanTransaction, new TransactionCtx(currency, installments, charges, overpaymentHolder, null,
loan.getActiveLoanTermVariations()));
loanTransaction.adjustInterestComponent();
} else {
/**
Expand All @@ -192,8 +194,8 @@ public ChangedTransactionDetail reprocessLoanTransactions(final LocalDate disbur

// Reset derived component of new loan transaction and
// re-process transaction
processLatestTransaction(newLoanTransaction,
new TransactionCtx(currency, installments, charges, overpaymentHolder, null));
processLatestTransaction(newLoanTransaction, new TransactionCtx(currency, installments, charges, overpaymentHolder,
null, loan.getActiveLoanTermVariations()));
newLoanTransaction.adjustInterestComponent();
/**
* Check if the transaction amounts have changed. If so, reverse the original transaction and update
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.apache.fineract.portfolio.loanaccount.domain.ChangedTransactionDetail;
import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations;

@Data
@AllArgsConstructor
Expand All @@ -36,4 +37,5 @@ public class TransactionCtx {
private final Set<LoanCharge> charges;
private final MoneyHolder overpaymentHolder;
private final ChangedTransactionDetail changedTransactionDetail;
private final List<LoanTermVariations> activeLoanTermVariations;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,22 @@
*/
package org.apache.fineract.portfolio.loanaccount.rescheduleloan.handler;

import lombok.RequiredArgsConstructor;
import org.apache.fineract.commands.annotation.CommandType;
import org.apache.fineract.commands.handler.NewCommandSourceHandler;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.service.LoanRescheduleRequestWritePlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@CommandType(entity = "RESCHEDULELOAN", action = "APPROVE")
public class ApproveLoanRescheduleRequestCommandHandler implements NewCommandSourceHandler {

private final LoanRescheduleRequestWritePlatformService loanRescheduleRequestWritePlatformService;

@Autowired
public ApproveLoanRescheduleRequestCommandHandler(LoanRescheduleRequestWritePlatformService loanRescheduleRequestWritePlatformService) {
this.loanRescheduleRequestWritePlatformService = loanRescheduleRequestWritePlatformService;
}

@Transactional
@Override
public CommandProcessingResult processCommand(JsonCommand jsonCommand) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,22 @@
*/
package org.apache.fineract.portfolio.loanaccount.rescheduleloan.handler;

import lombok.RequiredArgsConstructor;
import org.apache.fineract.commands.annotation.CommandType;
import org.apache.fineract.commands.handler.NewCommandSourceHandler;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.service.LoanRescheduleRequestWritePlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@CommandType(entity = "RESCHEDULELOAN", action = "CREATE")
public class CreateLoanRescheduleRequestCommandHandler implements NewCommandSourceHandler {

private final LoanRescheduleRequestWritePlatformService loanRescheduleRequestWritePlatformService;

@Autowired
public CreateLoanRescheduleRequestCommandHandler(LoanRescheduleRequestWritePlatformService loanRescheduleRequestWritePlatformService) {
this.loanRescheduleRequestWritePlatformService = loanRescheduleRequestWritePlatformService;
}

@Transactional
@Override
public CommandProcessingResult processCommand(JsonCommand jsonCommand) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,22 @@
*/
package org.apache.fineract.portfolio.loanaccount.rescheduleloan.handler;

import lombok.RequiredArgsConstructor;
import org.apache.fineract.commands.annotation.CommandType;
import org.apache.fineract.commands.handler.NewCommandSourceHandler;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.service.LoanRescheduleRequestWritePlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@CommandType(entity = "RESCHEDULELOAN", action = "REJECT")
public class RejectLoanRescheduleRequestCommandHandler implements NewCommandSourceHandler {

private final LoanRescheduleRequestWritePlatformService loanRescheduleRequestWritePlatformService;

@Autowired
public RejectLoanRescheduleRequestCommandHandler(LoanRescheduleRequestWritePlatformService loanRescheduleRequestWritePlatformService) {
this.loanRescheduleRequestWritePlatformService = loanRescheduleRequestWritePlatformService;
}

@Transactional
@Override
public CommandProcessingResult processCommand(JsonCommand jsonCommand) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.List;
import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.LoanRepaymentScheduleTransactionProcessor;
import org.springframework.transaction.annotation.Propagation;
Expand All @@ -33,5 +34,6 @@ public interface InterestRefundService {

@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
Money totalInterestByTransactions(LoanRepaymentScheduleTransactionProcessor processor, Long loanId,
LocalDate relatedRefundTransactionDate, List<LoanTransaction> newTransactions, List<Long> oldTransactionIds);
LocalDate relatedRefundTransactionDate, List<LoanTransaction> newTransactions, List<Long> oldTransactionIds,
List<LoanTermVariations> activeLoanTermVariations);
}
Original file line number Diff line number Diff line change
Expand Up @@ -597,7 +597,7 @@ private void handleChargePaidTransaction(final Loan loan, final LoanCharge charg
loanCharges.add(charge);
loanTransactionProcessingService.processLatestTransaction(loan.getTransactionProcessingStrategyCode(), chargesPayment,
new TransactionCtx(loan.getCurrency(), chargePaymentInstallments, loanCharges,
new MoneyHolder(loan.getTotalOverpaidAsMoney()), null));
new MoneyHolder(loan.getTotalOverpaidAsMoney()), null, loan.getActiveLoanTermVariations()));

loanLifecycleStateMachine.determineAndTransition(loan, chargesPayment.getTransactionDate());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public void handleRepaymentOrRecoveryOrWaiverTransaction(final Loan loan, final
if (processLatest) {
loanTransactionProcessingService.processLatestTransaction(loan.getTransactionProcessingStrategyCode(), loanTransaction,
new TransactionCtx(loan.getCurrency(), loan.getRepaymentScheduleInstallments(), loan.getActiveCharges(),
new MoneyHolder(loan.getTotalOverpaidAsMoney()), null));
new MoneyHolder(loan.getTotalOverpaidAsMoney()), null, loan.getActiveLoanTermVariations()));
if (!loan.isProgressiveSchedule() && loan.isInterestBearingAndInterestRecalculationEnabled()) {
if (currentInstallment == null || currentInstallment.isNotFullyPaidOff()) {
reprocessOnPostConditions = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ private void handleRefundTransaction(final Loan loan, final LoanTransaction loan

loadTransactionProcessingService.processLatestTransaction(loan.getTransactionProcessingStrategyCode(), loanTransaction,
new TransactionCtx(loan.getCurrency(), loan.getRepaymentScheduleInstallments(), loan.getActiveCharges(),
new MoneyHolder(loan.getTotalOverpaidAsMoney()), null));
new MoneyHolder(loan.getTotalOverpaidAsMoney()), null, loan.getActiveLoanTermVariations()));

loanLifecycleStateMachine.determineAndTransition(loan, loanTransaction.getTransactionDate());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ public BigDecimal calculateInterestRecalculationFutureOutstandingValue(Loan loan
ProgressiveLoanInterestScheduleModel scheduleModel = optionalScheduleModel.get();
List<LoanRepaymentScheduleInstallment> repaymentScheduleInstallments = loan.getRepaymentScheduleInstallments();
ProgressiveTransactionCtx ctx = new ProgressiveTransactionCtx(loan.getCurrency(), repaymentScheduleInstallments, Set.of(),
new MoneyHolder(loan.getTotalOverpaidAsMoney()), new ChangedTransactionDetail(), scheduleModel);
new MoneyHolder(loan.getTotalOverpaidAsMoney()), new ChangedTransactionDetail(), scheduleModel,
loan.getActiveLoanTermVariations());
ctx.setChargedOff(loan.isChargedOff());
ctx.setWrittenOff(loan.isClosedWrittenOff());
ctx.setContractTerminated(loan.isContractTermination());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ public Pair<ChangedTransactionDetail, ProgressiveLoanInterestScheduleModel> repr
ProgressiveLoanInterestScheduleModel scheduleModel = emiCalculator.generateInstallmentInterestScheduleModel(installments,
LoanConfigurationDetailsMapper.map(loan), installmentAmountInMultiplesOf, overpaymentHolder.getMoneyObject().getMc());
ProgressiveTransactionCtx ctx = new ProgressiveTransactionCtx(currency, installments, charges, overpaymentHolder,
changedTransactionDetail, scheduleModel);
changedTransactionDetail, scheduleModel, loan.getActiveLoanTermVariations());

List<ChangeOperation> changeOperations = createSortedChangeList(loanTermVariations, loanTransactions, charges);

Expand Down Expand Up @@ -571,7 +571,7 @@ private void handleInterestRefund(final LoanTransaction loanTransaction, final T
.filter(LoanTransaction::isNotReversed).filter(tr -> tr.getId() == null).toList());
if (validateInterestRefundTransactionRelation(loanTransaction)) {
final Money interestAfterRefund = interestRefundService.totalInterestByTransactions(this, loan.getId(), targetDate,
modifiedTransactions, unmodifiedTransactionIds);
modifiedTransactions, unmodifiedTransactionIds, ctx.getActiveLoanTermVariations());
final Money newAmount = interestBeforeRefund.minus(progCtx.getSumOfInterestRefundAmount()).minus(interestAfterRefund);
loanTransaction.updateAmount(newAmount.getAmount());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.apache.fineract.portfolio.loanaccount.domain.ChangedTransactionDetail;
import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.MoneyHolder;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.TransactionCtx;
Expand All @@ -52,14 +53,16 @@ public class ProgressiveTransactionCtx extends TransactionCtx {

public ProgressiveTransactionCtx(MonetaryCurrency currency, List<LoanRepaymentScheduleInstallment> installments,
Set<LoanCharge> charges, MoneyHolder overpaymentHolder, ChangedTransactionDetail changedTransactionDetail,
ProgressiveLoanInterestScheduleModel model) {
this(currency, installments, charges, overpaymentHolder, changedTransactionDetail, model, Money.zero(currency));
ProgressiveLoanInterestScheduleModel model, List<LoanTermVariations> activeLoanTermVariations) {
this(currency, installments, charges, overpaymentHolder, changedTransactionDetail, model, Money.zero(currency),
activeLoanTermVariations);
}

public ProgressiveTransactionCtx(MonetaryCurrency currency, List<LoanRepaymentScheduleInstallment> installments,
Set<LoanCharge> charges, MoneyHolder overpaymentHolder, ChangedTransactionDetail changedTransactionDetail,
ProgressiveLoanInterestScheduleModel model, Money sumOfInterestRefundAmount) {
super(currency, installments, charges, overpaymentHolder, changedTransactionDetail);
ProgressiveLoanInterestScheduleModel model, Money sumOfInterestRefundAmount,
List<LoanTermVariations> activeLoanTermVariations) {
super(currency, installments, charges, overpaymentHolder, changedTransactionDetail, activeLoanTermVariations);
this.sumOfInterestRefundAmount = sumOfInterestRefundAmount;
this.model = model;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ public Optional<ProgressiveLoanInterestScheduleModel> getSavedModel(Loan loan, L
savedModel = extractModel(progressiveLoanModel);
if (savedModel.isPresent() && progressiveLoanModel.get().getBusinessDate().isBefore(businessDate)) {
ProgressiveTransactionCtx ctx = new ProgressiveTransactionCtx(loan.getCurrency(), loan.getRepaymentScheduleInstallments(),
Set.of(), new MoneyHolder(loan.getTotalOverpaidAsMoney()), new ChangedTransactionDetail(), savedModel.get());
Set.of(), new MoneyHolder(loan.getTotalOverpaidAsMoney()), new ChangedTransactionDetail(), savedModel.get(),
loan.getActiveLoanTermVariations());
ctx.setChargedOff(loan.isChargedOff());
ctx.setWrittenOff(loan.isClosedWrittenOff());
ctx.setContractTerminated(loan.isContractTermination());
Expand Down
Loading
Loading