Senesh Perera created FINERACT-2950:
---------------------------------------

             Summary: LoanDisbursementDetails.equals() uses scale-sensitive 
BigDecimal.equals() causing unnecessary loan schedule recalculation and 
potential NPE
                 Key: FINERACT-2950
                 URL: https://issues.apache.org/jira/browse/FINERACT-2950
             Project: Apache Fineract
          Issue Type: Bug
          Components: Loan
            Reporter: Senesh Perera


In LoanDisbursementDetails, equals() compares principal using 
BigDecimal.equals():

return loanDisbursementDetails.principal.equals(this.principal)
        && DateUtils.isEqual(loanDisbursementDetails.expectedDisbursementDate, 
this.expectedDisbursementDate);

Issues:
1. Scale mismatch: Stored principals use DECIMAL(19,6) (e.g. 1000.000000), 
while request principals parsed in LoanDisbursementService preserve the JSON 
scale (e.g. 1000). Because BigDecimal.equals() is scale-sensitive, unchanged 
disbursement tranches are treated as modified in 
LoanDisbursementService.updateDisbursementDetails(), triggering unnecessary 
schedule recalculations (RECALCULATE_LOAN_SCHEDULE = true).
2. NullPointerException: If principal is null on the incoming object, 
principal.equals(...) throws a NullPointerException.
3. hashCode() mismatch: Objects.hash(expectedDisbursementDate, principal) is 
also scale-sensitive, breaking the equals/hashCode contract when comparing 
across scales.

Expected Behavior:
- Compare principal values null-safely using compareTo() == 0 (or 
MathUtil.isEqualTo).
- Normalize principal in hashCode() using stripTrailingZeros() so equal 
instances return the same hash code.
- Add unit tests in LoanDisbursementDetailsTest covering scale differences and 
null values.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to