/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed 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.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.test.acceptance.loan;
import java.sql.SQLException;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.mifos.test.acceptance.framework.ClientsAndAccountsHomepage;
import org.mifos.test.acceptance.framework.MifosPage;
import org.mifos.test.acceptance.framework.UiTestCaseBase;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountConfirmationPage;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountEntryPage;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountPreviewPage;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountReviewInstallmentPage;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountSearchPage;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountSearchParameters;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountSubmitParameters;
import org.mifos.test.acceptance.framework.loan.DisburseLoanParameters;
import org.mifos.test.acceptance.framework.loan.EditLoanAccountInformationPage;
import org.mifos.test.acceptance.framework.loan.EditLoanAccountInformationParameters;
import org.mifos.test.acceptance.framework.loan.EditLoanAccountStatusParameters;
import org.mifos.test.acceptance.framework.loan.EditPreviewLoanAccountPage;
import org.mifos.test.acceptance.framework.loan.LoanAccountPage;
import org.mifos.test.acceptance.framework.loan.PaymentParameters;
import org.mifos.test.acceptance.framework.loan.ViewOriginalSchedulePage;
import org.mifos.test.acceptance.framework.loan.ViewRepaymentSchedulePage;
import org.mifos.test.acceptance.framework.testhelpers.LoanTestHelper;
import org.mifos.test.acceptance.framework.testhelpers.NavigationHelper;
import org.mifos.test.acceptance.remote.DateTimeUpdaterRemoteTestingService;
import org.mifos.test.acceptance.util.ApplicationDatabaseOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@SuppressWarnings("PMD")
@ContextConfiguration(locations = {"classpath:ui-test-context.xml"})
@Test(singleThreaded = true, groups = {"loan", "acceptance", "ui", "no_db_unit"})
public class CreateGLIMLoanAccountTest extends UiTestCaseBase {
private LoanTestHelper loanTestHelper;
private NavigationHelper navigationHelper;
@Autowired
private ApplicationDatabaseOperation applicationDatabaseOperation;
@Override
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// one of the dependent methods throws Exception
@BeforeMethod(alwaysRun=true)
public void setUp() throws Exception {
super.setUp();
applicationDatabaseOperation.updateGLIM(1);
loanTestHelper = new LoanTestHelper(selenium);
navigationHelper = new NavigationHelper(selenium);
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 03, 1, 13, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
}
@AfterMethod
public void logOut() throws SQLException {
applicationDatabaseOperation.updateGLIM(0);
(new MifosPage(selenium)).logout();
}
/*
* This test is to verify that you can edit a GLIM loan account after it has been
* dibursed without getting an invalid disbursal date error. See MIFOS-2597.
*/
// http://mifosforge.jira.com/browse/MIFOSTEST-132
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=false) //TODO http://mifosforge.jira.com/browse/MIFOS-5081
public void checkGLIMLoanCreatedBySubmitForApproval() throws Exception {
//Given
applicationDatabaseOperation.updateGLIM(1);
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 03, 1, 13, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
//When
ClientsAndAccountsHomepage clientsAndAccountsHomepage = navigationHelper.navigateToClientsAndAccountsPage();
CreateLoanAccountSearchPage createLoanAccountSearchPage = clientsAndAccountsHomepage.navigateToCreateLoanAccountUsingLeftMenu();
CreateLoanAccountSearchParameters formParameters = new CreateLoanAccountSearchParameters();
formParameters.setSearchString("Default Group");
formParameters.setLoanProduct("WeeklyGroupFlatLoanWithOnetimeFee");
CreateLoanAccountEntryPage createLoanAccountEntryPage = createLoanAccountSearchPage.searchAndNavigateToCreateLoanAccountPage(formParameters);
createLoanAccountEntryPage.navigateToReviewInstallmentsPage();
verifyGLIMErrorMessage();
createLoanAccountEntryPage.setDisbursalDate(new DateTime(2011, 3, 04, 15, 0, 0, 0));
createLoanAccountEntryPage.selectGLIMClients(0,"Stu1233266299995 Client1233266299995 Client Id: 0002-000000012", "9999.9", "0009-Horse");
createLoanAccountEntryPage.selectGLIMClients(1, "Stu1233266309851 Client1233266309851 Client Id: 0002-000000013", "9999.9", "0001-Cow Purchase");
createLoanAccountEntryPage.selectGLIMClients(2, "Stu1233266319760 Client1233266319760 Client Id: 0002-000000014", "9999.9", "0003-Goat Purchase");
createLoanAccountEntryPage.selectGLIMClients(3, "Holiday TestClient Client Id: 0002-000000023", "9999.9", "0003-Goat Purchase");
selectAdditionalFees();
CreateLoanAccountReviewInstallmentPage createLoanAccountReviewInstallmentPage = createLoanAccountEntryPage.navigateToReviewInstallmentsPage();
verifyFirstInstallmentAndDisbursalDateOnReviewPage();
verifyAdditionalFeesOnReviewPage();
CreateLoanAccountPreviewPage createLoanAccountPreviewPage = createLoanAccountReviewInstallmentPage.clickPreviewAndGoToReviewLoanAccountPage();
verifyFirstInstallmentAndDisbursalDateOnPreviewPage();
CreateLoanAccountConfirmationPage createLoanAccountConfirmationPage = createLoanAccountPreviewPage.submitForApprovalAndNavigateToConfirmationPage();
LoanAccountPage loanAccountPage = createLoanAccountConfirmationPage.navigateToLoanAccountDetailsPage();
String loanId = loanAccountPage.getAccountId();
loanAccountPage.verifyLoanIsPendingApproval();
loanAccountPage.verifyNumberOfInstallments("4");
loanAccountPage.verifyDisbursalDate("04/03/2011");
loanAccountPage.verifyPrincipalOriginal("39999.6");
loanAccountPage.verifyLoanTotalBalance("41147.0");
loanAccountPage.verifyFeesOriginal("410.0");
loanAccountPage.verifyInterestOriginal("737.4");
verifyFees();
ViewRepaymentSchedulePage viewRepaymentSchedulePage = loanAccountPage.navigateToViewRepaymentSchedule();
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(3, "11-Mar-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(4, "18-Mar-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(5, "25-Mar-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(6, "01-Apr-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(3, "9999.9");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(4, "9999.9");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(5, "9999.9");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(6, "9999.9");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableFees(3, "110.0");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableFees(4, "100.0");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableFees(5, "100.0");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableFees(6, "100.0");
viewRepaymentSchedulePage.navigateToLoanAccountPage();
loanId = loanAccountPage.getAccountId();
dateTimeUpdaterRemoteTestingService.setDateTime(new LocalDate(2011, 3, 8).toDateTimeAtStartOfDay());
EditLoanAccountStatusParameters statusParameters = new EditLoanAccountStatusParameters();
statusParameters.setStatus(EditLoanAccountStatusParameters.APPROVED);
statusParameters.setNote("Test");
loanTestHelper.changeLoanAccountStatus(loanId, statusParameters);
DisburseLoanParameters params = new DisburseLoanParameters();
params.setDisbursalDateDD("8");
params.setDisbursalDateMM("3");
params.setDisbursalDateYYYY("2011");
params.setPaymentType(DisburseLoanParameters.CASH);
loanTestHelper.disburseLoan(loanId, params);
dateTimeUpdaterRemoteTestingService.setDateTime(new LocalDate(2011, 3, 15).toDateTimeAtStartOfDay());
EditLoanAccountInformationParameters editLoanAccountInformationParameters = new EditLoanAccountInformationParameters();
editLoanAccountInformationParameters.setExternalID("ID2323ID");
loanTestHelper.changeLoanAccountInformation(loanId, new CreateLoanAccountSubmitParameters(), editLoanAccountInformationParameters);
applicationDatabaseOperation.updateGLIM(0);
}
private void verifyFirstInstallmentAndDisbursalDateOnReviewPage(){
Assert.assertEquals(selenium.getText("xpath=//div[@class='product-summary']/div[3]/div[2]"), ("04-Mar-2011"));
Assert.assertEquals(selenium.getTable("installments.1.1"), ("11/03/11"));
}
private void verifyFirstInstallmentAndDisbursalDateOnPreviewPage(){
Assert.assertEquals(selenium.getText("xpath=//div[@class='product-summary'][2]/div[4]/div[2]"), ("04-Mar-2011"));
Assert.assertEquals(selenium.getTable("installments.1.1"), ("11-Mar-2011"));
}
private void verifyFees() {
Assert.assertTrue(selenium.isTextPresent("loanWeeklyFee: 100.0 ( Recur every 1 week(s))"));
Assert.assertTrue(selenium.isTextPresent("oneTimeFee: 10.0"));
}
private void verifyAdditionalFeesOnReviewPage(){
Assert.assertEquals(selenium.getText("xpath=//div[@class='product-summary'][2]/div[1]/div[1]"), ("oneTimeFee"));
Assert.assertEquals(selenium.getText("xpath=//div[@class='product-summary'][2]/div[1]/div[2]"), ("10 Periodicity: One Time Frequency: Upfront"));
Assert.assertEquals(selenium.getText("xpath=//div[@class='product-summary'][2]/div[2]/div[1]"), ("loanWeeklyFee"));
Assert.assertEquals(selenium.getText("xpath=//div[@class='product-summary'][2]/div[2]/div[2]"), ("100 Periodicity: 1 week(s)"));
}
private void selectAdditionalFees() {
selenium.select("selectedFeeId0", "label=loanWeeklyFee");
selenium.type("selectedFeeId0Amount", "100");
}
private void verifyGLIMErrorMessage() {
Assert.assertTrue(selenium.isTextPresent("You must select at least two individual members in the \"Individual Details\" section in order to successfully create a loan."));
}
// http://mifosforge.jira.com/browse/MIFOSTEST-133
@Test(enabled=true)
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void checkGLIMLoanCreatedBySaveForLater() throws Exception {
loanTestHelper.createLoanAccountForMultipleClientsInGroup(false);
}
// http://mifosforge.jira.com/browse/MIFOSTEST-134
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void verifyLoanAccountCreationPipelineWhenGlimIsEnabled() throws Exception {
//Given
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2009,7,11,13,0,0,0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Stu1233266063395 Client1233266063395");
searchParameters.setLoanProduct("ClientEmergencyLoan");
String[] locators = { "name=prdOfferingId",
"loancreationdetails.input.sumLoanAmount",
"loancreationdetails.input.interestRate",
"loancreationdetails.input.numberOfInstallments",
"disbursementDateDD",
"disbursementDateMM",
"disbursementDateYY",
"name=loanOfferingFund",
"name=businessActivityId",
"name=collateralTypeId",
"name=collateralNote",
"name=externalId",
"name=selectedFee[0].feeId",
"name=selectedFee[0].amount",
"name=selectedFee[1].feeId",
"name=selectedFee[1].amount",
"name=selectedFee[2].feeId",
"name=selectedFee[2].amount",
"loancreationdetails.button.continue",
"loancreationdetails.button.cancel"
};
//When / Then
loanTestHelper.navigateToCreateLoanAccountEntryPage(searchParameters).verifyAllElementsArePresent(locators);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled = true)
public void newWeeklyGLIMAccount() throws Exception {
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Default Group");
searchParameters.setLoanProduct("WeeklyGroupFlatLoanWithOnetimeFee");
CreateLoanAccountEntryPage loanAccountEntryPage = loanTestHelper.navigateToCreateLoanAccountEntryPage(searchParameters);
loanAccountEntryPage.selectGLIMClients(0, "Stu1233266299995 Client1233266299995 Client Id: 0002-000000012", "301", "0012-Sheep Purchase");
loanAccountEntryPage.selectGLIMClients(2, "Stu1233266319760 Client1233266319760 Client Id: 0002-000000014", "401", "0012-Sheep Purchase");
//MIFOS-5703
applicationDatabaseOperation.updateLSIM(1);
EditLoanAccountInformationPage editPage = loanAccountEntryPage.submitAndNavigateToGLIMLoanAccountConfirmationPage()
.navigateToLoanAccountDetailsPage().navigateToEditAccountInformation();
editPage.verifyRepaymentDayAccessibility(true);
editPage.setWeekFrequency("5");
LoanAccountPage loanPage = editPage.submitAndNavigateToAccountInformationPreviewPage().submitAndNavigateToLoanAccountPage();
loanPage.verifyFrequencyInstallments("5");
EditLoanAccountStatusParameters statusParams = new EditLoanAccountStatusParameters();
statusParams.setNote("GLIM test");
statusParams.setStatus(EditLoanAccountStatusParameters.APPROVED);
loanPage.changeAccountStatus(statusParams);
editPage = loanPage.navigateToEditAccountInformation();
editPage.verifyRepaymentDayAccessibility(true);
editPage.navigateBack();
DisburseLoanParameters disburseParams = new DisburseLoanParameters();
disburseParams.setDisbursalDateDD("1");
disburseParams.setDisbursalDateMM("03");
disburseParams.setDisbursalDateYYYY("2011");
disburseParams.setPaymentType(DisburseLoanParameters.CASH);
loanPage.disburseLoan(disburseParams);
editPage = loanPage.navigateToEditAccountInformation();
editPage.verifyRepaymentDayAccessibility(false);
applicationDatabaseOperation.updateLSIM(0);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled = true)
public void newMonthlyGLIMAccount() throws Exception {
applicationDatabaseOperation.updateLSIM(1);
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Default Group");
searchParameters.setLoanProduct("MonthlyGroupFlatLoan1stOfMonth");
CreateLoanAccountEntryPage loanAccountEntryPage = loanTestHelper.navigateToCreateLoanAccountEntryPage(searchParameters);
loanAccountEntryPage.selectGLIMClients(0, "Stu1233266299995 Client1233266299995 Client Id: 0002-000000012", "3010", "0012-Sheep Purchase");
loanAccountEntryPage.selectGLIMClients(2, "Stu1233266319760 Client1233266319760 Client Id: 0002-000000014", "4010", "0012-Sheep Purchase");
loanAccountEntryPage.setDisbursalDate("1", "3","2011");
EditLoanAccountInformationPage editPage = loanAccountEntryPage.submitAndNavigateToGLIMLoanAccountConfirmationPage()
.navigateToLoanAccountDetailsPage().navigateToEditAccountInformation();
editPage.setDayOfMonth("56");
editPage.submitWithErrors();
editPage.verifyErrorInForm("Repayment day format is not valid");
applicationDatabaseOperation.updateLSIM(0);
}
@Test(enabled=true)
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void checkGLIMAccountTotalCalculationWithDecimal() throws Exception {
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Default Group");
searchParameters.setLoanProduct("WeeklyGroupFlatLoanWithOnetimeFee");
CreateLoanAccountEntryPage loanAccountEntryPage = loanTestHelper.navigateToCreateLoanAccountEntryPage(searchParameters);
loanAccountEntryPage.selectGLIMClients(0, "Stu1233266299995 Client1233266299995 Client Id: 0002-000000012", "9999.9");
loanAccountEntryPage.selectGLIMClients(1, "Stu1233266309851 Client1233266309851 Client Id: 0002-000000013", "99999.9");
loanAccountEntryPage.selectGLIMClients(2, "Stu1233266319760 Client1233266319760 Client Id: 0002-000000014", "99999.9");
loanAccountEntryPage.checkTotalAmount("209999.7");
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void checkGLIMAccountTotalCalculationWholeNumber() throws Exception {
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Default Group");
searchParameters.setLoanProduct("WeeklyGroupFlatLoanWithOnetimeFee");
CreateLoanAccountEntryPage loanAccountEntryPage = loanTestHelper.navigateToCreateLoanAccountEntryPage(searchParameters);
loanAccountEntryPage.selectGLIMClients(0, "Stu1233266299995 Client1233266299995 Client Id: 0002-000000012", "9999");
loanAccountEntryPage.selectGLIMClients(1, "Stu1233266309851 Client1233266309851 Client Id: 0002-000000013", "99999");
loanAccountEntryPage.selectGLIMClients(2, "Stu1233266319760 Client1233266319760 Client Id: 0002-000000014", "99999");
loanAccountEntryPage.checkTotalAmount("209997.0");
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void checkGLIMAccountEmptyPurpose() throws Exception {
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Default Group");
searchParameters.setLoanProduct("WeeklyGroupFlatLoanWithOnetimeFee");
CreateLoanAccountEntryPage loanAccountEntryPage = loanTestHelper.navigateToCreateLoanAccountEntryPage(searchParameters);
loanAccountEntryPage.selectGLIMClients(0, "Stu1233266299995 Client1233266299995 Client Id: 0002-000000012", "9999", "0012-Sheep Purchase");
loanAccountEntryPage.selectGLIMClients(1, "Stu1233266309851 Client1233266309851 Client Id: 0002-000000013", "99999");
loanAccountEntryPage.selectGLIMClients(2, "Stu1233266319760 Client1233266319760 Client Id: 0002-000000014", "99999");
CreateLoanAccountReviewInstallmentPage createLoanAccountReviewInstallmentPage = loanAccountEntryPage.navigateToReviewInstallmentsPage();
CreateLoanAccountPreviewPage createLoanAccountPreviewPage = createLoanAccountReviewInstallmentPage.clickPreviewAndGoToReviewLoanAccountPage();
CreateLoanAccountConfirmationPage createLoanAccountConfirmationPage = createLoanAccountPreviewPage.submitForApprovalAndNavigateToConfirmationPage();
LoanAccountPage loanAccountPage = createLoanAccountConfirmationPage.navigateToLoanAccountDetailsPage();
String[] purposes = {"0012-Sheep Purchase", "-", "-"};
loanAccountPage.verifyGLIMPurpose(purposes);
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, true);
EditPreviewLoanAccountPage previewLoanAccountPage = loanAccountPage.navigateToEditAccountInformation().submitAndNavigateToAccountInformationPreviewPage();
previewLoanAccountPage.verifyGLIMPurpose(purposes);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void checkGLIMIndividualSchedule() throws Exception {
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 03, 1, 13, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Default Group");
searchParameters.setLoanProduct("WeeklyGroupFlatLoanWithOnetimeFee");
CreateLoanAccountEntryPage loanAccountEntryPage = loanTestHelper.navigateToCreateLoanAccountEntryPage(searchParameters);
loanAccountEntryPage.selectGLIMClients(0, "Stu1233266299995 Client1233266299995 Client Id: 0002-000000012", "9999", "0012-Sheep Purchase");
loanAccountEntryPage.selectGLIMClients(1, "Stu1233266309851 Client1233266309851 Client Id: 0002-000000013", "99999");
loanAccountEntryPage.selectGLIMClients(2, "Stu1233266319760 Client1233266319760 Client Id: 0002-000000014", "99999");
LoanAccountPage loanAccountPage = loanAccountEntryPage.navigateToReviewInstallmentsPage()
.clickPreviewAndGoToReviewLoanAccountPage()
.submitForApprovalAndNavigateToConfirmationPage()
.navigateToLoanAccountDetailsPage();
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, true);
EditLoanAccountStatusParameters statusParams = new EditLoanAccountStatusParameters();
statusParams.setNote("GLIM test");
statusParams.setStatus(EditLoanAccountStatusParameters.APPROVED);
loanAccountPage.changeAccountStatus(statusParams);
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, true);
String loanId = loanAccountPage.getAccountId();
dateTimeUpdaterRemoteTestingService.setDateTime(new LocalDate(2011, 3, 8).toDateTimeAtStartOfDay());
loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
DisburseLoanParameters disburseParams = new DisburseLoanParameters();
disburseParams.setAmount("209997.0");
disburseParams.setDisbursalDateDD("8");
disburseParams.setDisbursalDateMM("3");
disburseParams.setDisbursalDateYYYY("2011");
disburseParams.setPaymentType(DisburseLoanParameters.CASH);
loanAccountPage.disburseLoan(disburseParams);
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, false);
totalGroupLoanEqualSumOfindividual(loanAccountPage, 3, 1.0);
PaymentParameters paymentParams = new PaymentParameters();
paymentParams.setAmount("1500.0");
paymentParams.setTransactionDateDD("8");
paymentParams.setTransactionDateMM("3");
paymentParams.setTransactionDateYYYY("2011");
paymentParams.setPaymentType(PaymentParameters.CASH);
loanTestHelper.applyPayment(loanId, paymentParams);
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, false);
totalGroupLoanEqualSumOfindividual(loanAccountPage, 3, 1.0);
loanAccountPage.navigateToApplyAdjustment().fillAdjustmentFieldsWithoutRevertingAndSubmit("1500.0");
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, false);
totalGroupLoanEqualSumOfindividual(loanAccountPage, 3, 1.0);
String[] expectedPrincipalAmounts = new String[] { "24.9", "249.2", "249.3" };
String[] expectedInterestAmounts = new String[] { "46", "460.3", "460.3" };
String[] expectedFeeAmounts = new String[] { "0.5", "4.8", "4.7" };
verifyProRatedGLIMPayments(loanAccountPage, 3, expectedPrincipalAmounts, expectedInterestAmounts, expectedFeeAmounts);
loanTestHelper.repayLoan(loanId);
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, false);
totalGroupLoanEqualSumOfindividual(loanAccountPage, 3, 1.0);
loanAccountPage.navigateToApplyAdjustment().submitAdjustment();
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, false);
totalGroupLoanEqualSumOfindividual(loanAccountPage, 3, 1.0);
statusParams.setNote("GLIM test");
statusParams.setStatus(EditLoanAccountStatusParameters.CLOSED_WRITTEN_OFF);
loanAccountPage.changeAccountStatus(statusParams);
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, false);
totalGroupLoanEqualSumOfindividual(loanAccountPage, 3, 1.0);
}
private void totalGroupLoanEqualSumOfindividual(LoanAccountPage page, int count, double delta) {
ViewOriginalSchedulePage originalSchedulePage = page.navigateToRepaymentSchedulePage().navigateToViewOriginalSchedulePage();
double[][] installments = originalSchedulePage.getInstallments(delta);
originalSchedulePage.returnToRepaymentSchedule().navigateToLoanAccountPage();
for(int i = 0; i < count; ++i) {
ViewOriginalSchedulePage individualSchedulePage = page.navigateToIndividualOriginalSchedulePage(i + 2);
double[][] individual = individualSchedulePage.getInstallments(delta);
individualSchedulePage.returnToLoanAccountDetail();
for(int j = 0; j < installments.length; ++j) {
installments[j][0] -= individual[j][0];
installments[j][1] -= individual[j][1];
installments[j][2] -= individual[j][2];
installments[j][3] -= individual[j][3];
}
}
for (int i = 0; i < installments.length; ++i) {
Assert.assertEquals(installments[i][0], 0, delta);
Assert.assertEquals(installments[i][1], 0, delta);
Assert.assertEquals(installments[i][2], 0, delta);
Assert.assertEquals(installments[i][3], 0, delta);
}
}
private void verifyProRatedGLIMPayments(LoanAccountPage loanAccountPage, int count, String[] expectedPrincipalAmounts, String[] expectedInterestAmounts,
String[] expectedFeeAmounts) {
for (int i = 0; i < count; i++) {
ViewRepaymentSchedulePage repaymentSchedulePage = loanAccountPage.navigateToIndividualRepaymentSchedulePage(i);
repaymentSchedulePage.verifyInstallmentAmount(ViewRepaymentSchedulePage.FIRST_ROW, ViewRepaymentSchedulePage.PRINCIPAL_COLUMN, expectedPrincipalAmounts[i]);
repaymentSchedulePage.verifyInstallmentAmount(ViewRepaymentSchedulePage.FIRST_ROW, ViewRepaymentSchedulePage.INTEREST_COLUMN, expectedInterestAmounts[i]);
repaymentSchedulePage.verifyInstallmentAmount(ViewRepaymentSchedulePage.FIRST_ROW, ViewRepaymentSchedulePage.FEE_COLUMN, expectedFeeAmounts[i]);
loanAccountPage = repaymentSchedulePage.navigateToLoanAccountPage();
}
}
}