diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountEditWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountEditWritePlatformServiceJpaRepositoryImpl.java index 241198c7c..ac6194011 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountEditWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountEditWritePlatformServiceJpaRepositoryImpl.java @@ -220,10 +220,16 @@ public class SavingsAccountEditWritePlatformServiceJpaRepositoryImpl implements this.savingsAccountWritePlatformService.releaseAmount(savingsId, pendingEdit.getHoldTransactionId()); } - // 2) Post the real charge(s) for newly-enabled facilities, today. + // 2) Post the real charge(s) for newly-enabled facilities, today -- and post the matching + // GL journal entries for those charge transactions (collectCharges() only books them + // against the account itself; it does not touch the general ledger). if (!newlyEnabledFacilityTypes.isEmpty()) { + final Set existingTransactionIds = new HashSet<>(account.findExistingTransactionIds()); + final Set existingReversedTransactionIds = new HashSet<>(account.findExistingReversedTransactionIds()); final var chargesAdded = this.facilityChargeAutoApplyService.applyChargesForFacilities(account, newlyEnabledFacilityTypes); this.facilityChargeAutoApplyService.collectCharges(account, chargesAdded, DateUtils.getBusinessLocalDate()); + this.savingsAccountWritePlatformService.postJournalEntriesForSavingsAccount(account, existingTransactionIds, + existingReversedTransactionIds, false); } // 3) Apply the facility-config toggles to the real row. diff --git a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/FacilityChargeAutoApplyService.java b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/FacilityChargeAutoApplyService.java index efb371213..d7bbf84bc 100644 --- a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/FacilityChargeAutoApplyService.java +++ b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/FacilityChargeAutoApplyService.java @@ -160,7 +160,11 @@ public class FacilityChargeAutoApplyService { } } if (!transactions.isEmpty()) { - savingsAccountTransactionRepository.saveAll(transactions); + // Flush immediately (not just save) so each transaction gets its DB-generated id right + // away -- the caller posts GL journal entries for these transactions straight after this + // call returns, and that requires a real id on each one, not one that only appears at + // end-of-transaction commit. + savingsAccountTransactionRepository.saveAllAndFlush(transactions); account.recalculateBalancesAfterFacilityCharges(transactionDate); } return transactions; diff --git a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformService.java b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformService.java index e6daf5577..916089a33 100644 --- a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformService.java +++ b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformService.java @@ -79,6 +79,9 @@ public interface SavingsAccountWritePlatformService { void processPostActiveActions(SavingsAccount account, DateTimeFormatter fmt, Set existingTransactionIds, Set existingReversedTransactionIds); + void postJournalEntriesForSavingsAccount(SavingsAccount account, Set existingTransactionIds, + Set existingReversedTransactionIds, boolean backdatedTxnsAllowedTill); + CommandProcessingResult modifyWithHoldTax(Long savingsAccountId, JsonCommand command); void setSubStatusInactive(Long savingsId);