Loading child entites lazy

Project: http://git-wip-us.apache.org/repos/asf/incubator-fineract/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-fineract/commit/025ff9c7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fineract/tree/025ff9c7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fineract/diff/025ff9c7

Branch: refs/heads/develop
Commit: 025ff9c707c8f68b226c1af523f3f42a742a8a9a
Parents: 19c0def
Author: Nazeer Hussain Shaik <nazeer.sh...@confluxtechnologies.com>
Authored: Mon Sep 19 14:03:37 2016 +0530
Committer: Nazeer Hussain Shaik <nazeer.sh...@confluxtechnologies.com>
Committed: Mon Sep 19 14:03:37 2016 +0530

----------------------------------------------------------------------
 ...reWritePlatformServiceJpaRepositoryImpl.java |  15 +-
 .../service/AccountingProcessorHelper.java      |  12 +-
 ...nalEntryRunningBalanceUpdateServiceImpl.java |  14 +-
 ...ryWritePlatformServiceJpaRepositoryImpl.java |  17 +-
 ...esWritePlatformServiceJpaRepositoryImpl.java |  10 +-
 ...leWritePlatformServiceJpaRepositoryImpl.java |  15 +-
 .../hooks/processor/TwilioHookProcessor.java    |  27 +--
 ...ayWritePlatformServiceJpaRepositoryImpl.java |  12 +-
 .../organisation/office/domain/Office.java      |   6 +-
 .../office/domain/OfficeRepositoryWrapper.java  |  17 +-
 ...ceWritePlatformServiceJpaRepositoryImpl.java |  28 ++-
 ...ffWritePlatformServiceJpaRepositoryImpl.java |  17 +-
 .../TellerWritePlatformServiceJpaImpl.java      |  21 +--
 .../domain/AccountTransferDetailAssembler.java  |  20 +-
 .../AddressWritePlatformServiceImpl.java        |  10 +-
 ...arWritePlatformServiceJpaRepositoryImpl.java |  10 +-
 .../portfolio/client/domain/Client.java         |  94 +++++-----
 .../portfolio/client/domain/ClientAddress.java  |   1 -
 .../client/domain/ClientRepository.java         |   2 +-
 .../client/domain/ClientRepositoryWrapper.java  |  21 ++-
 ...ntWritePlatformServiceJpaRepositoryImpl.java |  74 ++++----
 .../CollateralReadPlatformServiceImpl.java      |  13 +-
 ...alWritePlatformServiceJpaRepositoryImpl.java |  28 +--
 ...esWritePlatformServiceJpaRepositoryImpl.java |  43 ++---
 .../portfolio/loanaccount/domain/Loan.java      | 100 +++++-----
 .../domain/LoanAccountDomainServiceJpa.java     |  16 +-
 .../domain/LoanRepositoryWrapper.java           | 181 ++++++++++++++++++-
 .../GuarantorReadPlatformServiceImpl.java       |  13 +-
 ...rWritePlatformServiceJpaRepositoryIImpl.java |   6 +-
 .../domain/AbstractLoanScheduleGenerator.java   |   3 +-
 .../service/LoanScheduleAssembler.java          |   8 +-
 ...nScheduleCalculationPlatformServiceImpl.java |   4 +-
 .../LoanScheduleWritePlatformServiceImpl.java   |   5 +-
 ...escheduleRequestReadPlatformServiceImpl.java |  21 +--
 ...scheduleRequestWritePlatformServiceImpl.java |  12 +-
 .../LoanAccrualWritePlatformServiceImpl.java    |  12 +-
 ...onWritePlatformServiceJpaRepositoryImpl.java |  49 +++--
 .../loanaccount/service/LoanAssembler.java      |   4 +-
 .../service/LoanChargeAssembler.java            |   2 +-
 .../service/LoanReadPlatformServiceImpl.java    |  37 ++--
 .../loanaccount/service/LoanUtilService.java    |   5 +-
 .../service/LoanWritePlatformService.java       |   9 +-
 ...anWritePlatformServiceJpaRepositoryImpl.java | 102 ++++++-----
 ...ctWritePlatformServiceJpaRepositoryImpl.java |  11 +-
 ...ngWritePlatformServiceJpaRepositoryImpl.java |  16 +-
 ...teWritePlatformServiceJpaRepositoryImpl.java |  15 +-
 .../savings/data/SavingsAccountDataDTO.java     |  11 +-
 .../savings/domain/DepositAccountAssembler.java |   3 +-
 .../savings/domain/RecurringDepositAccount.java |  24 +--
 .../savings/domain/SavingsAccount.java          |  30 ++-
 .../savings/domain/SavingsAccountAssembler.java |   4 +-
 .../domain/SavingsAccountRepository.java        |   1 +
 .../domain/SavingsAccountRepositoryWrapper.java |  58 +++++-
 .../savings/domain/SavingsAccountSummary.java   |   3 +-
 ...SavingsAccountTransactionSummaryWrapper.java |  24 +--
 ...ntWritePlatformServiceJpaRepositoryImpl.java |  66 +++----
 .../SavingsAccountWritePlatformService.java     |   8 +-
 ...ntWritePlatformServiceJpaRepositoryImpl.java |  73 ++++----
 .../service/SavingsSchedularServiceImpl.java    |  10 +-
 ...eneficiariesTPTWritePlatformServiceImpl.java |  21 +--
 ...erWritePlatformServiceJpaRepositoryImpl.java |  76 ++++----
 .../fineract/spm/api/ScorecardApiResource.java  |  45 ++---
 ...erWritePlatformServiceJpaRepositoryImpl.java |  28 ++-
 63 files changed, 885 insertions(+), 758 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java
index 4c305df..7b00ac8 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java
@@ -28,16 +28,15 @@ import 
org.apache.fineract.accounting.closure.domain.GLClosureRepository;
 import 
org.apache.fineract.accounting.closure.exception.GLClosureDuplicateException;
 import 
org.apache.fineract.accounting.closure.exception.GLClosureInvalidDeleteException;
 import 
