http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositTransactionImportHandler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositTransactionImportHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositTransactionImportHandler.java
new file mode 100644
index 0000000..3715dbd
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositTransactionImportHandler.java
@@ -0,0 +1,157 @@
+/**
+ * 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.importhandler.recurringdeposit;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+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.constants.TemplatePopulateImportConstants;
+import 
org.apache.fineract.infrastructure.bulkimport.constants.TransactionConstants;
+import org.apache.fineract.infrastructure.bulkimport.data.Count;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.helper.SavingsAccountTransactionEnumValueSerialiser;
+import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
+import org.apache.fineract.infrastructure.core.exception.*;
+import 
org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData;
+import 
org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionEnumData;
+import org.apache.poi.ss.usermodel.*;
+import org.joda.time.LocalDate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+@Service
+public class RecurringDepositTransactionImportHandler implements ImportHandler 
{
+
+    private Workbook workbook;
+    private List<SavingsAccountTransactionData> savingsTransactions;
+    private String savingsAccountId = "";
+
+    private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
+    @Autowired
+    public RecurringDepositTransactionImportHandler(final 
PortfolioCommandSourceWritePlatformService
+            commandsSourceWritePlatformService) {
+        this.commandsSourceWritePlatformService = 
commandsSourceWritePlatformService;
+    }
+
+    @Override
+    public Count process(Workbook workbook, String locale, String dateFormat) {
+        this.workbook=workbook;
+        this.savingsTransactions=new ArrayList<>();
+        readExcelFile(locale,dateFormat);
+        return importEntity(dateFormat);
+    }
+
+    public void readExcelFile(String locale, String dateFormat) {
+        Sheet savingsTransactionSheet = 
workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME);
+        Integer noOfEntries = 
ImportHandlerUtils.getNumberOfRows(savingsTransactionSheet, 
TransactionConstants.AMOUNT_COL);
+        for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) {
+            Row row;
+                row = savingsTransactionSheet.getRow(rowIndex);
+                if(ImportHandlerUtils.isNotImported(row, 
TransactionConstants.STATUS_COL))
+                    
savingsTransactions.add(readSavingsTransaction(row,locale,dateFormat));
+        }
+    }
+
+    private SavingsAccountTransactionData readSavingsTransaction(Row 
row,String locale, String dateFormat) {
+        String savingsAccountIdCheck=null;
+        if 
(ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, 
row)!=null)
+        savingsAccountIdCheck = 
ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, 
row).toString();
+        if(savingsAccountIdCheck!=null)
+            savingsAccountId = savingsAccountIdCheck;
+        String transactionType = 
ImportHandlerUtils.readAsString(TransactionConstants.TRANSACTION_TYPE_COL, row);
+        SavingsAccountTransactionEnumData 
savingsAccountTransactionEnumData=new 
SavingsAccountTransactionEnumData(null,null,transactionType);
+
+        BigDecimal amount=null;
+        if (ImportHandlerUtils.readAsDouble(TransactionConstants.AMOUNT_COL, 
row)!=null)
+            amount = 
BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(TransactionConstants.AMOUNT_COL,
 row));
+
+        LocalDate transactionDate = 
ImportHandlerUtils.readAsDate(TransactionConstants.TRANSACTION_DATE_COL, row);
+        String paymentType = 
ImportHandlerUtils.readAsString(TransactionConstants.PAYMENT_TYPE_COL, row);
+        Long paymentTypeId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.EXTRAS_SHEET_NAME),
 paymentType);
+        String accountNumber = 
ImportHandlerUtils.readAsString(TransactionConstants.ACCOUNT_NO_COL, row);
+        String checkNumber = 
ImportHandlerUtils.readAsString(TransactionConstants.CHECK_NO_COL, row);
+        String routingCode = 
ImportHandlerUtils.readAsString(TransactionConstants.ROUTING_CODE_COL, row);
+        String receiptNumber = 
ImportHandlerUtils.readAsString(TransactionConstants.RECEIPT_NO_COL, row);
+        String bankNumber = 
ImportHandlerUtils.readAsString(TransactionConstants.BANK_NO_COL, row);
+        return SavingsAccountTransactionData.importInstance(amount, 
transactionDate, paymentTypeId, accountNumber,
+                checkNumber, routingCode, receiptNumber, bankNumber, 
Long.parseLong(savingsAccountId), savingsAccountTransactionEnumData, 
row.getRowNum(),locale,dateFormat);
+
+    }
+
+    public Count importEntity(String dateFormat) {
+        Sheet savingsTransactionSheet = 
workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME);
+        int successCount=0;
+        int errorCount=0;
+        String errorMessage="";
+        GsonBuilder gsonBuilder = new GsonBuilder();
+        gsonBuilder.registerTypeAdapter(LocalDate.class, new 
DateSerializer(dateFormat));
+        gsonBuilder.registerTypeAdapter(SavingsAccountTransactionEnumData.class
+                ,new SavingsAccountTransactionEnumValueSerialiser());
+
+        for (SavingsAccountTransactionData transaction : savingsTransactions) {
+            try {
+                JsonObject 
savingsTransactionJsonob=gsonBuilder.create().toJsonTree(transaction).getAsJsonObject();
+                savingsTransactionJsonob.remove("transactionType");
+                savingsTransactionJsonob.remove("reversed");
+                savingsTransactionJsonob.remove("interestedPostedAsOn");
+                String payload= savingsTransactionJsonob.toString();
+                CommandWrapper commandRequest=null;
+                if 
(transaction.getTransactionType().getValue().equals("Withdrawal")) {
+                    commandRequest = new CommandWrapperBuilder() //
+                            
.recurringAccountWithdrawal(transaction.getSavingsAccountId()) //
+                            .withJson(payload) //
+                            .build(); //
+
+                }else if 
(transaction.getTransactionType().getValue().equals("Deposit")){
+                    commandRequest = new CommandWrapperBuilder() //
+                            
.recurringAccountDeposit(transaction.getSavingsAccountId()) //
+                            .withJson(payload) //
+                            .build();
+                }
+                final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
+                successCount++;
+                Cell statusCell = 
savingsTransactionSheet.getRow(transaction.getRowIndex()).createCell(TransactionConstants.STATUS_COL);
+                
statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED);
+                
statusCell.setCellStyle(ImportHandlerUtils.getCellStyle(workbook, 
IndexedColors.LIGHT_GREEN));
+            } catch (AbstractPlatformDomainRuleException e) {
+                errorCount++;
+                e.printStackTrace();
+                errorMessage = e.getDefaultUserMessage();
+                
ImportHandlerUtils.writeErrorMessage(savingsTransactionSheet,transaction.getRowIndex(),errorMessage,TransactionConstants.STATUS_COL);
+            }catch (RuntimeException ex){
+                errorCount++;
+                ex.printStackTrace();
+                errorMessage=ImportHandlerUtils.getErrorMessage(ex);
+                
ImportHandlerUtils.writeErrorMessage(savingsTransactionSheet,transaction.getRowIndex(),errorMessage,TransactionConstants.STATUS_COL);
+            }
+        }
+        
savingsTransactionSheet.setColumnWidth(TransactionConstants.STATUS_COL, 
TemplatePopulateImportConstants.SMALL_COL_SIZE);
+        ImportHandlerUtils.writeString(TransactionConstants.STATUS_COL, 
savingsTransactionSheet.getRow(TransactionConstants.STATUS_COL), 
TemplatePopulateImportConstants.STATUS_COL_REPORT_HEADER);
+        return  Count.instance(successCount,errorCount);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsImportHandler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsImportHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsImportHandler.java
new file mode 100644
index 0000000..13c0f54
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsImportHandler.java
@@ -0,0 +1,364 @@
+/**
+ * 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.importhandler.savings;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+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.constants.SavingsConstants;
+import 
org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
+import org.apache.fineract.infrastructure.bulkimport.data.Count;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.helper.EnumOptionDataIdSerializer;
+import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.apache.fineract.infrastructure.core.exception.*;
+import org.apache.fineract.portfolio.savings.data.SavingsAccountChargeData;
+import org.apache.fineract.portfolio.savings.data.SavingsAccountData;
+import org.apache.fineract.portfolio.savings.data.SavingsActivation;
+import org.apache.fineract.portfolio.savings.data.SavingsApproval;
+import org.apache.poi.ss.usermodel.*;
+import org.joda.time.LocalDate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+@Service
+public class SavingsImportHandler implements ImportHandler {
+
+    private Workbook workbook;
+    private List<SavingsAccountData> savings;
+    private List<SavingsApproval> approvalDates;
+    private List<SavingsActivation> activationDates;
+    private List<String>statuses;
+
+    private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
+
+    @Autowired
+    public SavingsImportHandler(final 
PortfolioCommandSourceWritePlatformService
+            commandsSourceWritePlatformService) {
+        this.commandsSourceWritePlatformService = 
commandsSourceWritePlatformService;
+    }
+
+    @Override
+    public Count process(Workbook workbook, String locale, String dateFormat) {
+        this.workbook=workbook;
+        this.savings=new ArrayList<>();
+        this.approvalDates=new ArrayList<>();
+        this.activationDates=new ArrayList<>();
+        this.statuses=new ArrayList<>();
+        readExcelFile(locale,dateFormat);
+        return importEntity(dateFormat);
+    }
+    public void readExcelFile(String locale, String dateFormat) {
+        Sheet savingsSheet = 
workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_ACCOUNTS_SHEET_NAME);
+        Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(savingsSheet, 
TemplatePopulateImportConstants.FIRST_COLUMN_INDEX);
+        for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) {
+            Row row;
+                row = savingsSheet.getRow(rowIndex);
+                if (ImportHandlerUtils.isNotImported(row, 
SavingsConstants.STATUS_COL)) {
+                    savings.add(readSavings(row,locale,dateFormat));
+                    
approvalDates.add(readSavingsApproval(row,locale,dateFormat));
+                    
activationDates.add(readSavingsActivation(row,locale,dateFormat));
+                }
+        }
+    }
+
+    private SavingsActivation readSavingsActivation(Row row,String locale, 
String dateFormat) {
+        LocalDate activationDate = ImportHandlerUtils.readAsDate( 
SavingsConstants.ACTIVATION_DATE_COL, row);
+        if (activationDate!=null)
+            return SavingsActivation.importInstance(activationDate, 
row.getRowNum(),locale,dateFormat);
+        else
+            return null;
+    }
+
+    private SavingsApproval readSavingsApproval(Row row,String locale, String 
dateFormat) {
+        LocalDate approvalDate = ImportHandlerUtils.readAsDate( 
SavingsConstants.APPROVED_DATE_COL, row);
+        if (approvalDate!=null)
+            return SavingsApproval.importInstance(approvalDate, 
row.getRowNum(),locale,dateFormat);
+        else
+            return null;
+    }
+
+    private SavingsAccountData readSavings(Row row,String locale, String 
dateFormat) {
+        String productName = ImportHandlerUtils.readAsString( 
SavingsConstants.PRODUCT_COL, row);
+        Long productId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.PRODUCT_SHEET_NAME),
 productName);
+        String fieldOfficerName = 
ImportHandlerUtils.readAsString(SavingsConstants.FIELD_OFFICER_NAME_COL, row);
+        Long fieldOfficerId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.STAFF_SHEET_NAME),
 fieldOfficerName);
+        LocalDate submittedOnDate = 
ImportHandlerUtils.readAsDate(SavingsConstants.SUBMITTED_ON_DATE_COL, row);
+
+        BigDecimal nominalAnnualInterestRate=null;
+        if 
(ImportHandlerUtils.readAsDouble(SavingsConstants.NOMINAL_ANNUAL_INTEREST_RATE_COL,
 row)!=null) {
+             nominalAnnualInterestRate = 
BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(SavingsConstants.NOMINAL_ANNUAL_INTEREST_RATE_COL,
 row));
+        }
+        String interestCompoundingPeriodType = 
ImportHandlerUtils.readAsString(SavingsConstants.INTEREST_COMPOUNDING_PERIOD_COL,
 row);
+        Long interestCompoundingPeriodTypeId = null;
+        EnumOptionData interestCompoundingPeriodTypeEnum=null;
+        if (interestCompoundingPeriodType!=null) {
+            if (interestCompoundingPeriodType.equalsIgnoreCase("Daily"))
+                interestCompoundingPeriodTypeId = 1L;
+            else if (interestCompoundingPeriodType.equalsIgnoreCase("Monthly"))
+                interestCompoundingPeriodTypeId = 4L;
+            else if 
(interestCompoundingPeriodType.equalsIgnoreCase("Quarterly"))
+                interestCompoundingPeriodTypeId = 5L;
+            else if 
(interestCompoundingPeriodType.equalsIgnoreCase("Semi-Annual"))
+                interestCompoundingPeriodTypeId = 6L;
+            else if 
(interestCompoundingPeriodType.equalsIgnoreCase("Annually"))
+                interestCompoundingPeriodTypeId = 7L;
+             interestCompoundingPeriodTypeEnum = new 
EnumOptionData(interestCompoundingPeriodTypeId, null, null);
+        }
+        String interestPostingPeriodType = 
ImportHandlerUtils.readAsString(SavingsConstants.INTEREST_POSTING_PERIOD_COL, 
row);
+        Long interestPostingPeriodTypeId = null;
+        EnumOptionData interestPostingPeriodTypeEnum=null;
+        if (interestPostingPeriodType!=null) {
+            if (interestPostingPeriodType.equalsIgnoreCase("Monthly"))
+                interestPostingPeriodTypeId = 4L;
+            else if (interestPostingPeriodType.equalsIgnoreCase("Quarterly"))
+                interestPostingPeriodTypeId = 5L;
+            else if (interestPostingPeriodType.equalsIgnoreCase("Annually"))
+                interestPostingPeriodTypeId = 7L;
+            else if (interestPostingPeriodType.equalsIgnoreCase("BiAnnual"))
+                interestPostingPeriodTypeId = 6L;
+            interestPostingPeriodTypeEnum = new 
EnumOptionData(interestPostingPeriodTypeId, null, null);
+        }
+        String interestCalculationType = 
ImportHandlerUtils.readAsString(SavingsConstants.INTEREST_CALCULATION_COL, row);
+        Long interestCalculationTypeId = null;
+        EnumOptionData interestCalculationTypeEnum=null;
+        if (interestCalculationType!=null) {
+            if (interestCalculationType.equalsIgnoreCase("Daily Balance"))
+                interestCalculationTypeId = 1L;
+            else if (interestCalculationType.equalsIgnoreCase("Average Daily 
Balance"))
+                interestCalculationTypeId = 2L;
+            interestCalculationTypeEnum = new 
EnumOptionData(interestCalculationTypeId, null, null);
+        }
+        String interestCalculationDaysInYearType = 
ImportHandlerUtils.readAsString(SavingsConstants.INTEREST_CALCULATION_DAYS_IN_YEAR_COL,
 row);
+        EnumOptionData interestCalculationDaysInYearTypeEnum=null;
+        Long interestCalculationDaysInYearTypeId = null;
+        if (interestCalculationDaysInYearType!=null) {
+            if (interestCalculationDaysInYearType.equalsIgnoreCase("360 Days"))
+                interestCalculationDaysInYearTypeId = 360L;
+            else if (interestCalculationDaysInYearType.equalsIgnoreCase("365 
Days"))
+                interestCalculationDaysInYearTypeId = 365L;
+            interestCalculationDaysInYearTypeEnum = new 
EnumOptionData(interestCalculationDaysInYearTypeId, null, null);
+        }
+        BigDecimal minRequiredOpeningBalance=null;
+        if 
(ImportHandlerUtils.readAsDouble(SavingsConstants.MIN_OPENING_BALANCE_COL, 
row)!=null) {
+             minRequiredOpeningBalance = 
BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(SavingsConstants.MIN_OPENING_BALANCE_COL,
 row));
+        }
+        Integer lockinPeriodFrequency = 
ImportHandlerUtils.readAsInt(SavingsConstants.LOCKIN_PERIOD_COL, row);
+        String lockinPeriodFrequencyType = 
ImportHandlerUtils.readAsString(SavingsConstants.LOCKIN_PERIOD_FREQUENCY_COL, 
row);
+        Long lockinPeriodFrequencyTypeId = null;
+        EnumOptionData lockinPeriodFrequencyTypeEnum=null;
+        if (lockinPeriodFrequencyType!=null) {
+            if (lockinPeriodFrequencyType.equalsIgnoreCase("Days"))
+                lockinPeriodFrequencyTypeId = 0L;
+            else if (lockinPeriodFrequencyType.equalsIgnoreCase("Weeks"))
+                lockinPeriodFrequencyTypeId = 1L;
+            else if (lockinPeriodFrequencyType.equalsIgnoreCase("Months"))
+                lockinPeriodFrequencyTypeId = 2L;
+            else if (lockinPeriodFrequencyType.equalsIgnoreCase("Years"))
+                lockinPeriodFrequencyTypeId = 3L;
+            lockinPeriodFrequencyTypeEnum = new 
EnumOptionData(lockinPeriodFrequencyTypeId, null, null);
+        }
+        Boolean applyWithdrawalFeeForTransfers = 
ImportHandlerUtils.readAsBoolean(SavingsConstants.APPLY_WITHDRAWAL_FEE_FOR_TRANSFERS,
 row);
+
+        String savingsType=null;
+        if (ImportHandlerUtils.readAsString(SavingsConstants.SAVINGS_TYPE_COL, 
row)!=null)
+        savingsType = 
ImportHandlerUtils.readAsString(SavingsConstants.SAVINGS_TYPE_COL, 
row).toLowerCase(Locale.ENGLISH);
+
+        String clientOrGroupName = 
ImportHandlerUtils.readAsString(SavingsConstants.CLIENT_NAME_COL, row);
+
+        String externalId = 
ImportHandlerUtils.readAsString(SavingsConstants.EXTERNAL_ID_COL, row);
+        List<SavingsAccountChargeData> charges = new ArrayList<>();
+
+
+        Boolean allowOverdraft = 
ImportHandlerUtils.readAsBoolean(SavingsConstants.ALLOW_OVER_DRAFT_COL, row);
+        BigDecimal overdraftLimit = 
BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(SavingsConstants.OVER_DRAFT_LIMIT_COL,
 row));
+
+        String charge1 = 
ImportHandlerUtils.readAsString(SavingsConstants.CHARGE_ID_1, row);
+        String charge2 = 
ImportHandlerUtils.readAsString(SavingsConstants.CHARGE_ID_2, row);
+
+        if (charge1!=null) {
+            if 
(ImportHandlerUtils.readAsDouble(SavingsConstants.CHARGE_AMOUNT_1, row)!=null) {
+                charges.add(new 
SavingsAccountChargeData(ImportHandlerUtils.readAsLong(SavingsConstants.CHARGE_ID_1,
 row),
+                        
BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(SavingsConstants.CHARGE_AMOUNT_1,
 row)),
+                        
ImportHandlerUtils.readAsDate(SavingsConstants.CHARGE_DUE_DATE_1, row)));
+            }else {
+                charges.add(new 
SavingsAccountChargeData(ImportHandlerUtils.readAsLong(SavingsConstants.CHARGE_ID_1,
 row),
+                       null,
+                        
ImportHandlerUtils.readAsDate(SavingsConstants.CHARGE_DUE_DATE_1, row)));
+            }
+        }
+
+        if (charge2!=null) {
+            if 
(ImportHandlerUtils.readAsDouble(SavingsConstants.CHARGE_AMOUNT_2, row)!=null) {
+                charges.add(new 
SavingsAccountChargeData(ImportHandlerUtils.readAsLong(SavingsConstants.CHARGE_ID_2,
 row),
+                        
BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(SavingsConstants.CHARGE_AMOUNT_2,
 row)),
+                        
ImportHandlerUtils.readAsDate(SavingsConstants.CHARGE_DUE_DATE_2, row)));
+            }else {
+                charges.add(new 
SavingsAccountChargeData(ImportHandlerUtils.readAsLong(SavingsConstants.CHARGE_ID_2,
 row),
+                        null,
+                        
ImportHandlerUtils.readAsDate(SavingsConstants.CHARGE_DUE_DATE_2, row)));
+            }
+        }
+        String status = 
ImportHandlerUtils.readAsString(SavingsConstants.STATUS_COL, row);
+        statuses.add(status);
+        if (savingsType!=null) {
+            if (savingsType.equals("individual")) {
+                Long clientId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.CLIENT_SHEET_NAME),
 clientOrGroupName);
+                return SavingsAccountData.importInstanceIndividual(clientId, 
productId, fieldOfficerId, submittedOnDate, nominalAnnualInterestRate,
+                        interestCompoundingPeriodTypeEnum, 
interestPostingPeriodTypeEnum, interestCalculationTypeEnum,
+                        interestCalculationDaysInYearTypeEnum, 
minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyTypeEnum,
+                        applyWithdrawalFeeForTransfers, row.getRowNum(), 
externalId, charges, allowOverdraft, overdraftLimit,locale,dateFormat);
+            }
+            Long groupId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.GROUP_SHEET_NAME),
 clientOrGroupName);
+            return  SavingsAccountData.importInstanceGroup(groupId, productId, 
fieldOfficerId, submittedOnDate, nominalAnnualInterestRate,
+                    interestCompoundingPeriodTypeEnum, 
interestPostingPeriodTypeEnum, interestCalculationTypeEnum,
+                    interestCalculationDaysInYearTypeEnum, 
minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyTypeEnum,
+                    applyWithdrawalFeeForTransfers, row.getRowNum(), 
externalId, charges, allowOverdraft, overdraftLimit,locale,dateFormat);
+        }else {
+            return  null;
+        }
+
+    }
+
+    public Count importEntity(String dateFormat) {
+        Sheet savingsSheet = 
workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_ACCOUNTS_SHEET_NAME);
+        int successCount=0;
+        int errorCount=0;
+        int progressLevel = 0;
+        String errorMessage="";
+        Long savingsId=null;
+        for (int i = 0; i < savings.size(); i++) {
+            Row row = savingsSheet.getRow(savings.get(i).getRowIndex());
+            Cell statusCell = row.createCell(SavingsConstants.STATUS_COL);
+            Cell errorReportCell = 
row.createCell(SavingsConstants.FAILURE_REPORT_COL);
+            try {
+                String status = statuses.get(i);
+                progressLevel = getProgressLevel(status);
+
+                if (progressLevel == 0) {
+                    CommandProcessingResult result = 
importSavings(i,dateFormat);
+                    savingsId = result.getSavingsId();;
+                    progressLevel = 1;
+                } else
+                    savingsId = 
ImportHandlerUtils.readAsLong(SavingsConstants.SAVINGS_ID_COL, 
savingsSheet.getRow(savings.get(i).getRowIndex()));
+
+                if (progressLevel <= 1) progressLevel = 
importSavingsApproval(savingsId, i,dateFormat);
+
+                if (progressLevel <= 2) progressLevel = 
importSavingsActivation(savingsId, i,dateFormat);
+                successCount++;
+                
statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED);
+                
statusCell.setCellStyle(ImportHandlerUtils.getCellStyle(workbook, 
IndexedColors.LIGHT_GREEN));
+            }catch (RuntimeException ex){
+                errorCount++;
+                ex.printStackTrace();
+                errorMessage=ImportHandlerUtils.getErrorMessage(ex);
+                
writeSavingsErrorMessage(savingsId,errorMessage,progressLevel,statusCell,errorReportCell,row);
+            }
+        }
+        setReportHeaders(savingsSheet);
+        return Count.instance(successCount,errorCount);
+    }
+
+    private  void writeSavingsErrorMessage(Long savingsId,String 
errorMessage,int progressLevel,Cell statusCell,Cell errorReportCell,Row row){
+        String status = "";
+
+        if (progressLevel == 0)
+            status = TemplatePopulateImportConstants.STATUS_CREATION_FAILED;
+        else if (progressLevel == 1)
+            status = TemplatePopulateImportConstants.STATUS_APPROVAL_FAILED;
+        else if (progressLevel == 2) status = 
TemplatePopulateImportConstants.STATUS_ACTIVATION_FAILED;
+        statusCell.setCellValue(status);
+        statusCell.setCellStyle(ImportHandlerUtils.getCellStyle(workbook, 
IndexedColors.RED));
+
+        if (progressLevel > 0) 
row.createCell(SavingsConstants.SAVINGS_ID_COL).setCellValue(savingsId);
+
+        errorReportCell.setCellValue(errorMessage);
+    }
+    private void setReportHeaders(Sheet savingsSheet) {
+        savingsSheet.setColumnWidth(SavingsConstants.STATUS_COL, 
TemplatePopulateImportConstants.SMALL_COL_SIZE);
+        Row rowHeader = 
savingsSheet.getRow(TemplatePopulateImportConstants.ROWHEADER_INDEX);
+        ImportHandlerUtils.writeString(SavingsConstants.STATUS_COL, rowHeader, 
TemplatePopulateImportConstants.STATUS_COL_REPORT_HEADER);
+        ImportHandlerUtils.writeString(SavingsConstants.SAVINGS_ID_COL, 
rowHeader, TemplatePopulateImportConstants.SAVINGS_ID_COL_REPORT_HEADER);
+        ImportHandlerUtils.writeString(SavingsConstants.FAILURE_REPORT_COL, 
rowHeader, TemplatePopulateImportConstants.FAILURE_COL_REPORT_HEADER);
+    }
+
+    private int importSavingsActivation(Long savingsId, int i, String 
dateFormat) {
+        if(activationDates.get(i)!=null) {
+            GsonBuilder gsonBuilder = new GsonBuilder();
+            gsonBuilder.registerTypeAdapter(LocalDate.class, new 
DateSerializer(dateFormat));
+            String payload = 
gsonBuilder.create().toJson(activationDates.get(i));
+            final CommandWrapper commandRequest = new CommandWrapperBuilder() 
//
+                    .savingsAccountActivation(savingsId)//
+                    .withJson(payload) //
+                    .build(); //
+            final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
+        }
+        return 3;
+    }
+
+    private int importSavingsApproval(Long savingsId, int i,
+            String dateFormat) {
+        if(approvalDates.get(i)!=null) {
+            GsonBuilder gsonBuilder = new GsonBuilder();
+            gsonBuilder.registerTypeAdapter(LocalDate.class, new 
DateSerializer(dateFormat));
+            String payload = gsonBuilder.create().toJson(approvalDates.get(i));
+            final CommandWrapper commandRequest = new CommandWrapperBuilder() 
//
+                    .approveSavingsAccountApplication(savingsId)//
+                    .withJson(payload) //
+                    .build(); //
+           final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
+        }
+        return 2;
+    }
+
+    private CommandProcessingResult importSavings(int i,String dateFormat) {
+        GsonBuilder gsonBuilder = new GsonBuilder();
+        gsonBuilder.registerTypeAdapter(LocalDate.class, new 
DateSerializer(dateFormat));
+        gsonBuilder.registerTypeAdapter(EnumOptionData.class,new 
EnumOptionDataIdSerializer());
+        JsonObject 
savingsJsonob=gsonBuilder.create().toJsonTree(savings.get(i)).getAsJsonObject();
+        savingsJsonob.remove("isDormancyTrackingActive");
+        String payload= savingsJsonob.toString();
+        final CommandWrapper commandRequest = new CommandWrapperBuilder() //
+                .createSavingsAccount() //
+                .withJson(payload) //
+                .build(); //
+        final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
+        return result;
+    }
+
+    private int getProgressLevel(String status) {
+        if (status==null || 
status.equals(TemplatePopulateImportConstants.STATUS_CREATION_FAILED))
+            return 0;
+        else if 
(status.equals(TemplatePopulateImportConstants.STATUS_APPROVAL_FAILED))
+            return 1;
+        else if 
(status.equals(TemplatePopulateImportConstants.STATUS_ACTIVATION_FAILED)) 
return 2;
+        return 0;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsTransactionImportHandler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsTransactionImportHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsTransactionImportHandler.java
new file mode 100644
index 0000000..dfd562f
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsTransactionImportHandler.java
@@ -0,0 +1,152 @@
+/**
+ * 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.importhandler.savings;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+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.constants.TemplatePopulateImportConstants;
+import 
org.apache.fineract.infrastructure.bulkimport.constants.TransactionConstants;
+import org.apache.fineract.infrastructure.bulkimport.data.Count;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.helper.SavingsAccountTransactionEnumValueSerialiser;
+import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
+import org.apache.fineract.infrastructure.core.exception.*;
+import 
org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData;
+import 
org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionEnumData;
+import org.apache.poi.ss.usermodel.*;
+import org.joda.time.LocalDate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+@Service
+public class SavingsTransactionImportHandler implements ImportHandler {
+    private Workbook workbook;
+    private List<SavingsAccountTransactionData> savingsTransactions;
+    private String savingsAccountId = "";
+
+    private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
+
+    @Autowired
+    public SavingsTransactionImportHandler(final 
PortfolioCommandSourceWritePlatformService
+        commandsSourceWritePlatformService) {
+    this.commandsSourceWritePlatformService = 
commandsSourceWritePlatformService;
+    }
+
+    @Override
+    public Count process(Workbook workbook, String locale, String dateFormat) {
+        this.workbook=workbook;
+        this.savingsTransactions=new ArrayList<>();
+        readExcelFile(locale,dateFormat);
+        return importEntity(dateFormat);
+    }
+
+    public void readExcelFile(String locale, String dateFormat) {
+        Sheet savingsTransactionSheet = 
workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME);
+        Integer noOfEntries = 
ImportHandlerUtils.getNumberOfRows(savingsTransactionSheet, 
TransactionConstants.AMOUNT_COL);
+        for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) {
+            Row row;
+            row = savingsTransactionSheet.getRow(rowIndex);
+            if(ImportHandlerUtils.isNotImported(row, 
TransactionConstants.STATUS_COL))
+                
savingsTransactions.add(readSavingsTransaction(row,locale,dateFormat));
+        }
+    }
+
+    private SavingsAccountTransactionData readSavingsTransaction(Row 
row,String locale, String dateFormat) {
+        String savingsAccountIdCheck=null;
+        if 
(ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, 
row)!=null)
+            savingsAccountIdCheck = 
ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, 
row).toString();
+        if(savingsAccountIdCheck!=null)
+            savingsAccountId = savingsAccountIdCheck;
+        String transactionType = 
ImportHandlerUtils.readAsString(TransactionConstants.TRANSACTION_TYPE_COL, row);
+        SavingsAccountTransactionEnumData 
savingsAccountTransactionEnumData=new 
SavingsAccountTransactionEnumData(null,null,transactionType);
+
+        BigDecimal amount=null;
+        if (ImportHandlerUtils.readAsDouble(TransactionConstants.AMOUNT_COL, 
row)!=null)
+            amount = 
BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(TransactionConstants.AMOUNT_COL,
 row));
+
+        LocalDate transactionDate = 
ImportHandlerUtils.readAsDate(TransactionConstants.TRANSACTION_DATE_COL, row);
+        String paymentType = 
ImportHandlerUtils.readAsString(TransactionConstants.PAYMENT_TYPE_COL, row);
+        Long paymentTypeId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.EXTRAS_SHEET_NAME),
 paymentType);
+        String accountNumber = 
ImportHandlerUtils.readAsString(TransactionConstants.ACCOUNT_NO_COL, row);
+        String checkNumber = 
ImportHandlerUtils.readAsString(TransactionConstants.CHECK_NO_COL, row);
+        String routingCode = 
ImportHandlerUtils.readAsString(TransactionConstants.ROUTING_CODE_COL, row);
+        String receiptNumber = 
ImportHandlerUtils.readAsString(TransactionConstants.RECEIPT_NO_COL, row);
+        String bankNumber = 
ImportHandlerUtils.readAsString(TransactionConstants.BANK_NO_COL, row);
+        return SavingsAccountTransactionData.importInstance(amount, 
transactionDate, paymentTypeId, accountNumber,
+                checkNumber, routingCode, receiptNumber, bankNumber, 
Long.parseLong(savingsAccountId), savingsAccountTransactionEnumData, 
row.getRowNum(),locale,dateFormat);
+
+    }
+
+    public Count importEntity(String dateFormat) {
+        Sheet savingsTransactionSheet = 
workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME);
+        int successCount=0;
+        int errorCount=0;
+        String errorMessage="";
+        GsonBuilder gsonBuilder = new GsonBuilder();
+        gsonBuilder.registerTypeAdapter(LocalDate.class, new 
DateSerializer(dateFormat));
+        gsonBuilder.registerTypeAdapter(SavingsAccountTransactionEnumData.class
+                ,new SavingsAccountTransactionEnumValueSerialiser());
+
+        for (SavingsAccountTransactionData transaction : savingsTransactions) {
+            try {
+                JsonObject 
savingsTransactionJsonob=gsonBuilder.create().toJsonTree(transaction).getAsJsonObject();
+                savingsTransactionJsonob.remove("transactionType");
+                savingsTransactionJsonob.remove("reversed");
+                savingsTransactionJsonob.remove("interestedPostedAsOn");
+                String payload= savingsTransactionJsonob.toString();
+                CommandWrapper commandRequest=null;
+                if 
(transaction.getTransactionType().getValue().equals("Withdrawal")) {
+                    commandRequest = new CommandWrapperBuilder() //
+                            
.savingsAccountWithdrawal(transaction.getSavingsAccountId()) //
+                            .withJson(payload) //
+                            .build(); //
+
+                }else if 
(transaction.getTransactionType().getValue().equals("Deposit")){
+                    commandRequest = new CommandWrapperBuilder() //
+                            
.savingsAccountDeposit(transaction.getSavingsAccountId()) //
+                            .withJson(payload) //
+                            .build();
+                }
+                final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
+                successCount++;
+                Cell statusCell = 
savingsTransactionSheet.getRow(transaction.getRowIndex()).createCell(TransactionConstants.STATUS_COL);
+                
statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED);
+                
statusCell.setCellStyle(ImportHandlerUtils.getCellStyle(workbook, 
IndexedColors.LIGHT_GREEN));
+            }catch (RuntimeException ex){
+                errorCount++;
+                ex.printStackTrace();
+                errorMessage=ImportHandlerUtils.getErrorMessage(ex);
+                
ImportHandlerUtils.writeErrorMessage(savingsTransactionSheet,transaction.getRowIndex(),errorMessage,TransactionConstants.STATUS_COL);
+            }
+        }
+        
savingsTransactionSheet.setColumnWidth(TransactionConstants.STATUS_COL, 
TemplatePopulateImportConstants.SMALL_COL_SIZE);
+        ImportHandlerUtils.writeString(TransactionConstants.STATUS_COL, 
savingsTransactionSheet.getRow(TransactionConstants.STATUS_COL), 
TemplatePopulateImportConstants.STATUS_COL_REPORT_HEADER);
+        return Count.instance(successCount,errorCount);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/sharedaccount/SharedAccountImportHandler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/sharedaccount/SharedAccountImportHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/sharedaccount/SharedAccountImportHandler.java
new file mode 100644
index 0000000..63ce1c2
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/sharedaccount/SharedAccountImportHandler.java
@@ -0,0 +1,174 @@
+/**
+ * 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.importhandler.sharedaccount;
+
+import com.google.gson.GsonBuilder;
+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.constants.SharedAccountsConstants;
+import 
org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
+import org.apache.fineract.infrastructure.bulkimport.data.Count;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer;
+import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
+import org.apache.fineract.infrastructure.core.exception.*;
+import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountChargeData;
+import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountData;
+import org.apache.poi.ss.usermodel.*;
+import org.joda.time.LocalDate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+@Service
+public class SharedAccountImportHandler implements ImportHandler {
+    private Workbook workbook;
+    private List<ShareAccountData> shareAccountDataList;
+    private List<String>statuses;
+
+    private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
+
+    @Autowired
+    public SharedAccountImportHandler(final 
PortfolioCommandSourceWritePlatformService
+            commandsSourceWritePlatformService) {
+        this.commandsSourceWritePlatformService = 
commandsSourceWritePlatformService;
+    }
+    @Override
+    public Count process(Workbook workbook, String locale, String dateFormat) {
+        this.workbook=workbook;
+        this.shareAccountDataList=new ArrayList<>();
+        statuses=new ArrayList<String>();
+        readExcelFile(locale,dateFormat);
+        return importEntity(dateFormat);
+    }
+    public void readExcelFile(String locale, String dateFormat) {
+        Sheet 
sharedAccountsSheet=workbook.getSheet(TemplatePopulateImportConstants.SHARED_ACCOUNTS_SHEET_NAME);
+        Integer noOfEntries= 
ImportHandlerUtils.getNumberOfRows(sharedAccountsSheet, 
TemplatePopulateImportConstants.FIRST_COLUMN_INDEX);
+        for (int rowIndex=1;rowIndex<=noOfEntries;rowIndex++){
+            Row row;
+                row=sharedAccountsSheet.getRow(rowIndex);
+                if (ImportHandlerUtils.isNotImported(row, 
SharedAccountsConstants.STATUS_COL)){
+                    
shareAccountDataList.add(readSharedAccount(row,locale,dateFormat));
+                }
+        }
+    }
+
+    private ShareAccountData readSharedAccount(Row row,String locale, String 
dateFormat) {
+        String clientName = 
ImportHandlerUtils.readAsString(SharedAccountsConstants.CLIENT_NAME_COL, row);
+        Long clientId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.CLIENT_SHEET_NAME),
 clientName);
+
+        String productName = 
ImportHandlerUtils.readAsString(SharedAccountsConstants.PRODUCT_COL, row);
+        Long 
productId=ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.SHARED_PRODUCTS_SHEET_NAME),productName);
+
+        LocalDate 
submittedOnDate=ImportHandlerUtils.readAsDate(SharedAccountsConstants.SUBMITTED_ON_COL,row);
+
+        String externalId = 
ImportHandlerUtils.readAsString(SharedAccountsConstants.EXTERNAL_ID_COL, row);
+
+        Integer 
totNoOfShares=ImportHandlerUtils.readAsInt(SharedAccountsConstants.TOTAL_NO_SHARES_COL,row);
+
+        Long 
defaultSavingsAccountId=ImportHandlerUtils.readAsLong(SharedAccountsConstants.DEFAULT_SAVINGS_AC_COL,row);
+
+        Integer 
minimumActivePeriodDays=ImportHandlerUtils.readAsInt(SharedAccountsConstants.MINIMUM_ACTIVE_PERIOD_IN_DAYS_COL,row);
+        Integer minimumActivePeriodFrequencyType=0;
+
+        Integer 
lockInPeriod=ImportHandlerUtils.readAsInt(SharedAccountsConstants.LOCK_IN_PERIOD_COL,row);
+
+        Integer lockPeriodFrequencyType=null;
+
+        if 
(ImportHandlerUtils.readAsString(SharedAccountsConstants.LOCK_IN_PERIOD_FREQUENCY_TYPE,row)!=null)
 {
+            if 
(ImportHandlerUtils.readAsString(SharedAccountsConstants.LOCK_IN_PERIOD_FREQUENCY_TYPE,
 row)
+                    .equals(TemplatePopulateImportConstants.FREQUENCY_DAYS)) {
+                lockPeriodFrequencyType = 0;
+            } else if 
(ImportHandlerUtils.readAsString(SharedAccountsConstants.LOCK_IN_PERIOD_FREQUENCY_TYPE,
 row)
+                    .equals(TemplatePopulateImportConstants.FREQUENCY_WEEKS)) {
+                lockPeriodFrequencyType = 1;
+            } else if 
(ImportHandlerUtils.readAsString(SharedAccountsConstants.LOCK_IN_PERIOD_FREQUENCY_TYPE,
 row)
+                    .equals(TemplatePopulateImportConstants.FREQUENCY_MONTHS)) 
{
+                lockPeriodFrequencyType = 2;
+            } else if 
(ImportHandlerUtils.readAsString(SharedAccountsConstants.LOCK_IN_PERIOD_FREQUENCY_TYPE,
 row)
+                    .equals(TemplatePopulateImportConstants.FREQUENCY_YEARS)) {
+                lockPeriodFrequencyType = 3;
+            }
+        }
+        LocalDate 
applicationDate=ImportHandlerUtils.readAsDate(SharedAccountsConstants.APPLICATION_DATE_COL,row);
+        Boolean 
allowDividendCalc=ImportHandlerUtils.readAsBoolean(SharedAccountsConstants.ALLOW_DIVIDEND_CALCULATION_FOR_INACTIVE_CLIENTS_COL,row);
+
+        List<ShareAccountChargeData> charges=new ArrayList<>();
+        for (int 
cellNo=SharedAccountsConstants.CHARGES_NAME_1_COL;cellNo<SharedAccountsConstants.CHARGES_NAME_3_COL;cellNo+=2){
+            String chargeName=ImportHandlerUtils.readAsString(cellNo,row);
+            if (chargeName==null||chargeName.equals("0")){
+                break;
+            }
+            Long 
chargeId=ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.SHARED_PRODUCTS_SHEET_NAME),chargeName);
+
+            BigDecimal amount=null;
+            if(ImportHandlerUtils.readAsDouble(cellNo+1,row)!=null)
+            
amount=BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(cellNo+1,row));
+
+            ShareAccountChargeData shareAccountChargeData=new 
ShareAccountChargeData(chargeId,amount);
+            charges.add(shareAccountChargeData);
+        }
+        String 
status=ImportHandlerUtils.readAsString(SharedAccountsConstants.STATUS_COL,row);
+        statuses.add(status);
+
+        return 
ShareAccountData.importInstance(clientId,productId,totNoOfShares,externalId,submittedOnDate,minimumActivePeriodDays,
+                
minimumActivePeriodFrequencyType,lockInPeriod,lockPeriodFrequencyType,applicationDate,allowDividendCalc,charges,
+                defaultSavingsAccountId,row.getRowNum(),locale,dateFormat);
+    }
+
+    public Count importEntity(String dateFormat) {
+        Sheet 
sharedAccountsSheet=workbook.getSheet(TemplatePopulateImportConstants.SHARED_ACCOUNTS_SHEET_NAME);
+        int successCount=0;
+        int errorCount=0;
+        String errorMessage="";
+        GsonBuilder gsonBuilder = new GsonBuilder();
+        gsonBuilder.registerTypeAdapter(LocalDate.class, new 
DateSerializer(dateFormat));
+
+        for (ShareAccountData shareAccountData: shareAccountDataList) {
+            try {
+                String payload=gsonBuilder.create().toJson(shareAccountData);
+                final CommandWrapper commandRequest = new 
CommandWrapperBuilder() //
+                        .createAccount("share")//
+                        .withJson(payload) //
+                        .build(); //
+                final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
+                successCount++;
+                Cell statusCell = 
sharedAccountsSheet.getRow(shareAccountData.getRowIndex())
+                        .createCell(SharedAccountsConstants.STATUS_COL);
+                
statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED);
+                
statusCell.setCellStyle(ImportHandlerUtils.getCellStyle(workbook, 
IndexedColors.LIGHT_GREEN));
+            }catch (RuntimeException ex){
+                errorCount++;
+                ex.printStackTrace();
+                errorMessage=ImportHandlerUtils.getErrorMessage(ex);
+                
ImportHandlerUtils.writeErrorMessage(sharedAccountsSheet,shareAccountData.getRowIndex(),errorMessage,SharedAccountsConstants.STATUS_COL);
+            }
+        }
+        sharedAccountsSheet.setColumnWidth(SharedAccountsConstants.STATUS_COL, 
TemplatePopulateImportConstants.SMALL_COL_SIZE);
+        ImportHandlerUtils.writeString(SharedAccountsConstants.STATUS_COL, 
sharedAccountsSheet.getRow(TemplatePopulateImportConstants.ROW_HEADER_HEIGHT),
+                TemplatePopulateImportConstants.STATUS_COL_REPORT_HEADER);
+        return Count.instance(successCount,errorCount);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/staff/StaffImportHandler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/staff/StaffImportHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/staff/StaffImportHandler.java
new file mode 100644
index 0000000..a203c0a
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/staff/StaffImportHandler.java
@@ -0,0 +1,124 @@
+/**
+ * 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.importhandler.staff;
+
+import com.google.gson.GsonBuilder;
+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.constants.StaffConstants;
+import 
org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
+import org.apache.fineract.infrastructure.bulkimport.data.Count;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer;
+import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
+import org.apache.fineract.infrastructure.core.exception.*;
+import org.apache.fineract.organisation.staff.data.StaffData;
+import org.apache.poi.ss.usermodel.*;
+import org.joda.time.LocalDate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class StaffImportHandler implements ImportHandler {
+    private List<StaffData> staffList;
+    private Workbook workbook;
+
+    private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
+
+    @Autowired
+    public StaffImportHandler(final PortfolioCommandSourceWritePlatformService
+            commandsSourceWritePlatformService) {
+        this.commandsSourceWritePlatformService = 
commandsSourceWritePlatformService;
+    }
+
+    @Override
+    public Count process(Workbook workbook, String locale, String dateFormat) {
+        this.workbook=workbook;
+        this.staffList=new ArrayList<>();
+        readExcelFile(locale,dateFormat);
+        return importEntity(dateFormat);
+    }
+    public void readExcelFile(String locale, String dateFormat) {
+        Sheet 
staffSheet=workbook.getSheet(TemplatePopulateImportConstants.EMPLOYEE_SHEET_NAME);
+        Integer noOfEntries= 
ImportHandlerUtils.getNumberOfRows(staffSheet,TemplatePopulateImportConstants.FIRST_COLUMN_INDEX);
+        for (int rowIndex=1;rowIndex<=noOfEntries;rowIndex++){
+            Row row;
+                row=staffSheet.getRow(rowIndex);
+                if ( ImportHandlerUtils.isNotImported(row, 
StaffConstants.STATUS_COL)){
+                    staffList.add(readStaff(row,locale,dateFormat));
+                }
+
+        }
+    }
+
+    private StaffData readStaff(Row row,String locale, String dateFormat) {
+        String officeName = ImportHandlerUtils.readAsString( 
StaffConstants.OFFICE_NAME_COL, row);
+        Long officeId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME),
 officeName);
+        String firstName = 
ImportHandlerUtils.readAsString(StaffConstants.FIRST_NAME_COL, row);
+        String lastName = 
ImportHandlerUtils.readAsString(StaffConstants.LAST_NAME_COL, row);
+        Boolean 
isLoanOfficer=ImportHandlerUtils.readAsBoolean(StaffConstants.IS_LOAN_OFFICER,row);
+        String mobileNo=null;
+        if 
(ImportHandlerUtils.readAsLong(StaffConstants.MOBILE_NO_COL,row)!=null)
+            
mobileNo=ImportHandlerUtils.readAsLong(StaffConstants.MOBILE_NO_COL,row).toString();
+        LocalDate 
joinedOnDate=ImportHandlerUtils.readAsDate(StaffConstants.JOINED_ON_COL,row);
+        String 
externalId=ImportHandlerUtils.readAsString(StaffConstants.EXTERNAL_ID_COL,row);
+        Boolean 
isActive=ImportHandlerUtils.readAsBoolean(StaffConstants.IS_ACTIVE_COL,row);
+
+        return 
StaffData.importInstance(externalId,firstName,lastName,mobileNo,officeId,isLoanOfficer,isActive,
+                joinedOnDate,row.getRowNum(),locale,dateFormat);
+    }
+
+    public Count importEntity(String dateFormat) {
+        Sheet 
staffSheet=workbook.getSheet(TemplatePopulateImportConstants.EMPLOYEE_SHEET_NAME);
+        int successCount=0;
+        int errorCount=0;
+        String errorMessage="";
+        GsonBuilder gsonBuilder = new GsonBuilder();
+        gsonBuilder.registerTypeAdapter(LocalDate.class, new 
DateSerializer(dateFormat));
+        for (StaffData staff: staffList) {
+            try {
+                String payload=gsonBuilder.create().toJson(staff);
+                final CommandWrapper commandRequest = new 
CommandWrapperBuilder() //
+                        .createStaff()//
+                        .withJson(payload) //
+                        .build(); //
+                final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
+                successCount++;
+                Cell statusCell = 
staffSheet.getRow(staff.getRowIndex()).createCell(StaffConstants.STATUS_COL);
+                
statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED);
+                
statusCell.setCellStyle(ImportHandlerUtils.getCellStyle(workbook, 
IndexedColors.LIGHT_GREEN));
+            }catch (RuntimeException ex){
+                errorCount++;
+                ex.printStackTrace();
+                errorMessage=ImportHandlerUtils.getErrorMessage(ex);
+                
ImportHandlerUtils.writeErrorMessage(staffSheet,staff.getRowIndex(),errorMessage,StaffConstants.STATUS_COL);
+            }
+        }
+        staffSheet.setColumnWidth(StaffConstants.STATUS_COL, 
TemplatePopulateImportConstants.SMALL_COL_SIZE);
+        ImportHandlerUtils.writeString(StaffConstants.STATUS_COL, 
staffSheet.getRow(0), TemplatePopulateImportConstants.STATUS_COL_REPORT_HEADER);
+        return Count.instance(successCount,errorCount);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/users/UserImportHandler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/users/UserImportHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/users/UserImportHandler.java
new file mode 100644
index 0000000..c1ec639
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/users/UserImportHandler.java
@@ -0,0 +1,137 @@
+/**
+ * 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.importhandler.users;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+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.constants.TemplatePopulateImportConstants;
+import org.apache.fineract.infrastructure.bulkimport.constants.UserConstants;
+import org.apache.fineract.infrastructure.bulkimport.data.Count;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler;
+import 
org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils;
+import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
+import org.apache.fineract.infrastructure.core.exception.*;
+import org.apache.fineract.useradministration.data.AppUserData;
+import org.apache.poi.ss.usermodel.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+@Service
+public class UserImportHandler implements ImportHandler{
+    private Workbook workbook;
+    private List<AppUserData> users;
+    private List<String> statuses;
+
+    private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
+
+    @Autowired
+    public UserImportHandler(final PortfolioCommandSourceWritePlatformService
+            commandsSourceWritePlatformService) {
+        this.commandsSourceWritePlatformService = 
commandsSourceWritePlatformService;
+    }
+
+    @Override
+    public Count process(Workbook workbook, String locale, String dateFormat) {
+        this.workbook=workbook;
+        users=new ArrayList<>();
+        statuses=new ArrayList<>();
+        readExcelFile();
+        return importEntity(dateFormat);
+    }
+
+    public void readExcelFile() {
+        Sheet usersSheet = 
workbook.getSheet(TemplatePopulateImportConstants.USER_SHEET_NAME);
+        Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(usersSheet, 
TemplatePopulateImportConstants.FIRST_COLUMN_INDEX);
+        for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) {
+            Row row;
+            row = usersSheet.getRow(rowIndex);
+            if(ImportHandlerUtils.isNotImported(row, 
UserConstants.STATUS_COL)) {
+                users.add(readUsers(row));
+            }
+        }
+    }
+
+    private AppUserData readUsers(Row row) {
+        String officeName = 
ImportHandlerUtils.readAsString(UserConstants.OFFICE_NAME_COL, row);
+        Long officeId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME),
 officeName);
+        String staffName = 
ImportHandlerUtils.readAsString(UserConstants.STAFF_NAME_COL, row);
+        Long staffId = 
ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.STAFF_SHEET_NAME),
 staffName);
+        String 
userName=ImportHandlerUtils.readAsString(UserConstants.USER_NAME_COL,row);
+        String 
firstName=ImportHandlerUtils.readAsString(UserConstants.FIRST_NAME_COL,row);
+        String 
lastName=ImportHandlerUtils.readAsString(UserConstants.LAST_NAME_COL,row);
+        String 
email=ImportHandlerUtils.readAsString(UserConstants.EMAIL_COL,row);
+        Boolean 
autoGenPw=ImportHandlerUtils.readAsBoolean(UserConstants.AUTO_GEN_PW_COL,row);
+        Boolean 
overridepw=ImportHandlerUtils.readAsBoolean(UserConstants.OVERRIDE_PW_EXPIRY_POLICY_COL,row);
+        String 
status=ImportHandlerUtils.readAsString(UserConstants.STATUS_COL,row);
+        statuses.add(status);
+
+        List<Long> rolesIds=new ArrayList<>();
+        for (int 
cellNo=UserConstants.ROLE_NAME_START_COL;cellNo<UserConstants.ROLE_NAME_END_COL;cellNo++){
+            String roleName=ImportHandlerUtils.readAsString(cellNo,row);
+            if (roleName==null)
+                break;
+            Long 
roleId=ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.ROLES_SHEET_NAME),roleName);
+            if (!rolesIds.contains(roleId))
+             rolesIds.add(roleId);
+        }
+        return 
AppUserData.importInstance(officeId,staffId,userName,firstName,lastName,email,
+                autoGenPw,overridepw,rolesIds,row.getRowNum());
+
+    }
+
+    public Count importEntity(String dateFormat) {
+        Sheet 
userSheet=workbook.getSheet(TemplatePopulateImportConstants.USER_SHEET_NAME);
+        int successCount=0;
+        int errorCount=0;
+        String errorMessage="";
+        GsonBuilder gsonBuilder=new GsonBuilder();
+        for (AppUserData user:users){
+            try {
+                JsonObject 
userJsonob=gsonBuilder.create().toJsonTree(user).getAsJsonObject();
+                String payload=userJsonob.toString();
+                final CommandWrapper commandRequest = new 
CommandWrapperBuilder() //
+                        .createUser() //
+                        .withJson(payload) //
+                        .build(); //
+                final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
+                successCount++;
+                Cell statusCell = 
userSheet.getRow(user.getRowIndex()).createCell(UserConstants.STATUS_COL);
+                
statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED);
+                
statusCell.setCellStyle(ImportHandlerUtils.getCellStyle(workbook, 
IndexedColors.LIGHT_GREEN));
+
+            }catch (RuntimeException ex){
+                errorCount++;
+                ex.printStackTrace();
+                errorMessage=ImportHandlerUtils.getErrorMessage(ex);
+                
ImportHandlerUtils.writeErrorMessage(userSheet,user.getRowIndex(),errorMessage,UserConstants.STATUS_COL);
+            }
+        }
+        userSheet.setColumnWidth(UserConstants.STATUS_COL, 
TemplatePopulateImportConstants.SMALL_COL_SIZE);
+        ImportHandlerUtils.writeString(UserConstants.STATUS_COL, 
userSheet.getRow(TemplatePopulateImportConstants.ROWHEADER_INDEX),
+                TemplatePopulateImportConstants.STATUS_COL_REPORT_HEADER);
+        return Count.instance(successCount,errorCount);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/210647d4/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/AbstractWorkbookPopulator.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/AbstractWorkbookPopulator.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/AbstractWorkbookPopulator.java
new file mode 100644
index 0000000..d92b903
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/AbstractWorkbookPopulator.java
@@ -0,0 +1,161 @@
+/**
+ * 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.populator;
+
+import org.apache.fineract.organisation.office.data.OfficeData;
+import org.apache.fineract.portfolio.client.data.ClientData;
+import org.apache.fineract.portfolio.group.data.GroupGeneralData;
+import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData;
+import org.apache.poi.ss.usermodel.*;
+import org.joda.time.LocalDate;
+
+import java.math.BigDecimal;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+public abstract class AbstractWorkbookPopulator implements WorkbookPopulator {
+
+  protected void writeInt(int colIndex, Row row, int value) {
+      row.createCell(colIndex).setCellValue(value);
+  }
+
+  protected void writeLong(int colIndex, Row row, long value) {
+      row.createCell(colIndex).setCellValue(value);
+  }
+
+  protected void writeString(int colIndex, Row row, String value) {
+      row.createCell(colIndex).setCellValue(value);
+  }
+
+  protected void writeBoolean(int colIndex,Row row,Boolean value){
+      row.createCell(colIndex).setCellValue(value);
+  }
+  protected void writeDouble(int colIndex, Row row, double value) {
+      row.createCell(colIndex).setCellValue(value);
+  }
+
+  protected void writeFormula(int colIndex, Row row, String formula) {
+          row.createCell(colIndex).setCellType(Cell.CELL_TYPE_FORMULA);
+          row.createCell(colIndex).setCellFormula(formula);
+  }
+
+  protected void writeDate(int colIndex, Row row, String value, CellStyle 
dateCellStyle,String dateFormat) {
+    try {
+        SimpleDateFormat formatinDB=null;
+        if (value.matches("\\d{4}-\\d{1,2}-\\d{1,2}")){
+           formatinDB=new SimpleDateFormat("yyyy-mm-dd");
+        }else if (value.matches("\\d{1,2}/\\d{1,2}/\\d{4}")){
+            formatinDB=new SimpleDateFormat("dd/mm/yyyy");
+        }else if(value.matches("\\d{1,2} \\w{3,12} \\d{4}")){
+            formatinDB=new SimpleDateFormat("dd MMMM yyyy");
+        }
+        Date date1=formatinDB.parse(value);
+        SimpleDateFormat expectedFormat=new SimpleDateFormat(dateFormat);
+        Date date2=expectedFormat.parse(expectedFormat.format(date1));
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date2);
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        Date dateWithoutTime = cal.getTime();
+        row.createCell(colIndex).setCellValue(dateWithoutTime);
+        row.getCell(colIndex).setCellStyle(dateCellStyle);
+    } catch (ParseException pe) {
+      throw new IllegalArgumentException("ParseException");
+    }
+  }
+  
+  protected void writeBigDecimal(int colIndex, Row row, BigDecimal value) {
+          row.createCell(colIndex).setCellValue(value.doubleValue());
+       }
+ 
+  protected void setOfficeDateLookupTable(Sheet sheet, List<OfficeData> 
offices, int officeNameCol,
+      int activationDateCol,String dateFormat) {
+      if(offices!=null){
+        Workbook workbook = sheet.getWorkbook();
+        CellStyle dateCellStyle = workbook.createCellStyle();
+        short df = workbook.createDataFormat().getFormat(dateFormat);
+        dateCellStyle.setDataFormat(df);
+        int rowIndex = 0;
+        for (OfficeData office : offices) {
+            Row row = sheet.createRow(++rowIndex);
+            writeString(officeNameCol, row, office.name().trim().replaceAll("[ 
)(]", "_"));
+            writeDate(activationDateCol, row,
+                    "" + office.getOpeningDate().getDayOfMonth() + "/"
+                            + office.getOpeningDate().getMonthOfYear() + "/" + 
office.getOpeningDate().getYear(),
+                    dateCellStyle,dateFormat);
+
+            }
+        }
+  }
+
+  protected void setClientAndGroupDateLookupTable(Sheet sheet, 
List<ClientData> clients,
+            List<GroupGeneralData> groups, int nameCol, int 
activationDateCol,boolean containsClientExtId,
+          String dateFormat) {
+            Workbook workbook = sheet.getWorkbook();
+            CellStyle dateCellStyle = workbook.createCellStyle();
+            short df = workbook.createDataFormat().getFormat(dateFormat);
+            dateCellStyle.setDataFormat(df);
+            int rowIndex = 0;
+            SimpleDateFormat outputFormat = new SimpleDateFormat(dateFormat);
+            SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
+            Date date = null;
+            try {
+                if (clients != null){
+                    for (ClientData client : clients) {
+                        Row row = sheet.getRow(++rowIndex);
+                        if (row == null)
+                            row = sheet.createRow(rowIndex);
+                        writeString(nameCol, row, 
client.displayName().replaceAll("[ )(] ", "_") + "(" + client.id() + ")");
+
+                        if (client.getActivationDate() != null) {
+                            date = 
inputFormat.parse(client.getActivationDate().toString());
+                            writeDate(activationDateCol, row, 
outputFormat.format(date), dateCellStyle,dateFormat);
+                        }
+                        if (containsClientExtId){
+                            if (client.getExternalId()!=null){
+                                
writeString(nameCol+1,row,client.getExternalId());
+                            }
+                        }
+
+                    }
+            }
+            if (groups!=null){
+                for (GroupGeneralData group : groups) {
+                    Row row = sheet.getRow(++rowIndex);
+                    if (row == null)
+                        row = sheet.createRow(rowIndex);
+                    writeString(nameCol, row, group.getName().replaceAll("[ 
)(] ", "_"));
+
+                    date = 
inputFormat.parse(group.getActivationDate().toString());
+                    writeDate(activationDateCol, row, 
outputFormat.format(date), dateCellStyle,dateFormat);
+                    }
+                }
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+       }
+
+}
\ 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/populator/CenterSheetPopulator.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/CenterSheetPopulator.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/CenterSheetPopulator.java
new file mode 100644
index 0000000..bf828b4
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/CenterSheetPopulator.java
@@ -0,0 +1,123 @@
+/**
+ * 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.populator;
+
+import 
org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
+import org.apache.fineract.organisation.office.data.OfficeData;
+import org.apache.fineract.portfolio.group.data.CenterData;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class CenterSheetPopulator extends AbstractWorkbookPopulator {
+       private List<CenterData> allCenters;
+       private List<OfficeData> offices;
+
+       private Map<String, ArrayList<String>> officeToCenters;
+       private Map<Integer, Integer[]> officeNameToBeginEndIndexesOfCenters;
+       private Map<String, Long> centerNameToCenterId;
+
+       private static final int OFFICE_NAME_COL = 0;
+       private static final int CENTER_NAME_COL = 1;
+       private static final int CENTER_ID_COL = 2;
+
+       public CenterSheetPopulator(List<CenterData> centers, List<OfficeData> 
offices) {
+               this.allCenters = centers;
+               this.offices = offices;
+       }
+
+       @Override
+       public void populate(Workbook workbook,String dateFormat) {
+               Sheet centerSheet = 
workbook.createSheet(TemplatePopulateImportConstants.CENTER_SHEET_NAME);
+               setLayout(centerSheet);
+               setOfficeToCentersMap();
+               centerNameToCenterIdMap();
+               populateCentersByOfficeName(centerSheet);
+               centerSheet.protectSheet("");
+       }
+
+       private void centerNameToCenterIdMap() {
+               centerNameToCenterId = new HashMap<String, Long>();
+               for (CenterData centerData : allCenters) {
+                       centerNameToCenterId.put(centerData.getName(), 
centerData.getId());
+               }
+       }
+
+       private void populateCentersByOfficeName(Sheet centerSheet) {
+               int rowIndex = 1, officeIndex = 0, startIndex = 1;
+               officeNameToBeginEndIndexesOfCenters = new HashMap<Integer, 
Integer[]>();
+               Row row = centerSheet.createRow(rowIndex);
+               for (OfficeData office : offices) {
+                       startIndex = rowIndex + 1;
+                       writeString(OFFICE_NAME_COL, row, office.name());
+                       ArrayList<String> centersList = new ArrayList<String>();
+
+               if 
(officeToCenters.containsKey(office.name().trim().replaceAll("[ )(]", "_"))){
+                               centersList = 
officeToCenters.get(office.name().trim().replaceAll("[ )(]", "_"));
+                       if (!centersList.isEmpty()) {
+                               for (String centerName : centersList) {
+                                       writeString(CENTER_NAME_COL, row, 
centerName);
+                                       writeLong(CENTER_ID_COL, row, 
centerNameToCenterId.get(centerName));
+                                       row = centerSheet.createRow(++rowIndex);
+                               }
+                               
officeNameToBeginEndIndexesOfCenters.put(officeIndex++, new Integer[] { 
startIndex, rowIndex });
+                       } else {
+                               
officeNameToBeginEndIndexesOfCenters.put(officeIndex++, new Integer[] { 
startIndex, rowIndex + 1 });
+                       }
+                 }
+               }
+       }
+
+       private void setLayout(Sheet worksheet) {
+               Row rowHeader = 
worksheet.createRow(TemplatePopulateImportConstants.ROWHEADER_INDEX);
+               
rowHeader.setHeight(TemplatePopulateImportConstants.ROW_HEADER_HEIGHT);
+               for (int colIndex = 0; colIndex <= 10; colIndex++)
+                       worksheet.setColumnWidth(colIndex, 
TemplatePopulateImportConstants.MEDIUM_COL_SIZE);
+               writeString(OFFICE_NAME_COL, rowHeader, "Office Names");
+               writeString(CENTER_NAME_COL, rowHeader, "Center Names");
+               writeString(CENTER_ID_COL, rowHeader, "Center ID");
+       }
+
+       private void setOfficeToCentersMap() {
+               officeToCenters = new HashMap<>();
+               for (CenterData center : allCenters) {
+                       add(center.getOfficeName().trim().replaceAll("[ )(]", 
"_"), center.getName().trim());
+               }
+       }
+
+       // Guava Multi-map can reduce this.
+       private void add(String key, String value) {
+               ArrayList<String> values = officeToCenters.get(key);
+               if (values == null) {
+                       values = new ArrayList<>();
+               }
+               values.add(value);
+               officeToCenters.put(key, values);
+       }
+
+       public Map<Integer, Integer[]> 
getOfficeNameToBeginEndIndexesOfCenters() {
+               return officeNameToBeginEndIndexesOfCenters;
+       }
+
+}
\ 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/populator/ClientSheetPopulator.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/ClientSheetPopulator.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/ClientSheetPopulator.java
new file mode 100644
index 0000000..69c4ba4
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/ClientSheetPopulator.java
@@ -0,0 +1,144 @@
+/**
+ * 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.populator;
+
+import 
org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
+import org.apache.fineract.organisation.office.data.OfficeData;
+import org.apache.fineract.portfolio.client.data.ClientData;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ClientSheetPopulator extends AbstractWorkbookPopulator {
+       private List<ClientData> allClients;
+       private List<OfficeData> officesDataList;
+
+       private Map<String, ArrayList<String>> officeToClients;
+       private Map<Integer, Integer[]> officeNameToBeginEndIndexesOfClients;
+       private Map<String, Long> clientNameToClientId;
+       private Map<String, Long> clientNameToSavingsAccountIds;
+
+       private static final int OFFICE_NAME_COL = 0;
+       private static final int CLIENT_NAME_COL = 1;
+       private static final int CLIENT_ID_COL = 2;
+
+       public ClientSheetPopulator(final List<ClientData> clients, final 
List<OfficeData> Offices) {
+               this.allClients = clients;
+               this.officesDataList = Offices;
+       }
+
+       @Override
+       public void populate(Workbook workbook,String dateFormat) {
+               Sheet clientSheet = 
workbook.createSheet(TemplatePopulateImportConstants.CLIENT_SHEET_NAME);
+               setLayout(clientSheet);
+               setOfficeToClientsMap();
+               setClientNameToClientIdMap();
+               populateClientsByOfficeName(clientSheet);
+               clientSheet.protectSheet("");
+               setClientNameToSavingsAccountsIdsMap();
+       }
+
+       private void setClientNameToClientIdMap() {
+               clientNameToClientId = new HashMap<>();
+               for (ClientData clientData : allClients) {
+                       
clientNameToClientId.put(clientData.displayName().trim() + "(" + 
clientData.id() + ")",
+                                       clientData.id());
+               }
+       }
+
+       private void setLayout(Sheet worksheet) {
+               Row rowHeader = 
worksheet.createRow(TemplatePopulateImportConstants.ROWHEADER_INDEX);
+               
rowHeader.setHeight(TemplatePopulateImportConstants.ROW_HEADER_HEIGHT);
+               worksheet.setColumnWidth(OFFICE_NAME_COL, 
TemplatePopulateImportConstants.MEDIUM_COL_SIZE);
+               for (int colIndex = 1; colIndex <= 10; colIndex++)
+                       worksheet.setColumnWidth(colIndex, 
TemplatePopulateImportConstants.MEDIUM_COL_SIZE);
+               writeString(OFFICE_NAME_COL, rowHeader, "Office Names");
+               writeString(CLIENT_NAME_COL, rowHeader, "Client Names");
+               writeString(CLIENT_ID_COL, rowHeader, "Client ID");
+       }
+
+       private void setOfficeToClientsMap() {
+               officeToClients = new HashMap<>();
+               for (ClientData person : allClients) {
+                       
addToOfficeClientMap(person.getOfficeName().trim().replaceAll("[ )(]", "_"),
+                                       person.displayName().trim() + "(" + 
person.id() + ")");
+               }
+       }
+
+       private void setClientNameToSavingsAccountsIdsMap(){
+               clientNameToSavingsAccountIds=new HashMap<>();
+               for (ClientData client: allClients) {
+                       
clientNameToSavingsAccountIds.put(client.displayName().trim() + "(" + 
client.id() + ")",client.getSavingsAccountId());
+               }
+
+       }
+
+       // Guava Multi-map can reduce this.
+       private void addToOfficeClientMap(String key, String value) {
+               ArrayList<String> values = officeToClients.get(key);
+               if (values == null) {
+                       values = new ArrayList<String>();
+               }
+               values.add(value);
+               officeToClients.put(key, values);
+       }
+
+       private void populateClientsByOfficeName(Sheet clientSheet) {
+               int rowIndex = 1, startIndex = 1, officeIndex = 0;
+               officeNameToBeginEndIndexesOfClients = new HashMap<>();
+               Row row = clientSheet.createRow(rowIndex);
+               for (OfficeData office : officesDataList) {
+                       startIndex = rowIndex + 1;
+                       writeString(OFFICE_NAME_COL, row, office.name());
+                       ArrayList<String> clientList = new ArrayList<String>();
+                       if 
(officeToClients.containsKey(office.name().trim().replaceAll("[ )(]", "_")))
+                               clientList = 
officeToClients.get(office.name().trim().replaceAll("[ )(]", "_"));
+                       if (!clientList.isEmpty()) {
+                               for (String clientName : clientList) {
+                                       writeString(CLIENT_NAME_COL, row, 
clientName);
+                                       writeLong(CLIENT_ID_COL, row, 
clientNameToClientId.get(clientName));
+                                       row = clientSheet.createRow(++rowIndex);
+                               }
+                               
officeNameToBeginEndIndexesOfClients.put(officeIndex++, new Integer[] { 
startIndex, rowIndex });
+                       } else
+                               officeIndex++;
+               }
+       }
+
+       public List<ClientData> getClients() {
+               return allClients;
+       }
+
+       public Integer getClientsSize() {
+               return allClients.size();
+       }
+
+       public Map<Integer, Integer[]> 
getOfficeNameToBeginEndIndexesOfClients() {
+               return officeNameToBeginEndIndexesOfClients;
+       }
+
+       public Map<String, Long> getClientNameToSavingsAccountIds() {
+               return clientNameToSavingsAccountIds;
+       }
+}
\ No newline at end of file

Reply via email to