http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/66cee785/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
 
b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
deleted file mode 100644
index c27abc3..0000000
--- 
a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java
+++ /dev/null
@@ -1,5051 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.fineract.integrationtests;
-
-import static org.junit.Assert.assertEquals;
-
-import java.math.BigDecimal;
-import java.text.DateFormat;
-import java.text.DecimalFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.fineract.integrationtests.common.ClientHelper;
-import org.apache.fineract.integrationtests.common.SchedulerJobHelper;
-import org.apache.fineract.integrationtests.common.Utils;
-import org.apache.fineract.integrationtests.common.accounting.Account;
-import org.apache.fineract.integrationtests.common.accounting.AccountHelper;
-import org.apache.fineract.integrationtests.common.accounting.JournalEntry;
-import 
org.apache.fineract.integrationtests.common.accounting.JournalEntryHelper;
-import 
org.apache.fineract.integrationtests.common.accounting.PeriodicAccrualAccountingHelper;
-import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
-import 
org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
-import 
org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
-import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker;
-import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper;
-import 
org.apache.fineract.integrationtests.common.savings.AccountTransferHelper;
-import 
org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
-import 
org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
-import 
org.apache.fineract.integrationtests.common.savings.SavingsStatusChecker;
-import org.joda.time.LocalDate;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.gson.JsonObject;
-import com.jayway.restassured.builder.RequestSpecBuilder;
-import com.jayway.restassured.builder.ResponseSpecBuilder;
-import com.jayway.restassured.http.ContentType;
-import com.jayway.restassured.path.json.JsonPath;
-import com.jayway.restassured.specification.RequestSpecification;
-import com.jayway.restassured.specification.ResponseSpecification;
-
-/**
- * Client Loan Integration Test for checking Loan Application Repayments
- * Schedule, loan charges, penalties, loan repayments and verifying accounting
- * transactions
- */
-@SuppressWarnings({ "rawtypes", "unchecked" })
-public class ClientLoanIntegrationTest {
-
-    public static final String MINIMUM_OPENING_BALANCE = "1000.0";
-    public static final String ACCOUNT_TYPE_INDIVIDUAL = "INDIVIDUAL";
-
-    private static final String NONE = "1";
-    private static final String CASH_BASED = "2";
-    private static final String ACCRUAL_PERIODIC = "3";
-    private static final String ACCRUAL_UPFRONT = "4";
-
-    private ResponseSpecification responseSpec;
-    private RequestSpecification requestSpec;
-    private LoanTransactionHelper loanTransactionHelper;
-    private JournalEntryHelper journalEntryHelper;
-    private AccountHelper accountHelper;
-    private SchedulerJobHelper schedulerJobHelper;
-    private PeriodicAccrualAccountingHelper periodicAccrualAccountingHelper;
-    private SavingsAccountHelper savingsAccountHelper;
-    private AccountTransferHelper accountTransferHelper;
-
-    @Before
-    public void setup() {
-        Utils.initializeRESTAssured();
-        this.requestSpec = new 
RequestSpecBuilder().setContentType(ContentType.JSON).build();
-        this.requestSpec.header("Authorization", "Basic " + 
Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
-        this.responseSpec = new 
ResponseSpecBuilder().expectStatusCode(200).build();
-        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
-        this.accountHelper = new AccountHelper(this.requestSpec, 
this.responseSpec);
-    }
-
-    @Test
-    public void checkClientLoanCreateAndDisburseFlow() {
-        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
-
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
-        final Integer loanProductID = createLoanProduct(false, NONE);
-        final Integer loanID = applyForLoanApplication(clientID, 
loanProductID, null, null, "12,000.00");
-        final ArrayList<HashMap> loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec,
-                loanID);
-        verifyLoanRepaymentSchedule(loanSchedule);
-
-    }
-
-    @Test
-    public void testLoanCharges_DISBURSEMENT_FEE() {
-        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
-
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
-        final Integer loanProductID = createLoanProduct(false, NONE);
-
-        List<HashMap> charges = new ArrayList<>();
-        Integer flatDisbursement = ChargesHelper.createCharges(requestSpec, 
responseSpec, ChargesHelper.getLoanDisbursementJSON());
-
-        Integer amountPercentage = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanDisbursementJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT,
 "1"));
-        addCharges(charges, amountPercentage, "1", null);
-        Integer amountPlusInterestPercentage = 
ChargesHelper.createCharges(requestSpec, responseSpec,
-                
ChargesHelper.getLoanDisbursementJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT_AND_INTEREST,
 "1"));
-        addCharges(charges, amountPlusInterestPercentage, "1", null);
-        Integer interestPercentage = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanDisbursementJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_INTEREST,
 "1"));
-        addCharges(charges, interestPercentage, "1", null);
-
-        final Integer loanID = applyForLoanApplication(clientID, 
loanProductID, charges, null, "12,000.00");
-        Assert.assertNotNull(loanID);
-
-        HashMap loanStatusHashMap = 
LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
-        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
-
-        ArrayList<HashMap> loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        HashMap disbursementDetail = loanSchedule.get(0);
-
-        List<HashMap> loanCharges = 
this.loanTransactionHelper.getLoanCharges(loanID);
-
-        validateCharge(amountPercentage, loanCharges, "1.0", "120.0", "0.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "1.0", "6.06", "0.0", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "1.0", 
"126.06", "0.0", "0.0");
-
-        validateNumberForEqual("252.12", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-        this.loanTransactionHelper.addChargesForLoan(loanID,
-                
LoanTransactionHelper.getDisbursementChargesForLoanAsJSON(String.valueOf(flatDisbursement)));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        disbursementDetail = loanSchedule.get(0);
-
-        validateCharge(flatDisbursement, loanCharges, "100.0", "100.0", "0.0", 
"0.0");
-        validateNumberForEqual("352.12", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(amountPercentage, loanCharges).get("id"),
-                LoanTransactionHelper.getUpdateChargesForLoanAsJSON("2"));
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(interestPercentage, loanCharges).get("id"),
-                LoanTransactionHelper.getUpdateChargesForLoanAsJSON("2"));
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(amountPlusInterestPercentage, loanCharges)
-                .get("id"), 
LoanTransactionHelper.getUpdateChargesForLoanAsJSON("2"));
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(flatDisbursement, loanCharges).get("id"),
-                LoanTransactionHelper.getUpdateChargesForLoanAsJSON("150"));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        disbursementDetail = loanSchedule.get(0);
-        validateCharge(amountPercentage, loanCharges, "2.0", "240.0", "0.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "2.0", "12.12", "0.0", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "2.0", 
"252.12", "0.0", "0.0");
-        validateCharge(flatDisbursement, loanCharges, "150.0", "150.0", "0.0", 
"0.0");
-        validateNumberForEqual("654.24", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-        this.loanTransactionHelper.updateLoan(loanID,
-                updateLoanJson(clientID, loanProductID, 
copyChargesForUpdate(loanCharges, null, null), null));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        disbursementDetail = loanSchedule.get(0);
-        validateCharge(amountPercentage, loanCharges, "2.0", "200.0", "0.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "2.0", "10.1", "0.0", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "2.0", 
"210.1", "0.0", "0.0");
-        validateCharge(flatDisbursement, loanCharges, "150.0", "150.0", "0.0", 
"0.0");
-        validateNumberForEqual("570.2", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-        this.loanTransactionHelper.updateLoan(loanID,
-                updateLoanJson(clientID, loanProductID, 
copyChargesForUpdate(loanCharges, flatDisbursement, "1"), null));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        disbursementDetail = loanSchedule.get(0);
-        validateCharge(amountPercentage, loanCharges, "1.0", "100.0", "0.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "1.0", "5.05", "0.0", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "1.0", 
"105.05", "0.0", "0.0");
-        validateNumberForEqual("210.1", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-        charges.clear();
-        addCharges(charges, flatDisbursement, "100", null);
-        this.loanTransactionHelper.updateLoan(loanID, updateLoanJson(clientID, 
loanProductID, charges, null));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        disbursementDetail = loanSchedule.get(0);
-        validateCharge(flatDisbursement, loanCharges, "100.0", "100.0", "0.0", 
"0.0");
-        validateNumberForEqual("100.0", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-        this.loanTransactionHelper.deleteChargesForLoan(loanID, (Integer) 
getloanCharge(flatDisbursement, loanCharges).get("id"));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        disbursementDetail = loanSchedule.get(0);
-        Assert.assertEquals(0, loanCharges.size());
-        validateNumberForEqual("0.0", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-    }
-
-    @Test
-    public void testLoanCharges_DISBURSEMENT_FEE_WITH_AMOUNT_CHANGE() {
-        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
-
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
-        final Integer loanProductID = createLoanProduct(false, NONE);
-
-        List<HashMap> charges = new ArrayList<>();
-        Integer amountPercentage = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanDisbursementJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT,
 "1"));
-        addCharges(charges, amountPercentage, "1", null);
-        Integer amountPlusInterestPercentage = 
ChargesHelper.createCharges(requestSpec, responseSpec,
-                
ChargesHelper.getLoanDisbursementJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT_AND_INTEREST,
 "1"));
-        addCharges(charges, amountPlusInterestPercentage, "1", null);
-        Integer interestPercentage = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanDisbursementJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_INTEREST,
 "1"));
