http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java
index 5ec2ad8..5aa6fe5 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java
@@ -19,7 +19,6 @@
 package org.apache.fineract.portfolio.charge.domain;
 
 public enum ChargeTimeType {
-
     INVALID(0, "chargeTimeType.invalid"), //
     DISBURSEMENT(1, "chargeTimeType.disbursement"), // only for loan charges
     SPECIFIED_DUE_DATE(2, "chargeTimeType.specifiedDueDate"), // for loan and
@@ -30,9 +29,13 @@ public enum ChargeTimeType {
     MONTHLY_FEE(7, "chargeTimeType.monthlyFee"), // only for savings
     INSTALMENT_FEE(8, "chargeTimeType.instalmentFee"), // only for loan charges
     OVERDUE_INSTALLMENT(9, "chargeTimeType.overdueInstallment"), // only for
-    OVERDRAFT_FEE(10, "chargeTimeType.overdraftFee"),// only for savings
+    OVERDRAFT_FEE(10, "chargeTimeType.overdraftFee"), // only for savings
     WEEKLY_FEE(11, "chargeTimeType.weeklyFee"), // only for savings
-    TRANCHE_DISBURSEMENT(12,"chargeTimeType.tranchedisbursement"); // only for 
loan
+    TRANCHE_DISBURSEMENT(12, "chargeTimeType.tranchedisbursement"), // only for
+                                                                    // loan
+    SHAREACCOUNT_ACTIVATION(13, "chargeTimeType.activation"), // only for loan
+    SHARE_PURCHASE(14, "chargeTimeType.sharespurchase"), 
+    SHARE_REDEEM(15, "chargeTimeType.sharesredeem");
 
     private final Integer value;
     private final String code;
@@ -52,7 +55,8 @@ public enum ChargeTimeType {
 
     public static Object[] validLoanValues() {
         return new Integer[] { ChargeTimeType.DISBURSEMENT.getValue(), 
ChargeTimeType.SPECIFIED_DUE_DATE.getValue(),
-                ChargeTimeType.INSTALMENT_FEE.getValue(), 
ChargeTimeType.OVERDUE_INSTALLMENT.getValue(), 
ChargeTimeType.TRANCHE_DISBURSEMENT.getValue() };
+                ChargeTimeType.INSTALMENT_FEE.getValue(), 
ChargeTimeType.OVERDUE_INSTALLMENT.getValue(),
+                ChargeTimeType.TRANCHE_DISBURSEMENT.getValue() };
     }
 
     public static Object[] validLoanChargeValues() {
@@ -70,6 +74,10 @@ public enum ChargeTimeType {
         return new Integer[] { ChargeTimeType.SPECIFIED_DUE_DATE.getValue() };
     }
 
+    public static Object[] validShareValues() {
+        return new Integer[] { 
ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue(), 
ChargeTimeType.SHARE_PURCHASE.getValue(), 
ChargeTimeType.SHARE_REDEEM.getValue() };
+    }
+
     public static ChargeTimeType fromInt(final Integer chargeTime) {
         ChargeTimeType chargeTimeType = ChargeTimeType.INVALID;
         if (chargeTime != null) {
@@ -110,6 +118,15 @@ public enum ChargeTimeType {
                 case 12:
                     chargeTimeType = TRANCHE_DISBURSEMENT;
                 break;
+                case 13:
+                    chargeTimeType = SHAREACCOUNT_ACTIVATION;
+                break;
+                case 14:
+                    chargeTimeType = SHARE_PURCHASE;
+                break;
+                case 15:
+                    chargeTimeType = SHARE_REDEEM;
+                break;
                 default:
                     chargeTimeType = INVALID;
                 break;
@@ -167,16 +184,27 @@ public enum ChargeTimeType {
     }
 
     public boolean isAllowedSavingsChargeTime() {
-        return isOnSpecifiedDueDate() || isSavingsActivation() || 
isSavingsClosure() || isWithdrawalFee() || isAnnualFee() || isMonthlyFee()
-                || isWeeklyFee() || isOverdraftFee();
+        return isOnSpecifiedDueDate() || isSavingsActivation() || 
isSavingsClosure() || isWithdrawalFee() || isAnnualFee()
+                || isMonthlyFee() || isWeeklyFee() || isOverdraftFee();
     }
 
     public boolean isOverdraftFee() {
         return this.value.equals(ChargeTimeType.OVERDRAFT_FEE.getValue());
     }
-    
-    public boolean isTrancheDisbursement(){
-       return 
this.value.equals(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue());
+
+    public boolean isTrancheDisbursement() {
+        return 
this.value.equals(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue());
+    }
+
+    public boolean isShareAccountActivation() {
+        return 
this.value.equals(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue());
     }
 
+    public boolean isSharesPurchase() {
+        return this.value.equals(ChargeTimeType.SHARE_PURCHASE.getValue());
+    }
+
+    public boolean isSharesRedeem() {
+        return this.value.equals(ChargeTimeType.SHARE_REDEEM.getValue());
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ShareAccountChargeWithoutMandatoryFieldException.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ShareAccountChargeWithoutMandatoryFieldException.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ShareAccountChargeWithoutMandatoryFieldException.java
new file mode 100644
index 0000000..199e776
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ShareAccountChargeWithoutMandatoryFieldException.java
@@ -0,0 +1,34 @@
+/**
+ * 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.portfolio.charge.exception;
+
+import 
org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException;
+
+/**
+ * {@link AbstractPlatformDomainRuleException} thrown when currency mismatch
+ * occurs
+ */
+public class ShareAccountChargeWithoutMandatoryFieldException extends 
AbstractPlatformDomainRuleException {
+
+    public ShareAccountChargeWithoutMandatoryFieldException(final String 
entity, final String postFix, final String defaultUserMessage,
+            final Object... defaultUserMessageArgs) {
+        super("error.msg." + entity + "." + postFix + ".cannot.be.blank", 
defaultUserMessage, defaultUserMessageArgs);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java
index bbf18ba..d58acc3 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java
@@ -176,6 +176,25 @@ public final class 
ChargeDefinitionCommandFromApiJsonDeserializer {
                         .longGreaterThanZero();
             }
 
+        }else if(appliesTo.isSharesCharge()) {
+            final Integer chargeTimeType = 
this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeTimeType", element);
+            
baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull();
+            if (chargeTimeType != null) {
+                
baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType)
+                        .isOneOfTheseValues(ChargeTimeType.validShareValues());
+            }
+            
+            if (chargeCalculationType != null) {
+                
baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType)
+                        
.isOneOfTheseValues(ChargeCalculationType.validValuesForShares());
+            }
+            
+            if(chargeTimeType != null && 
chargeTimeType.equals(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue())) {
+                if(chargeCalculationType != null) {
+                    
baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType)
+                    
.isOneOfTheseValues(ChargeCalculationType.validValuesForShareAccountActivation());
+                }
+            }
         }
 
         final String name = this.fromApiJsonHelper.extractStringNamed("name", 
element);
@@ -263,11 +282,11 @@ public final class 
ChargeDefinitionCommandFromApiJsonDeserializer {
             final Collection<Object> validLoanValues = 
Arrays.asList(ChargeTimeType.validLoanValues());
             final Collection<Object> validSavingsValues = 
Arrays.asList(ChargeTimeType.validSavingsValues());
             final Collection<Object> validClientValues = 
Arrays.asList(ChargeTimeType.validClientValues());
-
+            final Collection<Object> validShareValues = 
Arrays.asList(ChargeTimeType.validShareValues()) ;
             final Collection<Object> allValidValues = new 
ArrayList<>(validLoanValues);
             allValidValues.addAll(validSavingsValues);
             allValidValues.addAll(validClientValues);
-
+            allValidValues.addAll(validShareValues) ;
             
baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull()
                     .isOneOfTheseValues(allValidValues.toArray(new 
Object[allValidValues.size()]));
         }
@@ -281,13 +300,13 @@ public final class 
ChargeDefinitionCommandFromApiJsonDeserializer {
             final Integer feeInterval = 
this.fromApiJsonHelper.extractIntegerNamed("feeInterval", element, 
Locale.getDefault());
             
baseDataValidator.reset().parameter("feeInterval").value(feeInterval).integerGreaterThanZero();
         }
-
+        
         if (this.fromApiJsonHelper.parameterExists("chargeCalculationType", 
element)) {
             final Integer chargeCalculationType = 
this.fromApiJsonHelper.extractIntegerNamed("chargeCalculationType", element,
                     Locale.getDefault());
             
baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType).notNull().inMinMaxRange(1,
 5);
         }
-
+        
         if (this.fromApiJsonHelper.parameterExists("chargePaymentMode", 
element)) {
             final Integer chargePaymentMode = 
this.fromApiJsonHelper.extractIntegerNamed("chargePaymentMode", element, 
Locale.getDefault());
             
baseDataValidator.reset().parameter("chargePaymentMode").value(chargePaymentMode).notNull().inMinMaxRange(0,
 1);
@@ -338,6 +357,11 @@ public final class 
ChargeDefinitionCommandFromApiJsonDeserializer {
 
     private void 
performChargeTimeNCalculationTypeValidation(DataValidatorBuilder 
baseDataValidator, final Integer chargeTimeType,
             final Integer chargeCalculationType) {
+        
if(chargeTimeType.equals(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue())){
+            
baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType)
+            
.isOneOfTheseValues(ChargeCalculationType.validValuesForShareAccountActivation());
+        }
+        
         if 
(chargeTimeType.equals(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue())) {
             
baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType)
                     
.isOneOfTheseValues(ChargeCalculationType.validValuesForTrancheDisbursement());

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java
index 18ff74b..4d36e07 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java
@@ -42,4 +42,8 @@ public interface ChargeDropdownReadPlatformService {
     List<EnumOptionData> retrieveClientCalculationTypes();
 
     List<EnumOptionData> retrieveClientCollectionTimeTypes();
+    
+    List<EnumOptionData> retrieveSharesCalculationTypes() ;
+    List<EnumOptionData> retrieveSharesCollectionTimeTypes() ;
+    
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java
index 8b5c68a..be5753b 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java
@@ -114,4 +114,16 @@ public class ChargeDropdownReadPlatformServiceImpl 
implements ChargeDropdownRead
     public List<EnumOptionData> retrieveClientCollectionTimeTypes() {
         return 
Arrays.asList(chargeTimeType(ChargeTimeType.SPECIFIED_DUE_DATE));
     }
+    
+    @Override
+    public List<EnumOptionData> retrieveSharesCalculationTypes() {
+       return Arrays.asList(chargeCalculationType(ChargeCalculationType.FLAT),
+                
chargeCalculationType(ChargeCalculationType.PERCENT_OF_AMOUNT));
+    }
+    
+    @Override
+    public List<EnumOptionData> retrieveSharesCollectionTimeTypes() {
+       return 
Arrays.asList(chargeTimeType(ChargeTimeType.SHAREACCOUNT_ACTIVATION), 
+               chargeTimeType(ChargeTimeType.SHARE_PURCHASE), 
chargeTimeType(ChargeTimeType.SHARE_REDEEM));
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java
index 68cabfd..0099be5 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java
@@ -81,6 +81,16 @@ public class ChargeEnumerations {
                 optionData = new 
EnumOptionData(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue().longValue(),
                         ChargeTimeType.TRANCHE_DISBURSEMENT.getCode(), 
"Tranche Disbursement");
             break;
+            case SHAREACCOUNT_ACTIVATION:
+                optionData = new 
EnumOptionData(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue().longValue(), 
ChargeTimeType.SHAREACCOUNT_ACTIVATION.getCode(), "Share Account Activate") ;
+            break ;
+            
+            case SHARE_PURCHASE:
+               optionData = new 
EnumOptionData(ChargeTimeType.SHARE_PURCHASE.getValue().longValue(), 
ChargeTimeType.SHARE_PURCHASE.getCode(), "Share Purchase") ;
+            break ;
+            case SHARE_REDEEM:
+               optionData = new 
EnumOptionData(ChargeTimeType.SHARE_REDEEM.getValue().longValue(), 
ChargeTimeType.SHARE_REDEEM.getCode(), "Share Redeem") ;
+            break ;
             default:
                 optionData = new 
EnumOptionData(ChargeTimeType.INVALID.getValue().longValue(), 
ChargeTimeType.INVALID.getCode(), "Invalid");
             break;
@@ -105,6 +115,9 @@ public class ChargeEnumerations {
             case CLIENT:
                 optionData = new 
EnumOptionData(ChargeAppliesTo.CLIENT.getValue().longValue(), 
ChargeAppliesTo.CLIENT.getCode(), "Client");
             break;
+            case SHARES:
+               optionData = new 
EnumOptionData(ChargeAppliesTo.SHARES.getValue().longValue(), 
ChargeAppliesTo.SHARES.getCode(), "Shares") ;
+            break ;
             default:
                 optionData = new 
EnumOptionData(ChargeAppliesTo.INVALID.getValue().longValue(), 
ChargeAppliesTo.INVALID.getCode(),
                         "Invalid");

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java
index 677e5d4..cd675af 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java
@@ -116,5 +116,11 @@ public interface ChargeReadPlatformService {
 
     /** Retrieve savings account charges **/
     Collection<ChargeData> retrieveSavingsAccountApplicableCharges(Long 
savingsId);
+  
+    /**
+     * Returns charge definitions which are applicable for shares 
+     */
+    Collection<ChargeData> retrieveSharesApplicableCharges();
 
+    public Collection<ChargeData> retrieveShareProductCharges(final Long 
shareProductId) ;
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
index 542e471..dcc4105 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
@@ -147,11 +147,15 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         final List<EnumOptionData> feeFrequencyOptions = 
this.dropdownReadPlatformService.retrievePeriodFrequencyTypeOptions();
         final Map<String, List<GLAccountData>> incomeOrLiabilityAccountOptions 
= this.accountingDropdownReadPlatformService
                 .retrieveAccountMappingOptionsForCharges();
+        final List<EnumOptionData> shareChargeCalculationTypeOptions = 
this.chargeDropdownReadPlatformService
+                .retrieveSharesCalculationTypes();
+        final List<EnumOptionData> shareChargeTimeTypeOptions = 
this.chargeDropdownReadPlatformService.retrieveSharesCollectionTimeTypes();
         final Collection<TaxGroupData> taxGroupOptions = 
this.taxReadPlatformService.retrieveTaxGroupsForLookUp();
         return ChargeData.template(currencyOptions, 
allowedChargeCalculationTypeOptions, allowedChargeAppliesToOptions,
                 allowedChargeTimeOptions, chargePaymentOptions, 
loansChargeCalculationTypeOptions, loansChargeTimeTypeOptions,
                 savingsChargeCalculationTypeOptions, 
savingsChargeTimeTypeOptions, clientChargeCalculationTypeOptions,
-                clientChargeTimeTypeOptions, feeFrequencyOptions, 
incomeOrLiabilityAccountOptions, taxGroupOptions);
+                clientChargeTimeTypeOptions, feeFrequencyOptions, 
incomeOrLiabilityAccountOptions, taxGroupOptions,
+                shareChargeCalculationTypeOptions, shareChargeTimeTypeOptions);
     }
 
     @Override
@@ -292,6 +296,10 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
             return chargeSchema() + " join m_savings_product_charge spc on 
spc.charge_id = c.id";
         }
 
+        public String shareProductChargeSchema() {
+            return chargeSchema() + " join m_share_product_charge mspc on 
mspc.charge_id = c.id";
+        }
+
         @Override
         public ChargeData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
             final Long id = rs.getLong("id");
@@ -397,6 +405,16 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
     }
 
     @Override
+    public Collection<ChargeData> retrieveShareProductCharges(final Long 
shareProductId) {
+        final ChargeMapper rm = new ChargeMapper();
+
+        String sql = "select " + rm.shareProductChargeSchema() + " where 
c.is_deleted=0 and c.is_active=1 and mspc.product_id=? ";
+        sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
+
+        return this.jdbcTemplate.query(sql, rm, new Object[] { shareProductId 
});
+    }
+
+    @Override
     public Collection<ChargeData> retrieveSavingsAccountApplicableCharges(Long 
savingsAccountId) {
 
         final ChargeMapper rm = new ChargeMapper();
@@ -419,4 +437,13 @@ public class ChargeReadPlatformServiceImpl implements 
ChargeReadPlatformService
         return this.jdbcTemplate.query(sql, rm, new Object[] { 
ChargeAppliesTo.CLIENT.getValue() });
     }
 
+    @Override
+    public Collection<ChargeData> retrieveSharesApplicableCharges() {
+        final ChargeMapper rm = new ChargeMapper();
+        String sql = "select " + rm.chargeSchema() + " where c.is_deleted=0 
and c.is_active=1 and c.charge_applies_to_enum=? ";
+        sql += 
addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled();
+        sql += " order by c.name ";
+
+        return this.jdbcTemplate.query(sql, rm, new Object[] { 
ChargeAppliesTo.SHARES.getValue() });
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java
index 21aba2e..c464470 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java
@@ -299,7 +299,7 @@ public class ClientsApiResource {
 
         final AccountSummaryCollectionData clientAccount = 
this.accountDetailsReadPlatformService.retrieveClientAccountDetails(clientId);
 
-        final Set<String> CLIENT_ACCOUNTS_DATA_PARAMETERS = new 
HashSet<>(Arrays.asList("loanAccounts", "savingsAccounts"));
+        final Set<String> CLIENT_ACCOUNTS_DATA_PARAMETERS = new 
HashSet<>(Arrays.asList("loanAccounts", "savingsAccounts", "shareAccounts"));
 
         final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
         return 
this.clientAccountSummaryToApiJsonSerializer.serialize(settings, clientAccount, 
CLIENT_ACCOUNTS_DATA_PARAMETERS);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java
index c251d1a..e977114 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java
@@ -28,6 +28,7 @@ import 
org.apache.fineract.infrastructure.codes.domain.CodeValue;
 import org.apache.fineract.portfolio.group.domain.Group;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
+import org.apache.fineract.portfolio.shareaccounts.domain.ShareAccount;
 import org.springframework.stereotype.Component;
 
 /**
@@ -45,7 +46,8 @@ public class AccountNumberGenerator {
     private final static String OFFICE_NAME = "officeName";
     private final static String LOAN_PRODUCT_SHORT_NAME = 
"loanProductShortName";
     private final static String SAVINGS_PRODUCT_SHORT_NAME = 
"savingsProductShortName";
-
+    private final static String SHARE_PRODUCT_SHORT_NAME = 
"sharesProductShortName" ;
+    
     public String generate(Client client, AccountNumberFormat 
accountNumberFormat) {
         Map<String, String> propertyMap = new HashMap<>();
         propertyMap.put(ID, client.getId().toString());
@@ -73,6 +75,13 @@ public class AccountNumberGenerator {
         return generateAccountNumber(propertyMap, accountNumberFormat);
     }
 
+    public String generate(ShareAccount shareaccount, AccountNumberFormat 
accountNumberFormat) {
+       Map<String, String> propertyMap = new HashMap<>();
+       propertyMap.put(ID, shareaccount.getId().toString());
+       propertyMap.put(SHARE_PRODUCT_SHORT_NAME, 
shareaccount.getShareProduct().getShortName());
+       return generateAccountNumber(propertyMap, accountNumberFormat) ;
+    }
+    
     private String generateAccountNumber(Map<String, String> propertyMap, 
AccountNumberFormat accountNumberFormat) {
         String accountNumber = StringUtils.leftPad(propertyMap.get(ID), 
AccountNumberGenerator.maxLength, '0');
         if (accountNumberFormat != null && accountNumberFormat.getPrefixEnum() 
!= null) {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java
index 0c80ce3..c4ce470 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java
@@ -157,12 +157,13 @@ public class LoanChargeReadPlatformServiceImpl implements 
LoanChargeReadPlatform
         final List<EnumOptionData> feeFrequencyOptions = 
this.dropdownReadPlatformService.retrievePeriodFrequencyTypeOptions();
         // this field is applicable only for client charges
         final Map<String, List<GLAccountData>> incomeOrLiabilityAccountOptions 
= null;
+        final List<EnumOptionData> shareChargeCalculationTypeOptions = null ;
+        final List<EnumOptionData> shareChargeTimeTypeOptions = null ;
         final Collection<TaxGroupData> taxGroupOptions = null;
-
         return ChargeData.template(null, allowedChargeCalculationTypeOptions, 
null, allowedChargeTimeOptions, null,
                 loansChargeCalculationTypeOptions, loansChargeTimeTypeOptions, 
savingsChargeCalculationTypeOptions,
                 savingsChargeTimeTypeOptions, 
clientChargeCalculationTypeOptions, clientChargeTimeTypeOptions, 
feeFrequencyOptions,
-                incomeOrLiabilityAccountOptions, taxGroupOptions);
+                incomeOrLiabilityAccountOptions, taxGroupOptions, 
shareChargeCalculationTypeOptions, shareChargeTimeTypeOptions);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java
index 5f58b36..9baddda 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java
@@ -18,9 +18,6 @@
  */
 package org.apache.fineract.portfolio.products.api;
 
-import java.util.Collection;
-import java.util.HashSet;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
@@ -41,80 +38,85 @@ import 
org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
 import 
org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
+import org.apache.fineract.infrastructure.core.service.Page;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.portfolio.products.constants.ProductsApiConstants;
 import org.apache.fineract.portfolio.products.data.ProductData;
-import org.apache.fineract.portfolio.products.service.ProductCommandsService;
 import 
org.apache.fineract.portfolio.products.service.ProductReadPlatformService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
-
 @Path("/products/{type}")
 @Component
 @Scope("singleton")
 public class ProductsApiResource {
 
-    private final ApplicationContext applicationContext ;
+    private final ApplicationContext applicationContext;
     private final ApiRequestParameterHelper apiRequestParameterHelper;
     private final DefaultToApiJsonSerializer<ProductData> toApiJsonSerializer;
-    private final DefaultToApiJsonSerializer<Object> toApiObjectJsonSerializer 
;
+    private final DefaultToApiJsonSerializer<Object> toApiObjectJsonSerializer;
     private final PlatformSecurityContext platformSecurityContext;
     private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
-    
+
     @Autowired
-    public ProductsApiResource(final ApplicationContext applicationContext,
-            final ApiRequestParameterHelper apiRequestParameterHelper,
-            final DefaultToApiJsonSerializer<ProductData> toApiJsonSerializer,
-            final PlatformSecurityContext platformSecurityContext,
+    public ProductsApiResource(final ApplicationContext applicationContext, 
final ApiRequestParameterHelper apiRequestParameterHelper,
+            final DefaultToApiJsonSerializer<ProductData> toApiJsonSerializer, 
final PlatformSecurityContext platformSecurityContext,
             final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService,
             final DefaultToApiJsonSerializer<Object> 
toApiDividendsJsonSerializer) {
-        this.applicationContext = applicationContext ;
-        this.apiRequestParameterHelper = apiRequestParameterHelper ;
-        this.toApiJsonSerializer = toApiJsonSerializer ;
-        this.platformSecurityContext = platformSecurityContext ; 
-        this.commandsSourceWritePlatformService = 
commandsSourceWritePlatformService ;
-        this.toApiObjectJsonSerializer = toApiDividendsJsonSerializer ;
+        this.applicationContext = applicationContext;
+        this.apiRequestParameterHelper = apiRequestParameterHelper;
+        this.toApiJsonSerializer = toApiJsonSerializer;
+        this.platformSecurityContext = platformSecurityContext;
+        this.commandsSourceWritePlatformService = 
commandsSourceWritePlatformService;
+        this.toApiObjectJsonSerializer = toApiDividendsJsonSerializer;
     }
-    
+
     @GET
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
     public String retrieveTemplate(@PathParam("type") final String 
productType, @Context final UriInfo uriInfo) {
-        String serviceName = 
productType+ProductsApiConstants.READPLATFORM_NAME ;
-        ProductReadPlatformService service = (ProductReadPlatformService) 
this.applicationContext.getBean(serviceName) ;
-        ProductData data = service.retrieveTemplate() ;
+        String serviceName = productType + 
ProductsApiConstants.READPLATFORM_NAME;
+        ProductReadPlatformService service = (ProductReadPlatformService) 
this.applicationContext.getBean(serviceName);
+        ProductData data = service.retrieveTemplate();
         final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
         return this.toApiJsonSerializer.serialize(settings, data, 
service.getResponseDataParams());
     }
-    
+
     @GET
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
     public String retrieveProduct(@PathParam("productId") final Long 
productId, @PathParam("type") final String productType,
             @Context final UriInfo uriInfo) {
-        String serviceName = 
productType+ProductsApiConstants.READPLATFORM_NAME ;
-        ProductReadPlatformService service = (ProductReadPlatformService) 
this.applicationContext.getBean(serviceName) ;
-        ProductData data = service.retrieveOne(productId) ;
+        String serviceName = productType + 
ProductsApiConstants.READPLATFORM_NAME;
+        ProductReadPlatformService service = (ProductReadPlatformService) 
this.applicationContext.getBean(serviceName);
         final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
+
+        ProductData data = service.retrieveOne(productId, 
settings.isTemplate());
+
         return this.toApiJsonSerializer.serialize(settings, data, 
service.getResponseDataParams());
     }
-    
+
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllProducts(@PathParam("type") final String 
productType, @Context final UriInfo uriInfo) {
-        String serviceName = 
productType+ProductsApiConstants.READPLATFORM_NAME ;
-        ProductReadPlatformService service = (ProductReadPlatformService) 
this.applicationContext.getBean(serviceName) ;
-        Collection<ProductData> data = service.retrieveAllProducts() ;
+    public String retrieveAllProducts(/*
+                                       * @PathParam("type") final String
+                                       * productType, @Context final UriInfo
+                                       * uriInfo
+                                       */
+    @PathParam("type") final String productType, @QueryParam("offset") final 
Integer offset, @QueryParam("limit") final Integer limit,
+            @Context final UriInfo uriInfo) {
+        String serviceName = productType + 
ProductsApiConstants.READPLATFORM_NAME;
+        ProductReadPlatformService service = (ProductReadPlatformService) 
this.applicationContext.getBean(serviceName);
+        Page<ProductData> data = service.retrieveAllProducts(offset, limit);
         final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return this.toApiJsonSerializer.serialize(settings, data, 
service.getResponseDataParams()); 
+        return this.toApiJsonSerializer.serialize(settings, data, 
service.getResponseDataParams());
     }
-    
+
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
@@ -125,32 +127,32 @@ public class ProductsApiResource {
         final CommandProcessingResult commandProcessingResult = 
this.commandsSourceWritePlatformService.logCommandSource(commandWrapper);
         return this.toApiJsonSerializer.serialize(commandProcessingResult);
     }
-    
+
     @POST
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String handleCommands(@PathParam("type") final String productType, 
@PathParam("productId") final Long productId, @QueryParam("command") final 
String commandParam,
-            @Context final UriInfo uriInfo, final String apiRequestBodyAsJson) 
{
-        String serviceName = 
productType.toUpperCase()+ProductsApiConstants.PRODUCT_COMMANDSERVICE ;
-        ProductCommandsService service = (ProductCommandsService) 
this.applicationContext.getBean(serviceName) ;
-        final Object obj = service.handleCommand(productId, commandParam, 
apiRequestBodyAsJson) ;
-        final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return this.toApiObjectJsonSerializer.serialize(settings, obj, new 
HashSet<String>());
+    public String handleCommands(@PathParam("type") final String productType, 
@PathParam("productId") final Long productId,
+            @QueryParam("command") final String commandParam, 
@SuppressWarnings("unused") @Context final UriInfo uriInfo, final String 
apiRequestBodyAsJson) {
+        CommandWrapper commandWrapper = new 
CommandWrapperBuilder().createProductCommand(productType, commandParam, 
productId)
+                .withJson(apiRequestBodyAsJson).build();
+        final CommandProcessingResult commandProcessingResult = 
this.commandsSourceWritePlatformService.logCommandSource(commandWrapper);
+        return this.toApiJsonSerializer.serialize(commandProcessingResult);
     }
-    
+
     @PUT
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateProduct(@PathParam("type") final String productType, 
@PathParam("productId") final Long productId, final String 
apiRequestBodyAsJson) {
+    public String updateProduct(@PathParam("type") final String productType, 
@PathParam("productId") final Long productId,
+            final String apiRequestBodyAsJson) {
         this.platformSecurityContext.authenticatedUser();
         final CommandWrapper commandRequest = new 
CommandWrapperBuilder().updateProduct(productType, productId)
                 .withJson(apiRequestBodyAsJson).build();
         final CommandProcessingResult result = 
this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
         return this.toApiJsonSerializer.serialize(result);
     }
-    
+
     private boolean is(final String commandParam, final String commandValue) {
         return StringUtils.isNotBlank(commandParam) && 
commandParam.trim().equalsIgnoreCase(commandValue);
     }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java
index 5c93948..e0ae46a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java
@@ -21,15 +21,18 @@ package org.apache.fineract.portfolio.products.service;
 import java.util.Collection;
 import java.util.Set;
 
+import org.apache.fineract.infrastructure.core.service.Page;
 import org.apache.fineract.portfolio.products.data.ProductData;
 
 public interface ProductReadPlatformService {
 
-    public Collection<ProductData> retrieveAllProducts();
+    public Page<ProductData> retrieveAllProducts(Integer offSet, Integer 
limit);
 
-    public ProductData retrieveOne(final Long productId);
+    public ProductData retrieveOne(final Long productId, boolean 
includeTemplate);
 
     public ProductData retrieveTemplate();
 
     public Set<String> getResponseDataParams();
+    
+    public Collection<ProductData> retrieveAllForLookup() ;
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java
index f326b08..057f883 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java
@@ -34,6 +34,7 @@ public enum SavingsAccountTransactionType {
     ANNUAL_FEE(5, "savingsAccountTransactionType.annualFee"), //
     WAIVE_CHARGES(6, "savingsAccountTransactionType.waiveCharge"), //
     PAY_CHARGE(7, "savingsAccountTransactionType.payCharge"), //
+    DIVIDEND_PAYOUT(8, "savingsAccountTransactionType.dividendPayout"), //
     INITIATE_TRANSFER(12, "savingsAccountTransactionType.initiateTransfer"), //
     APPROVE_TRANSFER(13, "savingsAccountTransactionType.approveTransfer"), //
     WITHDRAW_TRANSFER(14, "savingsAccountTransactionType.withdrawTransfer"), //
@@ -84,6 +85,9 @@ public enum SavingsAccountTransactionType {
             case 7:
                 savingsAccountTransactionType = 
SavingsAccountTransactionType.PAY_CHARGE;
             break;
+            case 8:
+                savingsAccountTransactionType = 
SavingsAccountTransactionType.DIVIDEND_PAYOUT;
+            break;
             case 12:
                 savingsAccountTransactionType = 
SavingsAccountTransactionType.INITIATE_TRANSFER;
             break;
@@ -165,6 +169,10 @@ public enum SavingsAccountTransactionType {
         return 
this.value.equals(SavingsAccountTransactionType.WRITTEN_OFF.getValue());
     }
 
+    public boolean isDividendPayout() {
+        return 
this.value.equals(SavingsAccountTransactionType.DIVIDEND_PAYOUT.getValue());
+    }
+
     public boolean isIncomeFromInterest() {
         return 
this.value.equals(SavingsAccountTransactionType.OVERDRAFT_INTEREST.getValue());
     }
@@ -174,6 +182,6 @@ public enum SavingsAccountTransactionType {
     }
 
     public boolean isCredit() {
-        return isDeposit() || isInterestPosting();
+        return isDeposit() || isInterestPosting() || isDividendPayout();
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
index d4b9cf1..e7da011 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
@@ -31,6 +31,7 @@ public class SavingsAccountTransactionEnumData {
     private final String value;
 
     private final boolean deposit;
+    private final boolean dividendPayout;
     private final boolean withdrawal;
     private final boolean interestPosting;
     private final boolean feeDeduction;
@@ -48,6 +49,7 @@ public class SavingsAccountTransactionEnumData {
         this.code = code;
         this.value = value;
         this.deposit = 
Long.valueOf(SavingsAccountTransactionType.DEPOSIT.getValue()).equals(this.id);
+        this.dividendPayout = 
Long.valueOf(SavingsAccountTransactionType.DIVIDEND_PAYOUT.getValue()).equals(this.id);
         this.withdrawal = 
Long.valueOf(SavingsAccountTransactionType.WITHDRAWAL.getValue()).equals(this.id);
         this.interestPosting = 
Long.valueOf(SavingsAccountTransactionType.INTEREST_POSTING.getValue()).equals(this.id);
         this.feeDeduction = 
Long.valueOf(SavingsAccountTransactionType.ANNUAL_FEE.getValue()).equals(this.id)
@@ -127,5 +129,9 @@ public class SavingsAccountTransactionEnumData {
     public boolean isWithholdTax() {
         return this.withholdTax;
     }
+    
+    public boolean isDividendPayout() {
+        return this.dividendPayout;
+    }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
index 053f438..5cc2065 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
@@ -88,6 +88,7 @@ import org.apache.fineract.portfolio.client.domain.Client;
 import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType;
 import org.apache.fineract.portfolio.group.domain.Group;
 import org.apache.fineract.portfolio.savings.DepositAccountType;
+import org.apache.fineract.portfolio.savings.SavingsAccountTransactionType;
 import org.apache.fineract.portfolio.savings.SavingsApiConstants;
 import 
org.apache.fineract.portfolio.savings.SavingsCompoundingInterestPeriodType;
 import 
org.apache.fineract.portfolio.savings.SavingsInterestCalculationDaysInYearType;
@@ -844,6 +845,15 @@ public class SavingsAccount extends 
AbstractPersistable<Long> {
     }
 
     public SavingsAccountTransaction deposit(final 
SavingsAccountTransactionDTO transactionDTO) {
+        return deposit(transactionDTO, SavingsAccountTransactionType.DEPOSIT);
+    }
+
+    public SavingsAccountTransaction dividendPayout(final 
SavingsAccountTransactionDTO transactionDTO) {
+        return deposit(transactionDTO, 
SavingsAccountTransactionType.DIVIDEND_PAYOUT);
+    }
+
+    public SavingsAccountTransaction deposit(final 
SavingsAccountTransactionDTO transactionDTO,
+            final SavingsAccountTransactionType savingsAccountTransactionType) 
{
         final String resourceTypeName = depositAccountType().resourceName();
         if (isNotActive()) {
             final String defaultUserMessage = "Transaction is not allowed. 
Account is not active.";
@@ -886,7 +896,8 @@ public class SavingsAccount extends 
AbstractPersistable<Long> {
         final Money amount = Money.of(this.currency, 
transactionDTO.getTransactionAmount());
 
         final SavingsAccountTransaction transaction = 
SavingsAccountTransaction.deposit(this, office(), 
transactionDTO.getPaymentDetail(),
-                transactionDTO.getTransactionDate(), amount, 
transactionDTO.getCreatedDate(), transactionDTO.getAppUser());
+                transactionDTO.getTransactionDate(), amount, 
transactionDTO.getCreatedDate(), transactionDTO.getAppUser(),
+                savingsAccountTransactionType);
         this.transactions.add(transaction);
 
         this.summary.updateSummary(this.currency, 
this.savingsAccountTransactionSummaryWrapper, this.transactions);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java
index c050e7c..56eadcf 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java
@@ -35,4 +35,6 @@ public interface SavingsAccountDomainService {
             BigDecimal transactionAmount, PaymentDetail paymentDetail, boolean 
isAccountTransfer, boolean isRegularTransaction);
 
     void postJournalEntries(SavingsAccount savingsAccount, Set<Long> 
existingTransactionIds, Set<Long> existingReversedTransactionIds);
+
+    SavingsAccountTransaction handleDividendPayout(SavingsAccount account, 
LocalDate transactionDate, BigDecimal transactionAmount);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java
index 3ce2f19..53141c2 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java
@@ -26,6 +26,7 @@ import 
org.apache.fineract.organisation.monetary.domain.ApplicationCurrency;
 import 
org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepositoryWrapper;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
 import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
+import org.apache.fineract.portfolio.savings.SavingsAccountTransactionType;
 import org.apache.fineract.portfolio.savings.SavingsTransactionBooleanValues;
 import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionDTO;
 import 
org.apache.fineract.portfolio.savings.exception.DepositAccountTransactionNotAllowedException;
@@ -102,10 +103,12 @@ public class SavingsAccountDomainServiceJpa implements 
SavingsAccountDomainServi
                     isSavingsInterestPostingAtCurrentPeriodEnd, 
financialYearBeginningMonth);
         }
         List<DepositAccountOnHoldTransaction> depositAccountOnHoldTransactions 
= null;
-        if(account.getOnHoldFunds().compareTo(BigDecimal.ZERO) == 1){
-            depositAccountOnHoldTransactions = 
this.depositAccountOnHoldTransactionRepository.findBySavingsAccountAndReversedFalseOrderByCreatedDateAsc(account);
+        if (account.getOnHoldFunds().compareTo(BigDecimal.ZERO) == 1) {
+            depositAccountOnHoldTransactions = 
this.depositAccountOnHoldTransactionRepository
+                    
.findBySavingsAccountAndReversedFalseOrderByCreatedDateAsc(account);
         }
-        account.validateAccountBalanceDoesNotBecomeNegative(transactionAmount, 
transactionBooleanValues.isExceptionForBalanceCheck(), 
depositAccountOnHoldTransactions);
+        account.validateAccountBalanceDoesNotBecomeNegative(transactionAmount, 
transactionBooleanValues.isExceptionForBalanceCheck(),
+                depositAccountOnHoldTransactions);
         saveTransactionToGenerateTransactionId(withdrawal);
         this.savingsAccountRepository.save(account);
 
@@ -127,7 +130,15 @@ public class SavingsAccountDomainServiceJpa implements 
SavingsAccountDomainServi
     public SavingsAccountTransaction handleDeposit(final SavingsAccount 
account, final DateTimeFormatter fmt,
             final LocalDate transactionDate, final BigDecimal 
transactionAmount, final PaymentDetail paymentDetail,
             final boolean isAccountTransfer, final boolean 
isRegularTransaction) {
+        final SavingsAccountTransactionType savingsAccountTransactionType = 
SavingsAccountTransactionType.DEPOSIT;
+        return handleDeposit(account, fmt, transactionDate, transactionAmount, 
paymentDetail, isAccountTransfer, isRegularTransaction,
+                savingsAccountTransactionType);
+    }
 
+    private SavingsAccountTransaction handleDeposit(final SavingsAccount 
account, final DateTimeFormatter fmt,
+            final LocalDate transactionDate, final BigDecimal 
transactionAmount, final PaymentDetail paymentDetail,
+            final boolean isAccountTransfer, final boolean 
isRegularTransaction,
+            final SavingsAccountTransactionType savingsAccountTransactionType) 
{
         AppUser user = getAppUserIfPresent();
         final boolean isSavingsInterestPostingAtCurrentPeriodEnd = 
this.configurationDomainService
                 .isSavingsInterestPostingAtCurrentPeriodEnd();
@@ -142,7 +153,7 @@ public class SavingsAccountDomainServiceJpa implements 
SavingsAccountDomainServi
         updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
         final SavingsAccountTransactionDTO transactionDTO = new 
SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount,
                 paymentDetail, new Date(), user);
-        final SavingsAccountTransaction deposit = 
account.deposit(transactionDTO);
+        final SavingsAccountTransaction deposit = 
account.deposit(transactionDTO, savingsAccountTransactionType);
 
         final MathContext mc = MathContext.DECIMAL64;
         if (account.isBeforeLastPostingPeriod(transactionDate)) {
@@ -163,6 +174,18 @@ public class SavingsAccountDomainServiceJpa implements 
SavingsAccountDomainServi
         return deposit;
     }
 
+    @Override
+    public SavingsAccountTransaction handleDividendPayout(final SavingsAccount 
account, final LocalDate transactionDate,
+            final BigDecimal transactionAmount) {
+        final DateTimeFormatter fmt = null;
+        final PaymentDetail paymentDetail = null;
+        final boolean isAccountTransfer = false;
+        final boolean isRegularTransaction = true;
+        final SavingsAccountTransactionType savingsAccountTransactionType = 
SavingsAccountTransactionType.DIVIDEND_PAYOUT;
+        return handleDeposit(account, fmt, transactionDate, transactionAmount, 
paymentDetail, isAccountTransfer, isRegularTransaction,
+                savingsAccountTransactionType);
+    }
+
     private Long saveTransactionToGenerateTransactionId(final 
SavingsAccountTransaction transaction) {
         this.savingsAccountTransactionRepository.save(transaction);
         return transaction.getId();

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
index a9cfc5d..2e6abcc 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java
@@ -135,6 +135,14 @@ public final class SavingsAccountTransaction extends 
AbstractPersistable<Long> {
                 createdDate, amount, isReversed, appUser);
     }
 
+    public static SavingsAccountTransaction deposit(final SavingsAccount 
savingsAccount, final Office office,
+            final PaymentDetail paymentDetail, final LocalDate date, final 
Money amount, Date createdDate, final AppUser appUser,
+            final SavingsAccountTransactionType savingsAccountTransactionType) 
{
+        final boolean isReversed = false;
+        return new SavingsAccountTransaction(savingsAccount, office, 
paymentDetail, savingsAccountTransactionType.getValue(), date,
+                createdDate, amount, isReversed, appUser);
+    }
+
     public static SavingsAccountTransaction withdrawal(final SavingsAccount 
savingsAccount, final Office office,
             final PaymentDetail paymentDetail, final LocalDate date, final 
Money amount, Date createdDate, final AppUser appUser) {
         final boolean isReversed = false;
@@ -283,12 +291,20 @@ public final class SavingsAccountTransaction extends 
AbstractPersistable<Long> {
         return SavingsAccountTransactionType.fromInt(this.typeOf).isDeposit() 
&& isNotReversed();
     }
 
+    public boolean isDividendPayout() {
+        return 
SavingsAccountTransactionType.fromInt(this.typeOf).isDividendPayout();
+    }
+
+    public boolean isDividendPayoutAndNotReversed() {
+        return 
SavingsAccountTransactionType.fromInt(this.typeOf).isDividendPayout() && 
isNotReversed();
+    }
+
     public boolean isWithdrawal() {
         return 
SavingsAccountTransactionType.fromInt(this.typeOf).isWithdrawal();
     }
 
     public boolean isPostInterestCalculationRequired() {
-        return this.isDeposit() || this.isChargeTransaction();
+        return this.isDeposit() || this.isChargeTransaction() || 
this.isDividendPayout();
     }
 
     public boolean isInterestPostingAndNotReversed() {
@@ -470,7 +486,7 @@ public final class SavingsAccountTransaction extends 
AbstractPersistable<Long> {
 
         final MonetaryCurrency currency = openingBalance.getCurrency();
         Money endOfDayBalance = openingBalance.copy();
-        if (isDeposit()) {
+        if (isDeposit() || isDividendPayoutAndNotReversed()) {
             endOfDayBalance = openingBalance.plus(getAmount(currency));
         } else if (isWithdrawal() || isChargeTransactionAndNotReversed()) {
             endOfDayBalance = openingBalance.minus(getAmount(currency));
@@ -486,7 +502,7 @@ public final class SavingsAccountTransaction extends 
AbstractPersistable<Long> {
     public EndOfDayBalance toEndOfDayBalance(final Money openingBalance) {
         final MonetaryCurrency currency = openingBalance.getCurrency();
         Money endOfDayBalance = openingBalance.copy();
-        if (isDeposit()) {
+        if (isDeposit() || isDividendPayoutAndNotReversed()) {
             endOfDayBalance = openingBalance.plus(getAmount(currency));
         } else if (isWithdrawal() || isChargeTransactionAndNotReversed()) {
 
@@ -515,7 +531,7 @@ public final class SavingsAccountTransaction extends 
AbstractPersistable<Long> {
             final LocalDateInterval spanOfBalance = 
LocalDateInterval.create(balanceStartDate, balanceEndDate);
             numberOfDaysOfBalance = 
spanOfBalance.daysInPeriodInclusiveOfEndDate();
         } else {
-            if (isDeposit()) {
+            if (isDeposit() || isDividendPayoutAndNotReversed()) {
                 // endOfDayBalance = openingBalance.plus(getAmount(currency));
                 // if (endOfDayBalance.isLessThanZero()) {
                 endOfDayBalance = endOfDayBalance.plus(getAmount(currency));
@@ -558,7 +574,7 @@ public final class SavingsAccountTransaction extends 
AbstractPersistable<Long> {
     }
 
     public boolean isCredit() {
-        return isDeposit() || isInterestPostingAndNotReversed();
+        return isDeposit() || isInterestPostingAndNotReversed() || 
isDividendPayoutAndNotReversed();
     }
 
     public boolean isDebit() {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java
index 744180d..6f7ffe6 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java
@@ -35,7 +35,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
     public BigDecimal calculateTotalDeposits(final MonetaryCurrency currency, 
final List<SavingsAccountTransaction> transactions) {
         Money total = Money.zero(currency);
         for (final SavingsAccountTransaction transaction : transactions) {
-            if (transaction.isDeposit() && transaction.isNotReversed()) {
+            if (transaction.isDepositAndNotReversed() || 
transaction.isDividendPayoutAndNotReversed()) {
                 total = total.plus(transaction.getAmount(currency));
             }
         }
@@ -131,7 +131,6 @@ public final class SavingsAccountTransactionSummaryWrapper {
         }
         return total.getAmountDefaultedToNullIfZero();
     }
-    
     public BigDecimal calculateTotalWithholdTaxWithdrawal(MonetaryCurrency 
currency, List<SavingsAccountTransaction> transactions) {
         Money total = Money.zero(currency);
         for (final SavingsAccountTransaction transaction : transactions) {
@@ -141,5 +140,4 @@ public final class SavingsAccountTransactionSummaryWrapper {
         }
         return total.getAmountDefaultedToNullIfZero();
     }
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java
index e2fa675..59f7f19 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java
@@ -74,12 +74,18 @@ public class SavingsAccountChargeReadPlatformServiceImpl 
implements SavingsAccou
     private static final class SavingsAccountChargeMapper implements 
RowMapper<SavingsAccountChargeData> {
 
         public String schema() {
-            return "sc.id as id, c.id as chargeId, sc.savings_account_id as 
accountId, c.name as name, " + "sc.amount as amountDue, "
-                    + "sc.amount_paid_derived as amountPaid, " + 
"sc.amount_waived_derived as amountWaived, "
-                    + "sc.amount_writtenoff_derived as amountWrittenOff, " + 
"sc.amount_outstanding_derived as amountOutstanding, "
+            return "sc.id as id, c.id as chargeId, sc.savings_account_id as 
accountId, c.name as name, "
+                    + "sc.amount as amountDue, "
+                    + "sc.amount_paid_derived as amountPaid, "
+                    + "sc.amount_waived_derived as amountWaived, "
+                    + "sc.amount_writtenoff_derived as amountWrittenOff, "
+                    + "sc.amount_outstanding_derived as amountOutstanding, "
                     + "sc.calculation_percentage as percentageOf, 
sc.calculation_on_amount as amountPercentageAppliedTo, "
-                    + "sc.charge_time_enum as chargeTime, " + "sc.is_penalty 
as penalty, " + "sc.charge_due_date as dueAsOfDate, "
-                    + "sc.fee_on_month as feeOnMonth, " + "sc.fee_on_day as 
feeOnDay, sc.fee_interval as feeInterval, "
+                    + "sc.charge_time_enum as chargeTime, "
+                    + "sc.is_penalty as penalty, "
+                    + "sc.charge_due_date as dueAsOfDate, "
+                    + "sc.fee_on_month as feeOnMonth, "
+                    + "sc.fee_on_day as feeOnDay, sc.fee_interval as 
feeInterval, "
                     + "sc.charge_calculation_enum as chargeCalculation, "
                     + "sc.is_active as isActive, sc.inactivated_on_date as 
inactivationDate, "
                     + "c.currency_code as currencyCode, oc.name as 
currencyName, "
@@ -160,14 +166,14 @@ public class SavingsAccountChargeReadPlatformServiceImpl 
implements SavingsAccou
         final List<EnumOptionData> feeFrequencyOptions = 
this.dropdownReadPlatformService.retrievePeriodFrequencyTypeOptions();
         // this field is applicable only for client charges
         final Map<String, List<GLAccountData>> incomeOrLiabilityAccountOptions 
= null;
-        
+        final List<EnumOptionData> shareChargeCalculationTypeOptions = null;
+        final List<EnumOptionData> shareChargeTimeTypeOptions = null;
         final Collection<TaxGroupData> taxGroupOptions = null;
-
         // TODO AA : revisit for merge conflict - Not sure method signature
         return ChargeData.template(null, allowedChargeCalculationTypeOptions, 
null, allowedChargeTimeOptions, null,
                 loansChargeCalculationTypeOptions, loansChargeTimeTypeOptions, 
savingsChargeCalculationTypeOptions,
                 savingsChargeTimeTypeOptions, 
clientChargeCalculationTypeOptions, clientChargeTimeTypeOptions, 
feeFrequencyOptions,
-                incomeOrLiabilityAccountOptions, taxGroupOptions);
+                incomeOrLiabilityAccountOptions, taxGroupOptions, 
shareChargeCalculationTypeOptions, shareChargeTimeTypeOptions);
     }
 
     @Override
@@ -244,7 +250,8 @@ public class SavingsAccountChargeReadPlatformServiceImpl 
implements SavingsAccou
 
     @Override
     public Collection<SavingsAccountAnnualFeeData> retrieveChargesWithDue() {
-        final String sql = "select " + this.chargeDueMapper.schema()
+        final String sql = "select "
+                + this.chargeDueMapper.schema()
                 + " where sac.charge_due_date is not null and 
sac.charge_due_date <= NOW() and sac.waived = 0 and sac.is_paid_derived=0 and 
sac.is_active=1 and sa.status_enum = "
                 + SavingsAccountStatusType.ACTIVE.getValue() + " order by 
sac.charge_due_date ";
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java
index c295561..270562e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java
@@ -183,6 +183,10 @@ public class SavingsEnumerations {
                 optionData = new 
SavingsAccountTransactionEnumData(SavingsAccountTransactionType.WITHHOLD_TAX.getValue().longValue(),
                         SavingsAccountTransactionType.WITHHOLD_TAX.getCode(), 
"Withhold Tax");
             break;
+            case DIVIDEND_PAYOUT:
+                optionData = new 
SavingsAccountTransactionEnumData(SavingsAccountTransactionType.DIVIDEND_PAYOUT.getValue().longValue(),
+                        
SavingsAccountTransactionType.DIVIDEND_PAYOUT.getCode(), "Dividend Payout");
+                break;
         }
         return optionData;
     }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/PurchasedSharesData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/PurchasedSharesData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/PurchasedSharesData.java
new file mode 100644
index 0000000..95048c6
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/PurchasedSharesData.java
@@ -0,0 +1,78 @@
+/**
+ * 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.portfolio.shareaccounts.data;
+
+import java.math.BigDecimal;
+
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.joda.time.LocalDate;
+
+public class PurchasedSharesData {
+
+    private final Long id;
+
+    private final Long accountId;
+
+    private final LocalDate purchasedDate;
+
+    private final Long numberOfShares;
+
+    private final BigDecimal purchasedPrice;
+
+    private final EnumOptionData status;
+
+    private final EnumOptionData type;
+
+    private final BigDecimal amount ;
+    
+    private final BigDecimal chargeAmount ;
+    
+    public PurchasedSharesData(final Long id, final Long accountId, final 
LocalDate purchasedDate, final Long numberOfShares,
+            final BigDecimal purchasedPrice, final EnumOptionData status, 
final EnumOptionData type, final BigDecimal amount, final BigDecimal 
chargeAmount) {
+        this.id = id;
+        this.accountId = accountId;
+        this.purchasedDate = purchasedDate;
+        this.numberOfShares = numberOfShares;
+        this.purchasedPrice = purchasedPrice;
+        this.status = status;
+        this.type = type;
+        this.amount = amount ;
+        this.chargeAmount = chargeAmount ;
+    }
+
+    public LocalDate getPurchasedDate() {
+        return this.purchasedDate;
+    }
+
+    public Long getNumberOfShares() {
+        return this.numberOfShares;
+    }
+
+    public BigDecimal getPurchasedPrice() {
+        return this.purchasedPrice;
+    }
+
+    public EnumOptionData getStatus() {
+        return this.status;
+    }
+
+    public EnumOptionData getType() {
+        return this.type;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountApplicationTimelineData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountApplicationTimelineData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountApplicationTimelineData.java
new file mode 100644
index 0000000..73ef751
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountApplicationTimelineData.java
@@ -0,0 +1,108 @@
+/**
+ * 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.portfolio.shareaccounts.data;
+
+import org.joda.time.LocalDate;
+
+@SuppressWarnings("unused")
+public class ShareAccountApplicationTimelineData {
+
+       private final LocalDate submittedOnDate;
+    private final String submittedByUsername;
+    private final String submittedByFirstname;
+    private final String submittedByLastname;
+    
+    private final LocalDate rejectedDate;
+    private final String rejectedByUsername;
+    private final String rejectedByFirstname;
+    private final String rejectedByLastname;
+    
+    private final LocalDate approvedDate;
+    private final String approvedByUsername;
+    private final String approvedByFirstname;
+    private final String approvedByLastname;
+
+    private final LocalDate activatedDate;
+    private final String activatedByUsername;
+    private final String activatedByFirstname;
+    private final String activatedByLastname;
+    
+    private final LocalDate closedDate;
+    private final String closedByUsername;
+    private final String closedByFirstname;
+    private final String closedByLastname;
+
+    public static ShareAccountApplicationTimelineData templateDefault() {
+
+        final LocalDate submittedOnDate = null;
+        final String submittedByUsername = null;
+        final String submittedByFirstname = null;
+        final String submittedByLastname = null;
+        final LocalDate rejectedOnDate = null;
+        final String rejectedByUsername = null;
+        final String rejectedByFirstname = null;
+        final String rejectedByLastname = null;
+        final LocalDate approvedOnDate = null;
+        final String approvedByUsername = null;
+        final String approvedByFirstname = null;
+        final String approvedByLastname = null;
+        final LocalDate activatedOnDate = null;
+        final String activatedByUsername = null;
+        final String activatedByFirstname = null;
+        final String activatedByLastname = null;
+        final LocalDate closedOnDate = null;
+        final String closedByUsername = null;
+        final String closedByFirstname = null;
+        final String closedByLastname = null;
+
+        return new ShareAccountApplicationTimelineData(submittedOnDate, 
submittedByUsername, submittedByFirstname, submittedByLastname,
+                rejectedOnDate, rejectedByUsername, rejectedByFirstname, 
rejectedByLastname, approvedOnDate, approvedByUsername, 
+                approvedByFirstname, approvedByLastname, activatedOnDate, 
activatedByUsername, activatedByFirstname, activatedByLastname, 
+                closedOnDate, closedByUsername, closedByFirstname, 
closedByLastname);
+    }
+
+    public ShareAccountApplicationTimelineData(final LocalDate 
submittedOnDate, final String submittedByUsername,
+            final String submittedByFirstname, final String 
submittedByLastname, final LocalDate rejectedOnDate,
+            final String rejectedByUsername, final String rejectedByFirstname, 
final String rejectedByLastname,
+            final LocalDate approvedOnDate, final String approvedByUsername,
+            final String approvedByFirstname, final String approvedByLastname, 
final LocalDate activatedOnDate,
+            final String activatedByUsername, final String 
activatedByFirstname, final String activatedByLastname,
+            final LocalDate closedOnDate, final String closedByUsername, final 
String closedByFirstname, final String closedByLastname) {
+        this.submittedOnDate = submittedOnDate;
+        this.submittedByUsername = submittedByUsername;
+        this.submittedByFirstname = submittedByFirstname;
+        this.submittedByLastname = submittedByLastname;
+        this.rejectedDate = rejectedOnDate;
+        this.rejectedByUsername = rejectedByUsername;
+        this.rejectedByFirstname = rejectedByFirstname;
+        this.rejectedByLastname = rejectedByLastname;
+        this.approvedDate = approvedOnDate;
+        this.approvedByUsername = approvedByUsername;
+        this.approvedByFirstname = approvedByFirstname;
+        this.approvedByLastname = approvedByLastname;
+        this.activatedDate = activatedOnDate;
+        this.activatedByUsername = activatedByUsername;
+        this.activatedByFirstname = activatedByFirstname;
+        this.activatedByLastname = activatedByLastname;
+        this.closedDate = closedOnDate;
+        this.closedByUsername = closedByUsername;
+        this.closedByFirstname = closedByFirstname;
+        this.closedByLastname = closedByLastname;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountChargeData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountChargeData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountChargeData.java
new file mode 100644
index 0000000..497db0e
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountChargeData.java
@@ -0,0 +1,95 @@
+/**
+ * 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.portfolio.shareaccounts.data;
+
+import java.math.BigDecimal;
+import java.util.Collection;
+
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.apache.fineract.organisation.monetary.data.CurrencyData;
+import org.apache.fineract.portfolio.charge.data.ChargeData;
+import org.apache.fineract.portfolio.charge.domain.ChargeCalculationType;
+import org.joda.time.LocalDate;
+import org.joda.time.MonthDay;
+
+@SuppressWarnings("unused")
+public class ShareAccountChargeData {
+
+    private final Long id;
+
+    private final Long chargeId;
+
+    private final Long accountId;
+
+    private final String name;
+
+    private final EnumOptionData chargeTimeType;
+
+    private final EnumOptionData chargeCalculationType;
+
+    private final BigDecimal percentage;
+
+    private final BigDecimal amountPercentageAppliedTo;
+
+    private final CurrencyData currency;
+
+    private final BigDecimal amount;
+
+    private final BigDecimal amountPaid;
+
+    private final BigDecimal amountWaived;
+
+    private final BigDecimal amountWrittenOff;
+
+    private final BigDecimal amountOutstanding;
+
+    private final BigDecimal amountOrPercentage;
+
+    private final Boolean isActive;
+
+    private final Collection<ChargeData> chargeOptions;
+
+    public ShareAccountChargeData(final Long id, final Long chargeId, final 
Long accountId, final String name,
+            final CurrencyData currency, final BigDecimal amount, final 
BigDecimal amountPaid, final BigDecimal amountWaived,
+            final BigDecimal amountWrittenOff, final BigDecimal 
amountOutstanding, final EnumOptionData chargeTimeType,
+            final EnumOptionData chargeCalculationType, final BigDecimal 
percentage, final BigDecimal amountPercentageAppliedTo,
+            final Collection<ChargeData> chargeOptions, final Boolean 
isActive) {
+        this.id = id;
+        this.chargeId = chargeId;
+        this.accountId = accountId;
+        this.name = name;
+        this.chargeTimeType = chargeTimeType;
+        this.chargeCalculationType = chargeCalculationType;
+        this.percentage = percentage;
+        this.amountPercentageAppliedTo = amountPercentageAppliedTo;
+        this.currency = currency;
+        this.amount = amount;  
+        this.amountPaid = amountPaid;
+        this.amountWaived = amountWaived;
+        this.amountWrittenOff = amountWrittenOff;
+        this.amountOutstanding = amountOutstanding;
+        this.amountOrPercentage = getAmountOrPercentage();
+        this.chargeOptions = chargeOptions;
+        this.isActive = isActive;
+    }
+
+    private BigDecimal getAmountOrPercentage() {
+        return (this.chargeCalculationType != null) && 
(this.chargeCalculationType.getId().intValue() > 1) ? this.percentage : 
this.amount;
+    }
+}

Reply via email to