diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java b/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java index 6b3a6ae8839..744fa11dcea 100644 --- a/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java +++ b/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java @@ -126,6 +126,7 @@ public CommandProcessingResult executeCommand(final CommandWrapper wrapper, fina result = commandSourceService.processCommand(findCommandHandler(wrapper), command, commandSource, user, isApprovedByChecker, isMakerChecker); } catch (Throwable t) { // NOSONAR + t.printStackTrace(); RuntimeException mappable = ErrorHandler.getMappable(t); ErrorInfo errorInfo = commandSourceService.generateErrorInfo(mappable); Integer statusCode = errorInfo.getStatusCode(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferRepository.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferRepository.java index 7e395b20311..2b3d616f199 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferRepository.java @@ -39,4 +39,8 @@ public interface AccountTransferRepository @Query("select att from AccountTransferTransaction att where att.fromLoanTransaction.id IN :loanTransactions and att.reversed=false") List findByFromLoanTransactions(@Param("loanTransactions") Collection loanTransactions); + + @Query("select count(att.id) from AccountTransferTransaction att where att.accountTransferDetails.fromSavingsAccount.id = :savingsId and att.reversed=false") + Long countByFromSavingsAccountId(@Param("savingsId") Long savingsId); + } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java index 4614d8c8fb8..461a809e666 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java @@ -42,6 +42,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; @@ -74,6 +75,7 @@ import org.apache.fineract.portfolio.savings.service.SavingsEnumerations; import org.apache.fineract.useradministration.domain.AppUser; +@Slf4j @Entity @DiscriminatorValue("300") public class RecurringDepositAccount extends SavingsAccount { @@ -1010,6 +1012,10 @@ private void validateDomainRules(final DataValidatorBuilder baseDataValidator) { final boolean isValidDepositPeriod = this.accountTermAndPreClosure.depositTermDetail() .isDepositBetweenMinAndMax(depositStartDate(), calculateMaturityDate()); if (!isValidDepositPeriod) { + final Integer depositPeriodInDays = this.accountTermAndPreClosure.depositTermDetail().getDepositPeriodInDays(depositPeriod, + depositPeriodFrequencyType); + log.error("Recurring Deposit account with invalid deposit period {} {} : {} to {}", depositPeriodInDays, + depositPeriodFrequencyType.getCode(), depositStartDate(), calculateMaturityDate()); baseDataValidator.reset().parameter(depositPeriodParamName).value(depositPeriod) .failWithCodeNoParameterAddedToErrorCode("deposit.period.not.between.min.and.max.deposit.term"); } else { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java index 058f006d6a6..b34e59cf752 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java @@ -38,7 +38,6 @@ import java.util.Set; import java.util.UUID; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; @@ -61,6 +60,7 @@ import org.apache.fineract.portfolio.account.PortfolioAccountType; import org.apache.fineract.portfolio.account.data.AccountTransferDTO; import org.apache.fineract.portfolio.account.data.PortfolioAccountData; +import org.apache.fineract.portfolio.account.domain.AccountTransferRepository; import org.apache.fineract.portfolio.account.domain.AccountTransferType; import org.apache.fineract.portfolio.account.service.AccountAssociationsReadPlatformService; import org.apache.fineract.portfolio.account.service.AccountTransfersReadPlatformService; @@ -111,7 +111,6 @@ import org.apache.fineract.useradministration.domain.AppUser; import org.springframework.transaction.annotation.Transactional; -@Slf4j @Transactional @RequiredArgsConstructor public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements DepositAccountWritePlatformService { @@ -137,6 +136,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo private final WorkingDaysRepositoryWrapper workingDaysRepository; private final DepositAccountOnHoldTransactionRepository depositAccountOnHoldTransactionRepository; private final SavingsAccountDomainService savingsAccountDomainService; + private final AccountTransferRepository accountTransferRepository; @Transactional @Override @@ -234,6 +234,11 @@ public CommandProcessingResult undoActivateFDAccount(Long savingsId, JsonCommand DepositAccountType.FIXED_DEPOSIT); checkClientOrGroupActive(account); + if (accountTransferRepository.countByFromSavingsAccountId(account.getId()) > 0) { + throw new PlatformServiceUnavailableException("error.msg.deposit.account.undo.activate.not.allowed", "Fixed deposit account " + + account.getAccountNumber() + " undo activate not allowed as it involves some account transfers", savingsId); + } + final Set existingTransactionIds = new HashSet<>(); final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); @@ -261,6 +266,13 @@ public CommandProcessingResult undoActivateRDAccount(final Long savingsId, final DepositAccountType.RECURRING_DEPOSIT); checkClientOrGroupActive(account); + if (accountTransferRepository.countByFromSavingsAccountId(account.getId()) > 0) { + throw new PlatformServiceUnavailableException("error.msg.deposit.account.undo.activate.not.allowed", + "Recurring deposit account " + account.getAccountNumber() + + " undo activate not allowed as it involves some account transfers", + savingsId); + } + final Map changes = account.undoActivate(); return new CommandProcessingResultBuilder() // diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/starter/SavingsConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/starter/SavingsConfiguration.java index 504f55b439e..c7c9bd69f16 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/starter/SavingsConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/starter/SavingsConfiguration.java @@ -43,6 +43,7 @@ import org.apache.fineract.organisation.staff.service.StaffReadPlatformService; import org.apache.fineract.organisation.workingdays.domain.WorkingDaysRepositoryWrapper; import org.apache.fineract.portfolio.account.domain.AccountAssociationsRepository; +import org.apache.fineract.portfolio.account.domain.AccountTransferRepository; import org.apache.fineract.portfolio.account.domain.StandingInstructionRepository; import org.apache.fineract.portfolio.account.service.AccountAssociationsReadPlatformService; import org.apache.fineract.portfolio.account.service.AccountTransfersReadPlatformService; @@ -229,7 +230,7 @@ public DepositAccountWritePlatformService depositAccountWritePlatformService(Pla ConfigurationDomainService configurationDomainService, HolidayRepositoryWrapper holidayRepository, WorkingDaysRepositoryWrapper workingDaysRepository, DepositAccountOnHoldTransactionRepository depositAccountOnHoldTransactionRepository, - SavingsAccountDomainService savingsAccountDomainService + SavingsAccountDomainService savingsAccountDomainService, AccountTransferRepository accountTransferRepository ) { return new DepositAccountWritePlatformServiceJpaRepositoryImpl(context, savingAccountRepositoryWrapper, @@ -238,7 +239,7 @@ public DepositAccountWritePlatformService depositAccountWritePlatformService(Pla depositAccountDomainService, noteRepository, accountTransfersReadPlatformService, chargeRepository, savingsAccountChargeRepository, accountAssociationsReadPlatformService, accountTransfersWritePlatformService, calendarInstanceRepository, configurationDomainService, holidayRepository, workingDaysRepository, - depositAccountOnHoldTransactionRepository, savingsAccountDomainService); + depositAccountOnHoldTransactionRepository, savingsAccountDomainService, accountTransferRepository); } @Bean diff --git a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositTermDetail.java b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositTermDetail.java index 360e64ada17..51e498bf3eb 100644 --- a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositTermDetail.java +++ b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositTermDetail.java @@ -166,6 +166,10 @@ public Integer inMultiplesOfDepositTermType() { return this.inMultiplesOfDepositTermType; } + public Integer getDepositPeriodInDays(final Integer depositPeriod, final SavingsPeriodFrequencyType depositPeriodFrequencyType) { + return this.convertToSafeDays(depositPeriod, depositPeriodFrequencyType); + } + public boolean isDepositBetweenMinAndMax(LocalDate depositStartDate, LocalDate depositEndDate) { return isEqualOrGreaterThanMin(depositStartDate, depositEndDate) && isEqualOrLessThanMax(depositStartDate, depositEndDate); } @@ -263,4 +267,5 @@ public DepositTermDetail copy() { return DepositTermDetail.createFrom(minDepositTerm, maxDepositTerm, minDepositTermType, maxDepositTermType, inMultiplesOfDepositTerm, inMultiplesOfDepositTermType); } + }