-        addCharges(charges, interestPercentage, "1", null);
-
-        final Integer loanID = applyForLoanApplication(clientID, 
loanProductID, charges, null, "12,000.00");
-        Assert.assertNotNull(loanID);
-
-        HashMap loanStatusHashMap = 
LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
-        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
-
-        ArrayList<HashMap> loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        HashMap disbursementDetail = loanSchedule.get(0);
-
-        List<HashMap> loanCharges = 
this.loanTransactionHelper.getLoanCharges(loanID);
-
-        validateCharge(amountPercentage, loanCharges, "1.0", "120.0", "0.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "1.0", "6.06", "0.0", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "1.0", 
"126.06", "0.0", "0.0");
-        validateNumberForEqual("252.12", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-        System.out.println("-----------------------------------APPROVE 
LOAN-----------------------------------------");
-        loanStatusHashMap = this.loanTransactionHelper.approveLoan("20 
September 2011", loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        // DISBURSE
-        loanStatusHashMap = this.loanTransactionHelper.disburseLoan("20 
September 2011", loanID, "10000");
-        System.out.println("DISBURSE " + loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        disbursementDetail = loanSchedule.get(0);
-
-        validateCharge(amountPercentage, loanCharges, "1.0", "0.0", "100.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "1.0", "0.0", "5.05", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "1.0", 
"0.0", "105.05", "0.0");
-        validateNumberForEqual("210.1", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-    }
-
-    @Test
-    public void testLoanCharges_SPECIFIED_DUE_DATE_FEE() {
-        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
-
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
-        final Integer loanProductID = createLoanProduct(false, NONE);
-
-        List<HashMap> charges = new ArrayList<>();
-        Integer flat = ChargesHelper.createCharges(requestSpec, responseSpec,
-                
ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT,
 "100", false));
-        Integer flatAccTransfer = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanSpecifiedDueDateWithAccountTransferJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT,
 "100", false));
-
-        Integer amountPercentage = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT,
 "1", false));
-        addCharges(charges, amountPercentage, "1", "29 September 2011");
-        Integer amountPlusInterestPercentage = ChargesHelper
-                .createCharges(requestSpec, responseSpec, 
ChargesHelper.getLoanSpecifiedDueDateJSON(
-                        
ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT_AND_INTEREST, "1", 
false));
-        addCharges(charges, amountPlusInterestPercentage, "1", "29 September 
2011");
-        Integer interestPercentage = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_INTEREST,
 "1", false));
-        addCharges(charges, interestPercentage, "1", "29 September 2011");
-
-        final Integer loanID = applyForLoanApplication(clientID, 
loanProductID, charges, null, "12,000.00");
-        Assert.assertNotNull(loanID);
-
-        HashMap loanStatusHashMap = 
LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
-        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
-
-        ArrayList<HashMap> loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        HashMap firstInstallment = loanSchedule.get(1);
-
-        List<HashMap> loanCharges = 
this.loanTransactionHelper.getLoanCharges(loanID);
-
-        validateCharge(amountPercentage, loanCharges, "1.0", "120.0", "0.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "1.0", "6.06", "0.0", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "1.0", 
"126.06", "0.0", "0.0");
-
-        validateNumberForEqual("252.12", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        this.loanTransactionHelper.addChargesForLoan(loanID,
-                
LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(flat),
 "29 September 2011", "100"));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-
