Skip to content

Commit 962454c

Browse files
committed
Harden disbursement max calculation null-safety and percentage precision
1 parent 880a4c2 commit 962454c

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanDisbursementValidator.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
package org.apache.fineract.portfolio.loanaccount.serialization;
2020

2121
import java.math.BigDecimal;
22+
import java.util.Locale;
2223
import java.time.LocalDate;
2324
import lombok.RequiredArgsConstructor;
2425
import org.apache.fineract.infrastructure.core.service.DateUtils;
2526
import org.apache.fineract.infrastructure.core.service.MathUtil;
27+
import org.apache.fineract.organisation.monetary.domain.MoneyHelper;
2628
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
2729
import org.apache.fineract.portfolio.loanaccount.domain.LoanOverAppliedCalculationType;
2830
import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
@@ -64,16 +66,17 @@ public void validateOverMaximumAmount(final Loan loan, final BigDecimal totalDis
6466

6567
private BigDecimal calculateMaxAllowedDisbursement(final Loan loan) {
6668
final LoanProduct loanProduct = loan.getLoanProduct();
67-
final BigDecimal approvedPrincipal = loan.getApprovedPrincipal() != null ? loan.getApprovedPrincipal() : loan.getProposedPrincipal();
69+
final BigDecimal approvedPrincipal = loan.getApprovedPrincipal() != null ? loan.getApprovedPrincipal()
70+
: loan.getProposedPrincipal() != null ? loan.getProposedPrincipal() : BigDecimal.ZERO;
6871
BigDecimal maxAllowed = approvedPrincipal;
6972

7073
if (loanProduct.getOverAppliedCalculationType() != null && loanProduct.getOverAppliedNumber() != null) {
7174
final BigDecimal overAppliedMax = BigDecimal.valueOf(loanProduct.getOverAppliedNumber());
7275
final LoanOverAppliedCalculationType calculationType = LoanOverAppliedCalculationType
73-
.valueOf(loanProduct.getOverAppliedCalculationType().toUpperCase());
76+
.valueOf(loanProduct.getOverAppliedCalculationType().toUpperCase(Locale.ROOT));
7477

7578
if (calculationType.isPercentage()) {
76-
final BigDecimal extra = approvedPrincipal.multiply(overAppliedMax).divide(BigDecimal.valueOf(100));
79+
final BigDecimal extra = MathUtil.percentageOf(approvedPrincipal, overAppliedMax, MoneyHelper.getMathContext());
7780
maxAllowed = approvedPrincipal.add(extra);
7881
} else {
7982
maxAllowed = approvedPrincipal.add(overAppliedMax);

0 commit comments

Comments
 (0)