org.apache.fineract.accounting.closure.exception.GLClosureInvalidException;
-import 
org.apache.fineract.accounting.closure.exception.GLClosureNotFoundException;
 import 
org.apache.fineract.accounting.closure.exception.GLClosureInvalidException.GL_CLOSURE_INVALID_REASON;
+import 
org.apache.fineract.accounting.closure.exception.GLClosureNotFoundException;
 import 
org.apache.fineract.accounting.closure.serialization.GLClosureCommandFromApiJsonDeserializer;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
-import 
org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.joda.time.LocalDate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,14 +51,14 @@ public class GLClosureWritePlatformServiceJpaRepositoryImpl 
implements GLClosure
     private final static Logger logger = 
LoggerFactory.getLogger(GLClosureWritePlatformServiceJpaRepositoryImpl.class);
 
     private final GLClosureRepository glClosureRepository;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final GLClosureCommandFromApiJsonDeserializer 
fromApiJsonDeserializer;
 
     @Autowired
     public GLClosureWritePlatformServiceJpaRepositoryImpl(final 
GLClosureRepository glClosureRepository,
-            final OfficeRepository officeRepository, final 
GLClosureCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
+            final OfficeRepositoryWrapper officeRepositoryWrapper, final 
GLClosureCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
         this.glClosureRepository = glClosureRepository;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
     }
 
@@ -72,9 +71,7 @@ public class GLClosureWritePlatformServiceJpaRepositoryImpl 
implements GLClosure
 
             // check office is valid
             final Long officeId = 
command.longValueOfParameterNamed(GLClosureJsonInputParams.OFFICE_ID.getValue());
-            final Office office = this.officeRepository.findOne(officeId);
-            if (office == null) { throw new OfficeNotFoundException(officeId); 
}
-
+            final Office office = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
             // TODO: Get Tenant specific date
             // ensure closure date is not in the future
             final Date todaysDate = new Date();

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java
index fa3e763..aeef6ce 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java
@@ -44,9 +44,9 @@ import 
org.apache.fineract.accounting.journalentry.data.LoanDTO;
 import org.apache.fineract.accounting.journalentry.data.LoanTransactionDTO;
 import org.apache.fineract.accounting.journalentry.data.SavingsDTO;
 import org.apache.fineract.accounting.journalentry.data.SavingsTransactionDTO;
-import org.apache.fineract.accounting.journalentry.data.TaxPaymentDTO;
 import org.apache.fineract.accounting.journalentry.data.SharesDTO;
 import org.apache.fineract.accounting.journalentry.data.SharesTransactionDTO;
+import org.apache.fineract.accounting.journalentry.data.TaxPaymentDTO;
 import org.apache.fineract.accounting.journalentry.domain.JournalEntry;
 import 
org.apache.fineract.accounting.journalentry.domain.JournalEntryRepository;
 import org.apache.fineract.accounting.journalentry.domain.JournalEntryType;
@@ -60,7 +60,7 @@ import 
org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import org.apache.fineract.organisation.monetary.data.CurrencyData;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.apache.fineract.portfolio.account.PortfolioAccountType;
 import 
org.apache.fineract.portfolio.account.service.AccountTransfersReadPlatformService;
 import org.apache.fineract.portfolio.client.domain.ClientTransaction;
