Farooq Ayoade created FINERACT-2710:
---------------------------------------
Summary: Bulk-import recurring-deposit download template throws
HTTP 500 (NullPointerException) when a recurring-deposit product has a null
minDepositTermType
Key: FINERACT-2710
URL: https://issues.apache.org/jira/browse/FINERACT-2710
Project: Apache Fineract
Issue Type: Bug
Components: DataImportTool
Reporter: Farooq Ayoade
---Observed behavior
GET /v1/recurringdepositaccounts/downloadtemplate returns HTTP 500 on a
tenant that has at least one recurring-deposit
product with a null minimum-deposit-term type:
{noformat}
java.lang.NullPointerException: Cannot invoke
"org.apache.fineract.infrastructure.core.data.EnumOptionData.getValue()"
because the return value of
"org.apache.fineract.portfolio.savings.data.RecurringDepositProductData.getMinDepositTermType()"
is null
at
org.apache.fineract.infrastructure.bulkimport.populator.RecurringDepositProductSheetPopulator.populate(RecurringDepositProductSheetPopulator.java:84)
at
org.apache.fineract.infrastructure.bulkimport.populator.recurringdeposit.RecurringDepositWorkbookPopulator.populate(...)
{noformat}
Expected behavior
The template downloads successfully (HTTP 200). A recurring-deposit product
with no minimum-deposit-term type simply
leaves that lookup cell blank — exactly as the populator already does for the
other optional product fields.
Steps to reproduce
1. Create a recurring-deposit product without a minimum-deposit-term /
term-type.
2. GET
/fineract-provider/api/v1/recurringdepositaccounts/downloadtemplate?dateFormat=dd%20MMMM%20yyyy.
3. Observe HTTP 500 with the NPE above.
Root cause
RecurringDepositProductSheetPopulator.populate() writes the
min-deposit-term-type cell without a null guard, while
every sibling optional field around it is guarded:
{code:java}
writeBoolean(PRECLOSURE_PENAL_APPLICABLE_COL, row,
product.isPreClosurePenalApplicable());
writeString(MIN_DEPOSIT_TERM_TYPE_COL, row,
product.getMinDepositTermType().getValue()); // <-- no null check
if (product.getMinDepositAmount() != null) { ... } // siblings ARE guarded
if (product.getMaxDepositAmount() != null) { ... }
if (product.getMinDepositTerm() != null) { ... }
{code}
getMinDepositTermType() can be null for a product that never set one, so
.getValue() NPEs and 500s the whole template.
Note that the fixed-deposit product sheet populator already guards the
equivalent field, so this is an inconsistency between two sibling populators
rather than a design decision.
Proposed fix
Guard the write like its siblings:
{code:java}
if (product.getMinDepositTermType() != null) {
writeString(MIN_DEPOSIT_TERM_TYPE_COL, row,
product.getMinDepositTermType().getValue());
}
{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)