fineract-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From nazeer1100...@apache.org
Subject [3/3] incubator-fineract git commit: MIFOSX-2426 : added support for Interest Rate Charts based on Amount
Date Wed, 09 Mar 2016 06:36:20 GMT
MIFOSX-2426 : added support for Interest Rate Charts based on Amount


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

Branch: refs/heads/develop
Commit: 37dfe1a0bf1fc65d829cc48b57a69fea616cc093
Parents: 14499a2
Author: pramod <pramod@confluxtechnologies.com>
Authored: Fri Mar 4 15:57:27 2016 +0530
Committer: pramod <pramod@confluxtechnologies.com>
Committed: Fri Mar 4 15:57:27 2016 +0530

----------------------------------------------------------------------
 .../AccountingScenarioIntegrationTest.java      |   6 +-
 .../integrationtests/FixedDepositTest.java      | 331 +++++++++++++++----
 .../integrationtests/RecurringDepositTest.java  | 206 +++++++++++-
 .../SchedulerJobsTestResults.java               |   3 +-
 .../fixeddeposit/FixedDepositAccountHelper.java |  85 ++---
 .../fixeddeposit/FixedDepositProductHelper.java | 264 ++++++++++++---
 .../RecurringDepositAccountHelper.java          |  74 +----
 .../RecurringDepositProductHelper.java          | 262 ++++++++++++---
 .../portfolio/calendar/domain/Calendar.java     |  11 +-
 .../InterestRateChartApiConstants.java          |  10 +-
 .../data/InterestRateChartData.java             |  65 ++--
 .../data/InterestRateChartDataValidator.java    |  21 +-
 .../InterestRateChartSlabDataValidator.java     |  69 ++--
 .../domain/InterestRateChart.java               |  83 ++++-
 .../domain/InterestRateChartFields.java         |  34 +-
 .../domain/InterestRateChartSlabComparator.java |  92 ++++++
 .../domain/InterestRateChartSlabFields.java     | 148 ++++++++-
 .../service/InterestRateChartAssembler.java     |  30 +-
 ...nterestRateChartReadPlatformServiceImpl.java |  27 +-
 .../DepositAccountInterestRateChartData.java    |  67 ++--
 .../domain/DepositAccountDomainServiceJpa.java  |  60 +++-
 .../domain/DepositAccountInterestRateChart.java |   5 +
 .../savings/domain/DepositProductAssembler.java |  28 +-
 .../savings/domain/FixedDepositProduct.java     |   2 +-
 .../savings/domain/RecurringDepositAccount.java |  34 +-
 ...nterestRateChartReadPlatformServiceImpl.java |  40 ++-
 ..._interest_rate_chart_support_for_amounts.sql |  13 +
 27 files changed, 1642 insertions(+), 428 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/37dfe1a0/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java
index ef020bc..0e40d74 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java
@@ -521,6 +521,7 @@ public class AccountingScenarioIntegrationTest {
         System.out.println("------------------------------CREATING NEW FIXED DEPOSIT PRODUCT ---------------------------------------");
         FixedDepositProductHelper fixedDepositProductHelper = new FixedDepositProductHelper(this.requestSpec, this.responseSpec);
         final String fixedDepositProductJSON = fixedDepositProductHelper //
+                .withPeriodRangeChart()//
                 .withAccountingRuleAsCashBased(accounts).build(validFrom, validTo);
         return FixedDepositProductHelper.createFixedDepositProduct(fixedDepositProductJSON, requestSpec, responseSpec);
     }
@@ -529,7 +530,7 @@ public class AccountingScenarioIntegrationTest {
             final String validTo, final String submittedOnDate, final String penalInterestType) {
         System.out.println("--------------------------------APPLYING FOR FIXED DEPOSIT ACCOUNT --------------------------------");
         final String fixedDepositApplicationJSON = new FixedDepositAccountHelper(this.requestSpec, this.responseSpec) //
-                .withSubmittedOnDate(submittedOnDate).build(clientID, productID, validFrom, validTo, penalInterestType);
+                .withSubmittedOnDate(submittedOnDate).build(clientID, productID, penalInterestType);
         return this.fixedDepositAccountHelper
                 .applyFixedDepositApplication(fixedDepositApplicationJSON, this.requestSpec, this.responseSpec);
     }
@@ -538,6 +539,7 @@ public class AccountingScenarioIntegrationTest {
         System.out.println("------------------------------CREATING NEW RECURRING DEPOSIT PRODUCT ---------------------------------------");
         RecurringDepositProductHelper recurringDepositProductHelper = new RecurringDepositProductHelper(this.requestSpec, this.responseSpec);
         final String recurringDepositProductJSON = recurringDepositProductHelper //
+                .withPeriodRangeChart()//
                 .withAccountingRuleAsCashBased(accounts).build(validFrom, validTo);
         return RecurringDepositProductHelper.createRecurringDepositProduct(recurringDepositProductJSON, requestSpec, responseSpec);
     }
@@ -548,7 +550,7 @@ public class AccountingScenarioIntegrationTest {
         final String recurringDepositApplicationJSON = new RecurringDepositAccountHelper(this.requestSpec, this.responseSpec)
                 //
                 .withSubmittedOnDate(submittedOnDate).withExpectedFirstDepositOnDate(expectedFirstDepositOnDate)
-                .build(clientID, productID, validFrom, validTo, penalInterestType);
+                .build(clientID, productID, penalInterestType);
         return this.recurringDepositAccountHelper.applyRecurringDepositApplication(recurringDepositApplicationJSON, this.requestSpec,
                 this.responseSpec);
     }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/37dfe1a0/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/FixedDepositTest.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/FixedDepositTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/FixedDepositTest.java