@@ -90,7 +90,7 @@ public class AccountingProcessorHelper {
     private final FinancialActivityAccountRepositoryWrapper 
financialActivityAccountRepository;
     private final GLClosureRepository closureRepository;
     private final GLAccountRepositoryWrapper accountRepositoryWrapper;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final LoanTransactionRepository loanTransactionRepository;
     private final ClientTransactionRepositoryWrapper 
clientTransactionRepository;
     private final SavingsAccountTransactionRepository 
savingsAccountTransactionRepository;
@@ -99,7 +99,7 @@ public class AccountingProcessorHelper {
     @Autowired
     public AccountingProcessorHelper(final JournalEntryRepository 
glJournalEntryRepository,
             final ProductToGLAccountMappingRepository 
accountMappingRepository, final GLClosureRepository closureRepository,
-            final OfficeRepository officeRepository, final 
LoanTransactionRepository loanTransactionRepository,
+            final OfficeRepositoryWrapper officeRepositoryWrapper, final 
LoanTransactionRepository loanTransactionRepository,
             final SavingsAccountTransactionRepository 
savingsAccountTransactionRepository,
             final FinancialActivityAccountRepositoryWrapper 
financialActivityAccountRepository,
             final AccountTransfersReadPlatformService 
accountTransfersReadPlatformService,
@@ -108,7 +108,7 @@ public class AccountingProcessorHelper {
         this.glJournalEntryRepository = glJournalEntryRepository;
         this.accountMappingRepository = accountMappingRepository;
         this.closureRepository = closureRepository;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.loanTransactionRepository = loanTransactionRepository;
         this.savingsAccountTransactionRepository = 
savingsAccountTransactionRepository;
         this.financialActivityAccountRepository = 
financialActivityAccountRepository;
@@ -539,7 +539,7 @@ public class AccountingProcessorHelper {
     }
 
     public Office getOfficeById(final long officeId) {
-        return this.officeRepository.findOne(officeId);
+        return 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
     }
 
     private void createJournalEntriesForLoan(final Office office, final String 
currencyCode, final int accountTypeToDebitId,

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryRunningBalanceUpdateServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryRunningBalanceUpdateServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryRunningBalanceUpdateServiceImpl.java
index 4ab8e11..3a539b6 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryRunningBalanceUpdateServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryRunningBalanceUpdateServiceImpl.java
@@ -42,9 +42,7 @@ import 
org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
 import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
 import org.apache.fineract.infrastructure.jobs.annotation.CronTarget;
 import org.apache.fineract.infrastructure.jobs.service.JobName;
-import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
-import 
org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -60,7 +58,7 @@ public class JournalEntryRunningBalanceUpdateServiceImpl 
implements JournalEntry
 
     private final JdbcTemplate jdbcTemplate;
 
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
 
     private final JournalEntryDataValidator dataValidator;
 
@@ -89,10 +87,10 @@ public class JournalEntryRunningBalanceUpdateServiceImpl 
implements JournalEntry
             + "where je2.id = je.id and je.entry_date = je3.date group by 
je.id order by je.entry_date DESC " + selectRunningBalanceSqlLimit;
 
     @Autowired
-    public JournalEntryRunningBalanceUpdateServiceImpl(final RoutingDataSource 
dataSource, final OfficeRepository officeRepository,
+    public JournalEntryRunningBalanceUpdateServiceImpl(final RoutingDataSource 
dataSource, final OfficeRepositoryWrapper officeRepositoryWrapper,
             final JournalEntryDataValidator dataValidator, final 
FromJsonHelper fromApiJsonHelper) {
         this.jdbcTemplate = new JdbcTemplate(dataSource);
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.dataValidator = dataValidator;
         this.fromApiJsonHelper = fromApiJsonHelper;
     }
@@ -120,9 +118,7 @@ public class JournalEntryRunningBalanceUpdateServiceImpl 
implements JournalEntry
         if (officeId == null) {
             updateRunningBalance();
         } else {
-            final Office office = this.officeRepository.findOne(officeId);
-            if (office == null) { throw new OfficeNotFoundException(officeId); 
}
-
+            
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
             String dateFinder = "select MIN(je.entry_date) as entityDate " + 
"from acc_gl_journal_entry  je "
                     + "where je.is_running_balance_calculated=0  and 
je.office_id=?";
             try {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java
index 205cb1a..207cdc9 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java
@@ -69,9 +69,8 @@ import 
org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidati
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import 
org.apache.fineract.organisation.office.domain.OrganisationCurrencyRepositoryWrapper;
-import 
org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
 import org.apache.fineract.portfolio.client.domain.ClientTransaction;
 import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
 import 
org.apache.fineract.portfolio.paymentdetail.service.PaymentDetailWritePlatformService;
@@ -93,7 +92,7 @@ public class 
JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
     private final GLClosureRepository glClosureRepository;
     private final GLAccountRepository glAccountRepository;
     private final JournalEntryRepository glJournalEntryRepository;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final AccountingProcessorForLoanFactory 
accountingProcessorForLoanFactory;
     private final AccountingProcessorForSavingsFactory 
accountingProcessorForSavingsFactory;
     private final AccountingProcessorForSharesFactory 
accountingProcessorForSharesFactory;
@@ -109,7 +108,7 @@ public class 
JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
 
     @Autowired
     public JournalEntryWritePlatformServiceJpaRepositoryImpl(final 
GLClosureRepository glClosureRepository,
-            final JournalEntryRepository glJournalEntryRepository, final 
OfficeRepository officeRepository,
+            final JournalEntryRepository glJournalEntryRepository, final 
OfficeRepositoryWrapper officeRepositoryWrapper,
             final GLAccountRepository glAccountRepository, final 
JournalEntryCommandFromApiJsonDeserializer fromApiJsonDeserializer,
             final AccountingProcessorHelper accountingProcessorHelper, final 
AccountingRuleRepository accountingRuleRepository,
             final AccountingProcessorForLoanFactory 
accountingProcessorForLoanFactory,
@@ -121,7 +120,7 @@ public class 
JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
             final FinancialActivityAccountRepositoryWrapper 
financialActivityAccountRepositoryWrapper,
             final CashBasedAccountingProcessorForClientTransactions 
accountingProcessorForClientTransactions) {
         this.glClosureRepository = glClosureRepository;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.glJournalEntryRepository = glJournalEntryRepository;
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
         this.glAccountRepository = glAccountRepository;
@@ -147,9 +146,7 @@ public class 
JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
 
             // check office is valid
             final Long officeId = 
command.longValueOfParameterNamed(JournalEntryJsonInputParams.OFFICE_ID.getValue());
-            final Office office = this.officeRepository.findOne(officeId);
-            if (office == null) { throw new OfficeNotFoundException(officeId); 
}
-
+            final Office office = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
             final Long accountRuleId = 
command.longValueOfParameterNamed(JournalEntryJsonInputParams.ACCOUNTING_RULE.getValue());
             final String currencyCode = 
command.stringValueOfParameterNamed(JournalEntryJsonInputParams.CURRENCY_CODE.getValue());
 
@@ -647,9 +644,7 @@ public class 
JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
 
             // check office is valid
             final Long officeId = 
command.longValueOfParameterNamed(JournalEntryJsonInputParams.OFFICE_ID.getValue());
-            final Office office = this.officeRepository.findOne(officeId);
-            if (office == null) { throw new OfficeNotFoundException(officeId); 
}
-
+            final Office office = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
             final String currencyCode = 
command.stringValueOfParameterNamed(JournalEntryJsonInputParams.CURRENCY_CODE.getValue());
 
             validateBusinessRulesForJournalEntries(journalEntryCommand);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java
index 517f20c..3a880ea 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java
@@ -50,7 +50,7 @@ import 
org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
 import org.apache.fineract.organisation.monetary.domain.Money;
 import org.apache.fineract.organisation.monetary.domain.MoneyHelper;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import 
org.apache.fineract.organisation.provisioning.data.ProvisioningCriteriaData;
 import 
org.apache.fineract.organisation.provisioning.domain.ProvisioningCategory;
 import 
org.apache.fineract.organisation.provisioning.domain.ProvisioningCategoryRepository;
@@ -72,7 +72,7 @@ public class 
ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements
     private final ProvisioningCriteriaReadPlatformService 
provisioningCriteriaReadPlatformService ;
     private final LoanProductRepository loanProductRepository;
     private final GLAccountRepository glAccountRepository;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final ProvisioningCategoryRepository 
provisioningCategoryRepository;
     private final PlatformSecurityContext platformSecurityContext;
     private final ProvisioningEntryRepository provisioningEntryRepository;
@@ -85,7 +85,7 @@ public class 
ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements
             final ProvisioningEntriesReadPlatformService 
provisioningEntriesReadPlatformService,
             final ProvisioningCriteriaReadPlatformService 
provisioningCriteriaReadPlatformService,
             final LoanProductRepository loanProductRepository, final 
GLAccountRepository glAccountRepository,
-            final OfficeRepository officeRepository, final 
ProvisioningCategoryRepository provisioningCategoryRepository,
+            final OfficeRepositoryWrapper officeRepositoryWrapper, final 
ProvisioningCategoryRepository provisioningCategoryRepository,
             final PlatformSecurityContext platformSecurityContext, final 
ProvisioningEntryRepository provisioningEntryRepository,
             final JournalEntryWritePlatformService 
journalEntryWritePlatformService,
             final ProvisioningEntriesDefinitionJsonDeserializer 
fromApiJsonDeserializer, final FromJsonHelper fromApiJsonHelper) {
@@ -93,7 +93,7 @@ public class 
ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements
         this.provisioningCriteriaReadPlatformService = 
provisioningCriteriaReadPlatformService ;
         this.loanProductRepository = loanProductRepository;
         this.glAccountRepository = glAccountRepository;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.provisioningCategoryRepository = provisioningCategoryRepository;
         this.platformSecurityContext = platformSecurityContext;
         this.provisioningEntryRepository = provisioningEntryRepository;
@@ -221,7 +221,7 @@ public class 
ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements
         Map<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());

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java
index e81b464..f934541 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java
@@ -47,8 +47,7 @@ import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
-import 
org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -64,17 +63,17 @@ public class 
AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco
     private final AccountingRuleRepositoryWrapper 
accountingRuleRepositoryWrapper;
     private final AccountingRuleRepository accountingRuleRepository;
     private final GLAccountRepositoryWrapper accountRepositoryWrapper;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final AccountingRuleCommandFromApiJsonDeserializer 
fromApiJsonDeserializer;
     private final CodeValueRepository codeValueRepository;
 
     @Autowired
     public AccountingRuleWritePlatformServiceJpaRepositoryImpl(final 
AccountingRuleRepositoryWrapper accountingRuleRepositoryWrapper,
-            final GLAccountRepositoryWrapper accountRepositoryWrapper, final 
OfficeRepository officeRepository,
+            final GLAccountRepositoryWrapper accountRepositoryWrapper, final 
OfficeRepositoryWrapper officeRepositoryWrapper,
             final AccountingRuleRepository ruleRepository, final 
AccountingRuleCommandFromApiJsonDeserializer fromApiJsonDeserializer,
             final CodeValueRepository codeValueRepository) {
         this.accountRepositoryWrapper = accountRepositoryWrapper;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.accountingRuleRepository = ruleRepository;
         this.accountingRuleRepositoryWrapper = accountingRuleRepositoryWrapper;
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
@@ -107,8 +106,7 @@ public class 
AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco
             final Long officeId = 
command.longValueOfParameterNamed(GLClosureJsonInputParams.OFFICE_ID.getValue());
             Office office = null;
             if (officeId != null) {
-                office = this.officeRepository.findOne(officeId);
-                if (office == null) { throw new 
OfficeNotFoundException(officeId); }
+                office = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
             }
 
             final AccountingRule accountingRule = 
assembleAccountingRuleAndTags(office, command);
@@ -268,8 +266,7 @@ public class 
AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco
             }
 
             if (officeId != null && 
changesOnly.containsKey(AccountingRuleJsonInputParams.OFFICE_ID.getValue())) {
-                final Office userOffice = 
this.officeRepository.findOne(officeId);
-                if (userOffice == null) { throw new 
OfficeNotFoundException(officeId); }
+                final Office userOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
                 accountingRule.setOffice(userOffice);
             }
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java
index aa87e7c..d3bab53 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java
@@ -18,44 +18,45 @@
  */
 package org.apache.fineract.infrastructure.hooks.processor;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
+import static 
org.apache.fineract.infrastructure.hooks.api.HookApiConstants.apiKeyName;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.fineract.infrastructure.hooks.domain.Hook;
 import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration;
 import 
org.apache.fineract.infrastructure.hooks.domain.HookConfigurationRepository;
 import org.apache.fineract.infrastructure.hooks.processor.data.SmsProviderData;
 import org.apache.fineract.portfolio.client.domain.Client;
-import org.apache.fineract.portfolio.client.domain.ClientRepository;
+import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper;
 import org.apache.fineract.template.service.TemplateMergeService;
 import org.apache.fineract.useradministration.domain.AppUser;
 import org.codehaus.jackson.map.ObjectMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import retrofit.Callback;
 
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
+import retrofit.Callback;
 
-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);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java
index d159f3a..04cf4df 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java
@@ -36,8 +36,7 @@ import 
org.apache.fineract.organisation.holiday.domain.Holiday;
 import 
org.apache.fineract.organisation.holiday.domain.HolidayRepositoryWrapper;
 import org.apache.fineract.organisation.holiday.exception.HolidayDateException;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
-import 
org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.apache.fineract.organisation.workingdays.domain.WorkingDays;
 import 
org.apache.fineract.organisation.workingdays.domain.WorkingDaysRepositoryWrapper;
 import org.apache.fineract.organisation.workingdays.service.WorkingDaysUtil;
@@ -61,18 +60,18 @@ public class HolidayWritePlatformServiceJpaRepositoryImpl 
implements HolidayWrit
     private final HolidayRepositoryWrapper holidayRepository;
     private final WorkingDaysRepositoryWrapper daysRepositoryWrapper;
     private final PlatformSecurityContext context;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final FromJsonHelper fromApiJsonHelper;
 
     @Autowired
     public HolidayWritePlatformServiceJpaRepositoryImpl(final 
HolidayDataValidator fromApiJsonDeserializer,
             final HolidayRepositoryWrapper holidayRepository, final 
PlatformSecurityContext context,
-            final OfficeRepository officeRepository, final FromJsonHelper 
fromApiJsonHelper,
+            final OfficeRepositoryWrapper officeRepositoryWrapper, final 
FromJsonHelper fromApiJsonHelper,
             final WorkingDaysRepositoryWrapper daysRepositoryWrapper) {
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
         this.holidayRepository = holidayRepository;
         this.context = context;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.fromApiJsonHelper = fromApiJsonHelper;
         this.daysRepositoryWrapper = daysRepositoryWrapper;
     }
@@ -162,8 +161,7 @@ public class HolidayWritePlatformServiceJpaRepositoryImpl 
implements HolidayWrit
             for (int i = 0; i < array.size(); i++) {
                 final JsonObject officeElement = 
array.get(i).getAsJsonObject();
                 final Long officeId = 
this.fromApiJsonHelper.extractLongNamed(HolidayApiConstants.officeIdParamName, 
officeElement);
-                final Office office = this.officeRepository.findOne(officeId);
-                if (office == null) { throw new 
OfficeNotFoundException(officeId); }
+                final Office office = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
                 offices.add(office);
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java
index 55a4c65..dadf6d7 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java
@@ -47,7 +47,7 @@ import 
org.springframework.data.jpa.domain.AbstractPersistable;
         @UniqueConstraint(columnNames = { "external_id" }, name = 
"externalid_org") })
 public class Office extends AbstractPersistable<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() ;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OfficeRepositoryWrapper.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OfficeRepositoryWrapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OfficeRepositoryWrapper.java
index 36fef09..77dc82c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OfficeRepositoryWrapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OfficeRepositoryWrapper.java
@@ -21,6 +21,7 @@ package org.apache.fineract.organisation.office.domain;
 import 
org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <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) {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
index 13a8744..1377e47 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
@@ -31,10 +31,9 @@ import 
org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepos
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
 import org.apache.fineract.organisation.monetary.domain.Money;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.apache.fineract.organisation.office.domain.OfficeTransaction;
 import 
org.apache.fineract.organisation.office.domain.OfficeTransactionRepository;
-import 
org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
 import 
org.apache.fineract.organisation.office.serialization.OfficeCommandFromApiJsonDeserializer;
 import 
org.apache.fineract.organisation.office.serialization.OfficeTransactionCommandFromApiJsonDeserializer;
 import org.apache.fineract.useradministration.domain.AppUser;
@@ -55,7 +54,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl 
implements OfficeWriteP
     private final PlatformSecurityContext context;
     private final OfficeCommandFromApiJsonDeserializer fromApiJsonDeserializer;
     private final OfficeTransactionCommandFromApiJsonDeserializer 
moneyTransferCommandFromApiJsonDeserializer;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final OfficeTransactionRepository officeTransactionRepository;
     private final ApplicationCurrencyRepositoryWrapper 
applicationCurrencyRepository;
 
@@ -63,12 +62,12 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl 
implements OfficeWriteP
     public OfficeWritePlatformServiceJpaRepositoryImpl(final 
PlatformSecurityContext context,
             final OfficeCommandFromApiJsonDeserializer fromApiJsonDeserializer,
             final OfficeTransactionCommandFromApiJsonDeserializer 
moneyTransferCommandFromApiJsonDeserializer,
-            final OfficeRepository officeRepository, final 
OfficeTransactionRepository officeMonetaryTransferRepository,
+            final OfficeRepositoryWrapper officeRepositoryWrapper, final 
OfficeTransactionRepository officeMonetaryTransferRepository,
             final ApplicationCurrencyRepositoryWrapper 
applicationCurrencyRepository) {
         this.context = context;
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
         this.moneyTransferCommandFromApiJsonDeserializer = 
moneyTransferCommandFromApiJsonDeserializer;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.officeTransactionRepository = officeMonetaryTransferRepository;
         this.applicationCurrencyRepository = applicationCurrencyRepository;
     }
@@ -94,11 +93,11 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl 
implements OfficeWriteP
             final Office office = Office.fromJson(parent, command);
 
             // pre save to generate id for use in office hierarchy
-            this.officeRepository.save(office);
+            this.officeRepositoryWrapper.save(office);
 
             office.generateHierarchy();
 
-            this.officeRepository.save(office);
+            this.officeRepositoryWrapper.save(office);
 
             return new CommandProcessingResultBuilder() //
                     .withCommandId(command.commandId()) //
@@ -139,7 +138,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl 
implements OfficeWriteP
             }
 
             if (!changes.isEmpty()) {
-                this.officeRepository.saveAndFlush(office);
+                this.officeRepositoryWrapper.saveAndFlush(office);
             }
 
             return new CommandProcessingResultBuilder() //
@@ -166,18 +165,16 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl 
implements OfficeWriteP
         Office fromOffice = null;
         final Long fromOfficeId = 
command.longValueOfParameterNamed("fromOfficeId");
         if (fromOfficeId != null) {
-            fromOffice = this.officeRepository.findOne(fromOfficeId);
+            fromOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(fromOfficeId);
             officeId = fromOffice.getId();
         }
         Office toOffice = null;
         final Long toOfficeId = 
command.longValueOfParameterNamed("toOfficeId");
         if (toOfficeId != null) {
-            toOffice = this.officeRepository.findOne(toOfficeId);
+            toOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(toOfficeId);
             officeId = toOffice.getId();
         }
 
-        if (fromOffice == null && toOffice == null) { throw new 
OfficeNotFoundException(toOfficeId); }
-
         final String currencyCode = 
command.stringValueOfParameterNamed("currencyCode");
         final ApplicationCurrency appCurrency = 
this.applicationCurrencyRepository.findOneWithNotFoundDetection(currencyCode);
 
@@ -239,16 +236,13 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl 
implements OfficeWriteP
     private Office validateUserPriviledgeOnOfficeAndRetrieve(final AppUser 
currentUser, final Long officeId) {
 
         final Long userOfficeId = currentUser.getOffice().getId();
-        final Office userOffice = this.officeRepository.findOne(userOfficeId);
-        if (userOffice == null) { throw new 
OfficeNotFoundException(userOfficeId); }
-
+        final Office userOffice = 
this.officeRepositoryWrapper.findOfficeHierarchy(userOfficeId);
         if (userOffice.doesNotHaveAnOfficeInHierarchyWithId(officeId)) { throw 
new NoAuthorizationException(
                 "User does not have sufficient priviledges to act on the 
provided office."); }
 
         Office officeToReturn = userOffice;
         if (!userOffice.identifiedBy(officeId)) {
-            officeToReturn = this.officeRepository.findOne(officeId);
-            if (officeToReturn == null) { throw new 
OfficeNotFoundException(officeId); }
+            officeToReturn = 
this.officeRepositoryWrapper.findOfficeHierarchy(officeId);
         }
 
         return officeToReturn;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
index a8a6e4f..b10dd12 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java
@@ -26,8 +26,7 @@ import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
-import 
org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.apache.fineract.organisation.staff.domain.Staff;
 import org.apache.fineract.organisation.staff.domain.StaffRepository;
 import org.apache.fineract.organisation.staff.exception.StaffNotFoundException;
@@ -46,14 +45,14 @@ public class StaffWritePlatformServiceJpaRepositoryImpl 
implements StaffWritePla
 
     private final StaffCommandFromApiJsonDeserializer fromApiJsonDeserializer;
     private final StaffRepository staffRepository;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
 
     @Autowired
     public StaffWritePlatformServiceJpaRepositoryImpl(final 
StaffCommandFromApiJsonDeserializer fromApiJsonDeserializer,
-            final StaffRepository staffRepository, final OfficeRepository 
officeRepository) {
+            final StaffRepository staffRepository, final 
OfficeRepositoryWrapper officeRepositoryWrapper) {
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
         this.staffRepository = staffRepository;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
     }
 
     @Transactional
@@ -65,9 +64,7 @@ public class StaffWritePlatformServiceJpaRepositoryImpl 
implements StaffWritePla
 
             final Long officeId = 
command.longValueOfParameterNamed("officeId");
 
-            final Office staffOffice = this.officeRepository.findOne(officeId);
-            if (staffOffice == null) { throw new 
OfficeNotFoundException(officeId); }
-
+            final Office staffOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
             final Staff staff = Staff.fromJson(staffOffice, command);
 
             this.staffRepository.save(staff);
@@ -96,9 +93,7 @@ public class StaffWritePlatformServiceJpaRepositoryImpl 
implements StaffWritePla
 
             if (changesOnly.containsKey("officeId")) {
                 final Long officeId = (Long) changesOnly.get("officeId");
-                final Office newOffice = 
this.officeRepository.findOne(officeId);
-                if (newOffice == null) { throw new 
OfficeNotFoundException(officeId); }
-
+                final Office newOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
                 staffForUpdate.changeOffice(newOffice);
             }
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
index bff951c..bbaad90 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
@@ -35,8 +35,7 @@ import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityEx
 import 
org.apache.fineract.infrastructure.security.exception.NoAuthorizationException;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
-import 
org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.apache.fineract.organisation.staff.domain.Staff;
 import org.apache.fineract.organisation.staff.domain.StaffRepository;
 import org.apache.fineract.organisation.staff.exception.StaffNotFoundException;
@@ -70,7 +69,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
     private final TellerCommandFromApiJsonDeserializer fromApiJsonDeserializer;
     private final TellerRepository tellerRepository;
     private final TellerRepositoryWrapper tellerRepositoryWrapper;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final StaffRepository staffRepository;
     private final CashierRepository cashierRepository;
     private final CashierTransactionRepository cashierTxnRepository;
@@ -80,7 +79,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
     @Autowired
     public TellerWritePlatformServiceJpaImpl(final PlatformSecurityContext 
context,
             final TellerCommandFromApiJsonDeserializer 
fromApiJsonDeserializer, final TellerRepository tellerRepository,
-            final TellerRepositoryWrapper tellerRepositoryWrapper, final 
OfficeRepository officeRepository,
+            final TellerRepositoryWrapper tellerRepositoryWrapper, final 
OfficeRepositoryWrapper officeRepositoryWrapper,
             final StaffRepository staffRepository, CashierRepository 
cashierRepository, CashierTransactionRepository cashierTxnRepository,
             JournalEntryRepository glJournalEntryRepository,
             FinancialActivityAccountRepositoryWrapper 
financialActivityAccountRepositoryWrapper) {
@@ -88,7 +87,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
         this.tellerRepository = tellerRepository;
         this.tellerRepositoryWrapper = tellerRepositoryWrapper;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.staffRepository = staffRepository;
         this.cashierRepository = cashierRepository;
         this.cashierTxnRepository = cashierTxnRepository;
@@ -108,9 +107,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
 
             // final Office parent =
             // validateUserPriviledgeOnOfficeAndRetrieve(currentUser, 
officeId);
-            final Office tellerOffice = 
this.officeRepository.findOne(officeId);
-            if (tellerOffice == null) { throw new 
OfficeNotFoundException(officeId); }
-
+            final Office tellerOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
             final Teller teller = Teller.fromJson(tellerOffice, command);
 
             // pre save to generate id for use in office hierarchy
@@ -133,9 +130,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
         try {
 
             final Long officeId = 
command.longValueOfParameterNamed("officeId");
-            final Office tellerOffice = 
this.officeRepository.findOne(officeId);
-            if (tellerOffice == null) { throw new 
OfficeNotFoundException(officeId); }
-
+            final Office tellerOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
             final AppUser currentUser = this.context.authenticatedUser();
 
             
this.fromApiJsonDeserializer.validateForCreateAndUpdateTeller(command.json());
@@ -167,9 +162,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
     private Teller validateUserPriviledgeOnTellerAndRetrieve(final AppUser 
currentUser, final Long tellerId) {
 
         final Long userOfficeId = currentUser.getOffice().getId();
-        final Office userOffice = this.officeRepository.findOne(userOfficeId);
-        if (userOffice == null) { throw new 
OfficeNotFoundException(userOfficeId); }
-
+        final Office userOffice = 
this.officeRepositoryWrapper.findOfficeHierarchy(userOfficeId);
         final Teller tellerToReturn = this.tellerRepository.findOne(tellerId);
         if (tellerToReturn != null) {
             final Long tellerOfficeId = tellerToReturn.officeId();

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetailAssembler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetailAssembler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetailAssembler.java
index f9f4f20..4fb18cb 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetailAssembler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/domain/AccountTransferDetailAssembler.java
@@ -31,7 +31,7 @@ import java.util.Locale;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
 import org.apache.fineract.organisation.office.domain.Office;
-import org.apache.fineract.organisation.office.domain.OfficeRepository;
+import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.apache.fineract.portfolio.client.domain.Client;
 import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
@@ -47,17 +47,17 @@ import com.google.gson.JsonElement;
 public class AccountTransferDetailAssembler {
 
     private final ClientRepositoryWrapper clientRepository;
-    private final OfficeRepository officeRepository;
+    private final OfficeRepositoryWrapper officeRepositoryWrapper;
     private final SavingsAccountAssembler savingsAccountAssembler;
     private final FromJsonHelper fromApiJsonHelper;
     private final LoanAssembler loanAccountAssembler;
 
     @Autowired
-    public AccountTransferDetailAssembler(final ClientRepositoryWrapper 
clientRepository, final OfficeRepository officeRepository,
+    public AccountTransferDetailAssembler(final ClientRepositoryWrapper 
clientRepository, final OfficeRepositoryWrapper officeRepositoryWrapper,
             final SavingsAccountAssembler savingsAccountAssembler, final 
FromJsonHelper fromApiJsonHelper,
             final LoanAssembler loanAccountAssembler) {
         this.clientRepository = clientRepository;
-        this.officeRepository = officeRepository;
+        this.officeRepositoryWrapper = officeRepositoryWrapper;
         this.savingsAccountAssembler = savingsAccountAssembler;
         this.fromApiJsonHelper = fromApiJsonHelper;
         this.loanAccountAssembler = loanAccountAssembler;
@@ -104,13 +104,13 @@ public class AccountTransferDetailAssembler {
         final JsonElement element = command.parsedJson();
 
         final Long fromOfficeId = 
this.fromApiJsonHelper.extractLongNamed(fromOfficeIdParamName, element);
-        final Office fromOffice = this.officeRepository.findOne(fromOfficeId);
+        final Office fromOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(fromOfficeId);
 
         final Long fromClientId = 
this.fromApiJsonHelper.extractLongNamed(fromClientIdParamName, element);
         final Client fromClient = 
this.clientRepository.findOneWithNotFoundDetection(fromClientId);
 
         final Long toOfficeId = 
this.fromApiJsonHelper.extractLongNamed(toOfficeIdParamName, element);
-        final Office toOffice = this.officeRepository.findOne(toOfficeId);
+        final Office toOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(toOfficeId);
 
         final Long toClientId = 
this.fromApiJsonHelper.extractLongNamed(toClientIdParamName, element);
         final Client toClient = 
this.clientRepository.findOneWithNotFoundDetection(toClientId);
@@ -128,13 +128,13 @@ public class AccountTransferDetailAssembler {
         final JsonElement element = command.parsedJson();
 
         final Long fromOfficeId = 
this.fromApiJsonHelper.extractLongNamed(fromOfficeIdParamName, element);
-        final Office fromOffice = this.officeRepository.findOne(fromOfficeId);
+        final Office fromOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(fromOfficeId);
 
         final Long fromClientId = 
this.fromApiJsonHelper.extractLongNamed(fromClientIdParamName, element);
         final Client fromClient = 
this.clientRepository.findOneWithNotFoundDetection(fromClientId);
 
         final Long toOfficeId = 
this.fromApiJsonHelper.extractLongNamed(toOfficeIdParamName, element);
-        final Office toOffice = this.officeRepository.findOne(toOfficeId);
+        final Office toOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(toOfficeId);
 
         final Long toClientId = 
this.fromApiJsonHelper.extractLongNamed(toClientIdParamName, element);
         final Client toClient = 
this.clientRepository.findOneWithNotFoundDetection(toClientId);
@@ -152,13 +152,13 @@ public class AccountTransferDetailAssembler {
         final JsonElement element = command.parsedJson();
 
         final Long fromOfficeId = 
this.fromApiJsonHelper.extractLongNamed(fromOfficeIdParamName, element);
-        final Office fromOffice = this.officeRepository.findOne(fromOfficeId);
+        final Office fromOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(fromOfficeId);
 
         final Long fromClientId = 
this.fromApiJsonHelper.extractLongNamed(fromClientIdParamName, element);
         final Client fromClient = 
this.clientRepository.findOneWithNotFoundDetection(fromClientId);
 
         final Long toOfficeId = 
this.fromApiJsonHelper.extractLongNamed(toOfficeIdParamName, element);
-        final Office toOffice = this.officeRepository.findOne(toOfficeId);
+        final Office toOffice = 
this.officeRepositoryWrapper.findOneWithNotFoundDetection(toOfficeId);
 
         final Long toClientId = 
this.fromApiJsonHelper.extractLongNamed(toClientIdParamName, element);
         final Client toClient = 
this.clientRepository.findOneWithNotFoundDetection(toClientId);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java
index 847b20d..c15b950 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java
@@ -33,7 +33,7 @@ import org.apache.fineract.portfolio.client.domain.Client;
 import org.apache.fineract.portfolio.client.domain.ClientAddress;
 import org.apache.fineract.portfolio.client.domain.ClientAddressRepository;
 import 
org.apache.fineract.portfolio.client.domain.ClientAddressRepositoryWrapper;
-import org.apache.fineract.portfolio.client.domain.ClientRepository;
+import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -45,7 +45,7 @@ public class AddressWritePlatformServiceImpl implements 
AddressWritePlatformServ
        private final PlatformSecurityContext context;
        private final CodeValueRepository codeValueRepository;
        private final ClientAddressRepository clientAddressRepository;
-       private final ClientRepository clientRepository;
+       private final ClientRepositoryWrapper clientRepositoryWrapper;
        private final AddressRepository addressRepository;
        private final ClientAddressRepositoryWrapper 
clientAddressRepositoryWrapper;
        private final AddressCommandFromApiJsonDeserializer 
fromApiJsonDeserializer;
@@ -53,13 +53,13 @@ public class AddressWritePlatformServiceImpl implements 
AddressWritePlatformServ
        @Autowired
        public AddressWritePlatformServiceImpl(final PlatformSecurityContext 
context,
                        final CodeValueRepository codeValueRepository, final 
ClientAddressRepository clientAddressRepository,
-                       final ClientRepository clientRepository, final 
AddressRepository addressRepository,
+                       final ClientRepositoryWrapper clientRepositoryWrapper, 
final AddressRepository addressRepository,
                        final ClientAddressRepositoryWrapper 
clientAddressRepositoryWrapper,
                        final AddressCommandFromApiJsonDeserializer 
fromApiJsonDeserializer) {
                this.context = context;
                this.codeValueRepository = codeValueRepository;
                this.clientAddressRepository = clientAddressRepository;
-               this.clientRepository = clientRepository;
+               this.clientRepositoryWrapper = clientRepositoryWrapper;
                this.addressRepository = addressRepository;
                this.clientAddressRepositoryWrapper = 
clientAddressRepositoryWrapper;
                this.fromApiJsonDeserializer = fromApiJsonDeserializer;
@@ -96,7 +96,7 @@ public class AddressWritePlatformServiceImpl implements 
AddressWritePlatformServ
                final Long addressid = add.getId();
                final Address addobj = this.addressRepository.getOne(addressid);
 
-               final Client client = this.clientRepository.getOne(clientId);
+               final Client client = 
this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId);
                final boolean isActive = 
command.booleanPrimitiveValueOfParameterNamed("isActive");
 
                final ClientAddress clientAddressobj = 
ClientAddress.fromJson(isActive, client, addobj, addressTypeIdObj);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java
index be01e2b..1851483 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java
@@ -49,7 +49,7 @@ import 
org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper;
 import org.apache.fineract.portfolio.group.domain.Group;
 import org.apache.fineract.portfolio.group.domain.GroupRepositoryWrapper;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
-import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
 import 
org.apache.fineract.portfolio.loanaccount.service.LoanWritePlatformService;
 import org.joda.time.LocalDate;
@@ -69,7 +69,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl 
implements CalendarWr
     private final LoanWritePlatformService loanWritePlatformService;
     private final ConfigurationDomainService configurationDomainService;
     private final GroupRepositoryWrapper groupRepository;
-    private final LoanRepository loanRepository;
+    private final LoanRepositoryWrapper loanRepositoryWrapper;
     private final ClientRepositoryWrapper clientRepository;
 
     @Autowired
@@ -78,7 +78,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl 
implements CalendarWr
             final CalendarCommandFromApiJsonDeserializer 
fromApiJsonDeserializer,
             final CalendarInstanceRepository calendarInstanceRepository, final 
LoanWritePlatformService loanWritePlatformService,
             final ConfigurationDomainService configurationDomainService, final 
GroupRepositoryWrapper groupRepository,
-            final LoanRepository loanRepository, final ClientRepositoryWrapper 
clientRepository) {
+            final LoanRepositoryWrapper loanRepositoryWrapper, final 
ClientRepositoryWrapper clientRepository) {
         this.calendarRepository = calendarRepository;
         this.calendarHistoryRepository = calendarHistoryRepository;
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
@@ -86,7 +86,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl 
implements CalendarWr
         this.loanWritePlatformService = loanWritePlatformService;
         this.configurationDomainService = configurationDomainService;
         this.groupRepository = groupRepository;
-        this.loanRepository = loanRepository;
+        this.loanRepositoryWrapper = loanRepositoryWrapper;
         this.clientRepository = clientRepository;
     }
 
@@ -104,7 +104,7 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl 
implements CalendarWr
             entityType = centerOrGroup.isCenter() ? CalendarEntityType.CENTERS 
: CalendarEntityType.GROUPS;
             entityId = command.getGroupId();
         } else if (command.getLoanId() != null) {
-            final Loan loan = this.loanRepository.findOne(command.getLoanId());
+            final Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(command.getLoanId(), 
true);
             entityActivationDate = (loan.getApprovedOnDate() == null) ? 
loan.getSubmittedOnDate() : loan.getApprovedOnDate();
             entityType = CalendarEntityType.LOANS;
             entityId = command.getLoanId();

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
index 82b994b..a857b4b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java
@@ -54,8 +54,6 @@ import org.apache.fineract.organisation.office.domain.Office;
 import org.apache.fineract.organisation.staff.domain.Staff;
 import org.apache.fineract.portfolio.client.api.ClientApiConstants;
 import org.apache.fineract.portfolio.group.domain.Group;
-import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
-import org.apache.fineract.portfolio.savings.domain.SavingsProduct;
 import org.apache.fineract.useradministration.domain.AppUser;
 import org.joda.time.LocalDate;
 import org.joda.time.format.DateTimeFormatter;
@@ -132,7 +130,7 @@ public final class Client extends AbstractPersistable<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 SavingsProduct SavingsProduct() {
-        return this.savingsProduct;
+    public Long savingsProductId() {
+        return this.savingsProductId;
     }
 
-    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() ;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
index 1dbe0b9..a9624b5 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java
@@ -25,7 +25,6 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.codes.domain.CodeValue;
-import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.portfolio.address.domain.Address;
 import org.springframework.data.jpa.domain.AbstractPersistable;
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepository.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepository.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepository.java
index c1f9c27..e718265 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepository.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepository.java
@@ -21,6 +21,6 @@ package org.apache.fineract.portfolio.client.domain;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
-public interface ClientRepository extends JpaRepository<Client, Long>, 
JpaSpecificationExecutor<Client> {
+abstract interface ClientRepository extends JpaRepository<Client, Long>, 
JpaSpecificationExecutor<Client> {
     // no added behaviour
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepositoryWrapper.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepositoryWrapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepositoryWrapper.java
index 27840ee..bdfccb9 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepositoryWrapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientRepositoryWrapper.java
@@ -18,11 +18,15 @@
  */
 package org.apache.fineract.portfolio.client.domain;
 
+import java.util.Collection;
+import java.util.List;
+
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.portfolio.client.exception.ClientNotActiveException;
 import org.apache.fineract.portfolio.client.exception.ClientNotFoundException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <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);
     }

Reply via email to