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]

Reply via email to