adamsaghy commented on code in PR #4961:
URL: https://github.com/apache/fineract/pull/4961#discussion_r2332432197
##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java:
##########
@@ -1550,22 +1551,74 @@ public LoanScheduleData extractData(@NonNull final
ResultSet rs) throws SQLExcep
private List<LoanSchedulePeriodDataWrapper>
collectEligibleDisbursementData(LoanScheduleType loanScheduleType,
Collection<DisbursementData> disbursementData, LocalDate
fromDate, LocalDate dueDate, Set<Long> disbursementPeriodIds) {
List<LoanSchedulePeriodDataWrapper> disbursementDataList = new
ArrayList<>();
- // Collect eligible disbursement data
- for (final DisbursementData data : disbursementData) {
- boolean isDueForDisbursement =
data.isDueForDisbursement(loanScheduleType, fromDate, dueDate);
- boolean isEligible =
((fromDate.equals(this.disbursement.disbursementDate()) &&
data.disbursementDate().equals(fromDate))
- || (fromDate.equals(dueDate) &&
data.disbursementDate().equals(fromDate))
- || canAddDisbursementData(data, isDueForDisbursement,
excludePastUnDisbursed))
- && !disbursementPeriodIds.contains(data.getId());
- if (isEligible) {
- disbursementDataList.add(new
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true));
- disbursementPeriodIds.add(data.getId());
+ boolean hasMultipleTranchesOnSameDate =
hasMultipleTranchesOnSameDate(disbursementData);
+
+ if (hasMultipleTranchesOnSameDate) {
+ Map<LocalDate, List<DisbursementData>> disbursementsByDate =
new HashMap<>();
+
+ for (final DisbursementData data : disbursementData) {
+ boolean isDueForDisbursement =
data.isDueForDisbursement(loanScheduleType, fromDate, dueDate);
+ boolean isEligible =
((fromDate.equals(this.disbursement.disbursementDate())
+ && data.disbursementDate().equals(fromDate))
+ || (fromDate.equals(dueDate) &&
data.disbursementDate().equals(fromDate))
+ || canAddDisbursementData(data,
isDueForDisbursement, excludePastUnDisbursed))
+ && !disbursementPeriodIds.contains(data.getId());
+
+ if (isEligible) {
+
disbursementsByDate.computeIfAbsent(data.disbursementDate(), k -> new
ArrayList<>()).add(data);
+ disbursementPeriodIds.add(data.getId());
+ }
+ }
+
+ for (Map.Entry<LocalDate, List<DisbursementData>> entry :
disbursementsByDate.entrySet()) {
+ List<DisbursementData> sameDateDisbursements =
entry.getValue();
+
+ if (sameDateDisbursements.size() > 1) {
+ List<DisbursementData> disbursedTranches =
sameDateDisbursements.stream().filter(DisbursementData::isDisbursed)
+ .collect(Collectors.toList());
+
+ if (!disbursedTranches.isEmpty()) {
+ for (DisbursementData data : disbursedTranches) {
+ disbursementDataList.add(new
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true));
+ }
+ } else {
+ for (DisbursementData data :
sameDateDisbursements) {
+ disbursementDataList.add(new
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true));
+ }
+ }
+ } else {
+ DisbursementData data = sameDateDisbursements.get(0);
+ disbursementDataList.add(new
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true));
+ }
+ }
+ } else {
+ for (final DisbursementData data : disbursementData) {
+ boolean isDueForDisbursement =
data.isDueForDisbursement(loanScheduleType, fromDate, dueDate);
+ boolean isEligible =
((fromDate.equals(this.disbursement.disbursementDate())
+ && data.disbursementDate().equals(fromDate))
+ || (fromDate.equals(dueDate) &&
data.disbursementDate().equals(fromDate))
+ || canAddDisbursementData(data,
isDueForDisbursement, excludePastUnDisbursed))
+ && !disbursementPeriodIds.contains(data.getId());
+
+ if (isEligible) {
+ disbursementDataList.add(new
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true));
+ disbursementPeriodIds.add(data.getId());
+ }
Review Comment:
Do we really need this complex logic to order the disbursement details?
--
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]