diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ClientLoanIntegrationTest.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ClientLoanIntegrationTest.java index 688a694bd..d7b860849 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ClientLoanIntegrationTest.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ClientLoanIntegrationTest.java @@ -2,17 +2,25 @@ package org.mifosplatform.integrationtests; import static org.junit.Assert.assertEquals; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mifosplatform.integrationtests.common.ClientHelper; import org.mifosplatform.integrationtests.common.Utils; +import org.mifosplatform.integrationtests.common.charges.ChargesHelper; import org.mifosplatform.integrationtests.common.loans.LoanApplicationTestBuilder; import org.mifosplatform.integrationtests.common.loans.LoanProductTestBuilder; +import org.mifosplatform.integrationtests.common.loans.LoanStatusChecker; import org.mifosplatform.integrationtests.common.loans.LoanTransactionHelper; +import org.mifosplatform.integrationtests.common.savings.SavingsAccountHelper; +import org.mifosplatform.integrationtests.common.savings.SavingsProductHelper; +import org.mifosplatform.integrationtests.common.savings.SavingsStatusChecker; import com.jayway.restassured.builder.RequestSpecBuilder; import com.jayway.restassured.builder.ResponseSpecBuilder; @@ -27,6 +35,9 @@ import com.jayway.restassured.specification.ResponseSpecification; @SuppressWarnings({ "rawtypes", "unchecked" }) public class ClientLoanIntegrationTest { + public static final String MINIMUM_OPENING_BALANCE = "1000.0"; + public static final String ACCOUNT_TYPE_INDIVIDUAL = "INDIVIDUAL"; + private ResponseSpecification responseSpec; private RequestSpecification requestSpec; private LoanTransactionHelper loanTransactionHelper; @@ -46,13 +57,575 @@ public class ClientLoanIntegrationTest { final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec); ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID); final Integer loanProductID = createLoanProduct(); - final Integer loanID = applyForLoanApplication(clientID, loanProductID); + final Integer loanID = applyForLoanApplication(clientID, loanProductID, null); final ArrayList 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(); + + List 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); + Assert.assertNotNull(loanID); + + HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + + ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); + HashMap disbursementDetail = loanSchedule.get(0); + + List 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_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(); + + List 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); + Assert.assertNotNull(loanID); + + HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + + ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); + HashMap firstInstallment = loanSchedule.get(1); + + List 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 = createSavings(clientID); + 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(); + + List 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); + Assert.assertNotNull(loanID); + + HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + + ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); + loanSchedule.remove(0); + List 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 = createSavings(clientID); + 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"); + + } + + private void validateCharge(Integer amountPercentage, final List 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 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 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() { System.out.println("------------------------------CREATING NEW LOAN PRODUCT ---------------------------------------"); final String loanProductJSON = new LoanProductTestBuilder() // @@ -68,7 +641,7 @@ public class ClientLoanIntegrationTest { return this.loanTransactionHelper.getLoanProductId(loanProductJSON); } - private Integer applyForLoanApplication(final Integer clientID, final Integer loanProductID) { + private Integer applyForLoanApplication(final Integer clientID, final Integer loanProductID, List charges) { System.out.println("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------"); final String loanApplicationJSON = new LoanApplicationTestBuilder() // .withPrincipal("12,000.00") // @@ -83,10 +656,29 @@ public class ClientLoanIntegrationTest { .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() // .withExpectedDisbursementDate("20 September 2011") // .withSubmittedOnDate("20 September 2011") // - .build(clientID.toString(), loanProductID.toString(), null); + .withCharges(charges).build(clientID.toString(), loanProductID.toString(), null); return this.loanTransactionHelper.getLoanId(loanApplicationJSON); } + private String updateLoanJson(final Integer clientID, final Integer loanProductID, List 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 void verifyLoanRepaymentSchedule(final ArrayList loanSchedule) { System.out.println("--------------------VERIFYING THE PRINCIPAL DUES,INTEREST DUE AND DUE DATE--------------------------"); @@ -110,4 +702,86 @@ public class ClientLoanIntegrationTest { assertEquals("Checking for Principal Due for 4th Month", new Float("3089.7"), loanSchedule.get(4).get("principalDue")); assertEquals("Checking for Interest Due for 4th Month", new Float("61.79"), loanSchedule.get(4).get("interestOriginalDue")); } + + private void addCharges(List 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 charges) { + HashMap charge = null; + for (HashMap loancharge : charges) { + if (loancharge.get("chargeId").equals(chargeId)) { + charge = loancharge; + } + } + return charge; + } + + private List copyChargesForUpdate(List charges, Integer deleteWithChargeId, String amount) { + List 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 Integer createSavings(Integer clientID) { + final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, MINIMUM_OPENING_BALANCE); + Assert.assertNotNull(savingsProductID); + + SavingsAccountHelper savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec); + + final Integer savingsId = savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL); + Assert.assertNotNull(savingsProductID); + + HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsId); + SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap); + + savingsStatusHashMap = savingsAccountHelper.approveSavings(savingsId); + SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap); + + savingsStatusHashMap = savingsAccountHelper.activateSavings(savingsId); + SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap); + return savingsId; + } + + private Integer createSavingsProduct(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, + final String minOpenningBalance) { + System.out.println("------------------------------CREATING NEW SAVINGS PRODUCT ---------------------------------------"); + SavingsProductHelper savingsProductHelper = new SavingsProductHelper(); + final String savingsProductJSON = savingsProductHelper // + .withInterestCompoundingPeriodTypeAsDaily() // + .withInterestPostingPeriodTypeAsMonthly() // + .withInterestCalculationPeriodTypeAsDailyBalance() // + .withMinimumOpenningBalance(minOpenningBalance).build(); + return SavingsProductHelper.createSavingsProduct(savingsProductJSON, requestSpec, responseSpec); + } + } \ No newline at end of file diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/charges/ChargesHelper.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/charges/ChargesHelper.java index aab5f1911..bcae88e8a 100755 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/charges/ChargesHelper.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/charges/ChargesHelper.java @@ -29,10 +29,10 @@ public class ChargesHelper { private static final Integer CHARGE_OVERDUE_INSTALLMENT_FEE = 9; private static final Integer CHARGE_OVERDRAFT_FEE = 10; - private static final Integer CHARGE_CALCULATION_TYPE_FLAT = 1; - private static final Integer CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT = 2; - private static final Integer CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT_AND_INTEREST = 3; - private static final Integer CHARGE_CALCULATION_TYPE_PERCENTAGE_INTEREST = 4; + public static final Integer CHARGE_CALCULATION_TYPE_FLAT = 1; + public static final Integer CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT = 2; + public static final Integer CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT_AND_INTEREST = 3; + public static final Integer CHARGE_CALCULATION_TYPE_PERCENTAGE_INTEREST = 4; private static final Integer CHARGE_PAYMENT_MODE_REGULAR = 0; private static final Integer CHARGE_PAYMENT_MODE_ACCOUNT_TRANSFER = 1; @@ -115,42 +115,76 @@ public class ChargesHelper { } public static String getLoanDisbursementJSON() { + return getLoanDisbursementJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, ChargesHelper.amount); + } + + public static String getLoanDisbursementJSON(final Integer chargeCalculationType, final String amount) { final HashMap map = populateDefaultsForLoan(); map.put("chargeTimeType", CHARGE_DISBURSEMENT_FEE); map.put("chargePaymentMode", ChargesHelper.CHARGE_PAYMENT_MODE_REGULAR); + map.put("amount", amount); + map.put("chargeCalculationType", chargeCalculationType); String chargesCreateJson = new Gson().toJson(map); System.out.println(chargesCreateJson); return chargesCreateJson; } public static String getLoanSpecifiedDueDateJSON() { + return getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, ChargesHelper.amount, ChargesHelper.penalty); + } + + public static String getLoanSpecifiedDueDateJSON(final Integer chargeCalculationType, final String amount, boolean penalty) { + return getLoanSpecifiedDueDateJSON(chargeCalculationType, amount, penalty, ChargesHelper.CHARGE_PAYMENT_MODE_REGULAR); + } + + public static String getLoanSpecifiedDueDateJSON(final Integer chargeCalculationType, final String amount, final boolean penalty, + final Integer paymentMode) { final HashMap map = populateDefaultsForLoan(); map.put("chargeTimeType", CHARGE_SPECIFIED_DUE_DATE); - map.put("chargePaymentMode", ChargesHelper.CHARGE_PAYMENT_MODE_REGULAR); - map.put("penalty", ChargesHelper.penalty); + map.put("chargePaymentMode", paymentMode); + map.put("penalty", penalty); + map.put("amount", amount); + map.put("chargeCalculationType", chargeCalculationType); + String chargesCreateJson = new Gson().toJson(map); System.out.println(chargesCreateJson); return chargesCreateJson; } + public static String getLoanSpecifiedDueDateWithAccountTransferJSON(final Integer chargeCalculationType, final String amount, + boolean penalty) { + return getLoanSpecifiedDueDateJSON(chargeCalculationType, amount, penalty, ChargesHelper.CHARGE_PAYMENT_MODE_ACCOUNT_TRANSFER); + } + public static String getLoanSpecifiedDueDateWithAccountTransferJSON() { + return getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, ChargesHelper.amount, ChargesHelper.penalty, + ChargesHelper.CHARGE_PAYMENT_MODE_ACCOUNT_TRANSFER); + } + + public static String getLoanInstallmentJSON(final Integer chargeCalculationType, final String amount, boolean penalty) { + return getLoanInstallmentJSON(chargeCalculationType, amount, penalty, ChargesHelper.CHARGE_PAYMENT_MODE_REGULAR); + } + + public static String getLoanInstallmentJSON(final Integer chargeCalculationType, final String amount, final boolean penalty, + final Integer paymentMode) { final HashMap map = populateDefaultsForLoan(); - map.put("chargeTimeType", CHARGE_SPECIFIED_DUE_DATE); - map.put("penalty", ChargesHelper.penalty); - map.put("chargePaymentMode", ChargesHelper.CHARGE_PAYMENT_MODE_ACCOUNT_TRANSFER); + map.put("chargeTimeType", CHARGE_INSTALLMENT_FEE); + map.put("chargePaymentMode", paymentMode); + map.put("penalty", penalty); + map.put("amount", amount); + map.put("chargeCalculationType", chargeCalculationType); + String chargesCreateJson = new Gson().toJson(map); System.out.println(chargesCreateJson); return chargesCreateJson; } + public static String getLoanInstallmentWithAccountTransferJSON(final Integer chargeCalculationType, final String amount, boolean penalty) { + return getLoanInstallmentJSON(chargeCalculationType, amount, penalty, ChargesHelper.CHARGE_PAYMENT_MODE_ACCOUNT_TRANSFER); + } + public static String getLoanInstallmentFeeJSON() { - final HashMap map = populateDefaultsForLoan(); - map.put("chargeTimeType", CHARGE_INSTALLMENT_FEE); - map.put("chargePaymentMode", ChargesHelper.CHARGE_PAYMENT_MODE_REGULAR); - map.put("penalty", ChargesHelper.penalty); - String chargesCreateJson = new Gson().toJson(map); - System.out.println(chargesCreateJson); - return chargesCreateJson; + return getLoanInstallmentJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, ChargesHelper.amount, ChargesHelper.penalty); } public static String getLoanOverdueFeeJSON() { diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanApplicationTestBuilder.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanApplicationTestBuilder.java index 247a257a3..32e1308cd 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanApplicationTestBuilder.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanApplicationTestBuilder.java @@ -1,6 +1,9 @@ package org.mifosplatform.integrationtests.common.loans; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Map; import com.google.gson.Gson; @@ -32,10 +35,11 @@ public class LoanApplicationTestBuilder { private String expectedDisbursmentDate = ""; private String submittedOnDate = ""; private String loanType = "individual"; + private List charges = new ArrayList(); public String build(final String ID, final String loanProductId, final String savingsID) { - final HashMap map = new HashMap(); + final HashMap map = new HashMap(); map.put("dateFormat", "dd MMMM yyyy"); map.put("locale", "en_GB"); if (this.loanType == "group") { @@ -58,6 +62,9 @@ public class LoanApplicationTestBuilder { map.put("expectedDisbursementDate", this.expectedDisbursmentDate); map.put("submittedOnDate", this.submittedOnDate); map.put("loanType", this.loanType); + if (charges != null) { + map.put("charges", charges); + } if (savingsID != null) { map.put("linkAccountId", savingsID); } @@ -164,6 +171,11 @@ public class LoanApplicationTestBuilder { return this; } + public LoanApplicationTestBuilder withCharges(final List charges) { + this.charges = charges; + return this; + } + public LoanApplicationTestBuilder withLoanType(final String loanType) { this.loanType = loanType; return this; diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanTransactionHelper.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanTransactionHelper.java index ec96930f1..831e74b50 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanTransactionHelper.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanTransactionHelper.java @@ -41,6 +41,11 @@ public class LoanTransactionHelper { return Utils.performServerPost(this.requestSpec, this.responseSpec, APPLY_LOAN_URL, loanApplicationJSON, "loanId"); } + public Integer updateLoan(final Integer id, final String loanApplicationJSON) { + return Utils.performServerPut(this.requestSpec, this.responseSpec, "/mifosng-provider/api/v1/loans/" + id + + "?tenantIdentifier=default", loanApplicationJSON, "loanId"); + } + public ArrayList getLoanRepaymentSchedule(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, final Integer loanID) { final String URL = "/mifosng-provider/api/v1/loans/" + loanID + "?associations=repaymentSchedule&tenantIdentifier=default"; @@ -106,11 +111,43 @@ public class LoanTransactionHelper { public Integer addChargesForLoan(final Integer loanId, final String request) { System.out.println("--------------------------------- ADD CHARGES FOR LOAN --------------------------------"); - final String ADD_CHARGES_URL = "/mifosng-provider/api/v1/loans/" + loanId + "/charges"; + final String ADD_CHARGES_URL = "/mifosng-provider/api/v1/loans/" + loanId + "/charges?tenantIdentifier=default"; final HashMap response = Utils.performServerPost(requestSpec, responseSpec, ADD_CHARGES_URL, request, ""); return (Integer) response.get("resourceId"); } + public Integer updateChargesForLoan(final Integer loanId, final Integer loanchargeId, final String request) { + System.out.println("--------------------------------- ADD CHARGES FOR LOAN --------------------------------"); + final String UPDATE_CHARGES_URL = "/mifosng-provider/api/v1/loans/" + loanId + "/charges/" + loanchargeId + + "?tenantIdentifier=default"; + final HashMap response = Utils.performServerPut(requestSpec, responseSpec, UPDATE_CHARGES_URL, request, ""); + return (Integer) response.get("resourceId"); + } + + public Integer deleteChargesForLoan(final Integer loanId, final Integer loanchargeId) { + System.out.println("--------------------------------- DELETE CHARGES FOR LOAN --------------------------------"); + final String DELETE_CHARGES_URL = "/mifosng-provider/api/v1/loans/" + loanId + "/charges/" + loanchargeId + + "?tenantIdentifier=default"; + final HashMap response = Utils.performServerDelete(requestSpec, responseSpec, DELETE_CHARGES_URL, ""); + return (Integer) response.get("resourceId"); + } + + public Integer waiveChargesForLoan(final Integer loanId, final Integer loanchargeId, final String json) { + System.out.println("--------------------------------- WAIVE CHARGES FOR LOAN --------------------------------"); + final String CHARGES_URL = "/mifosng-provider/api/v1/loans/" + loanId + "/charges/" + loanchargeId + + "?command=waive&tenantIdentifier=default"; + final HashMap response = Utils.performServerPost(requestSpec, responseSpec, CHARGES_URL, json, ""); + return (Integer) response.get("resourceId"); + } + + public Integer payChargesForLoan(final Integer loanId, final Integer loanchargeId, final String json) { + System.out.println("--------------------------------- WAIVE CHARGES FOR LOAN --------------------------------"); + final String CHARGES_URL = "/mifosng-provider/api/v1/loans/" + loanId + "/charges/" + loanchargeId + + "?command=pay&tenantIdentifier=default"; + final HashMap response = Utils.performServerPost(requestSpec, responseSpec, CHARGES_URL, json, ""); + return (Integer) response.get("resourceId"); + } + private String getDisburseLoanAsJSON(final String actualDisbursementDate) { final HashMap map = new HashMap(); map.put("locale", "en"); @@ -169,11 +206,15 @@ public class LoanTransactionHelper { } public static String getSpecifiedDueDateChargesForLoanAsJSON(final String chargeId) { + return getSpecifiedDueDateChargesForLoanAsJSON(chargeId, "12 January 2013", "100"); + } + + public static String getSpecifiedDueDateChargesForLoanAsJSON(final String chargeId, final String dueDate, final String amount) { final HashMap map = new HashMap(); map.put("locale", "en_GB"); map.put("dateFormat", "dd MMMM yyyy"); - map.put("amount", "100"); - map.put("dueDate", "12 January 2013"); + map.put("amount", amount); + map.put("dueDate", dueDate); map.put("chargeId", chargeId); String json = new Gson().toJson(map); System.out.println(json); @@ -181,16 +222,63 @@ public class LoanTransactionHelper { } public static String getDisbursementChargesForLoanAsJSON(final String chargeId) { + return getDisbursementChargesForLoanAsJSON(chargeId, "100"); + } + + public static String getDisbursementChargesForLoanAsJSON(final String chargeId, String amount) { final HashMap map = new HashMap(); map.put("locale", "en_GB"); map.put("dateFormat", "dd MMMM yyyy"); - map.put("amount", "100"); + map.put("amount", amount); map.put("chargeId", chargeId); String json = new Gson().toJson(map); System.out.println(json); return json; } + public static String getInstallmentChargesForLoanAsJSON(final String chargeId, final String amount) { + final HashMap map = new HashMap(); + map.put("locale", "en_GB"); + map.put("dateFormat", "dd MMMM yyyy"); + map.put("amount", amount); + map.put("chargeId", chargeId); + String json = new Gson().toJson(map); + System.out.println(json); + return json; + } + + public static String getUpdateChargesForLoanAsJSON(String amount) { + final HashMap map = new HashMap(); + map.put("locale", "en_GB"); + map.put("dateFormat", "dd MMMM yyyy"); + map.put("amount", amount); + String json = new Gson().toJson(map); + System.out.println(json); + return json; + } + + public static String getPayChargeJSON(final String date, final String installmentNumber) { + final HashMap map = new HashMap(); + map.put("locale", "en_GB"); + map.put("dateFormat", "dd MMMM yyyy"); + map.put("transactionDate", date); + if (installmentNumber != null) { + map.put("installmentNumber", installmentNumber); + } + String json = new Gson().toJson(map); + System.out.println(json); + return json; + } + + public static String getWaiveChargeJSON(final String installmentNumber) { + final HashMap map = new HashMap(); + map.put("locale", "en_GB"); + map.put("installmentNumber", installmentNumber); + String json = new Gson().toJson(map); + System.out.println(json); + return json; + } + public String getLoanCalculationBodyAsJSON(final String productID) { final HashMap map = new HashMap(); map.put("dateFormat", "dd MMMM yyyy"); diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/savings/SavingsAccountHelper.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/savings/SavingsAccountHelper.java index b98892714..aaa62f257 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/savings/SavingsAccountHelper.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/savings/SavingsAccountHelper.java @@ -215,7 +215,7 @@ public class SavingsAccountHelper { final HashMap map = new HashMap(); map.put("locale", CommonConstants.locale); map.put("dateFormat", CommonConstants.dateFormat); - map.put("activatedOnDate", "01 March 2013"); + map.put("activatedOnDate", TRANSACTION_DATE); String savingsAccountActivateJson = new Gson().toJson(map); System.out.println(savingsAccountActivateJson); return savingsAccountActivateJson;