budaidev commented on code in PR #4961:
URL: https://github.com/apache/fineract/pull/4961#discussion_r2325415024
##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDisbursementService.java:
##########
@@ -145,9 +148,67 @@ public Money adjustDisburseAmount(final Loan loan,
@NotNull final JsonCommand co
if (details.isEmpty()) {
diff =
loan.getLoanRepaymentScheduleDetail().getPrincipal().minus(principalDisbursed).getAmount();
} else {
- for (LoanDisbursementDetails disbursementDetails : details) {
-
disbursementDetails.updateActualDisbursementDate(actualDisbursementDate);
- disbursementDetails.updatePrincipal(principalDisbursed);
+ // Check if this is a tranche-based loan (has multiple
predefined disbursement details)
+ // versus a non-tranche multi-disbursal loan (creates
disbursement details on-the-fly)
+ boolean isTrancheBasedLoan =
hasMultipleOrPreDefinedDisbursementDetails(loan, details);
+
+ if (isTrancheBasedLoan && details.size() > 1) {
+ // For tranche loans with multiple tranches on the same
date:
+ // Apply smart selection to prevent consuming all tranches
+ // First, try to find an exact match for the disbursement
amount
+ LoanDisbursementDetails matchingTranche = null;
+ for (LoanDisbursementDetails disbursementDetails :
details) {
+ if
(disbursementDetails.principal().compareTo(principalDisbursed) == 0) {
+ matchingTranche = disbursementDetails;
+ break;
+ }
+ }
Review Comment:
refactored
##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDisbursementService.java:
##########
@@ -145,9 +148,67 @@ public Money adjustDisburseAmount(final Loan loan,
@NotNull final JsonCommand co
if (details.isEmpty()) {
diff =
loan.getLoanRepaymentScheduleDetail().getPrincipal().minus(principalDisbursed).getAmount();
} else {
- for (LoanDisbursementDetails disbursementDetails : details) {
-
disbursementDetails.updateActualDisbursementDate(actualDisbursementDate);
- disbursementDetails.updatePrincipal(principalDisbursed);
+ // Check if this is a tranche-based loan (has multiple
predefined disbursement details)
+ // versus a non-tranche multi-disbursal loan (creates
disbursement details on-the-fly)
+ boolean isTrancheBasedLoan =
hasMultipleOrPreDefinedDisbursementDetails(loan, details);
+
+ if (isTrancheBasedLoan && details.size() > 1) {
+ // For tranche loans with multiple tranches on the same
date:
+ // Apply smart selection to prevent consuming all tranches
+ // First, try to find an exact match for the disbursement
amount
+ LoanDisbursementDetails matchingTranche = null;
+ for (LoanDisbursementDetails disbursementDetails :
details) {
+ if
(disbursementDetails.principal().compareTo(principalDisbursed) == 0) {
+ matchingTranche = disbursementDetails;
+ break;
+ }
+ }
+
+ if (matchingTranche != null) {
+ // Found exact match - disburse only this tranche
+
matchingTranche.updateActualDisbursementDate(actualDisbursementDate);
+ matchingTranche.updatePrincipal(principalDisbursed);
+ } else {
+ LoanDisbursementDetails bestTranche = null;
+ BigDecimal bestTrancheSize = null;
+ LoanDisbursementDetails largestTranche = null;
+ BigDecimal largestTrancheSize = BigDecimal.ZERO;
+
+ // Find the best fitting tranche
+ for (LoanDisbursementDetails disbursementDetails :
details) {
+ BigDecimal trancheAmount =
disbursementDetails.principal();
+
+ // Track the largest tranche as fallback
+ if (trancheAmount.compareTo(largestTrancheSize) >
0) {
+ largestTranche = disbursementDetails;
+ largestTrancheSize = trancheAmount;
+ }
+
+ // Find smallest tranche that can accommodate the
full amount
+ if (trancheAmount.compareTo(principalDisbursed) >=
0) {
+ if (bestTranche == null ||
trancheAmount.compareTo(bestTrancheSize) < 0) {
+ bestTranche = disbursementDetails;
+ bestTrancheSize = trancheAmount;
+ }
+ }
+ }
+
+ // Use best fitting tranche, or largest if none fits
fully
+ LoanDisbursementDetails selectedTranche = (bestTranche
!= null) ? bestTranche : largestTranche;
+
+ if (selectedTranche != null) {
+ // Update the selected tranche with the
disbursement
+
selectedTranche.updateActualDisbursementDate(actualDisbursementDate);
+
selectedTranche.updatePrincipal(principalDisbursed);
+ }
Review Comment:
refactored
--
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]