From bb492c82b598284494f9cc8b31574565549b7a86 Mon Sep 17 00:00:00 2001 From: Nitesh Yadav Date: Wed, 28 Oct 2026 18:51:22 +0530 Subject: [PATCH] fix(savings): interest posting reports no longer fail when a product names no payable or paid GL A ternary mixing a long with a Long unboxed a null GL id and failed the whole report with a NullPointerException. The values are boxed with Long.valueOf, so a product that names no payable or paid GL (allowed) is read as null. Co-Authored-By: Claude Sonnet 5.5 --- .../SavingsPooledInterestPostingService.java | 7 +++++-- .../fdinterest/FixedDepositInterestPostingService.java | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/dailyinterest/SavingsPooledInterestPostingService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/dailyinterest/SavingsPooledInterestPostingService.java index 8cac4b0b7..ae06f2954 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/dailyinterest/SavingsPooledInterestPostingService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/dailyinterest/SavingsPooledInterestPostingService.java @@ -223,10 +223,13 @@ public class SavingsPooledInterestPostingService { final long runId = openRun(reportId, productId, officeId, cycleDate, lines.size()); final PostingGlAccounts current = resolvePostingGlAccounts(productId); + // Long.valueOf, not the bare long: a ternary mixing a long with a Long is a long, so a GL the product does not name + // (null, and allowed) was unboxed here and the whole report failed with a NullPointerException. final Long payableGl = report.get("payable_gl_account_id") != null - ? ((Number) report.get("payable_gl_account_id")).longValue() + ? Long.valueOf(((Number) report.get("payable_gl_account_id")).longValue()) : current.payableGl(); - final Long paidGl = report.get("paid_gl_account_id") != null ? ((Number) report.get("paid_gl_account_id")).longValue() + final Long paidGl = report.get("paid_gl_account_id") != null + ? Long.valueOf(((Number) report.get("paid_gl_account_id")).longValue()) : current.paidGl(); final String currency = (String) lines.get(0).get("currency_code"); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/fdinterest/FixedDepositInterestPostingService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/fdinterest/FixedDepositInterestPostingService.java index 33ba4630e..5429f6ac0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/fdinterest/FixedDepositInterestPostingService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/fdinterest/FixedDepositInterestPostingService.java @@ -210,9 +210,13 @@ public class FixedDepositInterestPostingService { final Long expenseGl = mappedGlAccount(productId, GL_INTEREST_ON_SAVINGS); final Long controlGl = mappedGlAccount(productId, GL_SAVINGS_CONTROL); final PostingGlAccounts current = resolvePostingGlAccounts(productId); - final Long payableGl = report.get("payable_gl_account_id") != null ? ((Number) report.get("payable_gl_account_id")).longValue() + // Long.valueOf, not the bare long: a ternary mixing a long with a Long is a long, so a product that names no payable + // or paid GL (null, and allowed) was unboxed here and the whole report failed with a NullPointerException. + final Long payableGl = report.get("payable_gl_account_id") != null + ? Long.valueOf(((Number) report.get("payable_gl_account_id")).longValue()) : current.payableGl(); - final Long paidGl = report.get("paid_gl_account_id") != null ? ((Number) report.get("paid_gl_account_id")).longValue() + final Long paidGl = report.get("paid_gl_account_id") != null + ? Long.valueOf(((Number) report.get("paid_gl_account_id")).longValue()) : current.paidGl(); final String currency = (String) lines.get(0).get("currency_code");