Skip to content

FINERACT-2689: Fix NPE in deposit withholding tax when net interest posted is zero#6126

Open
oluexpert99 wants to merge 1 commit into
apache:developfrom
TECHSERVICES-LIMITED:bugfix/FINERACT-2689
Open

FINERACT-2689: Fix NPE in deposit withholding tax when net interest posted is zero#6126
oluexpert99 wants to merge 1 commit into
apache:developfrom
TECHSERVICES-LIMITED:bugfix/FINERACT-2689

Conversation

@oluexpert99

@oluexpert99 oluexpert99 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor
  • Closing (or posting interest on) a withholding-tax deposit account threw a 500
    NullPointerException whenever the net interest posted on the account was zero:
    SavingsAccount.createWithHoldTransaction / updateWithHoldTransaction guard only on
    the tax group and then evaluate amount.compareTo(BigDecimal.ZERO), but amount can be
    null. SavingsAccountTransactionSummaryWrapper.calculateTotalInterestPosted returns
    total.getAmountDefaultedToNullIfZero() -- i.e. null -- when there are no net
    interest-posting transactions, and that null is passed straight into both helpers.
    - The common real-world trigger is premature-closing a short-term fixed deposit whose
    pre-closure penalty rate is greater than or equal to the chart rate: the effective
    interest is clamped to zero (FixedDepositAccount.getEffectiveInterestRateAsFraction),
    so postPreMaturityInterest posts no interest transaction, and the withholding-tax pass
    then runs with a null interest total. For a withholding-tax account the tax group is
    non-null, so the first clause passes and amount.compareTo throws; the whole command
    rolls back and the account cannot be closed.
    - Null-guard amount in both createWithHoldTransaction and updateWithHoldTransaction: a
    null (or non-positive) interest total means there is nothing to withhold tax on, so
    both no-op and return false. No behaviour change when interest is actually posted -- a
    non-null positive amount takes the same path as before.
    - Add a unit test (SavingsAccountWithHoldTaxNullAmountTest) that sets a non-null tax
    group so the guard is exercised rather than short-circuited, and asserts that a null
    or zero amount no longer throws and adds no withholding transaction.

Description

Describe the changes made and why they were made. (Ignore if these details are present on the associated Apache Fineract JIRA ticket.)

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.

Your assigned reviewer(s) will follow our guidelines for code reviews.

@oluexpert99 oluexpert99 changed the title FINERACT-2689: Fix NPE in deposit withholding tax when net interest p… FINERACT-2689: Fix NPE in deposit withholding tax when net interest posted is zero Jul 13, 2026
…osted is zero

- Closing (or posting interest on) a withholding-tax deposit account threw a 500
  NullPointerException whenever the net interest posted on the account was zero:
  SavingsAccount.createWithHoldTransaction / updateWithHoldTransaction guard only on
  the tax group and then evaluate amount.compareTo(BigDecimal.ZERO), but amount can be
  null. SavingsAccountTransactionSummaryWrapper.calculateTotalInterestPosted returns
  total.getAmountDefaultedToNullIfZero() -- i.e. null -- when there are no net
  interest-posting transactions, and that null is passed straight into both helpers.
- The common real-world trigger is premature-closing a short-term fixed deposit whose
  pre-closure penalty rate is greater than or equal to the chart rate: the effective
  interest is clamped to zero (FixedDepositAccount.getEffectiveInterestRateAsFraction),
  so postPreMaturityInterest posts no interest transaction, and the withholding-tax pass
  then runs with a null interest total. For a withholding-tax account the tax group is
  non-null, so the first clause passes and amount.compareTo throws; the whole command
  rolls back and the account cannot be closed.
- Null-guard amount in both createWithHoldTransaction and updateWithHoldTransaction: a
  null (or non-positive) interest total means there is nothing to withhold tax on, so
  both no-op and return false. No behaviour change when interest is actually posted -- a
  non-null positive amount takes the same path as before.
- Add a unit test (SavingsAccountWithHoldTaxNullAmountTest) that sets a non-null tax
  group so the guard is exercised rather than short-circuited, and asserts that a null
  or zero amount no longer throws and adds no withholding transaction.

Signed-off-by: oluexpert99 <farooq@techservicehub.io>
@oluexpert99 oluexpert99 force-pushed the bugfix/FINERACT-2689 branch from 44fe133 to 85f7906 Compare July 13, 2026 20:09

@Aman-Mittal Aman-Mittal left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems Ok basic null check is added.

Also need to document in PR (Exact Reproduction steps for this when it causes NPE)

@Aman-Mittal Aman-Mittal added bug Needs Functional Review PRs which pass build and have no obvious technical problems, but need functional review. java Pull requests that update Java code labels Jul 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug java Pull requests that update Java code Needs Functional Review PRs which pass build and have no obvious technical problems, but need functional review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants