From 025ff9c707c8f68b226c1af523f3f42a742a8a9a Mon Sep 17 00:00:00 2001 From: Nazeer Hussain Shaik Date: Mon, 19 Sep 2016 14:03:37 +0530 Subject: [PATCH] Loading child entites lazy --- ...WritePlatformServiceJpaRepositoryImpl.java | 15 +- .../service/AccountingProcessorHelper.java | 12 +- ...lEntryRunningBalanceUpdateServiceImpl.java | 14 +- ...WritePlatformServiceJpaRepositoryImpl.java | 17 +- ...WritePlatformServiceJpaRepositoryImpl.java | 10 +- ...WritePlatformServiceJpaRepositoryImpl.java | 15 +- .../hooks/processor/TwilioHookProcessor.java | 27 +-- ...WritePlatformServiceJpaRepositoryImpl.java | 12 +- .../organisation/office/domain/Office.java | 6 +- .../domain/OfficeRepositoryWrapper.java | 17 +- ...WritePlatformServiceJpaRepositoryImpl.java | 28 ++- ...WritePlatformServiceJpaRepositoryImpl.java | 17 +- .../TellerWritePlatformServiceJpaImpl.java | 21 +- .../AccountTransferDetailAssembler.java | 20 +- .../AddressWritePlatformServiceImpl.java | 10 +- ...WritePlatformServiceJpaRepositoryImpl.java | 10 +- .../portfolio/client/domain/Client.java | 94 ++++----- .../client/domain/ClientAddress.java | 1 - .../client/domain/ClientRepository.java | 2 +- .../domain/ClientRepositoryWrapper.java | 21 +- ...WritePlatformServiceJpaRepositoryImpl.java | 74 +++---- .../CollateralReadPlatformServiceImpl.java | 13 +- ...WritePlatformServiceJpaRepositoryImpl.java | 28 +-- ...WritePlatformServiceJpaRepositoryImpl.java | 43 ++-- .../portfolio/loanaccount/domain/Loan.java | 100 +++++----- .../domain/LoanAccountDomainServiceJpa.java | 16 +- .../domain/LoanRepositoryWrapper.java | 185 +++++++++++++++++- .../GuarantorReadPlatformServiceImpl.java | 13 +- ...ritePlatformServiceJpaRepositoryIImpl.java | 6 +- .../domain/AbstractLoanScheduleGenerator.java | 3 +- .../service/LoanScheduleAssembler.java | 8 +- ...cheduleCalculationPlatformServiceImpl.java | 4 +- .../LoanScheduleWritePlatformServiceImpl.java | 5 +- ...cheduleRequestReadPlatformServiceImpl.java | 21 +- ...heduleRequestWritePlatformServiceImpl.java | 12 +- .../LoanAccrualWritePlatformServiceImpl.java | 12 +- ...WritePlatformServiceJpaRepositoryImpl.java | 49 +++-- .../loanaccount/service/LoanAssembler.java | 4 +- .../service/LoanChargeAssembler.java | 2 +- .../service/LoanReadPlatformServiceImpl.java | 37 ++-- .../loanaccount/service/LoanUtilService.java | 5 +- .../service/LoanWritePlatformService.java | 9 +- ...WritePlatformServiceJpaRepositoryImpl.java | 102 +++++----- ...WritePlatformServiceJpaRepositoryImpl.java | 11 +- ...WritePlatformServiceJpaRepositoryImpl.java | 16 +- ...WritePlatformServiceJpaRepositoryImpl.java | 15 +- .../savings/data/SavingsAccountDataDTO.java | 11 +- .../domain/DepositAccountAssembler.java | 3 +- .../domain/RecurringDepositAccount.java | 24 +-- .../savings/domain/SavingsAccount.java | 30 ++- .../domain/SavingsAccountAssembler.java | 4 +- .../domain/SavingsAccountRepository.java | 1 + .../SavingsAccountRepositoryWrapper.java | 58 +++++- .../savings/domain/SavingsAccountSummary.java | 3 +- ...vingsAccountTransactionSummaryWrapper.java | 24 +-- ...WritePlatformServiceJpaRepositoryImpl.java | 66 +++---- .../SavingsAccountWritePlatformService.java | 8 +- ...WritePlatformServiceJpaRepositoryImpl.java | 73 +++---- .../service/SavingsSchedularServiceImpl.java | 10 +- ...eficiariesTPTWritePlatformServiceImpl.java | 21 +- ...WritePlatformServiceJpaRepositoryImpl.java | 76 +++---- .../spm/api/ScorecardApiResource.java | 45 ++--- ...WritePlatformServiceJpaRepositoryImpl.java | 28 ++- 63 files changed, 887 insertions(+), 760 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java index 4c305df84..7b00ac862 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java @@ -28,16 +28,15 @@ import org.apache.fineract.accounting.closure.domain.GLClosureRepository; import org.apache.fineract.accounting.closure.exception.GLClosureDuplicateException; import org.apache.fineract.accounting.closure.exception.GLClosureInvalidDeleteException; import org.apache.fineract.accounting.closure.exception.GLClosureInvalidException; -import org.apache.fineract.accounting.closure.exception.GLClosureNotFoundException; import org.apache.fineract.accounting.closure.exception.GLClosureInvalidException.GL_CLOSURE_INVALID_REASON; +import org.apache.fineract.accounting.closure.exception.GLClosureNotFoundException; import org.apache.fineract.accounting.closure.serialization.GLClosureCommandFromApiJsonDeserializer; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.joda.time.LocalDate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,14 +51,14 @@ public class GLClosureWritePlatformServiceJpaRepositoryImpl implements GLClosure private final static Logger logger = LoggerFactory.getLogger(GLClosureWritePlatformServiceJpaRepositoryImpl.class); private final GLClosureRepository glClosureRepository; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final GLClosureCommandFromApiJsonDeserializer fromApiJsonDeserializer; @Autowired public GLClosureWritePlatformServiceJpaRepositoryImpl(final GLClosureRepository glClosureRepository, - final OfficeRepository officeRepository, final GLClosureCommandFromApiJsonDeserializer fromApiJsonDeserializer) { + final OfficeRepositoryWrapper officeRepositoryWrapper, final GLClosureCommandFromApiJsonDeserializer fromApiJsonDeserializer) { this.glClosureRepository = glClosureRepository; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.fromApiJsonDeserializer = fromApiJsonDeserializer; } @@ -72,9 +71,7 @@ public class GLClosureWritePlatformServiceJpaRepositoryImpl implements GLClosure // check office is valid final Long officeId = command.longValueOfParameterNamed(GLClosureJsonInputParams.OFFICE_ID.getValue()); - final Office office = this.officeRepository.findOne(officeId); - if (office == null) { throw new OfficeNotFoundException(officeId); } - + final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); // TODO: Get Tenant specific date // ensure closure date is not in the future final Date todaysDate = new Date(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java index fa3e76340..aeef6ced5 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java @@ -44,9 +44,9 @@ import org.apache.fineract.accounting.journalentry.data.LoanDTO; import org.apache.fineract.accounting.journalentry.data.LoanTransactionDTO; import org.apache.fineract.accounting.journalentry.data.SavingsDTO; import org.apache.fineract.accounting.journalentry.data.SavingsTransactionDTO; -import org.apache.fineract.accounting.journalentry.data.TaxPaymentDTO; import org.apache.fineract.accounting.journalentry.data.SharesDTO; import org.apache.fineract.accounting.journalentry.data.SharesTransactionDTO; +import org.apache.fineract.accounting.journalentry.data.TaxPaymentDTO; import org.apache.fineract.accounting.journalentry.domain.JournalEntry; import org.apache.fineract.accounting.journalentry.domain.JournalEntryRepository; import org.apache.fineract.accounting.journalentry.domain.JournalEntryType; @@ -60,7 +60,7 @@ import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.portfolio.account.PortfolioAccountType; import org.apache.fineract.portfolio.account.service.AccountTransfersReadPlatformService; import org.apache.fineract.portfolio.client.domain.ClientTransaction; @@ -90,7 +90,7 @@ public class AccountingProcessorHelper { private final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepository; private final GLClosureRepository closureRepository; private final GLAccountRepositoryWrapper accountRepositoryWrapper; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final LoanTransactionRepository loanTransactionRepository; private final ClientTransactionRepositoryWrapper clientTransactionRepository; private final SavingsAccountTransactionRepository savingsAccountTransactionRepository; @@ -99,7 +99,7 @@ public class AccountingProcessorHelper { @Autowired public AccountingProcessorHelper(final JournalEntryRepository glJournalEntryRepository, final ProductToGLAccountMappingRepository accountMappingRepository, final GLClosureRepository closureRepository, - final OfficeRepository officeRepository, final LoanTransactionRepository loanTransactionRepository, + final OfficeRepositoryWrapper officeRepositoryWrapper, final LoanTransactionRepository loanTransactionRepository, final SavingsAccountTransactionRepository savingsAccountTransactionRepository, final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepository, final AccountTransfersReadPlatformService accountTransfersReadPlatformService, @@ -108,7 +108,7 @@ public class AccountingProcessorHelper { this.glJournalEntryRepository = glJournalEntryRepository; this.accountMappingRepository = accountMappingRepository; this.closureRepository = closureRepository; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.loanTransactionRepository = loanTransactionRepository; this.savingsAccountTransactionRepository = savingsAccountTransactionRepository; this.financialActivityAccountRepository = financialActivityAccountRepository; @@ -539,7 +539,7 @@ public class AccountingProcessorHelper { } public Office getOfficeById(final long officeId) { - return this.officeRepository.findOne(officeId); + return this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); } private void createJournalEntriesForLoan(final Office office, final String currencyCode, final int accountTypeToDebitId, diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryRunningBalanceUpdateServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryRunningBalanceUpdateServiceImpl.java index 4ab8e112f..3a539b628 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryRunningBalanceUpdateServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryRunningBalanceUpdateServiceImpl.java @@ -42,9 +42,7 @@ import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.service.RoutingDataSource; import org.apache.fineract.infrastructure.jobs.annotation.CronTarget; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -60,7 +58,7 @@ public class JournalEntryRunningBalanceUpdateServiceImpl implements JournalEntry private final JdbcTemplate jdbcTemplate; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final JournalEntryDataValidator dataValidator; @@ -89,10 +87,10 @@ public class JournalEntryRunningBalanceUpdateServiceImpl implements JournalEntry + "where je2.id = je.id and je.entry_date = je3.date group by je.id order by je.entry_date DESC " + selectRunningBalanceSqlLimit; @Autowired - public JournalEntryRunningBalanceUpdateServiceImpl(final RoutingDataSource dataSource, final OfficeRepository officeRepository, + public JournalEntryRunningBalanceUpdateServiceImpl(final RoutingDataSource dataSource, final OfficeRepositoryWrapper officeRepositoryWrapper, final JournalEntryDataValidator dataValidator, final FromJsonHelper fromApiJsonHelper) { this.jdbcTemplate = new JdbcTemplate(dataSource); - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.dataValidator = dataValidator; this.fromApiJsonHelper = fromApiJsonHelper; } @@ -120,9 +118,7 @@ public class JournalEntryRunningBalanceUpdateServiceImpl implements JournalEntry if (officeId == null) { updateRunningBalance(); } else { - final Office office = this.officeRepository.findOne(officeId); - if (office == null) { throw new OfficeNotFoundException(officeId); } - + this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); String dateFinder = "select MIN(je.entry_date) as entityDate " + "from acc_gl_journal_entry je " + "where je.is_running_balance_calculated=0 and je.office_id=?"; try { diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java index 205cb1af8..207cdc9c6 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java @@ -69,9 +69,8 @@ import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidati import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.organisation.office.domain.OrganisationCurrencyRepositoryWrapper; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; import org.apache.fineract.portfolio.client.domain.ClientTransaction; import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail; import org.apache.fineract.portfolio.paymentdetail.service.PaymentDetailWritePlatformService; @@ -93,7 +92,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa private final GLClosureRepository glClosureRepository; private final GLAccountRepository glAccountRepository; private final JournalEntryRepository glJournalEntryRepository; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final AccountingProcessorForLoanFactory accountingProcessorForLoanFactory; private final AccountingProcessorForSavingsFactory accountingProcessorForSavingsFactory; private final AccountingProcessorForSharesFactory accountingProcessorForSharesFactory; @@ -109,7 +108,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa @Autowired public JournalEntryWritePlatformServiceJpaRepositoryImpl(final GLClosureRepository glClosureRepository, - final JournalEntryRepository glJournalEntryRepository, final OfficeRepository officeRepository, + final JournalEntryRepository glJournalEntryRepository, final OfficeRepositoryWrapper officeRepositoryWrapper, final GLAccountRepository glAccountRepository, final JournalEntryCommandFromApiJsonDeserializer fromApiJsonDeserializer, final AccountingProcessorHelper accountingProcessorHelper, final AccountingRuleRepository accountingRuleRepository, final AccountingProcessorForLoanFactory accountingProcessorForLoanFactory, @@ -121,7 +120,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepositoryWrapper, final CashBasedAccountingProcessorForClientTransactions accountingProcessorForClientTransactions) { this.glClosureRepository = glClosureRepository; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.glJournalEntryRepository = glJournalEntryRepository; this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.glAccountRepository = glAccountRepository; @@ -147,9 +146,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa // check office is valid final Long officeId = command.longValueOfParameterNamed(JournalEntryJsonInputParams.OFFICE_ID.getValue()); - final Office office = this.officeRepository.findOne(officeId); - if (office == null) { throw new OfficeNotFoundException(officeId); } - + final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); final Long accountRuleId = command.longValueOfParameterNamed(JournalEntryJsonInputParams.ACCOUNTING_RULE.getValue()); final String currencyCode = command.stringValueOfParameterNamed(JournalEntryJsonInputParams.CURRENCY_CODE.getValue()); @@ -647,9 +644,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa // check office is valid final Long officeId = command.longValueOfParameterNamed(JournalEntryJsonInputParams.OFFICE_ID.getValue()); - final Office office = this.officeRepository.findOne(officeId); - if (office == null) { throw new OfficeNotFoundException(officeId); } - + final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); final String currencyCode = command.stringValueOfParameterNamed(JournalEntryJsonInputParams.CURRENCY_CODE.getValue()); validateBusinessRulesForJournalEntries(journalEntryCommand); diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java index 517f20cff..3a880eab6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java @@ -50,7 +50,7 @@ import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.organisation.monetary.domain.MoneyHelper; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.organisation.provisioning.data.ProvisioningCriteriaData; import org.apache.fineract.organisation.provisioning.domain.ProvisioningCategory; import org.apache.fineract.organisation.provisioning.domain.ProvisioningCategoryRepository; @@ -72,7 +72,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements private final ProvisioningCriteriaReadPlatformService provisioningCriteriaReadPlatformService ; private final LoanProductRepository loanProductRepository; private final GLAccountRepository glAccountRepository; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final ProvisioningCategoryRepository provisioningCategoryRepository; private final PlatformSecurityContext platformSecurityContext; private final ProvisioningEntryRepository provisioningEntryRepository; @@ -85,7 +85,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements final ProvisioningEntriesReadPlatformService provisioningEntriesReadPlatformService, final ProvisioningCriteriaReadPlatformService provisioningCriteriaReadPlatformService, final LoanProductRepository loanProductRepository, final GLAccountRepository glAccountRepository, - final OfficeRepository officeRepository, final ProvisioningCategoryRepository provisioningCategoryRepository, + final OfficeRepositoryWrapper officeRepositoryWrapper, final ProvisioningCategoryRepository provisioningCategoryRepository, final PlatformSecurityContext platformSecurityContext, final ProvisioningEntryRepository provisioningEntryRepository, final JournalEntryWritePlatformService journalEntryWritePlatformService, final ProvisioningEntriesDefinitionJsonDeserializer fromApiJsonDeserializer, final FromJsonHelper fromApiJsonHelper) { @@ -93,7 +93,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements this.provisioningCriteriaReadPlatformService = provisioningCriteriaReadPlatformService ; this.loanProductRepository = loanProductRepository; this.glAccountRepository = glAccountRepository; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.provisioningCategoryRepository = provisioningCategoryRepository; this.platformSecurityContext = platformSecurityContext; this.provisioningEntryRepository = provisioningEntryRepository; @@ -221,7 +221,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements Map provisioningEntries = new HashMap<>(); for (LoanProductProvisioningEntryData data : entries) { LoanProduct loanProduct = this.loanProductRepository.findOne(data.getProductId()); - Office office = this.officeRepository.findOne(data.getOfficeId()); + Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(data.getOfficeId()); ProvisioningCategory provisioningCategory = provisioningCategoryRepository.findOne(data.getCategoryId()); GLAccount liabilityAccount = glAccountRepository.findOne(data.getLiablityAccount()); GLAccount expenseAccount = glAccountRepository.findOne(data.getExpenseAccount()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java index e81b464fb..f934541fe 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java @@ -47,8 +47,7 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -64,17 +63,17 @@ public class AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco private final AccountingRuleRepositoryWrapper accountingRuleRepositoryWrapper; private final AccountingRuleRepository accountingRuleRepository; private final GLAccountRepositoryWrapper accountRepositoryWrapper; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final AccountingRuleCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final CodeValueRepository codeValueRepository; @Autowired public AccountingRuleWritePlatformServiceJpaRepositoryImpl(final AccountingRuleRepositoryWrapper accountingRuleRepositoryWrapper, - final GLAccountRepositoryWrapper accountRepositoryWrapper, final OfficeRepository officeRepository, + final GLAccountRepositoryWrapper accountRepositoryWrapper, final OfficeRepositoryWrapper officeRepositoryWrapper, final AccountingRuleRepository ruleRepository, final AccountingRuleCommandFromApiJsonDeserializer fromApiJsonDeserializer, final CodeValueRepository codeValueRepository) { this.accountRepositoryWrapper = accountRepositoryWrapper; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.accountingRuleRepository = ruleRepository; this.accountingRuleRepositoryWrapper = accountingRuleRepositoryWrapper; this.fromApiJsonDeserializer = fromApiJsonDeserializer; @@ -107,8 +106,7 @@ public class AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco final Long officeId = command.longValueOfParameterNamed(GLClosureJsonInputParams.OFFICE_ID.getValue()); Office office = null; if (officeId != null) { - office = this.officeRepository.findOne(officeId); - if (office == null) { throw new OfficeNotFoundException(officeId); } + office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); } final AccountingRule accountingRule = assembleAccountingRuleAndTags(office, command); @@ -268,8 +266,7 @@ public class AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco } if (officeId != null && changesOnly.containsKey(AccountingRuleJsonInputParams.OFFICE_ID.getValue())) { - final Office userOffice = this.officeRepository.findOne(officeId); - if (userOffice == null) { throw new OfficeNotFoundException(officeId); } + final Office userOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); accountingRule.setOffice(userOffice); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java index aa87e7c73..d3bab53f2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java @@ -18,44 +18,45 @@ */ package org.apache.fineract.infrastructure.hooks.processor; -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; +import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.apiKeyName; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import org.apache.fineract.infrastructure.hooks.domain.Hook; import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration; import org.apache.fineract.infrastructure.hooks.domain.HookConfigurationRepository; import org.apache.fineract.infrastructure.hooks.processor.data.SmsProviderData; import org.apache.fineract.portfolio.client.domain.Client; -import org.apache.fineract.portfolio.client.domain.ClientRepository; +import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.template.service.TemplateMergeService; import org.apache.fineract.useradministration.domain.AppUser; import org.codehaus.jackson.map.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + import retrofit.Callback; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.apiKeyName; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; @Service public class TwilioHookProcessor implements HookProcessor { private final HookConfigurationRepository hookConfigurationRepository; private final TemplateMergeService templateMergeService; - private final ClientRepository clientRepository; + private final ClientRepositoryWrapper clientRepositoryWrapper; @Autowired public TwilioHookProcessor( final HookConfigurationRepository hookConfigurationRepository, final TemplateMergeService templateMergeService, - final ClientRepository clientRepository) { + final ClientRepositoryWrapper clientRepositoryWrapper) { this.hookConfigurationRepository = hookConfigurationRepository; this.templateMergeService = templateMergeService; - this.clientRepository = clientRepository; + this.clientRepositoryWrapper = clientRepositoryWrapper; } @Override @@ -127,7 +128,7 @@ public class TwilioHookProcessor implements HookProcessor { if (map.containsKey("clientId")) { final Long clientId = new Long(Integer.toString((int) map .get("clientId"))); - final Client client = this.clientRepository.findOne(clientId); + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId); final String mobileNo = client.mobileNo(); if (mobileNo != null && !mobileNo.isEmpty()) { this.templateMergeService.setAuthToken(authToken); diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java index d159f3ae0..04cf4dfd5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java @@ -36,8 +36,7 @@ import org.apache.fineract.organisation.holiday.domain.Holiday; import org.apache.fineract.organisation.holiday.domain.HolidayRepositoryWrapper; import org.apache.fineract.organisation.holiday.exception.HolidayDateException; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.organisation.workingdays.domain.WorkingDays; import org.apache.fineract.organisation.workingdays.domain.WorkingDaysRepositoryWrapper; import org.apache.fineract.organisation.workingdays.service.WorkingDaysUtil; @@ -61,18 +60,18 @@ public class HolidayWritePlatformServiceJpaRepositoryImpl implements HolidayWrit private final HolidayRepositoryWrapper holidayRepository; private final WorkingDaysRepositoryWrapper daysRepositoryWrapper; private final PlatformSecurityContext context; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final FromJsonHelper fromApiJsonHelper; @Autowired public HolidayWritePlatformServiceJpaRepositoryImpl(final HolidayDataValidator fromApiJsonDeserializer, final HolidayRepositoryWrapper holidayRepository, final PlatformSecurityContext context, - final OfficeRepository officeRepository, final FromJsonHelper fromApiJsonHelper, + final OfficeRepositoryWrapper officeRepositoryWrapper, final FromJsonHelper fromApiJsonHelper, final WorkingDaysRepositoryWrapper daysRepositoryWrapper) { this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.holidayRepository = holidayRepository; this.context = context; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.fromApiJsonHelper = fromApiJsonHelper; this.daysRepositoryWrapper = daysRepositoryWrapper; } @@ -162,8 +161,7 @@ public class HolidayWritePlatformServiceJpaRepositoryImpl implements HolidayWrit for (int i = 0; i < array.size(); i++) { final JsonObject officeElement = array.get(i).getAsJsonObject(); final Long officeId = this.fromApiJsonHelper.extractLongNamed(HolidayApiConstants.officeIdParamName, officeElement); - final Office office = this.officeRepository.findOne(officeId); - if (office == null) { throw new OfficeNotFoundException(officeId); } + final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); offices.add(office); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java index 55a4c657d..dadf6d74c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java @@ -47,7 +47,7 @@ import org.springframework.data.jpa.domain.AbstractPersistable; @UniqueConstraint(columnNames = { "external_id" }, name = "externalid_org") }) public class Office extends AbstractPersistable { - @OneToMany(fetch = FetchType.EAGER) + @OneToMany(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") private final List children = new LinkedList<>(); @@ -238,4 +238,8 @@ public class Office extends AbstractPersistable { return match; } + + public void loadLazyCollections() { + this.children.size() ; + } } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OfficeRepositoryWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OfficeRepositoryWrapper.java index 36fef0952..77dc82c88 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OfficeRepositoryWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OfficeRepositoryWrapper.java @@ -21,6 +21,7 @@ package org.apache.fineract.organisation.office.domain; import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** *

