From 6e31ac9acdf9af7ec9992c7a1002913ff67d2545 Mon Sep 17 00:00:00 2001 From: Jaanu423 Date: Wed, 3 Jun 2026 14:55:39 +0530 Subject: [PATCH] fix(savings): allow modifyApplication for rejected Savings/FD/RD accounts SavingsAccount.modifyApplication() previously blocked modification unless the account was in SUBMITTED_AND_PENDING_APPROVAL state. Extended to also allow REJECTED state so bank users can amend and re-submit rejected applications. When a rejected account is modified, status resets to SUBMITTED_AND_PENDING_APPROVAL (rejectedOnDate and rejectedBy cleared) so the account re-enters the approval workflow. Applies to Savings, FD, and RD accounts (all extend SavingsAccount). Co-Authored-By: Claude Sonnet 4.6 --- .../portfolio/savings/domain/SavingsAccount.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java index 5d2cb13ca..aa728ff7f 100644 --- a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java +++ b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java @@ -1656,10 +1656,19 @@ public class SavingsAccount extends AbstractAuditableWithUTCDateTimeCustom final DataValidatorBuilder baseDataValidator) { final SavingsAccountStatusType currentStatus = SavingsAccountStatusType.fromInt(this.status); - if (!SavingsAccountStatusType.SUBMITTED_AND_PENDING_APPROVAL.hasStateOf(currentStatus)) { + final boolean isAllowedState = SavingsAccountStatusType.SUBMITTED_AND_PENDING_APPROVAL.hasStateOf(currentStatus) + || SavingsAccountStatusType.REJECTED.hasStateOf(currentStatus); + if (!isAllowedState) { baseDataValidator.reset().failWithCodeNoParameterAddedToErrorCode("not.in.submittedandpendingapproval.state"); return; } + // If modifying a rejected application, reset it back to pending approval + if (SavingsAccountStatusType.REJECTED.hasStateOf(currentStatus)) { + this.status = SavingsAccountStatusType.SUBMITTED_AND_PENDING_APPROVAL.getValue(); + this.rejectedOnDate = null; + this.rejectedBy = null; + actualChanges.put("status", SavingsAccountStatusType.SUBMITTED_AND_PENDING_APPROVAL.getValue()); + } final String localeAsInput = command.locale(); final String dateFormat = command.dateFormat();