Loading child entites lazy

This commit is contained in:
Nazeer Hussain Shaik
2016-09-19 14:03:37 +05:30
parent 19c0defe44
commit 025ff9c707
63 changed files with 887 additions and 760 deletions
@@ -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.GLClosureDuplicateException;
import org.apache.fineract.accounting.closure.exception.GLClosureInvalidDeleteException; import org.apache.fineract.accounting.closure.exception.GLClosureInvalidDeleteException;
import org.apache.fineract.accounting.closure.exception.GLClosureInvalidException; 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.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.accounting.closure.serialization.GLClosureCommandFromApiJsonDeserializer;
import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.organisation.office.domain.Office; 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.OfficeNotFoundException;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -52,14 +51,14 @@ public class GLClosureWritePlatformServiceJpaRepositoryImpl implements GLClosure
private final static Logger logger = LoggerFactory.getLogger(GLClosureWritePlatformServiceJpaRepositoryImpl.class); private final static Logger logger = LoggerFactory.getLogger(GLClosureWritePlatformServiceJpaRepositoryImpl.class);
private final GLClosureRepository glClosureRepository; private final GLClosureRepository glClosureRepository;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final GLClosureCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final GLClosureCommandFromApiJsonDeserializer fromApiJsonDeserializer;
@Autowired @Autowired
public GLClosureWritePlatformServiceJpaRepositoryImpl(final GLClosureRepository glClosureRepository, public GLClosureWritePlatformServiceJpaRepositoryImpl(final GLClosureRepository glClosureRepository,
final OfficeRepository officeRepository, final GLClosureCommandFromApiJsonDeserializer fromApiJsonDeserializer) { final OfficeRepositoryWrapper officeRepositoryWrapper, final GLClosureCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
this.glClosureRepository = glClosureRepository; this.glClosureRepository = glClosureRepository;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
} }
@@ -72,9 +71,7 @@ public class GLClosureWritePlatformServiceJpaRepositoryImpl implements GLClosure
// check office is valid // check office is valid
final Long officeId = command.longValueOfParameterNamed(GLClosureJsonInputParams.OFFICE_ID.getValue()); final Long officeId = command.longValueOfParameterNamed(GLClosureJsonInputParams.OFFICE_ID.getValue());
final Office office = this.officeRepository.findOne(officeId); final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (office == null) { throw new OfficeNotFoundException(officeId); }
// TODO: Get Tenant specific date // TODO: Get Tenant specific date
// ensure closure date is not in the future // ensure closure date is not in the future
final Date todaysDate = new Date(); final Date todaysDate = new Date();
@@ -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.LoanTransactionDTO;
import org.apache.fineract.accounting.journalentry.data.SavingsDTO; import org.apache.fineract.accounting.journalentry.data.SavingsDTO;
import org.apache.fineract.accounting.journalentry.data.SavingsTransactionDTO; 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.SharesDTO;
import org.apache.fineract.accounting.journalentry.data.SharesTransactionDTO; 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.JournalEntry;
import org.apache.fineract.accounting.journalentry.domain.JournalEntryRepository; import org.apache.fineract.accounting.journalentry.domain.JournalEntryRepository;
import org.apache.fineract.accounting.journalentry.domain.JournalEntryType; 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.infrastructure.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.organisation.office.domain.Office; 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.PortfolioAccountType;
import org.apache.fineract.portfolio.account.service.AccountTransfersReadPlatformService; import org.apache.fineract.portfolio.account.service.AccountTransfersReadPlatformService;
import org.apache.fineract.portfolio.client.domain.ClientTransaction; import org.apache.fineract.portfolio.client.domain.ClientTransaction;
@@ -90,7 +90,7 @@ public class AccountingProcessorHelper {
private final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepository; private final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepository;
private final GLClosureRepository closureRepository; private final GLClosureRepository closureRepository;
private final GLAccountRepositoryWrapper accountRepositoryWrapper; private final GLAccountRepositoryWrapper accountRepositoryWrapper;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final LoanTransactionRepository loanTransactionRepository; private final LoanTransactionRepository loanTransactionRepository;
private final ClientTransactionRepositoryWrapper clientTransactionRepository; private final ClientTransactionRepositoryWrapper clientTransactionRepository;
private final SavingsAccountTransactionRepository savingsAccountTransactionRepository; private final SavingsAccountTransactionRepository savingsAccountTransactionRepository;
@@ -99,7 +99,7 @@ public class AccountingProcessorHelper {
@Autowired @Autowired
public AccountingProcessorHelper(final JournalEntryRepository glJournalEntryRepository, public AccountingProcessorHelper(final JournalEntryRepository glJournalEntryRepository,
final ProductToGLAccountMappingRepository accountMappingRepository, final GLClosureRepository closureRepository, final ProductToGLAccountMappingRepository accountMappingRepository, final GLClosureRepository closureRepository,
final OfficeRepository officeRepository, final LoanTransactionRepository loanTransactionRepository, final OfficeRepositoryWrapper officeRepositoryWrapper, final LoanTransactionRepository loanTransactionRepository,
final SavingsAccountTransactionRepository savingsAccountTransactionRepository, final SavingsAccountTransactionRepository savingsAccountTransactionRepository,
final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepository, final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepository,
final AccountTransfersReadPlatformService accountTransfersReadPlatformService, final AccountTransfersReadPlatformService accountTransfersReadPlatformService,
@@ -108,7 +108,7 @@ public class AccountingProcessorHelper {
this.glJournalEntryRepository = glJournalEntryRepository; this.glJournalEntryRepository = glJournalEntryRepository;
this.accountMappingRepository = accountMappingRepository; this.accountMappingRepository = accountMappingRepository;
this.closureRepository = closureRepository; this.closureRepository = closureRepository;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.loanTransactionRepository = loanTransactionRepository; this.loanTransactionRepository = loanTransactionRepository;
this.savingsAccountTransactionRepository = savingsAccountTransactionRepository; this.savingsAccountTransactionRepository = savingsAccountTransactionRepository;
this.financialActivityAccountRepository = financialActivityAccountRepository; this.financialActivityAccountRepository = financialActivityAccountRepository;
@@ -539,7 +539,7 @@ public class AccountingProcessorHelper {
} }
public Office getOfficeById(final long officeId) { 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, private void createJournalEntriesForLoan(final Office office, final String currencyCode, final int accountTypeToDebitId,
@@ -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.core.service.RoutingDataSource;
import org.apache.fineract.infrastructure.jobs.annotation.CronTarget; import org.apache.fineract.infrastructure.jobs.annotation.CronTarget;
import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.jobs.service.JobName;
import org.apache.fineract.organisation.office.domain.Office; import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
import org.apache.fineract.organisation.office.domain.OfficeRepository;
import org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -60,7 +58,7 @@ public class JournalEntryRunningBalanceUpdateServiceImpl implements JournalEntry
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final JournalEntryDataValidator dataValidator; 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; + "where je2.id = je.id and je.entry_date = je3.date group by je.id order by je.entry_date DESC " + selectRunningBalanceSqlLimit;
@Autowired @Autowired
public JournalEntryRunningBalanceUpdateServiceImpl(final RoutingDataSource dataSource, final OfficeRepository officeRepository, public JournalEntryRunningBalanceUpdateServiceImpl(final RoutingDataSource dataSource, final OfficeRepositoryWrapper officeRepositoryWrapper,
final JournalEntryDataValidator dataValidator, final FromJsonHelper fromApiJsonHelper) { final JournalEntryDataValidator dataValidator, final FromJsonHelper fromApiJsonHelper) {
this.jdbcTemplate = new JdbcTemplate(dataSource); this.jdbcTemplate = new JdbcTemplate(dataSource);
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.dataValidator = dataValidator; this.dataValidator = dataValidator;
this.fromApiJsonHelper = fromApiJsonHelper; this.fromApiJsonHelper = fromApiJsonHelper;
} }
@@ -120,9 +118,7 @@ public class JournalEntryRunningBalanceUpdateServiceImpl implements JournalEntry
if (officeId == null) { if (officeId == null) {
updateRunningBalance(); updateRunningBalance();
} else { } else {
final Office office = this.officeRepository.findOne(officeId); this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (office == null) { throw new OfficeNotFoundException(officeId); }
String dateFinder = "select MIN(je.entry_date) as entityDate " + "from acc_gl_journal_entry je " 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=?"; + "where je.is_running_balance_calculated=0 and je.office_id=?";
try { try {
@@ -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.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.office.domain.Office; 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.domain.OrganisationCurrencyRepositoryWrapper;
import org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
import org.apache.fineract.portfolio.client.domain.ClientTransaction; import org.apache.fineract.portfolio.client.domain.ClientTransaction;
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail; import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
import org.apache.fineract.portfolio.paymentdetail.service.PaymentDetailWritePlatformService; import org.apache.fineract.portfolio.paymentdetail.service.PaymentDetailWritePlatformService;
@@ -93,7 +92,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
private final GLClosureRepository glClosureRepository; private final GLClosureRepository glClosureRepository;
private final GLAccountRepository glAccountRepository; private final GLAccountRepository glAccountRepository;
private final JournalEntryRepository glJournalEntryRepository; private final JournalEntryRepository glJournalEntryRepository;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final AccountingProcessorForLoanFactory accountingProcessorForLoanFactory; private final AccountingProcessorForLoanFactory accountingProcessorForLoanFactory;
private final AccountingProcessorForSavingsFactory accountingProcessorForSavingsFactory; private final AccountingProcessorForSavingsFactory accountingProcessorForSavingsFactory;
private final AccountingProcessorForSharesFactory accountingProcessorForSharesFactory; private final AccountingProcessorForSharesFactory accountingProcessorForSharesFactory;
@@ -109,7 +108,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
@Autowired @Autowired
public JournalEntryWritePlatformServiceJpaRepositoryImpl(final GLClosureRepository glClosureRepository, public JournalEntryWritePlatformServiceJpaRepositoryImpl(final GLClosureRepository glClosureRepository,
final JournalEntryRepository glJournalEntryRepository, final OfficeRepository officeRepository, final JournalEntryRepository glJournalEntryRepository, final OfficeRepositoryWrapper officeRepositoryWrapper,
final GLAccountRepository glAccountRepository, final JournalEntryCommandFromApiJsonDeserializer fromApiJsonDeserializer, final GLAccountRepository glAccountRepository, final JournalEntryCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final AccountingProcessorHelper accountingProcessorHelper, final AccountingRuleRepository accountingRuleRepository, final AccountingProcessorHelper accountingProcessorHelper, final AccountingRuleRepository accountingRuleRepository,
final AccountingProcessorForLoanFactory accountingProcessorForLoanFactory, final AccountingProcessorForLoanFactory accountingProcessorForLoanFactory,
@@ -121,7 +120,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepositoryWrapper, final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepositoryWrapper,
final CashBasedAccountingProcessorForClientTransactions accountingProcessorForClientTransactions) { final CashBasedAccountingProcessorForClientTransactions accountingProcessorForClientTransactions) {
this.glClosureRepository = glClosureRepository; this.glClosureRepository = glClosureRepository;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.glJournalEntryRepository = glJournalEntryRepository; this.glJournalEntryRepository = glJournalEntryRepository;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.glAccountRepository = glAccountRepository; this.glAccountRepository = glAccountRepository;
@@ -147,9 +146,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
// check office is valid // check office is valid
final Long officeId = command.longValueOfParameterNamed(JournalEntryJsonInputParams.OFFICE_ID.getValue()); final Long officeId = command.longValueOfParameterNamed(JournalEntryJsonInputParams.OFFICE_ID.getValue());
final Office office = this.officeRepository.findOne(officeId); final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (office == null) { throw new OfficeNotFoundException(officeId); }
final Long accountRuleId = command.longValueOfParameterNamed(JournalEntryJsonInputParams.ACCOUNTING_RULE.getValue()); final Long accountRuleId = command.longValueOfParameterNamed(JournalEntryJsonInputParams.ACCOUNTING_RULE.getValue());
final String currencyCode = command.stringValueOfParameterNamed(JournalEntryJsonInputParams.CURRENCY_CODE.getValue()); final String currencyCode = command.stringValueOfParameterNamed(JournalEntryJsonInputParams.CURRENCY_CODE.getValue());
@@ -647,9 +644,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
// check office is valid // check office is valid
final Long officeId = command.longValueOfParameterNamed(JournalEntryJsonInputParams.OFFICE_ID.getValue()); final Long officeId = command.longValueOfParameterNamed(JournalEntryJsonInputParams.OFFICE_ID.getValue());
final Office office = this.officeRepository.findOne(officeId); final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (office == null) { throw new OfficeNotFoundException(officeId); }
final String currencyCode = command.stringValueOfParameterNamed(JournalEntryJsonInputParams.CURRENCY_CODE.getValue()); final String currencyCode = command.stringValueOfParameterNamed(JournalEntryJsonInputParams.CURRENCY_CODE.getValue());
validateBusinessRulesForJournalEntries(journalEntryCommand); validateBusinessRulesForJournalEntries(journalEntryCommand);
@@ -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.Money;
import org.apache.fineract.organisation.monetary.domain.MoneyHelper; import org.apache.fineract.organisation.monetary.domain.MoneyHelper;
import org.apache.fineract.organisation.office.domain.Office; 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.data.ProvisioningCriteriaData;
import org.apache.fineract.organisation.provisioning.domain.ProvisioningCategory; import org.apache.fineract.organisation.provisioning.domain.ProvisioningCategory;
import org.apache.fineract.organisation.provisioning.domain.ProvisioningCategoryRepository; import org.apache.fineract.organisation.provisioning.domain.ProvisioningCategoryRepository;
@@ -72,7 +72,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements
private final ProvisioningCriteriaReadPlatformService provisioningCriteriaReadPlatformService ; private final ProvisioningCriteriaReadPlatformService provisioningCriteriaReadPlatformService ;
private final LoanProductRepository loanProductRepository; private final LoanProductRepository loanProductRepository;
private final GLAccountRepository glAccountRepository; private final GLAccountRepository glAccountRepository;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final ProvisioningCategoryRepository provisioningCategoryRepository; private final ProvisioningCategoryRepository provisioningCategoryRepository;
private final PlatformSecurityContext platformSecurityContext; private final PlatformSecurityContext platformSecurityContext;
private final ProvisioningEntryRepository provisioningEntryRepository; private final ProvisioningEntryRepository provisioningEntryRepository;
@@ -85,7 +85,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements
final ProvisioningEntriesReadPlatformService provisioningEntriesReadPlatformService, final ProvisioningEntriesReadPlatformService provisioningEntriesReadPlatformService,
final ProvisioningCriteriaReadPlatformService provisioningCriteriaReadPlatformService, final ProvisioningCriteriaReadPlatformService provisioningCriteriaReadPlatformService,
final LoanProductRepository loanProductRepository, final GLAccountRepository glAccountRepository, 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 PlatformSecurityContext platformSecurityContext, final ProvisioningEntryRepository provisioningEntryRepository,
final JournalEntryWritePlatformService journalEntryWritePlatformService, final JournalEntryWritePlatformService journalEntryWritePlatformService,
final ProvisioningEntriesDefinitionJsonDeserializer fromApiJsonDeserializer, final FromJsonHelper fromApiJsonHelper) { final ProvisioningEntriesDefinitionJsonDeserializer fromApiJsonDeserializer, final FromJsonHelper fromApiJsonHelper) {
@@ -93,7 +93,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements
this.provisioningCriteriaReadPlatformService = provisioningCriteriaReadPlatformService ; this.provisioningCriteriaReadPlatformService = provisioningCriteriaReadPlatformService ;
this.loanProductRepository = loanProductRepository; this.loanProductRepository = loanProductRepository;
this.glAccountRepository = glAccountRepository; this.glAccountRepository = glAccountRepository;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.provisioningCategoryRepository = provisioningCategoryRepository; this.provisioningCategoryRepository = provisioningCategoryRepository;
this.platformSecurityContext = platformSecurityContext; this.platformSecurityContext = platformSecurityContext;
this.provisioningEntryRepository = provisioningEntryRepository; this.provisioningEntryRepository = provisioningEntryRepository;
@@ -221,7 +221,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements
Map<LoanProductProvisioningEntry, LoanProductProvisioningEntry> provisioningEntries = new HashMap<>(); Map<LoanProductProvisioningEntry, LoanProductProvisioningEntry> provisioningEntries = new HashMap<>();
for (LoanProductProvisioningEntryData data : entries) { for (LoanProductProvisioningEntryData data : entries) {
LoanProduct loanProduct = this.loanProductRepository.findOne(data.getProductId()); 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()); ProvisioningCategory provisioningCategory = provisioningCategoryRepository.findOne(data.getCategoryId());
GLAccount liabilityAccount = glAccountRepository.findOne(data.getLiablityAccount()); GLAccount liabilityAccount = glAccountRepository.findOne(data.getLiablityAccount());
GLAccount expenseAccount = glAccountRepository.findOne(data.getExpenseAccount()); GLAccount expenseAccount = glAccountRepository.findOne(data.getExpenseAccount());
@@ -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.data.CommandProcessingResultBuilder;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.organisation.office.domain.Office; 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.OfficeNotFoundException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -64,17 +63,17 @@ public class AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco
private final AccountingRuleRepositoryWrapper accountingRuleRepositoryWrapper; private final AccountingRuleRepositoryWrapper accountingRuleRepositoryWrapper;
private final AccountingRuleRepository accountingRuleRepository; private final AccountingRuleRepository accountingRuleRepository;
private final GLAccountRepositoryWrapper accountRepositoryWrapper; private final GLAccountRepositoryWrapper accountRepositoryWrapper;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final AccountingRuleCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final AccountingRuleCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final CodeValueRepository codeValueRepository; private final CodeValueRepository codeValueRepository;
@Autowired @Autowired
public AccountingRuleWritePlatformServiceJpaRepositoryImpl(final AccountingRuleRepositoryWrapper accountingRuleRepositoryWrapper, public AccountingRuleWritePlatformServiceJpaRepositoryImpl(final AccountingRuleRepositoryWrapper accountingRuleRepositoryWrapper,
final GLAccountRepositoryWrapper accountRepositoryWrapper, final OfficeRepository officeRepository, final GLAccountRepositoryWrapper accountRepositoryWrapper, final OfficeRepositoryWrapper officeRepositoryWrapper,
final AccountingRuleRepository ruleRepository, final AccountingRuleCommandFromApiJsonDeserializer fromApiJsonDeserializer, final AccountingRuleRepository ruleRepository, final AccountingRuleCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final CodeValueRepository codeValueRepository) { final CodeValueRepository codeValueRepository) {
this.accountRepositoryWrapper = accountRepositoryWrapper; this.accountRepositoryWrapper = accountRepositoryWrapper;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.accountingRuleRepository = ruleRepository; this.accountingRuleRepository = ruleRepository;
this.accountingRuleRepositoryWrapper = accountingRuleRepositoryWrapper; this.accountingRuleRepositoryWrapper = accountingRuleRepositoryWrapper;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
@@ -107,8 +106,7 @@ public class AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco
final Long officeId = command.longValueOfParameterNamed(GLClosureJsonInputParams.OFFICE_ID.getValue()); final Long officeId = command.longValueOfParameterNamed(GLClosureJsonInputParams.OFFICE_ID.getValue());
Office office = null; Office office = null;
if (officeId != null) { if (officeId != null) {
office = this.officeRepository.findOne(officeId); office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (office == null) { throw new OfficeNotFoundException(officeId); }
} }
final AccountingRule accountingRule = assembleAccountingRuleAndTags(office, command); final AccountingRule accountingRule = assembleAccountingRuleAndTags(office, command);
@@ -268,8 +266,7 @@ public class AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco
} }
if (officeId != null && changesOnly.containsKey(AccountingRuleJsonInputParams.OFFICE_ID.getValue())) { if (officeId != null && changesOnly.containsKey(AccountingRuleJsonInputParams.OFFICE_ID.getValue())) {
final Office userOffice = this.officeRepository.findOne(officeId); final Office userOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (userOffice == null) { throw new OfficeNotFoundException(officeId); }
accountingRule.setOffice(userOffice); accountingRule.setOffice(userOffice);
} }
@@ -18,44 +18,45 @@
*/ */
package org.apache.fineract.infrastructure.hooks.processor; package org.apache.fineract.infrastructure.hooks.processor;
import com.google.gson.Gson; import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.apiKeyName;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser; 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.Hook;
import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration; import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration;
import org.apache.fineract.infrastructure.hooks.domain.HookConfigurationRepository; import org.apache.fineract.infrastructure.hooks.domain.HookConfigurationRepository;
import org.apache.fineract.infrastructure.hooks.processor.data.SmsProviderData; import org.apache.fineract.infrastructure.hooks.processor.data.SmsProviderData;
import org.apache.fineract.portfolio.client.domain.Client; 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.template.service.TemplateMergeService;
import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUser;
import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import retrofit.Callback; import retrofit.Callback;
import java.io.IOException; import com.google.gson.Gson;
import java.util.HashMap; import com.google.gson.JsonObject;
import java.util.Map; import com.google.gson.JsonParser;
import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.apiKeyName;
@Service @Service
public class TwilioHookProcessor implements HookProcessor { public class TwilioHookProcessor implements HookProcessor {
private final HookConfigurationRepository hookConfigurationRepository; private final HookConfigurationRepository hookConfigurationRepository;
private final TemplateMergeService templateMergeService; private final TemplateMergeService templateMergeService;
private final ClientRepository clientRepository; private final ClientRepositoryWrapper clientRepositoryWrapper;
@Autowired @Autowired
public TwilioHookProcessor( public TwilioHookProcessor(
final HookConfigurationRepository hookConfigurationRepository, final HookConfigurationRepository hookConfigurationRepository,
final TemplateMergeService templateMergeService, final TemplateMergeService templateMergeService,
final ClientRepository clientRepository) { final ClientRepositoryWrapper clientRepositoryWrapper) {
this.hookConfigurationRepository = hookConfigurationRepository; this.hookConfigurationRepository = hookConfigurationRepository;
this.templateMergeService = templateMergeService; this.templateMergeService = templateMergeService;
this.clientRepository = clientRepository; this.clientRepositoryWrapper = clientRepositoryWrapper;
} }
@Override @Override
@@ -127,7 +128,7 @@ public class TwilioHookProcessor implements HookProcessor {
if (map.containsKey("clientId")) { if (map.containsKey("clientId")) {
final Long clientId = new Long(Integer.toString((int) map final Long clientId = new Long(Integer.toString((int) map
.get("clientId"))); .get("clientId")));
final Client client = this.clientRepository.findOne(clientId); final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId);
final String mobileNo = client.mobileNo(); final String mobileNo = client.mobileNo();
if (mobileNo != null && !mobileNo.isEmpty()) { if (mobileNo != null && !mobileNo.isEmpty()) {
this.templateMergeService.setAuthToken(authToken); this.templateMergeService.setAuthToken(authToken);
@@ -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.domain.HolidayRepositoryWrapper;
import org.apache.fineract.organisation.holiday.exception.HolidayDateException; import org.apache.fineract.organisation.holiday.exception.HolidayDateException;
import org.apache.fineract.organisation.office.domain.Office; 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.OfficeNotFoundException;
import org.apache.fineract.organisation.workingdays.domain.WorkingDays; import org.apache.fineract.organisation.workingdays.domain.WorkingDays;
import org.apache.fineract.organisation.workingdays.domain.WorkingDaysRepositoryWrapper; import org.apache.fineract.organisation.workingdays.domain.WorkingDaysRepositoryWrapper;
import org.apache.fineract.organisation.workingdays.service.WorkingDaysUtil; import org.apache.fineract.organisation.workingdays.service.WorkingDaysUtil;
@@ -61,18 +60,18 @@ public class HolidayWritePlatformServiceJpaRepositoryImpl implements HolidayWrit
private final HolidayRepositoryWrapper holidayRepository; private final HolidayRepositoryWrapper holidayRepository;
private final WorkingDaysRepositoryWrapper daysRepositoryWrapper; private final WorkingDaysRepositoryWrapper daysRepositoryWrapper;
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final FromJsonHelper fromApiJsonHelper; private final FromJsonHelper fromApiJsonHelper;
@Autowired @Autowired
public HolidayWritePlatformServiceJpaRepositoryImpl(final HolidayDataValidator fromApiJsonDeserializer, public HolidayWritePlatformServiceJpaRepositoryImpl(final HolidayDataValidator fromApiJsonDeserializer,
final HolidayRepositoryWrapper holidayRepository, final PlatformSecurityContext context, final HolidayRepositoryWrapper holidayRepository, final PlatformSecurityContext context,
final OfficeRepository officeRepository, final FromJsonHelper fromApiJsonHelper, final OfficeRepositoryWrapper officeRepositoryWrapper, final FromJsonHelper fromApiJsonHelper,
final WorkingDaysRepositoryWrapper daysRepositoryWrapper) { final WorkingDaysRepositoryWrapper daysRepositoryWrapper) {
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.holidayRepository = holidayRepository; this.holidayRepository = holidayRepository;
this.context = context; this.context = context;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.fromApiJsonHelper = fromApiJsonHelper; this.fromApiJsonHelper = fromApiJsonHelper;
this.daysRepositoryWrapper = daysRepositoryWrapper; this.daysRepositoryWrapper = daysRepositoryWrapper;
} }
@@ -162,8 +161,7 @@ public class HolidayWritePlatformServiceJpaRepositoryImpl implements HolidayWrit
for (int i = 0; i < array.size(); i++) { for (int i = 0; i < array.size(); i++) {
final JsonObject officeElement = array.get(i).getAsJsonObject(); final JsonObject officeElement = array.get(i).getAsJsonObject();
final Long officeId = this.fromApiJsonHelper.extractLongNamed(HolidayApiConstants.officeIdParamName, officeElement); final Long officeId = this.fromApiJsonHelper.extractLongNamed(HolidayApiConstants.officeIdParamName, officeElement);
final Office office = this.officeRepository.findOne(officeId); final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (office == null) { throw new OfficeNotFoundException(officeId); }
offices.add(office); offices.add(office);
} }
} }
@@ -47,7 +47,7 @@ import org.springframework.data.jpa.domain.AbstractPersistable;
@UniqueConstraint(columnNames = { "external_id" }, name = "externalid_org") }) @UniqueConstraint(columnNames = { "external_id" }, name = "externalid_org") })
public class Office extends AbstractPersistable<Long> { public class Office extends AbstractPersistable<Long> {
@OneToMany(fetch = FetchType.EAGER) @OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id") @JoinColumn(name = "parent_id")
private final List<Office> children = new LinkedList<>(); private final List<Office> children = new LinkedList<>();
@@ -238,4 +238,8 @@ public class Office extends AbstractPersistable<Long> {
return match; return match;
} }
public void loadLazyCollections() {
this.children.size() ;
}
} }
@@ -21,6 +21,7 @@ package org.apache.fineract.organisation.office.domain;
import org.apache.fineract.organisation.office.exception.OfficeNotFoundException; import org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* <p> * <p>
@@ -44,12 +45,20 @@ public class OfficeRepositoryWrapper {
return office; return office;
} }
public void save(final Office entity) { @Transactional(readOnly=true)
this.repository.save(entity); 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) { public Office saveAndFlush(final Office entity) {
this.repository.saveAndFlush(entity); return this.repository.saveAndFlush(entity);
} }
public void delete(final Office entity) { public void delete(final Office entity) {
@@ -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.MonetaryCurrency;
import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.organisation.office.domain.Office; 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.OfficeTransaction;
import org.apache.fineract.organisation.office.domain.OfficeTransactionRepository; 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.OfficeCommandFromApiJsonDeserializer;
import org.apache.fineract.organisation.office.serialization.OfficeTransactionCommandFromApiJsonDeserializer; import org.apache.fineract.organisation.office.serialization.OfficeTransactionCommandFromApiJsonDeserializer;
import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUser;
@@ -55,7 +54,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final OfficeCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final OfficeCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final OfficeTransactionCommandFromApiJsonDeserializer moneyTransferCommandFromApiJsonDeserializer; private final OfficeTransactionCommandFromApiJsonDeserializer moneyTransferCommandFromApiJsonDeserializer;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final OfficeTransactionRepository officeTransactionRepository; private final OfficeTransactionRepository officeTransactionRepository;
private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository; private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository;
@@ -63,12 +62,12 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP
public OfficeWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, public OfficeWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
final OfficeCommandFromApiJsonDeserializer fromApiJsonDeserializer, final OfficeCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final OfficeTransactionCommandFromApiJsonDeserializer moneyTransferCommandFromApiJsonDeserializer, final OfficeTransactionCommandFromApiJsonDeserializer moneyTransferCommandFromApiJsonDeserializer,
final OfficeRepository officeRepository, final OfficeTransactionRepository officeMonetaryTransferRepository, final OfficeRepositoryWrapper officeRepositoryWrapper, final OfficeTransactionRepository officeMonetaryTransferRepository,
final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository) { final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository) {
this.context = context; this.context = context;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.moneyTransferCommandFromApiJsonDeserializer = moneyTransferCommandFromApiJsonDeserializer; this.moneyTransferCommandFromApiJsonDeserializer = moneyTransferCommandFromApiJsonDeserializer;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.officeTransactionRepository = officeMonetaryTransferRepository; this.officeTransactionRepository = officeMonetaryTransferRepository;
this.applicationCurrencyRepository = applicationCurrencyRepository; this.applicationCurrencyRepository = applicationCurrencyRepository;
} }
@@ -94,11 +93,11 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP
final Office office = Office.fromJson(parent, command); final Office office = Office.fromJson(parent, command);
// pre save to generate id for use in office hierarchy // pre save to generate id for use in office hierarchy
this.officeRepository.save(office); this.officeRepositoryWrapper.save(office);
office.generateHierarchy(); office.generateHierarchy();
this.officeRepository.save(office); this.officeRepositoryWrapper.save(office);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withCommandId(command.commandId()) // .withCommandId(command.commandId()) //
@@ -139,7 +138,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP
} }
if (!changes.isEmpty()) { if (!changes.isEmpty()) {
this.officeRepository.saveAndFlush(office); this.officeRepositoryWrapper.saveAndFlush(office);
} }
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
@@ -166,18 +165,16 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP
Office fromOffice = null; Office fromOffice = null;
final Long fromOfficeId = command.longValueOfParameterNamed("fromOfficeId"); final Long fromOfficeId = command.longValueOfParameterNamed("fromOfficeId");
if (fromOfficeId != null) { if (fromOfficeId != null) {
fromOffice = this.officeRepository.findOne(fromOfficeId); fromOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(fromOfficeId);
officeId = fromOffice.getId(); officeId = fromOffice.getId();
} }
Office toOffice = null; Office toOffice = null;
final Long toOfficeId = command.longValueOfParameterNamed("toOfficeId"); final Long toOfficeId = command.longValueOfParameterNamed("toOfficeId");
if (toOfficeId != null) { if (toOfficeId != null) {
toOffice = this.officeRepository.findOne(toOfficeId); toOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(toOfficeId);
officeId = toOffice.getId(); officeId = toOffice.getId();
} }
if (fromOffice == null && toOffice == null) { throw new OfficeNotFoundException(toOfficeId); }
final String currencyCode = command.stringValueOfParameterNamed("currencyCode"); final String currencyCode = command.stringValueOfParameterNamed("currencyCode");
final ApplicationCurrency appCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(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) { private Office validateUserPriviledgeOnOfficeAndRetrieve(final AppUser currentUser, final Long officeId) {
final Long userOfficeId = currentUser.getOffice().getId(); final Long userOfficeId = currentUser.getOffice().getId();
final Office userOffice = this.officeRepository.findOne(userOfficeId); final Office userOffice = this.officeRepositoryWrapper.findOfficeHierarchy(userOfficeId);
if (userOffice == null) { throw new OfficeNotFoundException(userOfficeId); }
if (userOffice.doesNotHaveAnOfficeInHierarchyWithId(officeId)) { throw new NoAuthorizationException( if (userOffice.doesNotHaveAnOfficeInHierarchyWithId(officeId)) { throw new NoAuthorizationException(
"User does not have sufficient priviledges to act on the provided office."); } "User does not have sufficient priviledges to act on the provided office."); }
Office officeToReturn = userOffice; Office officeToReturn = userOffice;
if (!userOffice.identifiedBy(officeId)) { if (!userOffice.identifiedBy(officeId)) {
officeToReturn = this.officeRepository.findOne(officeId); officeToReturn = this.officeRepositoryWrapper.findOfficeHierarchy(officeId);
if (officeToReturn == null) { throw new OfficeNotFoundException(officeId); }
} }
return officeToReturn; return officeToReturn;
@@ -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.data.CommandProcessingResultBuilder;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.organisation.office.domain.Office; 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.OfficeNotFoundException;
import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.Staff;
import org.apache.fineract.organisation.staff.domain.StaffRepository; import org.apache.fineract.organisation.staff.domain.StaffRepository;
import org.apache.fineract.organisation.staff.exception.StaffNotFoundException; import org.apache.fineract.organisation.staff.exception.StaffNotFoundException;
@@ -46,14 +45,14 @@ public class StaffWritePlatformServiceJpaRepositoryImpl implements StaffWritePla
private final StaffCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final StaffCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final StaffRepository staffRepository; private final StaffRepository staffRepository;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
@Autowired @Autowired
public StaffWritePlatformServiceJpaRepositoryImpl(final StaffCommandFromApiJsonDeserializer fromApiJsonDeserializer, public StaffWritePlatformServiceJpaRepositoryImpl(final StaffCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final StaffRepository staffRepository, final OfficeRepository officeRepository) { final StaffRepository staffRepository, final OfficeRepositoryWrapper officeRepositoryWrapper) {
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.staffRepository = staffRepository; this.staffRepository = staffRepository;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
} }
@Transactional @Transactional
@@ -65,9 +64,7 @@ public class StaffWritePlatformServiceJpaRepositoryImpl implements StaffWritePla
final Long officeId = command.longValueOfParameterNamed("officeId"); final Long officeId = command.longValueOfParameterNamed("officeId");
final Office staffOffice = this.officeRepository.findOne(officeId); final Office staffOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (staffOffice == null) { throw new OfficeNotFoundException(officeId); }
final Staff staff = Staff.fromJson(staffOffice, command); final Staff staff = Staff.fromJson(staffOffice, command);
this.staffRepository.save(staff); this.staffRepository.save(staff);
@@ -96,9 +93,7 @@ public class StaffWritePlatformServiceJpaRepositoryImpl implements StaffWritePla
if (changesOnly.containsKey("officeId")) { if (changesOnly.containsKey("officeId")) {
final Long officeId = (Long) changesOnly.get("officeId"); final Long officeId = (Long) changesOnly.get("officeId");
final Office newOffice = this.officeRepository.findOne(officeId); final Office newOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (newOffice == null) { throw new OfficeNotFoundException(officeId); }
staffForUpdate.changeOffice(newOffice); staffForUpdate.changeOffice(newOffice);
} }
@@ -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.exception.NoAuthorizationException;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.office.domain.Office; 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.OfficeNotFoundException;
import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.Staff;
import org.apache.fineract.organisation.staff.domain.StaffRepository; import org.apache.fineract.organisation.staff.domain.StaffRepository;
import org.apache.fineract.organisation.staff.exception.StaffNotFoundException; import org.apache.fineract.organisation.staff.exception.StaffNotFoundException;
@@ -70,7 +69,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer
private final TellerCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final TellerCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final TellerRepository tellerRepository; private final TellerRepository tellerRepository;
private final TellerRepositoryWrapper tellerRepositoryWrapper; private final TellerRepositoryWrapper tellerRepositoryWrapper;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final StaffRepository staffRepository; private final StaffRepository staffRepository;
private final CashierRepository cashierRepository; private final CashierRepository cashierRepository;
private final CashierTransactionRepository cashierTxnRepository; private final CashierTransactionRepository cashierTxnRepository;
@@ -80,7 +79,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer
@Autowired @Autowired
public TellerWritePlatformServiceJpaImpl(final PlatformSecurityContext context, public TellerWritePlatformServiceJpaImpl(final PlatformSecurityContext context,
final TellerCommandFromApiJsonDeserializer fromApiJsonDeserializer, final TellerRepository tellerRepository, 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, final StaffRepository staffRepository, CashierRepository cashierRepository, CashierTransactionRepository cashierTxnRepository,
JournalEntryRepository glJournalEntryRepository, JournalEntryRepository glJournalEntryRepository,
FinancialActivityAccountRepositoryWrapper financialActivityAccountRepositoryWrapper) { FinancialActivityAccountRepositoryWrapper financialActivityAccountRepositoryWrapper) {
@@ -88,7 +87,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.tellerRepository = tellerRepository; this.tellerRepository = tellerRepository;
this.tellerRepositoryWrapper = tellerRepositoryWrapper; this.tellerRepositoryWrapper = tellerRepositoryWrapper;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.staffRepository = staffRepository; this.staffRepository = staffRepository;
this.cashierRepository = cashierRepository; this.cashierRepository = cashierRepository;
this.cashierTxnRepository = cashierTxnRepository; this.cashierTxnRepository = cashierTxnRepository;
@@ -108,9 +107,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer
// final Office parent = // final Office parent =
// validateUserPriviledgeOnOfficeAndRetrieve(currentUser, officeId); // validateUserPriviledgeOnOfficeAndRetrieve(currentUser, officeId);
final Office tellerOffice = this.officeRepository.findOne(officeId); final Office tellerOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (tellerOffice == null) { throw new OfficeNotFoundException(officeId); }
final Teller teller = Teller.fromJson(tellerOffice, command); final Teller teller = Teller.fromJson(tellerOffice, command);
// pre save to generate id for use in office hierarchy // pre save to generate id for use in office hierarchy
@@ -133,9 +130,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer
try { try {
final Long officeId = command.longValueOfParameterNamed("officeId"); final Long officeId = command.longValueOfParameterNamed("officeId");
final Office tellerOffice = this.officeRepository.findOne(officeId); final Office tellerOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (tellerOffice == null) { throw new OfficeNotFoundException(officeId); }
final AppUser currentUser = this.context.authenticatedUser(); final AppUser currentUser = this.context.authenticatedUser();
this.fromApiJsonDeserializer.validateForCreateAndUpdateTeller(command.json()); this.fromApiJsonDeserializer.validateForCreateAndUpdateTeller(command.json());
@@ -167,9 +162,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer
private Teller validateUserPriviledgeOnTellerAndRetrieve(final AppUser currentUser, final Long tellerId) { private Teller validateUserPriviledgeOnTellerAndRetrieve(final AppUser currentUser, final Long tellerId) {
final Long userOfficeId = currentUser.getOffice().getId(); final Long userOfficeId = currentUser.getOffice().getId();
final Office userOffice = this.officeRepository.findOne(userOfficeId); final Office userOffice = this.officeRepositoryWrapper.findOfficeHierarchy(userOfficeId);
if (userOffice == null) { throw new OfficeNotFoundException(userOfficeId); }
final Teller tellerToReturn = this.tellerRepository.findOne(tellerId); final Teller tellerToReturn = this.tellerRepository.findOne(tellerId);
if (tellerToReturn != null) { if (tellerToReturn != null) {
final Long tellerOfficeId = tellerToReturn.officeId(); final Long tellerOfficeId = tellerToReturn.officeId();
@@ -31,7 +31,7 @@ import java.util.Locale;
import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
import org.apache.fineract.organisation.office.domain.Office; 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.Client;
import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.Loan;
@@ -47,17 +47,17 @@ import com.google.gson.JsonElement;
public class AccountTransferDetailAssembler { public class AccountTransferDetailAssembler {
private final ClientRepositoryWrapper clientRepository; private final ClientRepositoryWrapper clientRepository;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final SavingsAccountAssembler savingsAccountAssembler; private final SavingsAccountAssembler savingsAccountAssembler;
private final FromJsonHelper fromApiJsonHelper; private final FromJsonHelper fromApiJsonHelper;
private final LoanAssembler loanAccountAssembler; private final LoanAssembler loanAccountAssembler;
@Autowired @Autowired
public AccountTransferDetailAssembler(final ClientRepositoryWrapper clientRepository, final OfficeRepository officeRepository, public AccountTransferDetailAssembler(final ClientRepositoryWrapper clientRepository, final OfficeRepositoryWrapper officeRepositoryWrapper,
final SavingsAccountAssembler savingsAccountAssembler, final FromJsonHelper fromApiJsonHelper, final SavingsAccountAssembler savingsAccountAssembler, final FromJsonHelper fromApiJsonHelper,
final LoanAssembler loanAccountAssembler) { final LoanAssembler loanAccountAssembler) {
this.clientRepository = clientRepository; this.clientRepository = clientRepository;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.savingsAccountAssembler = savingsAccountAssembler; this.savingsAccountAssembler = savingsAccountAssembler;
this.fromApiJsonHelper = fromApiJsonHelper; this.fromApiJsonHelper = fromApiJsonHelper;
this.loanAccountAssembler = loanAccountAssembler; this.loanAccountAssembler = loanAccountAssembler;
@@ -104,13 +104,13 @@ public class AccountTransferDetailAssembler {
final JsonElement element = command.parsedJson(); final JsonElement element = command.parsedJson();
final Long fromOfficeId = this.fromApiJsonHelper.extractLongNamed(fromOfficeIdParamName, element); 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 Long fromClientId = this.fromApiJsonHelper.extractLongNamed(fromClientIdParamName, element);
final Client fromClient = this.clientRepository.findOneWithNotFoundDetection(fromClientId); final Client fromClient = this.clientRepository.findOneWithNotFoundDetection(fromClientId);
final Long toOfficeId = this.fromApiJsonHelper.extractLongNamed(toOfficeIdParamName, element); 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 Long toClientId = this.fromApiJsonHelper.extractLongNamed(toClientIdParamName, element);
final Client toClient = this.clientRepository.findOneWithNotFoundDetection(toClientId); final Client toClient = this.clientRepository.findOneWithNotFoundDetection(toClientId);
@@ -128,13 +128,13 @@ public class AccountTransferDetailAssembler {
final JsonElement element = command.parsedJson(); final JsonElement element = command.parsedJson();
final Long fromOfficeId = this.fromApiJsonHelper.extractLongNamed(fromOfficeIdParamName, element); 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 Long fromClientId = this.fromApiJsonHelper.extractLongNamed(fromClientIdParamName, element);
final Client fromClient = this.clientRepository.findOneWithNotFoundDetection(fromClientId); final Client fromClient = this.clientRepository.findOneWithNotFoundDetection(fromClientId);
final Long toOfficeId = this.fromApiJsonHelper.extractLongNamed(toOfficeIdParamName, element); 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 Long toClientId = this.fromApiJsonHelper.extractLongNamed(toClientIdParamName, element);
final Client toClient = this.clientRepository.findOneWithNotFoundDetection(toClientId); final Client toClient = this.clientRepository.findOneWithNotFoundDetection(toClientId);
@@ -152,13 +152,13 @@ public class AccountTransferDetailAssembler {
final JsonElement element = command.parsedJson(); final JsonElement element = command.parsedJson();
final Long fromOfficeId = this.fromApiJsonHelper.extractLongNamed(fromOfficeIdParamName, element); 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 Long fromClientId = this.fromApiJsonHelper.extractLongNamed(fromClientIdParamName, element);
final Client fromClient = this.clientRepository.findOneWithNotFoundDetection(fromClientId); final Client fromClient = this.clientRepository.findOneWithNotFoundDetection(fromClientId);
final Long toOfficeId = this.fromApiJsonHelper.extractLongNamed(toOfficeIdParamName, element); 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 Long toClientId = this.fromApiJsonHelper.extractLongNamed(toClientIdParamName, element);
final Client toClient = this.clientRepository.findOneWithNotFoundDetection(toClientId); final Client toClient = this.clientRepository.findOneWithNotFoundDetection(toClientId);
@@ -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.ClientAddress;
import org.apache.fineract.portfolio.client.domain.ClientAddressRepository; import org.apache.fineract.portfolio.client.domain.ClientAddressRepository;
import org.apache.fineract.portfolio.client.domain.ClientAddressRepositoryWrapper; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -45,7 +45,7 @@ public class AddressWritePlatformServiceImpl implements AddressWritePlatformServ
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final CodeValueRepository codeValueRepository; private final CodeValueRepository codeValueRepository;
private final ClientAddressRepository clientAddressRepository; private final ClientAddressRepository clientAddressRepository;
private final ClientRepository clientRepository; private final ClientRepositoryWrapper clientRepositoryWrapper;
private final AddressRepository addressRepository; private final AddressRepository addressRepository;
private final ClientAddressRepositoryWrapper clientAddressRepositoryWrapper; private final ClientAddressRepositoryWrapper clientAddressRepositoryWrapper;
private final AddressCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final AddressCommandFromApiJsonDeserializer fromApiJsonDeserializer;
@@ -53,13 +53,13 @@ public class AddressWritePlatformServiceImpl implements AddressWritePlatformServ
@Autowired @Autowired
public AddressWritePlatformServiceImpl(final PlatformSecurityContext context, public AddressWritePlatformServiceImpl(final PlatformSecurityContext context,
final CodeValueRepository codeValueRepository, final ClientAddressRepository clientAddressRepository, final CodeValueRepository codeValueRepository, final ClientAddressRepository clientAddressRepository,
final ClientRepository clientRepository, final AddressRepository addressRepository, final ClientRepositoryWrapper clientRepositoryWrapper, final AddressRepository addressRepository,
final ClientAddressRepositoryWrapper clientAddressRepositoryWrapper, final ClientAddressRepositoryWrapper clientAddressRepositoryWrapper,
final AddressCommandFromApiJsonDeserializer fromApiJsonDeserializer) { final AddressCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
this.context = context; this.context = context;
this.codeValueRepository = codeValueRepository; this.codeValueRepository = codeValueRepository;
this.clientAddressRepository = clientAddressRepository; this.clientAddressRepository = clientAddressRepository;
this.clientRepository = clientRepository; this.clientRepositoryWrapper = clientRepositoryWrapper;
this.addressRepository = addressRepository; this.addressRepository = addressRepository;
this.clientAddressRepositoryWrapper = clientAddressRepositoryWrapper; this.clientAddressRepositoryWrapper = clientAddressRepositoryWrapper;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
@@ -96,7 +96,7 @@ public class AddressWritePlatformServiceImpl implements AddressWritePlatformServ
final Long addressid = add.getId(); final Long addressid = add.getId();
final Address addobj = this.addressRepository.getOne(addressid); 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 boolean isActive = command.booleanPrimitiveValueOfParameterNamed("isActive");
final ClientAddress clientAddressobj = ClientAddress.fromJson(isActive, client, addobj, addressTypeIdObj); final ClientAddress clientAddressobj = ClientAddress.fromJson(isActive, client, addobj, addressTypeIdObj);
@@ -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.Group;
import org.apache.fineract.portfolio.group.domain.GroupRepositoryWrapper; import org.apache.fineract.portfolio.group.domain.GroupRepositoryWrapper;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; 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.domain.LoanStatus;
import org.apache.fineract.portfolio.loanaccount.service.LoanWritePlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanWritePlatformService;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
@@ -69,7 +69,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr
private final LoanWritePlatformService loanWritePlatformService; private final LoanWritePlatformService loanWritePlatformService;
private final ConfigurationDomainService configurationDomainService; private final ConfigurationDomainService configurationDomainService;
private final GroupRepositoryWrapper groupRepository; private final GroupRepositoryWrapper groupRepository;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final ClientRepositoryWrapper clientRepository; private final ClientRepositoryWrapper clientRepository;
@Autowired @Autowired
@@ -78,7 +78,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr
final CalendarCommandFromApiJsonDeserializer fromApiJsonDeserializer, final CalendarCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final CalendarInstanceRepository calendarInstanceRepository, final LoanWritePlatformService loanWritePlatformService, final CalendarInstanceRepository calendarInstanceRepository, final LoanWritePlatformService loanWritePlatformService,
final ConfigurationDomainService configurationDomainService, final GroupRepositoryWrapper groupRepository, final ConfigurationDomainService configurationDomainService, final GroupRepositoryWrapper groupRepository,
final LoanRepository loanRepository, final ClientRepositoryWrapper clientRepository) { final LoanRepositoryWrapper loanRepositoryWrapper, final ClientRepositoryWrapper clientRepository) {
this.calendarRepository = calendarRepository; this.calendarRepository = calendarRepository;
this.calendarHistoryRepository = calendarHistoryRepository; this.calendarHistoryRepository = calendarHistoryRepository;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
@@ -86,7 +86,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr
this.loanWritePlatformService = loanWritePlatformService; this.loanWritePlatformService = loanWritePlatformService;
this.configurationDomainService = configurationDomainService; this.configurationDomainService = configurationDomainService;
this.groupRepository = groupRepository; this.groupRepository = groupRepository;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.clientRepository = clientRepository; this.clientRepository = clientRepository;
} }
@@ -104,7 +104,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr
entityType = centerOrGroup.isCenter() ? CalendarEntityType.CENTERS : CalendarEntityType.GROUPS; entityType = centerOrGroup.isCenter() ? CalendarEntityType.CENTERS : CalendarEntityType.GROUPS;
entityId = command.getGroupId(); entityId = command.getGroupId();
} else if (command.getLoanId() != null) { } 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(); entityActivationDate = (loan.getApprovedOnDate() == null) ? loan.getSubmittedOnDate() : loan.getApprovedOnDate();
entityType = CalendarEntityType.LOANS; entityType = CalendarEntityType.LOANS;
entityId = command.getLoanId(); entityId = command.getLoanId();
@@ -54,8 +54,6 @@ import org.apache.fineract.organisation.office.domain.Office;
import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.Staff;
import org.apache.fineract.portfolio.client.api.ClientApiConstants; import org.apache.fineract.portfolio.client.api.ClientApiConstants;
import org.apache.fineract.portfolio.group.domain.Group; 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.apache.fineract.useradministration.domain.AppUser;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.DateTimeFormatter;
@@ -132,7 +130,7 @@ public final class Client extends AbstractPersistable<Long> {
@JoinColumn(name = "staff_id") @JoinColumn(name = "staff_id")
private Staff staff; 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")) @JoinTable(name = "m_group_client", joinColumns = @JoinColumn(name = "client_id"), inverseJoinColumns = @JoinColumn(name = "group_id"))
private Set<Group> groups; private Set<Group> groups;
@@ -203,13 +201,11 @@ public final class Client extends AbstractPersistable<Long> {
@JoinColumn(name = "activatedon_userid", nullable = true) @JoinColumn(name = "activatedon_userid", nullable = true)
private AppUser activatedBy; private AppUser activatedBy;
@ManyToOne @Column(name = "default_savings_product", nullable = true)
@JoinColumn(name = "default_savings_product", nullable = true) private Long savingsProductId;
private SavingsProduct savingsProduct;
@ManyToOne @Column(name = "default_savings_account", nullable = true)
@JoinColumn(name = "default_savings_account", nullable = true) private Long savingsAccountId;
private SavingsAccount savingsAccount;
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "client_type_cv_id", nullable = true) @JoinColumn(name = "client_type_cv_id", nullable = true)
@@ -222,16 +218,16 @@ public final class Client extends AbstractPersistable<Long> {
@Column(name = "legal_form_enum", nullable = true) @Column(name = "legal_form_enum", nullable = true)
private Integer legalForm; private Integer legalForm;
@Column(name = "reopened_on_date", nullable = true) @Column(name = "reopened_on_date", nullable = true)
@Temporal(TemporalType.DATE) @Temporal(TemporalType.DATE)
private Date reopenedDate; private Date reopenedDate;
@ManyToOne(optional = true, fetch=FetchType.LAZY) @ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "reopened_by_userid", nullable = true) @JoinColumn(name = "reopened_by_userid", nullable = true)
private AppUser reopenedBy; private AppUser reopenedBy;
public static Client createNew(final AppUser currentUser, final Office clientOffice, final Group clientParentGroup, final Staff staff, 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 Integer legalForm, final JsonCommand command) {
final String accountNo = command.stringValueOfParameterNamed(ClientApiConstants.accountNoParamName); final String accountNo = command.stringValueOfParameterNamed(ClientApiConstants.accountNoParamName);
@@ -266,9 +262,9 @@ public final class Client extends AbstractPersistable<Long> {
if (command.hasParameter(ClientApiConstants.submittedOnDateParamName)) { if (command.hasParameter(ClientApiConstants.submittedOnDateParamName)) {
submittedOnDate = command.localDateValueOfParameterNamed(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, 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); gender, clientType, clientClassification, legalForm);
} }
@@ -279,7 +275,7 @@ public final class Client extends AbstractPersistable<Long> {
private Client(final AppUser currentUser, final ClientStatus status, final Office office, final Group clientParentGroup, 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 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 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) { final LocalDate dateOfBirth, final CodeValue gender, final CodeValue clientType, final CodeValue clientClassification, final Integer legalForm) {
if (StringUtils.isBlank(accountNo)) { if (StringUtils.isBlank(accountNo)) {
@@ -343,8 +339,8 @@ public final class Client extends AbstractPersistable<Long> {
} }
this.staff = staff; this.staff = staff;
this.savingsProduct = savingsProduct; this.savingsProductId = savingsProductId;
this.savingsAccount = savingsAccount; this.savingsAccountId = savingsAccountId;
if (gender != null) { if (gender != null) {
this.gender = gender; this.gender = gender;
@@ -863,32 +859,24 @@ public final class Client extends AbstractPersistable<Long> {
return false; return false;
} }
private Long savingsProductId() { public Long savingsProductId() {
Long savingsProductId = null; return this.savingsProductId;
if (this.savingsProduct != null) {
savingsProductId = this.savingsProduct.getId();
}
return savingsProductId;
} }
public SavingsProduct SavingsProduct() { public void updateSavingsProduct(final Long savingsProductId) {
return this.savingsProduct; this.savingsProductId = savingsProductId;
}
public void updateSavingsProduct(SavingsProduct savingsProduct) {
this.savingsProduct = savingsProduct;
} }
public AppUser activatedBy() { public AppUser activatedBy() {
return this.activatedBy; return this.activatedBy;
} }
public SavingsAccount savingsAccount() { public Long savingsAccountId() {
return this.savingsAccount; return this.savingsAccountId;
} }
public void updateSavingsAccount(SavingsAccount savingsAccount) { public void updateSavingsAccount(Long savingsAccountId) {
this.savingsAccount = savingsAccount; this.savingsAccountId = savingsAccountId;
} }
public Long genderId() { public Long genderId() {
@@ -996,20 +984,24 @@ public final class Client extends AbstractPersistable<Long> {
} }
public void reOpened(AppUser currentUser, Date reopenedDate) { public void reOpened(AppUser currentUser, Date reopenedDate) {
this.reopenedDate = reopenedDate; this.reopenedDate = reopenedDate;
this.reopenedBy = currentUser; this.reopenedBy = currentUser;
this.updatedBy = currentUser; this.updatedBy = currentUser;
this.updatedOnDate = reopenedDate; this.updatedOnDate = reopenedDate;
this.status = ClientStatus.PENDING.getValue(); this.status = ClientStatus.PENDING.getValue();
} }
public Integer getLegalForm() { public Integer getLegalForm() {
return legalForm; return legalForm;
} }
public void setLegalForm(Integer legalForm) { public void setLegalForm(Integer legalForm) {
this.legalForm = legalForm; this.legalForm = legalForm;
} }
public void loadLazyCollections() {
this.groups.size() ;
}
} }
@@ -25,7 +25,6 @@ import javax.persistence.ManyToOne;
import javax.persistence.Table; import javax.persistence.Table;
import org.apache.fineract.infrastructure.codes.domain.CodeValue; 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.apache.fineract.portfolio.address.domain.Address;
import org.springframework.data.jpa.domain.AbstractPersistable; import org.springframework.data.jpa.domain.AbstractPersistable;
@@ -21,6 +21,6 @@ package org.apache.fineract.portfolio.client.domain;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface ClientRepository extends JpaRepository<Client, Long>, JpaSpecificationExecutor<Client> { abstract interface ClientRepository extends JpaRepository<Client, Long>, JpaSpecificationExecutor<Client> {
// no added behaviour // no added behaviour
} }
@@ -18,11 +18,15 @@
*/ */
package org.apache.fineract.portfolio.client.domain; 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.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.portfolio.client.exception.ClientNotActiveException; import org.apache.fineract.portfolio.client.exception.ClientNotActiveException;
import org.apache.fineract.portfolio.client.exception.ClientNotFoundException; import org.apache.fineract.portfolio.client.exception.ClientNotFoundException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* <p> * <p>
@@ -43,11 +47,22 @@ public class ClientRepositoryWrapper {
} }
public Client findOneWithNotFoundDetection(final Long id) { public Client findOneWithNotFoundDetection(final Long id) {
final Client client = this.repository.findOne(id); return this.findOneWithNotFoundDetection(id, false) ;
if (client == null) { throw new ClientNotFoundException(id); } }
@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; return client;
} }
public List<Client> findAll(final Collection<Long> clientIds) {
return this.repository.findAll(clientIds) ;
}
public void save(final Client client) { public void save(final Client client) {
this.repository.save(client); this.repository.save(client);
} }
@@ -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.core.serialization.FromJsonHelper;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.office.domain.Office; 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.OfficeNotFoundException;
import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.Staff;
import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper; import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper;
import org.apache.fineract.portfolio.address.service.AddressWritePlatformService; 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.GroupMemberCountNotInPermissibleRangeException;
import org.apache.fineract.portfolio.group.exception.GroupNotFoundException; import org.apache.fineract.portfolio.group.exception.GroupNotFoundException;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; 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.Note;
import org.apache.fineract.portfolio.note.domain.NoteRepository; import org.apache.fineract.portfolio.note.domain.NoteRepository;
import org.apache.fineract.portfolio.savings.data.SavingsAccountDataDTO; import org.apache.fineract.portfolio.savings.data.SavingsAccountDataDTO;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount; 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.SavingsProduct;
import org.apache.fineract.portfolio.savings.domain.SavingsProductRepository; 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.exception.SavingsProductNotFoundException;
import org.apache.fineract.portfolio.savings.service.SavingsApplicationProcessWritePlatformService; import org.apache.fineract.portfolio.savings.service.SavingsApplicationProcessWritePlatformService;
import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUser;
@@ -98,15 +96,15 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final ClientRepositoryWrapper clientRepository; private final ClientRepositoryWrapper clientRepository;
private final ClientNonPersonRepositoryWrapper clientNonPersonRepository; private final ClientNonPersonRepositoryWrapper clientNonPersonRepository;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final NoteRepository noteRepository; private final NoteRepository noteRepository;
private final GroupRepository groupRepository; private final GroupRepository groupRepository;
private final ClientDataValidator fromApiJsonDeserializer; private final ClientDataValidator fromApiJsonDeserializer;
private final AccountNumberGenerator accountNumberGenerator; private final AccountNumberGenerator accountNumberGenerator;
private final StaffRepositoryWrapper staffRepository; private final StaffRepositoryWrapper staffRepository;
private final CodeValueRepositoryWrapper codeValueRepository; private final CodeValueRepositoryWrapper codeValueRepository;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final SavingsAccountRepository savingsRepository; private final SavingsAccountRepositoryWrapper savingsRepositoryWrapper;
private final SavingsProductRepository savingsProductRepository; private final SavingsProductRepository savingsProductRepository;
private final SavingsApplicationProcessWritePlatformService savingsApplicationProcessWritePlatformService; private final SavingsApplicationProcessWritePlatformService savingsApplicationProcessWritePlatformService;
private final CommandProcessingService commandProcessingService; private final CommandProcessingService commandProcessingService;
@@ -118,11 +116,11 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
@Autowired @Autowired
public ClientWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, 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 ClientDataValidator fromApiJsonDeserializer, final AccountNumberGenerator accountNumberGenerator,
final GroupRepository groupRepository, final StaffRepositoryWrapper staffRepository, final GroupRepository groupRepository, final StaffRepositoryWrapper staffRepository,
final CodeValueRepositoryWrapper codeValueRepository, final LoanRepository loanRepository, final CodeValueRepositoryWrapper codeValueRepository, final LoanRepositoryWrapper loanRepositoryWrapper,
final SavingsAccountRepository savingsRepository, final SavingsProductRepository savingsProductRepository, final SavingsAccountRepositoryWrapper savingsRepositoryWrapper, final SavingsProductRepository savingsProductRepository,
final SavingsApplicationProcessWritePlatformService savingsApplicationProcessWritePlatformService, final SavingsApplicationProcessWritePlatformService savingsApplicationProcessWritePlatformService,
final CommandProcessingService commandProcessingService, final ConfigurationDomainService configurationDomainService, final CommandProcessingService commandProcessingService, final ConfigurationDomainService configurationDomainService,
final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository, final FromJsonHelper fromApiJsonHelper, final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository, final FromJsonHelper fromApiJsonHelper,
@@ -131,15 +129,15 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
this.context = context; this.context = context;
this.clientRepository = clientRepository; this.clientRepository = clientRepository;
this.clientNonPersonRepository = clientNonPersonRepository; this.clientNonPersonRepository = clientNonPersonRepository;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.noteRepository = noteRepository; this.noteRepository = noteRepository;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.accountNumberGenerator = accountNumberGenerator; this.accountNumberGenerator = accountNumberGenerator;
this.groupRepository = groupRepository; this.groupRepository = groupRepository;
this.staffRepository = staffRepository; this.staffRepository = staffRepository;
this.codeValueRepository = codeValueRepository; this.codeValueRepository = codeValueRepository;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.savingsRepository = savingsRepository; this.savingsRepositoryWrapper = savingsRepositoryWrapper;
this.savingsProductRepository = savingsProductRepository; this.savingsProductRepository = savingsProductRepository;
this.savingsApplicationProcessWritePlatformService = savingsApplicationProcessWritePlatformService; this.savingsApplicationProcessWritePlatformService = savingsApplicationProcessWritePlatformService;
this.commandProcessingService = commandProcessingService; this.commandProcessingService = commandProcessingService;
@@ -217,8 +215,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
final Long officeId = command.longValueOfParameterNamed(ClientApiConstants.officeIdParamName); final Long officeId = command.longValueOfParameterNamed(ClientApiConstants.officeIdParamName);
final Office clientOffice = this.officeRepository.findOne(officeId); final Office clientOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (clientOffice == null) { throw new OfficeNotFoundException(officeId); }
final Long groupId = command.longValueOfParameterNamed(ClientApiConstants.groupIdParamName); final Long groupId = command.longValueOfParameterNamed(ClientApiConstants.groupIdParamName);
@@ -254,12 +251,11 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
ClientApiConstants.CLIENT_CLASSIFICATION, clientClassificationId); ClientApiConstants.CLIENT_CLASSIFICATION, clientClassificationId);
} }
SavingsProduct savingsProduct = null;
final Long savingsProductId = command.longValueOfParameterNamed(ClientApiConstants.savingsProductIdParamName); final Long savingsProductId = command.longValueOfParameterNamed(ClientApiConstants.savingsProductIdParamName);
if (savingsProductId != null) { if (savingsProductId != null) {
savingsProduct = this.savingsProductRepository.findOne(savingsProductId); SavingsProduct savingsProduct = this.savingsProductRepository.findOne(savingsProductId);
if (savingsProduct == null) { throw new SavingsProductNotFoundException(savingsProductId); } if (savingsProduct == null) { throw new SavingsProductNotFoundException(savingsProductId); }
} }
final Integer legalFormParamValue = command.integerValueOfParameterNamed(ClientApiConstants.legalFormIdParamName); 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); clientType, clientClassification, legalFormValue, command);
boolean rollbackTransaction = false; boolean rollbackTransaction = false;
if (newClient.isActive()) { if (newClient.isActive()) {
@@ -300,16 +296,13 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
} }
if(isEntity) if(isEntity) {
extractAndCreateClientNonPerson(newClient, command); 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() // return new CommandProcessingResultBuilder() //
@@ -408,7 +401,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
savingsProduct = this.savingsProductRepository.findOne(savingsProductId); savingsProduct = this.savingsProductRepository.findOne(savingsProductId);
if (savingsProduct == null) { throw new SavingsProductNotFoundException(savingsProductId); } if (savingsProduct == null) { throw new SavingsProductNotFoundException(savingsProductId); }
} }
clientForUpdate.updateSavingsProduct(savingsProduct); clientForUpdate.updateSavingsProduct(savingsProductId);
} }
if (changes.containsKey(ClientApiConstants.genderIdParamName)) { if (changes.containsKey(ClientApiConstants.genderIdParamName)) {
@@ -518,7 +511,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
try { try {
this.fromApiJsonDeserializer.validateActivation(command); this.fromApiJsonDeserializer.validateActivation(command);
final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId); final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId, true);
validateParentGroupRulesBeforeClientActivation(client); validateParentGroupRulesBeforeClientActivation(client);
final Locale locale = command.extractLocale(); final Locale locale = command.extractLocale();
@@ -546,13 +539,13 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
private CommandProcessingResult openSavingsAccount(final Client client, final DateTimeFormatter fmt) { private CommandProcessingResult openSavingsAccount(final Client client, final DateTimeFormatter fmt) {
CommandProcessingResult commandProcessingResult = CommandProcessingResult.empty(); CommandProcessingResult commandProcessingResult = CommandProcessingResult.empty();
if (client.isActive() && client.SavingsProduct() != null) { if (client.isActive() && client.savingsProductId() != null) {
SavingsAccountDataDTO savingsAccountDataDTO = new SavingsAccountDataDTO(client, null, client.SavingsProduct(), SavingsAccountDataDTO savingsAccountDataDTO = new SavingsAccountDataDTO(client, null, client.savingsProductId(),
client.getActivationLocalDate(), client.activatedBy(), fmt); client.getActivationLocalDate(), client.activatedBy(), fmt);
commandProcessingResult = this.savingsApplicationProcessWritePlatformService.createActiveApplication(savingsAccountDataDTO); commandProcessingResult = this.savingsApplicationProcessWritePlatformService.createActiveApplication(savingsAccountDataDTO);
if (commandProcessingResult.getSavingsId() != null) { if (commandProcessingResult.getSavingsId() != null) {
SavingsAccount savingsAccount = this.savingsRepository.findOne(commandProcessingResult.getSavingsId()); this.savingsRepositoryWrapper.findOneWithNotFoundDetection(commandProcessingResult.getSavingsId());
client.updateSavingsAccount(savingsAccount); client.updateSavingsAccount(commandProcessingResult.getSavingsId());
client.updateSavingsProduct(null); client.updateSavingsProduct(null);
} }
} }
@@ -660,9 +653,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
throw new InvalidClientStateTransitionException("close", "date.cannot.before.client.actvation.date", errorMessage, throw new InvalidClientStateTransitionException("close", "date.cannot.before.client.actvation.date", errorMessage,
closureDate, client.getActivationLocalDate()); closureDate, client.getActivationLocalDate());
} }
final List<Loan> clientLoans = this.loanRepositoryWrapper.findLoanByClientId(clientId);
final List<Loan> clientLoans = this.loanRepository.findLoanByClientId(clientId);
for (final Loan loan : clientLoans) { for (final Loan loan : clientLoans) {
final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.status().getValue()); final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.status().getValue());
if (loanStatus.isOpen() || loanStatus.isPendingApproval() || loanStatus.isAwaitingDisbursal()) { if (loanStatus.isOpen() || loanStatus.isPendingApproval() || loanStatus.isAwaitingDisbursal()) {
@@ -677,7 +668,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
throw new InvalidClientStateTransitionException("close", "loan.overpaid", errorMessage); throw new InvalidClientStateTransitionException("close", "loan.overpaid", errorMessage);
} }
} }
final List<SavingsAccount> clientSavingAccounts = this.savingsRepository.findSavingAccountByClientId(clientId); final List<SavingsAccount> clientSavingAccounts = this.savingsRepositoryWrapper.findSavingAccountByClientId(clientId);
for (final SavingsAccount saving : clientSavingAccounts) { for (final SavingsAccount saving : clientSavingAccounts) {
if (saving.isActive() || saving.isSubmittedAndPendingApproval() || saving.isApproved()) { if (saving.isActive() || saving.isSubmittedAndPendingApproval() || saving.isApproved()) {
@@ -714,14 +705,13 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
SavingsAccount savingsAccount = null; SavingsAccount savingsAccount = null;
final Long savingsId = command.longValueOfParameterNamed(ClientApiConstants.savingsAccountIdParamName); final Long savingsId = command.longValueOfParameterNamed(ClientApiConstants.savingsAccountIdParamName);
if (savingsId != null) { if (savingsId != null) {
savingsAccount = this.savingsRepository.findOne(savingsId); savingsAccount = this.savingsRepositoryWrapper.findOneWithNotFoundDetection(savingsId);
if (savingsAccount == null) { throw new SavingsAccountNotFoundException(savingsId); }
if (!savingsAccount.getClient().identifiedBy(clientId)) { if (!savingsAccount.getClient().identifiedBy(clientId)) {
String defaultUserMessage = "saving account must belongs to client"; String defaultUserMessage = "saving account must belongs to client";
throw new InvalidClientSavingProductException("saving.account", "must.belongs.to.client", defaultUserMessage, savingsId, throw new InvalidClientSavingProductException("saving.account", "must.belongs.to.client", defaultUserMessage, savingsId,
clientForUpdate.getId()); clientForUpdate.getId());
} }
clientForUpdate.updateSavingsAccount(savingsAccount); clientForUpdate.updateSavingsAccount(savingsId);
} }
this.clientRepository.saveAndFlush(clientForUpdate); this.clientRepository.saveAndFlush(clientForUpdate);
@@ -30,9 +30,7 @@ import org.apache.fineract.infrastructure.security.service.PlatformSecurityConte
import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.portfolio.collateral.data.CollateralData; import org.apache.fineract.portfolio.collateral.data.CollateralData;
import org.apache.fineract.portfolio.collateral.exception.CollateralNotFoundException; import org.apache.fineract.portfolio.collateral.exception.CollateralNotFoundException;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
@@ -44,14 +42,14 @@ public class CollateralReadPlatformServiceImpl implements CollateralReadPlatform
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
@Autowired @Autowired
public CollateralReadPlatformServiceImpl(final PlatformSecurityContext context, final RoutingDataSource dataSource, public CollateralReadPlatformServiceImpl(final PlatformSecurityContext context, final RoutingDataSource dataSource,
final LoanRepository loanRepository) { final LoanRepositoryWrapper loanRepositoryWrapper) {
this.context = context; this.context = context;
this.jdbcTemplate = new JdbcTemplate(dataSource); this.jdbcTemplate = new JdbcTemplate(dataSource);
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
} }
private static final class CollateralMapper implements RowMapper<CollateralData> { private static final class CollateralMapper implements RowMapper<CollateralData> {
@@ -119,8 +117,7 @@ public class CollateralReadPlatformServiceImpl implements CollateralReadPlatform
@Override @Override
public List<CollateralData> retrieveCollateralsForValidLoan(final Long loanId) { public List<CollateralData> retrieveCollateralsForValidLoan(final Long loanId) {
final Loan loan = this.loanRepository.findOne(loanId); this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId);
if (loan == null) { throw new LoanNotFoundException(loanId); }
return retrieveCollaterals(loanId); return retrieveCollaterals(loanId);
} }
@@ -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.LoanCollateral;
import org.apache.fineract.portfolio.collateral.domain.LoanCollateralRepository; import org.apache.fineract.portfolio.collateral.domain.LoanCollateralRepository;
import org.apache.fineract.portfolio.collateral.exception.CollateralCannotBeCreatedException; 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.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.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.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.collateral.serialization.CollateralCommandFromApiJsonDeserializer;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; 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.exception.LoanNotFoundException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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 static Logger logger = LoggerFactory.getLogger(CollateralWritePlatformServiceJpaRepositoryImpl.class);
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final LoanCollateralRepository collateralRepository; private final LoanCollateralRepository collateralRepository;
private final CodeValueRepositoryWrapper codeValueRepository; private final CodeValueRepositoryWrapper codeValueRepository;
private final CollateralCommandFromApiJsonDeserializer collateralCommandFromApiJsonDeserializer; private final CollateralCommandFromApiJsonDeserializer collateralCommandFromApiJsonDeserializer;
@Autowired @Autowired
public CollateralWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final LoanRepository loanRepository, public CollateralWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final LoanRepositoryWrapper loanRepositoryWrapper,
final LoanCollateralRepository collateralRepository, final CodeValueRepositoryWrapper codeValueRepository, final LoanCollateralRepository collateralRepository, final CodeValueRepositoryWrapper codeValueRepository,
final CollateralCommandFromApiJsonDeserializer collateralCommandFromApiJsonDeserializer) { final CollateralCommandFromApiJsonDeserializer collateralCommandFromApiJsonDeserializer) {
this.context = context; this.context = context;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.collateralRepository = collateralRepository; this.collateralRepository = collateralRepository;
this.codeValueRepository = codeValueRepository; this.codeValueRepository = codeValueRepository;
this.collateralCommandFromApiJsonDeserializer = collateralCommandFromApiJsonDeserializer; this.collateralCommandFromApiJsonDeserializer = collateralCommandFromApiJsonDeserializer;
@@ -81,9 +80,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater
collateralCommand.validateForCreate(); collateralCommand.validateForCreate();
try { try {
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); }
final CodeValue collateralType = this.codeValueRepository.findOneByCodeNameAndIdWithNotFoundDetection( final CodeValue collateralType = this.codeValueRepository.findOneByCodeNameAndIdWithNotFoundDetection(
CollateralApiConstants.COLLATERAL_CODE_NAME, collateralCommand.getCollateralTypeId()); CollateralApiConstants.COLLATERAL_CODE_NAME, collateralCommand.getCollateralTypeId());
final LoanCollateral collateral = LoanCollateral.fromJson(loan, collateralType, command); final LoanCollateral collateral = LoanCollateral.fromJson(loan, collateralType, command);
@@ -118,9 +115,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater
final Long collateralTypeId = collateralCommand.getCollateralTypeId(); final Long collateralTypeId = collateralCommand.getCollateralTypeId();
try { try {
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); }
CodeValue collateralType = null; CodeValue collateralType = null;
final LoanCollateral collateralForUpdate = this.collateralRepository.findOne(collateralId); final LoanCollateral collateralForUpdate = this.collateralRepository.findOne(collateralId);
@@ -161,8 +156,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater
@Transactional @Transactional
@Override @Override
public CommandProcessingResult deleteCollateral(final Long loanId, final Long collateralId, final Long commandId) { public CommandProcessingResult deleteCollateral(final Long loanId, final Long collateralId, final Long commandId) {
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true) ;
if (loan == null) { throw new LoanNotFoundException(loanId); }
final LoanCollateral collateral = this.collateralRepository.findByLoanIdAndId(loanId, collateralId); final LoanCollateral collateral = this.collateralRepository.findByLoanIdAndId(loanId, collateralId);
if (collateral == null) { throw new CollateralNotFoundException(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( if (!loan.status().isSubmittedAndPendingApproval()) { throw new CollateralCannotBeDeletedException(
LOAN_COLLATERAL_CANNOT_BE_DELETED_REASON.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loanId, collateralId); } LOAN_COLLATERAL_CANNOT_BE_DELETED_REASON.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loanId, collateralId); }
loan.getCollateral().remove(collateral);
this.collateralRepository.delete(collateral); this.collateralRepository.delete(collateral);
return new CommandProcessingResultBuilder().withCommandId(commandId).withLoanId(loanId).withEntityId(collateralId).build(); return new CommandProcessingResultBuilder().withCommandId(commandId).withLoanId(loanId).withEntityId(collateralId).build();
} }
@@ -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.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.office.domain.Office; 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.InvalidOfficeException;
import org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.Staff;
import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper; import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper;
import org.apache.fineract.portfolio.calendar.domain.Calendar; 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.exception.InvalidGroupStateTransitionException;
import org.apache.fineract.portfolio.group.serialization.GroupingTypesDataValidator; import org.apache.fineract.portfolio.group.serialization.GroupingTypesDataValidator;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; 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.LoanRepositoryWrapper;
import org.apache.fineract.portfolio.note.domain.Note; import org.apache.fineract.portfolio.note.domain.Note;
import org.apache.fineract.portfolio.note.domain.NoteRepository; import org.apache.fineract.portfolio.note.domain.NoteRepository;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount; 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.apache.fineract.useradministration.domain.AppUser;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -95,47 +93,43 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final GroupRepositoryWrapper groupRepository; private final GroupRepositoryWrapper groupRepository;
private final ClientRepositoryWrapper clientRepositoryWrapper; private final ClientRepositoryWrapper clientRepositoryWrapper;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final StaffRepositoryWrapper staffRepository; private final StaffRepositoryWrapper staffRepository;
private final NoteRepository noteRepository; private final NoteRepository noteRepository;
private final GroupLevelRepository groupLevelRepository; private final GroupLevelRepository groupLevelRepository;
private final GroupingTypesDataValidator fromApiJsonDeserializer; private final GroupingTypesDataValidator fromApiJsonDeserializer;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final CodeValueRepositoryWrapper codeValueRepository; private final CodeValueRepositoryWrapper codeValueRepository;
private final SavingsAccountRepository savingsRepository;
private final CommandProcessingService commandProcessingService; private final CommandProcessingService commandProcessingService;
private final CalendarInstanceRepository calendarInstanceRepository; private final CalendarInstanceRepository calendarInstanceRepository;
private final ConfigurationDomainService configurationDomainService; private final ConfigurationDomainService configurationDomainService;
private final SavingsAccountRepository savingsAccountRepository; private final SavingsAccountRepositoryWrapper savingsAccountRepositoryWrapper;
private final LoanRepositoryWrapper loanRepositoryWrapper;
private final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository; private final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository;
private final AccountNumberGenerator accountNumberGenerator; private final AccountNumberGenerator accountNumberGenerator;
@Autowired @Autowired
public GroupingTypesWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, public GroupingTypesWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
final GroupRepositoryWrapper groupRepository, final ClientRepositoryWrapper clientRepositoryWrapper, 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 GroupLevelRepository groupLevelRepository, final GroupingTypesDataValidator fromApiJsonDeserializer,
final LoanRepository loanRepository, final SavingsAccountRepository savingsRepository, final SavingsAccountRepositoryWrapper savingsAccountRepositoryWrapper,
final CodeValueRepositoryWrapper codeValueRepository, final CommandProcessingService commandProcessingService, final CodeValueRepositoryWrapper codeValueRepository, final CommandProcessingService commandProcessingService,
final CalendarInstanceRepository calendarInstanceRepository, final ConfigurationDomainService configurationDomainService, final CalendarInstanceRepository calendarInstanceRepository, final ConfigurationDomainService configurationDomainService,
final SavingsAccountRepository savingsAccountRepository, final LoanRepositoryWrapper loanRepositoryWrapper, final LoanRepositoryWrapper loanRepositoryWrapper,
final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository, final AccountNumberGenerator accountNumberGenerator) { final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository, final AccountNumberGenerator accountNumberGenerator) {
this.context = context; this.context = context;
this.groupRepository = groupRepository; this.groupRepository = groupRepository;
this.clientRepositoryWrapper = clientRepositoryWrapper; this.clientRepositoryWrapper = clientRepositoryWrapper;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.staffRepository = staffRepository; this.staffRepository = staffRepository;
this.noteRepository = noteRepository; this.noteRepository = noteRepository;
this.groupLevelRepository = groupLevelRepository; this.groupLevelRepository = groupLevelRepository;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.loanRepository = loanRepository; this.savingsAccountRepositoryWrapper = savingsAccountRepositoryWrapper;
this.savingsRepository = savingsRepository;
this.codeValueRepository = codeValueRepository; this.codeValueRepository = codeValueRepository;
this.commandProcessingService = commandProcessingService; this.commandProcessingService = commandProcessingService;
this.calendarInstanceRepository = calendarInstanceRepository; this.calendarInstanceRepository = calendarInstanceRepository;
this.configurationDomainService = configurationDomainService; this.configurationDomainService = configurationDomainService;
this.savingsAccountRepository = savingsAccountRepository;
this.loanRepositoryWrapper = loanRepositoryWrapper; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.accountNumberFormatRepository = accountNumberFormatRepository; this.accountNumberFormatRepository = accountNumberFormatRepository;
this.accountNumberGenerator = accountNumberGenerator; this.accountNumberGenerator = accountNumberGenerator;
@@ -158,8 +152,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group
officeId = parentGroup.officeId(); officeId = parentGroup.officeId();
} }
final Office groupOffice = this.officeRepository.findOne(officeId); final Office groupOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (groupOffice == null) { throw new OfficeNotFoundException(officeId); }
final LocalDate activationDate = command.localDateValueOfParameterNamed(GroupingTypesApiConstants.activationDateParamName); final LocalDate activationDate = command.localDateValueOfParameterNamed(GroupingTypesApiConstants.activationDateParamName);
final GroupLevel groupLevel = this.groupLevelRepository.findOne(groupingType.getId()); final GroupLevel groupLevel = this.groupLevelRepository.findOne(groupingType.getId());
@@ -506,15 +499,15 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group
if (clients != null) { if (clients != null) {
for (Client client : clients) { for (Client client : clients) {
client.updateStaff(staff); client.updateStaff(staff);
if (this.loanRepository.doNonClosedLoanAccountsExistForClient(client.getId())) { if (this.loanRepositoryWrapper.doNonClosedLoanAccountsExistForClient(client.getId())) {
for (final Loan loan : this.loanRepository.findLoanByClientId(client.getId())) { for (final Loan loan : this.loanRepositoryWrapper.findLoanByClientId(client.getId())) {
if (loan.isDisbursed() && !loan.isClosed()) { if (loan.isDisbursed() && !loan.isClosed()) {
loan.reassignLoanOfficer(staff, loanOfficerReassignmentDate); loan.reassignLoanOfficer(staff, loanOfficerReassignmentDate);
} }
} }
} }
if (this.savingsAccountRepository.doNonClosedSavingAccountsExistForClient(client.getId())) { if (this.savingsAccountRepositoryWrapper.doNonClosedSavingAccountsExistForClient(client.getId())) {
for (final SavingsAccount savingsAccount : this.savingsAccountRepository for (final SavingsAccount savingsAccount : this.savingsAccountRepositoryWrapper
.findSavingAccountByClientId(client.getId())) { .findSavingAccountByClientId(client.getId())) {
if (!savingsAccount.isClosed()) { if (!savingsAccount.isClosed()) {
savingsAccount.reassignSavingsOfficer(staff, loanOfficerReassignmentDate); savingsAccount.reassignSavingsOfficer(staff, loanOfficerReassignmentDate);
@@ -588,7 +581,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group
} }
private void validateLoansAndSavingsForGroupOrCenterClose(final Group groupOrCenter, final LocalDate closureDate) { private void validateLoansAndSavingsForGroupOrCenterClose(final Group groupOrCenter, final LocalDate closureDate) {
final Collection<Loan> groupLoans = this.loanRepository.findByGroupId(groupOrCenter.getId()); final Collection<Loan> groupLoans = this.loanRepositoryWrapper.findByGroupId(groupOrCenter.getId());
for (final Loan loan : groupLoans) { for (final Loan loan : groupLoans) {
final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.status().getValue()); final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.status().getValue());
if (loanStatus.isOpen()) { if (loanStatus.isOpen()) {
@@ -611,7 +604,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group
} }
} }
final List<SavingsAccount> groupSavingAccounts = this.savingsRepository.findByGroupId(groupOrCenter.getId()); final List<SavingsAccount> groupSavingAccounts = this.savingsAccountRepositoryWrapper.findByGroupId(groupOrCenter.getId());
for (final SavingsAccount saving : groupSavingAccounts) { for (final SavingsAccount saving : groupSavingAccounts) {
if (saving.isActive() || saving.isSubmittedAndPendingApproval() || saving.isApproved()) { if (saving.isActive() || saving.isSubmittedAndPendingApproval() || saving.isApproved()) {
@@ -871,7 +864,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group
@Transactional @Transactional
private void validateForJLGSavings(final Long groupId, final Set<Client> clientMembers) { private void validateForJLGSavings(final Long groupId, final Set<Client> clientMembers) {
for (final Client client : clientMembers) { for (final Client client : clientMembers) {
final Collection<SavingsAccount> savings = this.savingsRepository.findByClientIdAndGroupId(client.getId(), groupId); final Collection<SavingsAccount> savings = this.savingsAccountRepositoryWrapper.findByClientIdAndGroupId(client.getId(), groupId);
if (!CollectionUtils.isEmpty(savings)) { if (!CollectionUtils.isEmpty(savings)) {
final String defaultUserMessage = "Client with identifier " + client.getId() final String defaultUserMessage = "Client with identifier " + client.getId()
+ " cannot be disassociated it has group savings."; + " cannot be disassociated it has group savings.";
@@ -245,10 +245,10 @@ public class Loan extends AbstractPersistable<Long> {
@Column(name = "loan_product_counter") @Column(name = "loan_product_counter")
private Integer loanProductCounter; 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<LoanCharge> charges = new HashSet<>(); private Set<LoanCharge> 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<LoanTrancheCharge> trancheCharges = new HashSet<>(); private Set<LoanTrancheCharge> trancheCharges = new HashSet<>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY)
@@ -257,25 +257,13 @@ public class Loan extends AbstractPersistable<Long> {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY) @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY)
private Set<LoanOfficerAssignmentHistory> loanOfficerHistory; private Set<LoanOfficerAssignmentHistory> loanOfficerHistory;
// see
// http://stackoverflow.com/questions/4334970/hibernate-cannot-simultaneously-fetch-multiple-bags
@OrderBy(value = "installmentNumber") @OrderBy(value = "installmentNumber")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY)
private final Set<LoanRepaymentScheduleInstallment> repaymentScheduleInstallments = new HashSet<>(); private final List<LoanRepaymentScheduleInstallment> repaymentScheduleInstallments = new ArrayList<>();
// see
// http://stackoverflow.com/questions/4334970/hibernate-cannot-simultaneously-fetch-multiple-bags
@OrderBy(value = "dateOf, id") @OrderBy(value = "dateOf, id")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY)
private final Set<LoanTransaction> loanTransactions = new HashSet<>(); private final List<LoanTransaction> loanTransactions = new ArrayList<>();
private transient List<LoanTransaction> sortedTransactions = null ;
private transient boolean isTransactionsListDirty = false ;
private transient List<LoanRepaymentScheduleInstallment> sortedrepaymentScheduleInstallments = null ;
private transient boolean isrepaymentScheduleInstallmentsListDirty = false ;
@Embedded @Embedded
private LoanSummary summary; private LoanSummary summary;
@@ -302,13 +290,13 @@ public class Loan extends AbstractPersistable<Long> {
@Column(name = "max_outstanding_loan_balance", scale = 6, precision = 19, nullable = false) @Column(name = "max_outstanding_loan_balance", scale = 6, precision = 19, nullable = false)
private BigDecimal maxOutstandingLoanBalance; 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") @OrderBy(value = "expectedDisbursementDate, id")
private Set<LoanDisbursementDetails> disbursementDetails = new HashSet<>(); private List<LoanDisbursementDetails> disbursementDetails = new ArrayList<>();
@OrderBy(value = "termApplicableFrom, id") @OrderBy(value = "termApplicableFrom, id")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval = true, fetch=FetchType.LAZY)
private final Set<LoanTermVariations> loanTermVariations = new HashSet<>(); private final List<LoanTermVariations> loanTermVariations = new ArrayList<>();
@Column(name = "total_recovered_derived", scale = 6, precision = 19) @Column(name = "total_recovered_derived", scale = 6, precision = 19)
private BigDecimal totalRecovered; private BigDecimal totalRecovered;
@@ -349,8 +337,6 @@ public class Loan extends AbstractPersistable<Long> {
@Column(name = "is_topup", nullable = false) @Column(name = "is_topup", nullable = false)
private boolean isTopup = 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) @OneToOne(cascade = CascadeType.ALL, mappedBy = "loan", optional = true, orphanRemoval = true, fetch=FetchType.EAGER)
private LoanTopupDetails loanTopupDetails; private LoanTopupDetails loanTopupDetails;
@@ -358,7 +344,7 @@ public class Loan extends AbstractPersistable<Long> {
final LoanProduct loanProduct, final Fund fund, final Staff officer, final CodeValue loanPurpose, final LoanProduct loanProduct, final Fund fund, final Staff officer, final CodeValue loanPurpose,
final LoanTransactionProcessingStrategy transactionProcessingStrategy, final LoanTransactionProcessingStrategy transactionProcessingStrategy,
final LoanProductRelatedDetail loanRepaymentScheduleDetail, final Set<LoanCharge> loanCharges, final LoanProductRelatedDetail loanRepaymentScheduleDetail, final Set<LoanCharge> loanCharges,
final Set<LoanCollateral> collateral, final BigDecimal fixedEmiAmount, final Set<LoanDisbursementDetails> disbursementDetails, final Set<LoanCollateral> collateral, final BigDecimal fixedEmiAmount, final List<LoanDisbursementDetails> disbursementDetails,
final BigDecimal maxOutstandingLoanBalance, final Boolean createStandingInstructionAtDisbursement, final BigDecimal maxOutstandingLoanBalance, final Boolean createStandingInstructionAtDisbursement,
final Boolean isFloatingInterestRate, final BigDecimal interestRateDifferential) { final Boolean isFloatingInterestRate, final BigDecimal interestRateDifferential) {
final LoanStatus status = null; final LoanStatus status = null;
@@ -375,7 +361,7 @@ public class Loan extends AbstractPersistable<Long> {
final LoanTransactionProcessingStrategy transactionProcessingStrategy, final LoanTransactionProcessingStrategy transactionProcessingStrategy,
final LoanProductRelatedDetail loanRepaymentScheduleDetail, final Set<LoanCharge> loanCharges, final LoanProductRelatedDetail loanRepaymentScheduleDetail, final Set<LoanCharge> loanCharges,
final Set<LoanCollateral> collateral, final Boolean syncDisbursementWithMeeting, final BigDecimal fixedEmiAmount, final Set<LoanCollateral> collateral, final Boolean syncDisbursementWithMeeting, final BigDecimal fixedEmiAmount,
final Set<LoanDisbursementDetails> disbursementDetails, final BigDecimal maxOutstandingLoanBalance, final List<LoanDisbursementDetails> disbursementDetails, final BigDecimal maxOutstandingLoanBalance,
final Boolean createStandingInstructionAtDisbursement, final Boolean isFloatingInterestRate, final Boolean createStandingInstructionAtDisbursement, final Boolean isFloatingInterestRate,
final BigDecimal interestRateDifferential) { final BigDecimal interestRateDifferential) {
final LoanStatus status = null; final LoanStatus status = null;
@@ -391,7 +377,7 @@ public class Loan extends AbstractPersistable<Long> {
final LoanTransactionProcessingStrategy transactionProcessingStrategy, final LoanTransactionProcessingStrategy transactionProcessingStrategy,
final LoanProductRelatedDetail loanRepaymentScheduleDetail, final Set<LoanCharge> loanCharges, final LoanProductRelatedDetail loanRepaymentScheduleDetail, final Set<LoanCharge> loanCharges,
final Set<LoanCollateral> collateral, final Boolean syncDisbursementWithMeeting, final BigDecimal fixedEmiAmount, final Set<LoanCollateral> collateral, final Boolean syncDisbursementWithMeeting, final BigDecimal fixedEmiAmount,
final Set<LoanDisbursementDetails> disbursementDetails, final BigDecimal maxOutstandingLoanBalance, final List<LoanDisbursementDetails> disbursementDetails, final BigDecimal maxOutstandingLoanBalance,
final Boolean createStandingInstructionAtDisbursement, final Boolean isFloatingInterestRate, final Boolean createStandingInstructionAtDisbursement, final Boolean isFloatingInterestRate,
final BigDecimal interestRateDifferential) { final BigDecimal interestRateDifferential) {
final LoanStatus status = null; final LoanStatus status = null;
@@ -409,7 +395,7 @@ public class Loan extends AbstractPersistable<Long> {
final Staff loanOfficer, final CodeValue loanPurpose, final LoanTransactionProcessingStrategy transactionProcessingStrategy, final Staff loanOfficer, final CodeValue loanPurpose, final LoanTransactionProcessingStrategy transactionProcessingStrategy,
final LoanProduct loanProduct, final LoanProductRelatedDetail loanRepaymentScheduleDetail, final LoanStatus loanStatus, final LoanProduct loanProduct, final LoanProductRelatedDetail loanRepaymentScheduleDetail, final LoanStatus loanStatus,
final Set<LoanCharge> loanCharges, final Set<LoanCollateral> collateral, final Boolean syncDisbursementWithMeeting, final Set<LoanCharge> loanCharges, final Set<LoanCollateral> collateral, final Boolean syncDisbursementWithMeeting,
final BigDecimal fixedEmiAmount, final Set<LoanDisbursementDetails> disbursementDetails, final BigDecimal fixedEmiAmount, final List<LoanDisbursementDetails> disbursementDetails,
final BigDecimal maxOutstandingLoanBalance, final Boolean createStandingInstructionAtDisbursement, final BigDecimal maxOutstandingLoanBalance, final Boolean createStandingInstructionAtDisbursement,
final Boolean isFloatingInterestRate, final BigDecimal interestRateDifferential) { final Boolean isFloatingInterestRate, final BigDecimal interestRateDifferential) {
@@ -587,7 +573,6 @@ public class Loan extends AbstractPersistable<Long> {
mapEntry.getValue().updateLoan(this); mapEntry.getValue().updateLoan(this);
} }
this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values()); this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values());
this.isTransactionsListDirty = true ;
updateLoanSummaryDerivedFields(); updateLoanSummaryDerivedFields();
this.loanTransactions.removeAll(changedTransactionDetail.getNewTransactionMappings().values()); this.loanTransactions.removeAll(changedTransactionDetail.getNewTransactionMappings().values());
return changedTransactionDetail; return changedTransactionDetail;
@@ -1098,7 +1083,6 @@ public class Loan extends AbstractPersistable<Long> {
public void updateLoanSchedule(final LoanScheduleModel modifiedLoanSchedule, AppUser currentUser) { public void updateLoanSchedule(final LoanScheduleModel modifiedLoanSchedule, AppUser currentUser) {
this.repaymentScheduleInstallments.clear(); this.repaymentScheduleInstallments.clear();
this.isrepaymentScheduleInstallmentsListDirty = true ;
for (final LoanScheduleModelPeriod scheduledLoanInstallment : modifiedLoanSchedule.getPeriods()) { for (final LoanScheduleModelPeriod scheduledLoanInstallment : modifiedLoanSchedule.getPeriods()) {
if (scheduledLoanInstallment.isRepaymentPeriod()) { if (scheduledLoanInstallment.isRepaymentPeriod()) {
@@ -1120,7 +1104,6 @@ public class Loan extends AbstractPersistable<Long> {
public void updateLoanSchedule(final Collection<LoanRepaymentScheduleInstallment> installments, AppUser currentUser) { public void updateLoanSchedule(final Collection<LoanRepaymentScheduleInstallment> installments, AppUser currentUser) {
this.repaymentScheduleInstallments.clear(); this.repaymentScheduleInstallments.clear();
this.isrepaymentScheduleInstallmentsListDirty = true ;
for (final LoanRepaymentScheduleInstallment installment : installments) { for (final LoanRepaymentScheduleInstallment installment : installments) {
addLoanRepaymentScheduleInstallment(installment); addLoanRepaymentScheduleInstallment(installment);
} }
@@ -1848,8 +1831,7 @@ public class Loan extends AbstractPersistable<Long> {
List<LoanTransaction> transactions = getLoanTransactions() ; List<LoanTransaction> transactions = getLoanTransactions() ;
for (final LoanTransaction loanTransaction : transactions) { for (final LoanTransaction loanTransaction : transactions) {
if (loanTransaction.isDisbursement()) { if (loanTransaction.isDisbursement()) {
this.loanTransactions.remove(loanTransaction); removeLoanTransaction(loanTransaction);
transactions.remove(loanTransaction) ;
break; break;
} }
} }
@@ -2201,7 +2183,6 @@ public class Loan extends AbstractPersistable<Long> {
} }
public Collection<Long> findExistingTransactionIds() { public Collection<Long> findExistingTransactionIds() {
final Collection<Long> ids = new ArrayList<>(); final Collection<Long> ids = new ArrayList<>();
List<LoanTransaction> transactions = getLoanTransactions() ; List<LoanTransaction> transactions = getLoanTransactions() ;
for (final LoanTransaction transaction : transactions) { for (final LoanTransaction transaction : transactions) {
@@ -2749,7 +2730,6 @@ public class Loan extends AbstractPersistable<Long> {
} }
} }
this.loanTransactions.retainAll(retainTransactions); this.loanTransactions.retainAll(retainTransactions);
isTransactionsListDirty = true ;
} }
private void updateLoanToPreDisbursalState() { private void updateLoanToPreDisbursalState() {
@@ -3008,7 +2988,6 @@ public class Loan extends AbstractPersistable<Long> {
* transactions first and then new transactions. * transactions first and then new transactions.
*/ */
this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values()); this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values());
this.isTransactionsListDirty = true ;
} }
updateLoanSummaryDerivedFields(); updateLoanSummaryDerivedFields();
@@ -4478,17 +4457,15 @@ public class Loan extends AbstractPersistable<Long> {
//This method returns copy of all transactions //This method returns copy of all transactions
public List<LoanTransaction> getLoanTransactions() { public List<LoanTransaction> getLoanTransactions() {
if(this.sortedTransactions == null || isTransactionsListDirty) { return this.loanTransactions;
this.sortedTransactions = new ArrayList<>(this.loanTransactions) ;
this.sortedTransactions.sort(new LoanTransactionComparator());
this.isTransactionsListDirty = false ;
}
return sortedTransactions;
} }
public void addLoanTransaction(final LoanTransaction loanTransaction) { public void addLoanTransaction(final LoanTransaction loanTransaction) {
this.loanTransactions.add(loanTransaction) ; this.loanTransactions.add(loanTransaction) ;
this.isTransactionsListDirty = true ; }
public void removeLoanTransaction(final LoanTransaction loanTransaction) {
this.loanTransactions.remove(loanTransaction) ;
} }
public void setLoanStatus(final Integer loanStatus) { public void setLoanStatus(final Integer loanStatus) {
@@ -4859,7 +4836,7 @@ public class Loan extends AbstractPersistable<Long> {
return list; return list;
} }
public Set<LoanDisbursementDetails> getDisbursementDetails() { public List<LoanDisbursementDetails> getDisbursementDetails() {
return this.disbursementDetails; return this.disbursementDetails;
} }
@@ -5017,7 +4994,6 @@ public class Loan extends AbstractPersistable<Long> {
* first and then new transactions. * first and then new transactions.
*/ */
this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values()); this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values());
this.isTransactionsListDirty = true ;
updateLoanSummaryDerivedFields(); updateLoanSummaryDerivedFields();
this.loanTransactions.removeAll(changedTransactionDetail.getNewTransactionMappings().values()); this.loanTransactions.removeAll(changedTransactionDetail.getNewTransactionMappings().values());
@@ -5430,11 +5406,7 @@ public class Loan extends AbstractPersistable<Long> {
* @return List of loan repayments schedule objects * @return List of loan repayments schedule objects
**/ **/
public List<LoanRepaymentScheduleInstallment> getRepaymentScheduleInstallments() { public List<LoanRepaymentScheduleInstallment> getRepaymentScheduleInstallments() {
if (this.sortedrepaymentScheduleInstallments == null || this.isrepaymentScheduleInstallmentsListDirty) { return this.repaymentScheduleInstallments;
this.sortedrepaymentScheduleInstallments = new ArrayList<>(this.repaymentScheduleInstallments);
this.sortedrepaymentScheduleInstallments.sort(LoanRepaymentScheduleInstallment.installmentNumberComparator);
}
return sortedrepaymentScheduleInstallments;
} }
public Integer getLoanRepaymentScheduleInstallmentsSize() { public Integer getLoanRepaymentScheduleInstallmentsSize() {
@@ -5443,7 +5415,6 @@ public class Loan extends AbstractPersistable<Long> {
public void addLoanRepaymentScheduleInstallment(final LoanRepaymentScheduleInstallment installment) { public void addLoanRepaymentScheduleInstallment(final LoanRepaymentScheduleInstallment installment) {
installment.updateLoan(this); installment.updateLoan(this);
this.repaymentScheduleInstallments.add(installment); this.repaymentScheduleInstallments.add(installment);
this.isrepaymentScheduleInstallmentsListDirty = true ;
} }
/** /**
* @return Loan product minimum repayments schedule related detail * @return Loan product minimum repayments schedule related detail
@@ -5944,7 +5915,7 @@ public class Loan extends AbstractPersistable<Long> {
this.interestRateDifferential = interestRateDifferential; this.interestRateDifferential = interestRateDifferential;
} }
public Set<LoanTermVariations> getLoanTermVariations() { public List<LoanTermVariations> getLoanTermVariations() {
return this.loanTermVariations; return this.loanTermVariations;
} }
@@ -5982,7 +5953,7 @@ public class Loan extends AbstractPersistable<Long> {
* get the next repayment date for rescheduling at the time of disbursement * get the next repayment date for rescheduling at the time of disbursement
*/ */
public LocalDate getNextPossibleRepaymentDateForRescheduling() { public LocalDate getNextPossibleRepaymentDateForRescheduling() {
Set<LoanDisbursementDetails> loanDisbursementDetails = this.disbursementDetails; List<LoanDisbursementDetails> loanDisbursementDetails = this.disbursementDetails;
LocalDate nextRepaymentDate = new LocalDate(); LocalDate nextRepaymentDate = new LocalDate();
for (LoanDisbursementDetails loanDisbursementDetail : loanDisbursementDetails) { for (LoanDisbursementDetails loanDisbursementDetail : loanDisbursementDetails) {
if (loanDisbursementDetail.actualDisbursementDate() == null) { if (loanDisbursementDetail.actualDisbursementDate() == null) {
@@ -6367,4 +6338,27 @@ public class Loan extends AbstractPersistable<Long> {
public Collection<LoanCharge> getLoanCharges() { public Collection<LoanCharge> getLoanCharges() {
return this.charges; 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() ;
}
} }
@@ -83,7 +83,7 @@ import org.springframework.transaction.annotation.Transactional;
public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
private final LoanAssembler loanAccountAssembler; private final LoanAssembler loanAccountAssembler;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final LoanTransactionRepository loanTransactionRepository; private final LoanTransactionRepository loanTransactionRepository;
private final ConfigurationDomainService configurationDomainService; private final ConfigurationDomainService configurationDomainService;
private final HolidayRepository holidayRepository; private final HolidayRepository holidayRepository;
@@ -102,7 +102,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
private final StandingInstructionRepository standingInstructionRepository; private final StandingInstructionRepository standingInstructionRepository;
@Autowired @Autowired
public LoanAccountDomainServiceJpa(final LoanAssembler loanAccountAssembler, final LoanRepository loanRepository, public LoanAccountDomainServiceJpa(final LoanAssembler loanAccountAssembler, final LoanRepositoryWrapper loanRepositoryWrapper,
final LoanTransactionRepository loanTransactionRepository, final NoteRepository noteRepository, final LoanTransactionRepository loanTransactionRepository, final NoteRepository noteRepository,
final ConfigurationDomainService configurationDomainService, final HolidayRepository holidayRepository, final ConfigurationDomainService configurationDomainService, final HolidayRepository holidayRepository,
final WorkingDaysRepositoryWrapper workingDaysRepository, final WorkingDaysRepositoryWrapper workingDaysRepository,
@@ -115,7 +115,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
final BusinessEventNotifierService businessEventNotifierService, final LoanUtilService loanUtilService, final BusinessEventNotifierService businessEventNotifierService, final LoanUtilService loanUtilService,
final StandingInstructionRepository standingInstructionRepository) { final StandingInstructionRepository standingInstructionRepository) {
this.loanAccountAssembler = loanAccountAssembler; this.loanAccountAssembler = loanAccountAssembler;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.loanTransactionRepository = loanTransactionRepository; this.loanTransactionRepository = loanTransactionRepository;
this.noteRepository = noteRepository; this.noteRepository = noteRepository;
this.configurationDomainService = configurationDomainService; this.configurationDomainService = configurationDomainService;
@@ -260,7 +260,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
this.repaymentScheduleInstallmentRepository.save(installment); this.repaymentScheduleInstallmentRepository.save(installment);
} }
} }
this.loanRepository.saveAndFlush(loan); this.loanRepositoryWrapper.saveAndFlush(loan);
} catch (final DataIntegrityViolationException e) { } catch (final DataIntegrityViolationException e) {
final Throwable realCause = e.getCause(); final Throwable realCause = e.getCause();
final List<ApiParameterError> dataValidationErrors = new ArrayList<>(); final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
@@ -282,7 +282,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
this.repaymentScheduleInstallmentRepository.save(installment); this.repaymentScheduleInstallmentRepository.save(installment);
} }
} }
this.loanRepository.save(loan); this.loanRepositoryWrapper.save(loan);
} catch (final DataIntegrityViolationException e) { } catch (final DataIntegrityViolationException e) {
final Throwable realCause = e.getCause(); final Throwable realCause = e.getCause();
final List<ApiParameterError> dataValidationErrors = new ArrayList<>(); final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
@@ -403,7 +403,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
allowTransactionsOnHoliday, holidays, workingDays, allowTransactionsOnNonWorkingDay); allowTransactionsOnHoliday, holidays, workingDays, allowTransactionsOnNonWorkingDay);
saveLoanTransactionWithDataIntegrityViolationChecks(newRefundTransaction); saveLoanTransactionWithDataIntegrityViolationChecks(newRefundTransaction);
this.loanRepository.save(loan); this.loanRepositoryWrapper.save(loan);
if (StringUtils.isNotBlank(noteText)) { if (StringUtils.isNotBlank(noteText)) {
final Note note = Note.loanTransactionNote(loan, newRefundTransaction, noteText); final Note note = Note.loanTransactionNote(loan, newRefundTransaction, noteText);
@@ -593,7 +593,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
existingReversedTransactionIds, allowTransactionsOnHoliday, holidays, workingDays, allowTransactionsOnNonWorkingDay); existingReversedTransactionIds, allowTransactionsOnHoliday, holidays, workingDays, allowTransactionsOnNonWorkingDay);
this.loanTransactionRepository.save(newRefundTransaction); this.loanTransactionRepository.save(newRefundTransaction);
this.loanRepository.save(loan); this.loanRepositoryWrapper.save(loan);
if (StringUtils.isNotBlank(noteText)) { if (StringUtils.isNotBlank(noteText)) {
final Note note = Note.loanTransactionNote(loan, newRefundTransaction, noteText); final Note note = Note.loanTransactionNote(loan, newRefundTransaction, noteText);
@@ -646,7 +646,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
} }
createdDate = createdDate.plusSeconds(1); createdDate = createdDate.plusSeconds(1);
newTransactions.add(accrualTransaction); newTransactions.add(accrualTransaction);
loan.getLoanTransactions().add(accrualTransaction); loan.addLoanTransaction(accrualTransaction);
Set<LoanChargePaidBy> accrualCharges = accrualTransaction.getLoanChargesPaid(); Set<LoanChargePaidBy> accrualCharges = accrualTransaction.getLoanChargesPaid();
for (LoanCharge loanCharge : loan.charges()) { for (LoanCharge loanCharge : loan.charges()) {
if (loanCharge.isActive() if (loanCharge.isActive()
@@ -21,10 +21,14 @@ package org.apache.fineract.portfolio.loanaccount.domain;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* <p> * <p>
@@ -43,11 +47,20 @@ public class LoanRepositoryWrapper {
} }
public Loan findOneWithNotFoundDetection(final Long id) { public Loan findOneWithNotFoundDetection(final Long id) {
return this.findOneWithNotFoundDetection(id, false) ;
}
@Transactional(readOnly=true)
public Loan findOneWithNotFoundDetection(final Long id, boolean loadLazyCollections) {
final Loan loan = this.repository.findOne(id); final Loan loan = this.repository.findOne(id);
if (loan == null) { throw new LoanNotFoundException(id); } if (loan == null) { throw new LoanNotFoundException(id); }
if(loadLazyCollections) {
loan.initializeLazyCollections();
}
return loan; return loan;
} }
//Root Entities are enough
public Collection<Loan> findActiveLoansByLoanIdAndGroupId(Long clientId, Long groupId) { public Collection<Loan> findActiveLoansByLoanIdAndGroupId(Long clientId, Long groupId) {
final Collection<Integer> loanStatuses = new ArrayList<>(Arrays.asList(LoanStatus.SUBMITTED_AND_PENDING_APPROVAL.getValue(), final Collection<Integer> loanStatuses = new ArrayList<>(Arrays.asList(LoanStatus.SUBMITTED_AND_PENDING_APPROVAL.getValue(),
LoanStatus.APPROVED.getValue(), LoanStatus.ACTIVE.getValue(), LoanStatus.OVERPAID.getValue())); LoanStatus.APPROVED.getValue(), LoanStatus.ACTIVE.getValue(), LoanStatus.OVERPAID.getValue()));
@@ -55,4 +68,170 @@ public class LoanRepositoryWrapper {
return loans; 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<Loan> save(List<Loan> 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<Loan> 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<Loan> 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<Loan> 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<Loan> getClientOrJLGLoansToUpdateLoanCounter(@Param("loanCounter") Integer loanCounter, @Param("clientId") Long clientId) {
return this.repository.getClientOrJLGLoansToUpdateLoanCounter(loanCounter, clientId) ;
}
//Only root entities are enough
public List<Loan> 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<Loan> 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<Loan> findByClientIdAndGroupId(@Param("clientId") Long clientId, @Param("groupId") Long groupId) {
List<Loan> 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<Loan> findLoanByClientId(@Param("clientId") Long clientId) {
List<Loan> 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<Loan> findByGroupId(@Param("groupId") Long groupId) {
return this.repository.findByGroupId(groupId) ;
}
//Looks like we need complete Data
public List<Loan> findByIdsAndLoanStatusAndLoanType(@Param("ids") Collection<Long> ids,
@Param("loanStatuses") Collection<Integer> loanStatuses, @Param("loanTypes") Collection<Integer> loanTypes) {
List<Loan> 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<Long> getLoansDisbursedAfter(@Param("disbursalDate") Date disbursalDate) {
return this.repository.getLoansDisbursedAfter(disbursalDate) ;
}
//Repayments Schedule
public List<Loan> findByClientOfficeIdsAndLoanStatus(@Param("officeIds") Collection<Long> officeIds,
@Param("loanStatuses") Collection<Integer> loanStatuses) {
List<Loan> loans = this.repository.findByClientOfficeIdsAndLoanStatus(officeIds, loanStatuses) ;
if(loans != null && loans.size() >0) {
for(Loan loan: loans) {
loan.initializeRepaymentSchedule();
}
}
return loans ;
}
//Repayments Schedule
public List<Loan> findByGroupOfficeIdsAndLoanStatus(@Param("officeIds") Collection<Long> officeIds,
@Param("loanStatuses") Collection<Integer> loanStatuses) {
List<Loan> loans = this.repository.findByGroupOfficeIdsAndLoanStatus(officeIds, loanStatuses) ;
if(loans != null && loans.size() >0) {
for(Loan loan: loans) {
loan.initializeRepaymentSchedule();
}
}
return loans ;
}
public List<Long> findActiveLoansLoanProductIdsByClient(@Param("clientId") Long clientId, @Param("loanStatus") Integer loanStatus) {
return this.repository.findActiveLoansLoanProductIdsByClient(clientId, loanStatus) ;
}
public List<Long> 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 ;
}
} }
@@ -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.account.domain.AccountAssociationType;
import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.data.ClientData;
import org.apache.fineract.portfolio.client.service.ClientReadPlatformService; import org.apache.fineract.portfolio.client.service.ClientReadPlatformService;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
import org.apache.fineract.portfolio.loanaccount.guarantor.data.GuarantorData; 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.GuarantorFundingData;
import org.apache.fineract.portfolio.loanaccount.guarantor.data.GuarantorTransactionData; import org.apache.fineract.portfolio.loanaccount.guarantor.data.GuarantorTransactionData;
@@ -55,21 +53,20 @@ public class GuarantorReadPlatformServiceImpl implements GuarantorReadPlatformSe
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
private final ClientReadPlatformService clientReadPlatformService; private final ClientReadPlatformService clientReadPlatformService;
private final StaffReadPlatformService staffReadPlatformService; private final StaffReadPlatformService staffReadPlatformService;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
@Autowired @Autowired
public GuarantorReadPlatformServiceImpl(final RoutingDataSource dataSource, final ClientReadPlatformService clientReadPlatformService, 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.jdbcTemplate = new JdbcTemplate(dataSource);
this.clientReadPlatformService = clientReadPlatformService; this.clientReadPlatformService = clientReadPlatformService;
this.staffReadPlatformService = staffReadPlatformService; this.staffReadPlatformService = staffReadPlatformService;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
} }
@Override @Override
public List<GuarantorData> retrieveGuarantorsForValidLoan(final Long loanId) { public List<GuarantorData> retrieveGuarantorsForValidLoan(final Long loanId) {
final Loan loan = this.loanRepository.findOne(loanId); this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId);
if (loan == null) { throw new LoanNotFoundException(loanId); }
return retrieveGuarantorsForLoan(loanId); return retrieveGuarantorsForLoan(loanId);
} }
@@ -97,7 +97,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto
@Transactional @Transactional
public CommandProcessingResult createGuarantor(final Long loanId, final JsonCommand command) { public CommandProcessingResult createGuarantor(final Long loanId, final JsonCommand command) {
final GuarantorCommand guarantorCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json()); 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<Guarantor> existGuarantorList = this.guarantorRepository.findByLoan(loan); final List<Guarantor> existGuarantorList = this.guarantorRepository.findByLoan(loan);
return createGuarantor(loan, command, guarantorCommand, existGuarantorList); return createGuarantor(loan, command, guarantorCommand, existGuarantorList);
} }
@@ -186,7 +186,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto
final GuarantorCommand guarantorCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json()); final GuarantorCommand guarantorCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json());
guarantorCommand.validateForUpdate(); guarantorCommand.validateForUpdate();
final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
validateLoanStatus(loan); validateLoanStatus(loan);
final Guarantor guarantorForUpdate = this.guarantorRepository.findByLoanAndId(loan, guarantorId); final Guarantor guarantorForUpdate = this.guarantorRepository.findByLoanAndId(loan, guarantorId);
if (guarantorForUpdate == null) { throw new GuarantorNotFoundException(loanId, guarantorId); } if (guarantorForUpdate == null) { throw new GuarantorNotFoundException(loanId, guarantorId); }
@@ -239,7 +239,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto
@Override @Override
@Transactional @Transactional
public CommandProcessingResult removeGuarantor(final Long loanId, final Long guarantorId, final Long guarantorFundingId) { 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); validateLoanStatus(loan);
final Guarantor guarantorForDelete = this.guarantorRepository.findByLoanAndId(loan, guarantorId); final Guarantor guarantorForDelete = this.guarantorRepository.findByLoanAndId(loan, guarantorId);
if (guarantorForDelete == null || (guarantorFundingId == null && !guarantorForDelete.getGuarantorFundDetails().isEmpty())) { throw new GuarantorNotFoundException( if (guarantorForDelete == null || (guarantorFundingId == null && !guarantorForDelete.getGuarantorFundDetails().isEmpty())) { throw new GuarantorNotFoundException(
@@ -2041,7 +2041,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
final LocalDate scheduleTillDate) { final LocalDate scheduleTillDate) {
// Loan transactions to process and find the variation on payments // Loan transactions to process and find the variation on payments
Collection<RecalculationDetail> recalculationDetails = new ArrayList<>(); Collection<RecalculationDetail> recalculationDetails = new ArrayList<>();
for (LoanTransaction loanTransaction : loan.getLoanTransactions()) { List<LoanTransaction> transactions = loan.getLoanTransactions() ;
for (LoanTransaction loanTransaction : transactions) {
if (loanTransaction.isPaymentTransaction()) { if (loanTransaction.isPaymentTransaction()) {
recalculationDetails.add(new RecalculationDetail(loanTransaction.getTransactionDate(), LoanTransaction recalculationDetails.add(new RecalculationDetail(loanTransaction.getTransactionDate(), LoanTransaction
.copyTransactionProperties(loanTransaction))); .copyTransactionProperties(loanTransaction)));
@@ -598,14 +598,14 @@ public class LoanScheduleAssembler {
validateDisbursementDateIsOnNonWorkingDay(loanApplicationTerms.getExpectedDisbursementDate(), workingDays); validateDisbursementDateIsOnNonWorkingDay(loanApplicationTerms.getExpectedDisbursementDate(), workingDays);
validateDisbursementDateIsOnHoliday(loanApplicationTerms.getExpectedDisbursementDate(), isHolidayEnabled, holidays); validateDisbursementDateIsOnHoliday(loanApplicationTerms.getExpectedDisbursementDate(), isHolidayEnabled, holidays);
Set<LoanDisbursementDetails> loanDisbursementDetails = this.loanUtilService.fetchDisbursementData(element.getAsJsonObject()); List<LoanDisbursementDetails> loanDisbursementDetails = this.loanUtilService.fetchDisbursementData(element.getAsJsonObject());
return assembleLoanScheduleFrom(loanApplicationTerms, isHolidayEnabled, holidays, workingDays, element, loanDisbursementDetails); return assembleLoanScheduleFrom(loanApplicationTerms, isHolidayEnabled, holidays, workingDays, element, loanDisbursementDetails);
} }
public LoanScheduleModel assembleLoanScheduleFrom(final LoanApplicationTerms loanApplicationTerms, final boolean isHolidayEnabled, public LoanScheduleModel assembleLoanScheduleFrom(final LoanApplicationTerms loanApplicationTerms, final boolean isHolidayEnabled,
final List<Holiday> holidays, final WorkingDays workingDays, final JsonElement element, final List<Holiday> holidays, final WorkingDays workingDays, final JsonElement element,
Set<LoanDisbursementDetails> disbursementDetails) { List<LoanDisbursementDetails> disbursementDetails) {
final Set<LoanCharge> loanCharges = this.loanChargeAssembler.fromParsedJson(element, disbursementDetails); final Set<LoanCharge> loanCharges = this.loanChargeAssembler.fromParsedJson(element, disbursementDetails);
@@ -657,7 +657,7 @@ public class LoanScheduleAssembler {
public void assempleVariableScheduleFrom(final Loan loan, final String json) { public void assempleVariableScheduleFrom(final Loan loan, final String json) {
this.variableLoanScheduleFromApiJsonValidator.validateSchedule(json, loan); this.variableLoanScheduleFromApiJsonValidator.validateSchedule(json, loan);
Set<LoanTermVariations> variations = loan.getLoanTermVariations(); List<LoanTermVariations> variations = loan.getLoanTermVariations();
List<LoanTermVariations> newVariations = new ArrayList<>(); List<LoanTermVariations> newVariations = new ArrayList<>();
extractLoanTermVariations(loan, json, newVariations); extractLoanTermVariations(loan, json, newVariations);
@@ -839,7 +839,7 @@ public class LoanScheduleAssembler {
loan.regenerateRepaymentSchedule(scheduleGeneratorDTO, currentUser); loan.regenerateRepaymentSchedule(scheduleGeneratorDTO, currentUser);
} }
private List<LoanTermVariations> adjustExistingVariations(Set<LoanTermVariations> variations, List<LoanTermVariations> newVariations, private List<LoanTermVariations> adjustExistingVariations(List<LoanTermVariations> variations, List<LoanTermVariations> newVariations,
final Map<LocalDate, LocalDate> adjustDueDateVariations) { final Map<LocalDate, LocalDate> adjustDueDateVariations) {
Map<LocalDate, LoanTermVariations> amountVariations = new HashMap<>(); Map<LocalDate, LoanTermVariations> amountVariations = new HashMap<>();
Map<LocalDate, LoanTermVariations> dueDateVariations = new HashMap<>(); Map<LocalDate, LoanTermVariations> dueDateVariations = new HashMap<>();
@@ -21,10 +21,8 @@ package org.apache.fineract.portfolio.loanaccount.loanschedule.service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set;
import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
import org.apache.fineract.infrastructure.core.api.JsonQuery; import org.apache.fineract.infrastructure.core.api.JsonQuery;
@@ -227,7 +225,7 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC
final MonetaryCurrency currency = loan.getCurrency(); final MonetaryCurrency currency = loan.getCurrency();
Money outstanding = loan.getPrincpal(); Money outstanding = loan.getPrincpal();
Set<LoanDisbursementDetails> disbursementDetails = new HashSet<>(); List<LoanDisbursementDetails> disbursementDetails = new ArrayList<>();
if (loan.isMultiDisburmentLoan()) { if (loan.isMultiDisburmentLoan()) {
disbursementDetails = loan.getDisbursementDetails(); disbursementDetails = loan.getDisbursementDetails();
outstanding = outstanding.zero(); outstanding = outstanding.zero();
@@ -22,7 +22,6 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
@@ -72,7 +71,7 @@ public class LoanScheduleWritePlatformServiceImpl implements LoanScheduleWritePl
this.loanAccountDomainService.saveLoanWithDataIntegrityViolationChecks(loan); this.loanAccountDomainService.saveLoanWithDataIntegrityViolationChecks(loan);
final Map<String, Object> changes = new HashMap<>(); final Map<String, Object> changes = new HashMap<>();
List<LoanTermVariationsData> newVariationsData = new ArrayList<>(); List<LoanTermVariationsData> newVariationsData = new ArrayList<>();
Set<LoanTermVariations> modifiedVariations = loan.getLoanTermVariations(); List<LoanTermVariations> modifiedVariations = loan.getLoanTermVariations();
for (LoanTermVariations termVariations : modifiedVariations) { for (LoanTermVariations termVariations : modifiedVariations) {
if (loanTermVariations.containsKey(termVariations.getId())) { if (loanTermVariations.containsKey(termVariations.getId())) {
loanTermVariations.remove(termVariations.getId()); loanTermVariations.remove(termVariations.getId());
@@ -94,7 +93,7 @@ public class LoanScheduleWritePlatformServiceImpl implements LoanScheduleWritePl
@Override @Override
public CommandProcessingResult deleteLoanScheduleVariations(final Long loanId) { public CommandProcessingResult deleteLoanScheduleVariations(final Long loanId) {
final Loan loan = this.loanAssembler.assembleFrom(loanId); final Loan loan = this.loanAssembler.assembleFrom(loanId);
Set<LoanTermVariations> variations = loan.getLoanTermVariations(); List<LoanTermVariations> variations = loan.getLoanTermVariations();
List<Long> deletedVariations = new ArrayList<>(variations.size()); List<Long> deletedVariations = new ArrayList<>(variations.size());
for (LoanTermVariations loanTermVariations : variations) { for (LoanTermVariations loanTermVariations : variations) {
deletedVariations.add(loanTermVariations.getId()); deletedVariations.add(loanTermVariations.getId());
@@ -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.domain.JdbcSupport;
import org.apache.fineract.infrastructure.core.service.RoutingDataSource; import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData; import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestData; 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.LoanRescheduleRequestEnumerations;
import org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestStatusEnumData; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestStatusEnumData;
@@ -49,15 +47,15 @@ import org.springframework.stereotype.Service;
public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanRescheduleRequestReadPlatformService { public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanRescheduleRequestReadPlatformService {
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final LoanRescheduleRequestRowMapper loanRescheduleRequestRowMapper = new LoanRescheduleRequestRowMapper(); private final LoanRescheduleRequestRowMapper loanRescheduleRequestRowMapper = new LoanRescheduleRequestRowMapper();
private final CodeValueReadPlatformService codeValueReadPlatformService; private final CodeValueReadPlatformService codeValueReadPlatformService;
@Autowired @Autowired
public LoanRescheduleRequestReadPlatformServiceImpl(final RoutingDataSource dataSource, LoanRepository loanRepository, public LoanRescheduleRequestReadPlatformServiceImpl(final RoutingDataSource dataSource, LoanRepositoryWrapper loanRepositoryWrapper,
final CodeValueReadPlatformService codeValueReadPlatformService) { final CodeValueReadPlatformService codeValueReadPlatformService) {
this.jdbcTemplate = new JdbcTemplate(dataSource); this.jdbcTemplate = new JdbcTemplate(dataSource);
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.codeValueReadPlatformService = codeValueReadPlatformService; this.codeValueReadPlatformService = codeValueReadPlatformService;
} }
@@ -194,10 +192,7 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched
@Override @Override
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId) { public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId) {
final Loan loan = this.loanRepository.findOne(loanId); this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId);
if (loan == null) { throw new LoanNotFoundException(loanId); }
final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?"; final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?";
return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId }); return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId });
@@ -219,12 +214,8 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched
@Override @Override
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId, Integer statusEnum) { public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId, Integer statusEnum) {
final Loan loan = this.loanRepository.findOne(loanId); this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId);
if (loan == null) { throw new LoanNotFoundException(loanId); }
final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?" + " and lr.status_enum = ?"; 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 }); return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId, statusEnum });
} }
@@ -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.LoanRepaymentScheduleInstallment;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; 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.LoanRescheduleRequestToTermVariationMapping;
import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper;
@@ -104,7 +104,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
private final LoanScheduleHistoryWritePlatformService loanScheduleHistoryWritePlatformService; private final LoanScheduleHistoryWritePlatformService loanScheduleHistoryWritePlatformService;
private final LoanTransactionRepository loanTransactionRepository; private final LoanTransactionRepository loanTransactionRepository;
private final JournalEntryWritePlatformService journalEntryWritePlatformService; private final JournalEntryWritePlatformService journalEntryWritePlatformService;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final LoanAssembler loanAssembler; private final LoanAssembler loanAssembler;
private final LoanUtilService loanUtilService; private final LoanUtilService loanUtilService;
private final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory; private final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory;
@@ -129,7 +129,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
final LoanRepaymentScheduleHistoryRepository loanRepaymentScheduleHistoryRepository, final LoanRepaymentScheduleHistoryRepository loanRepaymentScheduleHistoryRepository,
final LoanScheduleHistoryWritePlatformService loanScheduleHistoryWritePlatformService, final LoanScheduleHistoryWritePlatformService loanScheduleHistoryWritePlatformService,
final LoanTransactionRepository loanTransactionRepository, final LoanTransactionRepository loanTransactionRepository,
final JournalEntryWritePlatformService journalEntryWritePlatformService, final LoanRepository loanRepository, final JournalEntryWritePlatformService journalEntryWritePlatformService, final LoanRepositoryWrapper loanRepositoryWrapper,
final LoanAssembler loanAssembler, final LoanUtilService loanUtilService, final LoanAssembler loanAssembler, final LoanUtilService loanUtilService,
final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory, final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory,
final LoanScheduleGeneratorFactory loanScheduleFactory, final LoanSummaryWrapper loanSummaryWrapper, final LoanScheduleGeneratorFactory loanScheduleFactory, final LoanSummaryWrapper loanSummaryWrapper,
@@ -145,7 +145,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
this.loanScheduleHistoryWritePlatformService = loanScheduleHistoryWritePlatformService; this.loanScheduleHistoryWritePlatformService = loanScheduleHistoryWritePlatformService;
this.loanTransactionRepository = loanTransactionRepository; this.loanTransactionRepository = loanTransactionRepository;
this.journalEntryWritePlatformService = journalEntryWritePlatformService; this.journalEntryWritePlatformService = journalEntryWritePlatformService;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.loanAssembler = loanAssembler; this.loanAssembler = loanAssembler;
this.loanUtilService = loanUtilService; this.loanUtilService = loanUtilService;
this.loanRepaymentScheduleTransactionProcessorFactory = loanRepaymentScheduleTransactionProcessorFactory; this.loanRepaymentScheduleTransactionProcessorFactory = loanRepaymentScheduleTransactionProcessorFactory;
@@ -281,7 +281,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
// create a new entry in the m_loan_reschedule_request table // create a new entry in the m_loan_reschedule_request table
this.loanRescheduleRequestRepository.save(loanRescheduleRequest); this.loanRescheduleRequestRepository.save(loanRescheduleRequest);
this.loanRepository.save(loan); this.loanRepositoryWrapper.save(loan);
return new CommandProcessingResultBuilder().withCommandId(jsonCommand.commandId()).withEntityId(loanRescheduleRequest.getId()) return new CommandProcessingResultBuilder().withCommandId(jsonCommand.commandId()).withEntityId(loanRescheduleRequest.getId())
.withLoanId(loan.getId()).build(); .withLoanId(loan.getId()).build();
@@ -508,7 +508,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
this.repaymentScheduleInstallmentRepository.save(installment); this.repaymentScheduleInstallmentRepository.save(installment);
} }
} }
this.loanRepository.saveAndFlush(loan); this.loanRepositoryWrapper.saveAndFlush(loan);
} catch (final DataIntegrityViolationException e) { } catch (final DataIntegrityViolationException e) {
final Throwable realCause = e.getCause(); final Throwable realCause = e.getCause();
final List<ApiParameterError> dataValidationErrors = new ArrayList<>(); final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
@@ -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.LoanTransactionData;
import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionEnumData; import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionEnumData;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; 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.domain.LoanTransactionType;
import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanSchedulePeriodData; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanSchedulePeriodData;
@@ -64,21 +64,21 @@ public class LoanAccrualWritePlatformServiceImpl implements LoanAccrualWritePlat
private final DataSource dataSource; private final DataSource dataSource;
private final JournalEntryWritePlatformService journalEntryWritePlatformService; private final JournalEntryWritePlatformService journalEntryWritePlatformService;
private final AppUserRepositoryWrapper userRepository; private final AppUserRepositoryWrapper userRepository;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository; private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository;
@Autowired @Autowired
public LoanAccrualWritePlatformServiceImpl(final RoutingDataSource dataSource, final LoanReadPlatformService loanReadPlatformService, public LoanAccrualWritePlatformServiceImpl(final RoutingDataSource dataSource, final LoanReadPlatformService loanReadPlatformService,
final JournalEntryWritePlatformService journalEntryWritePlatformService, final JournalEntryWritePlatformService journalEntryWritePlatformService,
final LoanChargeReadPlatformService loanChargeReadPlatformService, final AppUserRepositoryWrapper userRepository, final LoanChargeReadPlatformService loanChargeReadPlatformService, final AppUserRepositoryWrapper userRepository,
final LoanRepository loanRepository, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository) { final LoanRepositoryWrapper loanRepositoryWrapper, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository) {
this.loanReadPlatformService = loanReadPlatformService; this.loanReadPlatformService = loanReadPlatformService;
this.dataSource = dataSource; this.dataSource = dataSource;
this.jdbcTemplate = new JdbcTemplate(this.dataSource); this.jdbcTemplate = new JdbcTemplate(this.dataSource);
this.journalEntryWritePlatformService = journalEntryWritePlatformService; this.journalEntryWritePlatformService = journalEntryWritePlatformService;
this.loanChargeReadPlatformService = loanChargeReadPlatformService; this.loanChargeReadPlatformService = loanChargeReadPlatformService;
this.userRepository = userRepository; this.userRepository = userRepository;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.applicationCurrencyRepository = applicationCurrencyRepository; this.applicationCurrencyRepository = applicationCurrencyRepository;
} }
@@ -487,14 +487,14 @@ public class LoanAccrualWritePlatformServiceImpl implements LoanAccrualWritePlat
@Transactional @Transactional
public void addIncomeAndAccrualTransactions(Long loanId) throws Exception { public void addIncomeAndAccrualTransactions(Long loanId) throws Exception {
if (loanId != null) { if (loanId != null) {
Loan loan = this.loanRepository.findOne(loanId); Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); } if (loan == null) { throw new LoanNotFoundException(loanId); }
final List<Long> existingTransactionIds = new ArrayList<>(); final List<Long> existingTransactionIds = new ArrayList<>();
final List<Long> existingReversedTransactionIds = new ArrayList<>(); final List<Long> existingReversedTransactionIds = new ArrayList<>();
existingTransactionIds.addAll(loan.findExistingTransactionIds()); existingTransactionIds.addAll(loan.findExistingTransactionIds());
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds()); existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
loan.processIncomeTransactions(this.userRepository.fetchSystemUser()); loan.processIncomeTransactions(this.userRepository.fetchSystemUser());
this.loanRepository.saveAndFlush(loan); this.loanRepositoryWrapper.saveAndFlush(loan);
postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds);
} }
} }
@@ -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.CommandProcessingResultBuilder;
import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; 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.PlatformApiDataValidationException;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; 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.FineractEntityRelationRepository;
import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityToEntityMapping; import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityToEntityMapping;
import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityToEntityMappingRepository; 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.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.Staff;
import org.apache.fineract.portfolio.account.domain.AccountAssociationType; 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.api.LoanApiConstants;
import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData; import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData;
import org.apache.fineract.portfolio.loanaccount.data.ScheduleGeneratorDTO; 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.LoanApplicationDateException;
import org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeDeleted; import org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeDeleted;
import org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeModified; 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.AprCalculator;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel;
@@ -132,7 +141,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
private final LoanApplicationTransitionApiJsonValidator loanApplicationTransitionApiJsonValidator; private final LoanApplicationTransitionApiJsonValidator loanApplicationTransitionApiJsonValidator;
private final LoanProductDataValidator loanProductCommandFromApiJsonDeserializer; private final LoanProductDataValidator loanProductCommandFromApiJsonDeserializer;
private final LoanApplicationCommandFromApiJsonHelper fromApiJsonDeserializer; private final LoanApplicationCommandFromApiJsonHelper fromApiJsonDeserializer;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final NoteRepository noteRepository; private final NoteRepository noteRepository;
private final LoanScheduleCalculationPlatformService calculationPlatformService; private final LoanScheduleCalculationPlatformService calculationPlatformService;
private final LoanAssembler loanAssembler; private final LoanAssembler loanAssembler;
@@ -167,7 +176,8 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
final LoanApplicationCommandFromApiJsonHelper fromApiJsonDeserializer, final LoanApplicationCommandFromApiJsonHelper fromApiJsonDeserializer,
final LoanProductDataValidator loanProductCommandFromApiJsonDeserializer, final AprCalculator aprCalculator, final LoanProductDataValidator loanProductCommandFromApiJsonDeserializer, final AprCalculator aprCalculator,
final LoanAssembler loanAssembler, final LoanChargeAssembler loanChargeAssembler, 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 LoanScheduleCalculationPlatformService calculationPlatformService, final ClientRepositoryWrapper clientRepository,
final LoanProductRepository loanProductRepository, final AccountNumberGenerator accountNumberGenerator, final LoanProductRepository loanProductRepository, final AccountNumberGenerator accountNumberGenerator,
final LoanSummaryWrapper loanSummaryWrapper, final GroupRepositoryWrapper groupRepository, final LoanSummaryWrapper loanSummaryWrapper, final GroupRepositoryWrapper groupRepository,
@@ -190,7 +200,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
this.loanAssembler = loanAssembler; this.loanAssembler = loanAssembler;
this.loanChargeAssembler = loanChargeAssembler; this.loanChargeAssembler = loanChargeAssembler;
this.loanCollateralAssembler = loanCollateralAssembler; this.loanCollateralAssembler = loanCollateralAssembler;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper ;
this.noteRepository = noteRepository; this.noteRepository = noteRepository;
this.calculationPlatformService = calculationPlatformService; this.calculationPlatformService = calculationPlatformService;
this.clientRepository = clientRepository; this.clientRepository = clientRepository;
@@ -289,7 +299,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
if(newLoanApplication.isTopup()){ if(newLoanApplication.isTopup()){
final Long loanIdToClose = command.longValueOfParameterNamed(LoanApiConstants.loanIdToClose); 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){ if(loanToClose == null){
throw new GeneralPlatformDomainRuleException("error.msg.loan.loanIdToClose.no.active.loan.associated.to.client.found", 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."); "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()) { if (loanProduct.isInterestRecalculationEnabled()) {
this.fromApiJsonDeserializer.validateLoanForInterestRecalculation(newLoanApplication); this.fromApiJsonDeserializer.validateLoanForInterestRecalculation(newLoanApplication);
@@ -341,7 +351,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
final AccountNumberFormat accountNumberFormat = this.accountNumberFormatRepository final AccountNumberFormat accountNumberFormat = this.accountNumberFormatRepository
.findByAccountType(EntityAccountType.LOAN); .findByAccountType(EntityAccountType.LOAN);
newLoanApplication.updateAccountNo(this.accountNumberGenerator.generate(newLoanApplication, accountNumberFormat)); newLoanApplication.updateAccountNo(this.accountNumberGenerator.generate(newLoanApplication, accountNumberFormat));
this.loanRepository.save(newLoanApplication); this.loanRepositoryWrapper.save(newLoanApplication);
} }
final String submittedOnNote = command.stringValueOfParameterNamed("submittedOnNote"); 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()); LoanChargeData chargeData = new LoanChargeData(charge.getId(), charge.getDueLocalDate(), charge.amountOrPercentage());
chargesMap.put(charge.getId(), chargeData); chargesMap.put(charge.getId(), chargeData);
} }
Set<LoanDisbursementDetails> disbursementDetails = this.loanUtilService.fetchDisbursementData(command.parsedJson() List<LoanDisbursementDetails> disbursementDetails = this.loanUtilService.fetchDisbursementData(command.parsedJson()
.getAsJsonObject()); .getAsJsonObject());
/** /**
@@ -684,7 +694,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
if(existingLoanTopupDetails != null){ if(existingLoanTopupDetails != null){
existingLoanIdToClose = existingLoanTopupDetails.getLoanIdToClose(); existingLoanIdToClose = existingLoanTopupDetails.getLoanIdToClose();
} }
final Loan loanToClose = this.loanRepository.findNonClosedLoanThatBelongsToClient(loanIdToClose, existingLoanApplication.getClientId()); final Loan loanToClose = this.loanRepositoryWrapper.findNonClosedLoanThatBelongsToClient(loanIdToClose, existingLoanApplication.getClientId());
if(loanToClose == null){ if(loanToClose == null){
throw new GeneralPlatformDomainRuleException("error.msg.loan.loanIdToClose.no.active.loan.associated.to.client.found", 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."); "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 // updating loan interest recalculation details throwing null
// pointer exception after saveAndFlush // pointer exception after saveAndFlush
// http://stackoverflow.com/questions/17151757/hibernate-cascade-update-gives-null-pointer/17334374#17334374 // http://stackoverflow.com/questions/17151757/hibernate-cascade-update-gives-null-pointer/17334374#17334374
this.loanRepository.save(existingLoanApplication); this.loanRepositoryWrapper.save(existingLoanApplication);
if (productRelatedDetail.isInterestRecalculationEnabled()) { if (productRelatedDetail.isInterestRecalculationEnabled()) {
this.fromApiJsonDeserializer.validateLoanForInterestRecalculation(existingLoanApplication); this.fromApiJsonDeserializer.validateLoanForInterestRecalculation(existingLoanApplication);
@@ -1023,7 +1033,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
final List<Note> relatedNotes = this.noteRepository.findByLoanId(loan.getId()); final List<Note> relatedNotes = this.noteRepository.findByLoanId(loan.getId());
this.noteRepository.deleteInBatch(relatedNotes); this.noteRepository.deleteInBatch(relatedNotes);
this.loanRepository.delete(loanId); this.loanRepositoryWrapper.delete(loanId);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withEntityId(loanId) // .withEntityId(loanId) //
@@ -1100,7 +1110,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
if(loan.isTopup() && loan.getClientId() != null){ if(loan.isTopup() && loan.getClientId() != null){
final Long loanIdToClose = loan.getTopupLoanDetails().getLoanIdToClose(); 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){ if(loanToClose == null){
throw new GeneralPlatformDomainRuleException("error.msg.loan.to.be.closed.with.topup.is.not.active", throw new GeneralPlatformDomainRuleException("error.msg.loan.to.be.closed.with.topup.is.not.active",
"Loan to be closed with this 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<String, Object> changes = loan.loanApplicationRejection(currentUser, command, defaultLoanLifecycleStateMachine()); final Map<String, Object> changes = loan.loanApplicationRejection(currentUser, command, defaultLoanLifecycleStateMachine());
if (!changes.isEmpty()) { if (!changes.isEmpty()) {
this.loanRepository.save(loan); this.loanRepositoryWrapper.save(loan);
final String noteText = command.stringValueOfParameterNamed("note"); final String noteText = command.stringValueOfParameterNamed("note");
if (StringUtils.isNotBlank(noteText)) { if (StringUtils.isNotBlank(noteText)) {
@@ -1239,7 +1249,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
final Map<String, Object> changes = loan.loanApplicationWithdrawnByApplicant(currentUser, command, final Map<String, Object> changes = loan.loanApplicationWithdrawnByApplicant(currentUser, command,
defaultLoanLifecycleStateMachine()); defaultLoanLifecycleStateMachine());
if (!changes.isEmpty()) { if (!changes.isEmpty()) {
this.loanRepository.save(loan); this.loanRepositoryWrapper.save(loan);
final String noteText = command.stringValueOfParameterNamed("note"); final String noteText = command.stringValueOfParameterNamed("note");
if (StringUtils.isNotBlank(noteText)) { if (StringUtils.isNotBlank(noteText)) {
@@ -1260,8 +1270,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
} }
private Loan retrieveLoanBy(final Long loanId) { private Loan retrieveLoanBy(final Long loanId) {
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); }
loan.setHelpers(defaultLoanLifecycleStateMachine(), this.loanSummaryWrapper, this.loanRepaymentScheduleTransactionProcessorFactory); loan.setHelpers(defaultLoanLifecycleStateMachine(), this.loanSummaryWrapper, this.loanRepaymentScheduleTransactionProcessorFactory);
return loan; return loan;
} }
@@ -1311,7 +1320,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
this.repaymentScheduleInstallmentRepository.save(installment); this.repaymentScheduleInstallmentRepository.save(installment);
} }
} }
this.loanRepository.saveAndFlush(loan); this.loanRepositoryWrapper.saveAndFlush(loan);
} catch (final DataIntegrityViolationException e) { } catch (final DataIntegrityViolationException e) {
final Throwable realCause = e.getCause(); final Throwable realCause = e.getCause();
final List<ApiParameterError> dataValidationErrors = new ArrayList<>(); final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
@@ -138,7 +138,7 @@ public class LoanAssembler {
} }
public Loan assembleFrom(final Long accountId) { 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, loanAccount.setHelpers(defaultLoanLifecycleStateMachine(), this.loanSummaryWrapper,
this.loanRepaymentScheduleTransactionProcessorFactory); this.loanRepaymentScheduleTransactionProcessorFactory);
@@ -181,7 +181,7 @@ public class LoanAssembler {
if (loanPurposeId != null) { if (loanPurposeId != null) {
loanPurpose = this.codeValueRepository.findOneWithNotFoundDetection(loanPurposeId); loanPurpose = this.codeValueRepository.findOneWithNotFoundDetection(loanPurposeId);
} }
Set<LoanDisbursementDetails> disbursementDetails = null; List<LoanDisbursementDetails> disbursementDetails = null;
BigDecimal fixedEmiAmount = null; BigDecimal fixedEmiAmount = null;
if (loanProduct.isMultiDisburseLoan() || loanProduct.canDefineInstallmentAmount()) { if (loanProduct.isMultiDisburseLoan() || loanProduct.canDefineInstallmentAmount()) {
fixedEmiAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(LoanApiConstants.emiAmountParameterName, element); fixedEmiAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(LoanApiConstants.emiAmountParameterName, element);
@@ -65,7 +65,7 @@ public class LoanChargeAssembler {
this.loanProductRepository = loanProductRepository; this.loanProductRepository = loanProductRepository;
} }
public Set<LoanCharge> fromParsedJson(final JsonElement element, Set<LoanDisbursementDetails> disbursementDetails) { public Set<LoanCharge> fromParsedJson(final JsonElement element, List<LoanDisbursementDetails> disbursementDetails) {
JsonArray jsonDisbursement = this.fromApiJsonHelper.extractJsonArrayNamed("disbursementData", element); JsonArray jsonDisbursement = this.fromApiJsonHelper.extractJsonArrayNamed("disbursementData", element);
List<Long> disbursementChargeIds = new ArrayList<>(); List<Long> disbursementChargeIds = new ArrayList<>();
@@ -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.LoanRepaymentScheduleInstallment;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; 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.LoanStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType; import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType;
@@ -132,7 +133,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper ;
private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository; private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository;
private final LoanProductReadPlatformService loanProductReadPlatformService; private final LoanProductReadPlatformService loanProductReadPlatformService;
private final ClientReadPlatformService clientReadPlatformService; private final ClientReadPlatformService clientReadPlatformService;
@@ -155,8 +156,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
private final AccountDetailsReadPlatformService accountDetailsReadPlatformService; private final AccountDetailsReadPlatformService accountDetailsReadPlatformService;
@Autowired @Autowired
public LoanReadPlatformServiceImpl(final PlatformSecurityContext context, final LoanRepository loanRepository, public LoanReadPlatformServiceImpl(final PlatformSecurityContext context, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository,
final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository,
final LoanProductReadPlatformService loanProductReadPlatformService, final ClientReadPlatformService clientReadPlatformService, final LoanProductReadPlatformService loanProductReadPlatformService, final ClientReadPlatformService clientReadPlatformService,
final GroupReadPlatformService groupReadPlatformService, final LoanDropdownReadPlatformService loanDropdownReadPlatformService, final GroupReadPlatformService groupReadPlatformService, final LoanDropdownReadPlatformService loanDropdownReadPlatformService,
final FundReadPlatformService fundReadPlatformService, final ChargeReadPlatformService chargeReadPlatformService, final FundReadPlatformService fundReadPlatformService, final ChargeReadPlatformService chargeReadPlatformService,
@@ -166,9 +166,10 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory, final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory,
final FloatingRatesReadPlatformService floatingRatesReadPlatformService, final LoanUtilService loanUtilService, final FloatingRatesReadPlatformService floatingRatesReadPlatformService, final LoanUtilService loanUtilService,
final ConfigurationDomainService configurationDomainService, final ConfigurationDomainService configurationDomainService,
final AccountDetailsReadPlatformService accountDetailsReadPlatformService) { final AccountDetailsReadPlatformService accountDetailsReadPlatformService,
final LoanRepositoryWrapper loanRepositoryWrapper) {
this.context = context; this.context = context;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper ;
this.applicationCurrencyRepository = applicationCurrencyRepository; this.applicationCurrencyRepository = applicationCurrencyRepository;
this.loanProductReadPlatformService = loanProductReadPlatformService; this.loanProductReadPlatformService = loanProductReadPlatformService;
this.clientReadPlatformService = clientReadPlatformService; this.clientReadPlatformService = clientReadPlatformService;
@@ -401,8 +402,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
this.context.authenticatedUser(); this.context.authenticatedUser();
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); }
loan.setHelpers(null, null, loanRepaymentScheduleTransactionProcessorFactory); loan.setHelpers(null, null, loanRepaymentScheduleTransactionProcessorFactory);
final MonetaryCurrency currency = loan.getCurrency(); 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 // TODO - KW -OPTIMIZE - write simple sql query to fetch back overdue
// interest that can be waived along with the date of repayment period // interest that can be waived along with the date of repayment period
// interest is overdue. // interest is overdue.
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); }
final MonetaryCurrency currency = loan.getCurrency(); final MonetaryCurrency currency = loan.getCurrency();
final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency); final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency);
final CurrencyData currencyData = applicationCurrency.toData(); final CurrencyData currencyData = applicationCurrency.toData();
@@ -467,18 +465,13 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
@Override @Override
public LoanApprovalData retrieveApprovalTemplate(final Long loanId) { public LoanApprovalData retrieveApprovalTemplate(final Long loanId) {
final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
final Loan loan = this.loanRepository.findOne(loanId);
if (loan == null) { throw new LoanNotFoundException(loanId); }
return new LoanApprovalData(loan.getProposedPrincipal(), DateUtils.getLocalDateOfTenant()); return new LoanApprovalData(loan.getProposedPrincipal(), DateUtils.getLocalDateOfTenant());
} }
@Override @Override
public LoanTransactionData retrieveDisbursalTemplate(final Long loanId, boolean paymentDetailsRequired) { public LoanTransactionData retrieveDisbursalTemplate(final Long loanId, boolean paymentDetailsRequired) {
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); }
final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.DISBURSEMENT); final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.DISBURSEMENT);
Collection<PaymentTypeData> paymentOptions = null; Collection<PaymentTypeData> paymentOptions = null;
if (paymentDetailsRequired) { if (paymentDetailsRequired) {
@@ -1721,8 +1714,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
@Override @Override
public LoanTransactionData retrieveRecoveryPaymentTemplate(Long loanId) { public LoanTransactionData retrieveRecoveryPaymentTemplate(Long loanId) {
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); }
final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.RECOVERY_REPAYMENT); final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.RECOVERY_REPAYMENT);
final Collection<PaymentTypeData> paymentOptions = this.paymentTypeReadPlatformService.retrieveAllPaymentTypes(); final Collection<PaymentTypeData> paymentOptions = this.paymentTypeReadPlatformService.retrieveAllPaymentTypes();
BigDecimal outstandingLoanBalance = null; BigDecimal outstandingLoanBalance = null;
@@ -1961,9 +1953,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
// TODO - KW - OPTIMIZE - write simple sql query to fetch back date of // TODO - KW - OPTIMIZE - write simple sql query to fetch back date of
// possible next transaction date. // possible next transaction date.
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); }
final MonetaryCurrency currency = loan.getCurrency(); final MonetaryCurrency currency = loan.getCurrency();
final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency); 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) { public LoanTransactionData retrieveLoanForeclosureTemplate(final Long loanId, final LocalDate transactionDate) {
this.context.authenticatedUser(); this.context.authenticatedUser();
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
if (loan == null) { throw new LoanNotFoundException(loanId); }
loan.validateForForeclosure(transactionDate); loan.validateForForeclosure(transactionDate);
final MonetaryCurrency currency = loan.getCurrency(); final MonetaryCurrency currency = loan.getCurrency();
final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency); final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency);
@@ -19,6 +19,7 @@
package org.apache.fineract.portfolio.loanaccount.service; package org.apache.fineract.portfolio.loanaccount.service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -289,10 +290,10 @@ public class LoanUtilService {
return calculatedRepaymentsStartingFromDate; return calculatedRepaymentsStartingFromDate;
} }
public Set<LoanDisbursementDetails> fetchDisbursementData(final JsonObject command) { public List<LoanDisbursementDetails> fetchDisbursementData(final JsonObject command) {
final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(command); final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(command);
final String dateFormat = this.fromApiJsonHelper.extractDateFormatParameter(command); final String dateFormat = this.fromApiJsonHelper.extractDateFormatParameter(command);
Set<LoanDisbursementDetails> disbursementDatas = new HashSet<>(); List<LoanDisbursementDetails> disbursementDatas = new ArrayList<>();
if (command.has(LoanApiConstants.disbursementDataParameterName)) { if (command.has(LoanApiConstants.disbursementDataParameterName)) {
final JsonArray disbursementDataArray = command.getAsJsonArray(LoanApiConstants.disbursementDataParameterName); final JsonArray disbursementDataArray = command.getAsJsonArray(LoanApiConstants.disbursementDataParameterName);
if (disbursementDataArray != null && disbursementDataArray.size() > 0) { if (disbursementDataArray != null && disbursementDataArray.size() > 0) {
@@ -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.calendar.domain.CalendarInstance;
import org.apache.fineract.portfolio.collectionsheet.command.CollectionSheetBulkDisbursalCommand; import org.apache.fineract.portfolio.collectionsheet.command.CollectionSheetBulkDisbursalCommand;
import org.apache.fineract.portfolio.collectionsheet.command.CollectionSheetBulkRepaymentCommand; 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.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
@@ -76,13 +77,13 @@ public interface LoanWritePlatformService {
void applyHolidaysToLoans(); 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); CommandProcessingResult payLoanCharge(Long loanId, Long loanChargeId, JsonCommand command, boolean isChargeIdIncludedInJson);
@@ -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.LoanRepaymentScheduleInstallment;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory; 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.LoanStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus;
import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper; 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.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; 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.guarantor.service.GuarantorDomainService;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator;
@@ -190,7 +199,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final LoanEventApiJsonValidator loanEventApiJsonValidator; private final LoanEventApiJsonValidator loanEventApiJsonValidator;
private final LoanUpdateCommandFromApiJsonDeserializer loanUpdateCommandFromApiJsonDeserializer; private final LoanUpdateCommandFromApiJsonDeserializer loanUpdateCommandFromApiJsonDeserializer;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper ;
private final LoanAccountDomainService loanAccountDomainService; private final LoanAccountDomainService loanAccountDomainService;
private final NoteRepository noteRepository; private final NoteRepository noteRepository;
private final LoanTransactionRepository loanTransactionRepository; private final LoanTransactionRepository loanTransactionRepository;
@@ -229,7 +238,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
public LoanWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, public LoanWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
final LoanEventApiJsonValidator loanEventApiJsonValidator, final LoanEventApiJsonValidator loanEventApiJsonValidator,
final LoanUpdateCommandFromApiJsonDeserializer loanUpdateCommandFromApiJsonDeserializer, final LoanAssembler loanAssembler, final LoanUpdateCommandFromApiJsonDeserializer loanUpdateCommandFromApiJsonDeserializer, final LoanAssembler loanAssembler,
final LoanRepository loanRepository, final LoanAccountDomainService loanAccountDomainService, final LoanAccountDomainService loanAccountDomainService,
final LoanTransactionRepository loanTransactionRepository, final NoteRepository noteRepository, final LoanTransactionRepository loanTransactionRepository, final NoteRepository noteRepository,
final ChargeRepositoryWrapper chargeRepository, final LoanChargeRepository loanChargeRepository, final ChargeRepositoryWrapper chargeRepository, final LoanChargeRepository loanChargeRepository,
final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository,
@@ -252,11 +261,12 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final BusinessEventNotifierService businessEventNotifierService, final GuarantorDomainService guarantorDomainService, final BusinessEventNotifierService businessEventNotifierService, final GuarantorDomainService guarantorDomainService,
final LoanUtilService loanUtilService, final LoanSummaryWrapper loanSummaryWrapper, final LoanUtilService loanUtilService, final LoanSummaryWrapper loanSummaryWrapper,
final LoanRepaymentScheduleTransactionProcessorFactory transactionProcessingStrategy, final LoanRepaymentScheduleTransactionProcessorFactory transactionProcessingStrategy,
final CodeValueRepositoryWrapper codeValueRepository) { final CodeValueRepositoryWrapper codeValueRepository,
final LoanRepositoryWrapper loanRepositoryWrapper) {
this.context = context; this.context = context;
this.loanEventApiJsonValidator = loanEventApiJsonValidator; this.loanEventApiJsonValidator = loanEventApiJsonValidator;
this.loanAssembler = loanAssembler; this.loanAssembler = loanAssembler;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper ;
this.loanAccountDomainService = loanAccountDomainService; this.loanAccountDomainService = loanAccountDomainService;
this.loanTransactionRepository = loanTransactionRepository; this.loanTransactionRepository = loanTransactionRepository;
this.noteRepository = noteRepository; this.noteRepository = noteRepository;
@@ -360,7 +370,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
if(loan.isTopup() && loan.getClientId() != null){ if(loan.isTopup() && loan.getClientId() != null){
final Long loanIdToClose = loan.getTopupLoanDetails().getLoanIdToClose(); 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){ if(loanToClose == null){
throw new GeneralPlatformDomainRuleException("error.msg.loan.to.be.closed.with.topup.is.not.active", throw new GeneralPlatformDomainRuleException("error.msg.loan.to.be.closed.with.topup.is.not.active",
"Loan to be closed with this 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.repaymentScheduleInstallmentRepository.save(installment);
} }
} }
this.loanRepository.saveAndFlush(loan); this.loanRepositoryWrapper.saveAndFlush(loan);
} catch (final DataIntegrityViolationException e) { } catch (final DataIntegrityViolationException e) {
final Throwable realCause = e.getCause(); final Throwable realCause = e.getCause();
final List<ApiParameterError> dataValidationErrors = new ArrayList<>(); final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
@@ -566,7 +576,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
this.repaymentScheduleInstallmentRepository.save(installment); this.repaymentScheduleInstallmentRepository.save(installment);
} }
} }
this.loanRepository.save(loan); this.loanRepositoryWrapper.save(loan);
} catch (final DataIntegrityViolationException e) { } catch (final DataIntegrityViolationException e) {
final Throwable realCause = e.getCause(); final Throwable realCause = e.getCause();
final List<ApiParameterError> dataValidationErrors = new ArrayList<>(); final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
@@ -814,8 +824,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final boolean allowTransactionsOnHoliday = this.configurationDomainService.allowTransactionsOnHolidayEnabled(); final boolean allowTransactionsOnHoliday = this.configurationDomainService.allowTransactionsOnHolidayEnabled();
for (final SingleRepaymentCommand singleLoanRepaymentCommand : repaymentCommand) { for (final SingleRepaymentCommand singleLoanRepaymentCommand : repaymentCommand) {
if (singleLoanRepaymentCommand != null) { if (singleLoanRepaymentCommand != null) {
Loan loans = this.loanRepository.findOne(singleLoanRepaymentCommand.getLoanId()); Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(singleLoanRepaymentCommand.getLoanId());
final List<Holiday> holidays = this.holidayRepository.findByOfficeIdAndGreaterThanDate(loans.getOfficeId(), final List<Holiday> holidays = this.holidayRepository.findByOfficeIdAndGreaterThanDate(loan.getOfficeId(),
singleLoanRepaymentCommand.getTransactionDate().toDate()); singleLoanRepaymentCommand.getTransactionDate().toDate());
final WorkingDays workingDays = this.workingDaysRepository.findOne(); final WorkingDays workingDays = this.workingDaysRepository.findOne();
final boolean allowTransactionsOnNonWorkingDay = this.configurationDomainService.allowTransactionsOnNonWorkingDayEnabled(); final boolean allowTransactionsOnNonWorkingDay = this.configurationDomainService.allowTransactionsOnNonWorkingDayEnabled();
@@ -823,9 +833,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
isHolidayEnabled = this.configurationDomainService.isRescheduleRepaymentsOnHolidaysEnabled(); isHolidayEnabled = this.configurationDomainService.isRescheduleRepaymentsOnHolidaysEnabled();
holidayDetailDTO = new HolidayDetailDTO(isHolidayEnabled, holidays, workingDays, allowTransactionsOnHoliday, holidayDetailDTO = new HolidayDetailDTO(isHolidayEnabled, holidays, workingDays, allowTransactionsOnHoliday,
allowTransactionsOnNonWorkingDay); allowTransactionsOnNonWorkingDay);
loans.validateRepaymentDateIsOnHoliday(singleLoanRepaymentCommand.getTransactionDate(), loan.validateRepaymentDateIsOnHoliday(singleLoanRepaymentCommand.getTransactionDate(),
holidayDetailDTO.isAllowTransactionsOnHoliday(), holidayDetailDTO.getHolidays()); holidayDetailDTO.isAllowTransactionsOnHoliday(), holidayDetailDTO.getHolidays());
loans.validateRepaymentDateIsOnNonWorkingDay(singleLoanRepaymentCommand.getTransactionDate(), loan.validateRepaymentDateIsOnNonWorkingDay(singleLoanRepaymentCommand.getTransactionDate(),
holidayDetailDTO.getWorkingDays(), holidayDetailDTO.isAllowTransactionsOnNonWorkingDay()); holidayDetailDTO.getWorkingDays(), holidayDetailDTO.isAllowTransactionsOnNonWorkingDay());
isHolidayValidationDone = true; isHolidayValidationDone = true;
break; break;
@@ -962,7 +972,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
} }
Collection<Long> transactionIds = new ArrayList<>(); Collection<Long> transactionIds = new ArrayList<>();
for (LoanTransaction transaction : loan.getLoanTransactions()) { List<LoanTransaction> transactions = loan.getLoanTransactions() ;
for (LoanTransaction transaction : transactions) {
if (transaction.isRefund() && transaction.isNotReversed()) { if (transaction.isRefund() && transaction.isNotReversed()) {
transactionIds.add(transaction.getId()); transactionIds.add(transaction.getId());
} }
@@ -1277,7 +1288,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
.build(); .build();
} }
private void validateAddingNewChargeAllowed(Set<LoanDisbursementDetails> loanDisburseDetails) { private void validateAddingNewChargeAllowed(List<LoanDisbursementDetails> loanDisburseDetails) {
boolean pendingDisbursementAvailable = false; boolean pendingDisbursementAvailable = false;
for (LoanDisbursementDetails disbursementDetail : loanDisburseDetails) { for (LoanDisbursementDetails disbursementDetail : loanDisburseDetails) {
if (disbursementDetail.actualDisbursementDate() == null) { if (disbursementDetail.actualDisbursementDate() == null) {
@@ -1299,7 +1310,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final Loan loan = this.loanAssembler.assembleFrom(loanId); final Loan loan = this.loanAssembler.assembleFrom(loanId);
checkClientOrGroupActive(loan); checkClientOrGroupActive(loan);
Set<LoanDisbursementDetails> loanDisburseDetails = loan.getDisbursementDetails(); List<LoanDisbursementDetails> loanDisburseDetails = loan.getDisbursementDetails();
final Long chargeDefinitionId = command.longValueOfParameterNamed("chargeId"); final Long chargeDefinitionId = command.longValueOfParameterNamed("chargeId");
final Charge chargeDefinition = this.chargeRepository.findOneWithNotFoundDetection(chargeDefinitionId); final Charge chargeDefinition = this.chargeRepository.findOneWithNotFoundDetection(chargeDefinitionId);
@@ -1823,11 +1834,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
@Transactional @Transactional
@Override @Override
public LoanTransaction initiateLoanTransfer(final Long accountId, final LocalDate transferDate) { public LoanTransaction initiateLoanTransfer(final Loan loan, final LocalDate transferDate) {
AppUser currentUser = getAppUserIfPresent(); AppUser currentUser = getAppUserIfPresent();
this.loanAssembler.setHelpers(loan);
final Loan loan = this.loanAssembler.assembleFrom(accountId);
checkClientOrGroupActive(loan); checkClientOrGroupActive(loan);
this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_INITIATE_TRANSFER, this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_INITIATE_TRANSFER,
constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
@@ -1851,12 +1861,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
@Transactional @Transactional
@Override @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) { final Staff loanOfficer) {
AppUser currentUser = getAppUserIfPresent(); AppUser currentUser = getAppUserIfPresent();
this.loanAssembler.setHelpers(loan) ;
final Loan loan = this.loanAssembler.assembleFrom(accountId);
this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_ACCEPT_TRANSFER, this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_ACCEPT_TRANSFER,
constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List<Long> existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds());
@@ -1886,11 +1894,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
@Transactional @Transactional
@Override @Override
public LoanTransaction withdrawLoanTransfer(final Long accountId, final LocalDate transferDate) { public LoanTransaction withdrawLoanTransfer(final Loan loan, final LocalDate transferDate) {
AppUser currentUser = getAppUserIfPresent(); AppUser currentUser = getAppUserIfPresent();
this.loanAssembler.setHelpers(loan);
final Loan loan = this.loanAssembler.assembleFrom(accountId);
this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_WITHDRAW_TRANSFER, this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_WITHDRAW_TRANSFER,
constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
@@ -1914,8 +1920,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
@Transactional @Transactional
@Override @Override
public void rejectLoanTransfer(final Long accountId) { public void rejectLoanTransfer(final Loan loan) {
final Loan loan = this.loanAssembler.assembleFrom(accountId); this.loanAssembler.setHelpers(loan);
this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_REJECT_TRANSFER, this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_REJECT_TRANSFER,
constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
loan.setLoanStatus(LoanStatus.TRANSFER_ON_HOLD.getValue()); loan.setLoanStatus(LoanStatus.TRANSFER_ON_HOLD.getValue());
@@ -1988,7 +1994,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
this.businessEventNotifierService.notifyBusinessEventWasExecuted(BUSINESS_EVENTS.LOAN_REASSIGN_OFFICER, this.businessEventNotifierService.notifyBusinessEventWasExecuted(BUSINESS_EVENTS.LOAN_REASSIGN_OFFICER,
constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
} }
this.loanRepository.flush(); this.loanRepositoryWrapper.flush();
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withCommandId(command.commandId()) // .withCommandId(command.commandId()) //
@@ -2070,7 +2076,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
loanIds.add(calendarInstance.getEntityId()); loanIds.add(calendarInstance.getEntityId());
} }
final List<Loan> loans = this.loanRepository.findByIdsAndLoanStatusAndLoanType(loanIds, loanStatuses, loanTypes); final List<Loan> loans = this.loanRepositoryWrapper.findByIdsAndLoanStatusAndLoanType(loanIds, loanStatuses, loanTypes);
List<Holiday> holidays = null; List<Holiday> holidays = null;
final LocalDate recalculateFrom = null; final LocalDate recalculateFrom = null;
// loop through each loan to reschedule the repayment dates // loop through each loan to reschedule the repayment dates
@@ -2116,19 +2122,19 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final List<Loan> loansToUpdate; final List<Loan> loansToUpdate;
if (loan.isGroupLoan()) { if (loan.isGroupLoan()) {
if (loan.loanProduct().isIncludeInBorrowerCycle()) { if (loan.loanProduct().isIncludeInBorrowerCycle()) {
loansToUpdate = this.loanRepository.getGroupLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(), loan.getGroupId(), loansToUpdate = this.loanRepositoryWrapper.getGroupLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(), loan.getGroupId(),
AccountType.GROUP.getValue()); AccountType.GROUP.getValue());
} else { } else {
loansToUpdate = this.loanRepository.getGroupLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(), loansToUpdate = this.loanRepositoryWrapper.getGroupLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(),
loan.getGroupId(), AccountType.GROUP.getValue()); loan.getGroupId(), AccountType.GROUP.getValue());
} }
} else { } else {
if (loan.loanProduct().isIncludeInBorrowerCycle()) { if (loan.loanProduct().isIncludeInBorrowerCycle()) {
loansToUpdate = this.loanRepository loansToUpdate = this.loanRepositoryWrapper
.getClientOrJLGLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(), loan.getClientId()); .getClientOrJLGLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(), loan.getClientId());
} else { } else {
loansToUpdate = this.loanRepository.getClientLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(), loansToUpdate = this.loanRepositoryWrapper.getClientLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(),
loan.getClientId()); loan.getClientId());
} }
@@ -2144,13 +2150,13 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private void updateLoanCounters(final Loan loan, final LocalDate actualDisbursementDate) { private void updateLoanCounters(final Loan loan, final LocalDate actualDisbursementDate) {
if (loan.isGroupLoan()) { if (loan.isGroupLoan()) {
final List<Loan> loansToUpdateForLoanCounter = this.loanRepository.getGroupLoansDisbursedAfter(actualDisbursementDate.toDate(), final List<Loan> loansToUpdateForLoanCounter = this.loanRepositoryWrapper.getGroupLoansDisbursedAfter(actualDisbursementDate.toDate(),
loan.getGroupId(), AccountType.GROUP.getValue()); loan.getGroupId(), AccountType.GROUP.getValue());
final Integer newLoanCounter = getNewGroupLoanCounter(loan); final Integer newLoanCounter = getNewGroupLoanCounter(loan);
final Integer newLoanProductCounter = getNewGroupLoanProductCounter(loan); final Integer newLoanProductCounter = getNewGroupLoanProductCounter(loan);
updateLoanCounter(loan, loansToUpdateForLoanCounter, newLoanCounter, newLoanProductCounter); updateLoanCounter(loan, loansToUpdateForLoanCounter, newLoanCounter, newLoanProductCounter);
} else { } else {
final List<Loan> loansToUpdateForLoanCounter = this.loanRepository.getClientOrJLGLoansDisbursedAfter( final List<Loan> loansToUpdateForLoanCounter = this.loanRepositoryWrapper.getClientOrJLGLoansDisbursedAfter(
actualDisbursementDate.toDate(), loan.getClientId()); actualDisbursementDate.toDate(), loan.getClientId());
final Integer newLoanCounter = getNewClientOrJLGLoanCounter(loan); final Integer newLoanCounter = getNewClientOrJLGLoanCounter(loan);
final Integer newLoanProductCounter = getNewClientOrJLGLoanProductCounter(loan); final Integer newLoanProductCounter = getNewClientOrJLGLoanProductCounter(loan);
@@ -2160,7 +2166,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private Integer getNewGroupLoanCounter(final Loan loan) { 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) { if (maxClientLoanCounter == null) {
maxClientLoanCounter = 1; maxClientLoanCounter = 1;
} else { } else {
@@ -2171,7 +2177,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private Integer getNewGroupLoanProductCounter(final Loan loan) { 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()); loan.getGroupId(), AccountType.GROUP.getValue());
if (maxLoanProductLoanCounter == null) { if (maxLoanProductLoanCounter == null) {
maxLoanProductLoanCounter = 1; maxLoanProductLoanCounter = 1;
@@ -2211,12 +2217,12 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
loan.updateClientLoanCounter(null); loan.updateClientLoanCounter(null);
} }
loan.updateLoanProductLoanCounter(newLoanProductCounter); loan.updateLoanProductLoanCounter(newLoanProductCounter);
this.loanRepository.save(loansToUpdateForLoanCounter); this.loanRepositoryWrapper.save(loansToUpdateForLoanCounter);
} }
private Integer getNewClientOrJLGLoanCounter(final Loan loan) { private Integer getNewClientOrJLGLoanCounter(final Loan loan) {
Integer maxClientLoanCounter = this.loanRepository.getMaxClientOrJLGLoanCounter(loan.getClientId()); Integer maxClientLoanCounter = this.loanRepositoryWrapper.getMaxClientOrJLGLoanCounter(loan.getClientId());
if (maxClientLoanCounter == null) { if (maxClientLoanCounter == null) {
maxClientLoanCounter = 1; maxClientLoanCounter = 1;
} else { } else {
@@ -2227,7 +2233,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private Integer getNewClientOrJLGLoanProductCounter(final Loan loan) { private Integer getNewClientOrJLGLoanProductCounter(final Loan loan) {
Integer maxLoanProductLoanCounter = this.loanRepository.getMaxClientOrJLGLoanProductCounter(loan.loanProduct().getId(), Integer maxLoanProductLoanCounter = this.loanRepositoryWrapper.getMaxClientOrJLGLoanProductCounter(loan.loanProduct().getId(),
loan.getClientId()); loan.getClientId());
if (maxLoanProductLoanCounter == null) { if (maxLoanProductLoanCounter == null) {
maxLoanProductLoanCounter = 1; maxLoanProductLoanCounter = 1;
@@ -2256,7 +2262,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
} }
} }
} }
this.loanRepository.save(loansToUpdate); this.loanRepositoryWrapper.save(loansToUpdate);
} }
@Transactional @Transactional
@@ -2285,17 +2291,17 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
// get all loans // get all loans
final List<Loan> loans = new ArrayList<>(); final List<Loan> loans = new ArrayList<>();
// get all individual and jlg loans // 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 // FIXME: AA optimize to get all client and group loans belongs to a
// office id // office id
// get all group loans // get all group loans
loans.addAll(this.loanRepository.findByGroupOfficeIdsAndLoanStatus(officeIds, loanStatuses)); loans.addAll(this.loanRepositoryWrapper.findByGroupOfficeIdsAndLoanStatus(officeIds, loanStatuses));
for (final Loan loan : loans) { for (final Loan loan : loans) {
// apply holiday // apply holiday
loan.applyHolidayToRepaymentScheduleDates(holiday); loan.applyHolidayToRepaymentScheduleDates(holiday);
} }
this.loanRepository.save(loans); this.loanRepositoryWrapper.save(loans);
holiday.processed(); holiday.processed();
} }
this.holidayRepository.save(holidays); this.holidayRepository.save(holidays);
@@ -2307,10 +2313,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final Long productId = loan.loanProduct().getId(); final Long productId = loan.loanProduct().getId();
if (loan.isGroupLoan()) { if (loan.isGroupLoan()) {
activeLoansLoanProductIds = this.loanRepository.findActiveLoansLoanProductIdsByGroup(loan.getGroupId(), activeLoansLoanProductIds = this.loanRepositoryWrapper.findActiveLoansLoanProductIdsByGroup(loan.getGroupId(),
LoanStatus.ACTIVE.getValue()); LoanStatus.ACTIVE.getValue());
} else { } else {
activeLoansLoanProductIds = this.loanRepository.findActiveLoansLoanProductIdsByClient(loan.getClientId(), activeLoansLoanProductIds = this.loanRepositoryWrapper.findActiveLoansLoanProductIdsByClient(loan.getClientId(),
LoanStatus.ACTIVE.getValue()); LoanStatus.ACTIVE.getValue());
} }
checkForProductMixRestrictions(activeLoansLoanProductIds, productId, loan.loanProduct().productName()); checkForProductMixRestrictions(activeLoansLoanProductIds, productId, loan.loanProduct().productName());
@@ -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.data.CommandProcessingResultBuilder;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityAccessType; 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.entityaccess.service.FineractEntityAccessUtil;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.portfolio.charge.domain.Charge; 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.Fund;
import org.apache.fineract.portfolio.fund.domain.FundRepository; import org.apache.fineract.portfolio.fund.domain.FundRepository;
import org.apache.fineract.portfolio.fund.exception.FundNotFoundException; 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.domain.LoanTransactionProcessingStrategyRepository;
import org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionProcessingStrategyNotFoundException; import org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionProcessingStrategyNotFoundException;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator;
@@ -75,7 +74,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
private final ProductToGLAccountMappingWritePlatformService accountMappingWritePlatformService; private final ProductToGLAccountMappingWritePlatformService accountMappingWritePlatformService;
private final FineractEntityAccessUtil fineractEntityAccessUtil; private final FineractEntityAccessUtil fineractEntityAccessUtil;
private final FloatingRateRepositoryWrapper floatingRateRepository; private final FloatingRateRepositoryWrapper floatingRateRepository;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
@Autowired @Autowired
public LoanProductWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, public LoanProductWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
@@ -86,7 +85,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
final ProductToGLAccountMappingWritePlatformService accountMappingWritePlatformService, final ProductToGLAccountMappingWritePlatformService accountMappingWritePlatformService,
final FineractEntityAccessUtil fineractEntityAccessUtil, final FineractEntityAccessUtil fineractEntityAccessUtil,
final FloatingRateRepositoryWrapper floatingRateRepository, final FloatingRateRepositoryWrapper floatingRateRepository,
final LoanRepository loanRepository) { final LoanRepositoryWrapper loanRepositoryWrapper) {
this.context = context; this.context = context;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.loanProductRepository = loanProductRepository; this.loanProductRepository = loanProductRepository;
@@ -97,7 +96,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
this.accountMappingWritePlatformService = accountMappingWritePlatformService; this.accountMappingWritePlatformService = accountMappingWritePlatformService;
this.fineractEntityAccessUtil = fineractEntityAccessUtil; this.fineractEntityAccessUtil = fineractEntityAccessUtil;
this.floatingRateRepository = floatingRateRepository; this.floatingRateRepository = floatingRateRepository;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
} }
@Transactional @Transactional
@@ -182,7 +181,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
validateInputDates(command); validateInputDates(command);
if(anyChangeInCriticalFloatingRateLinkedParams(command, product) if(anyChangeInCriticalFloatingRateLinkedParams(command, product)
&& this.loanRepository.doNonClosedLoanAccountsExistForProduct(product.getId())){ && this.loanRepositoryWrapper.doNonClosedLoanAccountsExistForProduct(product.getId())){
throw new LoanProductCannotBeModifiedDueToNonClosedLoansException(product.getId()); throw new LoanProductCannotBeModifiedDueToNonClosedLoansException(product.getId());
} }
@@ -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.data.CommandProcessingResultBuilder;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; 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.Calendar;
import org.apache.fineract.portfolio.calendar.domain.CalendarEntityType; import org.apache.fineract.portfolio.calendar.domain.CalendarEntityType;
import org.apache.fineract.portfolio.calendar.domain.CalendarInstance; 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.domain.CalendarRepository;
import org.apache.fineract.portfolio.calendar.exception.CalendarInstanceNotFoundException; import org.apache.fineract.portfolio.calendar.exception.CalendarInstanceNotFoundException;
import org.apache.fineract.portfolio.calendar.exception.CalendarNotFoundException; 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.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.Group;
import org.apache.fineract.portfolio.group.domain.GroupRepository; import org.apache.fineract.portfolio.group.domain.GroupRepository;
import org.apache.fineract.portfolio.group.exception.ClientNotInGroupException; import org.apache.fineract.portfolio.group.exception.ClientNotInGroupException;
@@ -73,28 +71,26 @@ public class MeetingWritePlatformServiceJpaRepositoryImpl implements MeetingWrit
private final MeetingDataValidator meetingDataValidator; private final MeetingDataValidator meetingDataValidator;
private final CalendarInstanceRepository calendarInstanceRepository; private final CalendarInstanceRepository calendarInstanceRepository;
private final CalendarRepository calendarRepository; private final CalendarRepository calendarRepository;
private final ClientRepository clientRepository; private final ClientRepositoryWrapper clientRepositoryWrapper;
private final GroupRepository groupRepository; private final GroupRepository groupRepository;
private final FromJsonHelper fromApiJsonHelper; private final FromJsonHelper fromApiJsonHelper;
private final ConfigurationDomainService configurationDomainService; private final ConfigurationDomainService configurationDomainService;
private final CalendarReadPlatformService calendarReadPlatformService;
@Autowired @Autowired
public MeetingWritePlatformServiceJpaRepositoryImpl(final MeetingRepositoryWrapper meetingRepositoryWrapper, public MeetingWritePlatformServiceJpaRepositoryImpl(final MeetingRepositoryWrapper meetingRepositoryWrapper,
final MeetingRepository meetingRepository, final MeetingDataValidator meetingDataValidator, final MeetingRepository meetingRepository, final MeetingDataValidator meetingDataValidator,
final CalendarInstanceRepository calendarInstanceRepository, final CalendarRepository calendarRepository, final CalendarInstanceRepository calendarInstanceRepository, final CalendarRepository calendarRepository,
final ClientRepository clientRepository, final GroupRepository groupRepository, final FromJsonHelper fromApiJsonHelper, final ClientRepositoryWrapper clientRepositoryWrapper, final GroupRepository groupRepository, final FromJsonHelper fromApiJsonHelper,
final ConfigurationDomainService configurationDomainService, final CalendarReadPlatformService calendarReadPlatformService) { final ConfigurationDomainService configurationDomainService) {
this.meetingRepositoryWrapper = meetingRepositoryWrapper; this.meetingRepositoryWrapper = meetingRepositoryWrapper;
this.meetingRepository = meetingRepository; this.meetingRepository = meetingRepository;
this.meetingDataValidator = meetingDataValidator; this.meetingDataValidator = meetingDataValidator;
this.calendarInstanceRepository = calendarInstanceRepository; this.calendarInstanceRepository = calendarInstanceRepository;
this.calendarRepository = calendarRepository; this.calendarRepository = calendarRepository;
this.clientRepository = clientRepository; this.clientRepositoryWrapper = clientRepositoryWrapper;
this.groupRepository = groupRepository; this.groupRepository = groupRepository;
this.fromApiJsonHelper = fromApiJsonHelper; this.fromApiJsonHelper = fromApiJsonHelper;
this.configurationDomainService = configurationDomainService; this.configurationDomainService = configurationDomainService;
this.calendarReadPlatformService = calendarReadPlatformService;
} }
@Override @Override
@@ -203,7 +199,7 @@ public class MeetingWritePlatformServiceJpaRepositoryImpl implements MeetingWrit
final Integer attendanceTypeId = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(attendanceTypeParamName, final Integer attendanceTypeId = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(attendanceTypeParamName,
attendanceElement); attendanceElement);
final Client client = this.clientRepository.findOne(clientId); final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId, true);
if (meeting.isGroupEntity() && !client.isChildOfGroup(meeting.entityId())) { if (meeting.isGroupEntity() && !client.isChildOfGroup(meeting.entityId())) {
throw new ClientNotInGroupException(clientId, meeting.entityId()); throw new ClientNotInGroupException(clientId, meeting.entityId());
@@ -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.domain.GroupRepository;
import org.apache.fineract.portfolio.group.exception.GroupNotFoundException; import org.apache.fineract.portfolio.group.exception.GroupNotFoundException;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; 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.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
@@ -51,14 +51,13 @@ public class NoteWritePlatformServiceJpaRepositoryImpl implements NoteWritePlatf
private final NoteRepository noteRepository; private final NoteRepository noteRepository;
private final ClientRepositoryWrapper clientRepository; private final ClientRepositoryWrapper clientRepository;
private final GroupRepository groupRepository; private final GroupRepository groupRepository;
// private final SavingAccountRepository savingAccountRepository; private final LoanRepositoryWrapper loanRepository;
private final LoanRepository loanRepository;
private final LoanTransactionRepository loanTransactionRepository; private final LoanTransactionRepository loanTransactionRepository;
private final NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer;
@Autowired @Autowired
public NoteWritePlatformServiceJpaRepositoryImpl(final NoteRepository noteRepository, final ClientRepositoryWrapper clientRepository, 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) { final LoanTransactionRepository loanTransactionRepository, final NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
this.noteRepository = noteRepository; this.noteRepository = noteRepository;
this.clientRepository = clientRepository; this.clientRepository = clientRepository;
@@ -118,9 +117,7 @@ public class NoteWritePlatformServiceJpaRepositoryImpl implements NoteWritePlatf
final Long resourceId = command.getLoanId(); final Long resourceId = command.getLoanId();
final Loan loan = this.loanRepository.findOne(resourceId); final Loan loan = this.loanRepository.findOneWithNotFoundDetection(resourceId);
if (loan == null) { throw new LoanNotFoundException(resourceId); }
final String note = command.stringValueOfParameterNamed("note"); final String note = command.stringValueOfParameterNamed("note");
final Note newNote = Note.loanNote(loan, note); final Note newNote = Note.loanNote(loan, note);
@@ -291,10 +288,8 @@ public class NoteWritePlatformServiceJpaRepositoryImpl implements NoteWritePlatf
final NoteType type = NoteType.LOAN; final NoteType type = NoteType.LOAN;
final Loan loan = this.loanRepository.findOne(resourceId); final Loan loan = this.loanRepository.findOneWithNotFoundDetection(resourceId);
if (loan == null) { throw new LoanNotFoundException(resourceId); }
final Note noteForUpdate = this.noteRepository.findByLoanIdAndId(resourceId, noteId); final Note noteForUpdate = this.noteRepository.findByLoanIdAndId(resourceId, noteId);
if (noteForUpdate == null) { throw new NoteNotFoundException(noteId, resourceId, type.name().toLowerCase()); } if (noteForUpdate == null) { throw new NoteNotFoundException(noteId, resourceId, type.name().toLowerCase()); }
final Map<String, Object> changes = noteForUpdate.update(command); final Map<String, Object> changes = noteForUpdate.update(command);
@@ -20,7 +20,6 @@ package org.apache.fineract.portfolio.savings.data;
import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.client.domain.Client;
import org.apache.fineract.portfolio.group.domain.Group; 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.apache.fineract.useradministration.domain.AppUser;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.DateTimeFormatter;
@@ -29,16 +28,16 @@ public class SavingsAccountDataDTO {
private final Client client; private final Client client;
private final Group group; private final Group group;
private final SavingsProduct savingsProduct; private final Long savingsProductId;
private final LocalDate applicationDate; private final LocalDate applicationDate;
private final AppUser appliedBy; private final AppUser appliedBy;
private final DateTimeFormatter fmt; 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) { final LocalDate applicationDate, final AppUser appliedBy, final DateTimeFormatter fmt) {
this.client = client; this.client = client;
this.group = group; this.group = group;
this.savingsProduct = savingsProduct; this.savingsProductId = savingsProductId;
this.applicationDate = applicationDate; this.applicationDate = applicationDate;
this.appliedBy = appliedBy; this.appliedBy = appliedBy;
this.fmt = fmt; this.fmt = fmt;
@@ -52,8 +51,8 @@ public class SavingsAccountDataDTO {
return this.group; return this.group;
} }
public SavingsProduct getSavingsProduct() { public Long getSavingsProduct() {
return this.savingsProduct; return this.savingsProductId;
} }
public LocalDate getApplicationDate() { public LocalDate getApplicationDate() {
@@ -177,7 +177,8 @@ public class DepositAccountAssembler {
AccountType accountType = AccountType.INVALID; AccountType accountType = AccountType.INVALID;
final Long clientId = this.fromApiJsonHelper.extractLongNamed(clientIdParamName, element); final Long clientId = this.fromApiJsonHelper.extractLongNamed(clientIdParamName, element);
if (clientId != null) { 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; accountType = AccountType.INDIVIDUAL;
if (client.isNotActive()) { throw new ClientNotActiveException(clientId); } if (client.isNotActive()) { throw new ClientNotActiveException(clientId); }
} }
@@ -30,7 +30,6 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@@ -89,12 +88,8 @@ public class RecurringDepositAccount extends SavingsAccount {
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "account") @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "account")
private DepositAccountInterestRateChart chart; private DepositAccountInterestRateChart chart;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "account", orphanRemoval = true, fetch=FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, mappedBy = "account", orphanRemoval = true, fetch=FetchType.LAZY)
private Set<RecurringDepositScheduleInstallment> depositScheduleInstallments = new HashSet<>(); private List<RecurringDepositScheduleInstallment> depositScheduleInstallments = new ArrayList<>();
private transient List<RecurringDepositScheduleInstallment> sortedDepositInstallments = null ;
private transient boolean isDepositScheduleInstallmentDirty = false ;
protected RecurringDepositAccount() { protected RecurringDepositAccount() {
// //
@@ -1127,7 +1122,6 @@ public class RecurringDepositAccount extends SavingsAccount {
public void generateSchedule(final PeriodFrequencyType frequency, final Integer recurringEvery, final Calendar calendar) { public void generateSchedule(final PeriodFrequencyType frequency, final Integer recurringEvery, final Calendar calendar) {
this.depositScheduleInstallments.clear(); this.depositScheduleInstallments.clear();
this.isDepositScheduleInstallmentDirty = true ;
LocalDate installmentDate = null; LocalDate installmentDate = null;
if (this.isCalendarInherited()) { if (this.isCalendarInherited()) {
installmentDate = CalendarUtils.getNextScheduleDate(calendar, accountSubmittedOrActivationDate()); installmentDate = CalendarUtils.getNextScheduleDate(calendar, accountSubmittedOrActivationDate());
@@ -1159,17 +1153,11 @@ public class RecurringDepositAccount extends SavingsAccount {
} }
private List<RecurringDepositScheduleInstallment> depositScheduleInstallments() { private List<RecurringDepositScheduleInstallment> depositScheduleInstallments() {
if(this.isDepositScheduleInstallmentDirty || this.sortedDepositInstallments == null) { return this.depositScheduleInstallments ;
this.sortedDepositInstallments = new ArrayList<>(this.depositScheduleInstallments) ;
this.sortedDepositInstallments.sort(new RecurringDepositScheduleInstallmentComparator());
this.isDepositScheduleInstallmentDirty = false ;
}
return this.sortedDepositInstallments ;
} }
private void addDepositScheduleInstallment(final RecurringDepositScheduleInstallment installment) { private void addDepositScheduleInstallment(final RecurringDepositScheduleInstallment installment) {
this.depositScheduleInstallments.add(installment) ; this.depositScheduleInstallments.add(installment) ;
isDepositScheduleInstallmentDirty = true ;
} }
public boolean isCalendarInherited() { public boolean isCalendarInherited() {
@@ -1220,4 +1208,10 @@ public class RecurringDepositAccount extends SavingsAccount {
return comparsion ; return comparsion ;
} }
} }
@Override
public void loadLazyCollections() {
this.depositScheduleInstallments.size() ;
super.loadLazyCollections();
}
} }
@@ -292,18 +292,14 @@ public class SavingsAccount extends AbstractPersistable<Long> {
protected SavingsAccountSummary summary; protected SavingsAccountSummary summary;
@OrderBy(value = "dateOf, createdDate, id") @OrderBy(value = "dateOf, createdDate, id")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.LAZY)
protected final Set<SavingsAccountTransaction> transactions = new HashSet<>(); protected final List<SavingsAccountTransaction> transactions = new ArrayList<>();
private transient List<SavingsAccountTransaction> orderedTransactions = null ; @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.LAZY)
private transient boolean isTransactionsDirty = false ;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.EAGER)
protected Set<SavingsAccountCharge> charges = new HashSet<>(); protected Set<SavingsAccountCharge> charges = new HashSet<>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.LAZY)
private Set<SavingsOfficerAssignmentHistory> savingsOfficerHistory; private Set<SavingsOfficerAssignmentHistory> savingsOfficerHistory = new HashSet<>();
@Transient @Transient
protected boolean accountNumberRequiresAutoGeneration = false; protected boolean accountNumberRequiresAutoGeneration = false;
@@ -419,7 +415,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
this.enforceMinRequiredBalance = enforceMinRequiredBalance; this.enforceMinRequiredBalance = enforceMinRequiredBalance;
this.minRequiredBalance = minRequiredBalance; this.minRequiredBalance = minRequiredBalance;
this.minBalanceForInterestCalculation = product.minBalanceForInterestCalculation(); this.minBalanceForInterestCalculation = product.minBalanceForInterestCalculation();
this.savingsOfficerHistory = null; //this.savingsOfficerHistory = null;
this.withHoldTax = withHoldTax; this.withHoldTax = withHoldTax;
this.taxGroup = product.getTaxGroup(); this.taxGroup = product.getTaxGroup();
} }
@@ -2266,17 +2262,11 @@ public class SavingsAccount extends AbstractPersistable<Long> {
} }
public List<SavingsAccountTransaction> getTransactions() { public List<SavingsAccountTransaction> getTransactions() {
if(this.orderedTransactions == null || isTransactionsDirty) { return this.transactions;
this.orderedTransactions = new ArrayList<>(this.transactions) ;
this.orderedTransactions.sort(new SavingsAccountTransactionComparator());
this.isTransactionsDirty = false ;
}
return orderedTransactions;
} }
public void addTransaction(final SavingsAccountTransaction transaction) { public void addTransaction(final SavingsAccountTransaction transaction) {
this.transactions.add(transaction); this.transactions.add(transaction);
this.isTransactionsDirty = true ;
} }
public void setStatus(final Integer status) { public void setStatus(final Integer status) {
@@ -2800,4 +2790,10 @@ public class SavingsAccount extends AbstractPersistable<Long> {
recalculateDailyBalances(Money.zero(this.currency), transactionDate); recalculateDailyBalances(Money.zero(this.currency), transactionDate);
this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, this.transactions); this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, this.transactions);
} }
public void loadLazyCollections() {
transactions.size();
charges.size();
savingsOfficerHistory.size();
}
} }
@@ -309,7 +309,7 @@ public class SavingsAccountAssembler {
* request inheriting details where relevant from chosen * request inheriting details where relevant from chosen
* {@link SavingsProduct}. * {@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) { final AppUser appliedBy) {
AccountType accountType = AccountType.INVALID; AccountType accountType = AccountType.INVALID;
@@ -330,7 +330,7 @@ public class SavingsAccountAssembler {
if (!group.hasClientAsMember(client)) { throw new ClientNotInGroupException(client.getId(), group.getId()); } if (!group.hasClientAsMember(client)) { throw new ClientNotInGroupException(client.getId(), group.getId()); }
accountType = AccountType.JLG; accountType = AccountType.JLG;
} }
final SavingsProduct product = this.savingProductRepository.findOne(productId) ;
final Set<SavingsAccountCharge> charges = this.savingsAccountChargeAssembler.fromSavingsProduct(product); final Set<SavingsAccountCharge> charges = this.savingsAccountChargeAssembler.fromSavingsProduct(product);
final SavingsAccount account = SavingsAccount.createNewApplicationForSubmittal(client, group, product, null, null, null, final SavingsAccount account = SavingsAccount.createNewApplicationForSubmittal(client, group, product, null, null, null,
accountType, appliedonDate, appliedBy, product.nominalAnnualInterestRate(), product.interestCompoundingPeriodType(), accountType, appliedonDate, appliedBy, product.nominalAnnualInterestRate(), product.interestCompoundingPeriodType(),
@@ -25,6 +25,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
//Use SavingsAccountRepositoryWrapper.
public interface SavingsAccountRepository extends JpaRepository<SavingsAccount, Long>, JpaSpecificationExecutor<SavingsAccount> { public interface SavingsAccountRepository extends JpaRepository<SavingsAccount, Long>, JpaSpecificationExecutor<SavingsAccount> {
@Query("from SavingsAccount s_acc where s_acc.client.id = :clientId") @Query("from SavingsAccount s_acc where s_acc.client.id = :clientId")
@@ -18,10 +18,14 @@
*/ */
package org.apache.fineract.portfolio.savings.domain; package org.apache.fineract.portfolio.savings.domain;
import java.util.List;
import org.apache.fineract.portfolio.savings.DepositAccountType; import org.apache.fineract.portfolio.savings.DepositAccountType;
import org.apache.fineract.portfolio.savings.exception.SavingsAccountNotFoundException; import org.apache.fineract.portfolio.savings.exception.SavingsAccountNotFoundException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* <p> * <p>
@@ -38,6 +42,7 @@ import org.springframework.stereotype.Service;
@Service @Service
public class SavingsAccountRepositoryWrapper { public class SavingsAccountRepositoryWrapper {
private final SavingsAccountRepository repository; private final SavingsAccountRepository repository;
@Autowired @Autowired
@@ -45,27 +50,72 @@ public class SavingsAccountRepositoryWrapper {
this.repository = repository; this.repository = repository;
} }
@Transactional(readOnly=true)
public SavingsAccount findOneWithNotFoundDetection(final Long savingsId) { public SavingsAccount findOneWithNotFoundDetection(final Long savingsId) {
final SavingsAccount account = this.repository.findOne(savingsId); final SavingsAccount account = this.repository.findOne(savingsId);
if (account == null) { throw new SavingsAccountNotFoundException(savingsId); } if (account == null) { throw new SavingsAccountNotFoundException(savingsId); }
account.loadLazyCollections();
return account; return account;
} }
@Transactional(readOnly=true)
public SavingsAccount findOneWithNotFoundDetection(final Long savingsId, final DepositAccountType depositAccountType) { public SavingsAccount findOneWithNotFoundDetection(final Long savingsId, final DepositAccountType depositAccountType) {
final SavingsAccount account = this.repository.findByIdAndDepositAccountType(savingsId, depositAccountType.getValue()); final SavingsAccount account = this.repository.findByIdAndDepositAccountType(savingsId, depositAccountType.getValue());
if (account == null) { throw new SavingsAccountNotFoundException(savingsId); } if (account == null) { throw new SavingsAccountNotFoundException(savingsId); }
account.loadLazyCollections();
return account; return account;
} }
public void save(final SavingsAccount account) { @Transactional(readOnly=true)
this.repository.save(account); public List<SavingsAccount> findSavingAccountByClientId(@Param("clientId") Long clientId) {
List<SavingsAccount> accounts = this.repository.findSavingAccountByClientId(clientId) ;
loadLazyCollections(accounts);
return accounts ;
}
@Transactional(readOnly=true)
public List<SavingsAccount> findSavingAccountByStatus(@Param("status") Integer status) {
List<SavingsAccount> accounts = this.repository.findSavingAccountByStatus(status) ;
loadLazyCollections(accounts);
return accounts ;
}
//Root Entities are enough
public List<SavingsAccount> 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<SavingsAccount> 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) { public void delete(final SavingsAccount account) {
this.repository.delete(account); this.repository.delete(account);
} }
public void saveAndFlush(final SavingsAccount account) { public SavingsAccount saveAndFlush(final SavingsAccount account) {
this.repository.saveAndFlush(account); return this.repository.saveAndFlush(account);
}
private void loadLazyCollections(final List<SavingsAccount> accounts) {
if(accounts != null && accounts.size() >0) {
for(SavingsAccount account: accounts) {
account.loadLazyCollections();
}
}
} }
} }
@@ -21,7 +21,6 @@ package org.apache.fineract.portfolio.savings.domain;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Set;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Embeddable; import javax.persistence.Embeddable;
@@ -91,7 +90,7 @@ public final class SavingsAccountSummary {
} }
public void updateSummary(final MonetaryCurrency currency, final SavingsAccountTransactionSummaryWrapper wrapper, public void updateSummary(final MonetaryCurrency currency, final SavingsAccountTransactionSummaryWrapper wrapper,
final Set<SavingsAccountTransaction> transactions) { final List<SavingsAccountTransaction> transactions) {
this.totalDeposits = wrapper.calculateTotalDeposits(currency, transactions); this.totalDeposits = wrapper.calculateTotalDeposits(currency, transactions);
this.totalWithdrawals = wrapper.calculateTotalWithdrawals(currency, transactions); this.totalWithdrawals = wrapper.calculateTotalWithdrawals(currency, transactions);
@@ -19,7 +19,7 @@
package org.apache.fineract.portfolio.savings.domain; package org.apache.fineract.portfolio.savings.domain;
import java.math.BigDecimal; 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.MonetaryCurrency;
import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.organisation.monetary.domain.Money;
@@ -32,7 +32,7 @@ import org.springframework.stereotype.Component;
@Component @Component
public final class SavingsAccountTransactionSummaryWrapper { public final class SavingsAccountTransactionSummaryWrapper {
public BigDecimal calculateTotalDeposits(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalDeposits(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isDepositAndNotReversed() || transaction.isDividendPayoutAndNotReversed()) { if (transaction.isDepositAndNotReversed() || transaction.isDividendPayoutAndNotReversed()) {
@@ -42,7 +42,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalWithdrawals(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalWithdrawals(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWithdrawal() && transaction.isNotReversed()) { if (transaction.isWithdrawal() && transaction.isNotReversed()) {
@@ -52,7 +52,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalInterestPosted(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalInterestPosted(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isInterestPostingAndNotReversed() && transaction.isNotReversed()) { if (transaction.isInterestPostingAndNotReversed() && transaction.isNotReversed()) {
@@ -62,7 +62,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalWithdrawalFees(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalWithdrawalFees(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWithdrawalFeeAndNotReversed() && transaction.isNotReversed()) { if (transaction.isWithdrawalFeeAndNotReversed() && transaction.isNotReversed()) {
@@ -72,7 +72,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalAnnualFees(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalAnnualFees(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isAnnualFeeAndNotReversed() && transaction.isNotReversed()) { if (transaction.isAnnualFeeAndNotReversed() && transaction.isNotReversed()) {
@@ -82,7 +82,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalFeesCharge(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalFeesCharge(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isFeeChargeAndNotReversed()) { if (transaction.isFeeChargeAndNotReversed()) {
@@ -92,7 +92,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalFeesChargeWaived(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalFeesChargeWaived(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWaiveFeeChargeAndNotReversed()) { if (transaction.isWaiveFeeChargeAndNotReversed()) {
@@ -102,7 +102,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalPenaltyCharge(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalPenaltyCharge(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isPenaltyChargeAndNotReversed()) { if (transaction.isPenaltyChargeAndNotReversed()) {
@@ -112,7 +112,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalPenaltyChargeWaived(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalPenaltyChargeWaived(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWaivePenaltyChargeAndNotReversed()) { if (transaction.isWaivePenaltyChargeAndNotReversed()) {
@@ -122,7 +122,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalOverdraftInterest(MonetaryCurrency currency, Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalOverdraftInterest(MonetaryCurrency currency, List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isOverdraftInterestAndNotReversed()) { if (transaction.isOverdraftInterestAndNotReversed()) {
@@ -131,7 +131,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
} }
return total.getAmountDefaultedToNullIfZero(); return total.getAmountDefaultedToNullIfZero();
} }
public BigDecimal calculateTotalWithholdTaxWithdrawal(MonetaryCurrency currency, Set<SavingsAccountTransaction> transactions) { public BigDecimal calculateTotalWithholdTaxWithdrawal(MonetaryCurrency currency, List<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency); Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) { for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWithHoldTaxAndNotReversed()) { if (transaction.isWithHoldTaxAndNotReversed()) {
@@ -18,6 +18,23 @@
*/ */
package org.apache.fineract.portfolio.savings.service; 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.commons.lang.StringUtils;
import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService; import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService;
import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; 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.SavingsAccount;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountCharge; import org.apache.fineract.portfolio.savings.domain.SavingsAccountCharge;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountChargeRepositoryWrapper; 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.SavingsAccountStatusType;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction; import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransactionRepository; 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; 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 @Service
public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements DepositAccountWritePlatformService { public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements DepositAccountWritePlatformService {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final SavingsAccountRepository savingAccountRepository; private final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper;
private final SavingsAccountTransactionRepository savingsAccountTransactionRepository; private final SavingsAccountTransactionRepository savingsAccountTransactionRepository;
private final DepositAccountAssembler depositAccountAssembler; private final DepositAccountAssembler depositAccountAssembler;
private final DepositAccountTransactionDataValidator depositAccountTransactionDataValidator; private final DepositAccountTransactionDataValidator depositAccountTransactionDataValidator;
@@ -146,7 +146,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
@Autowired @Autowired
public DepositAccountWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, public DepositAccountWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
final SavingsAccountRepository savingAccountRepository, final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper,
final SavingsAccountTransactionRepository savingsAccountTransactionRepository, final SavingsAccountTransactionRepository savingsAccountTransactionRepository,
final DepositAccountAssembler depositAccountAssembler, final DepositAccountAssembler depositAccountAssembler,
final DepositAccountTransactionDataValidator depositAccountTransactionDataValidator, final DepositAccountTransactionDataValidator depositAccountTransactionDataValidator,
@@ -165,7 +165,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
final DepositAccountOnHoldTransactionRepository depositAccountOnHoldTransactionRepository) { final DepositAccountOnHoldTransactionRepository depositAccountOnHoldTransactionRepository) {
this.context = context; this.context = context;
this.savingAccountRepository = savingAccountRepository; this.savingAccountRepositoryWrapper = savingAccountRepositoryWrapper;
this.savingsAccountTransactionRepository = savingsAccountTransactionRepository; this.savingsAccountTransactionRepository = savingsAccountTransactionRepository;
this.depositAccountAssembler = depositAccountAssembler; this.depositAccountAssembler = depositAccountAssembler;
this.depositAccountTransactionDataValidator = depositAccountTransactionDataValidator; this.depositAccountTransactionDataValidator = depositAccountTransactionDataValidator;
@@ -256,7 +256,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
depositAccountOnHoldTransactions = this.depositAccountOnHoldTransactionRepository.findBySavingsAccountAndReversedFalseOrderByCreatedDateAsc(account); depositAccountOnHoldTransactions = this.depositAccountOnHoldTransactionRepository.findBySavingsAccountAndReversedFalseOrderByCreatedDateAsc(account);
} }
account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions); account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions);
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
} }
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
@@ -354,7 +354,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions); account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions);
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
} }
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
@@ -497,7 +497,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd,
financialYearBeginningMonth); financialYearBeginningMonth);
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withEntityId(savingsId) // .withEntityId(savingsId) //
@@ -538,7 +538,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
final MathContext mc = new MathContext(10, MoneyHelper.getRoundingMode()); final MathContext mc = new MathContext(10, MoneyHelper.getRoundingMode());
boolean isInterestTransfer = false; boolean isInterestTransfer = false;
account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth);
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
} }
@@ -926,7 +926,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
financialYearBeginningMonth); financialYearBeginningMonth);
this.savingsAccountTransactionRepository.save(newTransferTransaction); this.savingsAccountTransactionRepository.save(newTransferTransaction);
this.savingAccountRepository.save(savingsAccount); this.savingAccountRepositoryWrapper.save(savingsAccount);
postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds);
@@ -959,7 +959,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
financialYearBeginningMonth); financialYearBeginningMonth);
this.savingsAccountTransactionRepository.save(withdrawtransferTransaction); this.savingsAccountTransactionRepository.save(withdrawtransferTransaction);
this.savingAccountRepository.save(savingsAccount); this.savingAccountRepositoryWrapper.save(savingsAccount);
postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds);
@@ -970,7 +970,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
public void rejectSavingsTransfer(final Long accountId, final DepositAccountType depositAccountType) { public void rejectSavingsTransfer(final Long accountId, final DepositAccountType depositAccountType) {
final SavingsAccount savingsAccount = this.depositAccountAssembler.assembleFrom(accountId, depositAccountType); final SavingsAccount savingsAccount = this.depositAccountAssembler.assembleFrom(accountId, depositAccountType);
savingsAccount.setStatus(SavingsAccountStatusType.TRANSFER_ON_HOLD.getValue()); savingsAccount.setStatus(SavingsAccountStatusType.TRANSFER_ON_HOLD.getValue());
this.savingAccountRepository.save(savingsAccount); this.savingAccountRepositoryWrapper.save(savingsAccount);
} }
@Override @Override
@@ -1002,7 +1002,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
financialYearBeginningMonth); financialYearBeginningMonth);
this.savingsAccountTransactionRepository.save(acceptTransferTransaction); this.savingsAccountTransactionRepository.save(acceptTransferTransaction);
this.savingAccountRepository.save(savingsAccount); this.savingAccountRepositoryWrapper.save(savingsAccount);
postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds);
@@ -1053,7 +1053,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
savingsAccount.addCharge(fmt, savingsAccountCharge, chargeDefinition); savingsAccount.addCharge(fmt, savingsAccountCharge, chargeDefinition);
this.savingAccountRepository.saveAndFlush(savingsAccount); this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withEntityId(savingsAccountCharge.getId()) // .withEntityId(savingsAccountCharge.getId()) //
@@ -1158,7 +1158,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.waiveChargeTransactionAction,depositAccountOnHoldTransactions); account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.waiveChargeTransactionAction,depositAccountOnHoldTransactions);
this.savingAccountRepository.saveAndFlush(account); this.savingAccountRepositoryWrapper.saveAndFlush(account);
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
@@ -1183,7 +1183,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
.findOneWithNotFoundDetection(savingsAccountChargeId, savingsAccountId); .findOneWithNotFoundDetection(savingsAccountChargeId, savingsAccountId);
savingsAccount.removeCharge(savingsAccountCharge); savingsAccount.removeCharge(savingsAccountCharge);
this.savingAccountRepository.saveAndFlush(savingsAccount); this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withEntityId(savingsAccountChargeId) // .withEntityId(savingsAccountChargeId) //
@@ -1289,7 +1289,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
account.validateAccountBalanceDoesNotBecomeNegative("." + SavingsAccountTransactionType.PAY_CHARGE.getCode(),depositAccountOnHoldTransactions); account.validateAccountBalanceDoesNotBecomeNegative("." + SavingsAccountTransactionType.PAY_CHARGE.getCode(),depositAccountOnHoldTransactions);
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
} }
@@ -49,13 +49,13 @@ public interface SavingsAccountWritePlatformService {
CommandProcessingResult close(Long savingsId, JsonCommand command); 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); CommandProcessingResult addSavingsAccountCharge(JsonCommand command);
@@ -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.SavingsAccountCharge;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountChargeRepositoryWrapper; import org.apache.fineract.portfolio.savings.domain.SavingsAccountChargeRepositoryWrapper;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountDomainService; 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.SavingsAccountRepositoryWrapper;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountStatusType; import org.apache.fineract.portfolio.savings.domain.SavingsAccountStatusType;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction; import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction;
@@ -115,9 +114,8 @@ import org.springframework.util.CollectionUtils;
public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements SavingsAccountWritePlatformService { public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements SavingsAccountWritePlatformService {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final SavingsAccountRepository savingAccountRepository;
private final SavingsAccountDataValidator fromApiJsonDeserializer; private final SavingsAccountDataValidator fromApiJsonDeserializer;
private final SavingsAccountRepositoryWrapper savingsRepository; private final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper;
private final StaffRepositoryWrapper staffRepository; private final StaffRepositoryWrapper staffRepository;
private final SavingsAccountTransactionRepository savingsAccountTransactionRepository; private final SavingsAccountTransactionRepository savingsAccountTransactionRepository;
private final SavingsAccountAssembler savingAccountAssembler; private final SavingsAccountAssembler savingAccountAssembler;
@@ -141,7 +139,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
@Autowired @Autowired
public SavingsAccountWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, public SavingsAccountWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
final SavingsAccountRepository savingAccountRepository, final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper,
final SavingsAccountTransactionRepository savingsAccountTransactionRepository, final SavingsAccountTransactionRepository savingsAccountTransactionRepository,
final SavingsAccountAssembler savingAccountAssembler, final SavingsAccountAssembler savingAccountAssembler,
final SavingsAccountTransactionDataValidator savingsAccountTransactionDataValidator, final SavingsAccountTransactionDataValidator savingsAccountTransactionDataValidator,
@@ -154,13 +152,13 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final HolidayRepositoryWrapper holidayRepository, final WorkingDaysRepositoryWrapper workingDaysRepository, final HolidayRepositoryWrapper holidayRepository, final WorkingDaysRepositoryWrapper workingDaysRepository,
final AccountAssociationsReadPlatformService accountAssociationsReadPlatformService, final AccountAssociationsReadPlatformService accountAssociationsReadPlatformService,
final ChargeRepositoryWrapper chargeRepository, final SavingsAccountChargeRepositoryWrapper savingsAccountChargeRepository, final ChargeRepositoryWrapper chargeRepository, final SavingsAccountChargeRepositoryWrapper savingsAccountChargeRepository,
final SavingsAccountDataValidator fromApiJsonDeserializer, final SavingsAccountRepositoryWrapper savingsRepository, final SavingsAccountDataValidator fromApiJsonDeserializer,
final StaffRepositoryWrapper staffRepository, final ConfigurationDomainService configurationDomainService, final StaffRepositoryWrapper staffRepository, final ConfigurationDomainService configurationDomainService,
final DepositAccountOnHoldTransactionRepository depositAccountOnHoldTransactionRepository, final DepositAccountOnHoldTransactionRepository depositAccountOnHoldTransactionRepository,
final AppUserRepositoryWrapper appuserRepository, final AppUserRepositoryWrapper appuserRepository,
final StandingInstructionRepository standingInstructionRepository) { final StandingInstructionRepository standingInstructionRepository) {
this.context = context; this.context = context;
this.savingAccountRepository = savingAccountRepository; this.savingAccountRepositoryWrapper = savingAccountRepositoryWrapper;
this.savingsAccountTransactionRepository = savingsAccountTransactionRepository; this.savingsAccountTransactionRepository = savingsAccountTransactionRepository;
this.savingAccountAssembler = savingAccountAssembler; this.savingAccountAssembler = savingAccountAssembler;
this.savingsAccountTransactionDataValidator = savingsAccountTransactionDataValidator; this.savingsAccountTransactionDataValidator = savingsAccountTransactionDataValidator;
@@ -177,7 +175,6 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
this.holidayRepository = holidayRepository; this.holidayRepository = holidayRepository;
this.workingDaysRepository = workingDaysRepository; this.workingDaysRepository = workingDaysRepository;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.savingsRepository = savingsRepository;
this.staffRepository = staffRepository; this.staffRepository = staffRepository;
this.configurationDomainService = configurationDomainService; this.configurationDomainService = configurationDomainService;
this.depositAccountOnHoldTransactionRepository = depositAccountOnHoldTransactionRepository; this.depositAccountOnHoldTransactionRepository = depositAccountOnHoldTransactionRepository;
@@ -205,7 +202,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale);
processPostActiveActions(account, fmt, existingTransactionIds, existingReversedTransactionIds); processPostActiveActions(account, fmt, existingTransactionIds, existingReversedTransactionIds);
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
} }
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
@@ -364,7 +361,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd,
financialYearBeginningMonth); financialYearBeginningMonth);
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withEntityId(savingsId) // .withEntityId(savingsId) //
@@ -416,7 +413,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
} }
} }
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
} }
@@ -644,7 +641,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final Map<String, Object> accountChanges = account.close(user, command, DateUtils.getLocalDateOfTenant()); final Map<String, Object> accountChanges = account.close(user, command, DateUtils.getLocalDateOfTenant());
changes.putAll(accountChanges); changes.putAll(accountChanges);
if (!changes.isEmpty()) { if (!changes.isEmpty()) {
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
final String noteText = command.stringValueOfParameterNamed("note"); final String noteText = command.stringValueOfParameterNamed("note");
if (StringUtils.isNotBlank(noteText)) { if (StringUtils.isNotBlank(noteText)) {
final Note note = Note.savingNote(account, noteText); final Note note = Note.savingNote(account, noteText);
@@ -668,16 +665,14 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
} }
@Override @Override
public SavingsAccountTransaction initiateSavingsTransfer(final Long accountId, final LocalDate transferDate) { public SavingsAccountTransaction initiateSavingsTransfer(final SavingsAccount savingsAccount, final LocalDate transferDate) {
AppUser user = getAppUserIfPresent(); AppUser user = getAppUserIfPresent();
final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService
.isSavingsInterestPostingAtCurrentPeriodEnd(); .isSavingsInterestPostingAtCurrentPeriodEnd();
final Integer financialYearBeginningMonth = this.configurationDomainService.retrieveFinancialYearBeginningMonth(); final Integer financialYearBeginningMonth = this.configurationDomainService.retrieveFinancialYearBeginningMonth();
this.savingAccountAssembler.setHelpers(savingsAccount);
final SavingsAccount savingsAccount = this.savingAccountAssembler.assembleFrom(accountId);
final Set<Long> existingTransactionIds = new HashSet<>(); final Set<Long> existingTransactionIds = new HashSet<>();
final Set<Long> existingReversedTransactionIds = new HashSet<>(); final Set<Long> existingReversedTransactionIds = new HashSet<>();
updateExistingTransactionsDetails(savingsAccount, existingTransactionIds, existingReversedTransactionIds); updateExistingTransactionsDetails(savingsAccount, existingTransactionIds, existingReversedTransactionIds);
@@ -692,7 +687,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
financialYearBeginningMonth); financialYearBeginningMonth);
this.savingsAccountTransactionRepository.save(newTransferTransaction); this.savingsAccountTransactionRepository.save(newTransferTransaction);
this.savingAccountRepository.save(savingsAccount); this.savingAccountRepositoryWrapper.save(savingsAccount);
postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds);
@@ -700,16 +695,14 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
} }
@Override @Override
public SavingsAccountTransaction withdrawSavingsTransfer(final Long accountId, final LocalDate transferDate) { public SavingsAccountTransaction withdrawSavingsTransfer(final SavingsAccount savingsAccount, final LocalDate transferDate) {
AppUser user = getAppUserIfPresent(); AppUser user = getAppUserIfPresent();
final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService
.isSavingsInterestPostingAtCurrentPeriodEnd(); .isSavingsInterestPostingAtCurrentPeriodEnd();
final Integer financialYearBeginningMonth = this.configurationDomainService.retrieveFinancialYearBeginningMonth(); final Integer financialYearBeginningMonth = this.configurationDomainService.retrieveFinancialYearBeginningMonth();
this.savingAccountAssembler.setHelpers(savingsAccount);
final SavingsAccount savingsAccount = this.savingAccountAssembler.assembleFrom(accountId);
final Set<Long> existingTransactionIds = new HashSet<>(); final Set<Long> existingTransactionIds = new HashSet<>();
final Set<Long> existingReversedTransactionIds = new HashSet<>(); final Set<Long> existingReversedTransactionIds = new HashSet<>();
updateExistingTransactionsDetails(savingsAccount, existingTransactionIds, existingReversedTransactionIds); updateExistingTransactionsDetails(savingsAccount, existingTransactionIds, existingReversedTransactionIds);
@@ -724,7 +717,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
financialYearBeginningMonth); financialYearBeginningMonth);
this.savingsAccountTransactionRepository.save(withdrawtransferTransaction); this.savingsAccountTransactionRepository.save(withdrawtransferTransaction);
this.savingAccountRepository.save(savingsAccount); this.savingAccountRepositoryWrapper.save(savingsAccount);
postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds);
@@ -732,14 +725,14 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
} }
@Override @Override
public void rejectSavingsTransfer(final Long accountId) { public void rejectSavingsTransfer(final SavingsAccount savingsAccount) {
final SavingsAccount savingsAccount = this.savingAccountAssembler.assembleFrom(accountId); this.savingAccountAssembler.setHelpers(savingsAccount);
savingsAccount.setStatus(SavingsAccountStatusType.TRANSFER_ON_HOLD.getValue()); savingsAccount.setStatus(SavingsAccountStatusType.TRANSFER_ON_HOLD.getValue());
this.savingAccountRepository.save(savingsAccount); this.savingAccountRepositoryWrapper.save(savingsAccount);
} }
@Override @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) { final Office acceptedInOffice, final Staff fieldOfficer) {
AppUser user = getAppUserIfPresent(); AppUser user = getAppUserIfPresent();
@@ -747,9 +740,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService
.isSavingsInterestPostingAtCurrentPeriodEnd(); .isSavingsInterestPostingAtCurrentPeriodEnd();
final Integer financialYearBeginningMonth = this.configurationDomainService.retrieveFinancialYearBeginningMonth(); final Integer financialYearBeginningMonth = this.configurationDomainService.retrieveFinancialYearBeginningMonth();
this.savingAccountAssembler.setHelpers(savingsAccount);
final SavingsAccount savingsAccount = this.savingAccountAssembler.assembleFrom(accountId);
final Set<Long> existingTransactionIds = new HashSet<>(); final Set<Long> existingTransactionIds = new HashSet<>();
final Set<Long> existingReversedTransactionIds = new HashSet<>(); final Set<Long> existingReversedTransactionIds = new HashSet<>();
updateExistingTransactionsDetails(savingsAccount, existingTransactionIds, existingReversedTransactionIds); updateExistingTransactionsDetails(savingsAccount, existingTransactionIds, existingReversedTransactionIds);
@@ -767,7 +758,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
financialYearBeginningMonth); financialYearBeginningMonth);
this.savingsAccountTransactionRepository.save(acceptTransferTransaction); this.savingsAccountTransactionRepository.save(acceptTransferTransaction);
this.savingAccountRepository.save(savingsAccount); this.savingAccountRepositoryWrapper.save(savingsAccount);
postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds);
@@ -825,7 +816,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
savingsAccount.addCharge(fmt, savingsAccountCharge, chargeDefinition); savingsAccount.addCharge(fmt, savingsAccountCharge, chargeDefinition);
this.savingAccountRepository.saveAndFlush(savingsAccount); this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withEntityId(savingsAccountCharge.getId()) // .withEntityId(savingsAccountCharge.getId()) //
@@ -931,7 +922,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.waiveChargeTransactionAction, account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.waiveChargeTransactionAction,
depositAccountOnHoldTransactions); depositAccountOnHoldTransactions);
this.savingAccountRepository.saveAndFlush(account); this.savingAccountRepositoryWrapper.saveAndFlush(account);
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
@@ -956,7 +947,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
savingsAccountChargeId, savingsAccountId); savingsAccountChargeId, savingsAccountId);
savingsAccount.removeCharge(savingsAccountCharge); savingsAccount.removeCharge(savingsAccountCharge);
this.savingAccountRepository.saveAndFlush(savingsAccount); this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withEntityId(savingsAccountChargeId) // .withEntityId(savingsAccountChargeId) //
@@ -1063,7 +1054,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
account.validateAccountBalanceDoesNotBecomeNegative("." + SavingsAccountTransactionType.PAY_CHARGE.getCode(), account.validateAccountBalanceDoesNotBecomeNegative("." + SavingsAccountTransactionType.PAY_CHARGE.getCode(),
depositAccountOnHoldTransactions); depositAccountOnHoldTransactions);
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
} }
@@ -1163,7 +1154,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
Staff toSavingsOfficer = null; Staff toSavingsOfficer = null;
this.fromApiJsonDeserializer.validateForAssignSavingsOfficer(command.json()); 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 fromSavingsOfficerId = command.longValueOfParameterNamed("fromSavingsOfficerId");
final Long toSavingsOfficerId = command.longValueOfParameterNamed("toSavingsOfficerId"); final Long toSavingsOfficerId = command.longValueOfParameterNamed("toSavingsOfficerId");
final LocalDate dateOfSavingsOfficerAssignment = command.localDateValueOfParameterNamed("assignmentDate"); final LocalDate dateOfSavingsOfficerAssignment = command.localDateValueOfParameterNamed("assignmentDate");
@@ -1182,7 +1173,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
savingsForUpdate.reassignSavingsOfficer(toSavingsOfficer, dateOfSavingsOfficerAssignment); savingsForUpdate.reassignSavingsOfficer(toSavingsOfficer, dateOfSavingsOfficerAssignment);
this.savingsRepository.saveAndFlush(savingsForUpdate); this.savingAccountRepositoryWrapper.saveAndFlush(savingsForUpdate);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withCommandId(command.commandId()) // .withCommandId(command.commandId()) //
@@ -1202,14 +1193,14 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final Map<String, Object> actualChanges = new LinkedHashMap<>(5); final Map<String, Object> actualChanges = new LinkedHashMap<>(5);
this.fromApiJsonDeserializer.validateForUnAssignSavingsOfficer(command.json()); 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); } if (savingsForUpdate.getSavingsOfficer() == null) { throw new SavingsOfficerUnassignmentException(savingsAccountId); }
final LocalDate dateOfSavingsOfficerUnassigned = command.localDateValueOfParameterNamed("unassignedDate"); final LocalDate dateOfSavingsOfficerUnassigned = command.localDateValueOfParameterNamed("unassignedDate");
savingsForUpdate.removeSavingsOfficer(dateOfSavingsOfficerUnassigned); savingsForUpdate.removeSavingsOfficer(dateOfSavingsOfficerUnassigned);
this.savingsRepository.saveAndFlush(savingsForUpdate); this.savingAccountRepositoryWrapper.saveAndFlush(savingsForUpdate);
actualChanges.put("toSavingsOfficerId", null); actualChanges.put("toSavingsOfficerId", null);
@@ -1225,7 +1216,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
@Override @Override
public CommandProcessingResult modifyWithHoldTax(Long savingsAccountId, JsonCommand command) { public CommandProcessingResult modifyWithHoldTax(Long savingsAccountId, JsonCommand command) {
final Map<String, Object> actualChanges = new HashMap<>(1); final Map<String, Object> actualChanges = new HashMap<>(1);
final SavingsAccount savingsForUpdate = this.savingsRepository.findOneWithNotFoundDetection(savingsAccountId); final SavingsAccount savingsForUpdate = this.savingAccountRepositoryWrapper.findOneWithNotFoundDetection(savingsAccountId);
if (command.isChangeInBooleanParameterNamed(withHoldTaxParamName, savingsForUpdate.withHoldTax())) { if (command.isChangeInBooleanParameterNamed(withHoldTaxParamName, savingsForUpdate.withHoldTax())) {
final boolean newValue = command.booleanPrimitiveValueOfParameterNamed(withHoldTaxParamName); final boolean newValue = command.booleanPrimitiveValueOfParameterNamed(withHoldTaxParamName);
actualChanges.put(withHoldTaxParamName, newValue); actualChanges.put(withHoldTaxParamName, newValue);
@@ -1254,7 +1245,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final Set<Long> existingReversedTransactionIds = new HashSet<>(); final Set<Long> existingReversedTransactionIds = new HashSet<>();
updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds);
account.setSubStatusInactive(appuserRepository.fetchSystemUser()); account.setSubStatusInactive(appuserRepository.fetchSystemUser());
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
} }
@@ -1263,7 +1254,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
public void setSubStatusDormant(Long savingsId){ public void setSubStatusDormant(Long savingsId){
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId); final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId);
account.setSubStatusDormant(); account.setSubStatusDormant();
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
} }
@Override @Override
@@ -1274,7 +1265,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final Set<Long> existingReversedTransactionIds = new HashSet<>(); final Set<Long> existingReversedTransactionIds = new HashSet<>();
updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds);
account.escheat(appuserRepository.fetchSystemUser()); account.escheat(appuserRepository.fetchSystemUser());
this.savingAccountRepository.save(account); this.savingAccountRepositoryWrapper.save(account);
postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds);
} }
@@ -26,7 +26,7 @@ import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException;
import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.jobs.service.JobName;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount; import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountAssembler; 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.apache.fineract.portfolio.savings.domain.SavingsAccountStatusType;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -37,24 +37,24 @@ public class SavingsSchedularServiceImpl implements SavingsSchedularService {
private final SavingsAccountAssembler savingAccountAssembler; private final SavingsAccountAssembler savingAccountAssembler;
private final SavingsAccountWritePlatformService savingsAccountWritePlatformService; private final SavingsAccountWritePlatformService savingsAccountWritePlatformService;
private final SavingsAccountRepository savingAccountRepository; private final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper;
private final SavingsAccountReadPlatformService savingAccountReadPlatformService; private final SavingsAccountReadPlatformService savingAccountReadPlatformService;
@Autowired @Autowired
public SavingsSchedularServiceImpl(final SavingsAccountAssembler savingAccountAssembler, public SavingsSchedularServiceImpl(final SavingsAccountAssembler savingAccountAssembler,
final SavingsAccountWritePlatformService savingsAccountWritePlatformService, final SavingsAccountWritePlatformService savingsAccountWritePlatformService,
final SavingsAccountRepository savingAccountRepository, final SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper,
final SavingsAccountReadPlatformService savingAccountReadPlatformService) { final SavingsAccountReadPlatformService savingAccountReadPlatformService) {
this.savingAccountAssembler = savingAccountAssembler; this.savingAccountAssembler = savingAccountAssembler;
this.savingsAccountWritePlatformService = savingsAccountWritePlatformService; this.savingsAccountWritePlatformService = savingsAccountWritePlatformService;
this.savingAccountRepository = savingAccountRepository; this.savingAccountRepositoryWrapper = savingAccountRepositoryWrapper;
this.savingAccountReadPlatformService = savingAccountReadPlatformService; this.savingAccountReadPlatformService = savingAccountReadPlatformService;
} }
@CronTarget(jobName = JobName.POST_INTEREST_FOR_SAVINGS) @CronTarget(jobName = JobName.POST_INTEREST_FOR_SAVINGS)
@Override @Override
public void postInterestForAccounts() throws JobExecutionException { public void postInterestForAccounts() throws JobExecutionException {
final List<SavingsAccount> savingsAccounts = this.savingAccountRepository.findSavingAccountByStatus(SavingsAccountStatusType.ACTIVE final List<SavingsAccount> savingsAccounts = this.savingAccountRepositoryWrapper.findSavingAccountByStatus(SavingsAccountStatusType.ACTIVE
.getValue()); .getValue());
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
for (final SavingsAccount savingsAccount : savingsAccounts) { for (final SavingsAccount savingsAccount : savingsAccounts) {
@@ -34,9 +34,9 @@ import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityEx
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.portfolio.account.PortfolioAccountType; import org.apache.fineract.portfolio.account.PortfolioAccountType;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; 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.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.data.SelfBeneficiariesTPTDataValidator;
import org.apache.fineract.portfolio.self.account.domain.SelfBeneficiariesTPT; import org.apache.fineract.portfolio.self.account.domain.SelfBeneficiariesTPT;
import org.apache.fineract.portfolio.self.account.domain.SelfBeneficiariesTPTRepository; import org.apache.fineract.portfolio.self.account.domain.SelfBeneficiariesTPTRepository;
@@ -58,21 +58,21 @@ public class SelfBeneficiariesTPTWritePlatformServiceImpl implements
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final SelfBeneficiariesTPTRepository repository; private final SelfBeneficiariesTPTRepository repository;
private final SelfBeneficiariesTPTDataValidator validator; private final SelfBeneficiariesTPTDataValidator validator;
private final LoanRepository loanRepo; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final SavingsAccountRepository savingRepo; private final SavingsAccountRepositoryWrapper savingRepositoryWrapper;
@Autowired @Autowired
public SelfBeneficiariesTPTWritePlatformServiceImpl( public SelfBeneficiariesTPTWritePlatformServiceImpl(
final PlatformSecurityContext context, final PlatformSecurityContext context,
final SelfBeneficiariesTPTRepository repository, final SelfBeneficiariesTPTRepository repository,
final SelfBeneficiariesTPTDataValidator validator, final SelfBeneficiariesTPTDataValidator validator,
final LoanRepository loanRepo, final LoanRepositoryWrapper loanRepositoryWrapper,
final SavingsAccountRepository savingRepo) { final SavingsAccountRepositoryWrapper savingRepositoryWrapper) {
this.context = context; this.context = context;
this.repository = repository; this.repository = repository;
this.validator = validator; this.validator = validator;
this.loanRepo = loanRepo; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.savingRepo = savingRepo; this.savingRepositoryWrapper = savingRepositoryWrapper;
this.logger = LoggerFactory this.logger = LoggerFactory
.getLogger(SelfBeneficiariesTPTWritePlatformServiceImpl.class); .getLogger(SelfBeneficiariesTPTWritePlatformServiceImpl.class);
} }
@@ -95,8 +95,7 @@ public class SelfBeneficiariesTPTWritePlatformServiceImpl implements
boolean validAccountDetails = true; boolean validAccountDetails = true;
if (accountType.equals(PortfolioAccountType.LOAN)) { if (accountType.equals(PortfolioAccountType.LOAN)) {
Loan loan = this.loanRepo Loan loan = this.loanRepositoryWrapper.findNonClosedLoanByAccountNumber(accountNumber);
.findNonClosedLoanByAccountNumber(accountNumber);
if (loan != null && loan.getClientId() != null if (loan != null && loan.getClientId() != null
&& loan.getOffice().getName().equals(officeName)) { && loan.getOffice().getName().equals(officeName)) {
accountId = loan.getId(); accountId = loan.getId();
@@ -106,7 +105,7 @@ public class SelfBeneficiariesTPTWritePlatformServiceImpl implements
validAccountDetails = false; validAccountDetails = false;
} }
} else { } else {
SavingsAccount savings = this.savingRepo SavingsAccount savings = this.savingRepositoryWrapper
.findNonClosedAccountByAccountNumber(accountNumber); .findNonClosedAccountByAccountNumber(accountNumber);
if (savings != null if (savings != null
&& savings.getClient() != null && savings.getClient() != null
@@ -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.ClientNotInGroupException;
import org.apache.fineract.portfolio.group.exception.GroupNotActiveException; import org.apache.fineract.portfolio.group.exception.GroupNotActiveException;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; 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.loanaccount.service.LoanWritePlatformService;
import org.apache.fineract.portfolio.note.service.NoteWritePlatformService; import org.apache.fineract.portfolio.note.service.NoteWritePlatformService;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount; 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.savings.service.SavingsAccountWritePlatformService;
import org.apache.fineract.portfolio.transfer.api.TransferApiConstants; import org.apache.fineract.portfolio.transfer.api.TransferApiConstants;
import org.apache.fineract.portfolio.transfer.data.TransfersDataValidator; import org.apache.fineract.portfolio.transfer.data.TransfersDataValidator;
@@ -68,36 +68,36 @@ import com.google.gson.JsonObject;
@Service @Service
public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWritePlatformService { public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWritePlatformService {
private final ClientRepositoryWrapper clientRepository; private final ClientRepositoryWrapper clientRepositoryWrapper;
private final OfficeRepositoryWrapper officeRepository; private final OfficeRepositoryWrapper officeRepository;
private final CalendarInstanceRepository calendarInstanceRepository; private final CalendarInstanceRepository calendarInstanceRepository;
private final GroupRepositoryWrapper groupRepository; private final GroupRepositoryWrapper groupRepository;
private final LoanWritePlatformService loanWritePlatformService; private final LoanWritePlatformService loanWritePlatformService;
private final SavingsAccountWritePlatformService savingsAccountWritePlatformService; private final SavingsAccountWritePlatformService savingsAccountWritePlatformService;
private final LoanRepository loanRepository; private final LoanRepositoryWrapper loanRepositoryWrapper;
private final SavingsAccountRepository savingsAccountRepository; private final SavingsAccountRepositoryWrapper savingsAccountRepositoryWrapper;
private final TransfersDataValidator transfersDataValidator; private final TransfersDataValidator transfersDataValidator;
private final NoteWritePlatformService noteWritePlatformService; private final NoteWritePlatformService noteWritePlatformService;
private final StaffRepositoryWrapper staffRepositoryWrapper; private final StaffRepositoryWrapper staffRepositoryWrapper;
@Autowired @Autowired
public TransferWritePlatformServiceJpaRepositoryImpl(final ClientRepositoryWrapper clientRepository, public TransferWritePlatformServiceJpaRepositoryImpl(final ClientRepositoryWrapper clientRepositoryWrapper,
final OfficeRepositoryWrapper officeRepository, final CalendarInstanceRepository calendarInstanceRepository, final OfficeRepositoryWrapper officeRepository, final CalendarInstanceRepository calendarInstanceRepository,
final LoanWritePlatformService loanWritePlatformService, final GroupRepositoryWrapper groupRepository, 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 NoteWritePlatformService noteWritePlatformService, final StaffRepositoryWrapper staffRepositoryWrapper,
final SavingsAccountRepository savingsAccountRepository, final SavingsAccountRepositoryWrapper savingsAccountRepositoryWrapper,
final SavingsAccountWritePlatformService savingsAccountWritePlatformService) { final SavingsAccountWritePlatformService savingsAccountWritePlatformService) {
this.clientRepository = clientRepository; this.clientRepositoryWrapper = clientRepositoryWrapper;
this.officeRepository = officeRepository; this.officeRepository = officeRepository;
this.calendarInstanceRepository = calendarInstanceRepository; this.calendarInstanceRepository = calendarInstanceRepository;
this.loanWritePlatformService = loanWritePlatformService; this.loanWritePlatformService = loanWritePlatformService;
this.groupRepository = groupRepository; this.groupRepository = groupRepository;
this.loanRepository = loanRepository; this.loanRepositoryWrapper = loanRepositoryWrapper;
this.transfersDataValidator = transfersDataValidator; this.transfersDataValidator = transfersDataValidator;
this.noteWritePlatformService = noteWritePlatformService; this.noteWritePlatformService = noteWritePlatformService;
this.staffRepositoryWrapper = staffRepositoryWrapper; this.staffRepositoryWrapper = staffRepositoryWrapper;
this.savingsAccountRepository = savingsAccountRepository; this.savingsAccountRepositoryWrapper = savingsAccountRepositoryWrapper;
this.savingsAccountWritePlatformService = savingsAccountWritePlatformService; this.savingsAccountWritePlatformService = savingsAccountWritePlatformService;
} }
@@ -214,12 +214,12 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr
} }
client.getGroups().add(destinationGroup); 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 * Active JLG loans are now linked to the new Group and Loan officer
**/ **/
final List<Loan> allClientJLGLoans = this.loanRepository.findByClientIdAndGroupId(client.getId(), sourceGroup.getId()); final List<Loan> allClientJLGLoans = this.loanRepositoryWrapper.findByClientIdAndGroupId(client.getId(), sourceGroup.getId());
for (final Loan loan : allClientJLGLoans) { for (final Loan loan : allClientJLGLoans) {
if (loan.status().isActiveOrAwaitingApprovalOrDisbursal()) { if (loan.status().isActiveOrAwaitingApprovalOrDisbursal()) {
loan.updateGroup(destinationGroup); loan.updateGroup(destinationGroup);
@@ -229,7 +229,7 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr
} else if (newLoanOfficer != null) { } else if (newLoanOfficer != null) {
loan.reassignLoanOfficer(newLoanOfficer, DateUtils.getLocalDateOfTenant()); 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 Long destinationOfficeId = jsonCommand.longValueOfParameterNamed(TransferApiConstants.destinationOfficeIdParamName);
final Office office = this.officeRepository.findOneWithNotFoundDetection(destinationOfficeId); 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); handleClientTransferLifecycleEvent(client, office, TransferEventType.PROPOSAL, jsonCommand);
this.clientRepository.saveAndFlush(client); this.clientRepositoryWrapper.saveAndFlush(client);
handleClientTransferLifecycleEvent(client, client.getTransferToOffice(), TransferEventType.ACCEPTANCE, jsonCommand); handleClientTransferLifecycleEvent(client, client.getTransferToOffice(), TransferEventType.ACCEPTANCE, jsonCommand);
this.clientRepository.save(client); this.clientRepositoryWrapper.save(client);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withClientId(clientId) // .withClientId(clientId) //
@@ -292,9 +292,9 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr
final Long destinationOfficeId = jsonCommand.longValueOfParameterNamed(TransferApiConstants.destinationOfficeIdParamName); final Long destinationOfficeId = jsonCommand.longValueOfParameterNamed(TransferApiConstants.destinationOfficeIdParamName);
final Office office = this.officeRepository.findOneWithNotFoundDetection(destinationOfficeId); 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); handleClientTransferLifecycleEvent(client, office, TransferEventType.PROPOSAL, jsonCommand);
this.clientRepository.save(client); this.clientRepositoryWrapper.save(client);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withClientId(clientId) // .withClientId(clientId) //
@@ -319,11 +319,11 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr
public CommandProcessingResult acceptClientTransfer(final Long clientId, final JsonCommand jsonCommand) { public CommandProcessingResult acceptClientTransfer(final Long clientId, final JsonCommand jsonCommand) {
// validation // validation
this.transfersDataValidator.validateForAcceptClientTransfer(jsonCommand.json()); this.transfersDataValidator.validateForAcceptClientTransfer(jsonCommand.json());
final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId); final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId, true);
validateClientAwaitingTransferAcceptance(client); validateClientAwaitingTransferAcceptance(client);
handleClientTransferLifecycleEvent(client, client.getTransferToOffice(), TransferEventType.ACCEPTANCE, jsonCommand); handleClientTransferLifecycleEvent(client, client.getTransferToOffice(), TransferEventType.ACCEPTANCE, jsonCommand);
this.clientRepository.save(client); this.clientRepositoryWrapper.save(client);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withClientId(clientId) // .withClientId(clientId) //
@@ -336,11 +336,11 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr
public CommandProcessingResult withdrawClientTransfer(final Long clientId, final JsonCommand jsonCommand) { public CommandProcessingResult withdrawClientTransfer(final Long clientId, final JsonCommand jsonCommand) {
// validation // validation
this.transfersDataValidator.validateForWithdrawClientTransfer(jsonCommand.json()); this.transfersDataValidator.validateForWithdrawClientTransfer(jsonCommand.json());
final Client client = this.clientRepository.findOneWithNotFoundDetection(clientId); final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId);
validateClientAwaitingTransferAcceptanceOnHold(client); validateClientAwaitingTransferAcceptanceOnHold(client);
handleClientTransferLifecycleEvent(client, client.getOffice(), TransferEventType.WITHDRAWAL, jsonCommand); handleClientTransferLifecycleEvent(client, client.getOffice(), TransferEventType.WITHDRAWAL, jsonCommand);
this.clientRepository.save(client); this.clientRepositoryWrapper.save(client);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withClientId(clientId) // .withClientId(clientId) //
@@ -353,9 +353,9 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr
public CommandProcessingResult rejectClientTransfer(final Long clientId, final JsonCommand jsonCommand) { public CommandProcessingResult rejectClientTransfer(final Long clientId, final JsonCommand jsonCommand) {
// validation // validation
this.transfersDataValidator.validateForRejectClientTransfer(jsonCommand.json()); 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); handleClientTransferLifecycleEvent(client, client.getOffice(), TransferEventType.REJECTION, jsonCommand);
this.clientRepository.save(client); this.clientRepositoryWrapper.save(client);
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withClientId(clientId) // .withClientId(clientId) //
@@ -379,9 +379,9 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr
} }
/*** Handle Active Loans ***/ /*** Handle Active Loans ***/
if (this.loanRepository.doNonClosedLoanAccountsExistForClient(client.getId())) { if (this.loanRepositoryWrapper.doNonClosedLoanAccountsExistForClient(client.getId())) {
// get each individual loan for the client // 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 * We need to create transactions etc only for loans which are
* disbursed and not yet closed * disbursed and not yet closed
@@ -389,41 +389,41 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr
if (loan.isDisbursed() && !loan.isClosed()) { if (loan.isDisbursed() && !loan.isClosed()) {
switch (transferEventType) { switch (transferEventType) {
case ACCEPTANCE: case ACCEPTANCE:
this.loanWritePlatformService.acceptLoanTransfer(loan.getId(), DateUtils.getLocalDateOfTenant(), this.loanWritePlatformService.acceptLoanTransfer(loan, DateUtils.getLocalDateOfTenant(),
destinationOffice, staff); destinationOffice, staff);
break; break;
case PROPOSAL: case PROPOSAL:
this.loanWritePlatformService.initiateLoanTransfer(loan.getId(), DateUtils.getLocalDateOfTenant()); this.loanWritePlatformService.initiateLoanTransfer(loan, DateUtils.getLocalDateOfTenant());
break; break;
case REJECTION: case REJECTION:
this.loanWritePlatformService.rejectLoanTransfer(loan.getId()); this.loanWritePlatformService.rejectLoanTransfer(loan);
break; break;
case WITHDRAWAL: case WITHDRAWAL:
this.loanWritePlatformService.withdrawLoanTransfer(loan.getId(), DateUtils.getLocalDateOfTenant()); this.loanWritePlatformService.withdrawLoanTransfer(loan, DateUtils.getLocalDateOfTenant());
} }
} }
} }
} }
/*** Handle Active Savings (Currently throw and exception) ***/ /*** 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 // 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()) { if (savingsAccount.isActivated() && !savingsAccount.isClosed()) {
switch (transferEventType) { switch (transferEventType) {
case ACCEPTANCE: case ACCEPTANCE:
this.savingsAccountWritePlatformService.acceptSavingsTransfer(savingsAccount.getId(), this.savingsAccountWritePlatformService.acceptSavingsTransfer(savingsAccount,
DateUtils.getLocalDateOfTenant(), destinationOffice, staff); DateUtils.getLocalDateOfTenant(), destinationOffice, staff);
break; break;
case PROPOSAL: case PROPOSAL:
this.savingsAccountWritePlatformService.initiateSavingsTransfer(savingsAccount.getId(), this.savingsAccountWritePlatformService.initiateSavingsTransfer(savingsAccount,
DateUtils.getLocalDateOfTenant()); DateUtils.getLocalDateOfTenant());
break; break;
case REJECTION: case REJECTION:
this.savingsAccountWritePlatformService.rejectSavingsTransfer(savingsAccount.getId()); this.savingsAccountWritePlatformService.rejectSavingsTransfer(savingsAccount);
break; break;
case WITHDRAWAL: case WITHDRAWAL:
this.savingsAccountWritePlatformService.withdrawSavingsTransfer(savingsAccount.getId(), this.savingsAccountWritePlatformService.withdrawSavingsTransfer(savingsAccount,
DateUtils.getLocalDateOfTenant()); DateUtils.getLocalDateOfTenant());
} }
} }
@@ -480,7 +480,7 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr
final JsonObject jsonObject = clientsArray.get(i).getAsJsonObject(); final JsonObject jsonObject = clientsArray.get(i).getAsJsonObject();
if (jsonObject.has(TransferApiConstants.idParamName)) { if (jsonObject.has(TransferApiConstants.idParamName)) {
final Long id = jsonObject.get(TransferApiConstants.idParamName).getAsLong(); 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); clients.add(client);
} }
} }
@@ -18,10 +18,20 @@
*/ */
package org.apache.fineract.spm.api; 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.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.portfolio.client.domain.Client; 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.client.exception.ClientNotFoundException;
import org.apache.fineract.spm.data.ScorecardData; import org.apache.fineract.spm.data.ScorecardData;
import org.apache.fineract.spm.domain.Scorecard; import org.apache.fineract.spm.domain.Scorecard;
import org.apache.fineract.spm.domain.Survey; 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.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; 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") @Path("/surveys/{surveyId}/scorecards")
@Component @Component
@Scope("singleton") @Scope("singleton")
@@ -48,16 +53,16 @@ public class ScorecardApiResource {
private final PlatformSecurityContext securityContext; private final PlatformSecurityContext securityContext;
private final SpmService spmService; private final SpmService spmService;
private final ScorecardService scorecardService; private final ScorecardService scorecardService;
private final ClientRepository clientRepository; private final ClientRepositoryWrapper clientRepositoryWrapper;
@Autowired @Autowired
public ScorecardApiResource(final PlatformSecurityContext securityContext, final SpmService spmService, public ScorecardApiResource(final PlatformSecurityContext securityContext, final SpmService spmService,
final ScorecardService scorecardService, final ClientRepository clientRepository) { final ScorecardService scorecardService, final ClientRepositoryWrapper clientRepositoryWrapper) {
super(); super();
this.securityContext = securityContext; this.securityContext = securityContext;
this.spmService = spmService; this.spmService = spmService;
this.scorecardService = scorecardService; this.scorecardService = scorecardService;
this.clientRepository = clientRepository; this.clientRepositoryWrapper = clientRepositoryWrapper;
} }
@GET @GET
@@ -84,15 +89,8 @@ public class ScorecardApiResource {
@Transactional @Transactional
public void createScorecard(@PathParam("surveyId") final Long surveyId, final ScorecardData scorecardData) { public void createScorecard(@PathParam("surveyId") final Long surveyId, final ScorecardData scorecardData) {
final AppUser appUser = this.securityContext.authenticatedUser(); final AppUser appUser = this.securityContext.authenticatedUser();
final Survey survey = findSurvey(surveyId); final Survey survey = findSurvey(surveyId);
final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(scorecardData.getClientId());
final Client client = this.clientRepository.findOne(scorecardData.getClientId());
if (client == null) {
throw new ClientNotFoundException(scorecardData.getClientId());
}
this.scorecardService.createScorecard(ScorecardMapper.map(scorecardData, survey, appUser, client)); this.scorecardService.createScorecard(ScorecardMapper.map(scorecardData, survey, appUser, client));
} }
@@ -104,21 +102,12 @@ public class ScorecardApiResource {
public List<ScorecardData> findBySurveyClient(@PathParam("surveyId") final Long surveyId, public List<ScorecardData> findBySurveyClient(@PathParam("surveyId") final Long surveyId,
@PathParam("clientId") final Long clientId) { @PathParam("clientId") final Long clientId) {
this.securityContext.authenticatedUser(); this.securityContext.authenticatedUser();
final Survey survey = findSurvey(surveyId); final Survey survey = findSurvey(surveyId);
final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId);
final Client client = this.clientRepository.findOne(clientId);
if (client == null) {
throw new ClientNotFoundException(clientId);
}
final List<Scorecard> scorecards = this.scorecardService.findBySurveyAndClient(survey, client); final List<Scorecard> scorecards = this.scorecardService.findBySurveyAndClient(survey, client);
if (scorecards == null) { if (scorecards == null) {
return ScorecardMapper.map(scorecards); return ScorecardMapper.map(scorecards);
} }
return Collections.EMPTY_LIST; return Collections.EMPTY_LIST;
} }
@@ -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.PlatformPasswordEncoder;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.office.domain.Office; 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.OfficeNotFoundException;
import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.organisation.staff.domain.Staff;
import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper; import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper;
import org.apache.fineract.portfolio.client.domain.Client; 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.api.AppUserApiConstant;
import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUser;
import org.apache.fineract.useradministration.domain.AppUserPreviousPassword; import org.apache.fineract.useradministration.domain.AppUserPreviousPassword;
@@ -77,29 +76,29 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit
private final UserDomainService userDomainService; private final UserDomainService userDomainService;
private final PlatformPasswordEncoder platformPasswordEncoder; private final PlatformPasswordEncoder platformPasswordEncoder;
private final AppUserRepository appUserRepository; private final AppUserRepository appUserRepository;
private final OfficeRepository officeRepository; private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final RoleRepository roleRepository; private final RoleRepository roleRepository;
private final UserDataValidator fromApiJsonDeserializer; private final UserDataValidator fromApiJsonDeserializer;
private final AppUserPreviousPasswordRepository appUserPreviewPasswordRepository; private final AppUserPreviousPasswordRepository appUserPreviewPasswordRepository;
private final StaffRepositoryWrapper staffRepositoryWrapper; private final StaffRepositoryWrapper staffRepositoryWrapper;
private final ClientRepository clientRepository; private final ClientRepositoryWrapper clientRepositoryWrapper;
@Autowired @Autowired
public AppUserWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final AppUserRepository appUserRepository, 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 PlatformPasswordEncoder platformPasswordEncoder, final UserDataValidator fromApiJsonDeserializer,
final AppUserPreviousPasswordRepository appUserPreviewPasswordRepository, final StaffRepositoryWrapper staffRepositoryWrapper, final AppUserPreviousPasswordRepository appUserPreviewPasswordRepository, final StaffRepositoryWrapper staffRepositoryWrapper,
final ClientRepository clientRepository) { final ClientRepositoryWrapper clientRepositoryWrapper) {
this.context = context; this.context = context;
this.appUserRepository = appUserRepository; this.appUserRepository = appUserRepository;
this.userDomainService = userDomainService; this.userDomainService = userDomainService;
this.officeRepository = officeRepository; this.officeRepositoryWrapper = officeRepositoryWrapper;
this.roleRepository = roleRepository; this.roleRepository = roleRepository;
this.platformPasswordEncoder = platformPasswordEncoder; this.platformPasswordEncoder = platformPasswordEncoder;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.appUserPreviewPasswordRepository = appUserPreviewPasswordRepository; this.appUserPreviewPasswordRepository = appUserPreviewPasswordRepository;
this.staffRepositoryWrapper = staffRepositoryWrapper; this.staffRepositoryWrapper = staffRepositoryWrapper;
this.clientRepository = clientRepository; this.clientRepositoryWrapper = clientRepositoryWrapper;
} }
@Transactional @Transactional
@@ -115,8 +114,7 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit
final String officeIdParamName = "officeId"; final String officeIdParamName = "officeId";
final Long officeId = command.longValueOfParameterNamed(officeIdParamName); final Long officeId = command.longValueOfParameterNamed(officeIdParamName);
final Office userOffice = this.officeRepository.findOne(officeId); final Office userOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (userOffice == null) { throw new OfficeNotFoundException(officeId); }
final String[] roles = command.arrayValueOfParameterNamed("roles"); final String[] roles = command.arrayValueOfParameterNamed("roles");
final Set<Role> allRoles = assembleSetOfRoles(roles); final Set<Role> allRoles = assembleSetOfRoles(roles);
@@ -140,7 +138,7 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit
for(JsonElement clientElement : clientsArray){ for(JsonElement clientElement : clientsArray){
clientIds.add(clientElement.getAsLong()); clientIds.add(clientElement.getAsLong());
} }
clients = this.clientRepository.findAll(clientIds); clients = this.clientRepositoryWrapper.findAll(clientIds);
} }
appUser = AppUser.fromJson(userOffice, linkedStaff, allRoles, clients, command); appUser = AppUser.fromJson(userOffice, linkedStaff, allRoles, clients, command);
@@ -199,16 +197,14 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit
for(JsonElement clientElement : clientsArray){ for(JsonElement clientElement : clientsArray){
clientIds.add(clientElement.getAsLong()); clientIds.add(clientElement.getAsLong());
} }
clients = this.clientRepository.findAll(clientIds); clients = this.clientRepositoryWrapper.findAll(clientIds);
} }
final Map<String, Object> changes = userToUpdate.update(command, this.platformPasswordEncoder, clients); final Map<String, Object> changes = userToUpdate.update(command, this.platformPasswordEncoder, clients);
if (changes.containsKey("officeId")) { if (changes.containsKey("officeId")) {
final Long officeId = (Long) changes.get("officeId"); final Long officeId = (Long) changes.get("officeId");
final Office office = this.officeRepository.findOne(officeId); final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
if (office == null) { throw new OfficeNotFoundException(officeId); }
userToUpdate.changeOffice(office); userToUpdate.changeOffice(office);
} }