/*
* 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 org.joda.time.DateTime;
import org.mifos.test.acceptance.admin.FeeTestHelper;
import org.mifos.test.acceptance.framework.ClientsAndAccountsHomepage;
import org.mifos.test.acceptance.framework.HomePage;
import org.mifos.test.acceptance.framework.MifosPage;
import org.mifos.test.acceptance.framework.UiTestCaseBase;
import org.mifos.test.acceptance.framework.account.AccountStatus;
import org.mifos.test.acceptance.framework.account.EditAccountStatusParameters;
import org.mifos.test.acceptance.framework.admin.FeesCreatePage;
import org.mifos.test.acceptance.framework.admin.ManageRolePage;
import org.mifos.test.acceptance.framework.loan.ChargeParameters;
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.CreateLoanAccountSelectLoanProductPage;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountSubmitParameters;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountsSuccessPage;
import org.mifos.test.acceptance.framework.loan.CreateMultipleLoanAccountSelectParameters;
import org.mifos.test.acceptance.framework.loan.DisburseLoanConfirmationPage;
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.LoanAccountPage;
import org.mifos.test.acceptance.framework.loan.QuestionResponseParameters;
import org.mifos.test.acceptance.framework.loan.ViewRepaymentSchedulePage;
import org.mifos.test.acceptance.framework.loanproduct.DefineNewLoanProductPage;
import org.mifos.test.acceptance.framework.loanproduct.DefineNewLoanProductPage.SubmitFormParameters;
import org.mifos.test.acceptance.framework.loanproduct.LoanProductDetailsPage;
import org.mifos.test.acceptance.framework.questionnaire.ViewQuestionResponseDetailPage;
import org.mifos.test.acceptance.framework.testhelpers.FormParametersHelper;
import org.mifos.test.acceptance.framework.testhelpers.LoanTestHelper;
import org.mifos.test.acceptance.framework.testhelpers.NavigationHelper;
import org.mifos.test.acceptance.framework.testhelpers.QuestionGroupTestHelper;
import org.mifos.test.acceptance.loanproduct.LoanProductTestHelper;
import org.mifos.test.acceptance.remote.DateTimeUpdaterRemoteTestingService;
import org.mifos.test.acceptance.remote.InitializeApplicationRemoteTestingService;
import org.mifos.test.acceptance.util.ApplicationDatabaseOperation;
import org.mifos.test.acceptance.util.TestDataSetup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
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;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.util.List;
import java.util.Random;
@SuppressWarnings("PMD")
@ContextConfiguration(locations = {"classpath:ui-test-context.xml"})
@Test(singleThreaded = true, groups = {"loan", "acceptance", "ui", "no_db_unit"})
public class CreateClientLoanAccountTest extends UiTestCaseBase {
private LoanTestHelper loanTestHelper;
private LoanProductTestHelper loanProductTestHelper;
private NavigationHelper navigationHelper;
private FeeTestHelper feeTestHelper;
static final int WEEKLY_RECURRENCE_TYPE_ID = 1;
@Autowired
private DriverManagerDataSource dataSource;
@Autowired
private InitializeApplicationRemoteTestingService initRemote;
@Autowired
private ApplicationDatabaseOperation applicationDatabaseOperation;
private Random random;
public static final String DATE = "Date";
public static final String SINGLE_SELECT = "Single Select";
private QuestionGroupHelper questionGroupHelper;
private QuestionGroupTestHelper questionGroupTestHelper;
@Override
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// one of the dependent methods throws Exception
@BeforeMethod(alwaysRun = true)
public void setUp() throws Exception {
super.setUp();
loanTestHelper = new LoanTestHelper(selenium);
loanProductTestHelper = new LoanProductTestHelper(selenium);
navigationHelper = new NavigationHelper(selenium);
feeTestHelper = new FeeTestHelper(new TestDataSetup(selenium, applicationDatabaseOperation), navigationHelper);
questionGroupHelper = new QuestionGroupHelper(navigationHelper);
questionGroupTestHelper = new QuestionGroupTestHelper(selenium);
random = new Random();
}
@AfterMethod(alwaysRun = true)
public void logOut() {
(new MifosPage(selenium)).logout();
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true) //https://mifosforge.jira.com/browse/MIFOSTEST-1185
public void approveLoanAmountByDifferentLoanAmountRangesTest() throws Exception {
// When
ManageRolePage manageRolePage = new ManageRolePage(selenium);
manageRolePage = navigationHelper.navigateToAdminPage().navigateToViewRolesPage().navigateToManageRolePage("Admin");//.
manageRolePage.enablePermission("activityRestrictionCheckbox1");
manageRolePage.typeText("restrictionValue(1)", "asdf");
manageRolePage.verifyAmountTextField();
manageRolePage.typeText("restrictionValue(1)", "5,000");
manageRolePage.enablePermission("activityRestrictionCheckbox1");
manageRolePage.submitAndGotoViewRolesPage();
//Then
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setLoanProduct("Flat Interest Loan Product With Fee");
searchParameters.setSearchString("ClientWithLoan 20110221");
CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters();
submitAccountParameters.setAmount("6000");
LoanAccountPage loanAccountPage = loanTestHelper.createLoanAccount(searchParameters, submitAccountParameters);
String loanAccountId = loanAccountPage.getAccountId();
EditAccountStatusParameters editAccountStatusParameters = new EditAccountStatusParameters();
editAccountStatusParameters.setAccountStatus(AccountStatus.LOAN_APPROVED);
editAccountStatusParameters.setNote("Approve test");
loanAccountPage.navigateToEditAccountStatus().setChangeStatusParametersAndSubmit(editAccountStatusParameters);
loanAccountPage.verifyLoanAmountPermissionError();
editAccountStatusParameters.setAccountStatus(AccountStatus.LOAN_PARTIAL);
searchParameters.setSearchString(loanAccountId);
loanAccountPage = loanTestHelper.navigateToLoanAccountPage(searchParameters);
loanAccountPage.navigateToEditAccountStatus().setChangeStatusParametersAndSubmit(editAccountStatusParameters).submitAndNavigateToLoanAccountPage();
//When
manageRolePage = navigationHelper.navigateToAdminPage().navigateToViewRolesPage().navigateToManageRolePage("Admin");
manageRolePage.disablePermission("activityRestrictionCheckbox1");
manageRolePage.typeText("restrictionValue(1)", "");
manageRolePage.submitAndGotoViewRolesPage();
//Then
loanAccountPage = loanTestHelper.navigateToLoanAccountPage(searchParameters);
editAccountStatusParameters.setAccountStatus(AccountStatus.LOAN_PENDING_APPROVAL);
loanAccountPage.navigateToEditAccountStatus().setChangeStatusParametersAndSubmit(editAccountStatusParameters).submitAndNavigateToLoanAccountPage();
editAccountStatusParameters.setAccountStatus(AccountStatus.LOAN_APPROVED);
loanAccountPage.navigateToEditAccountStatus().setChangeStatusParametersAndSubmit(editAccountStatusParameters).submitAndNavigateToLoanAccountPage();
}
@Test(singleThreaded = true, groups = {"loan", "acceptance", "ui", "smoke", "no_db_unit"})
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void newWeeklyClientLoanAccountWithQuestionGroups() throws Exception {
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 2, 1, 13, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
String questionGroupTitle = "QG1" + random.nextInt(100);
String question1 = "DT_" + random.nextInt(100);
String question2 = "SS_" + random.nextInt(100);
String answer = "01/01/2010";
String choiceAnswer = "Choice2";
questionGroupHelper.createQuestionGroup(questionGroupTitle, question1, question2, "Create Loan");
loanProductTestHelper.editLoanProductIncludeQuestionsGroups("Flat Interest Loan Product With Fee", questionGroupTitle);
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("client1 lastname");
searchParameters.setLoanProduct("Flat Interest Loan Product With Fee");
CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters();
submitAccountParameters.setAmount("1012.0");
QuestionResponseParameters parameters = new QuestionResponseParameters();
parameters.addTextAnswer("questionGroups[0].sectionDetails[0].questions[0].value", answer);
parameters.addSingleSelectAnswer("questionGroups[0].sectionDetails[0].questions[1].value", choiceAnswer);
LoanAccountPage loanAccountPage = createLoanAccount(searchParameters, submitAccountParameters, parameters);
ViewQuestionResponseDetailPage questionResponseDetailPage = loanAccountPage.navigateToAdditionalInformationPage();
questionResponseDetailPage.verifyPage();
questionResponseDetailPage.verifyQuestionPresent(question1, answer);
questionResponseDetailPage.verifyQuestionPresent(question2, choiceAnswer);
questionResponseDetailPage.navigateToDetailsPage();
questionGroupTestHelper.markQuestionGroupAsInactive(questionGroupTitle);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// add grace period of 10 to "Flat Interest Loan Product With Fee"
@Test(enabled=true)
public void newWeeklyClientLoanAccountWithModifyErrors() throws Exception {
setAppDate(new DateTime(2011, 3, 7, 15, 0, 0, 0));
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("client1 lastname");
searchParameters.setLoanProduct("Flat Interest Loan Product With Fee");
CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters();
submitAccountParameters.setAmount("1012.0");
String loanId = createLoanAndCheckAmount(searchParameters, submitAccountParameters, null);
submitAccountParameters.setAmount("10666.0");
EditLoanAccountInformationParameters editAccountParameters = new EditLoanAccountInformationParameters();
editAccountParameters.setGracePeriod("15");
EditLoanAccountInformationPage editPreviewLoanAccountPage = loanTestHelper.changeLoanAccountInformationWithErrors(loanId, submitAccountParameters, editAccountParameters);
editPreviewLoanAccountPage.verifyErrorInForm("Please specify valid Amount. Amount should be a value between 1 and 10,000, inclusive");
editPreviewLoanAccountPage.verifyErrorInForm("Please specify valid Grace period for repayments. Grace period for repayments should be a value less than 12");
}
@Test(singleThreaded = true, groups = {"loan", "acceptance", "ui"})
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void newWeeklyClientLoanAccountWithDateTypeCustomField() throws Exception {
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("client1 lastname");
searchParameters.setLoanProduct("Flat Interest Loan Product With Fee");
CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters();
submitAccountParameters.setAmount("1012.0");
String loanId = createLoanAndCheckAmount(searchParameters, submitAccountParameters, null);
submitAccountParameters.setAmount("1666.0");
EditLoanAccountInformationParameters editAccountParameters = new EditLoanAccountInformationParameters();
editAccountParameters.setGracePeriod("5");
loanTestHelper.changeLoanAccountInformation(loanId, submitAccountParameters, editAccountParameters);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void newLoanAccountWithThousandSeparator() throws Exception {
//Given
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 2, 1, 13, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Client - Mary Monthly");
searchParameters.setLoanProduct("MonthlyClientFlatLoan1stOfMonth");
CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters();
submitAccountParameters.setAmount("1,234.0");
submitAccountParameters.setGracePeriodTypeNone(true);
//Then
createLoanAndCheckAmount(searchParameters, submitAccountParameters, null);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
//http://mifosforge.jira.com/browse/MIFOSTEST-308
@Test(enabled=true)
public void newMonthlyClientLoanAccountWithMeetingOnSpecificDayOfMonth() throws Exception {
//Given
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 2, 1, 13, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Client - Mary Monthly");
searchParameters.setLoanProduct("MonthlyClientFlatLoan1stOfMonth");
CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters();
submitAccountParameters.setAmount("1234.0");
submitAccountParameters.setGracePeriodTypeNone(true);
//Then
String loanId = createLoanAndCheckAmount(searchParameters, submitAccountParameters, null);
getLoanStatusActive(loanId);
}
@Test(singleThreaded = true, groups = {"loan", "acceptance", "ui"})
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
//http://mifosforge.jira.com/browse/MIFOSTEST-308
// (1,4,'test' to (1,4,'test','2011-02-01'
public void newMonthlyClientLoanAccountWithMeetingOnSameWeekAndWeekdayOfMonth() throws Exception {
//Given
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 2, 1, 13, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Client - Mia Monthly3rdFriday");
searchParameters.setLoanProduct("MonthlyClientFlatLoanThirdFridayOfMonth");
CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters();
submitAccountParameters.setAmount("2765.0");
submitAccountParameters.setGracePeriodTypeNone(true);
//Then
String loanId = createLoanAndCheckAmount(searchParameters, submitAccountParameters, null);
getLoanStatusActive(loanId);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(singleThreaded = true, groups = {"loan", "acceptance", "ui"})
public void newMonthlyClientLoanAccountWithZeroInterestRate() throws Exception {
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Client - Mary Monthly");
searchParameters.setLoanProduct("EmergencyLoanWithZeroInterest");
CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters();
submitAccountParameters.setAmount("1000.0");
submitAccountParameters.setGracePeriodTypeNone(true);
createLoanAndCheckAmount(searchParameters, submitAccountParameters, null);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void tryClientLoanAccountWithAdditionalFees() throws Exception {
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 2, 1, 13, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Client - Mary Monthly");
searchParameters.setLoanProduct("EmergencyLoanWithZeroInterest");
CreateLoanAccountEntryPage loanAccountEntryPage = loanTestHelper.navigateToCreateLoanAccountEntryPage(searchParameters);
loanAccountEntryPage.selectAdditionalFees();
// there should be an error
loanAccountEntryPage.submitAndWaitForPage();
loanAccountEntryPage.verifyError("Multiple instances of the same fee are not allowed.");
// after unselect everything should pass
loanAccountEntryPage.unselectAdditionalFee();
loanAccountEntryPage.clickContinue();
HomePage homePage = loanAccountEntryPage.navigateToHomePage();
homePage.verifyPage();
loanAccountEntryPage = loanTestHelper.navigateToCreateLoanAccountEntryPageWithoutLogout(searchParameters);
loanAccountEntryPage.verifyAdditionalFeesAreEmpty();
}
/**
* Verify a user is prevented to create loan accounts of loan products restricted by the mix.
* http://mifosforge.jira.com/browse/MIFOSTEST-94
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void createLoanAccountsWithRestrictedProductsMix() throws Exception {
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 1, 24, 15, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
DefineNewLoanProductPage.SubmitFormParameters productParams = FormParametersHelper.getWeeklyLoanProductParameters();
productParams.setOfferingName("product94");
productParams.setOfferingShortName("p94");
productParams.setDefaultInterestRate("15.3");
productParams.setMaxInterestRate("50");
productParams.setInterestTypes(SubmitFormParameters.DECLINING_BALANCE);
productParams.setDefaultLoanAmount("13333");
productParams.setDefInstallments("13");
productParams.setApplicableFor(DefineNewLoanProductPage.SubmitFormParameters.GROUPS);
loanProductTestHelper.defineNewLoanProduct(productParams);
productParams.setOfferingName("product94B");
productParams.setOfferingShortName("p94b");
loanProductTestHelper.defineNewLoanProduct(productParams);
CreateLoanAccountSearchParameters searchParams1 = new CreateLoanAccountSearchParameters();
searchParams1.setSearchString("GroupWeekly");
searchParams1.setLoanProduct("product94");
CreateLoanAccountSearchParameters searchParams2 = new CreateLoanAccountSearchParameters();
searchParams2.setSearchString("GroupWeekly");
searchParams2.setLoanProduct("product94B");
DisburseLoanParameters disburseParams = new DisburseLoanParameters();
disburseParams.setPaymentType(DisburseLoanParameters.CASH);
disburseParams.setDisbursalDateDD("24");
disburseParams.setDisbursalDateMM("01");
disburseParams.setDisbursalDateYYYY("2011");
String error = "The loan could not be disbursed as " + searchParams1.getLoanProduct() + " and " + searchParams2.getLoanProduct() + " are not allowed to co-exist";
LoanAccountPage loanAccountPage = loanTestHelper.createTwoLoanAccountsWithMixedRestricedPoducts(searchParams1, searchParams2, disburseParams, new DateTime(2011, 02, 28, 10, 0, 0, 0));
loanAccountPage.verifyError(error);
}
/**
* Verify a user is prevented from creating a second loan account
* (for two or more clients using the bulk loan creation pipeline)
* with a loan product restricted with the first loan.
* http://mifosforge.jira.com/browse/MIFOSTEST-95
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void createMultipleLoanAccountsWithRestrictedProductsMix() throws Exception {
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 3, 18, 13, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
DefineNewLoanProductPage.SubmitFormParameters productParams = FormParametersHelper.getWeeklyLoanProductParameters();
productParams.setOfferingName("product95");
productParams.setOfferingShortName("p95");
productParams.setDefaultInterestRate("15.3");
productParams.setMaxInterestRate("50");
productParams.setInterestTypes(SubmitFormParameters.DECLINING_BALANCE);
productParams.setDefaultLoanAmount("13333");
productParams.setDefInstallments("13");
loanProductTestHelper.defineNewLoanProduct(productParams);
productParams.setOfferingName("product95B");
productParams.setOfferingShortName("p95b");
loanProductTestHelper.defineNewLoanProduct(productParams);
CreateMultipleLoanAccountSelectParameters multipleAccParameters1 = new CreateMultipleLoanAccountSelectParameters();
multipleAccParameters1.setBranch("MyOfficeDHMFT");
multipleAccParameters1.setLoanOfficer("loan officer");
multipleAccParameters1.setCenter("WeeklyMeetingCenter");
multipleAccParameters1.setLoanProduct("product95");
CreateMultipleLoanAccountSelectParameters multipleAccParameters2 = new CreateMultipleLoanAccountSelectParameters();
multipleAccParameters2.setBranch("MyOfficeDHMFT");
multipleAccParameters2.setLoanOfficer("loan officer");
multipleAccParameters2.setCenter("WeeklyMeetingCenter");
multipleAccParameters2.setLoanProduct("product95B");
DisburseLoanParameters disburseParams = new DisburseLoanParameters();
disburseParams.setPaymentType(DisburseLoanParameters.CASH);
disburseParams.setDisbursalDateDD("18");
disburseParams.setDisbursalDateMM("03");
disburseParams.setDisbursalDateYYYY("2011");
String error = "The loan could not be disbursed as " + multipleAccParameters1.getLoanProduct() + " and " + multipleAccParameters2.getLoanProduct() + " are not allowed to co-exist";
String[] clients = new String[1];
clients[0] = "MemberWeekly Group";
String firstRepaymentDate = "21-Mar-2011";
CreateLoanAccountsSuccessPage createLoanAccountsSuccessPage = loanTestHelper.createMultipleLoanAccountsWithMixedRestricedPoducts(multipleAccParameters1, multipleAccParameters2, disburseParams, clients, firstRepaymentDate);
List<String> accountNumbers = createLoanAccountsSuccessPage.verifyAndGetLoanAccountNumbers(clients.length);
LoanAccountPage loanAccountPage = createLoanAccountsSuccessPage.selectLoansAndNavigateToLoanAccountPage(0);
for (int i = 0; i < accountNumbers.size(); i++) {
if (i > 0) {
loanAccountPage = loanAccountPage.navigateToClientsAndAccountsUsingHeaderTab()
.searchForClient(accountNumbers.get(i))
.navigateToLoanAccountSearchResult("Account # " + accountNumbers.get(i));
}
loanAccountPage.changeAccountStatusToAccepted();
loanAccountPage.tryNavigatingToDisburseLoanWithError();
loanAccountPage.verifyError(error);
}
}
private void setDateAsToday() throws UnsupportedEncodingException {
setAppDate(new DateTime(System.currentTimeMillis()));
}
private void setAppDate(DateTime dateTime) throws UnsupportedEncodingException {
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
dateTimeUpdaterRemoteTestingService.setDateTime(dateTime);
}
/**
* Verify loan product created with default loan amount and number of installments
* are "same for all loans" can be used to create new loan accounts with the correct default amounts.
* http://mifosforge.jira.com/browse/MIFOSTEST-97
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
//CreateClient: weekly, Stu12332659912419 Client12332659912419, monday, activate
public void verifyAccountFromProductInstallmentsSame() throws Exception {
setAppDate(new DateTime(2011, 1, 24, 15, 0, 0, 0));
DefineNewLoanProductPage.SubmitFormParameters productParams = FormParametersHelper.getWeeklyLoanProductParameters();
productParams.setOfferingName("ProdTest97");
productParams.setOfferingShortName("T97");
productParams.setMinLoanAmount("1000");
productParams.setMaxLoanAmount("10000");
productParams.setDefaultLoanAmount("5000");
productParams.setMinInstallemnts("10");
productParams.setMaxInstallments("100");
productParams.setDefInstallments("50");
CreateLoanAccountSearchParameters searchParams = new CreateLoanAccountSearchParameters();
searchParams.setSearchString("Stu12332659912419 Client12332659912419");
searchParams.setLoanProduct("ProdTest97");
DisburseLoanParameters disburseParams = new DisburseLoanParameters();
disburseParams.setPaymentType(DisburseLoanParameters.CASH);
disburseParams.setDisbursalDateDD("24");
disburseParams.setDisbursalDateMM("01");
disburseParams.setDisbursalDateYYYY("2011");
ChargeParameters chargeParameters = new ChargeParameters();
chargeParameters.setType(ChargeParameters.MISC_FEES);
chargeParameters.setAmount("599.0");
LoanAccountPage loanAccountPage = loanTestHelper.createProductAndThenAccount(productParams, searchParams, disburseParams);
loanAccountPage.verifyNumberOfInstallments("10", "100", "50");
loanAccountPage.verifyPrincipalBalance("5,000");
loanTestHelper.applyOneChargeOnLoanAccount(chargeParameters);
loanAccountPage.navigateToViewInstallmentDetails()
.verifyInstallmentAmount(4, 1, "599");
}
/**
* Verify the loan product created with default number of installments
* by loan cycle can be used to create new loans accounts.
* http://mifosforge.jira.com/browse/MIFOSTEST-99
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void verifyCreatingLoanAccountsOnProductWithLoanCycles() throws Exception {
setAppDate(new DateTime(2011, 1, 24, 15, 0, 0, 0));
DefineNewLoanProductPage.SubmitFormParameters productParams = FormParametersHelper.getWeeklyLoanProductParameters();
productParams.setOfferingName("ProdTest99");
productParams.setOfferingShortName("T99");
productParams.setMinLoanAmount("1000");
productParams.setMaxLoanAmount("10000");
productParams.setDefaultLoanAmount("5000");
productParams.setCalculateInstallments(SubmitFormParameters.BY_LOAN_CYCLE);
String[][] cycleInstallments = {
{"26", "52", "52"},
{"20", "30", "30"},
{"15", "25", "25"},
{"10", "15", "15"},
{"5", "10", "10"},
{"1", "5", "5"}
};
productParams.setCycleInstallments(cycleInstallments);
CreateLoanAccountSearchParameters searchParams = new CreateLoanAccountSearchParameters();
searchParams.setSearchString("Stu12332659912419 Client12332659912419");
searchParams.setLoanProduct("ProdTest99");
DisburseLoanParameters disburseParams = new DisburseLoanParameters();
disburseParams.setPaymentType(DisburseLoanParameters.CASH);
disburseParams.setDisbursalDateDD("24");
disburseParams.setDisbursalDateMM("01");
disburseParams.setDisbursalDateYYYY("2011");
LoanProductDetailsPage loanProductDetailsPage = loanProductTestHelper.defineNewLoanProduct(productParams);
loanProductDetailsPage.verifyLoanAmountTableTypeSame("1,000", "10,000", "5,000");
loanProductDetailsPage.verifyInstallmentsTableTypeFromCycle(cycleInstallments);
LoanAccountPage loanAccountPage = loanTestHelper.createActivateAndDisburseDefaultLoanAccount(searchParams, disburseParams);
loanAccountPage.verifyNumberOfInstallments("26", "52", "52");
String loan1ID = loanAccountPage.getAccountId();
loanTestHelper.repayLoan(loan1ID);
loanTestHelper.createActivateAndDisburseDefaultLoanAccount(searchParams, disburseParams);
//extension MIFOSTEST-1186
loanAccountPage.navigateToViewLoanAccountActivityPage();
loanAccountPage.verifyPage("ViewLoanAccountActivity");
Assert.assertEquals(selenium.getTable("accountActivityTable.2.1"), "Loan Disbursal");
Assert.assertEquals(selenium.getTable("accountActivityTable.2.2"), "5,000");
Assert.assertEquals(selenium.getTable("accountActivityTable.2.11"), "5,288");
loanAccountPage.navigateBack();
loanAccountPage.verifyNumberOfInstallments("20", "30", "30");
String loan2ID = loanAccountPage.getAccountId();
loanTestHelper.repayLoan(loan2ID);
loanTestHelper.createActivateAndDisburseDefaultLoanAccount(searchParams, disburseParams);
loanAccountPage.verifyNumberOfInstallments("15", "25", "25");
// extension to verify MIFOS-5005
DisburseLoanConfirmationPage disburseLoanConfirmationPage = loanTestHelper.createAndActivateDefaultLoanAccount(searchParams)
.navigateToDisburseLoan()
.submitAndNavigateToDisburseLoanConfirmationPage(disburseParams);
disburseLoanConfirmationPage.submitButDisbursalFailed("This loan cannot be disbursed because the customer already has an active loan for this loan product.");
}
private String createLoanAndCheckAmount(CreateLoanAccountSearchParameters searchParameters,
CreateLoanAccountSubmitParameters submitAccountParameters,
QuestionResponseParameters questionResponseParameters) {
LoanAccountPage loanAccountPage = createLoanAccount(searchParameters, submitAccountParameters, questionResponseParameters);
loanAccountPage.verifyLoanAmount(submitAccountParameters.getAmount());
return loanAccountPage.getAccountId();
}
private LoanAccountPage createLoanAccount(CreateLoanAccountSearchParameters searchParameters,
CreateLoanAccountSubmitParameters submitAccountParameters,
QuestionResponseParameters questionResponseParameters) {
LoanAccountPage loanAccountPage;
if (questionResponseParameters == null) {
loanAccountPage = loanTestHelper.createLoanAccount(searchParameters, submitAccountParameters);
} else {
loanAccountPage = loanTestHelper.createLoanAccount(searchParameters, submitAccountParameters, questionResponseParameters);
}
return loanAccountPage;
}
private void getLoanStatusActive(String loanId) {
EditLoanAccountStatusParameters editLoanAccountStatusParameters = new EditLoanAccountStatusParameters();
editLoanAccountStatusParameters.setStatus(EditLoanAccountStatusParameters.APPROVED);
editLoanAccountStatusParameters.setNote("test");
loanTestHelper.changeLoanAccountStatus(loanId, editLoanAccountStatusParameters);
DisburseLoanParameters disburseParameters = new DisburseLoanParameters();
disburseParameters.setPaymentType(DisburseLoanParameters.CASH);
disburseParameters.setDisbursalDateDD("01");
disburseParameters.setDisbursalDateMM("02");
disburseParameters.setDisbursalDateYYYY("2011");
//Then
loanTestHelper.disburseLoan(loanId, disburseParameters);
}
/**
* Verify functionality of 'Cancel' buttons during the Loan creation flow
* http://mifosforge.jira.com/browse/MIFOSTEST-1178
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void verifyCancelButtons() throws Exception {
ClientsAndAccountsHomepage clientsAndAccountsHomepage = navigationHelper.navigateToClientsAndAccountsPage();
CreateLoanAccountSearchPage createLoanAccountSearchPage = clientsAndAccountsHomepage.navigateToCreateLoanAccountUsingLeftMenu();
createLoanAccountSearchPage.cancel();
clientsAndAccountsHomepage.navigateToCreateLoanAccountUsingLeftMenu();
CreateLoanAccountSearchParameters formParameters = new CreateLoanAccountSearchParameters();
formParameters.setSearchString("%");
createLoanAccountSearchPage.navigateToCreateLoanAccountEntryPage(formParameters);
createLoanAccountSearchPage.cancel();
clientsAndAccountsHomepage.navigateToCreateLoanAccountUsingLeftMenu();
CreateLoanAccountSearchParameters formParameters2 = new CreateLoanAccountSearchParameters();
formParameters2.setSearchString("Client1233266063395");
CreateLoanAccountSelectLoanProductPage createLoanAccountSelectLoanProductPage = createLoanAccountSearchPage.navigateToCreateLoanAccountSelectLoanProductPage(formParameters2);
createLoanAccountSelectLoanProductPage.cancel();
clientsAndAccountsHomepage.navigateToCreateLoanAccountUsingLeftMenu();
formParameters2.setLoanProduct("ClientEmergencyLoan");
CreateLoanAccountEntryPage createLoanAccountEntryPage = createLoanAccountSearchPage.searchAndNavigateToCreateLoanAccountPage(formParameters2);
createLoanAccountEntryPage.cancel();
clientsAndAccountsHomepage.navigateToCreateLoanAccountUsingLeftMenu();
createLoanAccountSearchPage.searchAndNavigateToCreateLoanAccountPage(formParameters2);
CreateLoanAccountReviewInstallmentPage createLoanAccountReviewInstallmentPage = createLoanAccountEntryPage.navigateToReviewInstallmentsPage();
createLoanAccountReviewInstallmentPage.cancel();
clientsAndAccountsHomepage.navigateToCreateLoanAccountUsingLeftMenu();
createLoanAccountSearchPage.searchAndNavigateToCreateLoanAccountPage(formParameters2);
createLoanAccountEntryPage.navigateToReviewInstallmentsPage();
CreateLoanAccountPreviewPage createLoanAccountPreviewPage = createLoanAccountReviewInstallmentPage.clickPreviewAndGoToReviewLoanAccountPage();
createLoanAccountPreviewPage.cancel();
}
/**
* Create a new Client Loan in 'Partial Application' status
* http://mifosforge.jira.com/browse/MIFOSTEST-1177
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void createLoanInPartialApplicationStatus() throws Exception {
setAppDate(new DateTime(2011, 4, 27, 15, 0, 0, 0));
ClientsAndAccountsHomepage clientsAndAccountsHomepage = navigationHelper.navigateToClientsAndAccountsPage();
CreateLoanAccountSearchPage createLoanAccountSearchPage = clientsAndAccountsHomepage.navigateToCreateLoanAccountUsingLeftMenu();
CreateLoanAccountSearchParameters formParameters = new CreateLoanAccountSearchParameters();
formParameters.setSearchString("Client1233266063395");
formParameters.setLoanProduct("ClientEmergencyLoan");
CreateLoanAccountEntryPage createLoanAccountEntryPage = createLoanAccountSearchPage.searchAndNavigateToCreateLoanAccountPage(formParameters);
CreateLoanAccountReviewInstallmentPage createLoanAccountReviewInstallmentPage = createLoanAccountEntryPage.navigateToReviewInstallmentsPage();
verifyFirstInstallmentAndDisbursalDateOnReviewPage();
CreateLoanAccountPreviewPage createLoanAccountPreviewPage = createLoanAccountReviewInstallmentPage.clickPreviewAndGoToReviewLoanAccountPage();
verifyFirstInstallmentAndDisbursalDateOnPreviewPage();
CreateLoanAccountConfirmationPage createLoanAccountConfirmationPage = createLoanAccountPreviewPage.submitForLaterAndNavigateToConfirmationPage();
LoanAccountPage loanAccountPage = createLoanAccountConfirmationPage.navigateToLoanAccountDetailsPage();
loanAccountPage.verifyLoanIsInPartialApplication();
loanAccountPage.verifyNumberOfInstallments("10");
loanAccountPage.verifyDisbursalDate("02/05/2011");
loanAccountPage.verifyPrincipalOriginal("1,000");
loanAccountPage.verifyLoanTotalBalance("1,000");
ViewRepaymentSchedulePage viewRepaymentSchedulePage = loanAccountPage.navigateToViewRepaymentSchedule();
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(3, "09-May-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(4, "16-May-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(5, "23-May-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(6, "30-May-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(7, "06-Jun-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(8, "13-Jun-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(9, "20-Jun-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(10, "27-Jun-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(11, "04-Jul-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(12, "11-Jul-2011");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(3, "100");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(4, "100");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(5, "100");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(6, "100");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(7, "100");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(8, "100");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(9, "100");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(10, "100");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(11, "100");
viewRepaymentSchedulePage.verifyRepaymentScheduleTablePrincipal(12, "100");
viewRepaymentSchedulePage.navigateToLoanAccountPage();
}
private void verifyFirstInstallmentAndDisbursalDateOnReviewPage(){
Assert.assertEquals(selenium.getText("xpath=//div[@class='product-summary']/div[3]/div[2]"), ("02-May-2011"));
Assert.assertEquals(selenium.getTable("installments.1.1"), ("09/05/11"));
}
private void verifyFirstInstallmentAndDisbursalDateOnPreviewPage(){
Assert.assertEquals(selenium.getText("xpath=//div[@class='product-summary'][2]/div[4]/div[2]"), ("02-May-2011"));
Assert.assertEquals(selenium.getTable("installments.1.1"), ("09-May-2011"));
}
public void createDecliningBalanceIRLoanWithFees() throws SQLException {
int interestRate = 25;
int loanAmount = 120;
int numberOfInstallments = 6;
feeTestHelper.createNoRateFee("fixedFee5629", FeesCreatePage.SubmitFormParameters.LOAN, "Upfront", 5);
feeTestHelper.createPeriodicRateFee("periodicFee5629", FeesCreatePage.SubmitFormParameters.LOAN,
FeesCreatePage.SubmitFormParameters.WEEKLY_FEE_RECURRENCE, 1, 4,
FeesCreatePage.SubmitFormParameters.LOAN_AMOUNT_INTEREST);
SubmitFormParameters dbIrLoanProductParams = loanProductTestHelper.defineLoanProductParameters(
numberOfInstallments, loanAmount, interestRate,
DefineNewLoanProductPage.SubmitFormParameters.DECLINING_BALANCE_INTEREST_RECALCULATION, WEEKLY_RECURRENCE_TYPE_ID);
dbIrLoanProductParams.setOfferingName("DbIrProduct5629");
loanProductTestHelper.defineNewLoanProduct(dbIrLoanProductParams);
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Client1233266063395");
searchParameters.setLoanProduct("DbIrProduct5629");
CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters();
submitAccountParameters.setAdditionalFee1("periodicFee5629");
submitAccountParameters.setAdditionalFee2("fixedFee5629");
ViewRepaymentSchedulePage schedulePage = loanTestHelper
.createLoanAccount(searchParameters, submitAccountParameters).navigateToRepaymentSchedulePage();
String[] expectedInterestAmounts = { "0.6", "0.5", "0.4", "0.3", "0.2", "0.7" };
String[] expectedFeeAmounts = { "9.9", "4.9", "4.9", "4.9", "4.9", "4.8" };
for (int i = 0; i < numberOfInstallments; i++) {
schedulePage.verifyInstallmentAmount(ViewRepaymentSchedulePage.FIRST_ROW + i,
ViewRepaymentSchedulePage.INTEREST_COLUMN, expectedInterestAmounts[i]);
schedulePage.verifyInstallmentAmount(ViewRepaymentSchedulePage.FIRST_ROW + i,
ViewRepaymentSchedulePage.FEE_COLUMN, expectedFeeAmounts[i]);
}
}
}