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