@@ -44,12 +45,20 @@ public class OfficeRepositoryWrapper { return office; } - public void save(final Office entity) { - this.repository.save(entity); + @Transactional(readOnly=true) + public Office findOfficeHierarchy(final Long id) { + final Office office = this.repository.findOne(id); + if (office == null) { throw new OfficeNotFoundException(id); } + office.loadLazyCollections(); + return office ; + + } + public Office save(final Office entity) { + return this.repository.save(entity); } - public void saveAndFlush(final Office entity) { - this.repository.saveAndFlush(entity); + public Office saveAndFlush(final Office entity) { + return this.repository.saveAndFlush(entity); } public void delete(final Office entity) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java index 13a8744cc..1377e473b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java @@ -31,10 +31,9 @@ import org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepos import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.organisation.office.domain.OfficeTransaction; import org.apache.fineract.organisation.office.domain.OfficeTransactionRepository; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; import org.apache.fineract.organisation.office.serialization.OfficeCommandFromApiJsonDeserializer; import org.apache.fineract.organisation.office.serialization.OfficeTransactionCommandFromApiJsonDeserializer; import org.apache.fineract.useradministration.domain.AppUser; @@ -55,7 +54,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP private final PlatformSecurityContext context; private final OfficeCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final OfficeTransactionCommandFromApiJsonDeserializer moneyTransferCommandFromApiJsonDeserializer; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final OfficeTransactionRepository officeTransactionRepository; private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository; @@ -63,12 +62,12 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP public OfficeWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final OfficeCommandFromApiJsonDeserializer fromApiJsonDeserializer, final OfficeTransactionCommandFromApiJsonDeserializer moneyTransferCommandFromApiJsonDeserializer, - final OfficeRepository officeRepository, final OfficeTransactionRepository officeMonetaryTransferRepository, + final OfficeRepositoryWrapper officeRepositoryWrapper, final OfficeTransactionRepository officeMonetaryTransferRepository, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository) { this.context = context; this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.moneyTransferCommandFromApiJsonDeserializer = moneyTransferCommandFromApiJsonDeserializer; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.officeTransactionRepository = officeMonetaryTransferRepository; this.applicationCurrencyRepository = applicationCurrencyRepository; } @@ -94,11 +93,11 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP final Office office = Office.fromJson(parent, command); // pre save to generate id for use in office hierarchy - this.officeRepository.save(office); + this.officeRepositoryWrapper.save(office); office.generateHierarchy(); - this.officeRepository.save(office); + this.officeRepositoryWrapper.save(office); return new CommandProcessingResultBuilder() // .withCommandId(command.commandId()) // @@ -139,7 +138,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP } if (!changes.isEmpty()) { - this.officeRepository.saveAndFlush(office); + this.officeRepositoryWrapper.saveAndFlush(office); } return new CommandProcessingResultBuilder() // @@ -166,18 +165,16 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP Office fromOffice = null; final Long fromOfficeId = command.longValueOfParameterNamed("fromOfficeId"); if (fromOfficeId != null) { - fromOffice = this.officeRepository.findOne(fromOfficeId); + fromOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(fromOfficeId); officeId = fromOffice.getId(); } Office toOffice = null; final Long toOfficeId = command.longValueOfParameterNamed("toOfficeId"); if (toOfficeId != null) { - toOffice = this.officeRepository.findOne(toOfficeId); + toOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(toOfficeId); officeId = toOffice.getId(); } - if (fromOffice == null && toOffice == null) { throw new OfficeNotFoundException(toOfficeId); } - final String currencyCode = command.stringValueOfParameterNamed("currencyCode"); final ApplicationCurrency appCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currencyCode); @@ -239,16 +236,13 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP private Office validateUserPriviledgeOnOfficeAndRetrieve(final AppUser currentUser, final Long officeId) { final Long userOfficeId = currentUser.getOffice().getId(); - final Office userOffice = this.officeRepository.findOne(userOfficeId); - if (userOffice == null) { throw new OfficeNotFoundException(userOfficeId); } - + final Office userOffice = this.officeRepositoryWrapper.findOfficeHierarchy(userOfficeId); if (userOffice.doesNotHaveAnOfficeInHierarchyWithId(officeId)) { throw new NoAuthorizationException( "User does not have sufficient priviledges to act on the provided office."); } Office officeToReturn = userOffice; if (!userOffice.identifiedBy(officeId)) { - officeToReturn = this.officeRepository.findOne(officeId); - if (officeToReturn == null) { throw new OfficeNotFoundException(officeId); } + officeToReturn = this.officeRepositoryWrapper.findOfficeHierarchy(officeId); } return officeToReturn; diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java index a8a6e4f62..b10dd12df 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java @@ -26,8 +26,7 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.StaffRepository; import org.apache.fineract.organisation.staff.exception.StaffNotFoundException; @@ -46,14 +45,14 @@ public class StaffWritePlatformServiceJpaRepositoryImpl implements StaffWritePla private final StaffCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final StaffRepository staffRepository; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; @Autowired public StaffWritePlatformServiceJpaRepositoryImpl(final StaffCommandFromApiJsonDeserializer fromApiJsonDeserializer, - final StaffRepository staffRepository, final OfficeRepository officeRepository) { + final StaffRepository staffRepository, final OfficeRepositoryWrapper officeRepositoryWrapper) { this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.staffRepository = staffRepository; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; } @Transactional @@ -65,9 +64,7 @@ public class StaffWritePlatformServiceJpaRepositoryImpl implements StaffWritePla final Long officeId = command.longValueOfParameterNamed("officeId"); - final Office staffOffice = this.officeRepository.findOne(officeId); - if (staffOffice == null) { throw new OfficeNotFoundException(officeId); } - + final Office staffOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); final Staff staff = Staff.fromJson(staffOffice, command); this.staffRepository.save(staff); @@ -96,9 +93,7 @@ public class StaffWritePlatformServiceJpaRepositoryImpl implements StaffWritePla if (changesOnly.containsKey("officeId")) { final Long officeId = (Long) changesOnly.get("officeId"); - final Office newOffice = this.officeRepository.findOne(officeId); - if (newOffice == null) { throw new OfficeNotFoundException(officeId); } - + final Office newOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); staffForUpdate.changeOffice(newOffice); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java index bff951cbb..bbaad9064 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java @@ -35,8 +35,7 @@ import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityEx import org.apache.fineract.infrastructure.security.exception.NoAuthorizationException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.StaffRepository; import org.apache.fineract.organisation.staff.exception.StaffNotFoundException; @@ -70,7 +69,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer private final TellerCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final TellerRepository tellerRepository; private final TellerRepositoryWrapper tellerRepositoryWrapper; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final StaffRepository staffRepository; private final CashierRepository cashierRepository; private final CashierTransactionRepository cashierTxnRepository; @@ -80,7 +79,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer @Autowired public TellerWritePlatformServiceJpaImpl(final PlatformSecurityContext context, final TellerCommandFromApiJsonDeserializer fromApiJsonDeserializer, final TellerRepository tellerRepository, - final TellerRepositoryWrapper tellerRepositoryWrapper, final OfficeRepository officeRepository, + final TellerRepositoryWrapper tellerRepositoryWrapper, final OfficeRepositoryWrapper officeRepositoryWrapper, final StaffRepository staffRepository, CashierRepository cashierRepository, CashierTransactionRepository cashierTxnRepository, JournalEntryRepository glJournalEntryRepository, FinancialActivityAccountRepositoryWrapper financialActivityAccountRepositoryWrapper) { @@ -88,7 +87,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.tellerRepository = tellerRepository; this.tellerRepositoryWrapper = tellerRepositoryWrapper; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.staffRepository = staffRepository; this.cashierRepository = cashierRepository; this.cashierTxnRepository = cashierTxnRepository; @@ -108,9 +107,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer // final Office parent = // validateUserPriviledgeOnOfficeAndRetrieve(currentUser, officeId); - final Office tellerOffice = this.officeRepository.findOne(officeId); - if (tellerOffice == null) { throw new OfficeNotFoundException(officeId); } - + final Office tellerOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); final Teller teller = Teller.fromJson(tellerOffice, command); // pre save to generate id for use in office hierarchy @@ -133,9 +130,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer try { final Long officeId = command.longValueOfParameterNamed("officeId"); - final Office tellerOffice = this.officeRepository.findOne(officeId); - if (tellerOffice == null) { throw new OfficeNotFoundException(officeId); } - + final Office tellerOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); final AppUser currentUser = this.context.authenticatedUser(); this.fromApiJsonDeserializer.validateForCreateAndUpdateTeller(command.json()); @@ -167,9 +162,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer private Teller validateUserPriviledgeOnTellerAndRetrieve(final AppUser currentUser, final Long tellerId) { final Long userOfficeId = currentUser.getOffice().getId(); - final Office userOffice = this.officeRepository.findOne(userOfficeId); - if (userOffice == null) { throw new OfficeNotFoundException(userOfficeId); } - + final Office userOffice = this.officeRepositoryWrapper.findOfficeHierarchy(userOfficeId); final Teller tellerToReturn = this.tellerRepository.findOne(tellerId); if (tellerToReturn != null) { final Long tellerOfficeId = tellerToReturn.officeId(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetailAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetailAssembler.java index f9f4f20e0..4fb18cba7 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetailAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetailAssembler.java @@ -31,7 +31,7 @@ import java.util.Locale; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.Loan; @@ -47,17 +47,17 @@ import com.google.gson.JsonElement; public class AccountTransferDetailAssembler { private final ClientRepositoryWrapper clientRepository; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final SavingsAccountAssembler savingsAccountAssembler; private final FromJsonHelper fromApiJsonHelper; private final LoanAssembler loanAccountAssembler; @Autowired - public AccountTransferDetailAssembler(final ClientRepositoryWrapper clientRepository, final OfficeRepository officeRepository, + public AccountTransferDetailAssembler(final ClientRepositoryWrapper clientRepository, final OfficeRepositoryWrapper officeRepositoryWrapper, final SavingsAccountAssembler savingsAccountAssembler, final FromJsonHelper fromApiJsonHelper, final LoanAssembler loanAccountAssembler) { this.clientRepository = clientRepository; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.savingsAccountAssembler = savingsAccountAssembler; this.fromApiJsonHelper = fromApiJsonHelper; this.loanAccountAssembler = loanAccountAssembler; @@ -104,13 +104,13 @@ public class AccountTransferDetailAssembler { final JsonElement element = command.parsedJson(); final Long fromOfficeId = this.fromApiJsonHelper.extractLongNamed(fromOfficeIdParamName, element); - final Office fromOffice = this.officeRepository.findOne(fromOfficeId); + final Office fromOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(fromOfficeId); final Long fromClientId = this.fromApiJsonHelper.extractLongNamed(fromClientIdParamName, element); final Client fromClient = this.clientRepository.findOneWithNotFoundDetection(fromClientId); final Long toOfficeId = this.fromApiJsonHelper.extractLongNamed(toOfficeIdParamName, element); - final Office toOffice = this.officeRepository.findOne(toOfficeId); + final Office toOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(toOfficeId); final Long toClientId = this.fromApiJsonHelper.extractLongNamed(toClientIdParamName, element); final Client toClient = this.clientRepository.findOneWithNotFoundDetection(toClientId); @@ -128,13 +128,13 @@ public class AccountTransferDetailAssembler { final JsonElement element = command.parsedJson(); final Long fromOfficeId = this.fromApiJsonHelper.extractLongNamed(fromOfficeIdParamName, element); - final Office fromOffice = this.officeRepository.findOne(fromOfficeId); + final Office fromOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(fromOfficeId); final Long fromClientId = this.fromApiJsonHelper.extractLongNamed(fromClientIdParamName, element); final Client fromClient = this.clientRepository.findOneWithNotFoundDetection(fromClientId); final Long toOfficeId = this.fromApiJsonHelper.extractLongNamed(toOfficeIdParamName, element); - final Office toOffice = this.officeRepository.findOne(toOfficeId); + final Office toOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(toOfficeId); final Long toClientId = this.fromApiJsonHelper.extractLongNamed(toClientIdParamName, element); final Client toClient = this.clientRepository.findOneWithNotFoundDetection(toClientId); @@ -152,13 +152,13 @@ public class AccountTransferDetailAssembler { final JsonElement element = command.parsedJson(); final Long fromOfficeId = this.fromApiJsonHelper.extractLongNamed(fromOfficeIdParamName, element); - final Office fromOffice = this.officeRepository.findOne(fromOfficeId); + final Office fromOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(fromOfficeId); final Long fromClientId = this.fromApiJsonHelper.extractLongNamed(fromClientIdParamName, element); final Client fromClient = this.clientRepository.findOneWithNotFoundDetection(fromClientId); final Long toOfficeId = this.fromApiJsonHelper.extractLongNamed(toOfficeIdParamName, element); - final Office toOffice = this.officeRepository.findOne(toOfficeId); + final Office toOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(toOfficeId); final Long toClientId = this.fromApiJsonHelper.extractLongNamed(toClientIdParamName, element); final Client toClient = this.clientRepository.findOneWithNotFoundDetection(toClientId); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java index 847b20d3b..c15b95012 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java @@ -33,7 +33,7 @@ import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.client.domain.ClientAddress; import org.apache.fineract.portfolio.client.domain.ClientAddressRepository; import org.apache.fineract.portfolio.client.domain.ClientAddressRepositoryWrapper; -import org.apache.fineract.portfolio.client.domain.ClientRepository; +import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -45,7 +45,7 @@ public class AddressWritePlatformServiceImpl implements AddressWritePlatformServ private final PlatformSecurityContext context; private final CodeValueRepository codeValueRepository; private final ClientAddressRepository clientAddressRepository; - private final ClientRepository clientRepository; + private final ClientRepositoryWrapper clientRepositoryWrapper; private final AddressRepository addressRepository; private final ClientAddressRepositoryWrapper clientAddressRepositoryWrapper; private final AddressCommandFromApiJsonDeserializer fromApiJsonDeserializer; @@ -53,13 +53,13 @@ public class AddressWritePlatformServiceImpl implements AddressWritePlatformServ @Autowired public AddressWritePlatformServiceImpl(final PlatformSecurityContext context, final CodeValueRepository codeValueRepository, final ClientAddressRepository clientAddressRepository, - final ClientRepository clientRepository, final AddressRepository addressRepository, + final ClientRepositoryWrapper clientRepositoryWrapper, final AddressRepository addressRepository, final ClientAddressRepositoryWrapper clientAddressRepositoryWrapper, final AddressCommandFromApiJsonDeserializer fromApiJsonDeserializer) { this.context = context; this.codeValueRepository = codeValueRepository; this.clientAddressRepository = clientAddressRepository; - this.clientRepository = clientRepository; + this.clientRepositoryWrapper = clientRepositoryWrapper; this.addressRepository = addressRepository; this.clientAddressRepositoryWrapper = clientAddressRepositoryWrapper; this.fromApiJsonDeserializer = fromApiJsonDeserializer; @@ -96,7 +96,7 @@ public class AddressWritePlatformServiceImpl implements AddressWritePlatformServ final Long addressid = add.getId(); final Address addobj = this.addressRepository.getOne(addressid); - final Client client = this.clientRepository.getOne(clientId); + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId); final boolean isActive = command.booleanPrimitiveValueOfParameterNamed("isActive"); final ClientAddress clientAddressobj = ClientAddress.fromJson(isActive, client, addobj, addressTypeIdObj); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java index be01e2b60..1851483d0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java @@ -49,7 +49,7 @@ import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.portfolio.group.domain.Group; import org.apache.fineract.portfolio.group.domain.GroupRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.service.LoanWritePlatformService; import org.joda.time.LocalDate; @@ -69,7 +69,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr private final LoanWritePlatformService loanWritePlatformService; private final ConfigurationDomainService configurationDomainService; private final GroupRepositoryWrapper groupRepository; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; private final ClientRepositoryWrapper clientRepository; @Autowired @@ -78,7 +78,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr final CalendarCommandFromApiJsonDeserializer fromApiJsonDeserializer, final CalendarInstanceRepository calendarInstanceRepository, final LoanWritePlatformService loanWritePlatformService, final ConfigurationDomainService configurationDomainService, final GroupRepositoryWrapper groupRepository, - final LoanRepository loanRepository, final ClientRepositoryWrapper clientRepository) { + final LoanRepositoryWrapper loanRepositoryWrapper, final ClientRepositoryWrapper clientRepository) { this.calendarRepository = calendarRepository; this.calendarHistoryRepository = calendarHistoryRepository; this.fromApiJsonDeserializer = fromApiJsonDeserializer; @@ -86,7 +86,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr this.loanWritePlatformService = loanWritePlatformService; this.configurationDomainService = configurationDomainService; this.groupRepository = groupRepository; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; this.clientRepository = clientRepository; } @@ -104,7 +104,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr entityType = centerOrGroup.isCenter() ? CalendarEntityType.CENTERS : CalendarEntityType.GROUPS; entityId = command.getGroupId(); } else if (command.getLoanId() != null) { - final Loan loan = this.loanRepository.findOne(command.getLoanId()); + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(command.getLoanId(), true); entityActivationDate = (loan.getApprovedOnDate() == null) ? loan.getSubmittedOnDate() : loan.getApprovedOnDate(); entityType = CalendarEntityType.LOANS; entityId = command.getLoanId(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java index 82b994b34..a857b4bff 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java @@ -54,8 +54,6 @@ import org.apache.fineract.organisation.office.domain.Office; import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.portfolio.client.api.ClientApiConstants; import org.apache.fineract.portfolio.group.domain.Group; -import org.apache.fineract.portfolio.savings.domain.SavingsAccount; -import org.apache.fineract.portfolio.savings.domain.SavingsProduct; import org.apache.fineract.useradministration.domain.AppUser; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormatter; @@ -132,7 +130,7 @@ public final class Client extends AbstractPersistable { @JoinColumn(name = "staff_id") private Staff staff; - @ManyToMany(fetch=FetchType.EAGER) + @ManyToMany(fetch=FetchType.LAZY) @JoinTable(name = "m_group_client", joinColumns = @JoinColumn(name = "client_id"), inverseJoinColumns = @JoinColumn(name = "group_id")) private Set groups; @@ -203,13 +201,11 @@ public final class Client extends AbstractPersistable { @JoinColumn(name = "activatedon_userid", nullable = true) private AppUser activatedBy; - @ManyToOne - @JoinColumn(name = "default_savings_product", nullable = true) - private SavingsProduct savingsProduct; - - @ManyToOne - @JoinColumn(name = "default_savings_account", nullable = true) - private SavingsAccount savingsAccount; + @Column(name = "default_savings_product", nullable = true) + private Long savingsProductId; + + @Column(name = "default_savings_account", nullable = true) + private Long savingsAccountId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "client_type_cv_id", nullable = true) @@ -222,16 +218,16 @@ public final class Client extends AbstractPersistable { @Column(name = "legal_form_enum", nullable = true) private Integer legalForm; - @Column(name = "reopened_on_date", nullable = true) - @Temporal(TemporalType.DATE) - private Date reopenedDate; + @Column(name = "reopened_on_date", nullable = true) + @Temporal(TemporalType.DATE) + private Date reopenedDate; - @ManyToOne(optional = true, fetch=FetchType.LAZY) - @JoinColumn(name = "reopened_by_userid", nullable = true) - private AppUser reopenedBy; + @ManyToOne(optional = true, fetch = FetchType.LAZY) + @JoinColumn(name = "reopened_by_userid", nullable = true) + private AppUser reopenedBy; public static Client createNew(final AppUser currentUser, final Office clientOffice, final Group clientParentGroup, final Staff staff, - final SavingsProduct savingsProduct, final CodeValue gender, final CodeValue clientType, final CodeValue clientClassification, + final Long savingsProductId, final CodeValue gender, final CodeValue clientType, final CodeValue clientClassification, final Integer legalForm, final JsonCommand command) { final String accountNo = command.stringValueOfParameterNamed(ClientApiConstants.accountNoParamName); @@ -266,9 +262,9 @@ public final class Client extends AbstractPersistable { if (command.hasParameter(ClientApiConstants.submittedOnDateParamName)) { submittedOnDate = command.localDateValueOfParameterNamed(ClientApiConstants.submittedOnDateParamName); } - final SavingsAccount account = null; + final Long savingsAccountId = null; return new Client(currentUser, status, clientOffice, clientParentGroup, accountNo, firstname, middlename, lastname, fullname, - activationDate, officeJoiningDate, externalId, mobileNo, staff, submittedOnDate, savingsProduct, account, dataOfBirth, + activationDate, officeJoiningDate, externalId, mobileNo, staff, submittedOnDate, savingsProductId, savingsAccountId, dataOfBirth, gender, clientType, clientClassification, legalForm); } @@ -279,7 +275,7 @@ public final class Client extends AbstractPersistable { private Client(final AppUser currentUser, final ClientStatus status, final Office office, final Group clientParentGroup, final String accountNo, final String firstname, final String middlename, final String lastname, final String fullname, final LocalDate activationDate, final LocalDate officeJoiningDate, final String externalId, final String mobileNo, - final Staff staff, final LocalDate submittedOnDate, final SavingsProduct savingsProduct, final SavingsAccount savingsAccount, + final Staff staff, final LocalDate submittedOnDate, final Long savingsProductId, final Long savingsAccountId, final LocalDate dateOfBirth, final CodeValue gender, final CodeValue clientType, final CodeValue clientClassification, final Integer legalForm) { if (StringUtils.isBlank(accountNo)) { @@ -343,8 +339,8 @@ public final class Client extends AbstractPersistable { } this.staff = staff; - this.savingsProduct = savingsProduct; - this.savingsAccount = savingsAccount; + this.savingsProductId = savingsProductId; + this.savingsAccountId = savingsAccountId; if (gender != null) { this.gender = gender; @@ -863,32 +859,24 @@ public final class Client extends AbstractPersistable { return false; } - private Long savingsProductId() { - Long savingsProductId = null; - if (this.savingsProduct != null) { - savingsProductId = this.savingsProduct.getId(); - } - return savingsProductId; + public Long savingsProductId() { + return this.savingsProductId; } - public SavingsProduct SavingsProduct() { - return this.savingsProduct; - } - - public void updateSavingsProduct(SavingsProduct savingsProduct) { - this.savingsProduct = savingsProduct; + public void updateSavingsProduct(final Long savingsProductId) { + this.savingsProductId = savingsProductId; } public AppUser activatedBy() { return this.activatedBy; } - public SavingsAccount savingsAccount() { - return this.savingsAccount; + public Long savingsAccountId() { + return this.savingsAccountId; } - public void updateSavingsAccount(SavingsAccount savingsAccount) { - this.savingsAccount = savingsAccount; + public void updateSavingsAccount(Long savingsAccountId) { + this.savingsAccountId = savingsAccountId; } public Long genderId() { @@ -996,20 +984,24 @@ public final class Client extends AbstractPersistable { } - public void reOpened(AppUser currentUser, Date reopenedDate) { - this.reopenedDate = reopenedDate; - this.reopenedBy = currentUser; - this.updatedBy = currentUser; - this.updatedOnDate = reopenedDate; - this.status = ClientStatus.PENDING.getValue(); + public void reOpened(AppUser currentUser, Date reopenedDate) { + this.reopenedDate = reopenedDate; + this.reopenedBy = currentUser; + this.updatedBy = currentUser; + this.updatedOnDate = reopenedDate; + this.status = ClientStatus.PENDING.getValue(); - } + } - public Integer getLegalForm() { - return legalForm; - } + public Integer getLegalForm() { + return legalForm; + } - public void setLegalForm(Integer legalForm) { - this.legalForm = legalForm; - } + public void setLegalForm(Integer legalForm) { + this.legalForm = legalForm; + } + + public void loadLazyCollections() { + this.groups.size() ; + } } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java index 1dbe0b903..a9624b5d0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java @@ -25,7 +25,6 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import org.apache.fineract.infrastructure.codes.domain.CodeValue; -import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.portfolio.address.domain.Address; import org.springframework.data.jpa.domain.AbstractPersistable; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepository.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepository.java index c1f9c276f..e718265e8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepository.java @@ -21,6 +21,6 @@ package org.apache.fineract.portfolio.client.domain; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; -public interface ClientRepository extends JpaRepository, JpaSpecificationExecutor { +abstract interface ClientRepository extends JpaRepository, JpaSpecificationExecutor { // no added behaviour } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepositoryWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepositoryWrapper.java index 27840ee57..bdfccb99e 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepositoryWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepositoryWrapper.java @@ -18,11 +18,15 @@ */ package org.apache.fineract.portfolio.client.domain; +import java.util.Collection; +import java.util.List; + import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.client.exception.ClientNotActiveException; import org.apache.fineract.portfolio.client.exception.ClientNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** *

@@ -43,11 +47,22 @@ public class ClientRepositoryWrapper { } public Client findOneWithNotFoundDetection(final Long id) { - final Client client = this.repository.findOne(id); - if (client == null) { throw new ClientNotFoundException(id); } - return client; + return this.findOneWithNotFoundDetection(id, false) ; } + @Transactional(readOnly=true) + public Client findOneWithNotFoundDetection(final Long clientId, final boolean loadLazyCollections) { + final Client client = this.repository.findOne(clientId); + if (client == null) { throw new ClientNotFoundException(clientId); } + if(loadLazyCollections) { + client.loadLazyCollections(); + } + return client; + } + + public List findAll(final Collection clientIds) { + return this.repository.findAll(clientIds) ; + } public void save(final Client client) { this.repository.save(client); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java index 5781082eb..3e9c1c746 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java @@ -42,8 +42,7 @@ import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityEx import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper; import org.apache.fineract.portfolio.address.service.AddressWritePlatformService; @@ -66,15 +65,14 @@ import org.apache.fineract.portfolio.group.domain.GroupRepository; import org.apache.fineract.portfolio.group.exception.GroupMemberCountNotInPermissibleRangeException; import org.apache.fineract.portfolio.group.exception.GroupNotFoundException; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.note.domain.Note; import org.apache.fineract.portfolio.note.domain.NoteRepository; import org.apache.fineract.portfolio.savings.data.SavingsAccountDataDTO; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; +import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepositoryWrapper; import org.apache.fineract.portfolio.savings.domain.SavingsProduct; import org.apache.fineract.portfolio.savings.domain.SavingsProductRepository; -import org.apache.fineract.portfolio.savings.exception.SavingsAccountNotFoundException; import org.apache.fineract.portfolio.savings.exception.SavingsProductNotFoundException; import org.apache.fineract.portfolio.savings.service.SavingsApplicationProcessWritePlatformService; import org.apache.fineract.useradministration.domain.AppUser; @@ -98,15 +96,15 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP private final PlatformSecurityContext context; private final ClientRepositoryWrapper clientRepository; private final ClientNonPersonRepositoryWrapper clientNonPersonRepository; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final NoteRepository noteRepository; private final GroupRepository groupRepository; private final ClientDataValidator fromApiJsonDeserializer; private final AccountNumberGenerator accountNumberGenerator; private final StaffRepositoryWrapper staffRepository; private final CodeValueRepositoryWrapper codeValueRepository; - private final LoanRepository loanRepository; - private final SavingsAccountRepository savingsRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; + private final SavingsAccountRepositoryWrapper savingsRepositoryWrapper; private final SavingsProductRepository savingsProductRepository; private final SavingsApplicationProcessWritePlatformService savingsApplicationProcessWritePlatformService; private final CommandProcessingService commandProcessingService; @@ -118,11 +116,11 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP @Autowired public ClientWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, - final ClientRepositoryWrapper clientRepository, final ClientNonPersonRepositoryWrapper clientNonPersonRepository, final OfficeRepository officeRepository, final NoteRepository noteRepository, + final ClientRepositoryWrapper clientRepository, final ClientNonPersonRepositoryWrapper clientNonPersonRepository, final OfficeRepositoryWrapper officeRepositoryWrapper, final NoteRepository noteRepository, final ClientDataValidator fromApiJsonDeserializer, final AccountNumberGenerator accountNumberGenerator, final GroupRepository groupRepository, final StaffRepositoryWrapper staffRepository, - final CodeValueRepositoryWrapper codeValueRepository, final LoanRepository loanRepository, - final SavingsAccountRepository savingsRepository, final SavingsProductRepository savingsProductRepository, + final CodeValueRepositoryWrapper codeValueRepository, final LoanRepositoryWrapper loanRepositoryWrapper, + final SavingsAccountRepositoryWrapper savingsRepositoryWrapper, final SavingsProductRepository savingsProductRepository, final SavingsApplicationProcessWritePlatformService savingsApplicationProcessWritePlatformService, final CommandProcessingService commandProcessingService, final ConfigurationDomainService configurationDomainService, final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository, final FromJsonHelper fromApiJsonHelper, @@ -131,15 +129,15 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP this.context = context; this.clientRepository = clientRepository; this.clientNonPersonRepository = clientNonPersonRepository; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.noteRepository = noteRepository; this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.accountNumberGenerator = accountNumberGenerator; this.groupRepository = groupRepository; this.staffRepository = staffRepository; this.codeValueRepository = codeValueRepository; - this.loanRepository = loanRepository; - this.savingsRepository = savingsRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; + this.savingsRepositoryWrapper = savingsRepositoryWrapper; this.savingsProductRepository = savingsProductRepository; this.savingsApplicationProcessWritePlatformService = savingsApplicationProcessWritePlatformService; this.commandProcessingService = commandProcessingService; @@ -217,8 +215,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP final Long officeId = command.longValueOfParameterNamed(ClientApiConstants.officeIdParamName); - final Office clientOffice = this.officeRepository.findOne(officeId); - if (clientOffice == null) { throw new OfficeNotFoundException(officeId); } + final Office clientOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); final Long groupId = command.longValueOfParameterNamed(ClientApiConstants.groupIdParamName); @@ -254,12 +251,11 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP ClientApiConstants.CLIENT_CLASSIFICATION, clientClassificationId); } - SavingsProduct savingsProduct = null; + final Long savingsProductId = command.longValueOfParameterNamed(ClientApiConstants.savingsProductIdParamName); if (savingsProductId != null) { - savingsProduct = this.savingsProductRepository.findOne(savingsProductId); + SavingsProduct savingsProduct = this.savingsProductRepository.findOne(savingsProductId); if (savingsProduct == null) { throw new SavingsProductNotFoundException(savingsProductId); } - } final Integer legalFormParamValue = command.integerValueOfParameterNamed(ClientApiConstants.legalFormIdParamName); @@ -275,7 +271,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP } } - final Client newClient = Client.createNew(currentUser, clientOffice, clientParentGroup, staff, savingsProduct, gender, + final Client newClient = Client.createNew(currentUser, clientOffice, clientParentGroup, staff, savingsProductId, gender, clientType, clientClassification, legalFormValue, command); boolean rollbackTransaction = false; if (newClient.isActive()) { @@ -300,16 +296,13 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP } - if(isEntity) - extractAndCreateClientNonPerson(newClient, command); + if(isEntity) { + extractAndCreateClientNonPerson(newClient, command); + } - final long clientId = newClient.getId(); - - if (isAddressEnabled) { - - this.addressWritePlatformService.addNewClientAddress(newClient, command); - - } + if (isAddressEnabled) { + this.addressWritePlatformService.addNewClientAddress(newClient, command); + } return new CommandProcessingResultBuilder() // @@ -408,7 +401,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP savingsProduct = this.savingsProductRepository.findOne(savingsProductId); if (savingsProduct == null) { throw new SavingsProductNotFoundException(savingsProductId); } } - clientForUpdate.updateSavingsProduct(savingsProduct); + clientForUpdate.updateSavingsProduct(savingsProductId); } if (changes.containsKey(ClientApiConstants.genderIdParamName)) { @@ -518,7 +511,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP try { this.fromApiJsonDeserializer.validateActivation(command); - final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId); + final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId, true); validateParentGroupRulesBeforeClientActivation(client); final Locale locale = command.extractLocale(); @@ -546,13 +539,13 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP private CommandProcessingResult openSavingsAccount(final Client client, final DateTimeFormatter fmt) { CommandProcessingResult commandProcessingResult = CommandProcessingResult.empty(); - if (client.isActive() && client.SavingsProduct() != null) { - SavingsAccountDataDTO savingsAccountDataDTO = new SavingsAccountDataDTO(client, null, client.SavingsProduct(), + if (client.isActive() && client.savingsProductId() != null) { + SavingsAccountDataDTO savingsAccountDataDTO = new SavingsAccountDataDTO(client, null, client.savingsProductId(), client.getActivationLocalDate(), client.activatedBy(), fmt); commandProcessingResult = this.savingsApplicationProcessWritePlatformService.createActiveApplication(savingsAccountDataDTO); if (commandProcessingResult.getSavingsId() != null) { - SavingsAccount savingsAccount = this.savingsRepository.findOne(commandProcessingResult.getSavingsId()); - client.updateSavingsAccount(savingsAccount); + this.savingsRepositoryWrapper.findOneWithNotFoundDetection(commandProcessingResult.getSavingsId()); + client.updateSavingsAccount(commandProcessingResult.getSavingsId()); client.updateSavingsProduct(null); } } @@ -660,9 +653,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP throw new InvalidClientStateTransitionException("close", "date.cannot.before.client.actvation.date", errorMessage, closureDate, client.getActivationLocalDate()); } - - final List clientLoans = this.loanRepository.findLoanByClientId(clientId); - + final List clientLoans = this.loanRepositoryWrapper.findLoanByClientId(clientId); for (final Loan loan : clientLoans) { final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.status().getValue()); if (loanStatus.isOpen() || loanStatus.isPendingApproval() || loanStatus.isAwaitingDisbursal()) { @@ -677,7 +668,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP throw new InvalidClientStateTransitionException("close", "loan.overpaid", errorMessage); } } - final List clientSavingAccounts = this.savingsRepository.findSavingAccountByClientId(clientId); + final List clientSavingAccounts = this.savingsRepositoryWrapper.findSavingAccountByClientId(clientId); for (final SavingsAccount saving : clientSavingAccounts) { if (saving.isActive() || saving.isSubmittedAndPendingApproval() || saving.isApproved()) { @@ -714,14 +705,13 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP SavingsAccount savingsAccount = null; final Long savingsId = command.longValueOfParameterNamed(ClientApiConstants.savingsAccountIdParamName); if (savingsId != null) { - savingsAccount = this.savingsRepository.findOne(savingsId); - if (savingsAccount == null) { throw new SavingsAccountNotFoundException(savingsId); } + savingsAccount = this.savingsRepositoryWrapper.findOneWithNotFoundDetection(savingsId); if (!savingsAccount.getClient().identifiedBy(clientId)) { String defaultUserMessage = "saving account must belongs to client"; throw new InvalidClientSavingProductException("saving.account", "must.belongs.to.client", defaultUserMessage, savingsId, clientForUpdate.getId()); } - clientForUpdate.updateSavingsAccount(savingsAccount); + clientForUpdate.updateSavingsAccount(savingsId); } this.clientRepository.saveAndFlush(clientForUpdate); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralReadPlatformServiceImpl.java index bf9d10e70..69a701032 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralReadPlatformServiceImpl.java @@ -30,9 +30,7 @@ import org.apache.fineract.infrastructure.security.service.PlatformSecurityConte import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.portfolio.collateral.data.CollateralData; import org.apache.fineract.portfolio.collateral.exception.CollateralNotFoundException; -import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; -import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -44,14 +42,14 @@ public class CollateralReadPlatformServiceImpl implements CollateralReadPlatform private final JdbcTemplate jdbcTemplate; private final PlatformSecurityContext context; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; @Autowired public CollateralReadPlatformServiceImpl(final PlatformSecurityContext context, final RoutingDataSource dataSource, - final LoanRepository loanRepository) { + final LoanRepositoryWrapper loanRepositoryWrapper) { this.context = context; this.jdbcTemplate = new JdbcTemplate(dataSource); - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; } private static final class CollateralMapper implements RowMapper { @@ -119,8 +117,7 @@ public class CollateralReadPlatformServiceImpl implements CollateralReadPlatform @Override public List retrieveCollateralsForValidLoan(final Long loanId) { - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } + this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); return retrieveCollaterals(loanId); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java index f799f2111..e57700a5c 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java @@ -33,16 +33,15 @@ import org.apache.fineract.portfolio.collateral.command.CollateralCommand; import org.apache.fineract.portfolio.collateral.domain.LoanCollateral; import org.apache.fineract.portfolio.collateral.domain.LoanCollateralRepository; import org.apache.fineract.portfolio.collateral.exception.CollateralCannotBeCreatedException; -import org.apache.fineract.portfolio.collateral.exception.CollateralCannotBeDeletedException; -import org.apache.fineract.portfolio.collateral.exception.CollateralCannotBeUpdatedException; -import org.apache.fineract.portfolio.collateral.exception.CollateralNotFoundException; import org.apache.fineract.portfolio.collateral.exception.CollateralCannotBeCreatedException.LOAN_COLLATERAL_CANNOT_BE_CREATED_REASON; +import org.apache.fineract.portfolio.collateral.exception.CollateralCannotBeDeletedException; import org.apache.fineract.portfolio.collateral.exception.CollateralCannotBeDeletedException.LOAN_COLLATERAL_CANNOT_BE_DELETED_REASON; +import org.apache.fineract.portfolio.collateral.exception.CollateralCannotBeUpdatedException; import org.apache.fineract.portfolio.collateral.exception.CollateralCannotBeUpdatedException.LOAN_COLLATERAL_CANNOT_BE_UPDATED_REASON; +import org.apache.fineract.portfolio.collateral.exception.CollateralNotFoundException; import org.apache.fineract.portfolio.collateral.serialization.CollateralCommandFromApiJsonDeserializer; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; -import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -56,17 +55,17 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater private final static Logger logger = LoggerFactory.getLogger(CollateralWritePlatformServiceJpaRepositoryImpl.class); private final PlatformSecurityContext context; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; private final LoanCollateralRepository collateralRepository; private final CodeValueRepositoryWrapper codeValueRepository; private final CollateralCommandFromApiJsonDeserializer collateralCommandFromApiJsonDeserializer; @Autowired - public CollateralWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final LoanRepository loanRepository, + public CollateralWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final LoanRepositoryWrapper loanRepositoryWrapper, final LoanCollateralRepository collateralRepository, final CodeValueRepositoryWrapper codeValueRepository, final CollateralCommandFromApiJsonDeserializer collateralCommandFromApiJsonDeserializer) { this.context = context; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; this.collateralRepository = collateralRepository; this.codeValueRepository = codeValueRepository; this.collateralCommandFromApiJsonDeserializer = collateralCommandFromApiJsonDeserializer; @@ -81,9 +80,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater collateralCommand.validateForCreate(); try { - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } - + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); final CodeValue collateralType = this.codeValueRepository.findOneByCodeNameAndIdWithNotFoundDetection( CollateralApiConstants.COLLATERAL_CODE_NAME, collateralCommand.getCollateralTypeId()); final LoanCollateral collateral = LoanCollateral.fromJson(loan, collateralType, command); @@ -118,9 +115,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater final Long collateralTypeId = collateralCommand.getCollateralTypeId(); try { - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } - + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); CodeValue collateralType = null; final LoanCollateral collateralForUpdate = this.collateralRepository.findOne(collateralId); @@ -161,8 +156,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater @Transactional @Override public CommandProcessingResult deleteCollateral(final Long loanId, final Long collateralId, final Long commandId) { - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true) ; final LoanCollateral collateral = this.collateralRepository.findByLoanIdAndId(loanId, collateralId); if (collateral == null) { throw new CollateralNotFoundException(loanId, collateralId); } @@ -173,9 +167,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater if (!loan.status().isSubmittedAndPendingApproval()) { throw new CollateralCannotBeDeletedException( LOAN_COLLATERAL_CANNOT_BE_DELETED_REASON.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loanId, collateralId); } - loan.getCollateral().remove(collateral); this.collateralRepository.delete(collateral); - return new CommandProcessingResultBuilder().withCommandId(commandId).withLoanId(loanId).withEntityId(collateralId).build(); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java index aa658861d..1aa8b5c83 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java @@ -42,9 +42,8 @@ import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRu import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.organisation.office.exception.InvalidOfficeException; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper; import org.apache.fineract.portfolio.calendar.domain.Calendar; @@ -70,12 +69,11 @@ import org.apache.fineract.portfolio.group.exception.InvalidGroupLevelException; import org.apache.fineract.portfolio.group.exception.InvalidGroupStateTransitionException; import org.apache.fineract.portfolio.group.serialization.GroupingTypesDataValidator; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.note.domain.Note; import org.apache.fineract.portfolio.note.domain.NoteRepository; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; +import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepositoryWrapper; import org.apache.fineract.useradministration.domain.AppUser; import org.joda.time.LocalDate; import org.slf4j.Logger; @@ -95,47 +93,43 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group private final PlatformSecurityContext context; private final GroupRepositoryWrapper groupRepository; private final ClientRepositoryWrapper clientRepositoryWrapper; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final StaffRepositoryWrapper staffRepository; private final NoteRepository noteRepository; private final GroupLevelRepository groupLevelRepository; private final GroupingTypesDataValidator fromApiJsonDeserializer; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; private final CodeValueRepositoryWrapper codeValueRepository; - private final SavingsAccountRepository savingsRepository; private final CommandProcessingService commandProcessingService; private final CalendarInstanceRepository calendarInstanceRepository; private final ConfigurationDomainService configurationDomainService; - private final SavingsAccountRepository savingsAccountRepository; - private final LoanRepositoryWrapper loanRepositoryWrapper; + private final SavingsAccountRepositoryWrapper savingsAccountRepositoryWrapper; private final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository; private final AccountNumberGenerator accountNumberGenerator; @Autowired public GroupingTypesWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final GroupRepositoryWrapper groupRepository, final ClientRepositoryWrapper clientRepositoryWrapper, - final OfficeRepository officeRepository, final StaffRepositoryWrapper staffRepository, final NoteRepository noteRepository, + final OfficeRepositoryWrapper officeRepositoryWrapper, final StaffRepositoryWrapper staffRepository, final NoteRepository noteRepository, final GroupLevelRepository groupLevelRepository, final GroupingTypesDataValidator fromApiJsonDeserializer, - final LoanRepository loanRepository, final SavingsAccountRepository savingsRepository, + final SavingsAccountRepositoryWrapper savingsAccountRepositoryWrapper, final CodeValueRepositoryWrapper codeValueRepository, final CommandProcessingService commandProcessingService, final CalendarInstanceRepository calendarInstanceRepository, final ConfigurationDomainService configurationDomainService, - final SavingsAccountRepository savingsAccountRepository, final LoanRepositoryWrapper loanRepositoryWrapper, + final LoanRepositoryWrapper loanRepositoryWrapper, final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository, final AccountNumberGenerator accountNumberGenerator) { this.context = context; this.groupRepository = groupRepository; this.clientRepositoryWrapper = clientRepositoryWrapper; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.staffRepository = staffRepository; this.noteRepository = noteRepository; this.groupLevelRepository = groupLevelRepository; this.fromApiJsonDeserializer = fromApiJsonDeserializer; - this.loanRepository = loanRepository; - this.savingsRepository = savingsRepository; + this.savingsAccountRepositoryWrapper = savingsAccountRepositoryWrapper; this.codeValueRepository = codeValueRepository; this.commandProcessingService = commandProcessingService; this.calendarInstanceRepository = calendarInstanceRepository; this.configurationDomainService = configurationDomainService; - this.savingsAccountRepository = savingsAccountRepository; this.loanRepositoryWrapper = loanRepositoryWrapper; this.accountNumberFormatRepository = accountNumberFormatRepository; this.accountNumberGenerator = accountNumberGenerator; @@ -158,8 +152,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group officeId = parentGroup.officeId(); } - final Office groupOffice = this.officeRepository.findOne(officeId); - if (groupOffice == null) { throw new OfficeNotFoundException(officeId); } + final Office groupOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); final LocalDate activationDate = command.localDateValueOfParameterNamed(GroupingTypesApiConstants.activationDateParamName); final GroupLevel groupLevel = this.groupLevelRepository.findOne(groupingType.getId()); @@ -506,15 +499,15 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group if (clients != null) { for (Client client : clients) { client.updateStaff(staff); - if (this.loanRepository.doNonClosedLoanAccountsExistForClient(client.getId())) { - for (final Loan loan : this.loanRepository.findLoanByClientId(client.getId())) { + if (this.loanRepositoryWrapper.doNonClosedLoanAccountsExistForClient(client.getId())) { + for (final Loan loan : this.loanRepositoryWrapper.findLoanByClientId(client.getId())) { if (loan.isDisbursed() && !loan.isClosed()) { loan.reassignLoanOfficer(staff, loanOfficerReassignmentDate); } } } - if (this.savingsAccountRepository.doNonClosedSavingAccountsExistForClient(client.getId())) { - for (final SavingsAccount savingsAccount : this.savingsAccountRepository + if (this.savingsAccountRepositoryWrapper.doNonClosedSavingAccountsExistForClient(client.getId())) { + for (final SavingsAccount savingsAccount : this.savingsAccountRepositoryWrapper .findSavingAccountByClientId(client.getId())) { if (!savingsAccount.isClosed()) { savingsAccount.reassignSavingsOfficer(staff, loanOfficerReassignmentDate); @@ -588,7 +581,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group } private void validateLoansAndSavingsForGroupOrCenterClose(final Group groupOrCenter, final LocalDate closureDate) { - final Collection groupLoans = this.loanRepository.findByGroupId(groupOrCenter.getId()); + final Collection groupLoans = this.loanRepositoryWrapper.findByGroupId(groupOrCenter.getId()); for (final Loan loan : groupLoans) { final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.status().getValue()); if (loanStatus.isOpen()) { @@ -611,7 +604,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group } } - final List groupSavingAccounts = this.savingsRepository.findByGroupId(groupOrCenter.getId()); + final List groupSavingAccounts = this.savingsAccountRepositoryWrapper.findByGroupId(groupOrCenter.getId()); for (final SavingsAccount saving : groupSavingAccounts) { if (saving.isActive() || saving.isSubmittedAndPendingApproval() || saving.isApproved()) { @@ -871,7 +864,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group @Transactional private void validateForJLGSavings(final Long groupId, final Set clientMembers) { for (final Client client : clientMembers) { - final Collection savings = this.savingsRepository.findByClientIdAndGroupId(client.getId(), groupId); + final Collection savings = this.savingsAccountRepositoryWrapper.findByClientIdAndGroupId(client.getId(), groupId); if (!CollectionUtils.isEmpty(savings)) { final String defaultUserMessage = "Client with identifier " + client.getId() + " cannot be disassociated it has group savings."; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index 98422fba6..5a43e29d2 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -245,10 +245,10 @@ public class Loan extends AbstractPersistable { @Column(name = "loan_product_counter") private Integer loanProductCounter; - @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.EAGER) + @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) private Set charges = new HashSet<>(); - @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.EAGER) + @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) private Set trancheCharges = new HashSet<>(); @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) @@ -257,26 +257,14 @@ public class Loan extends AbstractPersistable { @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) private Set loanOfficerHistory; - // see - // http://stackoverflow.com/questions/4334970/hibernate-cannot-simultaneously-fetch-multiple-bags @OrderBy(value = "installmentNumber") - @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.EAGER) - private final Set repaymentScheduleInstallments = new HashSet<>(); + @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) + private final List repaymentScheduleInstallments = new ArrayList<>(); - // see - // http://stackoverflow.com/questions/4334970/hibernate-cannot-simultaneously-fetch-multiple-bags @OrderBy(value = "dateOf, id") - @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.EAGER) - private final Set loanTransactions = new HashSet<>(); + @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) + private final List loanTransactions = new ArrayList<>(); - private transient List sortedTransactions = null ; - - private transient boolean isTransactionsListDirty = false ; - - private transient List sortedrepaymentScheduleInstallments = null ; - - private transient boolean isrepaymentScheduleInstallmentsListDirty = false ; - @Embedded private LoanSummary summary; @@ -302,13 +290,13 @@ public class Loan extends AbstractPersistable { @Column(name = "max_outstanding_loan_balance", scale = 6, precision = 19, nullable = false) private BigDecimal maxOutstandingLoanBalance; - @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.EAGER) + @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) @OrderBy(value = "expectedDisbursementDate, id") - private Set disbursementDetails = new HashSet<>(); + private List disbursementDetails = new ArrayList<>(); @OrderBy(value = "termApplicableFrom, id") - @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.EAGER) - private final Set loanTermVariations = new HashSet<>(); + @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) + private final List loanTermVariations = new ArrayList<>(); @Column(name = "total_recovered_derived", scale = 6, precision = 19) private BigDecimal totalRecovered; @@ -349,8 +337,6 @@ public class Loan extends AbstractPersistable { @Column(name = "is_topup", nullable = false) private boolean isTopup = false; -// @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER) -// @JoinColumn(name = "loan_id", referencedColumnName= "id" , nullable = true) @OneToOne(cascade = CascadeType.ALL, mappedBy = "loan", optional = true, orphanRemoval = true, fetch=FetchType.EAGER) private LoanTopupDetails loanTopupDetails; @@ -358,7 +344,7 @@ public class Loan extends AbstractPersistable { final LoanProduct loanProduct, final Fund fund, final Staff officer, final CodeValue loanPurpose, final LoanTransactionProcessingStrategy transactionProcessingStrategy, final LoanProductRelatedDetail loanRepaymentScheduleDetail, final Set loanCharges, - final Set collateral, final BigDecimal fixedEmiAmount, final Set disbursementDetails, + final Set collateral, final BigDecimal fixedEmiAmount, final List disbursementDetails, final BigDecimal maxOutstandingLoanBalance, final Boolean createStandingInstructionAtDisbursement, final Boolean isFloatingInterestRate, final BigDecimal interestRateDifferential) { final LoanStatus status = null; @@ -375,7 +361,7 @@ public class Loan extends AbstractPersistable { final LoanTransactionProcessingStrategy transactionProcessingStrategy, final LoanProductRelatedDetail loanRepaymentScheduleDetail, final Set loanCharges, final Set collateral, final Boolean syncDisbursementWithMeeting, final BigDecimal fixedEmiAmount, - final Set disbursementDetails, final BigDecimal maxOutstandingLoanBalance, + final List disbursementDetails, final BigDecimal maxOutstandingLoanBalance, final Boolean createStandingInstructionAtDisbursement, final Boolean isFloatingInterestRate, final BigDecimal interestRateDifferential) { final LoanStatus status = null; @@ -391,7 +377,7 @@ public class Loan extends AbstractPersistable { final LoanTransactionProcessingStrategy transactionProcessingStrategy, final LoanProductRelatedDetail loanRepaymentScheduleDetail, final Set loanCharges, final Set collateral, final Boolean syncDisbursementWithMeeting, final BigDecimal fixedEmiAmount, - final Set disbursementDetails, final BigDecimal maxOutstandingLoanBalance, + final List disbursementDetails, final BigDecimal maxOutstandingLoanBalance, final Boolean createStandingInstructionAtDisbursement, final Boolean isFloatingInterestRate, final BigDecimal interestRateDifferential) { final LoanStatus status = null; @@ -409,7 +395,7 @@ public class Loan extends AbstractPersistable { final Staff loanOfficer, final CodeValue loanPurpose, final LoanTransactionProcessingStrategy transactionProcessingStrategy, final LoanProduct loanProduct, final LoanProductRelatedDetail loanRepaymentScheduleDetail, final LoanStatus loanStatus, final Set loanCharges, final Set collateral, final Boolean syncDisbursementWithMeeting, - final BigDecimal fixedEmiAmount, final Set disbursementDetails, + final BigDecimal fixedEmiAmount, final List disbursementDetails, final BigDecimal maxOutstandingLoanBalance, final Boolean createStandingInstructionAtDisbursement, final Boolean isFloatingInterestRate, final BigDecimal interestRateDifferential) { @@ -587,7 +573,6 @@ public class Loan extends AbstractPersistable { mapEntry.getValue().updateLoan(this); } this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values()); - this.isTransactionsListDirty = true ; updateLoanSummaryDerivedFields(); this.loanTransactions.removeAll(changedTransactionDetail.getNewTransactionMappings().values()); return changedTransactionDetail; @@ -1098,7 +1083,6 @@ public class Loan extends AbstractPersistable { public void updateLoanSchedule(final LoanScheduleModel modifiedLoanSchedule, AppUser currentUser) { this.repaymentScheduleInstallments.clear(); - this.isrepaymentScheduleInstallmentsListDirty = true ; for (final LoanScheduleModelPeriod scheduledLoanInstallment : modifiedLoanSchedule.getPeriods()) { if (scheduledLoanInstallment.isRepaymentPeriod()) { @@ -1120,7 +1104,6 @@ public class Loan extends AbstractPersistable { public void updateLoanSchedule(final Collection installments, AppUser currentUser) { this.repaymentScheduleInstallments.clear(); - this.isrepaymentScheduleInstallmentsListDirty = true ; for (final LoanRepaymentScheduleInstallment installment : installments) { addLoanRepaymentScheduleInstallment(installment); } @@ -1848,8 +1831,7 @@ public class Loan extends AbstractPersistable { List transactions = getLoanTransactions() ; for (final LoanTransaction loanTransaction : transactions) { if (loanTransaction.isDisbursement()) { - this.loanTransactions.remove(loanTransaction); - transactions.remove(loanTransaction) ; + removeLoanTransaction(loanTransaction); break; } } @@ -2201,7 +2183,6 @@ public class Loan extends AbstractPersistable { } public Collection findExistingTransactionIds() { - final Collection ids = new ArrayList<>(); List transactions = getLoanTransactions() ; for (final LoanTransaction transaction : transactions) { @@ -2749,7 +2730,6 @@ public class Loan extends AbstractPersistable { } } this.loanTransactions.retainAll(retainTransactions); - isTransactionsListDirty = true ; } private void updateLoanToPreDisbursalState() { @@ -3008,7 +2988,6 @@ public class Loan extends AbstractPersistable { * transactions first and then new transactions. */ this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values()); - this.isTransactionsListDirty = true ; } updateLoanSummaryDerivedFields(); @@ -4478,17 +4457,15 @@ public class Loan extends AbstractPersistable { //This method returns copy of all transactions public List getLoanTransactions() { - if(this.sortedTransactions == null || isTransactionsListDirty) { - this.sortedTransactions = new ArrayList<>(this.loanTransactions) ; - this.sortedTransactions.sort(new LoanTransactionComparator()); - this.isTransactionsListDirty = false ; - } - return sortedTransactions; + return this.loanTransactions; } public void addLoanTransaction(final LoanTransaction loanTransaction) { this.loanTransactions.add(loanTransaction) ; - this.isTransactionsListDirty = true ; + } + + public void removeLoanTransaction(final LoanTransaction loanTransaction) { + this.loanTransactions.remove(loanTransaction) ; } public void setLoanStatus(final Integer loanStatus) { @@ -4859,7 +4836,7 @@ public class Loan extends AbstractPersistable { return list; } - public Set getDisbursementDetails() { + public List getDisbursementDetails() { return this.disbursementDetails; } @@ -5017,7 +4994,6 @@ public class Loan extends AbstractPersistable { * first and then new transactions. */ this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values()); - this.isTransactionsListDirty = true ; updateLoanSummaryDerivedFields(); this.loanTransactions.removeAll(changedTransactionDetail.getNewTransactionMappings().values()); @@ -5430,11 +5406,7 @@ public class Loan extends AbstractPersistable { * @return List of loan repayments schedule objects **/ public List getRepaymentScheduleInstallments() { - if (this.sortedrepaymentScheduleInstallments == null || this.isrepaymentScheduleInstallmentsListDirty) { - this.sortedrepaymentScheduleInstallments = new ArrayList<>(this.repaymentScheduleInstallments); - this.sortedrepaymentScheduleInstallments.sort(LoanRepaymentScheduleInstallment.installmentNumberComparator); - } - return sortedrepaymentScheduleInstallments; + return this.repaymentScheduleInstallments; } public Integer getLoanRepaymentScheduleInstallmentsSize() { @@ -5443,7 +5415,6 @@ public class Loan extends AbstractPersistable { public void addLoanRepaymentScheduleInstallment(final LoanRepaymentScheduleInstallment installment) { installment.updateLoan(this); this.repaymentScheduleInstallments.add(installment); - this.isrepaymentScheduleInstallmentsListDirty = true ; } /** * @return Loan product minimum repayments schedule related detail @@ -5944,7 +5915,7 @@ public class Loan extends AbstractPersistable { this.interestRateDifferential = interestRateDifferential; } - public Set getLoanTermVariations() { + public List getLoanTermVariations() { return this.loanTermVariations; } @@ -5982,7 +5953,7 @@ public class Loan extends AbstractPersistable { * get the next repayment date for rescheduling at the time of disbursement */ public LocalDate getNextPossibleRepaymentDateForRescheduling() { - Set loanDisbursementDetails = this.disbursementDetails; + List loanDisbursementDetails = this.disbursementDetails; LocalDate nextRepaymentDate = new LocalDate(); for (LoanDisbursementDetails loanDisbursementDetail : loanDisbursementDetails) { if (loanDisbursementDetail.actualDisbursementDate() == null) { @@ -6367,4 +6338,27 @@ public class Loan extends AbstractPersistable { public Collection getLoanCharges() { return this.charges; } + + public void initializeLazyCollections() { + this.charges.size() ; + this.trancheCharges.size() ; + this.repaymentScheduleInstallments.size() ; + this.loanTransactions.size() ; + this.disbursementDetails.size() ; + this.loanTermVariations.size() ; + this.collateral.size() ; + this.loanOfficerHistory.size() ; + } + + public void initializeLoanOfficerHistory() { + this.loanOfficerHistory.size() ; + } + + public void initilizeTransactions() { + this.loanTransactions.size() ; + } + + public void initializeRepaymentSchedule() { + this.repaymentScheduleInstallments.size() ; + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java index 58dc6628a..31f6a624f 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java @@ -83,7 +83,7 @@ import org.springframework.transaction.annotation.Transactional; public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { private final LoanAssembler loanAccountAssembler; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; private final LoanTransactionRepository loanTransactionRepository; private final ConfigurationDomainService configurationDomainService; private final HolidayRepository holidayRepository; @@ -102,7 +102,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { private final StandingInstructionRepository standingInstructionRepository; @Autowired - public LoanAccountDomainServiceJpa(final LoanAssembler loanAccountAssembler, final LoanRepository loanRepository, + public LoanAccountDomainServiceJpa(final LoanAssembler loanAccountAssembler, final LoanRepositoryWrapper loanRepositoryWrapper, final LoanTransactionRepository loanTransactionRepository, final NoteRepository noteRepository, final ConfigurationDomainService configurationDomainService, final HolidayRepository holidayRepository, final WorkingDaysRepositoryWrapper workingDaysRepository, @@ -115,7 +115,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { final BusinessEventNotifierService businessEventNotifierService, final LoanUtilService loanUtilService, final StandingInstructionRepository standingInstructionRepository) { this.loanAccountAssembler = loanAccountAssembler; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; this.loanTransactionRepository = loanTransactionRepository; this.noteRepository = noteRepository; this.configurationDomainService = configurationDomainService; @@ -260,7 +260,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { this.repaymentScheduleInstallmentRepository.save(installment); } } - this.loanRepository.saveAndFlush(loan); + this.loanRepositoryWrapper.saveAndFlush(loan); } catch (final DataIntegrityViolationException e) { final Throwable realCause = e.getCause(); final List dataValidationErrors = new ArrayList<>(); @@ -282,7 +282,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { this.repaymentScheduleInstallmentRepository.save(installment); } } - this.loanRepository.save(loan); + this.loanRepositoryWrapper.save(loan); } catch (final DataIntegrityViolationException e) { final Throwable realCause = e.getCause(); final List dataValidationErrors = new ArrayList<>(); @@ -403,7 +403,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { allowTransactionsOnHoliday, holidays, workingDays, allowTransactionsOnNonWorkingDay); saveLoanTransactionWithDataIntegrityViolationChecks(newRefundTransaction); - this.loanRepository.save(loan); + this.loanRepositoryWrapper.save(loan); if (StringUtils.isNotBlank(noteText)) { final Note note = Note.loanTransactionNote(loan, newRefundTransaction, noteText); @@ -593,7 +593,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { existingReversedTransactionIds, allowTransactionsOnHoliday, holidays, workingDays, allowTransactionsOnNonWorkingDay); this.loanTransactionRepository.save(newRefundTransaction); - this.loanRepository.save(loan); + this.loanRepositoryWrapper.save(loan); if (StringUtils.isNotBlank(noteText)) { final Note note = Note.loanTransactionNote(loan, newRefundTransaction, noteText); @@ -646,7 +646,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { } createdDate = createdDate.plusSeconds(1); newTransactions.add(accrualTransaction); - loan.getLoanTransactions().add(accrualTransaction); + loan.addLoanTransaction(accrualTransaction); Set accrualCharges = accrualTransaction.getLoanChargesPaid(); for (LoanCharge loanCharge : loan.charges()) { if (loanCharge.isActive() diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java index f2438b72e..9a3252360 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java @@ -21,10 +21,14 @@ package org.apache.fineract.portfolio.loanaccount.domain; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Date; +import java.util.List; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** *

@@ -43,11 +47,20 @@ public class LoanRepositoryWrapper { } public Loan findOneWithNotFoundDetection(final Long id) { - final Loan loan = this.repository.findOne(id); - if (loan == null) { throw new LoanNotFoundException(id); } - return loan; + return this.findOneWithNotFoundDetection(id, false) ; } + @Transactional(readOnly=true) + public Loan findOneWithNotFoundDetection(final Long id, boolean loadLazyCollections) { + final Loan loan = this.repository.findOne(id); + if (loan == null) { throw new LoanNotFoundException(id); } + if(loadLazyCollections) { + loan.initializeLazyCollections(); + } + return loan; + } + + //Root Entities are enough public Collection findActiveLoansByLoanIdAndGroupId(Long clientId, Long groupId) { final Collection loanStatuses = new ArrayList<>(Arrays.asList(LoanStatus.SUBMITTED_AND_PENDING_APPROVAL.getValue(), LoanStatus.APPROVED.getValue(), LoanStatus.ACTIVE.getValue(), LoanStatus.OVERPAID.getValue())); @@ -55,4 +68,170 @@ public class LoanRepositoryWrapper { return loans; } + public Loan saveAndFlush(final Loan loan) { + return this.repository.saveAndFlush(loan) ; + } + + public Loan save(final Loan loan) { + return this.repository.save(loan) ; + } + + public List save(List loans) { + return this.repository.save(loans) ; + } + public void flush() { + this.repository.flush(); + } + + public void delete(final Long loanId) { + this.repository.delete(loanId); + } + //Only root entities is enough + public List getGroupLoansDisbursedAfter(@Param("disbursementDate") Date disbursementDate, @Param("groupId") Long groupId, + @Param("loanType") Integer loanType) { + return this.repository.getGroupLoansDisbursedAfter(disbursementDate, groupId, loanType) ; + } + //Only root entities enough + public List getClientOrJLGLoansDisbursedAfter(@Param("disbursementDate") Date disbursementDate, @Param("clientId") Long clientId) { + return this.repository.getClientOrJLGLoansDisbursedAfter(disbursementDate, clientId) ; + } + + public Integer getMaxGroupLoanCounter(@Param("groupId") Long groupId, @Param("loanType") Integer loanType) { + return this.repository.getMaxGroupLoanCounter(groupId, loanType) ; + } + + public Integer getMaxGroupLoanProductCounter(@Param("productId") Long productId, @Param("groupId") Long groupId, + @Param("loanType") Integer loanType) { + return this.repository.getMaxGroupLoanProductCounter(productId, groupId, loanType) ; + } + + public Integer getMaxClientOrJLGLoanCounter(@Param("clientId") Long clientId) { + return this.repository.getMaxClientOrJLGLoanCounter(clientId) ; + } + + public Integer getMaxClientOrJLGLoanProductCounter(@Param("productId") Long productId, @Param("clientId") Long clientId) { + return this.repository.getMaxClientOrJLGLoanProductCounter(productId, clientId) ; + } + + //Only root entities are enough + public List getGroupLoansToUpdateLoanCounter(@Param("loanCounter") Integer loanCounter, @Param("groupId") Long groupId, + @Param("groupLoanType") Integer groupLoanType) { + return this.repository.getGroupLoansToUpdateLoanCounter(loanCounter, groupId, groupLoanType) ; + } + + //Only root entities are enough + public List getClientOrJLGLoansToUpdateLoanCounter(@Param("loanCounter") Integer loanCounter, @Param("clientId") Long clientId) { + return this.repository.getClientOrJLGLoansToUpdateLoanCounter(loanCounter, clientId) ; + } + + //Only root entities are enough + public List getGroupLoansToUpdateLoanProductCounter(@Param("loanProductCounter") Integer loanProductCounter, + @Param("groupId") Long groupId, @Param("groupLoanType") Integer groupLoanType) { + return this.repository.getGroupLoansToUpdateLoanProductCounter(loanProductCounter, groupId, groupLoanType) ; + } + + //Only root entities are enough + public List getClientLoansToUpdateLoanProductCounter(@Param("loanProductCounter") Integer loanProductCounter, + @Param("clientId") Long clientId) { + return this.repository.getClientLoansToUpdateLoanProductCounter(loanProductCounter, clientId) ; + } + + //Need loanOfficerHistory. Check whether FETCH JOIN is good enough here + @Transactional(readOnly=true) + public List findByClientIdAndGroupId(@Param("clientId") Long clientId, @Param("groupId") Long groupId) { + List loans = this.repository.findByClientIdAndGroupId(clientId, groupId) ; + if(loans != null && loans.size() > 0) { + for(Loan loan: loans) { + loan.initializeLoanOfficerHistory(); + } + } + return loans ; + } + + //need loanTransactions, loanOfficerHistory + @Transactional(readOnly=true) + public List findLoanByClientId(@Param("clientId") Long clientId) { + List loans = this.repository.findLoanByClientId(clientId) ; + if(loans != null && loans.size() > 0) { + for(Loan loan: loans) { + loan.initilizeTransactions(); + loan.initializeLoanOfficerHistory(); + } + } + return loans ; + } + + //Root entities are enough + public List findByGroupId(@Param("groupId") Long groupId) { + return this.repository.findByGroupId(groupId) ; + } + + //Looks like we need complete Data + public List findByIdsAndLoanStatusAndLoanType(@Param("ids") Collection ids, + @Param("loanStatuses") Collection loanStatuses, @Param("loanTypes") Collection loanTypes) { + List loans =this.repository.findByIdsAndLoanStatusAndLoanType(ids, loanStatuses, loanTypes) ; + if(loans != null && loans.size() > 0) { + for(Loan loan: loans) { + loan.initializeLazyCollections(); + } + } + return loans ; + } + + //This method is not used + public List getLoansDisbursedAfter(@Param("disbursalDate") Date disbursalDate) { + return this.repository.getLoansDisbursedAfter(disbursalDate) ; + } + + //Repayments Schedule + public List findByClientOfficeIdsAndLoanStatus(@Param("officeIds") Collection officeIds, + @Param("loanStatuses") Collection loanStatuses) { + List loans = this.repository.findByClientOfficeIdsAndLoanStatus(officeIds, loanStatuses) ; + if(loans != null && loans.size() >0) { + for(Loan loan: loans) { + loan.initializeRepaymentSchedule(); + } + } + return loans ; + } + + //Repayments Schedule + public List findByGroupOfficeIdsAndLoanStatus(@Param("officeIds") Collection officeIds, + @Param("loanStatuses") Collection loanStatuses) { + List loans = this.repository.findByGroupOfficeIdsAndLoanStatus(officeIds, loanStatuses) ; + if(loans != null && loans.size() >0) { + for(Loan loan: loans) { + loan.initializeRepaymentSchedule(); + } + } + return loans ; + } + + public List findActiveLoansLoanProductIdsByClient(@Param("clientId") Long clientId, @Param("loanStatus") Integer loanStatus) { + return this.repository.findActiveLoansLoanProductIdsByClient(clientId, loanStatus) ; + } + + public List findActiveLoansLoanProductIdsByGroup(@Param("groupId") Long groupId, @Param("loanStatus") Integer loanStatus) { + return this.repository.findActiveLoansLoanProductIdsByGroup(groupId, loanStatus) ; + } + + public boolean doNonClosedLoanAccountsExistForClient(@Param("clientId") Long clientId) { + return this.repository.doNonClosedLoanAccountsExistForClient(clientId) ; + } + + public boolean doNonClosedLoanAccountsExistForProduct(@Param("productId") Long productId) { + return this.repository.doNonClosedLoanAccountsExistForProduct(productId) ; + } + + public Loan findNonClosedLoanByAccountNumber(@Param("accountNumber") String accountNumber) { + return this.repository.findNonClosedLoanByAccountNumber(accountNumber) ; + } + + //Looks like we need complete entity + @Transactional(readOnly=true) + public Loan findNonClosedLoanThatBelongsToClient(@Param("loanId") Long loanId, @Param("clientId") Long clientId) { + Loan loan = this.repository.findNonClosedLoanThatBelongsToClient(loanId, clientId) ; + if(loan != null) loan.initilizeTransactions(); + return loan ; + } } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorReadPlatformServiceImpl.java index 38b884ea9..e5dc0f5e4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorReadPlatformServiceImpl.java @@ -35,9 +35,7 @@ import org.apache.fineract.portfolio.account.data.PortfolioAccountData; import org.apache.fineract.portfolio.account.domain.AccountAssociationType; import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.service.ClientReadPlatformService; -import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; -import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.guarantor.data.GuarantorData; import org.apache.fineract.portfolio.loanaccount.guarantor.data.GuarantorFundingData; import org.apache.fineract.portfolio.loanaccount.guarantor.data.GuarantorTransactionData; @@ -55,21 +53,20 @@ public class GuarantorReadPlatformServiceImpl implements GuarantorReadPlatformSe private final JdbcTemplate jdbcTemplate; private final ClientReadPlatformService clientReadPlatformService; private final StaffReadPlatformService staffReadPlatformService; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; @Autowired public GuarantorReadPlatformServiceImpl(final RoutingDataSource dataSource, final ClientReadPlatformService clientReadPlatformService, - final StaffReadPlatformService staffReadPlatformService, final LoanRepository loanRepository) { + final StaffReadPlatformService staffReadPlatformService, final LoanRepositoryWrapper loanRepositoryWrapper) { this.jdbcTemplate = new JdbcTemplate(dataSource); this.clientReadPlatformService = clientReadPlatformService; this.staffReadPlatformService = staffReadPlatformService; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; } @Override public List retrieveGuarantorsForValidLoan(final Long loanId) { - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } + this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); return retrieveGuarantorsForLoan(loanId); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java index bea1f31b9..ab779afc1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java @@ -97,7 +97,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto @Transactional public CommandProcessingResult createGuarantor(final Long loanId, final JsonCommand command) { final GuarantorCommand guarantorCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json()); - final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); final List existGuarantorList = this.guarantorRepository.findByLoan(loan); return createGuarantor(loan, command, guarantorCommand, existGuarantorList); } @@ -186,7 +186,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto final GuarantorCommand guarantorCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json()); guarantorCommand.validateForUpdate(); - final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); validateLoanStatus(loan); final Guarantor guarantorForUpdate = this.guarantorRepository.findByLoanAndId(loan, guarantorId); if (guarantorForUpdate == null) { throw new GuarantorNotFoundException(loanId, guarantorId); } @@ -239,7 +239,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto @Override @Transactional public CommandProcessingResult removeGuarantor(final Long loanId, final Long guarantorId, final Long guarantorFundingId) { - final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); validateLoanStatus(loan); final Guarantor guarantorForDelete = this.guarantorRepository.findByLoanAndId(loan, guarantorId); if (guarantorForDelete == null || (guarantorFundingId == null && !guarantorForDelete.getGuarantorFundDetails().isEmpty())) { throw new GuarantorNotFoundException( diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java index 74350daa0..d249e356c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java @@ -2041,7 +2041,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener final LocalDate scheduleTillDate) { // Loan transactions to process and find the variation on payments Collection recalculationDetails = new ArrayList<>(); - for (LoanTransaction loanTransaction : loan.getLoanTransactions()) { + List transactions = loan.getLoanTransactions() ; + for (LoanTransaction loanTransaction : transactions) { if (loanTransaction.isPaymentTransaction()) { recalculationDetails.add(new RecalculationDetail(loanTransaction.getTransactionDate(), LoanTransaction .copyTransactionProperties(loanTransaction))); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java index 9565ff3f8..a335e9c53 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java @@ -598,14 +598,14 @@ public class LoanScheduleAssembler { validateDisbursementDateIsOnNonWorkingDay(loanApplicationTerms.getExpectedDisbursementDate(), workingDays); validateDisbursementDateIsOnHoliday(loanApplicationTerms.getExpectedDisbursementDate(), isHolidayEnabled, holidays); - Set loanDisbursementDetails = this.loanUtilService.fetchDisbursementData(element.getAsJsonObject()); + List loanDisbursementDetails = this.loanUtilService.fetchDisbursementData(element.getAsJsonObject()); return assembleLoanScheduleFrom(loanApplicationTerms, isHolidayEnabled, holidays, workingDays, element, loanDisbursementDetails); } public LoanScheduleModel assembleLoanScheduleFrom(final LoanApplicationTerms loanApplicationTerms, final boolean isHolidayEnabled, final List holidays, final WorkingDays workingDays, final JsonElement element, - Set disbursementDetails) { + List disbursementDetails) { final Set loanCharges = this.loanChargeAssembler.fromParsedJson(element, disbursementDetails); @@ -657,7 +657,7 @@ public class LoanScheduleAssembler { public void assempleVariableScheduleFrom(final Loan loan, final String json) { this.variableLoanScheduleFromApiJsonValidator.validateSchedule(json, loan); - Set variations = loan.getLoanTermVariations(); + List variations = loan.getLoanTermVariations(); List newVariations = new ArrayList<>(); extractLoanTermVariations(loan, json, newVariations); @@ -839,7 +839,7 @@ public class LoanScheduleAssembler { loan.regenerateRepaymentSchedule(scheduleGeneratorDTO, currentUser); } - private List adjustExistingVariations(Set variations, List newVariations, + private List adjustExistingVariations(List variations, List newVariations, final Map adjustDueDateVariations) { Map amountVariations = new HashMap<>(); Map dueDateVariations = new HashMap<>(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java index a8ea977ba..2ebe0d4d7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java @@ -21,10 +21,8 @@ package org.apache.fineract.portfolio.loanaccount.loanschedule.service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Set; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.core.api.JsonQuery; @@ -227,7 +225,7 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC final MonetaryCurrency currency = loan.getCurrency(); Money outstanding = loan.getPrincpal(); - Set disbursementDetails = new HashSet<>(); + List disbursementDetails = new ArrayList<>(); if (loan.isMultiDisburmentLoan()) { disbursementDetails = loan.getDisbursementDetails(); outstanding = outstanding.zero(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleWritePlatformServiceImpl.java index 0999fe55b..719167152 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleWritePlatformServiceImpl.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; @@ -72,7 +71,7 @@ public class LoanScheduleWritePlatformServiceImpl implements LoanScheduleWritePl this.loanAccountDomainService.saveLoanWithDataIntegrityViolationChecks(loan); final Map changes = new HashMap<>(); List newVariationsData = new ArrayList<>(); - Set modifiedVariations = loan.getLoanTermVariations(); + List modifiedVariations = loan.getLoanTermVariations(); for (LoanTermVariations termVariations : modifiedVariations) { if (loanTermVariations.containsKey(termVariations.getId())) { loanTermVariations.remove(termVariations.getId()); @@ -94,7 +93,7 @@ public class LoanScheduleWritePlatformServiceImpl implements LoanScheduleWritePl @Override public CommandProcessingResult deleteLoanScheduleVariations(final Long loanId) { final Loan loan = this.loanAssembler.assembleFrom(loanId); - Set variations = loan.getLoanTermVariations(); + List variations = loan.getLoanTermVariations(); List deletedVariations = new ArrayList<>(variations.size()); for (LoanTermVariations loanTermVariations : variations) { deletedVariations.add(loanTermVariations.getId()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java index 19f6b792d..632fe736c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java @@ -30,9 +30,7 @@ import org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformSer import org.apache.fineract.infrastructure.core.domain.JdbcSupport; import org.apache.fineract.infrastructure.core.service.RoutingDataSource; import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData; -import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; -import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestData; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestEnumerations; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestStatusEnumData; @@ -49,15 +47,15 @@ import org.springframework.stereotype.Service; public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanRescheduleRequestReadPlatformService { private final JdbcTemplate jdbcTemplate; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; private final LoanRescheduleRequestRowMapper loanRescheduleRequestRowMapper = new LoanRescheduleRequestRowMapper(); private final CodeValueReadPlatformService codeValueReadPlatformService; @Autowired - public LoanRescheduleRequestReadPlatformServiceImpl(final RoutingDataSource dataSource, LoanRepository loanRepository, + public LoanRescheduleRequestReadPlatformServiceImpl(final RoutingDataSource dataSource, LoanRepositoryWrapper loanRepositoryWrapper, final CodeValueReadPlatformService codeValueReadPlatformService) { this.jdbcTemplate = new JdbcTemplate(dataSource); - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; this.codeValueReadPlatformService = codeValueReadPlatformService; } @@ -194,10 +192,7 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched @Override public List readLoanRescheduleRequests(Long loanId) { - final Loan loan = this.loanRepository.findOne(loanId); - - if (loan == null) { throw new LoanNotFoundException(loanId); } - + this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?"; return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId }); @@ -219,12 +214,8 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched @Override public List readLoanRescheduleRequests(Long loanId, Integer statusEnum) { - final Loan loan = this.loanRepository.findOne(loanId); - - if (loan == null) { throw new LoanNotFoundException(loanId); } - + this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?" + " and lr.status_enum = ?"; - return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId, statusEnum }); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java index 6c70d7c55..7eccf9a51 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java @@ -55,7 +55,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanLifecycleStateMachin import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanRescheduleRequestToTermVariationMapping; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; @@ -104,7 +104,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche private final LoanScheduleHistoryWritePlatformService loanScheduleHistoryWritePlatformService; private final LoanTransactionRepository loanTransactionRepository; private final JournalEntryWritePlatformService journalEntryWritePlatformService; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; private final LoanAssembler loanAssembler; private final LoanUtilService loanUtilService; private final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory; @@ -129,7 +129,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche final LoanRepaymentScheduleHistoryRepository loanRepaymentScheduleHistoryRepository, final LoanScheduleHistoryWritePlatformService loanScheduleHistoryWritePlatformService, final LoanTransactionRepository loanTransactionRepository, - final JournalEntryWritePlatformService journalEntryWritePlatformService, final LoanRepository loanRepository, + final JournalEntryWritePlatformService journalEntryWritePlatformService, final LoanRepositoryWrapper loanRepositoryWrapper, final LoanAssembler loanAssembler, final LoanUtilService loanUtilService, final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory, final LoanScheduleGeneratorFactory loanScheduleFactory, final LoanSummaryWrapper loanSummaryWrapper, @@ -145,7 +145,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche this.loanScheduleHistoryWritePlatformService = loanScheduleHistoryWritePlatformService; this.loanTransactionRepository = loanTransactionRepository; this.journalEntryWritePlatformService = journalEntryWritePlatformService; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; this.loanAssembler = loanAssembler; this.loanUtilService = loanUtilService; this.loanRepaymentScheduleTransactionProcessorFactory = loanRepaymentScheduleTransactionProcessorFactory; @@ -281,7 +281,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche // create a new entry in the m_loan_reschedule_request table this.loanRescheduleRequestRepository.save(loanRescheduleRequest); - this.loanRepository.save(loan); + this.loanRepositoryWrapper.save(loan); return new CommandProcessingResultBuilder().withCommandId(jsonCommand.commandId()).withEntityId(loanRescheduleRequest.getId()) .withLoanId(loan.getId()).build(); @@ -508,7 +508,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche this.repaymentScheduleInstallmentRepository.save(installment); } } - this.loanRepository.saveAndFlush(loan); + this.loanRepositoryWrapper.saveAndFlush(loan); } catch (final DataIntegrityViolationException e) { final Throwable realCause = e.getCause(); final List dataValidationErrors = new ArrayList<>(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java index 5ac0b6433..9fdde8f75 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java @@ -42,7 +42,7 @@ import org.apache.fineract.portfolio.loanaccount.data.LoanScheduleAccrualData; import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData; import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionEnumData; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanSchedulePeriodData; @@ -64,21 +64,21 @@ public class LoanAccrualWritePlatformServiceImpl implements LoanAccrualWritePlat private final DataSource dataSource; private final JournalEntryWritePlatformService journalEntryWritePlatformService; private final AppUserRepositoryWrapper userRepository; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository; @Autowired public LoanAccrualWritePlatformServiceImpl(final RoutingDataSource dataSource, final LoanReadPlatformService loanReadPlatformService, final JournalEntryWritePlatformService journalEntryWritePlatformService, final LoanChargeReadPlatformService loanChargeReadPlatformService, final AppUserRepositoryWrapper userRepository, - final LoanRepository loanRepository, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository) { + final LoanRepositoryWrapper loanRepositoryWrapper, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository) { this.loanReadPlatformService = loanReadPlatformService; this.dataSource = dataSource; this.jdbcTemplate = new JdbcTemplate(this.dataSource); this.journalEntryWritePlatformService = journalEntryWritePlatformService; this.loanChargeReadPlatformService = loanChargeReadPlatformService; this.userRepository = userRepository; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; this.applicationCurrencyRepository = applicationCurrencyRepository; } @@ -487,14 +487,14 @@ public class LoanAccrualWritePlatformServiceImpl implements LoanAccrualWritePlat @Transactional public void addIncomeAndAccrualTransactions(Long loanId) throws Exception { if (loanId != null) { - Loan loan = this.loanRepository.findOne(loanId); + Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); if (loan == null) { throw new LoanNotFoundException(loanId); } final List existingTransactionIds = new ArrayList<>(); final List existingReversedTransactionIds = new ArrayList<>(); existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); loan.processIncomeTransactions(this.userRepository.fetchSystemUser()); - this.loanRepository.saveAndFlush(loan); + this.loanRepositoryWrapper.saveAndFlush(loan); postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index 585dbd96c..70702186d 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -41,8 +41,6 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; -import org.apache.fineract.infrastructure.core.exceptionmapper.PlatformDomainRuleExceptionMapper; -import org.apache.fineract.infrastructure.entityaccess.exception.NotOfficeSpecificProductException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; @@ -52,6 +50,7 @@ import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityRela import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityRelationRepository; import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityToEntityMapping; import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityToEntityMappingRepository; +import org.apache.fineract.infrastructure.entityaccess.exception.NotOfficeSpecificProductException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.portfolio.account.domain.AccountAssociationType; @@ -85,11 +84,21 @@ import org.apache.fineract.portfolio.group.exception.GroupNotActiveException; import org.apache.fineract.portfolio.loanaccount.api.LoanApiConstants; import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData; import org.apache.fineract.portfolio.loanaccount.data.ScheduleGeneratorDTO; -import org.apache.fineract.portfolio.loanaccount.domain.*; +import org.apache.fineract.portfolio.loanaccount.domain.DefaultLoanLifecycleStateMachine; +import org.apache.fineract.portfolio.loanaccount.domain.Loan; +import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge; +import org.apache.fineract.portfolio.loanaccount.domain.LoanDisbursementDetails; +import org.apache.fineract.portfolio.loanaccount.domain.LoanLifecycleStateMachine; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; +import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; +import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; +import org.apache.fineract.portfolio.loanaccount.domain.LoanTopupDetails; import org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationDateException; import org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeDeleted; import org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeModified; -import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel; @@ -132,7 +141,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa private final LoanApplicationTransitionApiJsonValidator loanApplicationTransitionApiJsonValidator; private final LoanProductDataValidator loanProductCommandFromApiJsonDeserializer; private final LoanApplicationCommandFromApiJsonHelper fromApiJsonDeserializer; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; private final NoteRepository noteRepository; private final LoanScheduleCalculationPlatformService calculationPlatformService; private final LoanAssembler loanAssembler; @@ -167,7 +176,8 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa final LoanApplicationCommandFromApiJsonHelper fromApiJsonDeserializer, final LoanProductDataValidator loanProductCommandFromApiJsonDeserializer, final AprCalculator aprCalculator, final LoanAssembler loanAssembler, final LoanChargeAssembler loanChargeAssembler, - final CollateralAssembler loanCollateralAssembler, final LoanRepository loanRepository, final NoteRepository noteRepository, + final CollateralAssembler loanCollateralAssembler, final LoanRepositoryWrapper loanRepositoryWrapper, + final NoteRepository noteRepository, final LoanScheduleCalculationPlatformService calculationPlatformService, final ClientRepositoryWrapper clientRepository, final LoanProductRepository loanProductRepository, final AccountNumberGenerator accountNumberGenerator, final LoanSummaryWrapper loanSummaryWrapper, final GroupRepositoryWrapper groupRepository, @@ -190,7 +200,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa this.loanAssembler = loanAssembler; this.loanChargeAssembler = loanChargeAssembler; this.loanCollateralAssembler = loanCollateralAssembler; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper ; this.noteRepository = noteRepository; this.calculationPlatformService = calculationPlatformService; this.clientRepository = clientRepository; @@ -289,7 +299,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa if(newLoanApplication.isTopup()){ final Long loanIdToClose = command.longValueOfParameterNamed(LoanApiConstants.loanIdToClose); - final Loan loanToClose = this.loanRepository.findNonClosedLoanThatBelongsToClient(loanIdToClose, clientId); + final Loan loanToClose = this.loanRepositoryWrapper.findNonClosedLoanThatBelongsToClient(loanIdToClose, clientId); if(loanToClose == null){ throw new GeneralPlatformDomainRuleException("error.msg.loan.loanIdToClose.no.active.loan.associated.to.client.found", "loanIdToClose is invalid, No Active Loan associated with the given Client ID found."); @@ -330,7 +340,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa } } - this.loanRepository.save(newLoanApplication); + this.loanRepositoryWrapper.save(newLoanApplication); if (loanProduct.isInterestRecalculationEnabled()) { this.fromApiJsonDeserializer.validateLoanForInterestRecalculation(newLoanApplication); @@ -341,7 +351,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa final AccountNumberFormat accountNumberFormat = this.accountNumberFormatRepository .findByAccountType(EntityAccountType.LOAN); newLoanApplication.updateAccountNo(this.accountNumberGenerator.generate(newLoanApplication, accountNumberFormat)); - this.loanRepository.save(newLoanApplication); + this.loanRepositoryWrapper.save(newLoanApplication); } final String submittedOnNote = command.stringValueOfParameterNamed("submittedOnNote"); @@ -552,7 +562,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa LoanChargeData chargeData = new LoanChargeData(charge.getId(), charge.getDueLocalDate(), charge.amountOrPercentage()); chargesMap.put(charge.getId(), chargeData); } - Set disbursementDetails = this.loanUtilService.fetchDisbursementData(command.parsedJson() + List disbursementDetails = this.loanUtilService.fetchDisbursementData(command.parsedJson() .getAsJsonObject()); /** @@ -684,7 +694,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa if(existingLoanTopupDetails != null){ existingLoanIdToClose = existingLoanTopupDetails.getLoanIdToClose(); } - final Loan loanToClose = this.loanRepository.findNonClosedLoanThatBelongsToClient(loanIdToClose, existingLoanApplication.getClientId()); + final Loan loanToClose = this.loanRepositoryWrapper.findNonClosedLoanThatBelongsToClient(loanIdToClose, existingLoanApplication.getClientId()); if(loanToClose == null){ throw new GeneralPlatformDomainRuleException("error.msg.loan.loanIdToClose.no.active.loan.associated.to.client.found", "loanIdToClose is invalid, No Active Loan associated with the given Client ID found."); @@ -960,7 +970,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa // updating loan interest recalculation details throwing null // pointer exception after saveAndFlush // http://stackoverflow.com/questions/17151757/hibernate-cascade-update-gives-null-pointer/17334374#17334374 - this.loanRepository.save(existingLoanApplication); + this.loanRepositoryWrapper.save(existingLoanApplication); if (productRelatedDetail.isInterestRecalculationEnabled()) { this.fromApiJsonDeserializer.validateLoanForInterestRecalculation(existingLoanApplication); @@ -1023,7 +1033,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa final List relatedNotes = this.noteRepository.findByLoanId(loan.getId()); this.noteRepository.deleteInBatch(relatedNotes); - this.loanRepository.delete(loanId); + this.loanRepositoryWrapper.delete(loanId); return new CommandProcessingResultBuilder() // .withEntityId(loanId) // @@ -1100,7 +1110,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa if(loan.isTopup() && loan.getClientId() != null){ final Long loanIdToClose = loan.getTopupLoanDetails().getLoanIdToClose(); - final Loan loanToClose = this.loanRepository.findNonClosedLoanThatBelongsToClient(loanIdToClose, loan.getClientId()); + final Loan loanToClose = this.loanRepositoryWrapper.findNonClosedLoanThatBelongsToClient(loanIdToClose, loan.getClientId()); if(loanToClose == null){ throw new GeneralPlatformDomainRuleException("error.msg.loan.to.be.closed.with.topup.is.not.active", "Loan to be closed with this topup is not active."); @@ -1205,7 +1215,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa final Map changes = loan.loanApplicationRejection(currentUser, command, defaultLoanLifecycleStateMachine()); if (!changes.isEmpty()) { - this.loanRepository.save(loan); + this.loanRepositoryWrapper.save(loan); final String noteText = command.stringValueOfParameterNamed("note"); if (StringUtils.isNotBlank(noteText)) { @@ -1239,7 +1249,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa final Map changes = loan.loanApplicationWithdrawnByApplicant(currentUser, command, defaultLoanLifecycleStateMachine()); if (!changes.isEmpty()) { - this.loanRepository.save(loan); + this.loanRepositoryWrapper.save(loan); final String noteText = command.stringValueOfParameterNamed("note"); if (StringUtils.isNotBlank(noteText)) { @@ -1260,8 +1270,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa } private Loan retrieveLoanBy(final Long loanId) { - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); loan.setHelpers(defaultLoanLifecycleStateMachine(), this.loanSummaryWrapper, this.loanRepaymentScheduleTransactionProcessorFactory); return loan; } @@ -1311,7 +1320,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa this.repaymentScheduleInstallmentRepository.save(installment); } } - this.loanRepository.saveAndFlush(loan); + this.loanRepositoryWrapper.saveAndFlush(loan); } catch (final DataIntegrityViolationException e) { final Throwable realCause = e.getCause(); final List dataValidationErrors = new ArrayList<>(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssembler.java index 93df756d9..2d124bf7f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssembler.java @@ -138,7 +138,7 @@ public class LoanAssembler { } public Loan assembleFrom(final Long accountId) { - final Loan loanAccount = this.loanRepository.findOneWithNotFoundDetection(accountId); + final Loan loanAccount = this.loanRepository.findOneWithNotFoundDetection(accountId, true); loanAccount.setHelpers(defaultLoanLifecycleStateMachine(), this.loanSummaryWrapper, this.loanRepaymentScheduleTransactionProcessorFactory); @@ -181,7 +181,7 @@ public class LoanAssembler { if (loanPurposeId != null) { loanPurpose = this.codeValueRepository.findOneWithNotFoundDetection(loanPurposeId); } - Set disbursementDetails = null; + List disbursementDetails = null; BigDecimal fixedEmiAmount = null; if (loanProduct.isMultiDisburseLoan() || loanProduct.canDefineInstallmentAmount()) { fixedEmiAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(LoanApiConstants.emiAmountParameterName, element); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java index 13b383960..67bd9aa6d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java @@ -65,7 +65,7 @@ public class LoanChargeAssembler { this.loanProductRepository = loanProductRepository; } - public Set fromParsedJson(final JsonElement element, Set disbursementDetails) { + public Set fromParsedJson(final JsonElement element, List disbursementDetails) { JsonArray jsonDisbursement = this.fromApiJsonHelper.extractJsonArrayNamed("disbursementData", element); List disbursementChargeIds = new ArrayList<>(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java index 005067570..75a44ea70 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -93,6 +93,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType; @@ -132,7 +133,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { private final JdbcTemplate jdbcTemplate; private final PlatformSecurityContext context; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper ; private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository; private final LoanProductReadPlatformService loanProductReadPlatformService; private final ClientReadPlatformService clientReadPlatformService; @@ -155,8 +156,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { private final AccountDetailsReadPlatformService accountDetailsReadPlatformService; @Autowired - public LoanReadPlatformServiceImpl(final PlatformSecurityContext context, final LoanRepository loanRepository, - final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository, + public LoanReadPlatformServiceImpl(final PlatformSecurityContext context, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository, final LoanProductReadPlatformService loanProductReadPlatformService, final ClientReadPlatformService clientReadPlatformService, final GroupReadPlatformService groupReadPlatformService, final LoanDropdownReadPlatformService loanDropdownReadPlatformService, final FundReadPlatformService fundReadPlatformService, final ChargeReadPlatformService chargeReadPlatformService, @@ -166,9 +166,10 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory, final FloatingRatesReadPlatformService floatingRatesReadPlatformService, final LoanUtilService loanUtilService, final ConfigurationDomainService configurationDomainService, - final AccountDetailsReadPlatformService accountDetailsReadPlatformService) { + final AccountDetailsReadPlatformService accountDetailsReadPlatformService, + final LoanRepositoryWrapper loanRepositoryWrapper) { this.context = context; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper ; this.applicationCurrencyRepository = applicationCurrencyRepository; this.loanProductReadPlatformService = loanProductReadPlatformService; this.clientReadPlatformService = clientReadPlatformService; @@ -401,8 +402,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { this.context.authenticatedUser(); - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); loan.setHelpers(null, null, loanRepaymentScheduleTransactionProcessorFactory); final MonetaryCurrency currency = loan.getCurrency(); @@ -434,9 +434,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { // TODO - KW -OPTIMIZE - write simple sql query to fetch back overdue // interest that can be waived along with the date of repayment period // interest is overdue. - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } - + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); final MonetaryCurrency currency = loan.getCurrency(); final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency); final CurrencyData currencyData = applicationCurrency.toData(); @@ -467,18 +465,13 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { @Override public LoanApprovalData retrieveApprovalTemplate(final Long loanId) { - - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } - + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); return new LoanApprovalData(loan.getProposedPrincipal(), DateUtils.getLocalDateOfTenant()); - } @Override public LoanTransactionData retrieveDisbursalTemplate(final Long loanId, boolean paymentDetailsRequired) { - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.DISBURSEMENT); Collection paymentOptions = null; if (paymentDetailsRequired) { @@ -1721,8 +1714,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { @Override public LoanTransactionData retrieveRecoveryPaymentTemplate(Long loanId) { - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.RECOVERY_REPAYMENT); final Collection paymentOptions = this.paymentTypeReadPlatformService.retrieveAllPaymentTypes(); BigDecimal outstandingLoanBalance = null; @@ -1961,9 +1953,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { // TODO - KW - OPTIMIZE - write simple sql query to fetch back date of // possible next transaction date. - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } - + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); final MonetaryCurrency currency = loan.getCurrency(); final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency); @@ -2047,8 +2037,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { public LoanTransactionData retrieveLoanForeclosureTemplate(final Long loanId, final LocalDate transactionDate) { this.context.authenticatedUser(); - final Loan loan = this.loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } + final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); loan.validateForForeclosure(transactionDate); final MonetaryCurrency currency = loan.getCurrency(); final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java index e17312eb6..ec85b8315 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java @@ -19,6 +19,7 @@ package org.apache.fineract.portfolio.loanaccount.service; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; @@ -289,10 +290,10 @@ public class LoanUtilService { return calculatedRepaymentsStartingFromDate; } - public Set fetchDisbursementData(final JsonObject command) { + public List fetchDisbursementData(final JsonObject command) { final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(command); final String dateFormat = this.fromApiJsonHelper.extractDateFormatParameter(command); - Set disbursementDatas = new HashSet<>(); + List disbursementDatas = new ArrayList<>(); if (command.has(LoanApiConstants.disbursementDataParameterName)) { final JsonArray disbursementDataArray = command.getAsJsonArray(LoanApiConstants.disbursementDataParameterName); if (disbursementDataArray != null && disbursementDataArray.size() > 0) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformService.java index b21c9a8b3..858133de7 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformService.java @@ -30,6 +30,7 @@ import org.apache.fineract.portfolio.calendar.domain.Calendar; import org.apache.fineract.portfolio.calendar.domain.CalendarInstance; import org.apache.fineract.portfolio.collectionsheet.command.CollectionSheetBulkDisbursalCommand; import org.apache.fineract.portfolio.collectionsheet.command.CollectionSheetBulkRepaymentCommand; +import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; import org.joda.time.LocalDate; @@ -76,13 +77,13 @@ public interface LoanWritePlatformService { void applyHolidaysToLoans(); - LoanTransaction initiateLoanTransfer(Long accountId, LocalDate transferDate); + LoanTransaction initiateLoanTransfer(Loan loan, LocalDate transferDate); - LoanTransaction withdrawLoanTransfer(Long accountId, LocalDate transferDate); + LoanTransaction withdrawLoanTransfer(final Loan loan, LocalDate transferDate); - void rejectLoanTransfer(Long accountId); + void rejectLoanTransfer(final Loan loan); - LoanTransaction acceptLoanTransfer(Long accountId, LocalDate transferDate, Office acceptedInOffice, Staff loanOfficer); + LoanTransaction acceptLoanTransfer(Loan loan, LocalDate transferDate, Office acceptedInOffice, Staff loanOfficer); CommandProcessingResult payLoanCharge(Long loanId, Long loanChargeId, JsonCommand command, boolean isChargeIdIncludedInJson); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 3630ee441..8850bf460 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -135,7 +135,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanOverdueInstallmentCh import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; @@ -143,7 +143,16 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanTrancheDisbursementC import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; -import org.apache.fineract.portfolio.loanaccount.exception.*; +import org.apache.fineract.portfolio.loanaccount.exception.DateMismatchException; +import org.apache.fineract.portfolio.loanaccount.exception.ExceedingTrancheCountException; +import org.apache.fineract.portfolio.loanaccount.exception.InvalidPaidInAdvanceAmountException; +import org.apache.fineract.portfolio.loanaccount.exception.LoanDisbursalException; +import org.apache.fineract.portfolio.loanaccount.exception.LoanForeclosureException; +import org.apache.fineract.portfolio.loanaccount.exception.LoanMultiDisbursementException; +import org.apache.fineract.portfolio.loanaccount.exception.LoanOfficerAssignmentException; +import org.apache.fineract.portfolio.loanaccount.exception.LoanOfficerUnassignmentException; +import org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionNotFoundException; +import org.apache.fineract.portfolio.loanaccount.exception.MultiDisbursementDataRequiredException; import org.apache.fineract.portfolio.loanaccount.guarantor.service.GuarantorDomainService; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator; @@ -190,7 +199,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf private final PlatformSecurityContext context; private final LoanEventApiJsonValidator loanEventApiJsonValidator; private final LoanUpdateCommandFromApiJsonDeserializer loanUpdateCommandFromApiJsonDeserializer; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper ; private final LoanAccountDomainService loanAccountDomainService; private final NoteRepository noteRepository; private final LoanTransactionRepository loanTransactionRepository; @@ -229,7 +238,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf public LoanWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final LoanEventApiJsonValidator loanEventApiJsonValidator, final LoanUpdateCommandFromApiJsonDeserializer loanUpdateCommandFromApiJsonDeserializer, final LoanAssembler loanAssembler, - final LoanRepository loanRepository, final LoanAccountDomainService loanAccountDomainService, + final LoanAccountDomainService loanAccountDomainService, final LoanTransactionRepository loanTransactionRepository, final NoteRepository noteRepository, final ChargeRepositoryWrapper chargeRepository, final LoanChargeRepository loanChargeRepository, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository, @@ -252,11 +261,12 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final BusinessEventNotifierService businessEventNotifierService, final GuarantorDomainService guarantorDomainService, final LoanUtilService loanUtilService, final LoanSummaryWrapper loanSummaryWrapper, final LoanRepaymentScheduleTransactionProcessorFactory transactionProcessingStrategy, - final CodeValueRepositoryWrapper codeValueRepository) { + final CodeValueRepositoryWrapper codeValueRepository, + final LoanRepositoryWrapper loanRepositoryWrapper) { this.context = context; this.loanEventApiJsonValidator = loanEventApiJsonValidator; this.loanAssembler = loanAssembler; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper ; this.loanAccountDomainService = loanAccountDomainService; this.loanTransactionRepository = loanTransactionRepository; this.noteRepository = noteRepository; @@ -360,7 +370,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf if(loan.isTopup() && loan.getClientId() != null){ final Long loanIdToClose = loan.getTopupLoanDetails().getLoanIdToClose(); - final Loan loanToClose = this.loanRepository.findNonClosedLoanThatBelongsToClient(loanIdToClose, loan.getClientId()); + final Loan loanToClose = this.loanRepositoryWrapper.findNonClosedLoanThatBelongsToClient(loanIdToClose, loan.getClientId()); if(loanToClose == null){ throw new GeneralPlatformDomainRuleException("error.msg.loan.to.be.closed.with.topup.is.not.active", "Loan to be closed with this topup is not active."); @@ -545,7 +555,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf this.repaymentScheduleInstallmentRepository.save(installment); } } - this.loanRepository.saveAndFlush(loan); + this.loanRepositoryWrapper.saveAndFlush(loan); } catch (final DataIntegrityViolationException e) { final Throwable realCause = e.getCause(); final List dataValidationErrors = new ArrayList<>(); @@ -566,7 +576,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf this.repaymentScheduleInstallmentRepository.save(installment); } } - this.loanRepository.save(loan); + this.loanRepositoryWrapper.save(loan); } catch (final DataIntegrityViolationException e) { final Throwable realCause = e.getCause(); final List dataValidationErrors = new ArrayList<>(); @@ -814,8 +824,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final boolean allowTransactionsOnHoliday = this.configurationDomainService.allowTransactionsOnHolidayEnabled(); for (final SingleRepaymentCommand singleLoanRepaymentCommand : repaymentCommand) { if (singleLoanRepaymentCommand != null) { - Loan loans = this.loanRepository.findOne(singleLoanRepaymentCommand.getLoanId()); - final List holidays = this.holidayRepository.findByOfficeIdAndGreaterThanDate(loans.getOfficeId(), + Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(singleLoanRepaymentCommand.getLoanId()); + final List holidays = this.holidayRepository.findByOfficeIdAndGreaterThanDate(loan.getOfficeId(), singleLoanRepaymentCommand.getTransactionDate().toDate()); final WorkingDays workingDays = this.workingDaysRepository.findOne(); final boolean allowTransactionsOnNonWorkingDay = this.configurationDomainService.allowTransactionsOnNonWorkingDayEnabled(); @@ -823,9 +833,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf isHolidayEnabled = this.configurationDomainService.isRescheduleRepaymentsOnHolidaysEnabled(); holidayDetailDTO = new HolidayDetailDTO(isHolidayEnabled, holidays, workingDays, allowTransactionsOnHoliday, allowTransactionsOnNonWorkingDay); - loans.validateRepaymentDateIsOnHoliday(singleLoanRepaymentCommand.getTransactionDate(), + loan.validateRepaymentDateIsOnHoliday(singleLoanRepaymentCommand.getTransactionDate(), holidayDetailDTO.isAllowTransactionsOnHoliday(), holidayDetailDTO.getHolidays()); - loans.validateRepaymentDateIsOnNonWorkingDay(singleLoanRepaymentCommand.getTransactionDate(), + loan.validateRepaymentDateIsOnNonWorkingDay(singleLoanRepaymentCommand.getTransactionDate(), holidayDetailDTO.getWorkingDays(), holidayDetailDTO.isAllowTransactionsOnNonWorkingDay()); isHolidayValidationDone = true; break; @@ -962,7 +972,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf } Collection transactionIds = new ArrayList<>(); - for (LoanTransaction transaction : loan.getLoanTransactions()) { + List transactions = loan.getLoanTransactions() ; + for (LoanTransaction transaction : transactions) { if (transaction.isRefund() && transaction.isNotReversed()) { transactionIds.add(transaction.getId()); } @@ -1277,7 +1288,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf .build(); } - private void validateAddingNewChargeAllowed(Set loanDisburseDetails) { + private void validateAddingNewChargeAllowed(List loanDisburseDetails) { boolean pendingDisbursementAvailable = false; for (LoanDisbursementDetails disbursementDetail : loanDisburseDetails) { if (disbursementDetail.actualDisbursementDate() == null) { @@ -1299,7 +1310,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final Loan loan = this.loanAssembler.assembleFrom(loanId); checkClientOrGroupActive(loan); - Set loanDisburseDetails = loan.getDisbursementDetails(); + List loanDisburseDetails = loan.getDisbursementDetails(); final Long chargeDefinitionId = command.longValueOfParameterNamed("chargeId"); final Charge chargeDefinition = this.chargeRepository.findOneWithNotFoundDetection(chargeDefinitionId); @@ -1823,11 +1834,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf @Transactional @Override - public LoanTransaction initiateLoanTransfer(final Long accountId, final LocalDate transferDate) { + public LoanTransaction initiateLoanTransfer(final Loan loan, final LocalDate transferDate) { AppUser currentUser = getAppUserIfPresent(); - - final Loan loan = this.loanAssembler.assembleFrom(accountId); + this.loanAssembler.setHelpers(loan); checkClientOrGroupActive(loan); this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_INITIATE_TRANSFER, constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); @@ -1851,12 +1861,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf @Transactional @Override - public LoanTransaction acceptLoanTransfer(final Long accountId, final LocalDate transferDate, final Office acceptedInOffice, + public LoanTransaction acceptLoanTransfer(final Loan loan, final LocalDate transferDate, final Office acceptedInOffice, final Staff loanOfficer) { - AppUser currentUser = getAppUserIfPresent(); - - final Loan loan = this.loanAssembler.assembleFrom(accountId); + this.loanAssembler.setHelpers(loan) ; this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_ACCEPT_TRANSFER, constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); final List existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); @@ -1886,11 +1894,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf @Transactional @Override - public LoanTransaction withdrawLoanTransfer(final Long accountId, final LocalDate transferDate) { - + public LoanTransaction withdrawLoanTransfer(final Loan loan, final LocalDate transferDate) { AppUser currentUser = getAppUserIfPresent(); - - final Loan loan = this.loanAssembler.assembleFrom(accountId); + this.loanAssembler.setHelpers(loan); this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_WITHDRAW_TRANSFER, constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); @@ -1914,8 +1920,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf @Transactional @Override - public void rejectLoanTransfer(final Long accountId) { - final Loan loan = this.loanAssembler.assembleFrom(accountId); + public void rejectLoanTransfer(final Loan loan) { + this.loanAssembler.setHelpers(loan); this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_REJECT_TRANSFER, constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); loan.setLoanStatus(LoanStatus.TRANSFER_ON_HOLD.getValue()); @@ -1988,7 +1994,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf this.businessEventNotifierService.notifyBusinessEventWasExecuted(BUSINESS_EVENTS.LOAN_REASSIGN_OFFICER, constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); } - this.loanRepository.flush(); + this.loanRepositoryWrapper.flush(); return new CommandProcessingResultBuilder() // .withCommandId(command.commandId()) // @@ -2070,7 +2076,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf loanIds.add(calendarInstance.getEntityId()); } - final List loans = this.loanRepository.findByIdsAndLoanStatusAndLoanType(loanIds, loanStatuses, loanTypes); + final List loans = this.loanRepositoryWrapper.findByIdsAndLoanStatusAndLoanType(loanIds, loanStatuses, loanTypes); List holidays = null; final LocalDate recalculateFrom = null; // loop through each loan to reschedule the repayment dates @@ -2116,19 +2122,19 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final List loansToUpdate; if (loan.isGroupLoan()) { if (loan.loanProduct().isIncludeInBorrowerCycle()) { - loansToUpdate = this.loanRepository.getGroupLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(), loan.getGroupId(), + loansToUpdate = this.loanRepositoryWrapper.getGroupLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(), loan.getGroupId(), AccountType.GROUP.getValue()); } else { - loansToUpdate = this.loanRepository.getGroupLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(), + loansToUpdate = this.loanRepositoryWrapper.getGroupLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(), loan.getGroupId(), AccountType.GROUP.getValue()); } } else { if (loan.loanProduct().isIncludeInBorrowerCycle()) { - loansToUpdate = this.loanRepository + loansToUpdate = this.loanRepositoryWrapper .getClientOrJLGLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(), loan.getClientId()); } else { - loansToUpdate = this.loanRepository.getClientLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(), + loansToUpdate = this.loanRepositoryWrapper.getClientLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(), loan.getClientId()); } @@ -2144,13 +2150,13 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf private void updateLoanCounters(final Loan loan, final LocalDate actualDisbursementDate) { if (loan.isGroupLoan()) { - final List loansToUpdateForLoanCounter = this.loanRepository.getGroupLoansDisbursedAfter(actualDisbursementDate.toDate(), + final List loansToUpdateForLoanCounter = this.loanRepositoryWrapper.getGroupLoansDisbursedAfter(actualDisbursementDate.toDate(), loan.getGroupId(), AccountType.GROUP.getValue()); final Integer newLoanCounter = getNewGroupLoanCounter(loan); final Integer newLoanProductCounter = getNewGroupLoanProductCounter(loan); updateLoanCounter(loan, loansToUpdateForLoanCounter, newLoanCounter, newLoanProductCounter); } else { - final List loansToUpdateForLoanCounter = this.loanRepository.getClientOrJLGLoansDisbursedAfter( + final List loansToUpdateForLoanCounter = this.loanRepositoryWrapper.getClientOrJLGLoansDisbursedAfter( actualDisbursementDate.toDate(), loan.getClientId()); final Integer newLoanCounter = getNewClientOrJLGLoanCounter(loan); final Integer newLoanProductCounter = getNewClientOrJLGLoanProductCounter(loan); @@ -2160,7 +2166,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf private Integer getNewGroupLoanCounter(final Loan loan) { - Integer maxClientLoanCounter = this.loanRepository.getMaxGroupLoanCounter(loan.getGroupId(), AccountType.GROUP.getValue()); + Integer maxClientLoanCounter = this.loanRepositoryWrapper.getMaxGroupLoanCounter(loan.getGroupId(), AccountType.GROUP.getValue()); if (maxClientLoanCounter == null) { maxClientLoanCounter = 1; } else { @@ -2171,7 +2177,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf private Integer getNewGroupLoanProductCounter(final Loan loan) { - Integer maxLoanProductLoanCounter = this.loanRepository.getMaxGroupLoanProductCounter(loan.loanProduct().getId(), + Integer maxLoanProductLoanCounter = this.loanRepositoryWrapper.getMaxGroupLoanProductCounter(loan.loanProduct().getId(), loan.getGroupId(), AccountType.GROUP.getValue()); if (maxLoanProductLoanCounter == null) { maxLoanProductLoanCounter = 1; @@ -2211,12 +2217,12 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf loan.updateClientLoanCounter(null); } loan.updateLoanProductLoanCounter(newLoanProductCounter); - this.loanRepository.save(loansToUpdateForLoanCounter); + this.loanRepositoryWrapper.save(loansToUpdateForLoanCounter); } private Integer getNewClientOrJLGLoanCounter(final Loan loan) { - Integer maxClientLoanCounter = this.loanRepository.getMaxClientOrJLGLoanCounter(loan.getClientId()); + Integer maxClientLoanCounter = this.loanRepositoryWrapper.getMaxClientOrJLGLoanCounter(loan.getClientId()); if (maxClientLoanCounter == null) { maxClientLoanCounter = 1; } else { @@ -2227,7 +2233,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf private Integer getNewClientOrJLGLoanProductCounter(final Loan loan) { - Integer maxLoanProductLoanCounter = this.loanRepository.getMaxClientOrJLGLoanProductCounter(loan.loanProduct().getId(), + Integer maxLoanProductLoanCounter = this.loanRepositoryWrapper.getMaxClientOrJLGLoanProductCounter(loan.loanProduct().getId(), loan.getClientId()); if (maxLoanProductLoanCounter == null) { maxLoanProductLoanCounter = 1; @@ -2256,7 +2262,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf } } } - this.loanRepository.save(loansToUpdate); + this.loanRepositoryWrapper.save(loansToUpdate); } @Transactional @@ -2285,17 +2291,17 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf // get all loans final List loans = new ArrayList<>(); // get all individual and jlg loans - loans.addAll(this.loanRepository.findByClientOfficeIdsAndLoanStatus(officeIds, loanStatuses)); + loans.addAll(this.loanRepositoryWrapper.findByClientOfficeIdsAndLoanStatus(officeIds, loanStatuses)); // FIXME: AA optimize to get all client and group loans belongs to a // office id // get all group loans - loans.addAll(this.loanRepository.findByGroupOfficeIdsAndLoanStatus(officeIds, loanStatuses)); + loans.addAll(this.loanRepositoryWrapper.findByGroupOfficeIdsAndLoanStatus(officeIds, loanStatuses)); for (final Loan loan : loans) { // apply holiday loan.applyHolidayToRepaymentScheduleDates(holiday); } - this.loanRepository.save(loans); + this.loanRepositoryWrapper.save(loans); holiday.processed(); } this.holidayRepository.save(holidays); @@ -2307,10 +2313,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final Long productId = loan.loanProduct().getId(); if (loan.isGroupLoan()) { - activeLoansLoanProductIds = this.loanRepository.findActiveLoansLoanProductIdsByGroup(loan.getGroupId(), + activeLoansLoanProductIds = this.loanRepositoryWrapper.findActiveLoansLoanProductIdsByGroup(loan.getGroupId(), LoanStatus.ACTIVE.getValue()); } else { - activeLoansLoanProductIds = this.loanRepository.findActiveLoansLoanProductIdsByClient(loan.getClientId(), + activeLoansLoanProductIds = this.loanRepositoryWrapper.findActiveLoansLoanProductIdsByClient(loan.getClientId(), LoanStatus.ACTIVE.getValue()); } checkForProductMixRestrictions(activeLoansLoanProductIds, productId, loan.loanProduct().productName()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java index 723de309a..6e0ab74b3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java @@ -28,7 +28,6 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityAccessType; -import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityType; import org.apache.fineract.infrastructure.entityaccess.service.FineractEntityAccessUtil; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.charge.domain.Charge; @@ -38,7 +37,7 @@ import org.apache.fineract.portfolio.floatingrates.domain.FloatingRateRepository import org.apache.fineract.portfolio.fund.domain.Fund; import org.apache.fineract.portfolio.fund.domain.FundRepository; import org.apache.fineract.portfolio.fund.exception.FundNotFoundException; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionProcessingStrategyRepository; import org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionProcessingStrategyNotFoundException; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator; @@ -75,7 +74,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro private final ProductToGLAccountMappingWritePlatformService accountMappingWritePlatformService; private final FineractEntityAccessUtil fineractEntityAccessUtil; private final FloatingRateRepositoryWrapper floatingRateRepository; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; @Autowired public LoanProductWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, @@ -86,7 +85,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro final ProductToGLAccountMappingWritePlatformService accountMappingWritePlatformService, final FineractEntityAccessUtil fineractEntityAccessUtil, final FloatingRateRepositoryWrapper floatingRateRepository, - final LoanRepository loanRepository) { + final LoanRepositoryWrapper loanRepositoryWrapper) { this.context = context; this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.loanProductRepository = loanProductRepository; @@ -97,7 +96,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro this.accountMappingWritePlatformService = accountMappingWritePlatformService; this.fineractEntityAccessUtil = fineractEntityAccessUtil; this.floatingRateRepository = floatingRateRepository; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; } @Transactional @@ -182,7 +181,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro validateInputDates(command); if(anyChangeInCriticalFloatingRateLinkedParams(command, product) - && this.loanRepository.doNonClosedLoanAccountsExistForProduct(product.getId())){ + && this.loanRepositoryWrapper.doNonClosedLoanAccountsExistForProduct(product.getId())){ throw new LoanProductCannotBeModifiedDueToNonClosedLoansException(product.getId()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java index 5ed8e10e9..495c3c6ee 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java @@ -37,7 +37,6 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; -import org.apache.fineract.portfolio.calendar.data.CalendarData; import org.apache.fineract.portfolio.calendar.domain.Calendar; import org.apache.fineract.portfolio.calendar.domain.CalendarEntityType; import org.apache.fineract.portfolio.calendar.domain.CalendarInstance; @@ -45,9 +44,8 @@ import org.apache.fineract.portfolio.calendar.domain.CalendarInstanceRepository; import org.apache.fineract.portfolio.calendar.domain.CalendarRepository; import org.apache.fineract.portfolio.calendar.exception.CalendarInstanceNotFoundException; import org.apache.fineract.portfolio.calendar.exception.CalendarNotFoundException; -import org.apache.fineract.portfolio.calendar.service.CalendarReadPlatformService; import org.apache.fineract.portfolio.client.domain.Client; -import org.apache.fineract.portfolio.client.domain.ClientRepository; +import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.portfolio.group.domain.Group; import org.apache.fineract.portfolio.group.domain.GroupRepository; import org.apache.fineract.portfolio.group.exception.ClientNotInGroupException; @@ -73,28 +71,26 @@ public class MeetingWritePlatformServiceJpaRepositoryImpl implements MeetingWrit private final MeetingDataValidator meetingDataValidator; private final CalendarInstanceRepository calendarInstanceRepository; private final CalendarRepository calendarRepository; - private final ClientRepository clientRepository; + private final ClientRepositoryWrapper clientRepositoryWrapper; private final GroupRepository groupRepository; private final FromJsonHelper fromApiJsonHelper; private final ConfigurationDomainService configurationDomainService; - private final CalendarReadPlatformService calendarReadPlatformService; @Autowired public MeetingWritePlatformServiceJpaRepositoryImpl(final MeetingRepositoryWrapper meetingRepositoryWrapper, final MeetingRepository meetingRepository, final MeetingDataValidator meetingDataValidator, final CalendarInstanceRepository calendarInstanceRepository, final CalendarRepository calendarRepository, - final ClientRepository clientRepository, final GroupRepository groupRepository, final FromJsonHelper fromApiJsonHelper, - final ConfigurationDomainService configurationDomainService, final CalendarReadPlatformService calendarReadPlatformService) { + final ClientRepositoryWrapper clientRepositoryWrapper, final GroupRepository groupRepository, final FromJsonHelper fromApiJsonHelper, + final ConfigurationDomainService configurationDomainService) { this.meetingRepositoryWrapper = meetingRepositoryWrapper; this.meetingRepository = meetingRepository; this.meetingDataValidator = meetingDataValidator; this.calendarInstanceRepository = calendarInstanceRepository; this.calendarRepository = calendarRepository; - this.clientRepository = clientRepository; + this.clientRepositoryWrapper = clientRepositoryWrapper; this.groupRepository = groupRepository; this.fromApiJsonHelper = fromApiJsonHelper; this.configurationDomainService = configurationDomainService; - this.calendarReadPlatformService = calendarReadPlatformService; } @Override @@ -203,7 +199,7 @@ public class MeetingWritePlatformServiceJpaRepositoryImpl implements MeetingWrit final Integer attendanceTypeId = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(attendanceTypeParamName, attendanceElement); - final Client client = this.clientRepository.findOne(clientId); + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId, true); if (meeting.isGroupEntity() && !client.isChildOfGroup(meeting.entityId())) { throw new ClientNotInGroupException(clientId, meeting.entityId()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java index ec77f8257..b570034a9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java @@ -31,7 +31,7 @@ import org.apache.fineract.portfolio.group.domain.Group; import org.apache.fineract.portfolio.group.domain.GroupRepository; import org.apache.fineract.portfolio.group.exception.GroupNotFoundException; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; @@ -51,14 +51,13 @@ public class NoteWritePlatformServiceJpaRepositoryImpl implements NoteWritePlatf private final NoteRepository noteRepository; private final ClientRepositoryWrapper clientRepository; private final GroupRepository groupRepository; - // private final SavingAccountRepository savingAccountRepository; - private final LoanRepository loanRepository; + private final LoanRepositoryWrapper loanRepository; private final LoanTransactionRepository loanTransactionRepository; private final NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer; @Autowired public NoteWritePlatformServiceJpaRepositoryImpl(final NoteRepository noteRepository, final ClientRepositoryWrapper clientRepository, - final GroupRepository groupRepository, final LoanRepository loanRepository, + final GroupRepository groupRepository, final LoanRepositoryWrapper loanRepository, final LoanTransactionRepository loanTransactionRepository, final NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer) { this.noteRepository = noteRepository; this.clientRepository = clientRepository; @@ -118,9 +117,7 @@ public class NoteWritePlatformServiceJpaRepositoryImpl implements NoteWritePlatf final Long resourceId = command.getLoanId(); - final Loan loan = this.loanRepository.findOne(resourceId); - if (loan == null) { throw new LoanNotFoundException(resourceId); } - + final Loan loan = this.loanRepository.findOneWithNotFoundDetection(resourceId); final String note = command.stringValueOfParameterNamed("note"); final Note newNote = Note.loanNote(loan, note); @@ -291,10 +288,8 @@ public class NoteWritePlatformServiceJpaRepositoryImpl implements NoteWritePlatf final NoteType type = NoteType.LOAN; - final Loan loan = this.loanRepository.findOne(resourceId); - if (loan == null) { throw new LoanNotFoundException(resourceId); } + final Loan loan = this.loanRepository.findOneWithNotFoundDetection(resourceId); final Note noteForUpdate = this.noteRepository.findByLoanIdAndId(resourceId, noteId); - if (noteForUpdate == null) { throw new NoteNotFoundException(noteId, resourceId, type.name().toLowerCase()); } final Map changes = noteForUpdate.update(command); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataDTO.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataDTO.java index c7506d32a..6b213b862 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataDTO.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataDTO.java @@ -20,7 +20,6 @@ package org.apache.fineract.portfolio.savings.data; import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.group.domain.Group; -import org.apache.fineract.portfolio.savings.domain.SavingsProduct; import org.apache.fineract.useradministration.domain.AppUser; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormatter; @@ -29,16 +28,16 @@ public class SavingsAccountDataDTO { private final Client client; private final Group group; - private final SavingsProduct savingsProduct; + private final Long savingsProductId; private final LocalDate applicationDate; private final AppUser appliedBy; private final DateTimeFormatter fmt; - public SavingsAccountDataDTO(final Client client, final Group group, final SavingsProduct savingsProduct, + public SavingsAccountDataDTO(final Client client, final Group group, final Long savingsProductId, final LocalDate applicationDate, final AppUser appliedBy, final DateTimeFormatter fmt) { this.client = client; this.group = group; - this.savingsProduct = savingsProduct; + this.savingsProductId = savingsProductId; this.applicationDate = applicationDate; this.appliedBy = appliedBy; this.fmt = fmt; @@ -52,8 +51,8 @@ public class SavingsAccountDataDTO { return this.group; } - public SavingsProduct getSavingsProduct() { - return this.savingsProduct; + public Long getSavingsProduct() { + return this.savingsProductId; } public LocalDate getApplicationDate() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java index 2cffa6b7a..efc2e5853 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java @@ -177,7 +177,8 @@ public class DepositAccountAssembler { AccountType accountType = AccountType.INVALID; final Long clientId = this.fromApiJsonHelper.extractLongNamed(clientIdParamName, element); if (clientId != null) { - client = this.clientRepository.findOneWithNotFoundDetection(clientId); + final boolean isCalendarInherited = command.booleanPrimitiveValueOfParameterNamed(isCalendarInheritedParamName); + client = this.clientRepository.findOneWithNotFoundDetection(clientId, isCalendarInherited); //we need group collection if isCalendarInherited is true accountType = AccountType.INDIVIDUAL; if (client.isNotActive()) { throw new ClientNotActiveException(clientId); } } 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 295402756..f28fe6a5c 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 @@ -30,7 +30,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; -import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -89,13 +88,9 @@ public class RecurringDepositAccount extends SavingsAccount { @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "account") private DepositAccountInterestRateChart chart; - @OneToMany(cascade = CascadeType.ALL, mappedBy = "account", orphanRemoval = true, fetch=FetchType.EAGER) - private Set depositScheduleInstallments = new HashSet<>(); + @OneToMany(cascade = CascadeType.ALL, mappedBy = "account", orphanRemoval = true, fetch=FetchType.LAZY) + private List depositScheduleInstallments = new ArrayList<>(); - private transient List sortedDepositInstallments = null ; - - private transient boolean isDepositScheduleInstallmentDirty = false ; - protected RecurringDepositAccount() { // } @@ -1127,7 +1122,6 @@ public class RecurringDepositAccount extends SavingsAccount { public void generateSchedule(final PeriodFrequencyType frequency, final Integer recurringEvery, final Calendar calendar) { this.depositScheduleInstallments.clear(); - this.isDepositScheduleInstallmentDirty = true ; LocalDate installmentDate = null; if (this.isCalendarInherited()) { installmentDate = CalendarUtils.getNextScheduleDate(calendar, accountSubmittedOrActivationDate()); @@ -1159,17 +1153,11 @@ public class RecurringDepositAccount extends SavingsAccount { } private List depositScheduleInstallments() { - if(this.isDepositScheduleInstallmentDirty || this.sortedDepositInstallments == null) { - this.sortedDepositInstallments = new ArrayList<>(this.depositScheduleInstallments) ; - this.sortedDepositInstallments.sort(new RecurringDepositScheduleInstallmentComparator()); - this.isDepositScheduleInstallmentDirty = false ; - } - return this.sortedDepositInstallments ; + return this.depositScheduleInstallments ; } private void addDepositScheduleInstallment(final RecurringDepositScheduleInstallment installment) { this.depositScheduleInstallments.add(installment) ; - isDepositScheduleInstallmentDirty = true ; } public boolean isCalendarInherited() { @@ -1220,4 +1208,10 @@ public class RecurringDepositAccount extends SavingsAccount { return comparsion ; } } + + @Override + public void loadLazyCollections() { + this.depositScheduleInstallments.size() ; + super.loadLazyCollections(); + } } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java index ad0809e3c..3af57f5d7 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java @@ -292,18 +292,14 @@ public class SavingsAccount extends AbstractPersistable { protected SavingsAccountSummary summary; @OrderBy(value = "dateOf, createdDate, id") - @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.EAGER) - protected final Set transactions = new HashSet<>(); + @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.LAZY) + protected final List transactions = new ArrayList<>(); - private transient List orderedTransactions = null ; - - private transient boolean isTransactionsDirty = false ; - - @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.EAGER) + @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.LAZY) protected Set charges = new HashSet<>(); - @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.EAGER) - private Set savingsOfficerHistory; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.LAZY) + private Set savingsOfficerHistory = new HashSet<>(); @Transient protected boolean accountNumberRequiresAutoGeneration = false; @@ -419,7 +415,7 @@ public class SavingsAccount extends AbstractPersistable { this.enforceMinRequiredBalance = enforceMinRequiredBalance; this.minRequiredBalance = minRequiredBalance; this.minBalanceForInterestCalculation = product.minBalanceForInterestCalculation(); - this.savingsOfficerHistory = null; + //this.savingsOfficerHistory = null; this.withHoldTax = withHoldTax; this.taxGroup = product.getTaxGroup(); } @@ -2266,17 +2262,11 @@ public class SavingsAccount extends AbstractPersistable { } public List getTransactions() { - if(this.orderedTransactions == null || isTransactionsDirty) { - this.orderedTransactions = new ArrayList<>(this.transactions) ; - this.orderedTransactions.sort(new SavingsAccountTransactionComparator()); - this.isTransactionsDirty = false ; - } - return orderedTransactions; + return this.transactions; } public void addTransaction(final SavingsAccountTransaction transaction) { this.transactions.add(transaction); - this.isTransactionsDirty = true ; } public void setStatus(final Integer status) { @@ -2800,4 +2790,10 @@ public class SavingsAccount extends AbstractPersistable { recalculateDailyBalances(Money.zero(this.currency), transactionDate); this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, this.transactions); } + + public void loadLazyCollections() { + transactions.size(); + charges.size(); + savingsOfficerHistory.size(); + } } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java index c26bb5293..97ea3c6a1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java @@ -309,7 +309,7 @@ public class SavingsAccountAssembler { * request inheriting details where relevant from chosen * {@link SavingsProduct}. */ - public SavingsAccount assembleFrom(final Client client, final Group group, final SavingsProduct product, final LocalDate appliedonDate, + public SavingsAccount assembleFrom(final Client client, final Group group, final Long productId, final LocalDate appliedonDate, final AppUser appliedBy) { AccountType accountType = AccountType.INVALID; @@ -330,7 +330,7 @@ public class SavingsAccountAssembler { if (!group.hasClientAsMember(client)) { throw new ClientNotInGroupException(client.getId(), group.getId()); } accountType = AccountType.JLG; } - + final SavingsProduct product = this.savingProductRepository.findOne(productId) ; final Set charges = this.savingsAccountChargeAssembler.fromSavingsProduct(product); final SavingsAccount account = SavingsAccount.createNewApplicationForSubmittal(client, group, product, null, null, null, accountType, appliedonDate, appliedBy, product.nominalAnnualInterestRate(), product.interestCompoundingPeriodType(), diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java index b614b259e..5a28d6627 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java @@ -25,6 +25,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +//Use SavingsAccountRepositoryWrapper. public interface SavingsAccountRepository extends JpaRepository, JpaSpecificationExecutor { @Query("from SavingsAccount s_acc where s_acc.client.id = :clientId") diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepositoryWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepositoryWrapper.java index e1a7a58e8..97427593b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepositoryWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepositoryWrapper.java @@ -18,10 +18,14 @@ */ package org.apache.fineract.portfolio.savings.domain; +import java.util.List; + import org.apache.fineract.portfolio.savings.DepositAccountType; import org.apache.fineract.portfolio.savings.exception.SavingsAccountNotFoundException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** *

@@ -38,6 +42,7 @@ import org.springframework.stereotype.Service; @Service public class SavingsAccountRepositoryWrapper { + private final SavingsAccountRepository repository; @Autowired @@ -45,27 +50,72 @@ public class SavingsAccountRepositoryWrapper { this.repository = repository; } + @Transactional(readOnly=true) public SavingsAccount findOneWithNotFoundDetection(final Long savingsId) { final SavingsAccount account = this.repository.findOne(savingsId); if (account == null) { throw new SavingsAccountNotFoundException(savingsId); } + account.loadLazyCollections(); return account; } + @Transactional(readOnly=true) public SavingsAccount findOneWithNotFoundDetection(final Long savingsId, final DepositAccountType depositAccountType) { final SavingsAccount account = this.repository.findByIdAndDepositAccountType(savingsId, depositAccountType.getValue()); if (account == null) { throw new SavingsAccountNotFoundException(savingsId); } + account.loadLazyCollections(); return account; } - public void save(final SavingsAccount account) { - this.repository.save(account); + @Transactional(readOnly=true) + public List findSavingAccountByClientId(@Param("clientId") Long clientId) { + List accounts = this.repository.findSavingAccountByClientId(clientId) ; + loadLazyCollections(accounts); + return accounts ; + } + + @Transactional(readOnly=true) + public List findSavingAccountByStatus(@Param("status") Integer status) { + List accounts = this.repository.findSavingAccountByStatus(status) ; + loadLazyCollections(accounts); + return accounts ; + } + + //Root Entities are enough + public List findByClientIdAndGroupId(@Param("clientId") Long clientId, @Param("groupId") Long groupId) { + return this.repository.findByClientIdAndGroupId(clientId, groupId) ; + } + + public boolean doNonClosedSavingAccountsExistForClient(@Param("clientId") Long clientId) { + return this.repository.doNonClosedSavingAccountsExistForClient(clientId) ; + } + + //Root Entities are enough + public List findByGroupId(@Param("groupId") Long groupId) { + return this.repository.findByGroupId(groupId) ; + } + + //Root Entity is enough + public SavingsAccount findNonClosedAccountByAccountNumber(@Param("accountNumber") String accountNumber) { + return this.repository.findNonClosedAccountByAccountNumber(accountNumber) ; + } + + public SavingsAccount save(final SavingsAccount account) { + return this.repository.save(account); } public void delete(final SavingsAccount account) { this.repository.delete(account); } - public void saveAndFlush(final SavingsAccount account) { - this.repository.saveAndFlush(account); + public SavingsAccount saveAndFlush(final SavingsAccount account) { + return this.repository.saveAndFlush(account); + } + + private void loadLazyCollections(final List accounts) { + if(accounts != null && accounts.size() >0) { + for(SavingsAccount account: accounts) { + account.loadLazyCollections(); + } + } } } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSummary.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSummary.java index ea902d464..735016d85 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSummary.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSummary.java @@ -21,7 +21,6 @@ package org.apache.fineract.portfolio.savings.domain; import java.math.BigDecimal; import java.util.Date; import java.util.List; -import java.util.Set; import javax.persistence.Column; import javax.persistence.Embeddable; @@ -91,7 +90,7 @@ public final class SavingsAccountSummary { } public void updateSummary(final MonetaryCurrency currency, final SavingsAccountTransactionSummaryWrapper wrapper, - final Set transactions) { + final List transactions) { this.totalDeposits = wrapper.calculateTotalDeposits(currency, transactions); this.totalWithdrawals = wrapper.calculateTotalWithdrawals(currency, transactions); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java index 0aceb2bc3..6f7ffe62f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java @@ -19,7 +19,7 @@ package org.apache.fineract.portfolio.savings.domain; import java.math.BigDecimal; -import java.util.Set; +import java.util.List; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; @@ -32,7 +32,7 @@ import org.springframework.stereotype.Component; @Component public final class SavingsAccountTransactionSummaryWrapper { - public BigDecimal calculateTotalDeposits(final MonetaryCurrency currency, final Set transactions) { + public BigDecimal calculateTotalDeposits(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isDepositAndNotReversed() || transaction.isDividendPayoutAndNotReversed()) { @@ -42,7 +42,7 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalWithdrawals(final MonetaryCurrency currency, final Set transactions) { + public BigDecimal calculateTotalWithdrawals(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isWithdrawal() && transaction.isNotReversed()) { @@ -52,7 +52,7 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalInterestPosted(final MonetaryCurrency currency, final Set transactions) { + public BigDecimal calculateTotalInterestPosted(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isInterestPostingAndNotReversed() && transaction.isNotReversed()) { @@ -62,7 +62,7 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalWithdrawalFees(final MonetaryCurrency currency, final Set transactions) { + public BigDecimal calculateTotalWithdrawalFees(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isWithdrawalFeeAndNotReversed() && transaction.isNotReversed()) { @@ -72,7 +72,7 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalAnnualFees(final MonetaryCurrency currency, final Set transactions) { + public BigDecimal calculateTotalAnnualFees(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isAnnualFeeAndNotReversed() && transaction.isNotReversed()) { @@ -82,7 +82,7 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalFeesCharge(final MonetaryCurrency currency, final Set transactions) { + public BigDecimal calculateTotalFeesCharge(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isFeeChargeAndNotReversed()) { @@ -92,7 +92,7 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalFeesChargeWaived(final MonetaryCurrency currency, final Set transactions) { + public BigDecimal calculateTotalFeesChargeWaived(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isWaiveFeeChargeAndNotReversed()) { @@ -102,7 +102,7 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalPenaltyCharge(final MonetaryCurrency currency, final Set transactions) { + public BigDecimal calculateTotalPenaltyCharge(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isPenaltyChargeAndNotReversed()) { @@ -112,7 +112,7 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalPenaltyChargeWaived(final MonetaryCurrency currency, final Set transactions) { + public BigDecimal calculateTotalPenaltyChargeWaived(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isWaivePenaltyChargeAndNotReversed()) { @@ -122,7 +122,7 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalOverdraftInterest(MonetaryCurrency currency, Set transactions) { + public BigDecimal calculateTotalOverdraftInterest(MonetaryCurrency currency, List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isOverdraftInterestAndNotReversed()) { @@ -131,7 +131,7 @@ public final class SavingsAccountTransactionSummaryWrapper { } return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalWithholdTaxWithdrawal(MonetaryCurrency currency, Set transactions) { + public BigDecimal calculateTotalWithholdTaxWithdrawal(MonetaryCurrency currency, List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { if (transaction.isWithHoldTaxAndNotReversed()) { 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 75ed667b6..5f2834d21 100755 --- 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 @@ -18,6 +18,23 @@ */ package org.apache.fineract.portfolio.savings.service; +import static org.apache.fineract.portfolio.savings.DepositsApiConstants.RECURRING_DEPOSIT_ACCOUNT_RESOURCE_NAME; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.amountParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.chargeIdParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.dueAsOfDateParamName; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + import org.apache.commons.lang.StringUtils; import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; @@ -84,7 +101,7 @@ import org.apache.fineract.portfolio.savings.domain.RecurringDepositAccount; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; import org.apache.fineract.portfolio.savings.domain.SavingsAccountCharge; import org.apache.fineract.portfolio.savings.domain.SavingsAccountChargeRepositoryWrapper; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; +import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepositoryWrapper; import org.apache.fineract.portfolio.savings.domain.SavingsAccountStatusType; import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction; import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransactionRepository; @@ -100,28 +117,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; -import java.math.MathContext; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -import static org.apache.fineract.portfolio.savings.DepositsApiConstants.RECURRING_DEPOSIT_ACCOUNT_RESOURCE_NAME; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.amountParamName; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.chargeIdParamName; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.dueAsOfDateParamName; - @Service public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements DepositAccountWritePlatformService { private final PlatformSecurityContext context; - private final SavingsAccountRepository savingAccountRepository; + private final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper; private final SavingsAccountTransactionRepository savingsAccountTransactionRepository; private final DepositAccountAssembler depositAccountAssembler; private final DepositAccountTransactionDataValidator depositAccountTransactionDataValidator; @@ -146,7 +146,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo @Autowired public DepositAccountWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, - final SavingsAccountRepository savingAccountRepository, + final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper, final SavingsAccountTransactionRepository savingsAccountTransactionRepository, final DepositAccountAssembler depositAccountAssembler, final DepositAccountTransactionDataValidator depositAccountTransactionDataValidator, @@ -165,7 +165,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo final DepositAccountOnHoldTransactionRepository depositAccountOnHoldTransactionRepository) { this.context = context; - this.savingAccountRepository = savingAccountRepository; + this.savingAccountRepositoryWrapper = savingAccountRepositoryWrapper; this.savingsAccountTransactionRepository = savingsAccountTransactionRepository; this.depositAccountAssembler = depositAccountAssembler; this.depositAccountTransactionDataValidator = depositAccountTransactionDataValidator; @@ -256,7 +256,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo depositAccountOnHoldTransactions = this.depositAccountOnHoldTransactionRepository.findBySavingsAccountAndReversedFalseOrderByCreatedDateAsc(account); } account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); } postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); @@ -354,7 +354,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); } postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); @@ -497,7 +497,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); return new CommandProcessingResultBuilder() // .withEntityId(savingsId) // @@ -538,7 +538,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo final MathContext mc = new MathContext(10, MoneyHelper.getRoundingMode()); boolean isInterestTransfer = false; account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } @@ -926,7 +926,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(newTransferTransaction); - this.savingAccountRepository.save(savingsAccount); + this.savingAccountRepositoryWrapper.save(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -959,7 +959,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(withdrawtransferTransaction); - this.savingAccountRepository.save(savingsAccount); + this.savingAccountRepositoryWrapper.save(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -970,7 +970,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo public void rejectSavingsTransfer(final Long accountId, final DepositAccountType depositAccountType) { final SavingsAccount savingsAccount = this.depositAccountAssembler.assembleFrom(accountId, depositAccountType); savingsAccount.setStatus(SavingsAccountStatusType.TRANSFER_ON_HOLD.getValue()); - this.savingAccountRepository.save(savingsAccount); + this.savingAccountRepositoryWrapper.save(savingsAccount); } @Override @@ -1002,7 +1002,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(acceptTransferTransaction); - this.savingAccountRepository.save(savingsAccount); + this.savingAccountRepositoryWrapper.save(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -1053,7 +1053,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo savingsAccount.addCharge(fmt, savingsAccountCharge, chargeDefinition); - this.savingAccountRepository.saveAndFlush(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); return new CommandProcessingResultBuilder() // .withEntityId(savingsAccountCharge.getId()) // @@ -1158,7 +1158,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.waiveChargeTransactionAction,depositAccountOnHoldTransactions); - this.savingAccountRepository.saveAndFlush(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); @@ -1183,7 +1183,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo .findOneWithNotFoundDetection(savingsAccountChargeId, savingsAccountId); savingsAccount.removeCharge(savingsAccountCharge); - this.savingAccountRepository.saveAndFlush(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); return new CommandProcessingResultBuilder() // .withEntityId(savingsAccountChargeId) // @@ -1289,7 +1289,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo account.validateAccountBalanceDoesNotBecomeNegative("." + SavingsAccountTransactionType.PAY_CHARGE.getCode(),depositAccountOnHoldTransactions); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformService.java index d428d4294..c8bf5789d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformService.java @@ -49,13 +49,13 @@ public interface SavingsAccountWritePlatformService { CommandProcessingResult close(Long savingsId, JsonCommand command); - SavingsAccountTransaction initiateSavingsTransfer(Long accountId, LocalDate transferDate); + SavingsAccountTransaction initiateSavingsTransfer(SavingsAccount account, LocalDate transferDate); - SavingsAccountTransaction withdrawSavingsTransfer(Long accountId, LocalDate transferDate); + SavingsAccountTransaction withdrawSavingsTransfer(SavingsAccount account, LocalDate transferDate); - void rejectSavingsTransfer(Long accountId); + void rejectSavingsTransfer(SavingsAccount account); - SavingsAccountTransaction acceptSavingsTransfer(Long accountId, LocalDate transferDate, Office acceptedInOffice, Staff staff); + SavingsAccountTransaction acceptSavingsTransfer(SavingsAccount account, LocalDate transferDate, Office acceptedInOffice, Staff staff); CommandProcessingResult addSavingsAccountCharge(JsonCommand command); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java index 9fe5f17be..30ce57b30 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java @@ -91,7 +91,6 @@ import org.apache.fineract.portfolio.savings.domain.SavingsAccountAssembler; import org.apache.fineract.portfolio.savings.domain.SavingsAccountCharge; import org.apache.fineract.portfolio.savings.domain.SavingsAccountChargeRepositoryWrapper; import org.apache.fineract.portfolio.savings.domain.SavingsAccountDomainService; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepositoryWrapper; import org.apache.fineract.portfolio.savings.domain.SavingsAccountStatusType; import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction; @@ -115,9 +114,8 @@ import org.springframework.util.CollectionUtils; public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements SavingsAccountWritePlatformService { private final PlatformSecurityContext context; - private final SavingsAccountRepository savingAccountRepository; private final SavingsAccountDataValidator fromApiJsonDeserializer; - private final SavingsAccountRepositoryWrapper savingsRepository; + private final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper; private final StaffRepositoryWrapper staffRepository; private final SavingsAccountTransactionRepository savingsAccountTransactionRepository; private final SavingsAccountAssembler savingAccountAssembler; @@ -141,7 +139,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi @Autowired public SavingsAccountWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, - final SavingsAccountRepository savingAccountRepository, + final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper, final SavingsAccountTransactionRepository savingsAccountTransactionRepository, final SavingsAccountAssembler savingAccountAssembler, final SavingsAccountTransactionDataValidator savingsAccountTransactionDataValidator, @@ -154,13 +152,13 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final HolidayRepositoryWrapper holidayRepository, final WorkingDaysRepositoryWrapper workingDaysRepository, final AccountAssociationsReadPlatformService accountAssociationsReadPlatformService, final ChargeRepositoryWrapper chargeRepository, final SavingsAccountChargeRepositoryWrapper savingsAccountChargeRepository, - final SavingsAccountDataValidator fromApiJsonDeserializer, final SavingsAccountRepositoryWrapper savingsRepository, + final SavingsAccountDataValidator fromApiJsonDeserializer, final StaffRepositoryWrapper staffRepository, final ConfigurationDomainService configurationDomainService, final DepositAccountOnHoldTransactionRepository depositAccountOnHoldTransactionRepository, final AppUserRepositoryWrapper appuserRepository, final StandingInstructionRepository standingInstructionRepository) { this.context = context; - this.savingAccountRepository = savingAccountRepository; + this.savingAccountRepositoryWrapper = savingAccountRepositoryWrapper; this.savingsAccountTransactionRepository = savingsAccountTransactionRepository; this.savingAccountAssembler = savingAccountAssembler; this.savingsAccountTransactionDataValidator = savingsAccountTransactionDataValidator; @@ -177,7 +175,6 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi this.holidayRepository = holidayRepository; this.workingDaysRepository = workingDaysRepository; this.fromApiJsonDeserializer = fromApiJsonDeserializer; - this.savingsRepository = savingsRepository; this.staffRepository = staffRepository; this.configurationDomainService = configurationDomainService; this.depositAccountOnHoldTransactionRepository = depositAccountOnHoldTransactionRepository; @@ -205,7 +202,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); processPostActiveActions(account, fmt, existingTransactionIds, existingReversedTransactionIds); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); } postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); @@ -364,7 +361,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); return new CommandProcessingResultBuilder() // .withEntityId(savingsId) // @@ -416,7 +413,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } } - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } @@ -644,7 +641,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final Map accountChanges = account.close(user, command, DateUtils.getLocalDateOfTenant()); changes.putAll(accountChanges); if (!changes.isEmpty()) { - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); final String noteText = command.stringValueOfParameterNamed("note"); if (StringUtils.isNotBlank(noteText)) { final Note note = Note.savingNote(account, noteText); @@ -668,16 +665,14 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } @Override - public SavingsAccountTransaction initiateSavingsTransfer(final Long accountId, final LocalDate transferDate) { + public SavingsAccountTransaction initiateSavingsTransfer(final SavingsAccount savingsAccount, final LocalDate transferDate) { AppUser user = getAppUserIfPresent(); final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService .isSavingsInterestPostingAtCurrentPeriodEnd(); final Integer financialYearBeginningMonth = this.configurationDomainService.retrieveFinancialYearBeginningMonth(); - - final SavingsAccount savingsAccount = this.savingAccountAssembler.assembleFrom(accountId); - + this.savingAccountAssembler.setHelpers(savingsAccount); final Set existingTransactionIds = new HashSet<>(); final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -692,7 +687,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(newTransferTransaction); - this.savingAccountRepository.save(savingsAccount); + this.savingAccountRepositoryWrapper.save(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -700,16 +695,14 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } @Override - public SavingsAccountTransaction withdrawSavingsTransfer(final Long accountId, final LocalDate transferDate) { + public SavingsAccountTransaction withdrawSavingsTransfer(final SavingsAccount savingsAccount, final LocalDate transferDate) { AppUser user = getAppUserIfPresent(); final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService .isSavingsInterestPostingAtCurrentPeriodEnd(); final Integer financialYearBeginningMonth = this.configurationDomainService.retrieveFinancialYearBeginningMonth(); - - final SavingsAccount savingsAccount = this.savingAccountAssembler.assembleFrom(accountId); - + this.savingAccountAssembler.setHelpers(savingsAccount); final Set existingTransactionIds = new HashSet<>(); final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -724,7 +717,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(withdrawtransferTransaction); - this.savingAccountRepository.save(savingsAccount); + this.savingAccountRepositoryWrapper.save(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -732,14 +725,14 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } @Override - public void rejectSavingsTransfer(final Long accountId) { - final SavingsAccount savingsAccount = this.savingAccountAssembler.assembleFrom(accountId); + public void rejectSavingsTransfer(final SavingsAccount savingsAccount) { + this.savingAccountAssembler.setHelpers(savingsAccount); savingsAccount.setStatus(SavingsAccountStatusType.TRANSFER_ON_HOLD.getValue()); - this.savingAccountRepository.save(savingsAccount); + this.savingAccountRepositoryWrapper.save(savingsAccount); } @Override - public SavingsAccountTransaction acceptSavingsTransfer(final Long accountId, final LocalDate transferDate, + public SavingsAccountTransaction acceptSavingsTransfer(final SavingsAccount savingsAccount, final LocalDate transferDate, final Office acceptedInOffice, final Staff fieldOfficer) { AppUser user = getAppUserIfPresent(); @@ -747,9 +740,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService .isSavingsInterestPostingAtCurrentPeriodEnd(); final Integer financialYearBeginningMonth = this.configurationDomainService.retrieveFinancialYearBeginningMonth(); - - final SavingsAccount savingsAccount = this.savingAccountAssembler.assembleFrom(accountId); - + this.savingAccountAssembler.setHelpers(savingsAccount); final Set existingTransactionIds = new HashSet<>(); final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -767,7 +758,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(acceptTransferTransaction); - this.savingAccountRepository.save(savingsAccount); + this.savingAccountRepositoryWrapper.save(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -825,7 +816,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi savingsAccount.addCharge(fmt, savingsAccountCharge, chargeDefinition); - this.savingAccountRepository.saveAndFlush(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); return new CommandProcessingResultBuilder() // .withEntityId(savingsAccountCharge.getId()) // @@ -931,7 +922,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.waiveChargeTransactionAction, depositAccountOnHoldTransactions); - this.savingAccountRepository.saveAndFlush(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); @@ -956,7 +947,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi savingsAccountChargeId, savingsAccountId); savingsAccount.removeCharge(savingsAccountCharge); - this.savingAccountRepository.saveAndFlush(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); return new CommandProcessingResultBuilder() // .withEntityId(savingsAccountChargeId) // @@ -1063,7 +1054,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi account.validateAccountBalanceDoesNotBecomeNegative("." + SavingsAccountTransactionType.PAY_CHARGE.getCode(), depositAccountOnHoldTransactions); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } @@ -1163,7 +1154,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi Staff toSavingsOfficer = null; this.fromApiJsonDeserializer.validateForAssignSavingsOfficer(command.json()); - final SavingsAccount savingsForUpdate = this.savingsRepository.findOneWithNotFoundDetection(savingsAccountId); + final SavingsAccount savingsForUpdate = this.savingAccountRepositoryWrapper.findOneWithNotFoundDetection(savingsAccountId); final Long fromSavingsOfficerId = command.longValueOfParameterNamed("fromSavingsOfficerId"); final Long toSavingsOfficerId = command.longValueOfParameterNamed("toSavingsOfficerId"); final LocalDate dateOfSavingsOfficerAssignment = command.localDateValueOfParameterNamed("assignmentDate"); @@ -1182,7 +1173,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi savingsForUpdate.reassignSavingsOfficer(toSavingsOfficer, dateOfSavingsOfficerAssignment); - this.savingsRepository.saveAndFlush(savingsForUpdate); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsForUpdate); return new CommandProcessingResultBuilder() // .withCommandId(command.commandId()) // @@ -1202,14 +1193,14 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final Map actualChanges = new LinkedHashMap<>(5); this.fromApiJsonDeserializer.validateForUnAssignSavingsOfficer(command.json()); - final SavingsAccount savingsForUpdate = this.savingsRepository.findOneWithNotFoundDetection(savingsAccountId); + final SavingsAccount savingsForUpdate = this.savingAccountRepositoryWrapper.findOneWithNotFoundDetection(savingsAccountId); if (savingsForUpdate.getSavingsOfficer() == null) { throw new SavingsOfficerUnassignmentException(savingsAccountId); } final LocalDate dateOfSavingsOfficerUnassigned = command.localDateValueOfParameterNamed("unassignedDate"); savingsForUpdate.removeSavingsOfficer(dateOfSavingsOfficerUnassigned); - this.savingsRepository.saveAndFlush(savingsForUpdate); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsForUpdate); actualChanges.put("toSavingsOfficerId", null); @@ -1225,7 +1216,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi @Override public CommandProcessingResult modifyWithHoldTax(Long savingsAccountId, JsonCommand command) { final Map actualChanges = new HashMap<>(1); - final SavingsAccount savingsForUpdate = this.savingsRepository.findOneWithNotFoundDetection(savingsAccountId); + final SavingsAccount savingsForUpdate = this.savingAccountRepositoryWrapper.findOneWithNotFoundDetection(savingsAccountId); if (command.isChangeInBooleanParameterNamed(withHoldTaxParamName, savingsForUpdate.withHoldTax())) { final boolean newValue = command.booleanPrimitiveValueOfParameterNamed(withHoldTaxParamName); actualChanges.put(withHoldTaxParamName, newValue); @@ -1254,7 +1245,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); account.setSubStatusInactive(appuserRepository.fetchSystemUser()); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } @@ -1263,7 +1254,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi public void setSubStatusDormant(Long savingsId){ final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId); account.setSubStatusDormant(); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); } @Override @@ -1274,7 +1265,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); account.escheat(appuserRepository.fetchSystemUser()); - this.savingAccountRepository.save(account); + this.savingAccountRepositoryWrapper.save(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularServiceImpl.java index 24aefa6df..7563f8524 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularServiceImpl.java @@ -26,7 +26,7 @@ import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; import org.apache.fineract.portfolio.savings.domain.SavingsAccountAssembler; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; +import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepositoryWrapper; import org.apache.fineract.portfolio.savings.domain.SavingsAccountStatusType; import org.joda.time.LocalDate; import org.springframework.beans.factory.annotation.Autowired; @@ -37,24 +37,24 @@ public class SavingsSchedularServiceImpl implements SavingsSchedularService { private final SavingsAccountAssembler savingAccountAssembler; private final SavingsAccountWritePlatformService savingsAccountWritePlatformService; - private final SavingsAccountRepository savingAccountRepository; + private final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper; private final SavingsAccountReadPlatformService savingAccountReadPlatformService; @Autowired public SavingsSchedularServiceImpl(final SavingsAccountAssembler savingAccountAssembler, final SavingsAccountWritePlatformService savingsAccountWritePlatformService, - final SavingsAccountRepository savingAccountRepository, + final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper, final SavingsAccountReadPlatformService savingAccountReadPlatformService) { this.savingAccountAssembler = savingAccountAssembler; this.savingsAccountWritePlatformService = savingsAccountWritePlatformService; - this.savingAccountRepository = savingAccountRepository; + this.savingAccountRepositoryWrapper = savingAccountRepositoryWrapper; this.savingAccountReadPlatformService = savingAccountReadPlatformService; } @CronTarget(jobName = JobName.POST_INTEREST_FOR_SAVINGS) @Override public void postInterestForAccounts() throws JobExecutionException { - final List savingsAccounts = this.savingAccountRepository.findSavingAccountByStatus(SavingsAccountStatusType.ACTIVE + final List savingsAccounts = this.savingAccountRepositoryWrapper.findSavingAccountByStatus(SavingsAccountStatusType.ACTIVE .getValue()); StringBuffer sb = new StringBuffer(); for (final SavingsAccount savingsAccount : savingsAccounts) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTWritePlatformServiceImpl.java index 9a4e8fd2b..e24c45d01 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTWritePlatformServiceImpl.java @@ -34,9 +34,9 @@ import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityEx import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.account.PortfolioAccountType; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; +import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepositoryWrapper; import org.apache.fineract.portfolio.self.account.data.SelfBeneficiariesTPTDataValidator; import org.apache.fineract.portfolio.self.account.domain.SelfBeneficiariesTPT; import org.apache.fineract.portfolio.self.account.domain.SelfBeneficiariesTPTRepository; @@ -58,21 +58,21 @@ public class SelfBeneficiariesTPTWritePlatformServiceImpl implements private final PlatformSecurityContext context; private final SelfBeneficiariesTPTRepository repository; private final SelfBeneficiariesTPTDataValidator validator; - private final LoanRepository loanRepo; - private final SavingsAccountRepository savingRepo; + private final LoanRepositoryWrapper loanRepositoryWrapper; + private final SavingsAccountRepositoryWrapper savingRepositoryWrapper; @Autowired public SelfBeneficiariesTPTWritePlatformServiceImpl( final PlatformSecurityContext context, final SelfBeneficiariesTPTRepository repository, final SelfBeneficiariesTPTDataValidator validator, - final LoanRepository loanRepo, - final SavingsAccountRepository savingRepo) { + final LoanRepositoryWrapper loanRepositoryWrapper, + final SavingsAccountRepositoryWrapper savingRepositoryWrapper) { this.context = context; this.repository = repository; this.validator = validator; - this.loanRepo = loanRepo; - this.savingRepo = savingRepo; + this.loanRepositoryWrapper = loanRepositoryWrapper; + this.savingRepositoryWrapper = savingRepositoryWrapper; this.logger = LoggerFactory .getLogger(SelfBeneficiariesTPTWritePlatformServiceImpl.class); } @@ -95,8 +95,7 @@ public class SelfBeneficiariesTPTWritePlatformServiceImpl implements boolean validAccountDetails = true; if (accountType.equals(PortfolioAccountType.LOAN)) { - Loan loan = this.loanRepo - .findNonClosedLoanByAccountNumber(accountNumber); + Loan loan = this.loanRepositoryWrapper.findNonClosedLoanByAccountNumber(accountNumber); if (loan != null && loan.getClientId() != null && loan.getOffice().getName().equals(officeName)) { accountId = loan.getId(); @@ -106,7 +105,7 @@ public class SelfBeneficiariesTPTWritePlatformServiceImpl implements validAccountDetails = false; } } else { - SavingsAccount savings = this.savingRepo + SavingsAccount savings = this.savingRepositoryWrapper .findNonClosedAccountByAccountNumber(accountNumber); if (savings != null && savings.getClient() != null diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java index 6a7442ad4..c63bac702 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java @@ -45,11 +45,11 @@ import org.apache.fineract.portfolio.group.domain.GroupRepositoryWrapper; import org.apache.fineract.portfolio.group.exception.ClientNotInGroupException; import org.apache.fineract.portfolio.group.exception.GroupNotActiveException; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.service.LoanWritePlatformService; import org.apache.fineract.portfolio.note.service.NoteWritePlatformService; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; +import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepositoryWrapper; import org.apache.fineract.portfolio.savings.service.SavingsAccountWritePlatformService; import org.apache.fineract.portfolio.transfer.api.TransferApiConstants; import org.apache.fineract.portfolio.transfer.data.TransfersDataValidator; @@ -68,36 +68,36 @@ import com.google.gson.JsonObject; @Service public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWritePlatformService { - private final ClientRepositoryWrapper clientRepository; + private final ClientRepositoryWrapper clientRepositoryWrapper; private final OfficeRepositoryWrapper officeRepository; private final CalendarInstanceRepository calendarInstanceRepository; private final GroupRepositoryWrapper groupRepository; private final LoanWritePlatformService loanWritePlatformService; private final SavingsAccountWritePlatformService savingsAccountWritePlatformService; - private final LoanRepository loanRepository; - private final SavingsAccountRepository savingsAccountRepository; + private final LoanRepositoryWrapper loanRepositoryWrapper; + private final SavingsAccountRepositoryWrapper savingsAccountRepositoryWrapper; private final TransfersDataValidator transfersDataValidator; private final NoteWritePlatformService noteWritePlatformService; private final StaffRepositoryWrapper staffRepositoryWrapper; @Autowired - public TransferWritePlatformServiceJpaRepositoryImpl(final ClientRepositoryWrapper clientRepository, + public TransferWritePlatformServiceJpaRepositoryImpl(final ClientRepositoryWrapper clientRepositoryWrapper, final OfficeRepositoryWrapper officeRepository, final CalendarInstanceRepository calendarInstanceRepository, final LoanWritePlatformService loanWritePlatformService, final GroupRepositoryWrapper groupRepository, - final LoanRepository loanRepository, final TransfersDataValidator transfersDataValidator, + final LoanRepositoryWrapper loanRepositoryWrapper, final TransfersDataValidator transfersDataValidator, final NoteWritePlatformService noteWritePlatformService, final StaffRepositoryWrapper staffRepositoryWrapper, - final SavingsAccountRepository savingsAccountRepository, + final SavingsAccountRepositoryWrapper savingsAccountRepositoryWrapper, final SavingsAccountWritePlatformService savingsAccountWritePlatformService) { - this.clientRepository = clientRepository; + this.clientRepositoryWrapper = clientRepositoryWrapper; this.officeRepository = officeRepository; this.calendarInstanceRepository = calendarInstanceRepository; this.loanWritePlatformService = loanWritePlatformService; this.groupRepository = groupRepository; - this.loanRepository = loanRepository; + this.loanRepositoryWrapper = loanRepositoryWrapper; this.transfersDataValidator = transfersDataValidator; this.noteWritePlatformService = noteWritePlatformService; this.staffRepositoryWrapper = staffRepositoryWrapper; - this.savingsAccountRepository = savingsAccountRepository; + this.savingsAccountRepositoryWrapper = savingsAccountRepositoryWrapper; this.savingsAccountWritePlatformService = savingsAccountWritePlatformService; } @@ -214,12 +214,12 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr } client.getGroups().add(destinationGroup); - this.clientRepository.saveAndFlush(client); + this.clientRepositoryWrapper.saveAndFlush(client); /** * Active JLG loans are now linked to the new Group and Loan officer **/ - final List allClientJLGLoans = this.loanRepository.findByClientIdAndGroupId(client.getId(), sourceGroup.getId()); + final List allClientJLGLoans = this.loanRepositoryWrapper.findByClientIdAndGroupId(client.getId(), sourceGroup.getId()); for (final Loan loan : allClientJLGLoans) { if (loan.status().isActiveOrAwaitingApprovalOrDisbursal()) { loan.updateGroup(destinationGroup); @@ -229,7 +229,7 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr } else if (newLoanOfficer != null) { loan.reassignLoanOfficer(newLoanOfficer, DateUtils.getLocalDateOfTenant()); } - this.loanRepository.saveAndFlush(loan); + this.loanRepositoryWrapper.saveAndFlush(loan); } } @@ -260,11 +260,11 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr final Long destinationOfficeId = jsonCommand.longValueOfParameterNamed(TransferApiConstants.destinationOfficeIdParamName); final Office office = this.officeRepository.findOneWithNotFoundDetection(destinationOfficeId); - final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId); + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId, true); handleClientTransferLifecycleEvent(client, office, TransferEventType.PROPOSAL, jsonCommand); - this.clientRepository.saveAndFlush(client); + this.clientRepositoryWrapper.saveAndFlush(client); handleClientTransferLifecycleEvent(client, client.getTransferToOffice(), TransferEventType.ACCEPTANCE, jsonCommand); - this.clientRepository.save(client); + this.clientRepositoryWrapper.save(client); return new CommandProcessingResultBuilder() // .withClientId(clientId) // @@ -292,9 +292,9 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr final Long destinationOfficeId = jsonCommand.longValueOfParameterNamed(TransferApiConstants.destinationOfficeIdParamName); final Office office = this.officeRepository.findOneWithNotFoundDetection(destinationOfficeId); - final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId); + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId); handleClientTransferLifecycleEvent(client, office, TransferEventType.PROPOSAL, jsonCommand); - this.clientRepository.save(client); + this.clientRepositoryWrapper.save(client); return new CommandProcessingResultBuilder() // .withClientId(clientId) // @@ -319,11 +319,11 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr public CommandProcessingResult acceptClientTransfer(final Long clientId, final JsonCommand jsonCommand) { // validation this.transfersDataValidator.validateForAcceptClientTransfer(jsonCommand.json()); - final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId); + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId, true); validateClientAwaitingTransferAcceptance(client); handleClientTransferLifecycleEvent(client, client.getTransferToOffice(), TransferEventType.ACCEPTANCE, jsonCommand); - this.clientRepository.save(client); + this.clientRepositoryWrapper.save(client); return new CommandProcessingResultBuilder() // .withClientId(clientId) // @@ -336,11 +336,11 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr public CommandProcessingResult withdrawClientTransfer(final Long clientId, final JsonCommand jsonCommand) { // validation this.transfersDataValidator.validateForWithdrawClientTransfer(jsonCommand.json()); - final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId); + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId); validateClientAwaitingTransferAcceptanceOnHold(client); handleClientTransferLifecycleEvent(client, client.getOffice(), TransferEventType.WITHDRAWAL, jsonCommand); - this.clientRepository.save(client); + this.clientRepositoryWrapper.save(client); return new CommandProcessingResultBuilder() // .withClientId(clientId) // @@ -353,9 +353,9 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr public CommandProcessingResult rejectClientTransfer(final Long clientId, final JsonCommand jsonCommand) { // validation this.transfersDataValidator.validateForRejectClientTransfer(jsonCommand.json()); - final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId); + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId); handleClientTransferLifecycleEvent(client, client.getOffice(), TransferEventType.REJECTION, jsonCommand); - this.clientRepository.save(client); + this.clientRepositoryWrapper.save(client); return new CommandProcessingResultBuilder() // .withClientId(clientId) // @@ -379,9 +379,9 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr } /*** Handle Active Loans ***/ - if (this.loanRepository.doNonClosedLoanAccountsExistForClient(client.getId())) { + if (this.loanRepositoryWrapper.doNonClosedLoanAccountsExistForClient(client.getId())) { // get each individual loan for the client - for (final Loan loan : this.loanRepository.findLoanByClientId(client.getId())) { + for (final Loan loan : this.loanRepositoryWrapper.findLoanByClientId(client.getId())) { /** * We need to create transactions etc only for loans which are * disbursed and not yet closed @@ -389,41 +389,41 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr if (loan.isDisbursed() && !loan.isClosed()) { switch (transferEventType) { case ACCEPTANCE: - this.loanWritePlatformService.acceptLoanTransfer(loan.getId(), DateUtils.getLocalDateOfTenant(), + this.loanWritePlatformService.acceptLoanTransfer(loan, DateUtils.getLocalDateOfTenant(), destinationOffice, staff); break; case PROPOSAL: - this.loanWritePlatformService.initiateLoanTransfer(loan.getId(), DateUtils.getLocalDateOfTenant()); + this.loanWritePlatformService.initiateLoanTransfer(loan, DateUtils.getLocalDateOfTenant()); break; case REJECTION: - this.loanWritePlatformService.rejectLoanTransfer(loan.getId()); + this.loanWritePlatformService.rejectLoanTransfer(loan); break; case WITHDRAWAL: - this.loanWritePlatformService.withdrawLoanTransfer(loan.getId(), DateUtils.getLocalDateOfTenant()); + this.loanWritePlatformService.withdrawLoanTransfer(loan, DateUtils.getLocalDateOfTenant()); } } } } /*** Handle Active Savings (Currently throw and exception) ***/ - if (this.savingsAccountRepository.doNonClosedSavingAccountsExistForClient(client.getId())) { + if (this.savingsAccountRepositoryWrapper.doNonClosedSavingAccountsExistForClient(client.getId())) { // get each individual saving account for the client - for (final SavingsAccount savingsAccount : this.savingsAccountRepository.findSavingAccountByClientId(client.getId())) { + for (final SavingsAccount savingsAccount : this.savingsAccountRepositoryWrapper.findSavingAccountByClientId(client.getId())) { if (savingsAccount.isActivated() && !savingsAccount.isClosed()) { switch (transferEventType) { case ACCEPTANCE: - this.savingsAccountWritePlatformService.acceptSavingsTransfer(savingsAccount.getId(), + this.savingsAccountWritePlatformService.acceptSavingsTransfer(savingsAccount, DateUtils.getLocalDateOfTenant(), destinationOffice, staff); break; case PROPOSAL: - this.savingsAccountWritePlatformService.initiateSavingsTransfer(savingsAccount.getId(), + this.savingsAccountWritePlatformService.initiateSavingsTransfer(savingsAccount, DateUtils.getLocalDateOfTenant()); break; case REJECTION: - this.savingsAccountWritePlatformService.rejectSavingsTransfer(savingsAccount.getId()); + this.savingsAccountWritePlatformService.rejectSavingsTransfer(savingsAccount); break; case WITHDRAWAL: - this.savingsAccountWritePlatformService.withdrawSavingsTransfer(savingsAccount.getId(), + this.savingsAccountWritePlatformService.withdrawSavingsTransfer(savingsAccount, DateUtils.getLocalDateOfTenant()); } } @@ -480,7 +480,7 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr final JsonObject jsonObject = clientsArray.get(i).getAsJsonObject(); if (jsonObject.has(TransferApiConstants.idParamName)) { final Long id = jsonObject.get(TransferApiConstants.idParamName).getAsLong(); - final Client client = this.clientRepository.findOneWithNotFoundDetection(id); + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(id); clients.add(client); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/api/ScorecardApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/spm/api/ScorecardApiResource.java index b1e0fa59a..9c4ed7d78 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/api/ScorecardApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/api/ScorecardApiResource.java @@ -18,10 +18,20 @@ */ package org.apache.fineract.spm.api; +import java.util.Collections; +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.client.domain.Client; -import org.apache.fineract.portfolio.client.domain.ClientRepository; -import org.apache.fineract.portfolio.client.exception.ClientNotFoundException; +import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.spm.data.ScorecardData; import org.apache.fineract.spm.domain.Scorecard; import org.apache.fineract.spm.domain.Survey; @@ -35,11 +45,6 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import java.util.Collections; -import java.util.List; - @Path("/surveys/{surveyId}/scorecards") @Component @Scope("singleton") @@ -48,16 +53,16 @@ public class ScorecardApiResource { private final PlatformSecurityContext securityContext; private final SpmService spmService; private final ScorecardService scorecardService; - private final ClientRepository clientRepository; + private final ClientRepositoryWrapper clientRepositoryWrapper; @Autowired public ScorecardApiResource(final PlatformSecurityContext securityContext, final SpmService spmService, - final ScorecardService scorecardService, final ClientRepository clientRepository) { + final ScorecardService scorecardService, final ClientRepositoryWrapper clientRepositoryWrapper) { super(); this.securityContext = securityContext; this.spmService = spmService; this.scorecardService = scorecardService; - this.clientRepository = clientRepository; + this.clientRepositoryWrapper = clientRepositoryWrapper; } @GET @@ -84,15 +89,8 @@ public class ScorecardApiResource { @Transactional public void createScorecard(@PathParam("surveyId") final Long surveyId, final ScorecardData scorecardData) { final AppUser appUser = this.securityContext.authenticatedUser(); - final Survey survey = findSurvey(surveyId); - - final Client client = this.clientRepository.findOne(scorecardData.getClientId()); - - if (client == null) { - throw new ClientNotFoundException(scorecardData.getClientId()); - } - + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(scorecardData.getClientId()); this.scorecardService.createScorecard(ScorecardMapper.map(scorecardData, survey, appUser, client)); } @@ -104,21 +102,12 @@ public class ScorecardApiResource { public List findBySurveyClient(@PathParam("surveyId") final Long surveyId, @PathParam("clientId") final Long clientId) { this.securityContext.authenticatedUser(); - final Survey survey = findSurvey(surveyId); - - final Client client = this.clientRepository.findOne(clientId); - - if (client == null) { - throw new ClientNotFoundException(clientId); - } - + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId); final List scorecards = this.scorecardService.findBySurveyAndClient(survey, client); - if (scorecards == null) { return ScorecardMapper.map(scorecards); } - return Collections.EMPTY_LIST; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java index 0b4a0db83..a0089fb3d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java @@ -36,12 +36,11 @@ import org.apache.fineract.infrastructure.core.service.PlatformEmailSendExceptio import org.apache.fineract.infrastructure.security.service.PlatformPasswordEncoder; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.office.domain.Office; -import org.apache.fineract.organisation.office.domain.OfficeRepository; -import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; +import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper; import org.apache.fineract.portfolio.client.domain.Client; -import org.apache.fineract.portfolio.client.domain.ClientRepository; +import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.useradministration.api.AppUserApiConstant; import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUserPreviousPassword; @@ -77,29 +76,29 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit private final UserDomainService userDomainService; private final PlatformPasswordEncoder platformPasswordEncoder; private final AppUserRepository appUserRepository; - private final OfficeRepository officeRepository; + private final OfficeRepositoryWrapper officeRepositoryWrapper; private final RoleRepository roleRepository; private final UserDataValidator fromApiJsonDeserializer; private final AppUserPreviousPasswordRepository appUserPreviewPasswordRepository; private final StaffRepositoryWrapper staffRepositoryWrapper; - private final ClientRepository clientRepository; + private final ClientRepositoryWrapper clientRepositoryWrapper; @Autowired public AppUserWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final AppUserRepository appUserRepository, - final UserDomainService userDomainService, final OfficeRepository officeRepository, final RoleRepository roleRepository, + final UserDomainService userDomainService, final OfficeRepositoryWrapper officeRepositoryWrapper, final RoleRepository roleRepository, final PlatformPasswordEncoder platformPasswordEncoder, final UserDataValidator fromApiJsonDeserializer, final AppUserPreviousPasswordRepository appUserPreviewPasswordRepository, final StaffRepositoryWrapper staffRepositoryWrapper, - final ClientRepository clientRepository) { + final ClientRepositoryWrapper clientRepositoryWrapper) { this.context = context; this.appUserRepository = appUserRepository; this.userDomainService = userDomainService; - this.officeRepository = officeRepository; + this.officeRepositoryWrapper = officeRepositoryWrapper; this.roleRepository = roleRepository; this.platformPasswordEncoder = platformPasswordEncoder; this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.appUserPreviewPasswordRepository = appUserPreviewPasswordRepository; this.staffRepositoryWrapper = staffRepositoryWrapper; - this.clientRepository = clientRepository; + this.clientRepositoryWrapper = clientRepositoryWrapper; } @Transactional @@ -115,8 +114,7 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit final String officeIdParamName = "officeId"; final Long officeId = command.longValueOfParameterNamed(officeIdParamName); - final Office userOffice = this.officeRepository.findOne(officeId); - if (userOffice == null) { throw new OfficeNotFoundException(officeId); } + final Office userOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); final String[] roles = command.arrayValueOfParameterNamed("roles"); final Set allRoles = assembleSetOfRoles(roles); @@ -140,7 +138,7 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit for(JsonElement clientElement : clientsArray){ clientIds.add(clientElement.getAsLong()); } - clients = this.clientRepository.findAll(clientIds); + clients = this.clientRepositoryWrapper.findAll(clientIds); } appUser = AppUser.fromJson(userOffice, linkedStaff, allRoles, clients, command); @@ -199,16 +197,14 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit for(JsonElement clientElement : clientsArray){ clientIds.add(clientElement.getAsLong()); } - clients = this.clientRepository.findAll(clientIds); + clients = this.clientRepositoryWrapper.findAll(clientIds); } final Map changes = userToUpdate.update(command, this.platformPasswordEncoder, clients); if (changes.containsKey("officeId")) { final Long officeId = (Long) changes.get("officeId"); - final Office office = this.officeRepository.findOne(officeId); - if (office == null) { throw new OfficeNotFoundException(officeId); } - + final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); userToUpdate.changeOffice(office); }