index 3d6a4ef..fa638bc 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/FixedDepositTest.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/FixedDepositTest.java
@@ -114,8 +114,8 @@ public class FixedDepositTest {
     }
 
     /***
-     * Test case for Fixed Deposit Account premature closure with
-     * transaction type withdrawal and Cash Based accounting enabled
+     * Test case for Fixed Deposit Account premature closure with transaction
+     * type withdrawal and Cash Based accounting enabled
      */
     @Test
     public void testFixedDepositAccountWithPrematureClosureTypeWithdrawal() {
@@ -123,7 +123,7 @@ public class FixedDepositTest {
         this.accountHelper = new AccountHelper(this.requestSpec, this.responseSpec);
         this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
         this.fixedDepositAccountHelper = new FixedDepositAccountHelper(this.requestSpec, this.responseSpec);
-        
+
         /***
          * Create GL Accounts for product account mapping
          */
@@ -170,8 +170,8 @@ public class FixedDepositTest {
         /***
          * Apply for FD account with created product and verify status
          */
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -189,11 +189,11 @@ public class FixedDepositTest {
          */
         fixedDepositAccountStatusHashMap = this.fixedDepositAccountHelper.activateFixedDeposit(fixedDepositAccountId, ACTIVATION_DATE);
         FixedDepositAccountStatusChecker.verifyFixedDepositIsActive(fixedDepositAccountStatusHashMap);
-        
+
         HashMap accountSummary = this.fixedDepositAccountHelper.getFixedDepositSummary(fixedDepositAccountId);
 
         Float depositAmount = (Float) accountSummary.get("totalDeposits");
-        
+
         /***
          * Verify journal entries posted for initial deposit transaction which
          * happened at activation time
@@ -214,7 +214,7 @@ public class FixedDepositTest {
          */
         Integer transactionIdForPostInterest = this.fixedDepositAccountHelper.postInterestForFixedDeposit(fixedDepositAccountId);
         Assert.assertNotNull(transactionIdForPostInterest);
-        
+
         accountSummary = this.fixedDepositAccountHelper.getFixedDepositSummary(fixedDepositAccountId);
         Float totalInterestPosted = (Float) accountSummary.get("totalInterestPosted");
 
@@ -252,6 +252,165 @@ public class FixedDepositTest {
                 JournalEntry.TransactionType.DEBIT));
 
     }
+    
+    @Test
+    public void testFixedDepositAccountWithPeriodInterestRateChart() {
+        final String chartToUse = "period";
+        final String depositAmount = "10000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(6.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithPeriodInterestRateChart_AMOUNT_VARIATION() {
+        final String chartToUse = "period";
+        final String depositAmount = "2000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(6.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithPeriodInterestRateChart_PERIOD_VARIATION() {
+        final String chartToUse = "period";
+        final String depositAmount = "10000";
+        final String depositPeriod = "18";
+        final Float interestRate = new Float(7.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithAmountInterestRateChart() {
+        final String chartToUse = "amount";
+        final String depositAmount = "10000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(7.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithAmountInterestRateChart_AMOUNT_VARIATION() {
+        final String chartToUse = "amount";
+        final String depositAmount = "5000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(5.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithAmountInterestRateChart_PERIOD_VARIATION() {
+        final String chartToUse = "amount";
+        final String depositAmount = "10000";
+        final String depositPeriod = "26";
+        final Float interestRate = new Float(7.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+
+    @Test
+    public void testFixedDepositAccountWithPeriodAndAmountInterestRateChart() {
+        final String chartToUse = "period_amount";
+        final String depositAmount = "10000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(7.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithPeriodAndAmountInterestRateChart_AMOUNT_VARIATION() {
+        final String chartToUse = "period_amount";
+        final String depositAmount = "5000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(6.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithPeriodAndAmountInterestRateChart_PERIOD_VARIATION() {
+        final String chartToUse = "period_amount";
+        final String depositAmount = "10000";
+        final String depositPeriod = "20";
+        final Float interestRate = new Float(9.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithAmountAndPeriodInterestRateChart() {
+        final String chartToUse = "amount_period";
+        final String depositAmount = "10000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(8.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithAmountAndPeriodInterestRateChart_AMOUNT_VARIATION() {
+        final String chartToUse = "amount_period";
+        final String depositAmount = "5000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(6.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testFixedDepositAccountWithAmountAndPeriodInterestRateChart_PERIOD_VARIATION() {
+        final String chartToUse = "amount_period";
+        final String depositAmount = "10000";
+        final String depositPeriod = "6";
+        final Float interestRate = new Float(7.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+
+    private void testFixedDepositAccountForInterestRate(final String chartToUse, final String depositAmount, final String depositPeriod,
+            final Float interestRate) {
+        this.fixedDepositProductHelper = new FixedDepositProductHelper(this.requestSpec, this.responseSpec);
+        this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
+        this.fixedDepositAccountHelper = new FixedDepositAccountHelper(this.requestSpec, this.responseSpec);
+
+        final String VALID_FROM = "01 March 2014";
+        final String VALID_TO = "01 March 2016";
+
+        final String SUBMITTED_ON_DATE = "01 March 2015";
+        final String APPROVED_ON_DATE = "01 March 2015";
+        final String ACTIVATION_DATE = "01 March 2015";
+
+        Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        Assert.assertNotNull(clientId);
+
+        /***
+         * Create FD product with CashBased accounting enabled
+         */
+        final String accountingRule = NONE;
+        Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule, chartToUse);
+        Assert.assertNotNull(fixedDepositProductId);
+
+        /***
+         * Apply for FD account with created product and verify status
+         */
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM, depositAmount, depositPeriod);
+        Assert.assertNotNull(fixedDepositAccountId);
+
+        HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
+                this.responseSpec, fixedDepositAccountId.toString());
+        FixedDepositAccountStatusChecker.verifyFixedDepositIsPending(fixedDepositAccountStatusHashMap);
+
+        /***
+         * Approve the FD account and verify whether account is approved
+         */
+        fixedDepositAccountStatusHashMap = this.fixedDepositAccountHelper.approveFixedDeposit(fixedDepositAccountId, APPROVED_ON_DATE);
+        FixedDepositAccountStatusChecker.verifyFixedDepositIsApproved(fixedDepositAccountStatusHashMap);
+
+        /***
+         * Activate the FD Account and verify whether account is activated
+         */
+        fixedDepositAccountStatusHashMap = this.fixedDepositAccountHelper.activateFixedDeposit(fixedDepositAccountId, ACTIVATION_DATE);
+        FixedDepositAccountStatusChecker.verifyFixedDepositIsActive(fixedDepositAccountStatusHashMap);
+
+        HashMap accountSummary = this.fixedDepositAccountHelper.getFixedDepositDetails(fixedDepositAccountId);
+
+        Assert.assertEquals(interestRate, accountSummary.get("nominalAnnualInterestRate"));
+    }
 
     /***
      * Test case for FD Account premature closure with transaction transfers to
@@ -263,7 +422,7 @@ public class FixedDepositTest {
         this.accountHelper = new AccountHelper(this.requestSpec, this.responseSpec);
         this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
         this.fixedDepositAccountHelper = new FixedDepositAccountHelper(this.requestSpec, this.responseSpec);
-        
+
         /***
          * Create GL Accounts for product account mapping
          */
@@ -295,7 +454,7 @@ public class FixedDepositTest {
         todaysDate.add(Calendar.DATE, numberOfDaysLeft);
         final String INTEREST_POSTED_DATE = dateFormat.format(todaysDate.getTime());
         final String CLOSED_ON_DATE = dateFormat.format(Calendar.getInstance().getTime());
-        
+
         Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
         Assert.assertNotNull(clientId);
 
@@ -326,8 +485,8 @@ public class FixedDepositTest {
                 incomeAccount, expenseAccount);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -343,7 +502,7 @@ public class FixedDepositTest {
         HashMap accountSummary = this.fixedDepositAccountHelper.getFixedDepositSummary(fixedDepositAccountId);
 
         Float depositAmount = (Float) accountSummary.get("totalDeposits");
-        
+
         /***
          * Verify journal entries posted for initial deposit transaction which
          * happened at activation time
@@ -375,10 +534,10 @@ public class FixedDepositTest {
         final JournalEntry[] liablilityAccountEntry = { new JournalEntry(totalInterestPosted, JournalEntry.TransactionType.CREDIT) };
         this.journalEntryHelper.checkJournalEntryForAssetAccount(expenseAccount, INTEREST_POSTED_DATE, expenseAccountEntry);
         this.journalEntryHelper.checkJournalEntryForLiabilityAccount(liabilityAccount, INTEREST_POSTED_DATE, liablilityAccountEntry);
-        
+
         HashMap savingsSummaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId);
         Float balanceBefore = (Float) savingsSummaryBefore.get("accountBalance");
-        
+
         /***
          * Retrieve mapped financial account for liability transfer
          */
@@ -412,7 +571,7 @@ public class FixedDepositTest {
 
         this.journalEntryHelper.checkJournalEntryForAssetAccount(financialAccount, CLOSED_ON_DATE, new JournalEntry(prematurityAmount,
                 JournalEntry.TransactionType.DEBIT), new JournalEntry(prematurityAmount, JournalEntry.TransactionType.CREDIT));
-        
+
         HashMap savingsSummaryAfter = this.savingsAccountHelper.getSavingsSummary(savingsId);
         Float balanceAfter = (Float) savingsSummaryAfter.get("accountBalance");
         Float expectedSavingsBalance = balanceBefore + prematurityAmount;
@@ -422,8 +581,8 @@ public class FixedDepositTest {
     }
 
     /***
-     * Test case for Fixed Deposit Account premature closure with
-     * transaction type ReInvest and Cash Based accounting enabled
+     * Test case for Fixed Deposit Account premature closure with transaction
+     * type ReInvest and Cash Based accounting enabled
      */
     @Test
     public void testFixedDepositAccountWithPrematureClosureTypeReinvest() {
@@ -459,7 +618,7 @@ public class FixedDepositTest {
         final String APPROVED_ON_DATE = dateFormat.format(todaysDate.getTime());
         final String ACTIVATION_DATE = dateFormat.format(todaysDate.getTime());
         final String MONTH_DAY = monthDayFormat.format(todaysDate.getTime());
-        
+
         Integer currentDate = new Integer(currentDateFormat.format(todaysDate.getTime()));
         Integer daysInMonth = todaysDate.getActualMaximum(Calendar.DATE);
         Integer numberOfDaysLeft = (daysInMonth - currentDate) + 1;
@@ -478,8 +637,8 @@ public class FixedDepositTest {
                 incomeAccount, expenseAccount);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -491,11 +650,11 @@ public class FixedDepositTest {
 
         fixedDepositAccountStatusHashMap = this.fixedDepositAccountHelper.activateFixedDeposit(fixedDepositAccountId, ACTIVATION_DATE);
         FixedDepositAccountStatusChecker.verifyFixedDepositIsActive(fixedDepositAccountStatusHashMap);
-        
+
         HashMap accountSummary = this.fixedDepositAccountHelper.getFixedDepositSummary(fixedDepositAccountId);
 
         Float depositAmount = (Float) accountSummary.get("totalDeposits");
-        
+
         /***
          * Verify journal entries posted for initial deposit transaction which
          * happened at activation time
@@ -564,8 +723,8 @@ public class FixedDepositTest {
         HashMap fixedDepositProductData = this.fixedDepositProductHelper.retrieveFixedDepositProductById(this.requestSpec,
                 this.responseSpec, fixedDepositProductId.toString());
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         todaysDate.add(Calendar.DATE, -1);
@@ -603,8 +762,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -646,8 +805,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -687,8 +846,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -726,8 +885,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -769,8 +928,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -839,8 +998,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -916,8 +1075,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -1020,8 +1179,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1128,8 +1287,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, TILL_PREMATURE_WITHDRAWAL);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                TILL_PREMATURE_WITHDRAWAL);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap fixedDepositAccountStatusHashMap = FixedDepositAccountStatusChecker.getStatusOfFixedDepositAccount(this.requestSpec,
@@ -1240,8 +1399,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, TILL_PREMATURE_WITHDRAWAL);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                TILL_PREMATURE_WITHDRAWAL);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1352,8 +1511,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1421,7 +1580,7 @@ public class FixedDepositTest {
         final String ACTIVATION_DATE = dateFormat.format(todaysDate.getTime());
         final String MONTH_DAY = monthDayFormat.format(todaysDate.getTime());
 
-        System.out.println("Submitted Date:"+SUBMITTED_ON_DATE);
+        System.out.println("Submitted Date:" + SUBMITTED_ON_DATE);
         Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
         Assert.assertNotNull(clientId);
 
@@ -1429,8 +1588,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1509,8 +1668,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1593,8 +1752,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1678,8 +1837,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1760,8 +1919,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1842,8 +2001,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1923,8 +2082,8 @@ public class FixedDepositTest {
         Integer fixedDepositProductId = createFixedDepositProduct(VALID_FROM, VALID_TO, accountingRule);
         Assert.assertNotNull(fixedDepositProductId);
 
-        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), VALID_FROM,
-                VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM);
+        Integer fixedDepositAccountId = applyForFixedDepositApplication(clientId.toString(), fixedDepositProductId.toString(), SUBMITTED_ON_DATE,
+                WHOLE_TERM);
         Assert.assertNotNull(fixedDepositAccountId);
 
         HashMap modificationsHashMap = this.fixedDepositAccountHelper.updateInterestCalculationConfigForFixedDeposit(clientId.toString(),
@@ -1975,16 +2134,58 @@ public class FixedDepositTest {
         } else if (accountingRule.equals(NONE)) {
             fixedDepositProductHelper = fixedDepositProductHelper.withAccountingRuleAsNone();
         }
+        final String fixedDepositProductJSON = fixedDepositProductHelper.withPeriodRangeChart() //
+                .build(validFrom, validTo);
+        return FixedDepositProductHelper.createFixedDepositProduct(fixedDepositProductJSON, requestSpec, responseSpec);
+    }
+
+    private Integer createFixedDepositProduct(final String validFrom, final String validTo, final String accountingRule,
+            final String chartToBePicked, Account... accounts) {
+        System.out.println("------------------------------CREATING NEW FIXED DEPOSIT PRODUCT ---------------------------------------");
+        FixedDepositProductHelper fixedDepositProductHelper = new FixedDepositProductHelper(this.requestSpec, this.responseSpec);
+        if (accountingRule.equals(CASH_BASED)) {
+            fixedDepositProductHelper = fixedDepositProductHelper.withAccountingRuleAsCashBased(accounts);
+        } else if (accountingRule.equals(NONE)) {
+            fixedDepositProductHelper = fixedDepositProductHelper.withAccountingRuleAsNone();
+        }
+        switch (chartToBePicked) {
+            case "period":
+                fixedDepositProductHelper = fixedDepositProductHelper.withPeriodRangeChart();
+            break;
+            case "amount":
+                fixedDepositProductHelper = fixedDepositProductHelper.withAmountRangeChart();
+            break;
+            case "period_amount":
+                fixedDepositProductHelper = fixedDepositProductHelper.withPeriodAndAmountRangeChart();
+            break;
+            case "amount_period":
+                fixedDepositProductHelper = fixedDepositProductHelper.withAmountAndPeriodRangeChart();
+            break;
+            default:
+            break;
+        }
+
         final String fixedDepositProductJSON = fixedDepositProductHelper //
                 .build(validFrom, validTo);
         return FixedDepositProductHelper.createFixedDepositProduct(fixedDepositProductJSON, requestSpec, responseSpec);
     }
 
-    private Integer applyForFixedDepositApplication(final String clientID, final String productID, final String validFrom,
-            final String validTo, final String submittedOnDate, final String penalInterestType) {
+    private Integer applyForFixedDepositApplication(final String clientID, final String productID, final String submittedOnDate,
+            final String penalInterestType) {
         System.out.println("--------------------------------APPLYING FOR FIXED DEPOSIT ACCOUNT --------------------------------");
         final String fixedDepositApplicationJSON = new FixedDepositAccountHelper(this.requestSpec, this.responseSpec) //
-                .withSubmittedOnDate(submittedOnDate).build(clientID, productID, validFrom, validTo, penalInterestType);
+                .withSubmittedOnDate(submittedOnDate).build(clientID, productID, penalInterestType);
+        return this.fixedDepositAccountHelper
+                .applyFixedDepositApplication(fixedDepositApplicationJSON, this.requestSpec, this.responseSpec);
+    }
+
+    private Integer applyForFixedDepositApplication(final String clientID, final String productID, final String submittedOnDate,
+            final String penalInterestType, final String depositAmount, final String depositPeriod) {
+        System.out.println("--------------------------------APPLYING FOR FIXED DEPOSIT ACCOUNT --------------------------------");
+        final String fixedDepositApplicationJSON = new FixedDepositAccountHelper(this.requestSpec, this.responseSpec)
+                //
+                .withSubmittedOnDate(submittedOnDate).withDepositPeriod(depositPeriod).withDepositAmount(depositAmount)
+                .build(clientID, productID, penalInterestType);
         return this.fixedDepositAccountHelper
                 .applyFixedDepositApplication(fixedDepositApplicationJSON, this.requestSpec, this.responseSpec);
     }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/37dfe1a0/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/RecurringDepositTest.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/RecurringDepositTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/RecurringDepositTest.java
index b9fd152..1d52aec 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/RecurringDepositTest.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/RecurringDepositTest.java
@@ -2496,6 +2496,169 @@ public class RecurringDepositTest {
 
     }
 
+    @Test
+    public void testRecurringDepositAccountWithPeriodInterestRateChart() {
+        final String chartToUse = "period";
+        final String depositAmount = "1000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(6.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithPeriodInterestRateChart_AMOUNT_VARIATION() {
+        final String chartToUse = "period";
+        final String depositAmount = "10000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(6.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithPeriodInterestRateChart_PERIOD_VARIATION() {
+        final String chartToUse = "period";
+        final String depositAmount = "1000";
+        final String depositPeriod = "18";
+        final Float interestRate = new Float(7.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithAmountInterestRateChart() {
+        final String chartToUse = "amount";
+        final String depositAmount = "1000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(8.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithAmountInterestRateChart_AMOUNT_VARIATION() {
+        final String chartToUse = "amount";
+        final String depositAmount = "500";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(7.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithAmountInterestRateChart_PERIOD_VARIATION() {
+        final String chartToUse = "amount";
+        final String depositAmount = "500";
+        final String depositPeriod = "10";
+        final Float interestRate = new Float(5.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithPeriodAndAmountInterestRateChart() {
+        final String chartToUse = "period_amount";
+        final String depositAmount = "1000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(7.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithPeriodAndAmountInterestRateChart_AMOUNT_VARIATION() {
+        final String chartToUse = "period_amount";
+        final String depositAmount = "400";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(6.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithPeriodAndAmountInterestRateChart_PERIOD_VARIATION() {
+        final String chartToUse = "period_amount";
+        final String depositAmount = "1000";
+        final String depositPeriod = "14";
+        final Float interestRate = new Float(8.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithAmountAndPeriodInterestRateChart() {
+        final String chartToUse = "amount_period";
+        final String depositAmount = "1000";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(8.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithAmountAndPeriodInterestRateChart_AMOUNT_VARIATION() {
+        final String chartToUse = "amount_period";
+        final String depositAmount = "100";
+        final String depositPeriod = "12";
+        final Float interestRate = new Float(6.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+    
+    @Test
+    public void testRecurringDepositAccountWithAmountAndPeriodInterestRateChart_PERIOD_VARIATION() {
+        final String chartToUse = "amount_period";
+        final String depositAmount = "1000";
+        final String depositPeriod = "6";
+        final Float interestRate = new Float(7.0);
+        testFixedDepositAccountForInterestRate(chartToUse, depositAmount, depositPeriod, interestRate);
+    }
+
+    private void testFixedDepositAccountForInterestRate(final String chartToUse, final String depositAmount, final String depositPeriod,
+            final Float interestRate) {
+        this.recurringDepositProductHelper = new RecurringDepositProductHelper(this.requestSpec, this.responseSpec);
+        this.accountHelper = new AccountHelper(this.requestSpec, this.responseSpec);
+        this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
+        this.recurringDepositAccountHelper = new RecurringDepositAccountHelper(this.requestSpec, this.responseSpec);
+
+        final String VALID_FROM = "01 March 2014";
+        final String VALID_TO = "01 March 2016";
+
+        final String SUBMITTED_ON_DATE = "01 March 2015";
+        final String APPROVED_ON_DATE = "01 March 2015";
+        final String ACTIVATION_DATE = "01 March 2015";
+
+        Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        Assert.assertNotNull(clientId);
+
+        /***
+         * Create FD product with CashBased accounting enabled
+         */
+        final String accountingRule = NONE;
+        Integer recurringDepositProductId = createRecurringDepositProduct(VALID_FROM, VALID_TO, accountingRule, chartToUse);
+        Assert.assertNotNull(recurringDepositProductId);
+
+        /***
+         * Apply for FD account with created product and verify status
+         */
+        Integer recurringDepositAccountId = applyForRecurringDepositApplication(clientId.toString(), recurringDepositProductId.toString(),
+                VALID_FROM, VALID_TO, SUBMITTED_ON_DATE, WHOLE_TERM, SUBMITTED_ON_DATE, depositAmount, depositPeriod);
+        Assert.assertNotNull(recurringDepositAccountId);
+
+        HashMap recurringDepositAccountStatusHashMap = RecurringDepositAccountStatusChecker.getStatusOfRecurringDepositAccount(
+                this.requestSpec, this.responseSpec, recurringDepositAccountId.toString());
+        RecurringDepositAccountStatusChecker.verifyRecurringDepositIsPending(recurringDepositAccountStatusHashMap);
+
+        /***
+         * Approve the RD account and verify whether account is approved
+         */
+        recurringDepositAccountStatusHashMap = this.recurringDepositAccountHelper.approveRecurringDeposit(recurringDepositAccountId,
+                APPROVED_ON_DATE);
+        RecurringDepositAccountStatusChecker.verifyRecurringDepositIsApproved(recurringDepositAccountStatusHashMap);
+
+        /***
+         * Activate the RD Account and verify whether account is activated
+         */
+        recurringDepositAccountStatusHashMap = this.recurringDepositAccountHelper.activateRecurringDeposit(recurringDepositAccountId,
+                ACTIVATION_DATE);
+        RecurringDepositAccountStatusChecker.verifyRecurringDepositIsActive(recurringDepositAccountStatusHashMap);
+
+        HashMap recurringDepositAccountData = this.recurringDepositAccountHelper.getRecurringDepositAccountById(this.requestSpec,
+                this.responseSpec, recurringDepositAccountId);
+
+        Assert.assertEquals(interestRate, recurringDepositAccountData.get("nominalAnnualInterestRate"));
+    }
+
     private Integer createRecurringDepositProduct(final String validFrom, final String validTo, final String accountingRule,
             Account... accounts) {
         System.out.println("------------------------------CREATING NEW RECURRING DEPOSIT PRODUCT ---------------------------------------");
@@ -2505,6 +2668,36 @@ public class RecurringDepositTest {
         } else if (accountingRule.equals(NONE)) {
             recurringDepositProductHelper = recurringDepositProductHelper.withAccountingRuleAsNone();
         }
+        final String recurringDepositProductJSON = recurringDepositProductHelper.withPeriodRangeChart().build(validFrom, validTo);
+        return RecurringDepositProductHelper.createRecurringDepositProduct(recurringDepositProductJSON, requestSpec, responseSpec);
+    }
+
+    private Integer createRecurringDepositProduct(final String validFrom, final String validTo, final String accountingRule,
+            final String chartToBePicked, Account... accounts) {
+        System.out.println("------------------------------CREATING NEW RECURRING DEPOSIT PRODUCT ---------------------------------------");
+        RecurringDepositProductHelper recurringDepositProductHelper = new RecurringDepositProductHelper(this.requestSpec, this.responseSpec);
+        if (accountingRule.equals(CASH_BASED)) {
+            recurringDepositProductHelper = recurringDepositProductHelper.withAccountingRuleAsCashBased(accounts);
+        } else if (accountingRule.equals(NONE)) {
+            recurringDepositProductHelper = recurringDepositProductHelper.withAccountingRuleAsNone();
+        }
+
+        switch (chartToBePicked) {
+            case "period":
+                recurringDepositProductHelper = recurringDepositProductHelper.withPeriodRangeChart();
+            break;
+            case "amount":
+                recurringDepositProductHelper = recurringDepositProductHelper.withAmountRangeChart();
+            break;
+            case "period_amount":
+                recurringDepositProductHelper = recurringDepositProductHelper.withPeriodAndAmountRangeChart();
+            break;
+            case "amount_period":
+                recurringDepositProductHelper = recurringDepositProductHelper.withAmountAndPeriodRangeChart();
+            break;
+            default:
+            break;
+        }
         final String recurringDepositProductJSON = recurringDepositProductHelper.build(validFrom, validTo);
         return RecurringDepositProductHelper.createRecurringDepositProduct(recurringDepositProductJSON, requestSpec, responseSpec);
     }
@@ -2514,7 +2707,18 @@ public class RecurringDepositTest {
         System.out.println("--------------------------------APPLYING FOR RECURRING DEPOSIT ACCOUNT --------------------------------");
         final String recurringDepositApplicationJSON = new RecurringDepositAccountHelper(this.requestSpec, this.responseSpec)
                 .withSubmittedOnDate(submittedOnDate).withExpectedFirstDepositOnDate(expectedFirstDepositOnDate)
-                .build(clientID, productID, validFrom, validTo, penalInterestType);
+                .build(clientID, productID, penalInterestType);
+        return this.recurringDepositAccountHelper.applyRecurringDepositApplication(recurringDepositApplicationJSON, this.requestSpec,
+                this.responseSpec);
+    }
+
+    private Integer applyForRecurringDepositApplication(final String clientID, final String productID, final String validFrom,
+            final String validTo, final String submittedOnDate, final String penalInterestType, final String expectedFirstDepositOnDate,
+            final String depositAmount, final String depositPeriod) {
+        System.out.println("--------------------------------APPLYING FOR RECURRING DEPOSIT ACCOUNT --------------------------------");
+        final String recurringDepositApplicationJSON = new RecurringDepositAccountHelper(this.requestSpec, this.responseSpec)
+                .withSubmittedOnDate(submittedOnDate).withExpectedFirstDepositOnDate(expectedFirstDepositOnDate)
+                .withDepositPeriod(depositPeriod).withMandatoryDepositAmount(depositAmount).build(clientID, productID, penalInterestType);
         return this.recurringDepositAccountHelper.applyRecurringDepositApplication(recurringDepositApplicationJSON, this.requestSpec,
                 this.responseSpec);
     }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/37dfe1a0/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
index 985889a..cc6b3c8 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java
@@ -892,6 +892,7 @@ public class SchedulerJobsTestResults {
         FixedDepositProductHelper fixedDepositProductHelper = new FixedDepositProductHelper(this.requestSpec, this.responseSpec);
         final String fixedDepositProductJSON = fixedDepositProductHelper //
                 // .withAccountingRuleAsCashBased(accounts)
+                .withPeriodRangeChart()//
                 .build(validFrom, validTo);
         return FixedDepositProductHelper.createFixedDepositProduct(fixedDepositProductJSON, requestSpec, responseSpec);
     }
@@ -904,7 +905,7 @@ public class SchedulerJobsTestResults {
                 //
                 .withSubmittedOnDate(submittedOnDate).withSavings(savingsId).transferInterest(true)
                 .withLockinPeriodFrequency("1", FixedDepositAccountHelper.DAYS)
-                .build(clientID, productID, validFrom, validTo, penalInterestType);
+                .build(clientID, productID, penalInterestType);
         return fixedDepositAccountHelper.applyFixedDepositApplication(fixedDepositApplicationJSON, this.requestSpec, this.responseSpec);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/37dfe1a0/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositAccountHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositAccountHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositAccountHelper.java
index fa48717..64bd4c8 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositAccountHelper.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositAccountHelper.java
@@ -72,6 +72,7 @@ public class FixedDepositAccountHelper {
     private static final String DAYS_360 = "360";
     private static final String DAYS_365 = "365";
     public final static String depositAmount = "100000";
+    private String newDepositAmount = null;
 
     private String interestCompoundingPeriodType = MONTHLY;
     private String interestPostingPeriodType = MONTHLY;
@@ -90,64 +91,15 @@ public class FixedDepositAccountHelper {
     private final boolean isActiveChart = true;
     private final String currencyCode = USD;
 
-    private final String depositPeriod = "14";
+    private String depositPeriod = "14";
     private final String depositPeriodFrequencyId = MONTHS;
     private String submittedOnDate = "";
     private String savingsId = null;
     private boolean transferInterest = false;
 
-    public String build(final String clientId, final String productId, final String validFrom, final String validTo,
-            final String penalInterestType) {
+    public String build(final String clientId, final String productId, final String penalInterestType) {
         final HashMap<String, Object> map = new HashMap<>();
 
-        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
-        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
-        chartSlabsMap1.put("description", "First");
-        chartSlabsMap1.put("periodType", MONTHS);
-        chartSlabsMap1.put("fromPeriod", "1");
-        chartSlabsMap1.put("toPeriod", "6");
-        chartSlabsMap1.put("annualInterestRate", "5");
-        chartSlabsMap1.put("locale", LOCALE);
-        chartSlabs.add(0, chartSlabsMap1);
-
-        HashMap<String, String> chartSlabsMap2 = new HashMap<>();
-        chartSlabsMap2.put("description", "Second");
-        chartSlabsMap2.put("periodType", MONTHS);
-        chartSlabsMap2.put("fromPeriod", "7");
-        chartSlabsMap2.put("toPeriod", "12");
-        chartSlabsMap2.put("annualInterestRate", "6");
-        chartSlabsMap2.put("locale", LOCALE);
-        chartSlabs.add(1, chartSlabsMap2);
-
-        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
-        chartSlabsMap3.put("description", "Third");
-        chartSlabsMap3.put("periodType", MONTHS);
-        chartSlabsMap3.put("fromPeriod", "13");
-        chartSlabsMap3.put("toPeriod", "18");
-        chartSlabsMap3.put("annualInterestRate", "7");
-        chartSlabsMap3.put("locale", LOCALE);
-        chartSlabs.add(2, chartSlabsMap3);
-
-        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
-        chartSlabsMap4.put("description", "Fourth");
-        chartSlabsMap4.put("periodType", MONTHS);
-        chartSlabsMap4.put("fromPeriod", "19");
-        chartSlabsMap4.put("toPeriod", "24");
-        chartSlabsMap4.put("annualInterestRate", "8");
-        chartSlabsMap4.put("locale", LOCALE);
-        chartSlabs.add(3, chartSlabsMap4);
-
-        List<HashMap<String, Object>> charts = new ArrayList<HashMap<String, Object>>();
-        HashMap<String, Object> chartsMap = new HashMap<>();
-        chartsMap.put("fromDate", validFrom);
-        chartsMap.put("endDate", validTo);
-        chartsMap.put("dateFormat", "dd MMMM yyyy");
-        chartsMap.put("locale", LOCALE);
-        chartsMap.put("isActiveChart", this.isActiveChart);
-        chartsMap.put("chartSlabs", chartSlabs);
-        charts.add(chartsMap);
-
-        map.put("charts", charts);
         map.put("productId", productId);
         map.put("clientId", clientId);
         map.put("interestCalculationDaysInYearType", this.interestCalculationDaysInYearType);
@@ -169,7 +121,7 @@ public class FixedDepositAccountHelper {
         map.put("inMultiplesOfDepositTermTypeId", this.inMultiplesOfDepositTermTypeId);
         map.put("preClosurePenalInterest", this.preClosurePenalInterest);
         map.put("preClosurePenalInterestOnTypeId", penalInterestType);
-        map.put("depositAmount", depositAmount);
+        map.put("depositAmount", getDepositAmount());
         map.put("depositPeriod", this.depositPeriod);
         map.put("depositPeriodFrequencyId", this.depositPeriodFrequencyId);
         map.put("submittedOnDate", this.submittedOnDate);
@@ -196,8 +148,16 @@ public class FixedDepositAccountHelper {
     }
 
     public HashMap getFixedDepositSummary(final Integer accountID) {
+        return getFixedDepositDetails(accountID, "summary");
+    }
+
+    public HashMap getFixedDepositDetails(final Integer accountID) {
+        return getFixedDepositDetails(accountID, "");
+    }
+
+    private HashMap getFixedDepositDetails(final Integer accountID, final String jsonAttributeToGetBack) {
         final String URL = FIXED_DEPOSIT_ACCOUNT_URL + "/" + accountID + "?" + Utils.TENANT_IDENTIFIER;
-        final HashMap response = Utils.performServerGet(requestSpec, responseSpec, URL, "summary");
+        final HashMap response = Utils.performServerGet(requestSpec, responseSpec, URL, jsonAttributeToGetBack);
         return response;
     }
 
@@ -251,7 +211,7 @@ public class FixedDepositAccountHelper {
 
         final String fixedDepositApplicationJSON = new FixedDepositAccountHelper(this.requestSpec, this.responseSpec) //
                 .withSubmittedOnDate(submittedOnDate) //
-                .build(clientID, productID, validFrom, validTo, penalInterestType);
+                .build(clientID, productID, penalInterestType);
 
         return Utils.performServerPut(this.requestSpec, this.responseSpec, FIXED_DEPOSIT_ACCOUNT_URL + "/" + accountID + "?"
                 + Utils.TENANT_IDENTIFIER, fixedDepositApplicationJSON, CommonConstants.RESPONSE_CHANGES);
@@ -268,7 +228,7 @@ public class FixedDepositAccountHelper {
                 .withInterestCalculationPeriodType(interestCalculationType) //
                 .withInterestCompoundingPeriodType(interestCompoundingPeriodType) //
                 .withInterestPostingPeriodType(interestPostingPeriodType) //
-                .build(clientID, productID, validFrom, validTo, penalInterestType);
+                .build(clientID, productID, penalInterestType);
 
         return Utils.performServerPut(this.requestSpec, this.responseSpec, FIXED_DEPOSIT_ACCOUNT_URL + "/" + accountID + "?"
                 + Utils.TENANT_IDENTIFIER, fixedDepositApplicationJSON, CommonConstants.RESPONSE_CHANGES);
@@ -487,4 +447,19 @@ public class FixedDepositAccountHelper {
         this.lockinPeriodFrequency = lockinPeriodFrequency;
         return this;
     }
+
+    public FixedDepositAccountHelper withDepositPeriod(final String depositPeriod) {
+        this.depositPeriod = depositPeriod;
+        return this;
+    }
+
+    public FixedDepositAccountHelper withDepositAmount(final String depositAmount) {
+        this.newDepositAmount = depositAmount;
+        return this;
+    }
+
+    private String getDepositAmount() {
+        if (this.newDepositAmount == null) { return depositAmount; }
+        return this.newDepositAmount;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/37dfe1a0/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositProductHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositProductHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositProductHelper.java
index 2703340..b20b6f9 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositProductHelper.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/fixeddeposit/FixedDepositProductHelper.java
@@ -97,54 +97,20 @@ public class FixedDepositProductHelper {
     private final String currencyCode = USD;
     private final String interestCalculationDaysInYearType = DAYS_365;
     private Account[] accountList = null;
+    private List<HashMap<String, String>> chartSlabs = null;
+    private boolean isPrimaryGroupingByAmount = false;
 
     public String build(final String validFrom, final String validTo) {
         final HashMap<String, Object> map = new HashMap<>();
 
-        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
-        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
-        chartSlabsMap1.put("description", "First");
-        chartSlabsMap1.put("periodType", MONTHS);
-        chartSlabsMap1.put("fromPeriod", "1");
-        chartSlabsMap1.put("toPeriod", "6");
-        chartSlabsMap1.put("annualInterestRate", "5");
-        chartSlabsMap1.put("locale", LOCALE);
-        chartSlabs.add(0, chartSlabsMap1);
-
-        HashMap<String, String> chartSlabsMap2 = new HashMap<>();
-        chartSlabsMap2.put("description", "Second");
-        chartSlabsMap2.put("periodType", MONTHS);
-        chartSlabsMap2.put("fromPeriod", "7");
-        chartSlabsMap2.put("toPeriod", "12");
-        chartSlabsMap2.put("annualInterestRate", "6");
-        chartSlabsMap2.put("locale", LOCALE);
-        chartSlabs.add(1, chartSlabsMap2);
-
-        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
-        chartSlabsMap3.put("description", "Third");
-        chartSlabsMap3.put("periodType", MONTHS);
-        chartSlabsMap3.put("fromPeriod", "13");
-        chartSlabsMap3.put("toPeriod", "18");
-        chartSlabsMap3.put("annualInterestRate", "7");
-        chartSlabsMap3.put("locale", LOCALE);
-        chartSlabs.add(2, chartSlabsMap3);
-
-        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
-        chartSlabsMap4.put("description", "Fourth");
-        chartSlabsMap4.put("periodType", MONTHS);
-        chartSlabsMap4.put("fromPeriod", "19");
-        chartSlabsMap4.put("toPeriod", "24");
-        chartSlabsMap4.put("annualInterestRate", "8");
-        chartSlabsMap4.put("locale", LOCALE);
-        chartSlabs.add(3, chartSlabsMap4);
-
         List<HashMap<String, Object>> charts = new ArrayList<HashMap<String, Object>>();
         HashMap<String, Object> chartsMap = new HashMap<>();
         chartsMap.put("fromDate", validFrom);
         chartsMap.put("endDate", validTo);
         chartsMap.put("dateFormat", "dd MMMM yyyy");
         chartsMap.put("locale", LOCALE);
-        chartsMap.put("chartSlabs", chartSlabs);
+        chartsMap.put("chartSlabs", this.chartSlabs);
+        chartsMap.put("isPrimaryGroupingByAmount", this.isPrimaryGroupingByAmount);
         charts.add(chartsMap);
 
         map.put("charts", charts);
@@ -173,6 +139,7 @@ public class FixedDepositProductHelper {
         map.put("inMultiplesOfDepositTermTypeId", this.inMultiplesOfDepositTermTypeId);
         map.put("preClosurePenalInterest", this.preClosurePenalInterest);
         map.put("preClosurePenalInterestOnTypeId", this.preClosurePenalInterestOnTypeId);
+        
 
         if (this.accountingRule.equals(CASH_BASED)) {
             map.putAll(getAccountMappingForCashBased());
@@ -183,6 +150,207 @@ public class FixedDepositProductHelper {
         return FixedDepositProductCreateJson;
     }
 
+    public List<HashMap<String, String>> constructChartSlabWithPeriodRange() {
+        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
+        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
+        chartSlabsMap1.put("description", "First");
+        chartSlabsMap1.put("periodType", MONTHS);
+        chartSlabsMap1.put("fromPeriod", "1");
+        chartSlabsMap1.put("toPeriod", "6");
+        chartSlabsMap1.put("annualInterestRate", "5");
+        chartSlabsMap1.put("locale", LOCALE);
+        chartSlabs.add(0, chartSlabsMap1);
+
+        HashMap<String, String> chartSlabsMap2 = new HashMap<>();
+        chartSlabsMap2.put("description", "Second");
+        chartSlabsMap2.put("periodType", MONTHS);
+        chartSlabsMap2.put("fromPeriod", "7");
+        chartSlabsMap2.put("toPeriod", "12");
+        chartSlabsMap2.put("annualInterestRate", "6");
+        chartSlabsMap2.put("locale", LOCALE);
+        chartSlabs.add(1, chartSlabsMap2);
+
+        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
+        chartSlabsMap3.put("description", "Third");
+        chartSlabsMap3.put("periodType", MONTHS);
+        chartSlabsMap3.put("fromPeriod", "13");
+        chartSlabsMap3.put("toPeriod", "18");
+        chartSlabsMap3.put("annualInterestRate", "7");
+        chartSlabsMap3.put("locale", LOCALE);
+        chartSlabs.add(2, chartSlabsMap3);
+
+        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
+        chartSlabsMap4.put("description", "Fourth");
+        chartSlabsMap4.put("periodType", MONTHS);
+        chartSlabsMap4.put("fromPeriod", "19");
+        chartSlabsMap4.put("annualInterestRate", "8");
+        chartSlabsMap4.put("locale", LOCALE);
+        chartSlabs.add(3, chartSlabsMap4);
+        return chartSlabs;
+    }
+
+    public List<HashMap<String, String>> constructChartSlabWithPeriodAndAmountRange() {
+        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
+        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
+        chartSlabsMap1.put("description", "First");
+        chartSlabsMap1.put("periodType", MONTHS);
+        chartSlabsMap1.put("fromPeriod", "1");
+        chartSlabsMap1.put("toPeriod", "6");
+        chartSlabsMap1.put("amountRangeFrom", "1");
+        chartSlabsMap1.put("amountRangeTo", "5000");
+        chartSlabsMap1.put("annualInterestRate", "5");
+        chartSlabsMap1.put("locale", LOCALE);
+        chartSlabs.add(0, chartSlabsMap1);
+
+        HashMap<String, String> chartSlabsMap1_1 = new HashMap<>();
+        chartSlabsMap1_1.put("description", "First");
+        chartSlabsMap1_1.put("periodType", MONTHS);
+        chartSlabsMap1_1.put("fromPeriod", "1");
+        chartSlabsMap1_1.put("toPeriod", "6");
+        chartSlabsMap1_1.put("amountRangeFrom", "5001");
+        chartSlabsMap1_1.put("annualInterestRate", "6");
+        chartSlabsMap1_1.put("locale", LOCALE);
+        chartSlabs.add(0, chartSlabsMap1_1);
+
+        HashMap<String, String> chartSlabsMap2 = new HashMap<>();
+        chartSlabsMap2.put("description", "Second");
+        chartSlabsMap2.put("periodType", MONTHS);
+        chartSlabsMap2.put("fromPeriod", "7");
+        chartSlabsMap2.put("toPeriod", "12");
+        chartSlabsMap2.put("amountRangeFrom", "1");
+        chartSlabsMap2.put("amountRangeTo", "5000");
+        chartSlabsMap2.put("annualInterestRate", "6");
+        chartSlabsMap2.put("locale", LOCALE);
+        chartSlabs.add(1, chartSlabsMap2);
+
+        HashMap<String, String> chartSlabsMap2_2 = new HashMap<>();
+        chartSlabsMap2_2.put("description", "Second");
+        chartSlabsMap2_2.put("periodType", MONTHS);
+        chartSlabsMap2_2.put("fromPeriod", "7");
+        chartSlabsMap2_2.put("toPeriod", "12");
+        chartSlabsMap2_2.put("amountRangeFrom", "5001");
+        chartSlabsMap2_2.put("annualInterestRate", "7");
+        chartSlabsMap2_2.put("locale", LOCALE);
+        chartSlabs.add(1, chartSlabsMap2_2);
+
+        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
+        chartSlabsMap3.put("description", "Third");
+        chartSlabsMap3.put("periodType", MONTHS);
+        chartSlabsMap3.put("fromPeriod", "13");
+        chartSlabsMap3.put("toPeriod", "18");
+        chartSlabsMap3.put("amountRangeFrom", "1");
+        chartSlabsMap3.put("amountRangeTo", "5000");
+        chartSlabsMap3.put("annualInterestRate", "7");
+        chartSlabsMap3.put("locale", LOCALE);
+        chartSlabs.add(2, chartSlabsMap3);
+
+        HashMap<String, String> chartSlabsMap3_1 = new HashMap<>();
+        chartSlabsMap3_1.put("description", "Third");
+        chartSlabsMap3_1.put("periodType", MONTHS);
+        chartSlabsMap3_1.put("fromPeriod", "13");
+        chartSlabsMap3_1.put("toPeriod", "18");
+        chartSlabsMap3_1.put("amountRangeFrom", "5001");
+        chartSlabsMap3_1.put("annualInterestRate", "8");
+        chartSlabsMap3_1.put("locale", LOCALE);
+        chartSlabs.add(2, chartSlabsMap3_1);
+
+        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
+        chartSlabsMap4.put("description", "Fourth");
+        chartSlabsMap4.put("periodType", MONTHS);
+        chartSlabsMap4.put("fromPeriod", "19");
+        chartSlabsMap4.put("amountRangeFrom", "1");
+        chartSlabsMap4.put("amountRangeTo", "5000");
+        chartSlabsMap4.put("annualInterestRate", "8");
+        chartSlabsMap4.put("locale", LOCALE);
+        chartSlabs.add(3, chartSlabsMap4);
+
+        HashMap<String, String> chartSlabsMap4_1 = new HashMap<>();
+        chartSlabsMap4_1.put("description", "Fourth");
+        chartSlabsMap4_1.put("periodType", MONTHS);
+        chartSlabsMap4_1.put("fromPeriod", "19");
+        chartSlabsMap4_1.put("amountRangeFrom", "5001");
+        chartSlabsMap4_1.put("annualInterestRate", "9");
+        chartSlabsMap4_1.put("locale", LOCALE);
+        chartSlabs.add(3, chartSlabsMap4_1);
+
+        return chartSlabs;
+    }
+
+    public List<HashMap<String, String>> constructChartSlabWithAmountAndPeriodRange() {
+        this.isPrimaryGroupingByAmount = true;
+        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
+        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
+        chartSlabsMap1.put("description", "First");
+        chartSlabsMap1.put("periodType", MONTHS);
+        chartSlabsMap1.put("amountRangeFrom", "1");
+        chartSlabsMap1.put("amountRangeTo", "5000");
+        chartSlabsMap1.put("fromPeriod", "1");
+        chartSlabsMap1.put("toPeriod", "6");
+        chartSlabsMap1.put("annualInterestRate", "5");
+        chartSlabsMap1.put("locale", LOCALE);
+        chartSlabs.add(0, chartSlabsMap1);
+
+        HashMap<String, String> chartSlabsMap2 = new HashMap<>();
+        chartSlabsMap2.put("description", "Second");
+        chartSlabsMap2.put("periodType", MONTHS);
+        chartSlabsMap2.put("fromPeriod", "7");
+        chartSlabsMap2.put("amountRangeFrom", "1");
+        chartSlabsMap2.put("amountRangeTo", "5000");
+        chartSlabsMap2.put("annualInterestRate", "6");
+        chartSlabsMap2.put("locale", LOCALE);
+        chartSlabs.add(1, chartSlabsMap2);
+
+        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
+        chartSlabsMap3.put("description", "Third");
+        chartSlabsMap3.put("periodType", MONTHS);
+        chartSlabsMap3.put("fromPeriod", "1");
+        chartSlabsMap3.put("toPeriod", "6");
+        chartSlabsMap3.put("amountRangeFrom", "5001");
+        chartSlabsMap3.put("annualInterestRate", "7");
+        chartSlabsMap3.put("locale", LOCALE);
+        chartSlabs.add(2, chartSlabsMap3);
+
+        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
+        chartSlabsMap4.put("description", "Fourth");
+        chartSlabsMap4.put("periodType", MONTHS);
+        chartSlabsMap4.put("fromPeriod", "7");
+        chartSlabsMap4.put("amountRangeFrom", "5001");
+        chartSlabsMap4.put("annualInterestRate", "8");
+        chartSlabsMap4.put("locale", LOCALE);
+        chartSlabs.add(3, chartSlabsMap4);
+
+        return chartSlabs;
+    }
+
+    public List<HashMap<String, String>> constructChartSlabWithAmountRange() {
+        this.isPrimaryGroupingByAmount = true;
+        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
+        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
+        chartSlabsMap1.put("description", "First");
+        chartSlabsMap1.put("amountRangeFrom", "1");
+        chartSlabsMap1.put("amountRangeTo", "5000");
+        chartSlabsMap1.put("annualInterestRate", "5");
+        chartSlabsMap1.put("locale", LOCALE);
+        chartSlabs.add(0, chartSlabsMap1);
+
+        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
+        chartSlabsMap3.put("description", "Third");
+        chartSlabsMap3.put("amountRangeFrom", "5001");
+        chartSlabsMap3.put("amountRangeTo", "10000");
+        chartSlabsMap3.put("annualInterestRate", "7");
+        chartSlabsMap3.put("locale", LOCALE);
+        chartSlabs.add(1, chartSlabsMap3);
+
+        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
+        chartSlabsMap4.put("description", "Fourth");
+        chartSlabsMap4.put("amountRangeFrom", "10001");
+        chartSlabsMap4.put("annualInterestRate", "8");
+        chartSlabsMap4.put("locale", LOCALE);
+        chartSlabs.add(2, chartSlabsMap4);
+
+        return chartSlabs;
+    }
+
     public FixedDepositProductHelper withAccountingRuleAsNone() {
         this.accountingRule = NONE;
         return this;
@@ -194,6 +362,26 @@ public class FixedDepositProductHelper {
         return this;
     }
 
+    public FixedDepositProductHelper withPeriodRangeChart() {
+        this.chartSlabs = constructChartSlabWithPeriodRange();
+        return this;
+    }
+
+    public FixedDepositProductHelper withPeriodAndAmountRangeChart() {
+        this.chartSlabs = constructChartSlabWithPeriodAndAmountRange();
+        return this;
+    }
+
+    public FixedDepositProductHelper withAmountRangeChart() {
+        this.chartSlabs = constructChartSlabWithAmountRange();
+        return this;
+    }
+
+    public FixedDepositProductHelper withAmountAndPeriodRangeChart() {
+        this.chartSlabs = constructChartSlabWithAmountAndPeriodRange();
+        return this;
+    }
+
     private Map<String, String> getAccountMappingForCashBased() {
         final Map<String, String> map = new HashMap<>();
         if (accountList != null) {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/37dfe1a0/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/recurringdeposit/RecurringDepositAccountHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/recurringdeposit/RecurringDepositAccountHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/recurringdeposit/RecurringDepositAccountHelper.java
index 5ec7cfd..d556cd8 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/recurringdeposit/RecurringDepositAccountHelper.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/recurringdeposit/RecurringDepositAccountHelper.java
@@ -28,6 +28,7 @@ import java.util.Locale;
 
 import org.apache.fineract.integrationtests.common.CommonConstants;
 import org.apache.fineract.integrationtests.common.Utils;
+import org.apache.fineract.integrationtests.common.fixeddeposit.FixedDepositAccountHelper;
 
 import com.google.gson.Gson;
 import com.jayway.restassured.specification.RequestSpecification;
@@ -99,67 +100,18 @@ public class RecurringDepositAccountHelper {
     private final String currencyCode = USD;
     private String interestCalculationDaysInYearType = DAYS_365;
     private final String depositAmount = "2000";
-    private final String depositPeriod = "14";
+    private String depositPeriod = "14";
     private final String depositPeriodFrequencyId = MONTHS;
     private final String recurringFrequency = "1";
     private final String recurringFrequencyType = MONTHS;
-    private final String mandatoryRecommendedDepositAmount = "2000";
+    private String mandatoryRecommendedDepositAmount = "2000";
     private String submittedOnDate = "";
     private String expectedFirstDepositOnDate = "";
     private boolean isCalendarInherited = false;
 
-    public String build(final String clientId, final String productId, final String validFrom, final String validTo,
-            final String penalInterestType) {
+    public String build(final String clientId, final String productId, final String penalInterestType) {
         final HashMap<String, Object> map = new HashMap<>();
 
-        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
-        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
-        chartSlabsMap1.put("description", "First");
-        chartSlabsMap1.put("periodType", MONTHS);
-        chartSlabsMap1.put("fromPeriod", "1");
-        chartSlabsMap1.put("toPeriod", "6");
-        chartSlabsMap1.put("annualInterestRate", "5");
-        chartSlabsMap1.put("locale", LOCALE);
-        chartSlabs.add(0, chartSlabsMap1);
-
-        HashMap<String, String> chartSlabsMap2 = new HashMap<>();
-        chartSlabsMap2.put("description", "Second");
-        chartSlabsMap2.put("periodType", MONTHS);
-        chartSlabsMap2.put("fromPeriod", "7");
-        chartSlabsMap2.put("toPeriod", "12");
-        chartSlabsMap2.put("annualInterestRate", "6");
-        chartSlabsMap2.put("locale", LOCALE);
-        chartSlabs.add(1, chartSlabsMap2);
-
-        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
-        chartSlabsMap3.put("description", "Third");
-        chartSlabsMap3.put("periodType", MONTHS);
-        chartSlabsMap3.put("fromPeriod", "13");
-        chartSlabsMap3.put("toPeriod", "18");
-        chartSlabsMap3.put("annualInterestRate", "7");
-        chartSlabsMap3.put("locale", LOCALE);
-        chartSlabs.add(2, chartSlabsMap3);
-
-        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
-        chartSlabsMap4.put("description", "Fourth");
-        chartSlabsMap4.put("periodType", MONTHS);
-        chartSlabsMap4.put("fromPeriod", "19");
-        chartSlabsMap4.put("toPeriod", "24");
-        chartSlabsMap4.put("annualInterestRate", "8");
-        chartSlabsMap4.put("locale", LOCALE);
-        chartSlabs.add(3, chartSlabsMap4);
-
-        List<HashMap<String, Object>> charts = new ArrayList<HashMap<String, Object>>();
-        HashMap<String, Object> chartsMap = new HashMap<>();
-        chartsMap.put("fromDate", validFrom);
-        chartsMap.put("endDate", validTo);
-        chartsMap.put("dateFormat", "dd MMMM yyyy");
-        chartsMap.put("locale", LOCALE);
-        chartsMap.put("isActiveChart", this.isActiveChart);
-        chartsMap.put("chartSlabs", chartSlabs);
-        charts.add(chartsMap);
-
-        map.put("charts", charts);
         map.put("productId", productId);
         map.put("clientId", clientId);
         map.put("interestCalculationDaysInYearType", this.interestCalculationDaysInYearType);
@@ -231,8 +183,8 @@ public class RecurringDepositAccountHelper {
         return annualInterestRate;
     }
 
-    public static Float getPrincipalAfterCompoundingInterest(Calendar currentDate, Float principal, Float depositAmount, Integer depositPeriod,
-            double interestPerDay, Integer compoundingInterval, Integer postingInterval) {
+    public static Float getPrincipalAfterCompoundingInterest(Calendar currentDate, Float principal, Float depositAmount,
+            Integer depositPeriod, double interestPerDay, Integer compoundingInterval, Integer postingInterval) {
 
         Float totalInterest = 0.0f;
         Float interestEarned = 0.0f;
@@ -274,7 +226,7 @@ public class RecurringDepositAccountHelper {
         final String EXPECTED_FIRST_DEPOSIT_ON_ON_DATE = SUBMITTED_ON_DATE;
         final String recurringDepositApplicationJSON = new RecurringDepositAccountHelper(this.requestSpec, this.responseSpec)
                 .withSubmittedOnDate(SUBMITTED_ON_DATE).withExpectedFirstDepositOnDate(EXPECTED_FIRST_DEPOSIT_ON_ON_DATE)
-                .build(clientID, productID, validFrom, validTo, penalInterestType);
+                .build(clientID, productID, penalInterestType);
 
         return Utils.performServerPut(this.requestSpec, this.responseSpec, RECURRING_DEPOSIT_ACCOUNT_URL + "/" + accountID + "?"
                 + Utils.TENANT_IDENTIFIER, recurringDepositApplicationJSON, CommonConstants.RESPONSE_CHANGES);
@@ -292,7 +244,7 @@ public class RecurringDepositAccountHelper {
                 .withInterestCompoundingPeriodType(interestCompoundingPeriodType) //
                 .withInterestPostingPeriodType(interestPostingPeriodType) //
                 .withExpectedFirstDepositOnDate(expectedFirstDepositOnDate) //
-                .build(clientID, productID, validFrom, validTo, penalInterestType);
+                .build(clientID, productID, penalInterestType);
 
         return Utils.performServerPut(this.requestSpec, this.responseSpec, RECURRING_DEPOSIT_ACCOUNT_URL + "/" + accountID + "?"
                 + Utils.TENANT_IDENTIFIER, recurringDepositApplicationJSON, CommonConstants.RESPONSE_CHANGES);
@@ -552,5 +504,15 @@ public class RecurringDepositAccountHelper {
         this.interestPostingPeriodType = interestPostingPeriodTypeId;
         return this;
     }
+    
+    public RecurringDepositAccountHelper withDepositPeriod(final String depositPeriod) {
+        this.depositPeriod = depositPeriod;
+        return this;
+    }
+
+    public RecurringDepositAccountHelper withMandatoryDepositAmount(final String depositAmount) {
+        this.mandatoryRecommendedDepositAmount = depositAmount;
+        return this;
+    }
 
 }
\ No newline at end of file


Mime
View raw message