You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by na...@apache.org on 2016/05/17 13:17:36 UTC

[2/3] incubator-fineract git commit: Shares Integration Tests and Fixes

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/7ae9b67d/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountIntegrationTests.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountIntegrationTests.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountIntegrationTests.java
new file mode 100644
index 0000000..cb90464
--- /dev/null
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountIntegrationTests.java
@@ -0,0 +1,1032 @@
+/**
+ * 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.integrationtests.common.shares;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.fineract.infrastructure.core.service.DateUtils;
+import org.apache.fineract.integrationtests.common.ClientHelper;
+import org.apache.fineract.integrationtests.common.Utils;
+import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
+import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.gson.Gson;
+import com.jayway.restassured.builder.RequestSpecBuilder;
+import com.jayway.restassured.builder.ResponseSpecBuilder;
+import com.jayway.restassured.http.ContentType;
+import com.jayway.restassured.specification.RequestSpecification;
+import com.jayway.restassured.specification.ResponseSpecification;
+
+public class ShareAccountIntegrationTests {
+
+    private RequestSpecification requestSpec;
+    private ResponseSpecification responseSpec;
+    private ShareProductHelper shareProductHelper;
+
+    @Before
+    public void setup() {
+        Utils.initializeRESTAssured();
+        this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
+        this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
+        this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
+    }
+
+    @Test
+    public void testCreateShareProduct() {
+        // This method will check create share product, get share product,
+        // update share product.
+        System.out.println("------------------------------CREATING NEW SHARE PRODUCT ---------------------------------------");
+        shareProductHelper = new ShareProductHelper();
+        final Integer shareProductId = createShareProduct();
+        Assert.assertNotNull(shareProductId);
+        System.out.println("------------------------------CREATING SHARE PRODUCT COMPLETE---------------------------------------");
+
+        System.out.println("------------------------------RETRIEVING SHARE PRODUCT---------------------------------------");
+        Map<String, Object> shareProductData = ShareProductTransactionHelper
+                .retrieveShareProduct(shareProductId, requestSpec, responseSpec);
+        Assert.assertNotNull(shareProductData);
+        shareProductHelper.verifyShareProduct(shareProductData);
+
+        System.out.println("------------------------------RETRIEVING SHARE PRODUCT COMPLETE---------------------------------------");
+
+        System.out.println("------------------------------UPDATING SHARE PRODUCT---------------------------------------");
+
+        Map<String, Object> shareProductDataForUpdate = new HashMap<>();
+
+        shareProductDataForUpdate.put("totalShares", "2000");
+        shareProductDataForUpdate.put("sharesIssued", "2000");
+
+        String updateShareProductJsonString = new Gson().toJson(shareProductDataForUpdate);
+        Integer updatedProductId = ShareProductTransactionHelper.updateShareProduct(shareProductId, updateShareProductJsonString,
+                requestSpec, responseSpec);
+        Assert.assertNotNull(updatedProductId);
+        Map<String, Object> updatedShareProductData = ShareProductTransactionHelper.retrieveShareProduct(updatedProductId, requestSpec,
+                responseSpec);
+        String updatedTotalShares = String.valueOf(updatedShareProductData.get("totalShares"));
+        String updatedSharesIssued = String.valueOf(updatedShareProductData.get("totalSharesIssued"));
+        Assert.assertEquals("2000", updatedTotalShares);
+        Assert.assertEquals("2000", updatedSharesIssued);
+        System.out.println("------------------------------UPDATING SHARE PRODUCT COMPLETE---------------------------------------");
+
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testCreateShareAccount() {
+        shareProductHelper = new ShareProductHelper();
+        final Integer productId = createShareProduct();
+        Assert.assertNotNull(productId);
+        final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        Assert.assertNotNull(clientId);
+        Integer savingsAccountId = SavingsAccountHelper.openSavingsAccount(requestSpec, responseSpec, clientId, "1000");
+        Assert.assertNotNull(savingsAccountId);
+        final Integer shareAccountId = createShareAccount(clientId, productId, savingsAccountId);
+        Assert.assertNotNull(shareAccountId);
+        Map<String, Object> shareProductData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        Assert.assertNotNull(shareProductData);
+
+        Map<String, Object> shareAccountDataForUpdate = new HashMap<>();
+        shareAccountDataForUpdate.put("requestedShares", 30);
+        shareAccountDataForUpdate.put("applicationDate", "02 Mar 2016");
+        shareAccountDataForUpdate.put("dateFormat", "dd MMMM yyyy");
+        shareAccountDataForUpdate.put("locale", "en_GB");
+        String updateShareAccountJsonString = new Gson().toJson(shareAccountDataForUpdate);
+        ShareAccountTransactionHelper.updateShareAccount(shareAccountId, updateShareAccountJsonString, requestSpec, responseSpec);
+        shareProductData = ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        List<Map<String, Object>> transactions = (List<Map<String, Object>>) shareProductData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(1, transactions.size());
+        Map<String, Object> transaction = transactions.get(0);
+        Assert.assertEquals("30", String.valueOf(transaction.get("numberOfShares")));
+        Assert.assertEquals("60.0", String.valueOf(transaction.get("amount")));
+        Assert.assertEquals("60.0", String.valueOf(transaction.get("amountPaid")));
+        List<Integer> dateList = (List<Integer>) transaction.get("purchasedDate");
+        Calendar cal = Calendar.getInstance();
+        cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+        Date date = cal.getTime();
+        DateFormat simple = new SimpleDateFormat("dd MMM yyyy");
+        Assert.assertEquals("02 Mar 2016", simple.format(date));
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void testShareAccountApproval() {
+        DateFormat simple = new SimpleDateFormat("dd MMM yyyy");
+        shareProductHelper = new ShareProductHelper();
+        final Integer productId = createShareProduct();
+        Assert.assertNotNull(productId);
+        final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        Assert.assertNotNull(clientId);
+        Integer savingsAccountId = SavingsAccountHelper.openSavingsAccount(requestSpec, responseSpec, clientId, "1000");
+        Assert.assertNotNull(savingsAccountId);
+        String activationCharge = ChargesHelper.getShareAccountActivationChargeJson();
+        Integer activationChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, activationCharge);
+        String purchaseCharge = ChargesHelper.getShareAccountPurchaseChargeJson();
+        Integer purchaseChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, purchaseCharge);
+        String redeemCharge = ChargesHelper.getShareAccountRedeemChargeJson();
+        Integer redeemChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, redeemCharge);
+        List<Map<String, Object>> charges = new ArrayList<>();
+        charges.add(createCharge(activationChargeId, "2"));
+        charges.add(createCharge(purchaseChargeId, "2"));
+        charges.add(createCharge(redeemChargeId, "1"));
+        final Integer shareAccountId = createShareAccount(clientId, productId, savingsAccountId, charges);
+        Assert.assertNotNull(shareAccountId);
+        Map<String, Object> shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        Assert.assertNotNull(shareAccountData);
+        
+     // Approve share Account
+        Map<String, Object> approveMap = new HashMap<>();
+        approveMap.put("note", "Share Account Approval Note");
+        approveMap.put("dateFormat", "dd MMMM yyyy");
+        approveMap.put("approvedDate", "01 Jan 2016");
+        approveMap.put("locale", "en");
+        String approve = new Gson().toJson(approveMap);
+        ShareAccountTransactionHelper.postCommand("approve", shareAccountId, approve, requestSpec, responseSpec);
+        shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        Map<String, Object> statusMap = (Map<String, Object>) shareAccountData.get("status");
+        Assert.assertEquals("shareAccountStatusType.approved", String.valueOf(statusMap.get("code")));
+        Map<String, Object> timelineMap = (Map<String, Object>) shareAccountData.get("timeline");
+        List<Integer> dateList = (List<Integer>) timelineMap.get("approvedDate");
+        Calendar cal = Calendar.getInstance();
+        cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+        Date approvedDate = cal.getTime();
+        Assert.assertEquals("01 Jan 2016", simple.format(approvedDate));
+        List<Map<String, Object>> transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(2, transactions.size());
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            if (transactionType.equals("purchasedSharesType.purchased")) {
+                Assert.assertEquals("25", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("52.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("52.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Assert.assertEquals("01 Jan 2016", simple.format(date));
+            } else if (transactionType.equals("charge.payment")) {
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("amountPaid")));
+                Date transactionDate = DateUtils.getDateOfTenant() ;
+                Assert.assertEquals(simple.format(transactionDate), simple.format(date));
+            }
+        }
+
+        Map<String, Object> summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("25", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+    }
+    @Test
+    @SuppressWarnings("unchecked")
+    public void rejectShareAccount() {
+        shareProductHelper = new ShareProductHelper();
+        final Integer productId = createShareProduct();
+        Assert.assertNotNull(productId);
+        final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        Assert.assertNotNull(clientId);
+        Integer savingsAccountId = SavingsAccountHelper.openSavingsAccount(requestSpec, responseSpec, clientId, "1000");
+        Assert.assertNotNull(savingsAccountId);
+        String activationCharge = ChargesHelper.getShareAccountActivationChargeJson();
+        Integer activationChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, activationCharge);
+        String purchaseCharge = ChargesHelper.getShareAccountPurchaseChargeJson();
+        Integer purchaseChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, purchaseCharge);
+        String redeemCharge = ChargesHelper.getShareAccountRedeemChargeJson();
+        Integer redeemChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, redeemCharge);
+        List<Map<String, Object>> charges = new ArrayList<>();
+        charges.add(createCharge(activationChargeId, "2"));
+        charges.add(createCharge(purchaseChargeId, "2"));
+        charges.add(createCharge(redeemChargeId, "1"));
+        final Integer shareAccountId = createShareAccount(clientId, productId, savingsAccountId, charges);
+        Assert.assertNotNull(shareAccountId);
+        Map<String, Object> shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        Assert.assertNotNull(shareAccountData);
+        
+        // Reject share Account
+        Map<String, Object> rejectMap = new HashMap<>();
+        rejectMap.put("note", "Share Account Rejection Note");
+        String rejectJson = new Gson().toJson(rejectMap);
+        ShareAccountTransactionHelper.postCommand("reject", shareAccountId, rejectJson, requestSpec, responseSpec);
+        shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        DateFormat simple = new SimpleDateFormat("dd MMM yyyy");
+        Map<String, Object> statusMap = (Map<String, Object>) shareAccountData.get("status");
+        Assert.assertEquals("shareAccountStatusType.rejected", String.valueOf(statusMap.get("code")));
+        Map<String, Object> timelineMap = (Map<String, Object>) shareAccountData.get("timeline");
+        List<Integer> dateList = (List<Integer>) timelineMap.get("rejectedDate");
+        Calendar cal = Calendar.getInstance();
+        cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+        Date rejectedDate = cal.getTime();
+        Date currentTenantDate = DateUtils.getDateOfTenant() ;
+        Assert.assertEquals(simple.format(currentTenantDate), simple.format(rejectedDate));
+        
+        List<Map<String, Object>> transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(2, transactions.size());
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            if (transactionType.equals("purchasedSharesType.purchased")) {
+                Assert.assertEquals("25", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("52.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("50.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Assert.assertEquals("01 Jan 2016", simple.format(date));
+            } else if (transactionType.equals("charge.payment")) {
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("amountPaid")));
+                Date transactionDate = DateUtils.getDateOfTenant() ;
+                Assert.assertEquals(simple.format(transactionDate), simple.format(date));
+            }
+        }
+
+        Map<String, Object> summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+    }
+    
+    @Test
+    @SuppressWarnings("unchecked")
+    public void testShareAccountUndoApproval() {
+        DateFormat simple = new SimpleDateFormat("dd MMM yyyy");
+        shareProductHelper = new ShareProductHelper();
+        final Integer productId = createShareProduct();
+        Assert.assertNotNull(productId);
+        final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        Assert.assertNotNull(clientId);
+        Integer savingsAccountId = SavingsAccountHelper.openSavingsAccount(requestSpec, responseSpec, clientId, "1000");
+        Assert.assertNotNull(savingsAccountId);
+        String activationCharge = ChargesHelper.getShareAccountActivationChargeJson();
+        Integer activationChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, activationCharge);
+        String purchaseCharge = ChargesHelper.getShareAccountPurchaseChargeJson();
+        Integer purchaseChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, purchaseCharge);
+        String redeemCharge = ChargesHelper.getShareAccountRedeemChargeJson();
+        Integer redeemChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, redeemCharge);
+        List<Map<String, Object>> charges = new ArrayList<>();
+        charges.add(createCharge(activationChargeId, "2"));
+        charges.add(createCharge(purchaseChargeId, "2"));
+        charges.add(createCharge(redeemChargeId, "1"));
+        final Integer shareAccountId = createShareAccount(clientId, productId, savingsAccountId, charges);
+        Assert.assertNotNull(shareAccountId);
+        Map<String, Object> shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        Assert.assertNotNull(shareAccountData);
+        
+     // Approve share Account
+        Map<String, Object> approveMap = new HashMap<>();
+        approveMap.put("note", "Share Account Approval Note");
+        approveMap.put("dateFormat", "dd MMMM yyyy");
+        approveMap.put("approvedDate", "01 Jan 2016");
+        approveMap.put("locale", "en");
+        String approve = new Gson().toJson(approveMap);
+        ShareAccountTransactionHelper.postCommand("approve", shareAccountId, approve, requestSpec, responseSpec);
+        shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        Map<String, Object> statusMap = (Map<String, Object>) shareAccountData.get("status");
+        Assert.assertEquals("shareAccountStatusType.approved", String.valueOf(statusMap.get("code")));
+        Map<String, Object> timelineMap = (Map<String, Object>) shareAccountData.get("timeline");
+        List<Integer> dateList = (List<Integer>) timelineMap.get("approvedDate");
+        Calendar cal = Calendar.getInstance();
+        cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+        Date approvedDate = cal.getTime();
+        Assert.assertEquals("01 Jan 2016", simple.format(approvedDate));
+        
+        // Undo Approval share Account
+        Map<String, Object> undoApprovalMap = new HashMap<>();
+        String undoApprovalJson = new Gson().toJson(undoApprovalMap);
+        ShareAccountTransactionHelper.postCommand("undoapproval", shareAccountId, undoApprovalJson, requestSpec, responseSpec);
+        
+        shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        
+        statusMap = (Map<String, Object>) shareAccountData.get("status");
+        Assert.assertEquals("shareAccountStatusType.submitted.and.pending.approval", String.valueOf(statusMap.get("code")));
+        
+        List<Map<String, Object>> transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(2, transactions.size());
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            if (transactionType.equals("purchasedSharesType.purchased")) {
+                Assert.assertEquals("25", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("52.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Assert.assertEquals("01 Jan 2016", simple.format(date));
+            } else if (transactionType.equals("charge.payment")) {
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("amountPaid")));
+                Date transactionDate = DateUtils.getDateOfTenant() ;
+                Assert.assertEquals(simple.format(transactionDate), simple.format(date));
+            }
+        }
+
+        Map<String, Object> summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("25", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testCreateShareAccountWithCharges() {
+        shareProductHelper = new ShareProductHelper();
+        final Integer productId = createShareProduct();
+        Assert.assertNotNull(productId);
+        final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        Assert.assertNotNull(clientId);
+        Integer savingsAccountId = SavingsAccountHelper.openSavingsAccount(requestSpec, responseSpec, clientId, "1000");
+        Assert.assertNotNull(savingsAccountId);
+        String activationCharge = ChargesHelper.getShareAccountActivationChargeJson();
+        Integer activationChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, activationCharge);
+        String purchaseCharge = ChargesHelper.getShareAccountPurchaseChargeJson();
+        Integer purchaseChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, purchaseCharge);
+        String redeemCharge = ChargesHelper.getShareAccountRedeemChargeJson();
+        Integer redeemChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, redeemCharge);
+        List<Map<String, Object>> charges = new ArrayList<>();
+        charges.add(createCharge(activationChargeId, "2"));
+        charges.add(createCharge(purchaseChargeId, "2"));
+        charges.add(createCharge(redeemChargeId, "1"));
+        final Integer shareAccountId = createShareAccount(clientId, productId, savingsAccountId, charges);
+        Assert.assertNotNull(shareAccountId);
+        Map<String, Object> shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        Assert.assertNotNull(shareAccountData);
+
+        Map<String, Object> shareAccountDataForUpdate = new HashMap<>();
+        shareAccountDataForUpdate.put("requestedShares", 30);
+        shareAccountDataForUpdate.put("applicationDate", "02 Mar 2016");
+        shareAccountDataForUpdate.put("dateFormat", "dd MMMM yyyy");
+        shareAccountDataForUpdate.put("locale", "en_GB");
+        shareAccountDataForUpdate.put("charges", charges);
+
+        String updateShareAccountJsonString = new Gson().toJson(shareAccountDataForUpdate);
+        ShareAccountTransactionHelper.updateShareAccount(shareAccountId, updateShareAccountJsonString, requestSpec, responseSpec);
+        shareAccountData = ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        List<Map<String, Object>> transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(2, transactions.size());
+        DateFormat simple = new SimpleDateFormat("dd MMM yyyy");
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            List<Integer> dateList = (List<Integer>) transaction.get("purchasedDate");
+            Calendar cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            if (transactionType.equals("purchasedSharesType.purchased")) {
+                Assert.assertEquals("30", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("60.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Assert.assertEquals("02 Mar 2016", simple.format(date));
+            } else if (transactionType.equals("charge.payment")) {
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("chargeAmount")));
+            }
+        }
+
+        //charges verification
+        List<Map<String, Object>> chargesList = (List<Map<String, Object>>) shareAccountData.get("charges") ;
+        for(Map<String, Object> chargeDef: chargesList) {
+            Map<String, Object> chargeTimeTypeMap = (Map<String, Object>) chargeDef.get("chargeTimeType") ;
+            String chargeTimeType = String.valueOf(chargeTimeTypeMap.get("code")) ;
+            if(chargeTimeType.equals("chargeTimeType.activation")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharespurchase")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharesredeem")) {
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountOrPercentage")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else {
+                Assert.fail("Other Charge defintion found");
+            }
+        }
+        
+        // Approve share Account
+        Map<String, Object> approveMap = new HashMap<>();
+        approveMap.put("note", "Share Account Approval Note");
+        approveMap.put("dateFormat", "dd MMMM yyyy");
+        approveMap.put("approvedDate", "01 Jan 2016");
+        approveMap.put("locale", "en");
+        String approve = new Gson().toJson(approveMap);
+        ShareAccountTransactionHelper.postCommand("approve", shareAccountId, approve, requestSpec, responseSpec);
+        shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        Map<String, Object> statusMap = (Map<String, Object>) shareAccountData.get("status");
+        Assert.assertEquals("shareAccountStatusType.approved", String.valueOf(statusMap.get("code")));
+        Map<String, Object> timelineMap = (Map<String, Object>) shareAccountData.get("timeline");
+        List<Integer> dateList = (List<Integer>) timelineMap.get("approvedDate");
+        Calendar cal = Calendar.getInstance();
+        cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+        Date approvedDate = cal.getTime();
+        Assert.assertEquals("01 Jan 2016", simple.format(approvedDate));
+
+        //charges verification
+        chargesList = (List<Map<String, Object>>) shareAccountData.get("charges") ;
+        for(Map<String, Object> chargeDef: chargesList) {
+            Map<String, Object> chargeTimeTypeMap = (Map<String, Object>) chargeDef.get("chargeTimeType") ;
+            String chargeTimeType = String.valueOf(chargeTimeTypeMap.get("code")) ;
+            if(chargeTimeType.equals("chargeTimeType.activation")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharespurchase")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharesredeem")) {
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountOrPercentage")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else {
+                Assert.fail("Other Charge defintion found");
+            }
+        }
+        
+        Map<String, Object> activateMap = new HashMap<>();
+        activateMap.put("dateFormat", "dd MMMM yyyy");
+        activateMap.put("activatedDate", "01 Jan 2016");
+        activateMap.put("locale", "en");
+        String activateJson = new Gson().toJson(activateMap);
+        ShareAccountTransactionHelper.postCommand("activate", shareAccountId, activateJson, requestSpec, responseSpec);
+        shareAccountData = ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        statusMap = (Map<String, Object>) shareAccountData.get("status");
+        Assert.assertEquals("shareAccountStatusType.active", String.valueOf(statusMap.get("code")));
+        timelineMap = (Map<String, Object>) shareAccountData.get("timeline");
+        dateList = (List<Integer>) timelineMap.get("activatedDate");
+        cal = Calendar.getInstance();
+        cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+        Date activatedDate = cal.getTime();
+        Assert.assertEquals("01 Jan 2016", simple.format(activatedDate));
+
+        transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(2, transactions.size());
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            if (transactionType.equals("purchasedSharesType.purchased")) {
+                Assert.assertEquals("30", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Assert.assertEquals("02 Mar 2016", simple.format(date));
+            } else if (transactionType.equals("charge.payment")) {
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("01 Jan 2016", simple.format(date));
+            }
+        }
+
+      //charges verification
+        chargesList = (List<Map<String, Object>>) shareAccountData.get("charges") ;
+        for(Map<String, Object> chargeDef: chargesList) {
+            Map<String, Object> chargeTimeTypeMap = (Map<String, Object>) chargeDef.get("chargeTimeType") ;
+            String chargeTimeType = String.valueOf(chargeTimeTypeMap.get("code")) ;
+            if(chargeTimeType.equals("chargeTimeType.activation")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharespurchase")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharesredeem")) {
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountOrPercentage")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else {
+                Assert.fail("Other Charge defintion found");
+            }
+        }
+        
+        Map<String, Object> summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("30", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+
+        // apply additional shares
+        Map<String, Object> additionalSharesRequestMap = new HashMap<>();
+        additionalSharesRequestMap.put("requestedDate", "01 Apr 2016");
+        additionalSharesRequestMap.put("dateFormat", "dd MMMM yyyy");
+        additionalSharesRequestMap.put("locale", "en");
+        additionalSharesRequestMap.put("requestedShares", "15");
+        String additionalSharesRequestJson = new Gson().toJson(additionalSharesRequestMap);
+        ShareAccountTransactionHelper.postCommand("applyadditionalshares", shareAccountId, additionalSharesRequestJson, requestSpec,
+                responseSpec);
+        shareAccountData = ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(3, transactions.size());
+        String addtionalSharesRequestId = null;
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            String transactionDate = simple.format(date);
+            if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("02 Mar 2016")) {
+                Assert.assertEquals("30", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+            } else if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("01 Apr 2016")) {
+                addtionalSharesRequestId = String.valueOf(transaction.get("id"));
+                Assert.assertEquals("15", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("32.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("30.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Map<String, Object> transactionstatusMap = (Map<String, Object>) transaction.get("status");
+                Assert.assertEquals("purchasedSharesStatusType.applied", String.valueOf(transactionstatusMap.get("code")));
+
+            } else if (transactionType.equals("charge.payment")) {
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("01 Jan 2016", transactionDate);
+            }
+        }
+
+      //charges verification
+        chargesList = (List<Map<String, Object>>) shareAccountData.get("charges") ;
+        for(Map<String, Object> chargeDef: chargesList) {
+            Map<String, Object> chargeTimeTypeMap = (Map<String, Object>) chargeDef.get("chargeTimeType") ;
+            String chargeTimeType = String.valueOf(chargeTimeTypeMap.get("code")) ;
+            if(chargeTimeType.equals("chargeTimeType.activation")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharespurchase")) {
+                Assert.assertEquals("4.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharesredeem")) {
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountOrPercentage")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else {
+                Assert.fail("Other Charge defintion found");
+            }
+        }
+        
+        summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("30", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("15", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+
+        // Approve additional Shares request
+        Map<String, List<Map<String, Object>>> approveadditionalsharesMap = new HashMap<>();
+        List<Map<String, Object>> list = new ArrayList<>();
+        Map<String, Object> idsMap = new HashMap<>();
+        idsMap.put("id", addtionalSharesRequestId);
+        list.add(idsMap);
+        approveadditionalsharesMap.put("requestedShares", list);
+        String approveadditionalsharesJson = new Gson().toJson(approveadditionalsharesMap);
+        ShareAccountTransactionHelper.postCommand("approveadditionalshares", shareAccountId, approveadditionalsharesJson, requestSpec,
+                responseSpec);
+
+        shareAccountData = ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(3, transactions.size());
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            String transactionDate = simple.format(date);
+            if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("02 Mar 2016")) {
+                Assert.assertEquals("30", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+            } else if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("01 Apr 2016")) {
+                Assert.assertEquals("15", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("32.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("32.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Map<String, Object> transactionstatusMap = (Map<String, Object>) transaction.get("status");
+                Assert.assertEquals("purchasedSharesStatusType.approved", String.valueOf(transactionstatusMap.get("code")));
+
+            } else if (transactionType.equals("charge.payment")) {
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("01 Jan 2016", transactionDate);
+            }
+        }
+
+      //charges verification
+        chargesList = (List<Map<String, Object>>) shareAccountData.get("charges") ;
+        for(Map<String, Object> chargeDef: chargesList) {
+            Map<String, Object> chargeTimeTypeMap = (Map<String, Object>) chargeDef.get("chargeTimeType") ;
+            String chargeTimeType = String.valueOf(chargeTimeTypeMap.get("code")) ;
+            if(chargeTimeType.equals("chargeTimeType.activation")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharespurchase")) {
+                Assert.assertEquals("4.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("4.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharesredeem")) {
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountOrPercentage")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else {
+                Assert.fail("Other Charge defintion found");
+            }
+        }
+        
+        summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("45", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+
+        // apply aditional shres and reject it
+        additionalSharesRequestMap = new HashMap<>();
+        additionalSharesRequestMap.put("requestedDate", "01 May 2016");
+        additionalSharesRequestMap.put("dateFormat", "dd MMMM yyyy");
+        additionalSharesRequestMap.put("locale", "en");
+        additionalSharesRequestMap.put("requestedShares", "20");
+        additionalSharesRequestJson = new Gson().toJson(additionalSharesRequestMap);
+        ShareAccountTransactionHelper.postCommand("applyadditionalshares", shareAccountId, additionalSharesRequestJson, requestSpec,
+                responseSpec);
+        shareAccountData = ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(4, transactions.size());
+        addtionalSharesRequestId = null;
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            String transactionDate = simple.format(date);
+            if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("01 May 2016")) {
+                addtionalSharesRequestId = String.valueOf(transaction.get("id"));
+                Assert.assertEquals("20", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("42.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("40.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Map<String, Object> transactionstatusMap = (Map<String, Object>) transaction.get("status");
+                Assert.assertEquals("purchasedSharesStatusType.applied", String.valueOf(transactionstatusMap.get("code")));
+            }
+        }
+
+      //charges verification
+        chargesList = (List<Map<String, Object>>) shareAccountData.get("charges") ;
+        for(Map<String, Object> chargeDef: chargesList) {
+            Map<String, Object> chargeTimeTypeMap = (Map<String, Object>) chargeDef.get("chargeTimeType") ;
+            String chargeTimeType = String.valueOf(chargeTimeTypeMap.get("code")) ;
+            if(chargeTimeType.equals("chargeTimeType.activation")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharespurchase")) {
+                Assert.assertEquals("6.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("4.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharesredeem")) {
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountOrPercentage")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else {
+                Assert.fail("Other Charge defintion found");
+            }
+        }
+        
+        summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("45", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("20", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+
+        // rejectadditionalshares
+        Map<String, List<Map<String, Object>>> rejectadditionalsharesMap = new HashMap<>();
+        list = new ArrayList<>();
+        idsMap = new HashMap<>();
+        idsMap.put("id", addtionalSharesRequestId);
+        list.add(idsMap);
+        rejectadditionalsharesMap.put("requestedShares", list);
+        String rejectadditionalsharesJson = new Gson().toJson(rejectadditionalsharesMap);
+        ShareAccountTransactionHelper.postCommand("rejectadditionalshares", shareAccountId, rejectadditionalsharesJson, requestSpec,
+                responseSpec);
+        shareAccountData = ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(4, transactions.size());
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            String transactionDate = simple.format(date);
+            if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("01 May 2016")) {
+                addtionalSharesRequestId = String.valueOf(transaction.get("id"));
+                Assert.assertEquals("20", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("40.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("40.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Map<String, Object> transactionstatusMap = (Map<String, Object>) transaction.get("status");
+                Assert.assertEquals("purchasedSharesStatusType.rejected", String.valueOf(transactionstatusMap.get("code")));
+            }
+        }
+
+      //charges verification
+        chargesList = (List<Map<String, Object>>) shareAccountData.get("charges") ;
+        for(Map<String, Object> chargeDef: chargesList) {
+            Map<String, Object> chargeTimeTypeMap = (Map<String, Object>) chargeDef.get("chargeTimeType") ;
+            String chargeTimeType = String.valueOf(chargeTimeTypeMap.get("code")) ;
+            if(chargeTimeType.equals("chargeTimeType.activation")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharespurchase")) {
+                Assert.assertEquals("6.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("6.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharesredeem")) {
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountOrPercentage")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("0", String.valueOf(chargeDef.get("amountPaid")));
+            }else {
+                Assert.fail("Other Charge defintion found");
+            }
+        }
+        
+        summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("45", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+
+        // redeem shares
+        Map<String, Object> redeemRequestMap = new HashMap<>();
+        redeemRequestMap.put("requestedDate", "05 May 2016");
+        redeemRequestMap.put("dateFormat", "dd MMMM yyyy");
+        redeemRequestMap.put("locale", "en");
+        redeemRequestMap.put("requestedShares", "15");
+        String redeemRequestJson = new Gson().toJson(redeemRequestMap);
+        ShareAccountTransactionHelper.postCommand("redeemshares", shareAccountId, redeemRequestJson, requestSpec, responseSpec);
+        shareAccountData = ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(5, transactions.size());
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            String transactionDate = simple.format(date);
+            if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("02 Mar 2016")) {
+                Assert.assertEquals("30", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+            } else if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("01 Apr 2016")) {
+                Assert.assertEquals("15", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("32.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("32.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Map<String, Object> transactionstatusMap = (Map<String, Object>) transaction.get("status");
+                Assert.assertEquals("purchasedSharesStatusType.approved", String.valueOf(transactionstatusMap.get("code")));
+            } else if (transactionType.equals("purchasedSharesType.redeemed") && transactionDate.equals("05 May 2016")) {
+                Assert.assertEquals("15", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("29.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("29.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("1.0", String.valueOf(transaction.get("chargeAmount")));
+                Map<String, Object> transactionstatusMap = (Map<String, Object>) transaction.get("status");
+                Assert.assertEquals("purchasedSharesStatusType.approved", String.valueOf(transactionstatusMap.get("code")));
+            } else if (transactionType.equals("charge.payment")) {
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("01 Jan 2016", transactionDate);
+            }
+        }
+
+      //charges verification
+        chargesList = (List<Map<String, Object>>) shareAccountData.get("charges") ;
+        for(Map<String, Object> chargeDef: chargesList) {
+            Map<String, Object> chargeTimeTypeMap = (Map<String, Object>) chargeDef.get("chargeTimeType") ;
+            String chargeTimeType = String.valueOf(chargeTimeTypeMap.get("code")) ;
+            if(chargeTimeType.equals("chargeTimeType.activation")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharespurchase")) {
+                Assert.assertEquals("6.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("6.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharesredeem")) {
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountOrPercentage")));
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else {
+                Assert.fail("Other Charge defintion found");
+            }
+        }
+        summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("30", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+        
+        //Close Share Account
+        Map<String, Object> closeAccountMap = new HashMap<>();
+        closeAccountMap.put("note", "Share Account Close Note");
+        closeAccountMap.put("dateFormat", "dd MMMM yyyy");
+        closeAccountMap.put("closedDate", "10 May 2016");
+        closeAccountMap.put("locale", "en");
+        String closeJson = new Gson().toJson(closeAccountMap);
+        ShareAccountTransactionHelper.postCommand("close", shareAccountId, closeJson, requestSpec, responseSpec);
+        shareAccountData = ShareAccountTransactionHelper
+                .retrieveShareAccount(shareAccountId, requestSpec, responseSpec);
+        statusMap = (Map<String, Object>) shareAccountData.get("status");
+        Assert.assertEquals("shareAccountStatusType.closed", String.valueOf(statusMap.get("code")));
+        transactions = (List<Map<String, Object>>) shareAccountData.get("purchasedShares");
+        Assert.assertNotNull(transactions);
+        Assert.assertEquals(6, transactions.size());
+        for (int i = 0; i < transactions.size(); i++) {
+            Map<String, Object> transaction = transactions.get(i);
+            Map<String, Object> transactionTypeMap = (Map<String, Object>) transaction.get("type");
+            dateList = (List<Integer>) transaction.get("purchasedDate");
+            cal = Calendar.getInstance();
+            cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2));
+            Date date = cal.getTime();
+            String transactionType = (String) transactionTypeMap.get("code");
+            String transactionDate = simple.format(date);
+            if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("02 Mar 2016")) {
+                Assert.assertEquals("30", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("62.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+            } else if (transactionType.equals("purchasedSharesType.purchased") && transactionDate.equals("01 Apr 2016")) {
+                Assert.assertEquals("15", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("32.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("32.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice")));
+                Map<String, Object> transactionstatusMap = (Map<String, Object>) transaction.get("status");
+                Assert.assertEquals("purchasedSharesStatusType.approved", String.valueOf(transactionstatusMap.get("code")));
+            } else if (transactionType.equals("purchasedSharesType.redeemed") && transactionDate.equals("05 May 2016")) {
+                Assert.assertEquals("15", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("29.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("29.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("1.0", String.valueOf(transaction.get("chargeAmount")));
+                Map<String, Object> transactionstatusMap = (Map<String, Object>) transaction.get("status");
+                Assert.assertEquals("purchasedSharesStatusType.approved", String.valueOf(transactionstatusMap.get("code")));
+            }else if (transactionType.equals("purchasedSharesType.redeemed") && transactionDate.equals("10 May 2016")) {
+                Assert.assertEquals("30", String.valueOf(transaction.get("numberOfShares")));
+                Assert.assertEquals("59.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("59.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("1.0", String.valueOf(transaction.get("chargeAmount")));
+                Map<String, Object> transactionstatusMap = (Map<String, Object>) transaction.get("status");
+                Assert.assertEquals("purchasedSharesStatusType.approved", String.valueOf(transactionstatusMap.get("code")));
+            }else if (transactionType.equals("charge.payment")) {
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amount")));
+                Assert.assertEquals("2.0", String.valueOf(transaction.get("amountPaid")));
+                Assert.assertEquals("0", String.valueOf(transaction.get("chargeAmount")));
+                Assert.assertEquals("01 Jan 2016", transactionDate);
+            }
+        }
+      //charges verification
+        chargesList = (List<Map<String, Object>>) shareAccountData.get("charges") ;
+        for(Map<String, Object> chargeDef: chargesList) {
+            Map<String, Object> chargeTimeTypeMap = (Map<String, Object>) chargeDef.get("chargeTimeType") ;
+            String chargeTimeType = String.valueOf(chargeTimeTypeMap.get("code")) ;
+            if(chargeTimeType.equals("chargeTimeType.activation")) {
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharespurchase")) {
+                Assert.assertEquals("6.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("6.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else if(chargeTimeType.equals("chargeTimeType.sharesredeem")) {
+                Assert.assertEquals("1.0", String.valueOf(chargeDef.get("amountOrPercentage")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amount")));
+                Assert.assertEquals("0.0", String.valueOf(chargeDef.get("amountOutstanding")));
+                Assert.assertEquals("2.0", String.valueOf(chargeDef.get("amountPaid")));
+            }else {
+                Assert.fail("Other Charge defintion found");
+            }
+        }
+        summaryMap = (Map<String, Object>) shareAccountData.get("summary");
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalApprovedShares")));
+        Assert.assertEquals("0", String.valueOf(summaryMap.get("totalPendingForApprovalShares")));
+    }
+
+    private Integer createShareProduct() {
+        String shareProductJson = shareProductHelper.build();
+        return ShareProductTransactionHelper.createShareProduct(shareProductJson, requestSpec, responseSpec);
+    }
+
+    private Integer createShareAccount(final Integer clientId, final Integer productId, final Integer savingsAccountId) {
+        String josn = new ShareAccountHelper().withClientId(String.valueOf(clientId)).withProductId(String.valueOf(productId))
+                .withExternalId("External1").withSavingsAccountId(String.valueOf(savingsAccountId)).withSubmittedDate("01 Jan 2016")
+                .withApplicationDate("01 Jan 2016").withRequestedShares("25").build();
+        return ShareAccountTransactionHelper.createShareAccount(josn, requestSpec, responseSpec);
+    }
+
+    private Integer createShareAccount(final Integer clientId, final Integer productId, final Integer savingsAccountId,
+            List<Map<String, Object>> charges) {
+        String josn = new ShareAccountHelper().withClientId(String.valueOf(clientId)).withProductId(String.valueOf(productId))
+                .withExternalId("External1").withSavingsAccountId(String.valueOf(savingsAccountId)).withSubmittedDate("01 Jan 2016")
+                .withApplicationDate("01 Jan 2016").withRequestedShares("25").withCharges(charges).build();
+        return ShareAccountTransactionHelper.createShareAccount(josn, requestSpec, responseSpec);
+    }
+
+    private Map<String, Object> createCharge(final Integer chargeId, String amount) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("chargeId", chargeId);
+        map.put("amount", amount);
+        return map;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/7ae9b67d/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountTransactionHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountTransactionHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountTransactionHelper.java
new file mode 100644
index 0000000..a4685a3
--- /dev/null
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountTransactionHelper.java
@@ -0,0 +1,55 @@
+/**
+ * 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.integrationtests.common.shares;
+
+import java.util.Map;
+
+import org.apache.fineract.integrationtests.common.Utils;
+
+import com.jayway.restassured.specification.RequestSpecification;
+import com.jayway.restassured.specification.ResponseSpecification;
+
+public class ShareAccountTransactionHelper {
+
+    private static final String SHARE_ACCOUNT_URL = "/fineract-provider/api/v1/accounts/share";
+    private static final String CREATE_SHARE_ACCOUNT_URL = SHARE_ACCOUNT_URL + "?" + Utils.TENANT_IDENTIFIER;
+
+    public static Integer createShareAccount(final String shareProductJSON, final RequestSpecification requestSpec,
+            final ResponseSpecification responseSpec) {
+        return Utils.performServerPost(requestSpec, responseSpec, CREATE_SHARE_ACCOUNT_URL, shareProductJSON, "resourceId");
+    }
+
+    public static Map<String, Object> retrieveShareAccount(final Integer shareProductId, final RequestSpecification requestSpec,
+            final ResponseSpecification responseSpec) {
+        String url = SHARE_ACCOUNT_URL + "/" + shareProductId + "?" + Utils.TENANT_IDENTIFIER;
+        return Utils.performServerGet(requestSpec, responseSpec, url, "");
+    }
+
+    public static Integer updateShareAccount(final Integer shareAccountId, final String shareAccountJson,
+            final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
+        String url = SHARE_ACCOUNT_URL + "/" + shareAccountId + "?" + Utils.TENANT_IDENTIFIER;
+        return Utils.performServerPut(requestSpec, responseSpec, url, shareAccountJson, "resourceId");
+    }
+
+    public static Integer postCommand(final String command, final Integer shareAccountId, String jsonBody, final RequestSpecification requestSpec,
+            final ResponseSpecification responseSpec) {
+        String url = SHARE_ACCOUNT_URL + "/" + shareAccountId + "?command=" + command + "&" + Utils.TENANT_IDENTIFIER;
+        return Utils.performServerPost(requestSpec, responseSpec, url, jsonBody, "resourceId");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/7ae9b67d/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareDividendsTransactionHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareDividendsTransactionHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareDividendsTransactionHelper.java
new file mode 100644
index 0000000..19a1e26
--- /dev/null
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareDividendsTransactionHelper.java
@@ -0,0 +1,58 @@
+/**
+ * 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.integrationtests.common.shares;
+
+import java.util.Map;
+
+import org.apache.fineract.integrationtests.common.Utils;
+
+import com.jayway.restassured.specification.RequestSpecification;
+import com.jayway.restassured.specification.ResponseSpecification;
+
+
+
+public class ShareDividendsTransactionHelper {
+
+    private static final String SHARE_PRODUCT_URL = "/fineract-provider/api/v1/shareproduct";
+    private static final String DIVIDEND = "dividend" ;
+    
+    public static Integer createShareProductDividends(final Integer productId, final String dividendJson, final RequestSpecification requestSpec,
+            final ResponseSpecification responseSpec) {
+        String url = SHARE_PRODUCT_URL + "/" + productId + "/" + DIVIDEND + "?" + Utils.TENANT_IDENTIFIER ;
+        return Utils.performServerPost(requestSpec, responseSpec, url, dividendJson, "subResourceId");
+    }
+    
+    public static Integer postCommand(final String command, final Integer productId, final Integer dividendId, String jsonBody, final RequestSpecification requestSpec,
+            final ResponseSpecification responseSpec) {
+        String url = SHARE_PRODUCT_URL + "/" + productId + "/"+DIVIDEND + "/"+ dividendId + "?command=" + command + "&" + Utils.TENANT_IDENTIFIER;
+        return Utils.performServerPut(requestSpec, responseSpec, url, jsonBody, "resourceId");
+    }
+    
+    public static Map<String, Object> retrieveDividendDetails(final Integer productId, final Integer dividendId, final RequestSpecification requestSpec,
+            final ResponseSpecification responseSpec) {
+        String url = SHARE_PRODUCT_URL + "/" + productId + "/"+DIVIDEND + "/"+ dividendId +"?" + Utils.TENANT_IDENTIFIER;
+        return Utils.performServerGet(requestSpec, responseSpec, url, "");
+    }
+    
+    public static Map<String, Object> retrieveAllDividends(final Integer productId, final RequestSpecification requestSpec,
+            final ResponseSpecification responseSpec) {
+        String url = SHARE_PRODUCT_URL + "/" + productId + "/"+DIVIDEND +"?" + Utils.TENANT_IDENTIFIER;
+        return Utils.performServerGet(requestSpec, responseSpec, url, "");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/7ae9b67d/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java
new file mode 100644
index 0000000..c59bbbc
--- /dev/null
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java
@@ -0,0 +1,199 @@
+/**
+ * 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.integrationtests.common.shares;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.fineract.infrastructure.core.service.DateUtils;
+import org.apache.fineract.integrationtests.common.Utils;
+import org.joda.time.LocalDate;
+import org.junit.Assert;
+
+import com.google.gson.Gson;
+
+
+public class ShareProductHelper {
+
+    
+    private static final String NONE = "1";
+    private static final String CASH_BASED = "2";
+    private static final String LOCALE = "en_GB";
+    private static final String DIGITS_AFTER_DECIMAL = "4";
+    private static final String IN_MULTIPLES_OF = "0";
+    private static final String USD = "USD";
+    
+    private String productName = Utils.randomNameGenerator("SHARE_PRODUCT_", 6);
+    private String shortName = Utils.randomNameGenerator("", 4);
+    private String description = Utils.randomNameGenerator("", 20);
+    private String totalShares = "10000";
+    private final String currencyCode = USD;
+    private String sharesIssued = "10000";
+    private String unitPrice = "2.0" ;
+    private String minimumShares = "10" ;
+    private String nominalShares = "20" ;
+    private String maximumShares = "3000" ;
+    private String allowDividendCalculationForInactiveClients = "true" ;
+    private String lockinPeriodFrequency = "1";
+    private String lockinPeriodFrequencyType = "0";
+    private String accountingRule = NONE;
+    
+    String minimumActivePeriodForDividends = "1";
+    String minimumactiveperiodFrequencyType = "0";
+    
+    private List<Map<String, String>> charges = null ;
+    private List<Map<String, String>> marketPrices = null ;
+    
+    
+    public String build() {
+        final HashMap<String, Object> map = new HashMap<>();
+        map.put("name", this.productName);
+        map.put("shortName", this.shortName);
+        map.put("description", this.description);
+        map.put("currencyCode", this.currencyCode);
+        map.put("locale", LOCALE);
+        map.put("digitsAfterDecimal", DIGITS_AFTER_DECIMAL);
+        map.put("inMultiplesOf", IN_MULTIPLES_OF);
+        map.put("totalShares", this.totalShares) ;
+        map.put("sharesIssued", this.sharesIssued);
+        map.put("unitPrice", this.unitPrice) ;
+        map.put("minimumShares", this.minimumShares) ;
+        map.put("nominalShares", this.nominalShares) ;
+        map.put("maximumShares", this.maximumShares) ;
+        map.put("allowDividendCalculationForInactiveClients", this.allowDividendCalculationForInactiveClients) ;
+        map.put("accountingRule", this.accountingRule) ;
+        map.put("minimumActivePeriodForDividends", this.minimumActivePeriodForDividends) ;
+        map.put("minimumactiveperiodFrequencyType", this.minimumactiveperiodFrequencyType) ;
+        map.put("lockinPeriodFrequency", this.lockinPeriodFrequency) ;
+        map.put("lockinPeriodFrequencyType", this.lockinPeriodFrequencyType) ;
+        
+        if(charges != null) {
+            map.put("chargesSelected", charges) ;
+        }
+        
+        if(marketPrices != null) {
+            map.put("marketPricePeriods", marketPrices) ;
+        }
+        
+        String shareProductCreateJson = new Gson().toJson(map);
+        System.out.println(shareProductCreateJson);
+        return shareProductCreateJson;
+    }
+    
+    public ShareProductHelper withCashBasedAccounting() {
+        this.accountingRule = CASH_BASED ;
+        return this ;
+    }
+    
+    public ShareProductHelper withMarketPrice() {
+        this.marketPrices = new ArrayList<>() ;
+        LocalDate currentDate = DateUtils.getLocalDateOfTenant() ;
+        String[] prices = {"3.0", "4.0", "5.0", "6.0", "7.0"} ;
+        DateFormat simple = new SimpleDateFormat("dd MMMM yyyy");
+        for(int i =0 ; i < prices.length; i++) {
+            currentDate = currentDate.plusMonths(2) ;
+            Map<String, String> marketPrice = new HashMap<>() ;
+            marketPrice.put("fromDate", simple.format(currentDate)) ;
+            marketPrice.put("shareValue", prices[i]) ;
+            this.marketPrices.add(marketPrice) ;
+        }
+        return this ;
+    }
+    
+    public ShareProductHelper withCharges(final ArrayList<Long> charges) {
+        if(charges != null && !charges.isEmpty()) {
+            this.charges = new ArrayList<>() ;
+            for(Long chargeId: charges) {
+                Map<String, String> charge = new HashMap<>() ;
+                charge.put("id", String.valueOf(chargeId.longValue())) ;
+                this.charges.add(charge) ;
+            }
+        }
+        return this ;
+    }
+
+    @SuppressWarnings("unchecked")
+    public void verifyShareProduct(Map<String, Object> shareProductData) {
+        String productName = (String)shareProductData.get("name") ;
+        Assert.assertEquals(this.productName, productName);
+        String shortName = (String)shareProductData.get("shortName") ;
+        Assert.assertEquals(this.shortName, shortName);
+        
+        String description = (String)shareProductData.get("description") ;
+        Assert.assertEquals(this.description, description);
+        
+        Map<String, String> currency = (Map<String,String>)shareProductData.get("currency") ;
+        String currencyCode = currency.get("code") ;
+        Assert.assertEquals(this.currencyCode, currencyCode);
+        
+        String digitsAfterDecimal = String.valueOf(currency.get("decimalPlaces")) ;
+        Assert.assertEquals(DIGITS_AFTER_DECIMAL, digitsAfterDecimal);
+        
+        String inMultiplesOf = String.valueOf(currency.get("inMultiplesOf")) ;
+        Assert.assertEquals(IN_MULTIPLES_OF, inMultiplesOf);
+        
+        String totalShares = String.valueOf(shareProductData.get("totalShares")) ;
+        Assert.assertEquals(this.totalShares, totalShares);
+        
+        String sharesIssued = String.valueOf(shareProductData.get("totalSharesIssued")) ;
+        Assert.assertEquals(this.sharesIssued, sharesIssued);
+        
+        String unitPrice = String.valueOf(shareProductData.get("unitPrice")) ;
+        Assert.assertEquals(this.unitPrice, unitPrice);
+        
+        String minimumShares = String.valueOf(shareProductData.get("minimumShares")) ;
+        Assert.assertEquals(this.minimumShares, minimumShares);
+        
+        String nominalShares = String.valueOf(shareProductData.get("nominalShares")) ;
+        Assert.assertEquals(this.nominalShares, nominalShares);
+        
+        String maximumShares = String.valueOf(shareProductData.get("maximumShares")) ;
+        Assert.assertEquals(this.maximumShares, maximumShares);
+        
+        String allowDividendCalculationForInactiveClients = String.valueOf(shareProductData.get("allowDividendCalculationForInactiveClients")) ;
+        Assert.assertEquals(this.allowDividendCalculationForInactiveClients, allowDividendCalculationForInactiveClients);
+        
+        Map<String, Object> accountingRuleMap = (Map<String, Object>) shareProductData.get("accountingRule") ;
+        String accountingRule = String.valueOf(accountingRuleMap.get("id")) ;
+        Assert.assertEquals(this.accountingRule, accountingRule);
+        
+        String minimumActivePeriodForDividends = String.valueOf(shareProductData.get("minimumActivePeriod")) ;
+        Assert.assertEquals(this.minimumActivePeriodForDividends, minimumActivePeriodForDividends);
+        
+        Map<String, Object> minimumActivePeriodType = (Map<String, Object>) shareProductData.get("minimumActivePeriodForDividendsTypeEnum") ;
+        String minimumactiveperiodFrequencyType = String.valueOf(minimumActivePeriodType.get("id")) ;
+        Assert.assertEquals(this.minimumactiveperiodFrequencyType, minimumactiveperiodFrequencyType);
+        
+        String lockinPeriodFrequency = String.valueOf(shareProductData.get("lockinPeriod")) ;
+        Assert.assertEquals(this.lockinPeriodFrequency, lockinPeriodFrequency);
+        
+        Map<String, Object> lockinPeriodType = (Map<String, Object>) shareProductData.get("lockPeriodTypeEnum") ;
+        String lockinPeriodFrequencyType = String.valueOf(lockinPeriodType.get("id")) ;
+        Assert.assertEquals(this.lockinPeriodFrequencyType, lockinPeriodFrequencyType);
+        
+        ArrayList<Map<String, String>> charges = (ArrayList<Map<String, String>>)shareProductData.get("chargesSelected") ;
+        
+        ArrayList<Map<String, String>> marketPrices = (ArrayList<Map<String, String>>)shareProductData.get("marketPricePeriods") ;
+        
+    }
+}