FINERACT-2326: Enhanced loan retrieval API to avoid some of the N+1 queries when loading summaries

This commit is contained in:
Arnold Galovics
2025-08-24 22:03:56 +02:00
committed by Arnold Gálovics
parent 2a29b1ca0e
commit 9ef79f86a0
18 changed files with 262 additions and 46 deletions
@@ -33,6 +33,7 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanSchedul
public final class DisbursementData implements LoanPrincipalRelatedDataHolder, Comparable<DisbursementData> {
private final Long id;
private final Long loanId;
private final LocalDate expectedDisbursementDate;
private final LocalDate actualDisbursementDate;
private final BigDecimal principal;
@@ -61,6 +62,7 @@ public final class DisbursementData implements LoanPrincipalRelatedDataHolder, C
this.note = "";
this.linkAccountId = linkAccountId;
this.id = null;
this.loanId = null;
this.expectedDisbursementDate = null;
this.principal = null;
this.loanChargeId = null;
@@ -77,7 +77,7 @@ public class RepaymentScheduleRelatedLoanData {
public DisbursementData disbursementData() {
BigDecimal waivedChargeAmount = null;
return new DisbursementData(null, this.expectedDisbursementDate, this.actualDisbursementDate, this.principal,
return new DisbursementData(null, null, this.expectedDisbursementDate, this.actualDisbursementDate, this.principal,
this.netDisbursalAmount, null, null, waivedChargeAmount);
}
}
@@ -122,8 +122,8 @@ public class LoanDisbursementDetails extends AbstractPersistableCustom<Long> {
public DisbursementData toData() {
LocalDate expectedDisburseDate = expectedDisbursementDateAsLocalDate();
BigDecimal waivedChargeAmount = null;
return new DisbursementData(getId(), expectedDisburseDate, this.actualDisbursementDate, this.principal, this.netDisbursalAmount,
null, null, waivedChargeAmount);
return new DisbursementData(getId(), loan.getId(), expectedDisburseDate, this.actualDisbursementDate, this.principal,
this.netDisbursalAmount, null, null, waivedChargeAmount);
}
public void updateActualDisbursementDate(LocalDate actualDisbursementDate) {
@@ -2030,7 +2030,7 @@ public abstract class AbstractCumulativeLoanScheduleGenerator implements LoanSch
} else {
if (loanApplicationTerms.getDisbursementDatas().isEmpty()) {
loanApplicationTerms.getDisbursementDatas()
.add(new DisbursementData(1L, loanApplicationTerms.getExpectedDisbursementDate(),
.add(new DisbursementData(1L, null, loanApplicationTerms.getExpectedDisbursementDate(),
loanApplicationTerms.getExpectedDisbursementDate(), loanApplicationTerms.getPrincipal().getAmount(), null,
null, null, null));
}
@@ -92,8 +92,9 @@ public class LoanMapper {
actualDisbursementDate = loanDisbursementDetails.actualDisbursementDate();
}
BigDecimal waivedChargeAmount = null;
disbursementData.add(new DisbursementData(loanDisbursementDetails.getId(), expectedDisbursementDate, actualDisbursementDate,
loanDisbursementDetails.principal(), loan.getNetDisbursalAmount(), null, null, waivedChargeAmount));
disbursementData.add(
new DisbursementData(loanDisbursementDetails.getId(), loan.getId(), expectedDisbursementDate, actualDisbursementDate,
loanDisbursementDetails.principal(), loan.getNetDisbursalAmount(), null, null, waivedChargeAmount));
}
return disbursementData;
@@ -22,6 +22,7 @@ import jakarta.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.fineract.infrastructure.core.domain.ExternalId;
import org.apache.fineract.infrastructure.core.service.Page;
@@ -104,6 +105,8 @@ public interface LoanReadPlatformService {
Collection<DisbursementData> retrieveLoanDisbursementDetails(Long loanId);
Map<Long, List<DisbursementData>> retrieveLoanDisbursementDetails(List<Long> loanIds);
DisbursementData retrieveLoanDisbursementDetail(Long loanId, Long disbursementId);
LoanTransactionData retrieveRecoveryPaymentTemplate(Long loanId);