fineract-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From av...@apache.org
Subject [04/19] fineract git commit: all modules populate & import
Date Wed, 13 Dec 2017 09:03:17 GMT
http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookPopulatorServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookPopulatorServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookPopulatorServiceImpl.java
new file mode 100644
index 0000000..c329ef4
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookPopulatorServiceImpl.java
@@ -0,0 +1,674 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.infrastructure.bulkimport.service;
+
+import org.apache.fineract.accounting.glaccount.data.GLAccountData;
+import org.apache.fineract.accounting.glaccount.service.GLAccountReadPlatformService;
+import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
+import org.apache.fineract.infrastructure.bulkimport.data.GlobalEntityType;
+import org.apache.fineract.infrastructure.bulkimport.populator.*;
+import org.apache.fineract.infrastructure.bulkimport.populator.centers.CentersWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.chartofaccounts.ChartOfAccountsWorkbook;
+import org.apache.fineract.infrastructure.bulkimport.populator.client.ClientEntityWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.client.ClientPersonWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.fixeddeposits.FixedDepositTransactionWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.fixeddeposits.FixedDepositWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.group.GroupsWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.guarantor.GuarantorWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.journalentry.JournalEntriesWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.loan.LoanWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.loanrepayment.LoanRepaymentWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.office.OfficeWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.recurringdeposit.RecurringDepositTransactionWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.recurringdeposit.RecurringDepositWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.savings.SavingsTransactionsWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.savings.SavingsWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.shareaccount.SharedAccountWorkBookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.staff.StaffWorkbookPopulator;
+import org.apache.fineract.infrastructure.bulkimport.populator.users.UserWorkbookPopulator;
+import org.apache.fineract.infrastructure.codes.data.CodeValueData;
+import org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService;
+import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException;
+import org.apache.fineract.infrastructure.core.service.DateUtils;
+import org.apache.fineract.infrastructure.core.service.Page;
+import org.apache.fineract.infrastructure.core.service.SearchParameters;
+import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
+import org.apache.fineract.organisation.monetary.data.CurrencyData;
+import org.apache.fineract.organisation.monetary.service.CurrencyReadPlatformService;
+import org.apache.fineract.organisation.office.data.OfficeData;
+import org.apache.fineract.organisation.office.service.OfficeReadPlatformService;
+import org.apache.fineract.organisation.staff.data.StaffData;
+import org.apache.fineract.organisation.staff.service.StaffReadPlatformService;
+import org.apache.fineract.portfolio.charge.data.ChargeData;
+import org.apache.fineract.portfolio.charge.service.ChargeReadPlatformService;
+import org.apache.fineract.portfolio.client.data.ClientData;
+import org.apache.fineract.portfolio.client.service.ClientReadPlatformService;
+import org.apache.fineract.portfolio.fund.data.FundData;
+import org.apache.fineract.portfolio.fund.service.FundReadPlatformService;
+import org.apache.fineract.portfolio.group.api.GroupingTypesApiConstants;
+import org.apache.fineract.portfolio.group.data.CenterData;
+import org.apache.fineract.portfolio.group.data.GroupGeneralData;
+import org.apache.fineract.portfolio.group.service.CenterReadPlatformService;
+import org.apache.fineract.portfolio.group.service.GroupReadPlatformService;
+import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData;
+import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService;
+import org.apache.fineract.portfolio.loanproduct.data.LoanProductData;
+import org.apache.fineract.portfolio.loanproduct.service.LoanProductReadPlatformService;
+import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData;
+import org.apache.fineract.portfolio.paymenttype.service.PaymentTypeReadPlatformService;
+import org.apache.fineract.portfolio.products.data.ProductData;
+import org.apache.fineract.portfolio.products.service.ProductReadPlatformService;
+import org.apache.fineract.portfolio.savings.DepositAccountType;
+import org.apache.fineract.portfolio.savings.data.*;
+import org.apache.fineract.portfolio.savings.service.DepositProductReadPlatformService;
+import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService;
+import org.apache.fineract.portfolio.savings.service.SavingsProductReadPlatformService;
+import org.apache.fineract.portfolio.shareproducts.data.ShareProductData;
+import org.apache.fineract.useradministration.data.RoleData;
+import org.apache.fineract.useradministration.service.RoleReadPlatformService;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkbookPopulatorService {
+
+  private final PlatformSecurityContext context;
+  private final OfficeReadPlatformService officeReadPlatformService;
+  private final StaffReadPlatformService staffReadPlatformService;
+  private final ClientReadPlatformService clientReadPlatformService;
+  private final CenterReadPlatformService centerReadPlatformService;
+  private final GroupReadPlatformService groupReadPlatformService;
+  private final FundReadPlatformService fundReadPlatformService;
+  private final PaymentTypeReadPlatformService paymentTypeReadPlatformService;
+  private final LoanProductReadPlatformService loanProductReadPlatformService;
+  private final CurrencyReadPlatformService currencyReadPlatformService;
+  private final LoanReadPlatformService loanReadPlatformService;
+  private final GLAccountReadPlatformService glAccountReadPlatformService;
+  private final SavingsAccountReadPlatformService savingsAccountReadPlatformService;
+  private final CodeValueReadPlatformService codeValueReadPlatformService;
+  private final SavingsProductReadPlatformService savingsProductReadPlatformService;
+  private final ProductReadPlatformService productReadPlatformService;
+  private final ChargeReadPlatformService chargeReadPlatformService;
+  private final DepositProductReadPlatformService depositProductReadPlatformService;
+  private final RoleReadPlatformService roleReadPlatformService;
+  
+  @Autowired
+  public BulkImportWorkbookPopulatorServiceImpl(final PlatformSecurityContext context,
+      final OfficeReadPlatformService officeReadPlatformService,
+      final StaffReadPlatformService staffReadPlatformService,
+      final ClientReadPlatformService clientReadPlatformService,
+      final CenterReadPlatformService centerReadPlatformService,
+      final GroupReadPlatformService groupReadPlatformService,
+      final FundReadPlatformService fundReadPlatformService,
+      final PaymentTypeReadPlatformService paymentTypeReadPlatformService,
+      final LoanProductReadPlatformService loanProductReadPlatformService,
+      final CurrencyReadPlatformService currencyReadPlatformService,
+      final LoanReadPlatformService loanReadPlatformService,
+      final GLAccountReadPlatformService glAccountReadPlatformService,
+      final SavingsAccountReadPlatformService savingsAccountReadPlatformService,
+		final CodeValueReadPlatformService codeValueReadPlatformService,
+		final SavingsProductReadPlatformService savingsProductReadPlatformService,
+		  final ProductReadPlatformService productReadPlatformService,
+		  final ChargeReadPlatformService chargeReadPlatformService,
+		  final DepositProductReadPlatformService depositProductReadPlatformService,
+		  final RoleReadPlatformService roleReadPlatformService) {
+    this.officeReadPlatformService = officeReadPlatformService;
+    this.staffReadPlatformService = staffReadPlatformService;
+    this.context = context;
+    this.clientReadPlatformService=clientReadPlatformService;
+    this.centerReadPlatformService=centerReadPlatformService;
+    this.groupReadPlatformService=groupReadPlatformService;
+    this.fundReadPlatformService=fundReadPlatformService;
+    this.paymentTypeReadPlatformService=paymentTypeReadPlatformService;
+    this.loanProductReadPlatformService=loanProductReadPlatformService;
+    this.currencyReadPlatformService=currencyReadPlatformService;
+    this.loanReadPlatformService=loanReadPlatformService;
+    this.glAccountReadPlatformService=glAccountReadPlatformService;
+    this.savingsAccountReadPlatformService=savingsAccountReadPlatformService;
+    this.codeValueReadPlatformService=codeValueReadPlatformService;
+    this.savingsProductReadPlatformService=savingsProductReadPlatformService;
+    this.productReadPlatformService=productReadPlatformService;
+    this.chargeReadPlatformService=chargeReadPlatformService;
+    this.depositProductReadPlatformService=depositProductReadPlatformService;
+    this.roleReadPlatformService=roleReadPlatformService;
+  }
+
+	@Override
+	public Response getTemplate(String entityType, Long officeId, Long staffId,final String dateFormat) {
+		WorkbookPopulator populator=null;
+		final Workbook workbook=new HSSFWorkbook();
+		if(entityType!=null){
+			if (entityType.trim().equalsIgnoreCase(GlobalEntityType.CLIENTS_PERSON.toString())||
+					entityType.trim().equalsIgnoreCase(GlobalEntityType.CLIENTS_ENTTTY.toString())) {
+				populator = populateClientWorkbook(entityType,officeId, staffId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.CENTERS.toString())) {
+				populator=populateCenterWorkbook(officeId,staffId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.GROUPS.toString())) {
+				populator = populateGroupsWorkbook(officeId, staffId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.LOANS.toString())) {
+				populator = populateLoanWorkbook(officeId, staffId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.LOAN_TRANSACTIONS.toString())) {
+				populator = populateLoanRepaymentWorkbook(officeId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.GL_JOURNAL_ENTRIES.toString())) {
+				populator = populateJournalEntriesWorkbook(officeId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.GUARANTORS.toString())) {
+				populator = populateGuarantorWorkbook(officeId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.OFFICES.toString())) {
+				populator=populateOfficeWorkbook();
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.CHART_OF_ACCOUNTS.toString())) {
+				populator=populateChartOfAccountsWorkbook();
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.STAFF.toString())) {
+				populator=populateStaffWorkbook(officeId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.SHARE_ACCOUNTS.toString())) {
+				populator=populateSharedAcountsWorkbook(officeId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.SAVINGS_ACCOUNT.toString())) {
+				populator=populateSavingsAccountWorkbook(officeId,staffId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.SAVINGS_TRANSACTIONS.toString())) {
+				populator=populateSavingsTransactionWorkbook(officeId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.RECURRING_DEPOSIT_ACCOUNTS.toString())) {
+				populator=populateRecurringDepositWorkbook(officeId,staffId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.RECURRING_DEPOSIT_ACCOUNTS_TRANSACTIONS.toString())) {
+				populator=populateRecurringDepositTransactionWorkbook(officeId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.FIXED_DEPOSIT_ACCOUNTS.toString())) {
+				populator = populateFixedDepositWorkbook(officeId, staffId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.FIXED_DEPOSIT_TRANSACTIONS.toString())){
+				populator=populateFixedDepositTransactionsWorkbook(officeId);
+			}else if (entityType.trim().equalsIgnoreCase(GlobalEntityType.USERS.toString())){
+				populator=populateUserWorkbook(officeId,staffId);
+			}else {
+				throw new GeneralPlatformDomainRuleException("error.msg.unable.to.find.resource",
+						"Unable to find requested resource");
+			}
+			populator.populate(workbook,dateFormat);
+			return buildResponse(workbook, entityType);
+		}else {
+			throw new GeneralPlatformDomainRuleException("error.msg.given.entity.type.null",
+					"Given Entity type is null");
+		}
+	}
+
+
+	private WorkbookPopulator populateClientWorkbook(final String entityType ,final Long officeId, final Long staffId) {
+    this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+    this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.STAFF_ENTITY_TYPE);
+    List<OfficeData> offices = fetchOffices(officeId);
+    List<StaffData> staff = fetchStaff(staffId);
+    List<CodeValueData> clientTypeCodeValues =fetchCodeValuesByCodeName("ClientType");
+	List<CodeValueData> clientClassification=fetchCodeValuesByCodeName("ClientClassification");
+	List<CodeValueData> addressTypesCodeValues=fetchCodeValuesByCodeName("ADDRESS_TYPE");
+	List<CodeValueData> stateProvinceCodeValues=fetchCodeValuesByCodeName("STATE");
+	List<CodeValueData> countryCodeValues=fetchCodeValuesByCodeName("COUNTRY");
+	if(entityType.trim().equalsIgnoreCase(GlobalEntityType.CLIENTS_PERSON.toString())) {
+		List<CodeValueData> genderCodeValues = fetchCodeValuesByCodeName("Gender");
+		return new ClientPersonWorkbookPopulator(new OfficeSheetPopulator(offices),
+				new PersonnelSheetPopulator(staff, offices), clientTypeCodeValues, genderCodeValues, clientClassification
+				, addressTypesCodeValues, stateProvinceCodeValues, countryCodeValues);
+	}else if(entityType.trim().equalsIgnoreCase(GlobalEntityType.CLIENTS_ENTTTY.toString())){
+		List<CodeValueData> constitutionCodeValues=fetchCodeValuesByCodeName("Constitution");
+		List<CodeValueData> mainBusinessline=fetchCodeValuesByCodeName("Main Business Line");
+		return new ClientEntityWorkbookPopulator(new OfficeSheetPopulator(offices),
+				new PersonnelSheetPopulator(staff, offices), clientTypeCodeValues, constitutionCodeValues,mainBusinessline,
+				clientClassification, addressTypesCodeValues, stateProvinceCodeValues, countryCodeValues);
+	}
+	  return null;
+  }
+
+  private Response buildResponse(final Workbook workbook, final String entity) {
+    String filename = entity + DateUtils.getLocalDateOfTenant().toString() + ".xls";
+    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    try {
+      workbook.write(baos);
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+
+    final ResponseBuilder response = Response.ok(baos.toByteArray());
+    response.header("Content-Disposition", "attachment; filename=\"" + filename + "\"");
+    response.header("Content-Type", "application/vnd.ms-excel");
+    return response.build();
+  }
+
+  @SuppressWarnings("unchecked")
+  private List<OfficeData> fetchOffices(final Long officeId) {
+    List<OfficeData> offices = null;
+    if (officeId == null) {
+      Boolean includeAllOffices = Boolean.TRUE;
+      offices = (List) this.officeReadPlatformService.retrieveAllOffices(includeAllOffices, null);
+    } else {
+      offices = new ArrayList<>();
+      offices.add(this.officeReadPlatformService.retrieveOffice(officeId));
+    }
+    return offices;
+  }
+
+  @SuppressWarnings("unchecked")
+  private List<StaffData> fetchStaff(final Long staffId) {
+    List<StaffData> staff = null;
+    if (staffId == null){
+      staff =
+          (List) this.staffReadPlatformService.retrieveAllStaff(null, null, Boolean.FALSE, null);
+    //System.out.println("Staff List size : "+staff.size());
+    }else {
+      staff = new ArrayList<>();
+      staff.add(this.staffReadPlatformService.retrieveStaff(staffId));
+    }
+    return staff;
+  }
+  private List<CodeValueData> fetchCodeValuesByCodeName(String codeName){
+  	List<CodeValueData> codeValues=null;
+  	if (codeName!=null){
+  		codeValues=(List)codeValueReadPlatformService.retrieveCodeValuesByCode(codeName);
+	}else {
+	 	throw new NullPointerException();
+	}
+	return codeValues;
+  }
+  private List<SavingsProductData>fetchSavingsProducts(){
+  	List<SavingsProductData> savingsProducts=(List)savingsProductReadPlatformService.retrieveAll();
+	return savingsProducts;
+  }
+
+private WorkbookPopulator populateCenterWorkbook(Long officeId,Long staffId){
+	 this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+	 this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.STAFF_ENTITY_TYPE);
+	this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.GROUP_ENTITY_TYPE);
+	 List<OfficeData> offices = fetchOffices(officeId);
+	List<StaffData> staff = fetchStaff(staffId);
+	List<GroupGeneralData> groups = fetchGroups(officeId);
+	return new CentersWorkbookPopulator(new OfficeSheetPopulator(offices),
+	        new PersonnelSheetPopulator(staff, offices),new GroupSheetPopulator(groups,offices));
+}
+
+	private WorkbookPopulator populateGroupsWorkbook(Long officeId, Long staffId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.STAFF_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CENTER_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<StaffData> staff = fetchStaff(staffId);
+		List<CenterData> centers = fetchCenters(officeId);
+		List<ClientData> clients = fetchClients(officeId);
+		return new GroupsWorkbookPopulator(new OfficeSheetPopulator(offices),
+				new PersonnelSheetPopulator(staff, offices), new CenterSheetPopulator(centers, offices),
+				new ClientSheetPopulator(clients, offices));
+	}
+	private List<CenterData> fetchCenters(Long officeId) {
+		List<CenterData>centers=null;
+		if (officeId==null) {
+			centers=(List<CenterData>) this.centerReadPlatformService.retrieveAll(null, null);
+		} else {
+			SearchParameters searchParameters = SearchParameters.from(null, officeId, null, null, null);
+			centers = (List<CenterData>)centerReadPlatformService.retrieveAll(searchParameters,null);
+		}
+		
+		return centers;
+	}
+	private List<ClientData> fetchClients(Long officeId) {
+		List<ClientData> clients=null;
+		if (officeId==null) {
+			Page<ClientData> clientDataPage =this.clientReadPlatformService.retrieveAll(null);
+			if (clientDataPage!=null){
+				clients=new ArrayList<>();
+				for (ClientData client: clientDataPage.getPageItems()) {
+					clients.add(client);
+				}
+			}
+		} else {
+			SearchParameters searchParameters = SearchParameters.from(null, officeId, null, null, null);
+			Page<ClientData> clientDataPage =this.clientReadPlatformService.retrieveAll(searchParameters);
+			if (clientDataPage!=null){
+				clients=new ArrayList<>();
+				for (ClientData client: clientDataPage.getPageItems()) {
+					clients.add(client);
+				}
+			}
+		}
+		return clients;
+	}
+
+
+	private WorkbookPopulator populateLoanWorkbook(Long officeId, Long staffId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.STAFF_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.GROUP_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.LOAN_PRODUCT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.FUNDS_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.PAYMENT_TYPE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CURRENCY_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<StaffData> staff = fetchStaff(staffId);
+		List<ClientData> clients = fetchClients(officeId);
+		List<GroupGeneralData> groups = fetchGroups(officeId);
+		List<LoanProductData> loanproducts = fetchLoanProducts();
+		List<FundData> funds = fetchFunds();
+		List<PaymentTypeData> paymentTypes = fetchPaymentTypes();
+		List<CurrencyData> currencies = fetchCurrencies();
+		return new LoanWorkbookPopulator(new OfficeSheetPopulator(offices), new ClientSheetPopulator(clients, offices),
+				new GroupSheetPopulator(groups, offices), new PersonnelSheetPopulator(staff, offices),
+				new LoanProductSheetPopulator(loanproducts), new ExtrasSheetPopulator(funds, paymentTypes, currencies));
+	}
+
+	private List<CurrencyData> fetchCurrencies() {
+		List<CurrencyData> currencies =(List<CurrencyData>) this.currencyReadPlatformService.
+				retrieveAllPlatformCurrencies();
+		return currencies;
+	}
+
+	private List<PaymentTypeData> fetchPaymentTypes() {
+		List<PaymentTypeData> paymentTypeData =(List<PaymentTypeData>) this.paymentTypeReadPlatformService
+				.retrieveAllPaymentTypes();
+		return paymentTypeData;
+	}
+
+	private List<FundData> fetchFunds() {
+		List<FundData> funds =(List<FundData>) this.fundReadPlatformService.retrieveAllFunds();
+		return funds;
+	}
+
+	private List<LoanProductData> fetchLoanProducts() {
+		List<LoanProductData>loanproducts =(List<LoanProductData>) this.loanProductReadPlatformService
+				.retrieveAllLoanProducts();
+		return loanproducts;
+	}
+
+	private List<GroupGeneralData> fetchGroups(Long officeId) {
+		List<GroupGeneralData> groups = null;
+		if (officeId == null) {
+			groups = (List<GroupGeneralData>) this.groupReadPlatformService.retrieveAll(null, null);
+		} else {
+			SearchParameters searchParameters = SearchParameters.from(null, officeId, null, null, null);
+			groups = (List<GroupGeneralData>)groupReadPlatformService.retrieveAll(searchParameters,null);
+		}
+
+		return groups;
+	}
+
+	private WorkbookPopulator populateLoanRepaymentWorkbook(Long officeId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.FUNDS_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.PAYMENT_TYPE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CURRENCY_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<ClientData> clients = fetchClients(officeId);
+		List<FundData> funds = fetchFunds();
+		List<PaymentTypeData> paymentTypes = fetchPaymentTypes();
+		List<CurrencyData> currencies = fetchCurrencies();
+		List<LoanAccountData> loans = fetchLoanAccounts(officeId);
+		return new LoanRepaymentWorkbookPopulator(loans, new OfficeSheetPopulator(offices),
+				new ClientSheetPopulator(clients, offices), new ExtrasSheetPopulator(funds, paymentTypes, currencies));
+	}
+
+	private List<LoanAccountData> fetchLoanAccounts(final Long officeId) {
+		List<LoanAccountData> loanAccounts = null;
+		if(officeId==null){
+			loanAccounts= loanReadPlatformService.retrieveAll(null).getPageItems();
+		}else {
+			SearchParameters searchParameters = SearchParameters.from(null, officeId, null, null, null);
+			loanAccounts = loanReadPlatformService.retrieveAll(searchParameters).getPageItems();
+		}
+		return loanAccounts;
+	}
+
+	private WorkbookPopulator populateJournalEntriesWorkbook(Long officeId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.GL_ACCOUNT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.FUNDS_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.PAYMENT_TYPE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CURRENCY_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<GLAccountData> glAccounts = fetchGLAccounts();
+		List<FundData> funds = fetchFunds();
+		List<PaymentTypeData> paymentTypes = fetchPaymentTypes();
+		List<CurrencyData> currencies = fetchCurrencies();
+		return new JournalEntriesWorkbookPopulator(new OfficeSheetPopulator(offices),
+				new GlAccountSheetPopulator(glAccounts), new ExtrasSheetPopulator(funds, paymentTypes, currencies));
+	}
+
+	private List<GLAccountData> fetchGLAccounts() {
+		List<GLAccountData> glaccounts = (List<GLAccountData>) this.glAccountReadPlatformService.
+				retrieveAllGLAccounts(null, null, null,
+					null, null, null);
+		return glaccounts;
+	}
+
+	private WorkbookPopulator populateGuarantorWorkbook(Long officeId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.STAFF_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<ClientData>clients=fetchClients(officeId);
+		List<LoanAccountData> loans = fetchLoanAccounts(officeId);
+		List<SavingsAccountData> savingsaccounts = fetchSavingsAccounts(officeId);
+		List<CodeValueData> guarantorRelationshipTypes=fetchCodeValuesByCodeName("GuarantorRelationship");
+		return new GuarantorWorkbookPopulator(new OfficeSheetPopulator(offices),
+				new ClientSheetPopulator(clients, offices),loans,savingsaccounts,guarantorRelationshipTypes);
+	}
+
+	private List<SavingsAccountData> fetchSavingsAccounts(Long officeId) {
+		List<SavingsAccountData> savingsAccounts=null;
+		if (officeId!=null) {
+			String activeAccounts="sa.status_enum = 300";
+			SearchParameters searchParameters = SearchParameters.from(activeAccounts, officeId, null, null, null);
+			savingsAccounts = savingsAccountReadPlatformService.retrieveAll(searchParameters).getPageItems();;
+		}else {
+			savingsAccounts= savingsAccountReadPlatformService.retrieveAll(null).getPageItems();
+		}
+		return savingsAccounts;
+	}
+
+
+	private WorkbookPopulator populateOfficeWorkbook() {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(null);
+		return new OfficeWorkbookPopulator(offices);
+	}
+
+
+
+
+	private WorkbookPopulator populateChartOfAccountsWorkbook() {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.GL_ACCOUNT_ENTITY_TYPE);
+		List<GLAccountData> glAccounts = fetchGLAccounts();
+		return new ChartOfAccountsWorkbook(glAccounts);
+	}
+
+
+	private WorkbookPopulator populateStaffWorkbook(Long officeId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		List<OfficeData> offices=fetchOffices(officeId);
+		return new StaffWorkbookPopulator(new OfficeSheetPopulator(offices));
+	}
+
+
+
+	private WorkbookPopulator populateSharedAcountsWorkbook(Long officeId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.SHARED_ACCOUNT_ENTITY_TYPE);
+		List<ShareProductData> shareProductDataList=fetchSharedProducts();
+		List<ChargeData> chargesForShares=fetchChargesForShares();
+		List<ClientData> clientDataList=fetchClients(officeId);
+		List<OfficeData>officeDataList=fetchOffices(officeId);
+		List<SavingsAccountData> savingsAccounts = fetchSavingsAccounts(officeId);
+		return new SharedAccountWorkBookPopulator(new SharedProductsSheetPopulator(shareProductDataList,chargesForShares),
+				new ClientSheetPopulator(clientDataList,officeDataList),new SavingsAccountSheetPopulator(savingsAccounts));
+	}
+
+	private List<ChargeData> fetchChargesForShares() {
+		List<ChargeData>chargesForShares=(List<ChargeData>) chargeReadPlatformService.retrieveSharesApplicableCharges();
+		return chargesForShares;
+	}
+
+	private List<ShareProductData> fetchSharedProducts() {
+		List<ProductData> productDataList = productReadPlatformService.retrieveAllProducts(0,50).getPageItems() ;
+		List<ShareProductData> sharedProductDataList=new ArrayList<>();
+		if(productDataList!=null) {
+			for (ProductData data : productDataList) {
+				ShareProductData shareProduct = (ShareProductData) data;
+				sharedProductDataList.add(shareProduct);
+			}
+		}
+		return sharedProductDataList;
+	}
+
+
+	private WorkbookPopulator populateSavingsAccountWorkbook(Long officeId, Long staffId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.STAFF_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.GROUP_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.SAVINGS_PRODUCT_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<StaffData> staff = fetchStaff(staffId);
+		List<ClientData> clients = fetchClients(officeId);
+		List<GroupGeneralData> groups = fetchGroups(officeId);
+		List<SavingsProductData> savingsProducts=fetchSavingsProducts();
+		return new SavingsWorkbookPopulator(new OfficeSheetPopulator(offices), new ClientSheetPopulator(clients, offices),
+				new GroupSheetPopulator(groups, offices), new PersonnelSheetPopulator(staff, offices),
+				new SavingsProductSheetPopulator(savingsProducts));
+	}
+
+
+
+	private WorkbookPopulator populateSavingsTransactionWorkbook(Long officeId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.FUNDS_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.PAYMENT_TYPE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CURRENCY_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<ClientData> clients = fetchClients(officeId);
+		List<FundData> funds = fetchFunds();
+		List<PaymentTypeData> paymentTypes = fetchPaymentTypes();
+		List<CurrencyData> currencies = fetchCurrencies();
+		List<SavingsAccountData> savingsAccounts=fetchSavingsAccounts(officeId);
+		return new SavingsTransactionsWorkbookPopulator(new OfficeSheetPopulator(offices), new ClientSheetPopulator(clients, offices),
+				 new ExtrasSheetPopulator(funds, paymentTypes, currencies),savingsAccounts);
+	}
+
+
+	private WorkbookPopulator populateRecurringDepositWorkbook(Long officeId,Long staffId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.STAFF_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.RECURRING_DEPOSIT_PRODUCT_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<ClientData> clients = fetchClients(officeId);
+		List<StaffData> staff = fetchStaff(staffId);
+		List<RecurringDepositProductData> recurringDepositProducts = fetchRecurringDepositProducts();
+		return new RecurringDepositWorkbookPopulator(new OfficeSheetPopulator(offices), new ClientSheetPopulator(clients, offices),
+				new PersonnelSheetPopulator(staff,offices),new RecurringDepositProductSheetPopulator(recurringDepositProducts));
+	}
+
+	private List<RecurringDepositProductData> fetchRecurringDepositProducts() {
+		List<DepositProductData> depositProducts=(List<DepositProductData>)depositProductReadPlatformService
+				.retrieveAll(DepositAccountType.RECURRING_DEPOSIT);
+		List<RecurringDepositProductData> recurringDepositProducts=new ArrayList<>();
+		for (DepositProductData depositproduct: depositProducts) {
+			RecurringDepositProductData recurringDepositProduct= (RecurringDepositProductData) depositproduct;
+			recurringDepositProducts.add(recurringDepositProduct);
+		}
+		return recurringDepositProducts;
+	}
+
+
+
+	private WorkbookPopulator populateRecurringDepositTransactionWorkbook(Long officeId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.FUNDS_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.PAYMENT_TYPE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CURRENCY_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<ClientData> clients = fetchClients(officeId);
+		List<FundData> funds = fetchFunds();
+		List<PaymentTypeData> paymentTypes = fetchPaymentTypes();
+		List<CurrencyData> currencies = fetchCurrencies();
+		List<SavingsAccountData> savingsAccounts=fetchSavingsAccounts(officeId);
+		return new RecurringDepositTransactionWorkbookPopulator(new OfficeSheetPopulator(offices), new ClientSheetPopulator(clients, offices),
+				new ExtrasSheetPopulator(funds, paymentTypes, currencies),savingsAccounts);
+	}
+
+	private WorkbookPopulator populateFixedDepositWorkbook(Long officeId, Long staffId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.STAFF_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.FIXED_DEPOSIT_PRODUCT_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<ClientData> clients = fetchClients(officeId);
+		List<StaffData> staff = fetchStaff(staffId);
+		List<FixedDepositProductData> fixedDepositProducts = fetchFixedDepositProducts();
+		return new FixedDepositWorkbookPopulator(new OfficeSheetPopulator(offices), new ClientSheetPopulator(clients, offices),
+				new PersonnelSheetPopulator(staff,offices),new FixedDepositProductSheetPopulator(fixedDepositProducts));
+
+
+	}
+
+	private List<FixedDepositProductData> fetchFixedDepositProducts() {
+		List<DepositProductData> depositProducts=(List<DepositProductData>)depositProductReadPlatformService
+				.retrieveAll(DepositAccountType.FIXED_DEPOSIT);
+		List<FixedDepositProductData> fixedDepositProducts=new ArrayList<>();
+		for (DepositProductData depositproduct: depositProducts) {
+			FixedDepositProductData fixedDepositProduct= (FixedDepositProductData) depositproduct;
+			fixedDepositProducts.add(fixedDepositProduct);
+		}
+		return fixedDepositProducts;
+
+	}
+
+	private WorkbookPopulator populateUserWorkbook(Long officeId, Long staffId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.USER_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<StaffData> staff = fetchStaff(staffId);
+		List<RoleData> roles=fetchRoles();
+		return new UserWorkbookPopulator(new OfficeSheetPopulator(offices), new PersonnelSheetPopulator(staff,offices),
+				new RoleSheetPopulator(roles));
+	}
+
+	private List<RoleData> fetchRoles() {
+		List<RoleData> rolesList= (List<RoleData>) roleReadPlatformService.retrieveAllActiveRoles();
+		return rolesList;
+	}
+
+	private WorkbookPopulator populateFixedDepositTransactionsWorkbook(Long officeId) {
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.OFFICE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CLIENT_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.FUNDS_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.PAYMENT_TYPE_ENTITY_TYPE);
+		this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.CURRENCY_ENTITY_TYPE);
+		List<OfficeData> offices = fetchOffices(officeId);
+		List<ClientData> clients = fetchClients(officeId);
+		List<FundData> funds = fetchFunds();
+		List<PaymentTypeData> paymentTypes = fetchPaymentTypes();
+		List<CurrencyData> currencies = fetchCurrencies();
+		List<SavingsAccountData> savingsAccounts=fetchSavingsAccounts(officeId);
+		return new FixedDepositTransactionWorkbookPopulator(new OfficeSheetPopulator(offices), new ClientSheetPopulator(clients, offices),
+				new ExtrasSheetPopulator(funds, paymentTypes, currencies),savingsAccounts);
+	}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookService.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookService.java
new file mode 100644
index 0000000..c0ce1a9
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookService.java
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.infrastructure.bulkimport.service;
+
+import com.sun.jersey.core.header.FormDataContentDisposition;
+import org.apache.fineract.infrastructure.bulkimport.data.GlobalEntityType;
+import org.apache.fineract.infrastructure.bulkimport.data.ImportData;
+import org.apache.fineract.infrastructure.documentmanagement.data.DocumentData;
+
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+import java.util.Collection;
+
+public interface BulkImportWorkbookService {
+
+    public Long importWorkbook(String entityType, InputStream inputStream, FormDataContentDisposition fileDetail,
+            final String locale, final String dateFormat);
+    public Collection<ImportData> getImports(GlobalEntityType type);
+
+    public DocumentData getOutputTemplateLocation(String importDocumentId);
+
+    public Response getOutputTemplate(String importDocumentId);
+
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java
new file mode 100644
index 0000000..b8f199c
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java
@@ -0,0 +1,296 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE multipartFile
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this multipartFile
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this multipartFile except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.infrastructure.bulkimport.service;
+
+import com.google.common.io.Files;
+import com.sun.jersey.core.header.FormDataContentDisposition;
+import org.apache.fineract.infrastructure.bulkimport.data.BulkImportEvent;
+import org.apache.fineract.infrastructure.bulkimport.data.GlobalEntityType;
+import org.apache.fineract.infrastructure.bulkimport.data.ImportData;
+import org.apache.fineract.infrastructure.bulkimport.data.ImportFormatType;
+import org.apache.fineract.infrastructure.bulkimport.domain.ImportDocument;
+import org.apache.fineract.infrastructure.bulkimport.domain.ImportDocumentRepository;
+import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler;
+import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils;
+import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
+import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException;
+import org.apache.fineract.infrastructure.core.service.DateUtils;
+import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
+import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
+import org.apache.fineract.infrastructure.documentmanagement.data.DocumentData;
+import org.apache.fineract.infrastructure.documentmanagement.domain.Document;
+import org.apache.fineract.infrastructure.documentmanagement.domain.DocumentRepository;
+import org.apache.fineract.infrastructure.documentmanagement.service.DocumentWritePlatformService;
+import org.apache.fineract.infrastructure.documentmanagement.service.DocumentWritePlatformServiceJpaRepositoryImpl;
+import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.tika.Tika;
+import org.apache.tika.io.IOUtils;
+import org.apache.tika.io.TikaInputStream;
+import org.joda.time.LocalDate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Service;
+
+import javax.ws.rs.core.Response;
+import java.io.*;
+import java.net.URLConnection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Collection;
+
+@Service
+public class BulkImportWorkbookServiceImpl implements BulkImportWorkbookService {
+    private final ApplicationContext applicationContext;
+    private final PlatformSecurityContext securityContext;
+    private final DocumentWritePlatformService documentWritePlatformService;
+    private final DocumentRepository documentRepository;
+    private final ImportDocumentRepository importDocumentRepository;
+    private final JdbcTemplate jdbcTemplate;
+
+    @Autowired
+    public BulkImportWorkbookServiceImpl(final ApplicationContext applicationContext,
+            final PlatformSecurityContext securityContext,
+            final DocumentWritePlatformService documentWritePlatformService,
+            final DocumentRepository documentRepository,
+            final ImportDocumentRepository importDocumentRepository, final RoutingDataSource dataSource) {
+        this.applicationContext = applicationContext;
+        this.securityContext = securityContext;
+        this.documentWritePlatformService = documentWritePlatformService;
+        this.documentRepository = documentRepository;
+        this.importDocumentRepository = importDocumentRepository;
+        this.jdbcTemplate = new JdbcTemplate(dataSource);
+    }
+
+    @Override
+    public Long importWorkbook(String entity, InputStream inputStream, FormDataContentDisposition fileDetail,
+            final String locale, final String dateFormat) {
+        try {
+            if (entity !=null && inputStream!=null &&fileDetail!=null&&locale!=null&&dateFormat!=null) {
+
+                final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                IOUtils.copy(inputStream, baos);
+                final byte[] bytes = baos.toByteArray();
+                InputStream clonedInputStream = new ByteArrayInputStream(bytes);
+                InputStream clonedInputStreamWorkbook =new ByteArrayInputStream(bytes);
+                final Tika tika = new Tika();
+                final TikaInputStream tikaInputStream = TikaInputStream.get(clonedInputStream);
+                final String fileType = tika.detect(tikaInputStream);
+                final String fileExtension = Files.getFileExtension(fileDetail.getFileName()).toLowerCase();
+                ImportFormatType format = ImportFormatType.of(fileExtension);
+                if (!fileType.contains("msoffice")) {
+                    throw new GeneralPlatformDomainRuleException("error.msg.invalid.file.extension",
+                            "Uploaded file extension is not recognized.");
+                }
+                Workbook workbook = new HSSFWorkbook(clonedInputStreamWorkbook);
+                GlobalEntityType entityType=null;
+                int primaryColumn=0;
+                ImportHandler importHandler = null;
+                if (entity.trim().equalsIgnoreCase(GlobalEntityType.CLIENTS_PERSON.toString())) {
+                    entityType = GlobalEntityType.CLIENTS_PERSON;
+                    primaryColumn = 0;
+                }else if(entity.trim().equalsIgnoreCase(GlobalEntityType.CLIENTS_ENTTTY.toString())){
+                    entityType = GlobalEntityType.CLIENTS_ENTTTY;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.CENTERS.toString())) {
+                    entityType = GlobalEntityType.CENTERS;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.GROUPS.toString())) {
+                    entityType = GlobalEntityType.GROUPS;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.LOANS.toString())) {
+                    entityType = GlobalEntityType.LOANS;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.LOAN_TRANSACTIONS.toString())) {
+                    entityType = GlobalEntityType.LOAN_TRANSACTIONS;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.GUARANTORS.toString())) {
+                    entityType = GlobalEntityType.GUARANTORS;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.OFFICES.toString())) {
+                    entityType = GlobalEntityType.OFFICES;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.CHART_OF_ACCOUNTS.toString())) {
+                    entityType = GlobalEntityType.CHART_OF_ACCOUNTS;
+                    primaryColumn = 0;
+                }else  if (entity.trim().equalsIgnoreCase(GlobalEntityType.GL_JOURNAL_ENTRIES.toString())) {
+                    entityType = GlobalEntityType.GL_JOURNAL_ENTRIES;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.STAFF.toString())) {
+                    entityType = GlobalEntityType.STAFF;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.SHARE_ACCOUNTS.toString())) {
+                    entityType = GlobalEntityType.SHARE_ACCOUNTS;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.SAVINGS_ACCOUNT.toString())) {
+                    entityType = GlobalEntityType.SAVINGS_ACCOUNT;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.SAVINGS_TRANSACTIONS.toString())) {
+                    entityType = GlobalEntityType.SAVINGS_TRANSACTIONS;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.RECURRING_DEPOSIT_ACCOUNTS.toString())) {
+                    entityType = GlobalEntityType.RECURRING_DEPOSIT_ACCOUNTS;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.RECURRING_DEPOSIT_ACCOUNTS_TRANSACTIONS.toString())) {
+                    entityType = GlobalEntityType.RECURRING_DEPOSIT_ACCOUNTS_TRANSACTIONS;
+                    primaryColumn = 0;
+                }else if (entity.trim().equalsIgnoreCase(GlobalEntityType.FIXED_DEPOSIT_ACCOUNTS.toString())) {
+                    entityType = GlobalEntityType.FIXED_DEPOSIT_ACCOUNTS;
+                    primaryColumn = 0;
+                }else  if (entity.trim().equalsIgnoreCase(GlobalEntityType.FIXED_DEPOSIT_TRANSACTIONS.toString())){
+                    entityType = GlobalEntityType.FIXED_DEPOSIT_TRANSACTIONS;
+                    primaryColumn = 0;
+                }else if(entity.trim().equalsIgnoreCase(GlobalEntityType.USERS.toString())){
+                    entityType = GlobalEntityType.USERS;
+                    primaryColumn = 0;
+                }else{
+                    throw new GeneralPlatformDomainRuleException("error.msg.unable.to.find.resource",
+                            "Unable to find requested resource");
+                }
+                return publishEvent(primaryColumn, fileDetail, clonedInputStreamWorkbook, entityType,
+                        workbook, locale, dateFormat);
+            }else {
+                throw new GeneralPlatformDomainRuleException("error.msg.null","One or more of the given parameters not found");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new GeneralPlatformDomainRuleException("error.msg.io.exception","IO exception occured with "+fileDetail.getFileName()+" "+e.getMessage());
+
+        }
+    }
+
+
+    private Long publishEvent(final Integer primaryColumn,
+            final FormDataContentDisposition fileDetail, final InputStream clonedInputStreamWorkbook,
+            final GlobalEntityType entityType, final Workbook workbook,
+            final String locale, final String dateFormat) {
+
+        final String fileName = fileDetail.getFileName();
+
+        SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
+
+        final Long documentId = this.documentWritePlatformService.createInternalDocument(
+                DocumentWritePlatformServiceJpaRepositoryImpl.DOCUMENT_MANAGEMENT_ENTITY.IMPORT.name(),
+                this.securityContext.authenticatedUser().getId(), null, clonedInputStreamWorkbook,
+                URLConnection.guessContentTypeFromName(fileName), fileName, null, fileName);
+        final Document document = this.documentRepository.findOne(documentId);
+
+        final ImportDocument importDocument = ImportDocument.instance(document,
+                DateUtils.getLocalDateTimeOfTenant(), entityType.getValue(),
+                this.securityContext.authenticatedUser(),
+                ImportHandlerUtils.getNumberOfRows(workbook.getSheetAt(0),
+                        primaryColumn));
+        this.importDocumentRepository.saveAndFlush(importDocument);
+        BulkImportEvent event = BulkImportEvent.instance(ThreadLocalContextUtil.getTenant()
+                .getTenantIdentifier(), workbook, importDocument.getId(), locale, dateFormat);
+        applicationContext.publishEvent(event);
+        return importDocument.getId();
+    }
+    @Override
+    public Collection<ImportData> getImports(GlobalEntityType type) {
+        this.securityContext.authenticatedUser();
+
+        final ImportMapper rm = new ImportMapper();
+        final String sql = "select " + rm.schema() + " order by i.id desc";
+
+        return this.jdbcTemplate.query(sql, rm, new Object[] {type.getValue()});
+    }
+
+
+
+    private static final class ImportMapper implements RowMapper<ImportData> {
+
+        public String schema() {
+            final StringBuilder sql = new StringBuilder();
+            sql.append("i.id as id, i.document_id as documentId, d.name as name, i.import_time as importTime, i.end_time as endTime, ")
+                    .append("i.completed as completed, i.total_records as totalRecords, i.success_count as successCount, ")
+                    .append("i.failure_count as failureCount, i.createdby_id as createdBy ")
+                    .append("from m_import_document i inner join m_document d on i.document_id=d.id ")
+                    .append("where i.entity_type= ? ");
+            return sql.toString();
+        }
+
+        @Override
+        public ImportData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
+
+            final Long id = rs.getLong("id");
+            final Long documentId = rs.getLong("documentId");
+            final String name = rs.getString("name");
+            final LocalDate importTime = JdbcSupport.getLocalDate(rs, "importTime");
+            final LocalDate endTime = JdbcSupport.getLocalDate(rs, "endTime");
+            final Boolean completed = rs.getBoolean("completed");
+            final Integer totalRecords = JdbcSupport.getInteger(rs, "totalRecords");
+            final Integer successCount = JdbcSupport.getInteger(rs, "successCount");
+            final Integer failureCount = JdbcSupport.getInteger(rs, "failureCount");
+            final Long createdBy = rs.getLong("createdBy");
+
+            return ImportData.instance(id, documentId, importTime, endTime, completed,
+                    name, createdBy, totalRecords, successCount, failureCount);
+        }
+    }
+
+    @Override
+    public DocumentData getOutputTemplateLocation(String importDocumentId) {
+        this.securityContext.authenticatedUser();
+        final ImportTemplateLocationMapper importTemplateLocationMapper=new ImportTemplateLocationMapper();
+        final String sql = "select " + importTemplateLocationMapper.schema();
+
+        return this.jdbcTemplate.queryForObject(sql, importTemplateLocationMapper, new Object[] {importDocumentId});
+    }
+
+    @Override
+    public Response getOutputTemplate(String importDocumentId) {
+        this.securityContext.authenticatedUser();
+        final ImportTemplateLocationMapper importTemplateLocationMapper=new ImportTemplateLocationMapper();
+        final String sql = "select " + importTemplateLocationMapper.schema();
+        DocumentData documentData= this.jdbcTemplate.queryForObject(sql, importTemplateLocationMapper, new Object[] {importDocumentId});
+        return buildResponse(documentData);
+    }
+
+    private Response buildResponse(DocumentData documentData) {
+        String fileName="Output"+documentData.fileName();
+        String fileLocation=documentData.fileLocation();
+        File file=new File(fileLocation);
+        final Response.ResponseBuilder response = Response.ok((Object)file);
+        response.header("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
+        response.header("Content-Type", "application/vnd.ms-excel");
+        return response.build();
+    }
+
+    private static final class ImportTemplateLocationMapper implements RowMapper<DocumentData> {
+        public String schema() {
+            final StringBuilder sql = new StringBuilder();
+            sql.append("d.location,d.file_name ")
+                    .append("from m_import_document i inner join m_document d on i.document_id=d.id ")
+                    .append("where i.id= ? ");
+            return sql.toString();
+        }
+            @Override
+            public DocumentData mapRow (ResultSet rs,int rowNum) throws SQLException {
+                final String location = rs.getString("location");
+                final String fileName=rs.getString("file_name");
+                return new DocumentData(null,null,null,null,fileName,
+                        null,null,null,location,null);
+            }
+    }
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java
index 8b3a819..d7a5ca0 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java
@@ -37,6 +37,15 @@ public class CodeValueData implements Serializable {
     private final boolean active;
     private final boolean mandatory;
 
+    public CodeValueData( final Long id){
+        this.id = id;
+        this.name = null;
+        this.position = null;
+        this.description = null;
+        this.active = false;
+        this.mandatory = false;
+    }
+
     public static CodeValueData instance(final Long id, final String name, final Integer position, 
             final boolean isActive, final boolean mandatory) {
         String description = null;

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/PaginationParametersDataValidator.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/PaginationParametersDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/PaginationParametersDataValidator.java
index c1edb48..e5c6748 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/PaginationParametersDataValidator.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/PaginationParametersDataValidator.java
@@ -33,27 +33,24 @@ public class PaginationParametersDataValidator {
     private final Set<String> sortOrderValues = new HashSet<>(Arrays.asList("ASC", "DESC"));
 
     public void validateParameterValues(PaginationParameters parameters, final Set<String> supportedOrdeByValues, final String resourceName) {
-
         final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
-
-        if (parameters.isOrderByRequested() && !supportedOrdeByValues.contains(parameters.getOrderBy())) {
-            final String defaultUserMessage = "The orderBy value '" + parameters.getOrderBy()
-                    + "' is not supported. The supported orderBy values are " + supportedOrdeByValues.toString();
-            final ApiParameterError error = ApiParameterError.parameterError("validation.msg." + resourceName
-                    + ".orderBy.value.is.not.supported", defaultUserMessage, "orderBy", parameters.getOrderBy(),
-                    supportedOrdeByValues.toString());
-            dataValidationErrors.add(error);
-        }
-
-        if (parameters.isSortOrderProvided() && !sortOrderValues.contains(parameters.getSortOrder().toUpperCase())) {
-            final String defaultUserMessage = "The sortOrder value '" + parameters.getSortOrder()
-                    + "' is not supported. The supported sortOrder values are " + sortOrderValues.toString();
-            final ApiParameterError error = ApiParameterError.parameterError("validation.msg." + resourceName
-                    + ".sortOrder.value.is.not.supported", defaultUserMessage, "sortOrder", parameters.getSortOrder(),
-                    sortOrderValues.toString());
-            dataValidationErrors.add(error);
-        }
-
+            if (parameters.isOrderByRequested() && !supportedOrdeByValues.contains(parameters.getOrderBy())) {
+                final String defaultUserMessage = "The orderBy value '" + parameters.getOrderBy()
+                        + "' is not supported. The supported orderBy values are " + supportedOrdeByValues.toString();
+                final ApiParameterError error = ApiParameterError.parameterError("validation.msg." + resourceName
+                                + ".orderBy.value.is.not.supported", defaultUserMessage, "orderBy", parameters.getOrderBy(),
+                        supportedOrdeByValues.toString());
+                dataValidationErrors.add(error);
+            }
+
+            if (parameters.isSortOrderProvided() && !sortOrderValues.contains(parameters.getSortOrder().toUpperCase())) {
+                final String defaultUserMessage = "The sortOrder value '" + parameters.getSortOrder()
+                        + "' is not supported. The supported sortOrder values are " + sortOrderValues.toString();
+                final ApiParameterError error = ApiParameterError.parameterError("validation.msg." + resourceName
+                                + ".sortOrder.value.is.not.supported", defaultUserMessage, "sortOrder", parameters.getSortOrder(),
+                        sortOrderValues.toString());
+                dataValidationErrors.add(error);
+            }
         throwExceptionIfValidationWarningsExist(dataValidationErrors);
     }
 

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformService.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformService.java
index 0e08deb..fdf72a8 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformService.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformService.java
@@ -35,4 +35,9 @@ public interface DocumentWritePlatformService {
     @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'DELETE_DOCUMENT')")
     CommandProcessingResult deleteDocument(DocumentCommand documentCommand);
 
+    @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'CREATE_DOCUMENT')")
+    Long createInternalDocument(String entityType, Long entityId,
+            Long fileSize, InputStream inputStream, String mimeType,
+            String name, String description, String fileName);
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java
index b229db5..1ddd86d 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java
@@ -89,6 +89,22 @@ public class DocumentWritePlatformServiceJpaRepositoryImpl implements DocumentWr
 
     @Transactional
     @Override
+    public Long createInternalDocument(final String entityType, final Long entityId,
+            final Long fileSize, final InputStream inputStream, final String mimeType,
+            final String name, final String description, final String fileName) {
+
+
+        final DocumentCommand documentCommand = new DocumentCommand(null, null, entityType, entityId, name, fileName,
+                fileSize, mimeType, description, null);
+
+        final Long documentId = createDocument(documentCommand, inputStream);
+
+        return documentId;
+
+    }
+
+    @Transactional
+    @Override
     public CommandProcessingResult updateDocument(final DocumentCommand documentCommand, final InputStream inputStream) {
         try {
             this.context.authenticatedUser();
@@ -161,7 +177,7 @@ public class DocumentWritePlatformServiceJpaRepositoryImpl implements DocumentWr
 
     /*** Entities for document Management **/
     public static enum DOCUMENT_MANAGEMENT_ENTITY {
-        CLIENTS, CLIENT_IDENTIFIERS, STAFF, LOANS, SAVINGS, GROUPS;
+        CLIENTS, CLIENT_IDENTIFIERS, STAFF, LOANS, SAVINGS, GROUPS,IMPORT;
 
         @Override
         public String toString() {

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java
index 217e096..c3c8750 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java
@@ -37,6 +37,16 @@ public class CurrencyData {
         return new CurrencyData("", "", 0, 0, "", "");
     }
 
+    public CurrencyData(String code) {
+        this.code = code;
+        this.name = null;
+        this.decimalPlaces =0;
+        this.inMultiplesOf = null;
+        this.displaySymbol = null;
+        this.nameCode = null;
+        this.displayLabel = null;
+    }
+
     public CurrencyData(final String code, final String name, final int decimalPlaces, final Integer inMultiplesOf,
             final String displaySymbol, final String nameCode) {
         this.code = code;
@@ -83,4 +93,8 @@ public class CurrencyData {
 
         return builder.toString();
     }
+
+    public String getName() {
+        return name;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java
index 9f0b109..f2c52da 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java
@@ -18,6 +18,7 @@
  */
 package org.apache.fineract.organisation.office.api;
 
+import java.io.InputStream;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
@@ -34,11 +35,17 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import com.sun.jersey.core.header.FormDataContentDisposition;
+import com.sun.jersey.multipart.FormDataParam;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
+import org.apache.fineract.infrastructure.bulkimport.data.GlobalEntityType;
+import org.apache.fineract.infrastructure.bulkimport.service.BulkImportWorkbookPopulatorService;
+import org.apache.fineract.infrastructure.bulkimport.service.BulkImportWorkbookService;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
@@ -70,16 +77,23 @@ public class OfficesApiResource {
     private final DefaultToApiJsonSerializer<OfficeData> toApiJsonSerializer;
     private final ApiRequestParameterHelper apiRequestParameterHelper;
     private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
+    private final BulkImportWorkbookService bulkImportWorkbookService;
+    private final BulkImportWorkbookPopulatorService bulkImportWorkbookPopulatorService;
+
 
     @Autowired
     public OfficesApiResource(final PlatformSecurityContext context, final OfficeReadPlatformService readPlatformService,
             final DefaultToApiJsonSerializer<OfficeData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper,
-            final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
+            final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService,
+            final BulkImportWorkbookService bulkImportWorkbookService,
+            final BulkImportWorkbookPopulatorService bulkImportWorkbookPopulatorService) {
         this.context = context;
         this.readPlatformService = readPlatformService;
         this.toApiJsonSerializer = toApiJsonSerializer;
         this.apiRequestParameterHelper = apiRequestParameterHelper;
         this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
+        this.bulkImportWorkbookService=bulkImportWorkbookService;
+        this.bulkImportWorkbookPopulatorService=bulkImportWorkbookPopulatorService;
     }
 
     @GET
@@ -165,4 +179,22 @@ public class OfficesApiResource {
 
         return this.toApiJsonSerializer.serialize(result);
     }
+
+    @GET
+    @Path("downloadtemplate")
+    @Produces("application/vnd.ms-excel")
+    public Response getOfficeTemplate(@QueryParam("dateFormat") final String dateFormat) {
+        return bulkImportWorkbookPopulatorService.getTemplate(GlobalEntityType.OFFICES.toString(), null,null,dateFormat);
+    }
+
+    @POST
+    @Path("uploadtemplate")
+    @Consumes(MediaType.MULTIPART_FORM_DATA)
+    public String postOfficeTemplate(@FormDataParam("file") InputStream uploadedInputStream,
+            @FormDataParam("file") FormDataContentDisposition fileDetail,
+            @FormDataParam("locale") final String locale, @FormDataParam("dateFormat") final String dateFormat){
+        final Long importDocumentId = this.bulkImportWorkbookService.importWorkbook(GlobalEntityType.OFFICES.toString(),
+                uploadedInputStream,fileDetail, locale,dateFormat);
+        return this.toApiJsonSerializer.serialize(importDocumentId);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java
index 3ea04ee..6668807 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
 import org.joda.time.LocalDate;
 
 /**
@@ -40,6 +41,36 @@ public class OfficeData implements Serializable {
     @SuppressWarnings("unused")
     private final Collection<OfficeData> allowedParents;
 
+    //import fields
+    private transient Integer rowIndex;
+    private String locale;
+    private String dateFormat;
+
+    public static OfficeData importInstance(final String name, final Long parentId, final LocalDate openingDate,final String externalId) {
+        return new OfficeData(null, name, null, externalId, openingDate, null, parentId, null, null);
+    }
+    public void setImportFields(final Integer rowIndex, final String locale, final String dateFormat) {
+        this.rowIndex = rowIndex;
+        this.locale = locale;
+        this.dateFormat = dateFormat;
+    }
+    public static OfficeData testInstance(final Long id,final String name){
+        return new OfficeData(id,name,null,null,
+                null,null,null,null,
+                null);
+    }
+    public LocalDate getOpeningDate() {
+        return openingDate;
+    }
+
+    public Integer getRowIndex() {
+        return rowIndex;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
     public static OfficeData dropdown(final Long id, final String name, final String nameDecorated) {
         return new OfficeData(id, name, nameDecorated, null, null, null, null, null, null);
     }

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeReadPlatformServiceImpl.java
index 79bd1a8..769b2a1 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeReadPlatformServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeReadPlatformServiceImpl.java
@@ -156,17 +156,17 @@ public class OfficeReadPlatformServiceImpl implements OfficeReadPlatformService
         sqlBuilder.append("select ");
         sqlBuilder.append(rm.officeSchema());
         sqlBuilder.append(" where o.hierarchy like ? ");
+        if(searchParameters!=null) {
+            if (searchParameters.isOrderByRequested()) {
+                sqlBuilder.append("order by ").append(searchParameters.getOrderBy());
 
-        if (searchParameters.isOrderByRequested()) {
-            sqlBuilder.append("order by ").append(searchParameters.getOrderBy());
-
-            if (searchParameters.isSortOrderProvided()) {
-                sqlBuilder.append(' ').append(searchParameters.getSortOrder());
+                if (searchParameters.isSortOrderProvided()) {
+                    sqlBuilder.append(' ').append(searchParameters.getSortOrder());
+                }
+            } else {
+                sqlBuilder.append("order by o.hierarchy");
             }
-        } else {
-            sqlBuilder.append("order by o.hierarchy");
         }
-
         return this.jdbcTemplate.query(sqlBuilder.toString(), rm, new Object[] { hierarchySearchString });
     }
 

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
index c857874..d9ec511 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
@@ -18,6 +18,7 @@
  */
 package org.apache.fineract.organisation.staff.api;
 
+import java.io.InputStream;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
@@ -34,11 +35,17 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import com.sun.jersey.core.header.FormDataContentDisposition;
+import com.sun.jersey.multipart.FormDataParam;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
+import org.apache.fineract.infrastructure.bulkimport.data.GlobalEntityType;
+import org.apache.fineract.infrastructure.bulkimport.service.BulkImportWorkbookPopulatorService;
+import org.apache.fineract.infrastructure.bulkimport.service.BulkImportWorkbookService;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
@@ -72,18 +79,25 @@ public class StaffApiResource {
     private final DefaultToApiJsonSerializer<StaffData> toApiJsonSerializer;
     private final ApiRequestParameterHelper apiRequestParameterHelper;
     private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
+    private final BulkImportWorkbookService bulkImportWorkbookService;
+    private final BulkImportWorkbookPopulatorService bulkImportWorkbookPopulatorService;
+
 
     @Autowired
     public StaffApiResource(final PlatformSecurityContext context, final StaffReadPlatformService readPlatformService,
             final OfficeReadPlatformService officeReadPlatformService, final DefaultToApiJsonSerializer<StaffData> toApiJsonSerializer,
             final ApiRequestParameterHelper apiRequestParameterHelper,
-            final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
+            final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService,
+            final BulkImportWorkbookService bulkImportWorkbookService,
+            final BulkImportWorkbookPopulatorService bulkImportWorkbookPopulatorService) {
         this.context = context;
         this.readPlatformService = readPlatformService;
         this.officeReadPlatformService = officeReadPlatformService;
         this.toApiJsonSerializer = toApiJsonSerializer;
         this.apiRequestParameterHelper = apiRequestParameterHelper;
         this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
+        this.bulkImportWorkbookService=bulkImportWorkbookService;
+        this.bulkImportWorkbookPopulatorService=bulkImportWorkbookPopulatorService;
     }
 
     @GET
@@ -150,4 +164,24 @@ public class StaffApiResource {
 
         return this.toApiJsonSerializer.serialize(result);
     }
+
+    @GET
+    @Path("downloadtemplate")
+    @Produces("application/vnd.ms-excel")
+    public Response getStaffTemplate(@QueryParam("officeId")final Long officeId,
+            @QueryParam("dateFormat") final String dateFormat) {
+        return bulkImportWorkbookPopulatorService.getTemplate(GlobalEntityType.STAFF.toString(), officeId,null,dateFormat);
+    }
+
+    @POST
+    @Path("uploadtemplate")
+    @Consumes(MediaType.MULTIPART_FORM_DATA)
+    public String postStaffTemplate(@FormDataParam("file") InputStream uploadedInputStream,
+            @FormDataParam("file") FormDataContentDisposition fileDetail,
+            @FormDataParam("locale") final String locale,
+            @FormDataParam("dateFormat") final String dateFormat){
+        final Long importDocumentId = this. bulkImportWorkbookService.importWorkbook(GlobalEntityType.STAFF.toString(), uploadedInputStream,
+                fileDetail,locale,dateFormat);
+        return this.toApiJsonSerializer.serialize(importDocumentId);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java
index 45f0dbd..265b671 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java
@@ -20,6 +20,7 @@ package org.apache.fineract.organisation.staff.data;
 
 import java.util.Collection;
 
+import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
 import org.apache.fineract.organisation.office.data.OfficeData;
 import org.joda.time.LocalDate;
 
@@ -40,6 +41,41 @@ public class StaffData {
     private final Boolean isActive;
     private final LocalDate joiningDate;
 
+    //import fields
+    private transient Integer rowIndex;
+    private String dateFormat;
+    private String locale;
+
+    public static StaffData importInstance(String externalId, String firstName, String lastName, String mobileNo, Long officeId, Boolean isLoanOfficer,
+            Boolean isActive, LocalDate joinedOnDate, Integer rowIndex,String locale, String dateFormat){
+        return  new StaffData(externalId,firstName,lastName,mobileNo,officeId,isLoanOfficer,isActive,
+                joinedOnDate,rowIndex,locale,dateFormat);
+
+    }
+    private StaffData(String externalId, String firstname, String lastname, String mobileNo, Long officeId, Boolean isLoanOfficer,
+            Boolean isActive, LocalDate joiningDate, Integer rowIndex,String locale, String dateFormat) {
+
+        this.externalId = externalId;
+        this.firstname = firstname;
+        this.lastname = lastname;
+        this.mobileNo = mobileNo;
+        this.officeId = officeId;
+        this.isLoanOfficer = isLoanOfficer;
+        this.isActive = isActive;
+        this.joiningDate = joiningDate;
+        this.rowIndex = rowIndex;
+        this.dateFormat= dateFormat;
+        this.locale= locale;
+        this.allowedOffices = null;
+        this.id = null;
+        this.officeName = null;
+        this.displayName = null;
+    }
+
+    public Integer getRowIndex() {
+        return rowIndex;
+    }
+
     @SuppressWarnings("unused")
     private final Collection<OfficeData> allowedOffices;
 

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffReadPlatformServiceImpl.java
index ed675a1..37c869c 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffReadPlatformServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffReadPlatformServiceImpl.java
@@ -241,14 +241,16 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService {
         }
         // Passing status parameter to get ACTIVE (By Default), INACTIVE or ALL
         // (Both active and Inactive) employees
-        if (status.equalsIgnoreCase("active")) {
-            extraCriteria.append(" and s.is_active = 1 ");
-        } else if (status.equalsIgnoreCase("inActive")) {
-            extraCriteria.append(" and s.is_active = 0 ");
-        } else if (status.equalsIgnoreCase("all")) {} else {
-            throw new UnrecognizedQueryParamException("status", status, new Object[] { "all", "active", "inactive" });
+        if (status!=null) {
+            if (status.equalsIgnoreCase("active")) {
+                extraCriteria.append(" and s.is_active = 1 ");
+            } else if (status.equalsIgnoreCase("inActive")) {
+                extraCriteria.append(" and s.is_active = 0 ");
+            } else if (status.equalsIgnoreCase("all")) {
+            } else {
+                throw new UnrecognizedQueryParamException("status", status, new Object[]{"all", "active", "inactive"});
+            }
         }
-        
         //adding the Authorization criteria so that a user cannot see an employee who does not belong to his office or 	a sub office for his office.
         
         extraCriteria.append(" and o.hierarchy like ? ");


Mime
View raw message