-        validateCharge(flat, loanCharges, "100.0", "100.0", "0.0", "0.0");
-        validateNumberForEqual("352.12", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(amountPercentage, loanCharges).get("id"),
-                LoanTransactionHelper.getUpdateChargesForLoanAsJSON("2"));
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(interestPercentage, loanCharges).get("id"),
-                LoanTransactionHelper.getUpdateChargesForLoanAsJSON("2"));
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(amountPlusInterestPercentage, loanCharges)
-                .get("id"), 
LoanTransactionHelper.getUpdateChargesForLoanAsJSON("2"));
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(flat, loanCharges).get("id"),
-                LoanTransactionHelper.getUpdateChargesForLoanAsJSON("150"));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-        validateCharge(amountPercentage, loanCharges, "2.0", "240.0", "0.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "2.0", "12.12", "0.0", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "2.0", 
"252.12", "0.0", "0.0");
-        validateCharge(flat, loanCharges, "150.0", "150.0", "0.0", "0.0");
-        validateNumberForEqual("654.24", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        final Integer savingsId = 
SavingsAccountHelper.openSavingsAccount(this.requestSpec, this.responseSpec, 
clientID,
-                MINIMUM_OPENING_BALANCE);
-        this.loanTransactionHelper.updateLoan(loanID,
-                updateLoanJson(clientID, loanProductID, 
copyChargesForUpdate(loanCharges, null, null), String.valueOf(savingsId)));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-        validateCharge(amountPercentage, loanCharges, "2.0", "200.0", "0.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "2.0", "10.1", "0.0", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "2.0", 
"210.1", "0.0", "0.0");
-        validateCharge(flat, loanCharges, "150.0", "150.0", "0.0", "0.0");
-        validateNumberForEqual("570.2", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        this.loanTransactionHelper.updateLoan(loanID,
-                updateLoanJson(clientID, loanProductID, 
copyChargesForUpdate(loanCharges, flat, "1"), null));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-        validateCharge(amountPercentage, loanCharges, "1.0", "100.0", "0.0", 
"0.0");
-        validateCharge(interestPercentage, loanCharges, "1.0", "5.05", "0.0", 
"0.0");
-        validateCharge(amountPlusInterestPercentage, loanCharges, "1.0", 
"105.05", "0.0", "0.0");
-        validateNumberForEqual("210.1", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        charges.clear();
-        addCharges(charges, flat, "100", "29 September 2011");
-        this.loanTransactionHelper.updateLoan(loanID, updateLoanJson(clientID, 
loanProductID, charges, null));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-        validateCharge(flat, loanCharges, "100.0", "100.0", "0.0", "0.0");
-        validateNumberForEqual("100.0", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        this.loanTransactionHelper.deleteChargesForLoan(loanID, (Integer) 
getloanCharge(flat, loanCharges).get("id"));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-        Assert.assertEquals(0, loanCharges.size());
-        validateNumberForEqual("0", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        System.out.println("-----------------------------------APPROVE 
LOAN-----------------------------------------");
-        loanStatusHashMap = this.loanTransactionHelper.approveLoan("20 
September 2011", loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        this.loanTransactionHelper.addChargesForLoan(loanID,
-                
LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(flatAccTransfer),
 "29 September 2011", "100"));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-        validateCharge(flatAccTransfer, loanCharges, "100.0", "100.0", "0.0", 
"0.0");
-        validateNumberForEqual("100.0", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        // DISBURSE
-        loanStatusHashMap = this.loanTransactionHelper.disburseLoan("20 
September 2011", loanID);
-        System.out.println("DISBURSE " + loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        this.loanTransactionHelper.addChargesForLoan(loanID,
-                
LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(amountPercentage),
 "29 September 2011", "1"));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-        validateCharge(amountPercentage, loanCharges, "1.0", "100.0", "0.0", 
"0.0");
-        validateCharge(flatAccTransfer, loanCharges, "100.0", "100.0", "0.0", 
"0.0");
-        validateNumberForEqual("200.0", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        this.loanTransactionHelper.waiveChargesForLoan(loanID, (Integer) 
getloanCharge(amountPercentage, loanCharges).get("id"), "");
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-        validateCharge(amountPercentage, loanCharges, "1.0", "0.0", "0.0", 
"100.0");
-        validateCharge(flatAccTransfer, loanCharges, "100.0", "100.0", "0.0", 
"0.0");
-        validateNumberForEqual("200.0", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-        validateNumberForEqual("100.0", 
String.valueOf(firstInstallment.get("feeChargesOutstanding")));
-        validateNumberForEqual("100.0", 
String.valueOf(firstInstallment.get("feeChargesWaived")));
-
-        this.loanTransactionHelper.payChargesForLoan(loanID, (Integer) 
getloanCharge(flatAccTransfer, loanCharges).get("id"),
-                
LoanTransactionHelper.getPayChargeJSON(SavingsAccountHelper.TRANSACTION_DATE, 
null));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        firstInstallment = loanSchedule.get(1);
-        validateCharge(amountPercentage, loanCharges, "1.0", "0.0", "0.0", 
"100.0");
-        validateCharge(flatAccTransfer, loanCharges, "100.0", "0.0", "100.0", 
"0.0");
-        validateNumberForEqual("200.0", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-        validateNumberForEqual("100.0", 
String.valueOf(firstInstallment.get("feeChargesWaived")));
-        validateNumberForEqual("100.0", 
String.valueOf(firstInstallment.get("feeChargesPaid")));
-        validateNumberForEqual("0.0", 
String.valueOf(firstInstallment.get("feeChargesOutstanding")));
-    }
-
-    @Test
-    public void testLoanCharges_INSTALMENT_FEE() {
-        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
-        final Integer loanProductID = createLoanProduct(false, NONE);
-
-        List<HashMap> charges = new ArrayList<>();
-        Integer flat = ChargesHelper.createCharges(requestSpec, responseSpec,
-                
ChargesHelper.getLoanInstallmentJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT,
 "50", false));
-        Integer flatAccTransfer = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanInstallmentWithAccountTransferJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT,
 "50", false));
-
-        Integer amountPercentage = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanInstallmentJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT,
 "1", false));
-        addCharges(charges, amountPercentage, "1", "29 September 2011");
-        Integer amountPlusInterestPercentage = 
ChargesHelper.createCharges(requestSpec, responseSpec,
-                
ChargesHelper.getLoanInstallmentJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT_AND_INTEREST,
 "1", false));
-        addCharges(charges, amountPlusInterestPercentage, "1", "29 September 
2011");
-        Integer interestPercentage = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanInstallmentJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_PERCENTAGE_INTEREST,
 "1", false));
-        addCharges(charges, interestPercentage, "1", "29 September 2011");
-
-        final Integer loanID = applyForLoanApplication(clientID, 
loanProductID, charges, null, "12,000.00");
-        Assert.assertNotNull(loanID);
-
-        HashMap loanStatusHashMap = 
LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
-        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
-
-        ArrayList<HashMap> loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        List<HashMap> loanCharges = 
this.loanTransactionHelper.getLoanCharges(loanID);
-
-        Float totalPerOfAmout = 0F;
-        Float totalPerOfAmoutPlusInt = 0F;
-        Float totalPerOfint = 0F;
-        for (HashMap installment : loanSchedule) {
-            Float principalDue = (Float) installment.get("principalDue");
-            Float interestDue = (Float) installment.get("interestDue");
-            Float principalFee = principalDue / 100;
-            Float interestFee = interestDue / 100;
-            Float totalInstallmentFee = (principalFee * 2) + (interestFee * 2);
-            
validateNumberForEqualExcludePrecission(String.valueOf(totalInstallmentFee), 
String.valueOf(installment.get("feeChargesDue")));
-            totalPerOfAmout = totalPerOfAmout + principalFee;
-            totalPerOfAmoutPlusInt = totalPerOfAmoutPlusInt + principalFee + 
interestFee;
-            totalPerOfint = totalPerOfint + interestFee;
-        }
-
-        validateChargeExcludePrecission(amountPercentage, loanCharges, "1.0", 
String.valueOf(totalPerOfAmout), "0.0", "0.0");
-        validateChargeExcludePrecission(interestPercentage, loanCharges, 
"1.0", String.valueOf(totalPerOfint), "0.0", "0.0");
-        validateChargeExcludePrecission(amountPlusInterestPercentage, 
loanCharges, "1.0", String.valueOf(totalPerOfAmoutPlusInt), "0.0",
-                "0.0");
-
-        this.loanTransactionHelper.addChargesForLoan(loanID,
-                
LoanTransactionHelper.getInstallmentChargesForLoanAsJSON(String.valueOf(flat), 
"50"));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        totalPerOfAmout = 0F;
-        totalPerOfAmoutPlusInt = 0F;
-        totalPerOfint = 0F;
-        for (HashMap installment : loanSchedule) {
-            Float principalDue = (Float) installment.get("principalDue");
-            Float interestDue = (Float) installment.get("interestDue");
-            Float principalFee = principalDue / 100;
-            Float interestFee = interestDue / 100;
-            Float totalInstallmentFee = (principalFee * 2) + (interestFee * 2) 
+ 50;
-            
validateNumberForEqualExcludePrecission(String.valueOf(totalInstallmentFee), 
String.valueOf(installment.get("feeChargesDue")));
-            totalPerOfAmout = totalPerOfAmout + principalFee;
-            totalPerOfAmoutPlusInt = totalPerOfAmoutPlusInt + principalFee + 
interestFee;
-            totalPerOfint = totalPerOfint + interestFee;
-        }
-
-        validateChargeExcludePrecission(amountPercentage, loanCharges, "1.0", 
String.valueOf(totalPerOfAmout), "0.0", "0.0");
-        validateChargeExcludePrecission(interestPercentage, loanCharges, 
"1.0", String.valueOf(totalPerOfint), "0.0", "0.0");
-        validateChargeExcludePrecission(amountPlusInterestPercentage, 
loanCharges, "1.0", String.valueOf(totalPerOfAmoutPlusInt), "0.0",
-                "0.0");
-        validateChargeExcludePrecission(flat, loanCharges, "50.0", "200", 
"0.0", "0.0");
-
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(amountPercentage, loanCharges).get("id"),
-                LoanTransactionHelper.getUpdateChargesForLoanAsJSON("2"));
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(interestPercentage, loanCharges).get("id"),
-                LoanTransactionHelper.getUpdateChargesForLoanAsJSON("2"));
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(amountPlusInterestPercentage, loanCharges)
-                .get("id"), 
LoanTransactionHelper.getUpdateChargesForLoanAsJSON("2"));
-        this.loanTransactionHelper.updateChargesForLoan(loanID, (Integer) 
getloanCharge(flat, loanCharges).get("id"),
-                LoanTransactionHelper.getUpdateChargesForLoanAsJSON("100"));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        totalPerOfAmout = 0F;
-        totalPerOfAmoutPlusInt = 0F;
-        totalPerOfint = 0F;
-        for (HashMap installment : loanSchedule) {
-            Float principalDue = (Float) installment.get("principalDue");
-            Float interestDue = (Float) installment.get("interestDue");
-            Float principalFee = principalDue * 2 / 100;
-            Float interestFee = interestDue * 2 / 100;
-            Float totalInstallmentFee = (principalFee * 2) + (interestFee * 2) 
+ 100;
-            
validateNumberForEqualExcludePrecission(String.valueOf(totalInstallmentFee), 
String.valueOf(installment.get("feeChargesDue")));
-            totalPerOfAmout = totalPerOfAmout + principalFee;
-            totalPerOfAmoutPlusInt = totalPerOfAmoutPlusInt + principalFee + 
interestFee;
-            totalPerOfint = totalPerOfint + interestFee;
-        }
-
-        validateChargeExcludePrecission(amountPercentage, loanCharges, "2.0", 
String.valueOf(totalPerOfAmout), "0.0", "0.0");
-        validateChargeExcludePrecission(interestPercentage, loanCharges, 
"2.0", String.valueOf(totalPerOfint), "0.0", "0.0");
-        validateChargeExcludePrecission(amountPlusInterestPercentage, 
loanCharges, "2.0", String.valueOf(totalPerOfAmoutPlusInt), "0.0",
-                "0.0");
-        validateChargeExcludePrecission(flat, loanCharges, "100.0", "400", 
"0.0", "0.0");
-
-        final Integer savingsId = 
SavingsAccountHelper.openSavingsAccount(this.requestSpec, this.responseSpec, 
clientID,
-                MINIMUM_OPENING_BALANCE);
-        this.loanTransactionHelper.updateLoan(loanID,
-                updateLoanJson(clientID, loanProductID, 
copyChargesForUpdate(loanCharges, null, null), String.valueOf(savingsId)));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        totalPerOfAmout = 0F;
-        totalPerOfAmoutPlusInt = 0F;
-        totalPerOfint = 0F;
-        for (HashMap installment : loanSchedule) {
-            Float principalDue = (Float) installment.get("principalDue");
-            Float interestDue = (Float) installment.get("interestDue");
-            Float principalFee = principalDue * 2 / 100;
-            Float interestFee = interestDue * 2 / 100;
-            Float totalInstallmentFee = (principalFee * 2) + (interestFee * 2) 
+ 100;
-            
validateNumberForEqualExcludePrecission(String.valueOf(totalInstallmentFee), 
String.valueOf(installment.get("feeChargesDue")));
-            totalPerOfAmout = totalPerOfAmout + principalFee;
-            totalPerOfAmoutPlusInt = totalPerOfAmoutPlusInt + principalFee + 
interestFee;
-            totalPerOfint = totalPerOfint + interestFee;
-        }
-
-        validateChargeExcludePrecission(amountPercentage, loanCharges, "2.0", 
String.valueOf(totalPerOfAmout), "0.0", "0.0");
-        validateChargeExcludePrecission(interestPercentage, loanCharges, 
"2.0", String.valueOf(totalPerOfint), "0.0", "0.0");
-        validateChargeExcludePrecission(amountPlusInterestPercentage, 
loanCharges, "2.0", String.valueOf(totalPerOfAmoutPlusInt), "0.0",
-                "0.0");
-        validateChargeExcludePrecission(flat, loanCharges, "100.0", "400", 
"0.0", "0.0");
-
-        this.loanTransactionHelper.updateLoan(loanID,
-                updateLoanJson(clientID, loanProductID, 
copyChargesForUpdate(loanCharges, flat, "1"), null));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        totalPerOfAmout = 0F;
-        totalPerOfAmoutPlusInt = 0F;
-        totalPerOfint = 0F;
-        for (HashMap installment : loanSchedule) {
-            Float principalDue = (Float) installment.get("principalDue");
-            Float interestDue = (Float) installment.get("interestDue");
-            Float principalFee = principalDue / 100;
-            Float interestFee = interestDue / 100;
-            Float totalInstallmentFee = (principalFee * 2) + (interestFee * 2);
-            
validateNumberForEqualExcludePrecission(String.valueOf(totalInstallmentFee), 
String.valueOf(installment.get("feeChargesDue")));
-            totalPerOfAmout = totalPerOfAmout + principalFee;
-            totalPerOfAmoutPlusInt = totalPerOfAmoutPlusInt + principalFee + 
interestFee;
-            totalPerOfint = totalPerOfint + interestFee;
-        }
-
-        validateChargeExcludePrecission(amountPercentage, loanCharges, "1.0", 
String.valueOf(totalPerOfAmout), "0.0", "0.0");
-        validateChargeExcludePrecission(interestPercentage, loanCharges, 
"1.0", String.valueOf(totalPerOfint), "0.0", "0.0");
-        validateChargeExcludePrecission(amountPlusInterestPercentage, 
loanCharges, "1.0", String.valueOf(totalPerOfAmoutPlusInt), "0.0",
-                "0.0");
-
-        charges.clear();
-        addCharges(charges, flat, "50", "29 September 2011");
-        this.loanTransactionHelper.updateLoan(loanID, updateLoanJson(clientID, 
loanProductID, charges, null));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        for (HashMap installment : loanSchedule) {
-            validateNumberForEqualExcludePrecission("50", 
String.valueOf(installment.get("feeChargesDue")));
-        }
-        validateChargeExcludePrecission(flat, loanCharges, "50.0", "200", 
"0.0", "0.0");
-
-        this.loanTransactionHelper.deleteChargesForLoan(loanID, (Integer) 
getloanCharge(flat, loanCharges).get("id"));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        for (HashMap installment : loanSchedule) {
-            validateNumberForEqualExcludePrecission("0", 
String.valueOf(installment.get("feeChargesDue")));
-        }
-
-        System.out.println("-----------------------------------APPROVE 
LOAN-----------------------------------------");
-        loanStatusHashMap = this.loanTransactionHelper.approveLoan("20 
September 2011", loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        this.loanTransactionHelper.addChargesForLoan(loanID,
-                
LoanTransactionHelper.getInstallmentChargesForLoanAsJSON(String.valueOf(flatAccTransfer),
 "100"));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        for (HashMap installment : loanSchedule) {
-            validateNumberForEqualExcludePrecission("100", 
String.valueOf(installment.get("feeChargesDue")));
-        }
-        validateChargeExcludePrecission(flatAccTransfer, loanCharges, "100.0", 
"400", "0.0", "0.0");
-
-        // DISBURSE
-        loanStatusHashMap = this.loanTransactionHelper.disburseLoan("20 
September 2011", loanID);
-        System.out.println("DISBURSE " + loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        this.loanTransactionHelper.addChargesForLoan(loanID,
-                
LoanTransactionHelper.getInstallmentChargesForLoanAsJSON(String.valueOf(flat), 
"50"));
-
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        for (HashMap installment : loanSchedule) {
-            validateNumberForEqualExcludePrecission("150", 
String.valueOf(installment.get("feeChargesDue")));
-        }
-        validateChargeExcludePrecission(flatAccTransfer, loanCharges, "100.0", 
"400", "0.0", "0.0");
-        validateChargeExcludePrecission(flat, loanCharges, "50.0", "200", 
"0.0", "0.0");
-
-        Integer waivePeriodnum = 1;
-        this.loanTransactionHelper.waiveChargesForLoan(loanID, (Integer) 
getloanCharge(flat, loanCharges).get("id"),
-                
LoanTransactionHelper.getWaiveChargeJSON(String.valueOf(waivePeriodnum)));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        for (HashMap installment : loanSchedule) {
-            validateNumberForEqualExcludePrecission("150", 
String.valueOf(installment.get("feeChargesDue")));
-            if (waivePeriodnum == installment.get("period")) {
-                validateNumberForEqualExcludePrecission("100.0", 
String.valueOf(installment.get("feeChargesOutstanding")));
-                validateNumberForEqualExcludePrecission("50.0", 
String.valueOf(installment.get("feeChargesWaived")));
-            } else {
-                validateNumberForEqualExcludePrecission("150.0", 
String.valueOf(installment.get("feeChargesOutstanding")));
-                validateNumberForEqualExcludePrecission("0.0", 
String.valueOf(installment.get("feeChargesWaived")));
-
-            }
-        }
-        validateChargeExcludePrecission(flatAccTransfer, loanCharges, "100.0", 
"400", "0.0", "0.0");
-        validateChargeExcludePrecission(flat, loanCharges, "50.0", "150", 
"0.0", "50.0");
-
-        Integer payPeriodnum = 2;
-        this.loanTransactionHelper.payChargesForLoan(loanID, (Integer) 
getloanCharge(flatAccTransfer, loanCharges).get("id"),
-                
LoanTransactionHelper.getPayChargeJSON(SavingsAccountHelper.TRANSACTION_DATE, 
String.valueOf(payPeriodnum)));
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        loanSchedule.remove(0);
-        for (HashMap installment : loanSchedule) {
-            validateNumberForEqualExcludePrecission("150", 
String.valueOf(installment.get("feeChargesDue")));
-            if (payPeriodnum == installment.get("period")) {
-                validateNumberForEqualExcludePrecission("50.0", 
String.valueOf(installment.get("feeChargesOutstanding")));
-                validateNumberForEqualExcludePrecission("100.0", 
String.valueOf(installment.get("feeChargesPaid")));
-            } else if (waivePeriodnum == installment.get("period")) {
-                validateNumberForEqualExcludePrecission("100.0", 
String.valueOf(installment.get("feeChargesOutstanding")));
-                validateNumberForEqualExcludePrecission("50.0", 
String.valueOf(installment.get("feeChargesWaived")));
-            } else {
-                validateNumberForEqualExcludePrecission("150.0", 
String.valueOf(installment.get("feeChargesOutstanding")));
-                validateNumberForEqualExcludePrecission("0.0", 
String.valueOf(installment.get("feeChargesPaid")));
-
-            }
-        }
-        validateChargeExcludePrecission(flatAccTransfer, loanCharges, "100.0", 
"300", "100.0", "0.0");
-        validateChargeExcludePrecission(flat, loanCharges, "50.0", "150", 
"0.0", "50.0");
-
-    }
-
-    @Test
-    public void testLoanCharges_DISBURSEMENT_TO_SAVINGS() {
-        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
-        SavingsAccountHelper savingsAccountHelper = new 
SavingsAccountHelper(this.requestSpec, this.responseSpec);
-
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
-        final Integer loanProductID = createLoanProduct(false, NONE);
-
-        final Integer savingsId = 
SavingsAccountHelper.openSavingsAccount(this.requestSpec, this.responseSpec, 
clientID,
-                MINIMUM_OPENING_BALANCE);
-
-        final Integer loanID = applyForLoanApplication(clientID, 
loanProductID, null, savingsId.toString(), "12,000.00");
-        Assert.assertNotNull(loanID);
-
-        HashMap loanStatusHashMap = 
LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
-        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
-
-        System.out.println("-----------------------------------APPROVE 
LOAN-----------------------------------------");
-        loanStatusHashMap = this.loanTransactionHelper.approveLoan("20 
September 2011", loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        HashMap summary = savingsAccountHelper.getSavingsSummary(savingsId);
-        Float balance = new Float(MINIMUM_OPENING_BALANCE);
-        assertEquals("Verifying opening Balance", balance, 
summary.get("accountBalance"));
-
-        // DISBURSE
-        loanStatusHashMap = 
this.loanTransactionHelper.disburseLoanToSavings(SavingsAccountHelper.TRANSACTION_DATE,
 loanID);
-        System.out.println("DISBURSE " + loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        summary = savingsAccountHelper.getSavingsSummary(savingsId);
-        balance = new Float(MINIMUM_OPENING_BALANCE) + new Float("12000");
-        assertEquals("Verifying opening Balance", balance, 
summary.get("accountBalance"));
-
-        loanStatusHashMap = this.loanTransactionHelper.undoDisbursal(loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        summary = savingsAccountHelper.getSavingsSummary(savingsId);
-        balance = new Float(MINIMUM_OPENING_BALANCE);
-        assertEquals("Verifying opening Balance", balance, 
summary.get("accountBalance"));
-
-    }
-
-    @Test
-    public void testLoanCharges_DISBURSEMENT_WITH_TRANCHES() {
-        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
-        final Integer loanProductID = createLoanProduct(true, NONE);
-
-        List<HashMap> tranches = new ArrayList<>();
-        tranches.add(createTrancheDetail("1 March 2014", "25000"));
-        tranches.add(createTrancheDetail("23 April 2014", "20000"));
-
-        final Integer loanID = applyForLoanApplicationWithTranches(clientID, 
loanProductID, null, null, "45,000.00", tranches);
-        Assert.assertNotNull(loanID);
-
-        HashMap loanStatusHashMap = 
LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
-        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
-
-        System.out.println("-----------------------------------APPROVE 
LOAN-----------------------------------------");
-        loanStatusHashMap = this.loanTransactionHelper.approveLoan("1 March 
2014", loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        // DISBURSE first Tranche
-        loanStatusHashMap = this.loanTransactionHelper.disburseLoan("1 March 
2014", loanID);
-        System.out.println("DISBURSE " + loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        // DISBURSE Second Tranche
-        loanStatusHashMap = this.loanTransactionHelper.disburseLoan("23 April 
2014", loanID);
-        System.out.println("DISBURSE " + loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        loanStatusHashMap = this.loanTransactionHelper.undoDisbursal(loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-    }
-
-    @Test
-    public void testLoanCharges_DISBURSEMENT_TO_SAVINGS_WITH_TRANCHES() {
-        this.loanTransactionHelper = new 
LoanTransactionHelper(this.requestSpec, this.responseSpec);
-        SavingsAccountHelper savingsAccountHelper = new 
SavingsAccountHelper(this.requestSpec, this.responseSpec);
-
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
-        final Integer loanProductID = createLoanProduct(true, NONE);
-
-        final Integer savingsId = 
SavingsAccountHelper.openSavingsAccount(this.requestSpec, this.responseSpec, 
clientID,
-                MINIMUM_OPENING_BALANCE);
-
-        List<HashMap> tranches = new ArrayList<>();
-        tranches.add(createTrancheDetail("1 March 2014", "25000"));
-        tranches.add(createTrancheDetail("23 April 2014", "20000"));
-
-        final Integer loanID = applyForLoanApplicationWithTranches(clientID, 
loanProductID, null, savingsId.toString(), "45,000.00",
-                tranches);
-        Assert.assertNotNull(loanID);
-
-        HashMap loanStatusHashMap = 
LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
-        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
-
-        System.out.println("-----------------------------------APPROVE 
LOAN-----------------------------------------");
-        loanStatusHashMap = this.loanTransactionHelper.approveLoan("1 March 
2014", loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        HashMap summary = savingsAccountHelper.getSavingsSummary(savingsId);
-        Float balance = new Float(MINIMUM_OPENING_BALANCE);
-        assertEquals("Verifying opening Balance", balance, 
summary.get("accountBalance"));
-
-        // DISBURSE first Tranche
-        loanStatusHashMap = 
this.loanTransactionHelper.disburseLoanToSavings("1 March 2014", loanID);
-        System.out.println("DISBURSE " + loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        summary = savingsAccountHelper.getSavingsSummary(savingsId);
-        balance = new Float(MINIMUM_OPENING_BALANCE) + new Float("25000");
-        assertEquals("Verifying opening Balance", balance, 
summary.get("accountBalance"));
-
-        // DISBURSE Second Tranche
-        loanStatusHashMap = 
this.loanTransactionHelper.disburseLoanToSavings("23 April 2014", loanID);
-        System.out.println("DISBURSE " + loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        summary = savingsAccountHelper.getSavingsSummary(savingsId);
-        balance = new Float(MINIMUM_OPENING_BALANCE) + new Float("25000") + 
new Float("20000");
-        assertEquals("Verifying opening Balance", balance, 
summary.get("accountBalance"));
-
-        loanStatusHashMap = this.loanTransactionHelper.undoDisbursal(loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        summary = savingsAccountHelper.getSavingsSummary(savingsId);
-        balance = new Float(MINIMUM_OPENING_BALANCE);
-        assertEquals("Verifying opening Balance", balance, 
summary.get("accountBalance"));
-
-    }
-
-    private void validateCharge(Integer amountPercentage, final List<HashMap> 
loanCharges, final String amount, final String outstanding,
-            String amountPaid, String amountWaived) {
-        HashMap chargeDetail = getloanCharge(amountPercentage, loanCharges);
-        Assert.assertTrue(new Float(amount).compareTo(new 
Float(String.valueOf(chargeDetail.get("amountOrPercentage")))) == 0);
-        Assert.assertTrue(new Float(outstanding).compareTo(new 
Float(String.valueOf(chargeDetail.get("amountOutstanding")))) == 0);
-        Assert.assertTrue(new Float(amountPaid).compareTo(new 
Float(String.valueOf(chargeDetail.get("amountPaid")))) == 0);
-        Assert.assertTrue(new Float(amountWaived).compareTo(new 
Float(String.valueOf(chargeDetail.get("amountWaived")))) == 0);
-    }
-
-    private void validateChargeExcludePrecission(Integer amountPercentage, 
final List<HashMap> loanCharges, final String amount,
-            final String outstanding, String amountPaid, String amountWaived) {
-        DecimalFormat twoDForm = new DecimalFormat("#");
-        HashMap chargeDetail = getloanCharge(amountPercentage, loanCharges);
-        Assert.assertTrue(new Float(twoDForm.format(new 
Float(amount))).compareTo(new Float(twoDForm.format(new Float(String
-                .valueOf(chargeDetail.get("amountOrPercentage")))))) == 0);
-        Assert.assertTrue(new Float(twoDForm.format(new 
Float(outstanding))).compareTo(new Float(twoDForm.format(new Float(String
-                .valueOf(chargeDetail.get("amountOutstanding")))))) == 0);
-        Assert.assertTrue(new Float(twoDForm.format(new 
Float(amountPaid))).compareTo(new Float(twoDForm.format(new Float(String
-                .valueOf(chargeDetail.get("amountPaid")))))) == 0);
-        Assert.assertTrue(new Float(twoDForm.format(new 
Float(amountWaived))).compareTo(new Float(twoDForm.format(new Float(String
-                .valueOf(chargeDetail.get("amountWaived")))))) == 0);
-    }
-
-    public void validateNumberForEqual(String val, String val2) {
-        Assert.assertTrue(new Float(val).compareTo(new Float(val2)) == 0);
-    }
-
-    public void validateNumberForEqualWithMsg(String msg, String val, String 
val2) {
-        Assert.assertTrue(msg + "expected " + val + " but was " + val2, new 
Float(val).compareTo(new Float(val2)) == 0);
-    }
-
-    public void validateNumberForEqualExcludePrecission(String val, String 
val2) {
-        DecimalFormat twoDForm = new DecimalFormat("#");
-        Assert.assertTrue(new Float(twoDForm.format(new 
Float(val))).compareTo(new Float(twoDForm.format(new Float(val2)))) == 0);
-    }
-
-    private Integer createLoanProduct(final boolean multiDisburseLoan, final 
String accountingRule, final Account... accounts) {
-        System.out.println("------------------------------CREATING NEW LOAN 
PRODUCT ---------------------------------------");
-        LoanProductTestBuilder builder = new LoanProductTestBuilder() //
-                .withPrincipal("12,000.00") //
-                .withNumberOfRepayments("4") //
-                .withRepaymentAfterEvery("1") //
-                .withRepaymentTypeAsMonth() //
-                .withinterestRatePerPeriod("1") //
-                .withInterestRateFrequencyTypeAsMonths() //
-                .withAmortizationTypeAsEqualInstallments() //
-                .withInterestTypeAsDecliningBalance() //
-                .withTranches(multiDisburseLoan) //
-                .withAccounting(accountingRule, accounts);
-        if (multiDisburseLoan) {
-            builder = 
builder.withInterestCalculationPeriodTypeAsRepaymentPeriod(true);
-        }
-        final String loanProductJSON = builder.build(null);
-        return this.loanTransactionHelper.getLoanProductId(loanProductJSON);
-    }
-
-    private Integer createLoanProduct(final String inMultiplesOf, final String 
digitsAfterDecimal, final String repaymentStrategy) {
-        System.out.println("------------------------------CREATING NEW LOAN 
PRODUCT ---------------------------------------");
-        final String loanProductJSON = new LoanProductTestBuilder() //
-                .withPrincipal("10000000.00") //
-                .withNumberOfRepayments("24") //
-                .withRepaymentAfterEvery("1") //
-                .withRepaymentTypeAsMonth() //
-                .withinterestRatePerPeriod("2") //
-                .withInterestRateFrequencyTypeAsMonths() //
-                .withRepaymentStrategy(repaymentStrategy) //
-                .withAmortizationTypeAsEqualPrincipalPayment() //
-                .withInterestTypeAsDecliningBalance() //
-                .currencyDetails(digitsAfterDecimal, 
inMultiplesOf).build(null);
-        return this.loanTransactionHelper.getLoanProductId(loanProductJSON);
-    }
-
-    private Integer createLoanProduct(final String inMultiplesOf, final String 
digitsAfterDecimal, final String repaymentStrategy,
-            final String accountingRule, final Account... accounts) {
-        System.out.println("------------------------------CREATING NEW LOAN 
PRODUCT ---------------------------------------");
-        final String loanProductJSON = new LoanProductTestBuilder() //
-                .withPrincipal("10000000.00") //
-                .withNumberOfRepayments("24") //
-                .withRepaymentAfterEvery("1") //
-                .withRepaymentTypeAsMonth() //
-                .withinterestRatePerPeriod("2") //
-                .withInterestRateFrequencyTypeAsMonths() //
-                .withRepaymentStrategy(repaymentStrategy) //
-                .withAmortizationTypeAsEqualPrincipalPayment() //
-                .withInterestTypeAsDecliningBalance() //
-                .currencyDetails(digitsAfterDecimal, 
inMultiplesOf).withAccounting(accountingRule, accounts).build(null);
-        return this.loanTransactionHelper.getLoanProductId(loanProductJSON);
-    }
-
-    private Integer applyForLoanApplication(final Integer clientID, final 
Integer loanProductID, String graceOnPrincipalPayment) {
-        System.out.println("--------------------------------APPLYING FOR LOAN 
APPLICATION--------------------------------");
-        final String loanApplicationJSON = new LoanApplicationTestBuilder() //
-                .withPrincipal("10000000.00") //
-                .withLoanTermFrequency("24") //
-                .withLoanTermFrequencyAsMonths() //
-                .withNumberOfRepayments("24") //
-                .withRepaymentEveryAfter("1") //
-                .withRepaymentFrequencyTypeAsMonths() //
-                .withInterestRatePerPeriod("2") //
-                .withAmortizationTypeAsEqualPrincipalPayments() //
-                .withInterestTypeAsDecliningBalance() //
-                .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() //
-                
.withPrincipalGrace(graceOnPrincipalPayment).withExpectedDisbursementDate("2 
June 2014") //
-                .withSubmittedOnDate("2 June 2014") //
-                .build(clientID.toString(), loanProductID.toString(), null);
-        return this.loanTransactionHelper.getLoanId(loanApplicationJSON);
-    }
-
-    private Integer applyForLoanApplication(final Integer clientID, final 
Integer loanProductID, List<HashMap> charges,
-            final String savingsId, String principal) {
-        System.out.println("--------------------------------APPLYING FOR LOAN 
APPLICATION--------------------------------");
-        final String loanApplicationJSON = new LoanApplicationTestBuilder() //
-                .withPrincipal(principal) //
-                .withLoanTermFrequency("4") //
-                .withLoanTermFrequencyAsMonths() //
-                .withNumberOfRepayments("4") //
-                .withRepaymentEveryAfter("1") //
-                .withRepaymentFrequencyTypeAsMonths() //
-                .withInterestRatePerPeriod("2") //
-                .withAmortizationTypeAsEqualInstallments() //
-                .withInterestTypeAsDecliningBalance() //
-                .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() //
-                .withExpectedDisbursementDate("20 September 2011") //
-                .withSubmittedOnDate("20 September 2011") //
-                .withCharges(charges).build(clientID.toString(), 
loanProductID.toString(), savingsId);
-        return this.loanTransactionHelper.getLoanId(loanApplicationJSON);
-    }
-
-    private Integer applyForLoanApplicationWithTranches(final Integer 
clientID, final Integer loanProductID, List<HashMap> charges,
-            final String savingsId, String principal, List<HashMap> tranches) {
-        System.out.println("--------------------------------APPLYING FOR LOAN 
APPLICATION--------------------------------");
-        final String loanApplicationJSON = new LoanApplicationTestBuilder() //
-                .withPrincipal(principal) //
-                .withLoanTermFrequency("4") //
-                .withLoanTermFrequencyAsMonths() //
-                .withNumberOfRepayments("4") //
-                .withRepaymentEveryAfter("1") //
-                .withRepaymentFrequencyTypeAsMonths() //
-                .withInterestRatePerPeriod("2") //
-                .withAmortizationTypeAsEqualInstallments() //
-                .withInterestTypeAsDecliningBalance() //
-                .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() //
-                .withExpectedDisbursementDate("1 March 2014") //
-                .withTranches(tranches) //
-                .withSubmittedOnDate("1 March 2014") //
-
-                .withCharges(charges).build(clientID.toString(), 
loanProductID.toString(), savingsId);
-        return this.loanTransactionHelper.getLoanId(loanApplicationJSON);
-    }
-
-    private String updateLoanJson(final Integer clientID, final Integer 
loanProductID, List<HashMap> charges, String savingsId) {
-        System.out.println("--------------------------------APPLYING FOR LOAN 
APPLICATION--------------------------------");
-        final String loanApplicationJSON = new LoanApplicationTestBuilder() //
-                .withPrincipal("10,000.00") //
-                .withLoanTermFrequency("4") //
-                .withLoanTermFrequencyAsMonths() //
-                .withNumberOfRepayments("4") //
-                .withRepaymentEveryAfter("1") //
-                .withRepaymentFrequencyTypeAsMonths() //
-                .withInterestRatePerPeriod("2") //
-                .withAmortizationTypeAsEqualInstallments() //
-                .withInterestTypeAsDecliningBalance() //
-                .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() //
-                .withExpectedDisbursementDate("20 September 2011") //
-                .withSubmittedOnDate("20 September 2011") //
-                .withCharges(charges).build(clientID.toString(), 
loanProductID.toString(), savingsId);
-        return loanApplicationJSON;
-    }
-
-    private Integer applyForLoanApplicationWithPaymentStrategy(final Integer 
clientID, final Integer loanProductID, List<HashMap> charges,
-            final String savingsId, String principal, final String 
repaymentStrategy) {
-        System.out.println("--------------------------------APPLYING FOR LOAN 
APPLICATION--------------------------------");
-        final String loanApplicationJSON = new LoanApplicationTestBuilder() //
-                .withPrincipal(principal) //
-                .withLoanTermFrequency("4") //
-                .withLoanTermFrequencyAsMonths() //
-                .withNumberOfRepayments("4") //
-                .withRepaymentEveryAfter("1") //
-                .withRepaymentFrequencyTypeAsMonths() //
-                .withInterestRatePerPeriod("2") //
-                .withAmortizationTypeAsEqualInstallments() //
-                .withInterestTypeAsDecliningBalance() //
-                .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() //
-                .withExpectedDisbursementDate("20 September 2011") //
-                .withSubmittedOnDate("20 September 2011") //
-                .withwithRepaymentStrategy(repaymentStrategy) //
-                .withCharges(charges).build(clientID.toString(), 
loanProductID.toString(), savingsId);
-        return this.loanTransactionHelper.getLoanId(loanApplicationJSON);
-    }
-
-    private Integer 
applyForLoanApplicationWithPaymentStrategyAndPastMonth(final Integer clientID, 
final Integer loanProductID,
-            List<HashMap> charges, final String savingsId, String principal, 
final String repaymentStrategy, final int month) {
-        System.out.println("--------------------------------APPLYING FOR LOAN 
APPLICATION--------------------------------");
-
-        Calendar fourMonthsfromNowCalendar = 
Calendar.getInstance(Utils.getTimeZoneOfTenant());
-        fourMonthsfromNowCalendar.add(Calendar.MONTH, month);
-        DateFormat dateFormat = new SimpleDateFormat("dd MMMMMM yyyy");
-        dateFormat.setTimeZone(Utils.getTimeZoneOfTenant());
-        String fourMonthsfromNow = 
dateFormat.format(fourMonthsfromNowCalendar.getTime());
-        final String loanApplicationJSON = new LoanApplicationTestBuilder() //
-                .withPrincipal(principal) //
-                .withLoanTermFrequency("6") //
-                .withLoanTermFrequencyAsMonths() //
-                .withNumberOfRepayments("6") //
-                .withRepaymentEveryAfter("1") //
-                .withRepaymentFrequencyTypeAsMonths() //
-                .withInterestRatePerPeriod("2") //
-                .withAmortizationTypeAsEqualInstallments() //
-                .withInterestTypeAsFlatBalance() //
-                .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() //
-                .withExpectedDisbursementDate(fourMonthsfromNow) //
-                .withSubmittedOnDate(fourMonthsfromNow) //
-                .withwithRepaymentStrategy(repaymentStrategy) //
-                .withCharges(charges).build(clientID.toString(), 
loanProductID.toString(), savingsId);
-        return this.loanTransactionHelper.getLoanId(loanApplicationJSON);
-    }
-
-    private void verifyLoanRepaymentSchedule(final ArrayList<HashMap> 
loanSchedule) {
-        System.out.println("--------------------VERIFYING THE PRINCIPAL 
DUES,INTEREST DUE AND DUE DATE--------------------------");
-
-        assertEquals("Checking for Due Date for 1st Month", new 
ArrayList<>(Arrays.asList(2011, 10, 20)), loanSchedule.get(1)
-                .get("dueDate"));
-        assertEquals("Checking for Principal Due for 1st Month", new 
Float("2911.49"), loanSchedule.get(1).get("principalOriginalDue"));
-        assertEquals("Checking for Interest Due for 1st Month", new 
Float("240.00"), loanSchedule.get(1).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 2nd Month", new 
ArrayList<>(Arrays.asList(2011, 11, 20)), loanSchedule.get(2)
-                .get("dueDate"));
-        assertEquals("Checking for Principal Due for 2nd Month", new 
Float("2969.72"), loanSchedule.get(2).get("principalDue"));
-        assertEquals("Checking for Interest Due for 2nd Month", new 
Float("181.77"), loanSchedule.get(2).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 3rd Month", new 
ArrayList<>(Arrays.asList(2011, 12, 20)), loanSchedule.get(3)
-                .get("dueDate"));
-        assertEquals("Checking for Principal Due for 3rd Month", new 
Float("3029.11"), loanSchedule.get(3).get("principalDue"));
-        assertEquals("Checking for Interest Due for 3rd Month", new 
Float("122.38"), loanSchedule.get(3).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 4th Month", new 
ArrayList<>(Arrays.asList(2012, 1, 20)), loanSchedule.get(4).get("dueDate"));
-        assertEquals("Checking for Principal Due for 4th Month", new 
Float("3089.68"), loanSchedule.get(4).get("principalDue"));
-        assertEquals("Checking for Interest Due for 4th Month", new 
Float("61.79"), loanSchedule.get(4).get("interestOriginalDue"));
-    }
-
-    private void verifyLoanRepaymentScheduleForEqualPrincipal(final 
ArrayList<HashMap> loanSchedule) {
-        System.out.println("--------------------VERIFYING THE PRINCIPAL 
DUES,INTEREST DUE AND DUE DATE--------------------------");
-
-        assertEquals("Checking for Due Date for 1st Month", new 
ArrayList<>(Arrays.asList(2014, 7, 2)), loanSchedule.get(1).get("dueDate"));
-        assertEquals("Checking for Principal Due for 1st Month", new 
Float("416700"), loanSchedule.get(1).get("principalOriginalDue"));
-        assertEquals("Checking for Interest Due for 1st Month", new 
Float("200000"), loanSchedule.get(1).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 2nd Month", new 
ArrayList<>(Arrays.asList(2014, 8, 2)), loanSchedule.get(2).get("dueDate"));
-        assertEquals("Checking for Principal Due for 2nd Month", new 
Float("416700"), loanSchedule.get(2).get("principalDue"));
-        assertEquals("Checking for Interest Due for 2nd Month", new 
Float("191700"), loanSchedule.get(2).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 3rd Month", new 
ArrayList<>(Arrays.asList(2014, 9, 2)), loanSchedule.get(3).get("dueDate"));
-        assertEquals("Checking for Principal Due for 3rd Month", new 
Float("416700"), loanSchedule.get(3).get("principalDue"));
-        assertEquals("Checking for Interest Due for 3rd Month", new 
Float("183300"), loanSchedule.get(3).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 4th Month", new 
ArrayList<>(Arrays.asList(2014, 10, 2)), loanSchedule.get(4).get("dueDate"));
-        assertEquals("Checking for Principal Due for 4th Month", new 
Float("416700"), loanSchedule.get(4).get("principalDue"));
-        assertEquals("Checking for Interest Due for 4th Month", new 
Float("175000"), loanSchedule.get(4).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 5th Month", new 
ArrayList<>(Arrays.asList(2014, 11, 2)), loanSchedule.get(5).get("dueDate"));
-        assertEquals("Checking for Principal Due for 5th Month", new 
Float("416700"), loanSchedule.get(5).get("principalDue"));
-        assertEquals("Checking for Interest Due for 5th Month", new 
Float("166700"), loanSchedule.get(5).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 6th Month", new 
ArrayList<>(Arrays.asList(2014, 12, 2)), loanSchedule.get(6).get("dueDate"));
-        assertEquals("Checking for Principal Due for 6th Month", new 
Float("416700"), loanSchedule.get(6).get("principalDue"));
-        assertEquals("Checking for Interest Due for 6th Month", new 
Float("158300"), loanSchedule.get(6).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 10th Month", new 
ArrayList<>(Arrays.asList(2015, 4, 2)), loanSchedule.get(10)
-                .get("dueDate"));
-        assertEquals("Checking for Principal Due for 10th Month", new 
Float("416700"), loanSchedule.get(10).get("principalDue"));
-        assertEquals("Checking for Interest Due for 10th Month", new 
Float("125000"), loanSchedule.get(10).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 20th Month", new 
ArrayList<>(Arrays.asList(2016, 2, 2)), loanSchedule.get(20)
-                .get("dueDate"));
-        assertEquals("Checking for Principal Due for 20th Month", new 
Float("416700"), loanSchedule.get(20).get("principalDue"));
-        assertEquals("Checking for Interest Due for 20th Month", new 
Float("41700"), loanSchedule.get(20).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 24th Month", new 
ArrayList<>(Arrays.asList(2016, 6, 2)), loanSchedule.get(24)
-                .get("dueDate"));
-        assertEquals("Checking for Principal Due for 24th Month", new 
Float("415900"), loanSchedule.get(24).get("principalDue"));
-        assertEquals("Checking for Interest Due for 24th Month", new 
Float("8300"), loanSchedule.get(24).get("interestOriginalDue"));
-
-    }
-
-    private void verifyLoanRepaymentScheduleForEqualPrincipalWithGrace(final 
ArrayList<HashMap> loanSchedule) {
-        System.out.println("--------------------VERIFYING THE PRINCIPAL 
DUES,INTEREST DUE AND DUE DATE--------------------------");
-
-        assertEquals("Checking for Due Date for 1st Month", new 
ArrayList<>(Arrays.asList(2014, 7, 2)), loanSchedule.get(1).get("dueDate"));
-        validateNumberForEqualWithMsg("Checking for Principal Due for 1st 
Month", "0.0",
-                
String.valueOf(loanSchedule.get(1).get("principalOriginalDue")));
-        assertEquals("Checking for Interest Due for 1st Month", new 
Float("200000"), loanSchedule.get(1).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 2nd Month", new 
ArrayList<>(Arrays.asList(2014, 8, 2)), loanSchedule.get(2).get("dueDate"));
-        validateNumberForEqualWithMsg("Checking for Principal Due for 2nd 
Month", "0.0",
-                
String.valueOf(loanSchedule.get(2).get("principalOriginalDue")));
-        assertEquals("Checking for Interest Due for 2nd Month", new 
Float("200000"), loanSchedule.get(2).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 3rd Month", new 
ArrayList<>(Arrays.asList(2014, 9, 2)), loanSchedule.get(3).get("dueDate"));
-        validateNumberForEqualWithMsg("Checking for Principal Due for 3rd 
Month", "0.0",
-                String.valueOf(loanSchedule.get(3).get("principalDue")));
-        assertEquals("Checking for Interest Due for 3rd Month", new 
Float("200000"), loanSchedule.get(3).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 4th Month", new 
ArrayList<>(Arrays.asList(2014, 10, 2)), loanSchedule.get(4).get("dueDate"));
-        validateNumberForEqualWithMsg("Checking for Principal Due for 4th 
Month", "0",
-                String.valueOf(loanSchedule.get(4).get("principalDue")));
-        assertEquals("Checking for Interest Due for 4th Month", new 
Float("200000"), loanSchedule.get(4).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 5th Month", new 
ArrayList<>(Arrays.asList(2014, 11, 2)), loanSchedule.get(5).get("dueDate"));
-        validateNumberForEqualWithMsg("Checking for Principal Due for 5th 
Month", "0",
-                String.valueOf(loanSchedule.get(5).get("principalDue")));
-        assertEquals("Checking for Interest Due for 5th Month", new 
Float("200000"), loanSchedule.get(5).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 6th Month", new 
ArrayList<>(Arrays.asList(2014, 12, 2)), loanSchedule.get(6).get("dueDate"));
-        assertEquals("Checking for Principal Due for 6th Month", new 
Float("526300"), loanSchedule.get(6).get("principalDue"));
-        assertEquals("Checking for Interest Due for 6th Month", new 
Float("200000"), loanSchedule.get(6).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 7th Month", new 
ArrayList<>(Arrays.asList(2015, 1, 2)), loanSchedule.get(7).get("dueDate"));
-        assertEquals("Checking for Principal Due for 7th Month", new 
Float("526300"), loanSchedule.get(7).get("principalDue"));
-        assertEquals("Checking for Interest Due for 7th Month", new 
Float("189500"), loanSchedule.get(7).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 10th Month", new 
ArrayList<>(Arrays.asList(2015, 4, 2)), loanSchedule.get(10)
-                .get("dueDate"));
-        assertEquals("Checking for Principal Due for 10th Month", new 
Float("526300"), loanSchedule.get(10).get("principalDue"));
-        assertEquals("Checking for Interest Due for 10th Month", new 
Float("157900"), loanSchedule.get(10).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 20th Month", new 
ArrayList<>(Arrays.asList(2016, 2, 2)), loanSchedule.get(20)
-                .get("dueDate"));
-        assertEquals("Checking for Principal Due for 20th Month", new 
Float("526300"), loanSchedule.get(20).get("principalDue"));
-        assertEquals("Checking for Interest Due for 20th Month", new 
Float("52600"), loanSchedule.get(20).get("interestOriginalDue"));
-
-        assertEquals("Checking for Due Date for 24th Month", new 
ArrayList<>(Arrays.asList(2016, 6, 2)), loanSchedule.get(24)
-                .get("dueDate"));
-        assertEquals("Checking for Principal Due for 24th Month", new 
Float("526600"), loanSchedule.get(24).get("principalDue"));
-        assertEquals("Checking for Interest Due for 24th Month", new 
Float("10500"), loanSchedule.get(24).get("interestOriginalDue"));
-
-    }
-
-    private void addCharges(List<HashMap> charges, Integer chargeId, String 
amount, String duedate) {
-        charges.add(charges(chargeId, amount, duedate));
-    }
-
-    private HashMap charges(Integer chargeId, String amount, String duedate) {
-        HashMap charge = new HashMap(2);
-        charge.put("chargeId", chargeId.toString());
-        charge.put("amount", amount);
-        if (duedate != null) {
-            charge.put("dueDate", duedate);
-        }
-        return charge;
-    }
-
-    private HashMap getloanCharge(Integer chargeId, List<HashMap> charges) {
-        HashMap charge = null;
-        for (HashMap loancharge : charges) {
-            if (loancharge.get("chargeId").equals(chargeId)) {
-                charge = loancharge;
-            }
-        }
-        return charge;
-    }
-
-    private List<HashMap> copyChargesForUpdate(List<HashMap> charges, Integer 
deleteWithChargeId, String amount) {
-        List<HashMap> loanCharges = new ArrayList<>();
-        for (HashMap charge : charges) {
-            if (!charge.get("chargeId").equals(deleteWithChargeId)) {
-                loanCharges.add(copyForUpdate(charge, amount));
-            }
-        }
-        return loanCharges;
-    }
-
-    private HashMap copyForUpdate(HashMap charge, String amount) {
-        HashMap map = new HashMap();
-        map.put("id", charge.get("id"));
-        if (amount == null) {
-            map.put("amount", charge.get("amountOrPercentage"));
-        } else {
-            map.put("amount", amount);
-        }
-        if (charge.get("dueDate") != null) {
-            map.put("dueDate", charge.get("dueDate"));
-        }
-        map.put("chargeId", charge.get("chargeId"));
-        return map;
-    }
-
-    private HashMap createTrancheDetail(final String date, final String 
amount) {
-        HashMap detail = new HashMap();
-        detail.put("expectedDisbursementDate", date);
-        detail.put("principal", amount);
-
-        return detail;
-    }
-
-    /***
-     * Test case for checking CashBasedAccounting functionality adding charges
-     * with calculation type flat
-     */
-    @Test
-    public void loanWithFlatCahargesAndCashBasedAccountingEnabled() {
-        this.journalEntryHelper = new JournalEntryHelper(this.requestSpec, 
this.responseSpec);
-
-        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec);
-        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, 
this.responseSpec, clientID);
-
-        // Add charges with payment mode regular
-        List<HashMap> charges = new ArrayList<>();
-        Integer flatDisbursement = ChargesHelper.createCharges(requestSpec, 
responseSpec, ChargesHelper.getLoanDisbursementJSON());
-        addCharges(charges, flatDisbursement, "100", null);
-        Integer flatSpecifiedDueDate = 
ChargesHelper.createCharges(requestSpec, responseSpec,
-                
ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT,
 "100", false));
-        addCharges(charges, flatSpecifiedDueDate, "100", "29 September 2011");
-        Integer flatInstallmentFee = ChargesHelper.createCharges(requestSpec, 
responseSpec,
-                
ChargesHelper.getLoanInstallmentJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT,
 "50", false));
-        addCharges(charges, flatInstallmentFee, "50", null);
-
-        final Account assetAccount = this.accountHelper.createAssetAccount();
-        final Account incomeAccount = this.accountHelper.createIncomeAccount();
-        final Account expenseAccount = 
this.accountHelper.createExpenseAccount();
-        final Account overpaymentAccount = 
this.accountHelper.createLiabilityAccount();
-
-        final Integer loanProductID = createLoanProduct(false, CASH_BASED, 
assetAccount, incomeAccount, expenseAccount, overpaymentAccount);
-        final Integer loanID = applyForLoanApplication(clientID, 
loanProductID, charges, null, "12,000.00");
-        Assert.assertNotNull(loanID);
-        HashMap loanStatusHashMap = 
LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
-        LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
-
-        ArrayList<HashMap> loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-        verifyLoanRepaymentSchedule(loanSchedule);
-
-        List<HashMap> loanCharges = 
this.loanTransactionHelper.getLoanCharges(loanID);
-        validateCharge(flatDisbursement, loanCharges, "100", "100.00", "0.0", 
"0.0");
-        validateCharge(flatSpecifiedDueDate, loanCharges, "100", "100.00", 
"0.0", "0.0");
-        validateCharge(flatInstallmentFee, loanCharges, "50", "200.00", "0.0", 
"0.0");
-
-        // check for disbursement fee
-        HashMap disbursementDetail = loanSchedule.get(0);
-        validateNumberForEqual("100.00", 
String.valueOf(disbursementDetail.get("feeChargesDue")));
-
-        // check for charge at specified date and installment fee
-        HashMap firstInstallment = loanSchedule.get(1);
-        validateNumberForEqual("150.00", 
String.valueOf(firstInstallment.get("feeChargesDue")));
-
-        // check for installment fee
-        HashMap secondInstallment = loanSchedule.get(2);
-        validateNumberForEqual("50.00", 
String.valueOf(secondInstallment.get("feeChargesDue")));
-
-        System.out.println("-----------------------------------APPROVE 
LOAN-----------------------------------------");
-        loanStatusHashMap = this.loanTransactionHelper.approveLoan("20 
September 2011", loanID);
-        LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
-        LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap);
-
-        System.out.println("-------------------------------DISBURSE 
LOAN-------------------------------------------");
-        loanStatusHashMap = this.loanTransactionHelper.disburseLoan("20 
September 2011", loanID);
-        LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
-
-        final JournalEntry[] assetAccountInitialEntry = { new 
JournalEntry(Float.valueOf("100.00"), JournalEntry.TransactionType.DEBIT),
-                new JournalEntry(Float.valueOf("12000.00"), 
JournalEntry.TransactionType.CREDIT),
-                new JournalEntry(Float.valueOf("12000.00"), 
JournalEntry.TransactionType.DEBIT) };
-        this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, 
"20 September 2011", assetAccountInitialEntry);
-        
this.journalEntryHelper.checkJournalEntryForIncomeAccount(incomeAccount, "20 
September 2011",
-                new JournalEntry(Float.valueOf("100.00"), 
JournalEntry.TransactionType.CREDIT));
-        loanCharges.clear();
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        validateCharge(flatDisbursement, loanCharges, "100", "0.00", "100.0", 
"0.0");
-
-        System.out.println("-------------Make repayment 1-----------");
-        this.loanTransactionHelper.makeRepayment("20 October 2011", 
Float.valueOf("3301.49"), loanID);
-        loanCharges.clear();
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        validateCharge(flatDisbursement, loanCharges, "100", "0.00", "100.0", 
"0.0");
-        validateCharge(flatSpecifiedDueDate, loanCharges, "100", "0.00", 
"100.0", "0.0");
-        validateCharge(flatInstallmentFee, loanCharges, "50", "150.00", 
"50.0", "0.0");
-
-        this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, 
"20 October 2011", new JournalEntry(
-                Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), 
new JournalEntry(Float.valueOf("2911.49"),
-                JournalEntry.TransactionType.CREDIT));
-        
this.journalEntryHelper.checkJournalEntryForIncomeAccount(incomeAccount, "20 
October 2011",
-                new JournalEntry(Float.valueOf("150.00"), 
JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("240.00"),
-                        JournalEntry.TransactionType.CREDIT));
-        this.loanTransactionHelper.addChargesForLoan(loanID, 
LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(
-                String.valueOf(flatSpecifiedDueDate), "29 October 2011", 
"100"));
-        loanSchedule.clear();
-        loanSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, 
this.responseSpec, loanID);
-
-        secondInstallment = loanSchedule.get(2);
-        validateNumberForEqual("150.00", 
String.valueOf(secondInstallment.get("feeChargesDue")));
-        this.loanTransactionHelper.waiveChargesForLoan(loanID, (Integer) 
getloanCharge(flatInstallmentFee, loanCharges).get("id"),
-                LoanTransactionHelper.getWaiveChargeJSON(String.valueOf(2)));
-        loanCharges.clear();
-        loanCharges = this.loanTransactionHelper.getLoanCharges(loanID);
-        validateCharge(flatInstallmentFee, loanCharges, "50", "100.00", 
"50.0", "50.0");
-
-        System.out.println("----------Make repayment 2------------");
-        this.loanTransactionHelper.makeRepayment("20 November 2011", 
Float.valueOf("3251.49"), loanID);
-        this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, 
"20 November 2011",
-                new JournalEntry(Float.valueOf("3251.49"), 
JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("2969.72"),
-                        JournalEntry.TransactionType.CREDIT));
-        this.journalEntryHelper.checkJo

<TRUNCATED>

Reply via email to