/*
* 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.framework.testhelpers;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.joda.time.DateTime;
import org.joda.time.ReadableInstant;
import org.joda.time.format.DateTimeFormat;
import org.mifos.test.acceptance.framework.AbstractPage;
import org.mifos.test.acceptance.framework.AppLauncher;
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.account.AccountStatus;
import org.mifos.test.acceptance.framework.admin.AdminPage;
import org.mifos.test.acceptance.framework.client.ClientSearchResultsPage;
import org.mifos.test.acceptance.framework.client.ClientViewDetailsPage;
import org.mifos.test.acceptance.framework.loan.AccountActivityPage;
import org.mifos.test.acceptance.framework.loan.AccountChangeStatusPage;
import org.mifos.test.acceptance.framework.loan.ApplyChargePage;
import org.mifos.test.acceptance.framework.loan.ApplyGroupPaymentConfirmationPage;
import org.mifos.test.acceptance.framework.loan.ApplyGroupPaymentPage;
import org.mifos.test.acceptance.framework.loan.ApplyPaymentConfirmationPage;
import org.mifos.test.acceptance.framework.loan.ApplyPaymentPage;
import org.mifos.test.acceptance.framework.loan.ChargeParameters;
import org.mifos.test.acceptance.framework.loan.ClosedAccountsPage;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountCashFlowPage;
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.CreateLoanAccountsEntryPage;
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.DisburseLoanPage;
import org.mifos.test.acceptance.framework.loan.DisburseLoanParameters;
import org.mifos.test.acceptance.framework.loan.DivideGroupChargesPage;
import org.mifos.test.acceptance.framework.loan.EditAccountStatusConfirmationPage;
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.GLIMClient;
import org.mifos.test.acceptance.framework.loan.LoanAccountPage;
import org.mifos.test.acceptance.framework.loan.PaymentParameters;
import org.mifos.test.acceptance.framework.loan.PerformanceHistoryAtributes;
import org.mifos.test.acceptance.framework.loan.QuestionResponseParameters;
import org.mifos.test.acceptance.framework.loan.RedoLoanDisbursalChooseLoanInstancePage;
import org.mifos.test.acceptance.framework.loan.RedoLoanDisbursalEntryPage;
import org.mifos.test.acceptance.framework.loan.RedoLoanDisbursalParameters;
import org.mifos.test.acceptance.framework.loan.RedoLoanDisbursalPreviewPage;
import org.mifos.test.acceptance.framework.loan.RedoLoanDisbursalSchedulePreviewPage;
import org.mifos.test.acceptance.framework.loan.RedoLoanDisbursalSearchPage;
import org.mifos.test.acceptance.framework.loan.RedoLoanDisbursalSearchResultsPage;
import org.mifos.test.acceptance.framework.loan.RepayLoanConfirmationPage;
import org.mifos.test.acceptance.framework.loan.RepayLoanPage;
import org.mifos.test.acceptance.framework.loan.RepayLoanParameters;
import org.mifos.test.acceptance.framework.loan.TransactionHistoryPage;
import org.mifos.test.acceptance.framework.loan.ViewLoanStatusHistoryPage;
import org.mifos.test.acceptance.framework.loanproduct.DefineNewLoanProductPage;
import org.mifos.test.acceptance.framework.loanproduct.EditLoanProductPage;
import org.mifos.test.acceptance.framework.loanproduct.EditLoanProductPreviewPage;
import org.mifos.test.acceptance.framework.loanproduct.LoanProductDetailsPage;
import org.mifos.test.acceptance.framework.loanproduct.ViewLoanProductsPage;
import org.mifos.test.acceptance.framework.login.LoginPage;
import org.mifos.test.acceptance.framework.questionnaire.QuestionResponsePage;
import org.mifos.test.acceptance.framework.search.SearchResultsPage;
import org.mifos.test.acceptance.loanproduct.LoanProductTestHelper;
import org.mifos.test.acceptance.remote.DateTimeUpdaterRemoteTestingService;
import org.springframework.format.number.NumberFormatter;
import org.testng.Assert;
import com.thoughtworks.selenium.Selenium;
/**
* Holds methods common to most loan tests.
*
*/
public class LoanTestHelper {
private final Selenium selenium;
private final NavigationHelper navigationHelper;
private final LoanProductTestHelper loanProductTestHelper;
public final static Boolean METHOD_SUBMIT_FOR_APPROVAL = true;
public final static Boolean METHOD_SAVE_FOR_LATER = false;
public LoanTestHelper(Selenium selenium) {
this.selenium = selenium;
this.navigationHelper = new NavigationHelper(selenium);
this.loanProductTestHelper = new LoanProductTestHelper(selenium);
}
/**
* Creates a loan account.
* @param searchParameters Parameters to find the client/group that will be the owner of the account.
* @param submitAccountParameters The parameters for the loan account.
* @return LoanAccountPage
*/
public LoanAccountPage createLoanAccount(CreateLoanAccountSearchParameters searchParameters,
CreateLoanAccountSubmitParameters submitAccountParameters) {
return navigateToLoanAccountEntryPage(searchParameters)
.submitAndNavigateToLoanAccountConfirmationPage(submitAccountParameters)
.navigateToLoanAccountDetailsPage(submitAccountParameters);
}
/**
* Creates loan account with default paramteres.
* @param searchParameters
* @return
*/
public LoanAccountPage createDefaultLoanAccount(CreateLoanAccountSearchParameters searchParameters) {
return navigationHelper.navigateToClientsAndAccountsPage()
.navigateToCreateLoanAccountUsingLeftMenu()
.searchAndNavigateToCreateLoanAccountPage(searchParameters)
.continuePreviewSubmitAndNavigateToDetailsPage();
}
/**
* Creates a loan account.
* @param loanSaveType : True - submit for approval, False - save for later
* @return LoanAccountPage
*/
public LoanAccountPage createLoanAccountForMultipleClientsInGroup(boolean loanSaveType){
CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters();
searchParameters.setSearchString("Default Group");
searchParameters.setLoanProduct("WeeklyGroupFlatLoanWithOnetimeFee");
CreateLoanAccountEntryPage loanAccountEntryPage = this.navigateToCreateLoanAccountEntryPage(searchParameters);
List<GLIMClient> clients= new ArrayList<GLIMClient>();
clients.add(new GLIMClient(0,"Stu1233266299995 Client1233266299995 \n Client Id: 0002-000000012", "9999.9", "0009-Horse"));
clients.add(new GLIMClient(1, "Stu1233266309851 Client1233266309851 \n Client Id: 0002-000000013", "99999.9", "0001-Cow Purchase"));
clients.add(new GLIMClient(2, "Stu1233266319760 Client1233266319760 \n Client Id: 0002-000000014", "99999.9", "0003-Goat Purchase"));
List<GLIMClient> clients2= new ArrayList<GLIMClient>();
clients2.add(new GLIMClient(0,"Stu1233266299995 Client1233266299995 Client Id: 0002-000000012", "9999.9", "0009-Horse"));
clients2.add(new GLIMClient(1, "Stu1233266309851 Client1233266309851 Client Id: 0002-000000013", "99999.9", "0001-Cow Purchase"));
clients2.add(new GLIMClient(2, "Stu1233266319760 Client1233266319760 Client Id: 0002-000000014", "99999.9", "0003-Goat Purchase"));
for (GLIMClient glimClient : clients2) {
loanAccountEntryPage.selectGLIMClients(glimClient.getClientNumber(), glimClient.getClientName(), glimClient.getLoanAmount(), glimClient.getLoanPurpose());
}
CreateLoanAccountConfirmationPage createLoanAccountConfirmationPage;
if(loanSaveType) {
createLoanAccountConfirmationPage = loanAccountEntryPage.submitAndNavigateToGLIMLoanAccountConfirmationPage();
} else {
createLoanAccountConfirmationPage = loanAccountEntryPage.submitAndNavigateToGLIMLoanAccountConfirmationPageSaveForLaterButton();
}
LoanAccountPage loanAccountPage = createLoanAccountConfirmationPage.navigateToLoanAccountDetailsPage();
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, true);
if(loanSaveType) {
loanAccountPage.verifyLoanIsPendingApproval();
} else {
loanAccountPage.verifyLoanIsInPartialApplication();
}
EditLoanAccountInformationPage editLoanAccountInformationPage = loanAccountPage.navigateToEditAccountInformation();
for (GLIMClient glimClient : clients) {
editLoanAccountInformationPage.verifyGLIMClient(glimClient.getClientNumber(), glimClient.getClientName(), glimClient.getLoanAmount(), glimClient.getLoanPurpose());
}
editLoanAccountInformationPage.navigateBack();
loanAccountPage.verifyGLIMIndividualScheduleLinks(3, true);
return loanAccountPage;
}
public LoanAccountPage createGroupLoanAccount(CreateLoanAccountSearchParameters searchParameters,
List<GLIMClient> glimClients) {
CreateLoanAccountEntryPage loanAccountEntryPage = navigateToCreateLoanAccountEntryPage(searchParameters);
for (GLIMClient client : glimClients) {
loanAccountEntryPage.selectGLIMClients(client.getClientNumber(), client.getClientName(), client.getLoanAmount());
}
CreateLoanAccountReviewInstallmentPage createLoanAccountReviewInstallmentPage =
loanAccountEntryPage.navigateToReviewInstallmentsPage();
CreateLoanAccountPreviewPage createLoanAccountPreviewPage =
createLoanAccountReviewInstallmentPage.clickPreviewAndGoToReviewLoanAccountPage();
CreateLoanAccountConfirmationPage createLoanAccountConfirmationPage =
createLoanAccountPreviewPage.submitForApprovalAndNavigateToConfirmationPage();
return createLoanAccountConfirmationPage.navigateToLoanAccountDetailsPage();
}
/**
* Creates a loan account.
* @param searchParameters Parameters to find the client/group that will be the owner of the account.
* @param submitAccountParameters The parameters for the loan account.
* @param questionResponseParameters The parameters for the create loan question responses.
* @return LoanAccountPage
*/
public LoanAccountPage createLoanAccount(CreateLoanAccountSearchParameters searchParameters,
CreateLoanAccountSubmitParameters submitAccountParameters, QuestionResponseParameters questionResponseParameters) {
return navigateToLoanAccountEntryPage(searchParameters)
.submitAndNavigateToLoanAccountConfirmationPage(submitAccountParameters, questionResponseParameters)
.navigateToLoanAccountDetailsPage();
}
private CreateLoanAccountEntryPage navigateToLoanAccountEntryPage(CreateLoanAccountSearchParameters searchParameters) {
CreateLoanAccountSearchPage createLoanAccountSearchPage = navigateToCreateLoanAccountSearchPage();
createLoanAccountSearchPage.verifyPage();
CreateLoanAccountEntryPage createLoanAccountEntryPage = createLoanAccountSearchPage
.searchAndNavigateToCreateLoanAccountPage(searchParameters);
createLoanAccountEntryPage.verifyPage();
return createLoanAccountEntryPage;
}
/**
* TODO: Create a helper for creating a GLIM loan account.
*/
/**
* Edits the loan account with id loanId and updates its settings with the ones in params.
* @param loanId The account id.
* @param accountSubmitParameters The create loan parameters.
* @param editAccountParameters The edit loan parameters.
* @return edit preview loan account page
*/
public LoanAccountPage changeLoanAccountInformation(String loanId, CreateLoanAccountSubmitParameters accountSubmitParameters, EditLoanAccountInformationParameters editAccountParameters) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
EditLoanAccountInformationPage editLoanAccountInformationPage = loanAccountPage.navigateToEditAccountInformation();
EditPreviewLoanAccountPage editPreviewLoanAccountPage = editLoanAccountInformationPage.editAccountParams(accountSubmitParameters, editAccountParameters).submitAndNavigateToAccountInformationPreviewPage();
loanAccountPage = editPreviewLoanAccountPage.submitAndNavigateToLoanAccountPage();
loanAccountPage.verifyLoanDetails(accountSubmitParameters, editAccountParameters);
return loanAccountPage;
}
public EditLoanAccountInformationPage changeLoanAccountInformationWithErrors(String loanId, CreateLoanAccountSubmitParameters accountSubmitParameters, EditLoanAccountInformationParameters editAccountParameters) {
return navigationHelper.navigateToLoanAccountPage(loanId).
navigateToEditAccountInformation().
editAccountParams(accountSubmitParameters, editAccountParameters).
submitWithErrors();
}
/**
* Edits the loan account with id loanId and updates its settings with the ones in params.
* @param loanId The account id.
* @param params The status parameters.
*/
public void changeLoanAccountStatus(String loanId, EditLoanAccountStatusParameters params) {
changeLoanAccountStatusProvidingQuestionGroupResponses(loanId, params, null);
}
public void activateLoanAccount(String loanId){
EditLoanAccountStatusParameters editLoanAccountStatusParameters = new EditLoanAccountStatusParameters();
editLoanAccountStatusParameters.setStatus(AccountStatus.LOAN_APPROVED.getStatusText());
editLoanAccountStatusParameters.setNote("Activate account");
changeLoanAccountStatus(loanId, editLoanAccountStatusParameters);
}
public void changeLoanAccountStatusProvidingQuestionGroupResponses(String loanId, EditLoanAccountStatusParameters params, QuestionResponseParameters responseParameters) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
AccountChangeStatusPage accountChangeStatusPage = loanAccountPage.navigateToEditAccountStatus();
EditAccountStatusConfirmationPage editAccountStatusConfirmationPage = accountChangeStatusPage.submitAndNavigateToNextPage(params);
if (responseParameters != null) {
populateQuestionGroupResponses(responseParameters);
}
loanAccountPage = editAccountStatusConfirmationPage.submitAndNavigateToLoanAccountPage();
loanAccountPage.verifyStatus(params.getStatus(), params.getCancelReason());
}
public void verifyLastEntryInStatusHistory(String loanId, String oldStatus, String newStatus) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
ViewLoanStatusHistoryPage viewLoanStatusHistoryPage = loanAccountPage.navigateToViewLoanStatusHistoryPage();
viewLoanStatusHistoryPage.verifyLastEntryInStatusHistory(oldStatus, newStatus);
}
private void populateQuestionGroupResponses(QuestionResponseParameters responseParameters) {
QuestionResponsePage responsePage = new QuestionResponsePage(selenium);
responsePage.populateAnswers(responseParameters);
responsePage.navigateToNextPage();
}
/**
* Disburses the loan with id <tt>loanId</tt>.
* @param loanId The system/global id of the loan that'll be disbursed.
* @param disburseParameters The disbursal parameters.
* @return The loan account page of the loan account with id loanId.
*/
public LoanAccountPage disburseLoan(String loanId, DisburseLoanParameters disburseParameters) {
DisburseLoanPage disburseLoanPage = prepareToDisburseLoan(loanId);
DisburseLoanConfirmationPage disburseLoanConfirmationPage = disburseLoanPage.submitAndNavigateToDisburseLoanConfirmationPage(disburseParameters);
LoanAccountPage loanAccountPage = disburseLoanConfirmationPage.submitAndNavigateToLoanAccountPage();
loanAccountPage.verifyStatus(LoanAccountPage.ACTIVE);
return loanAccountPage;
}
public void disburseLoanWithWrongParams(String loanId, DisburseLoanParameters params, String msg) {
DisburseLoanPage disburseLoanPage = prepareToDisburseLoan(loanId);
disburseLoanPage.submitWithWrongParams(params,msg);
prepareToDisburseLoan(loanId);
}
public void enableInterestWaiver(String loanProduct, boolean interestWaiver) {
AdminPage adminPage = navigationHelper.navigateToAdminPage();
ViewLoanProductsPage viewLoanProducts = adminPage.navigateToViewLoanProducts();
LoanProductDetailsPage loanProductDetailsPage = viewLoanProducts.viewLoanProductDetails(loanProduct);
EditLoanProductPage editLoanProductPage = loanProductDetailsPage.editLoanProduct();
DefineNewLoanProductPage.SubmitFormParameters formParameters = new DefineNewLoanProductPage.SubmitFormParameters();
formParameters.setInterestWaiver(interestWaiver);
EditLoanProductPreviewPage editLoanProductPreviewPage = editLoanProductPage.submitInterestWaiverChanges(formParameters);
editLoanProductPreviewPage.submit();
}
public DisburseLoanPage prepareToDisburseLoan(String loanId) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
return loanAccountPage.navigateToDisburseLoan();
}
/**
* Applies a charge to the loan account with id <tt>loanId</tt>.
* @param loanId The account id.
* @param params The charge parameters (amount and type).
* @return The loan account page for the loan account.
*/
public LoanAccountPage applyCharge(String loanId, ChargeParameters params) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
ApplyChargePage applyChargePage = loanAccountPage.navigateToApplyCharge();
loanAccountPage = applyChargePage.submitAndNavigateToApplyChargeConfirmationPage(params);
return loanAccountPage;
}
/**
* Applies a charge to the loan account with id <tt>loanId</tt>. Uses the fee label
* rather than type value to select the fee.
* @param loanId The account id.
* @param params The charge parameters (amount and type).
* @return The loan account page for the loan account.
*/
public LoanAccountPage applyChargeUsingFeeLabel(String loanId, ChargeParameters params) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
ApplyChargePage applyChargePage = loanAccountPage.navigateToApplyCharge();
loanAccountPage = applyChargePage.submitUsingLabelAndNavigateToApplyChargeConfirmationPage(params);
return loanAccountPage;
}
/**
* Applies a charge to the group loan account with id <tt>loanId</tt>.
* @param loanId The account id.
* @param params The charge parameters (amount, type and list of amounts for member accounts).
* @return The loan account page for the group loan account.
*/
public LoanAccountPage applyChargeToGroupLoan(String loanId, ChargeParameters params) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
ApplyChargePage applyChargePage = loanAccountPage.navigateToApplyCharge();
DivideGroupChargesPage divideGroupChargesPage = applyChargePage.submitAndNavigateToDivideGroupChargesPage(params);
loanAccountPage = divideGroupChargesPage.submitAndNavigateToLoanAccountPage(params);
return loanAccountPage;
}
/**
* Repay loan account with id <tt>loanId</tt>.
* @param loanId The account id.
* @return The loan account page for the loan account.
*/
public LoanAccountPage repayLoan(String loanId) {
RepayLoanParameters params = new RepayLoanParameters();
params.setModeOfRepayment(RepayLoanParameters.CASH);
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
RepayLoanPage repayLoanPage = loanAccountPage.navigateToRepayLoan();
RepayLoanConfirmationPage repayLoanConfirmationPage = repayLoanPage.submitAndNavigateToRepayLoanConfirmationPage(params);
loanAccountPage = repayLoanConfirmationPage.submitAndNavigateToLoanAccountDetailsPage();
loanAccountPage.verifyStatus(LoanAccountPage.CLOSED);
return loanAccountPage;
}
/**
* Applies a payment to the loan account with id <tt>loanId</tt>.
* @param loanId The account id.
* @param paymentParams The payment parameters.
* @return The loan account page for the loan account.
*/
public LoanAccountPage applyPayment(String loanId, PaymentParameters paymentParams) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
ApplyPaymentPage applyPaymentPage = loanAccountPage.navigateToApplyPayment();
ApplyPaymentConfirmationPage applyPaymentConfirmationPage = applyPaymentPage.submitAndNavigateToApplyPaymentConfirmationPage(paymentParams);
loanAccountPage = applyPaymentConfirmationPage.submitAndNavigateToLoanAccountDetailsPage();
AccountActivityPage accountActivityPage = loanAccountPage.navigateToAccountActivityPage();
accountActivityPage.verifyLastTotalPaid(paymentParams.getAmount(), 2);
accountActivityPage.navigateBack();
return loanAccountPage;
}
public LoanAccountPage applyGroupPayment(String loanId, PaymentParameters paymentParams) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
ApplyGroupPaymentPage applyGroupPaymentPage = loanAccountPage.navigateToApplyGroupPayment();
ApplyGroupPaymentConfirmationPage applyGroupPaymentConfirmationPage = applyGroupPaymentPage.submitAndNavigateToApplyGroupPaymentConfirmationPage(paymentParams, true);
loanAccountPage = applyGroupPaymentConfirmationPage.submitAndNavigateToLoanAccountDetailsPage();
return loanAccountPage;
}
public LoanAccountPage applyGroupIndividualClientPayment(String loanId, PaymentParameters paymentParams) {
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
ApplyGroupPaymentPage applyGroupPaymentPage = loanAccountPage.navigateToApplyGroupPayment();
ApplyGroupPaymentConfirmationPage applyGroupPaymentConfirmationPage = applyGroupPaymentPage.submitAndNavigateToApplyGroupPaymentConfirmationPage(paymentParams, false);
loanAccountPage = applyGroupPaymentConfirmationPage.submitAndNavigateToLoanAccountDetailsPage();
return loanAccountPage;
}
/**
* Waive the fee associated with the loan account with id <tt>loanId</tt>.
* @param loanId The loan account id.
*/
public void waiveFee(String loanId) {
navigationHelper.navigateToLoanAccountPage(loanId).
navigateToViewNextInstallmentDetails().
waiveFee();
}
/**
* Waive the penalty associated with the loan account with id <tt>loanId</tt>.
* @param loanId The loan account id.
*/
public void waivePenalty(String loanId) {
navigationHelper.navigateToLoanAccountPage(loanId).
navigateToViewNextInstallmentDetails().
waivePenalty();
}
public RedoLoanDisbursalPreviewPage redoLoanDisbursalWithoutNavigate(String clientName, String loanProduct,
RedoLoanDisbursalParameters paramsPastDate) {
RedoLoanDisbursalEntryPage dataEntryPage = submitAndNavigateToRedoLoanDisbursal(clientName, loanProduct);
RedoLoanDisbursalSchedulePreviewPage schedulePreviewPage = dataEntryPage
.submitAndNavigateToRedoLoanDisbursalSchedulePreviewPage(paramsPastDate);
return schedulePreviewPage.submitAndNavigateToRedoLoanDisbursalPreviewPage().submit();
}
private RedoLoanDisbursalEntryPage submitAndNavigateToRedoLoanDisbursal(String clientName, String loanProduct) {
RedoLoanDisbursalEntryPage dataEntryPage = navigationHelper.navigateToAdminPage().navigateToRedoLoanDisbursal()
.searchAndNavigateToRedoLoanDisbursalPage(clientName)
.navigateToRedoLoanDisbursalChooseLoanProductPage(clientName)
.submitAndNavigateToRedoLoanDisbursalEntryPage(loanProduct);
return dataEntryPage;
}
/**
* Redoes the loan disbursal.
* @param clientName The name of the client.
* @param loanProduct The name of the loan product.
* @param paramsPastDate The parameters for the loan disbursal (past date).
* @param paramsCurrentDate The parameters for the loan disbursal (current date).
* @param amountPaid The amount typed in second pay row. Used to pay whole loan.
* @return LoanAccountPage
*/
public LoanAccountPage redoLoanDisbursal(String clientName, String loanProduct, RedoLoanDisbursalParameters paramsPastDate, RedoLoanDisbursalParameters paramsCurrentDate, int amountPaid, boolean testForm) {
RedoLoanDisbursalEntryPage dataEntryPage = submitAndNavigateToRedoLoanDisbursal(clientName, loanProduct);
if(paramsCurrentDate != null) { // tests current or future date if need to.
dataEntryPage = dataEntryPage.submitInvalidDataAndReloadPageWithInputError(paramsCurrentDate);
dataEntryPage.verifyFutureDateInputError();
}
if(testForm) { // tests clear form
RedoLoanDisbursalParameters clearedParameters = RedoLoanDisbursalParameters.createObjectWithClearedParameters();
dataEntryPage = dataEntryPage.submitInvalidDataAndReloadPageWithInputError(clearedParameters);
dataEntryPage.verifyAllFormErrors();
}
RedoLoanDisbursalSchedulePreviewPage schedulePreviewPage = dataEntryPage.submitAndNavigateToRedoLoanDisbursalSchedulePreviewPage(paramsPastDate);
if(amountPaid != 0) { // used to pay grater amount than default (ex. for closing loan)
schedulePreviewPage.typeAmountPaid(amountPaid, 2);
}
return schedulePreviewPage
.submitAndNavigateToRedoLoanDisbursalPreviewPage()
.submitAndNavigateToLoanAccountConfirmationPage()
.navigateToLoanAccountDetailsPage();
}
public LoanAccountPage redoLoanDisbursalWithGLIMandLSIM(String clientName, String loanProduct, RedoLoanDisbursalParameters paramsPastDate) {
AdminPage adminPage = navigationHelper.navigateToAdminPage();
RedoLoanDisbursalSearchPage searchPage = adminPage.navigateToRedoLoanDisbursal();
RedoLoanDisbursalSearchResultsPage resultsPage = searchPage.searchAndNavigateToRedoLoanDisbursalPage(clientName);
RedoLoanDisbursalChooseLoanInstancePage chooseProductPage = resultsPage.navigateToRedoLoanDisbursalChooseLoanProductPage(clientName);
RedoLoanDisbursalEntryPage accountDetailsPage = chooseProductPage.submitAndNavigateToRedoLoanDisbursalEntryPage(loanProduct);
return accountDetailsPage.submitWithGLIMandLSIPAndNavigateToPreviewPage(paramsPastDate)
.submitAndNavigateToRedoLoanDisbursalPreviewPage()
.submitAndNavigateToLoanAccountConfirmationPage()
.navigateToLoanAccountDetailsPage();
// return navigationHelper
// .navigateToAdminPage()
// .navigateToRedoLoanDisbursal()
// .searchAndNavigateToRedoLoanDisbursalPage(clientName)
// .navigateToRedoLoanDisbursalChooseLoanProductPage(clientName)
// .submitAndNavigateToRedoLoanDisbursalEntryPage(loanProduct)
}
/**
*
* Reverses the loan disbursal account
* @param accountID the id of loan account that should be reversed
*/
public MifosPage reverseLoanDisbursal(String accountID, String clientID, boolean isGroup, String resultClickLink) {
ClientSearchResultsPage clientSearchResultsPage = navigationHelper
.navigateToAdminPage()
.navigateToUndoLoanDisbursal()
.searchAndNavigateToUndoLoanDisbursalPage(accountID)
.submitAndNavigateToUndoLoanDisbursalConfirmationPage("test reverse loan disembursal note")
.submitAndNavigateToAdminPage()
.navigateToClientsAndAccountsUsingHeaderTab()
.searchForClient(clientID);
MifosPage searchResultsPage;
if(isGroup) {
searchResultsPage = clientSearchResultsPage.navigateToGroupSearchResult(resultClickLink);
}
else {
searchResultsPage = clientSearchResultsPage.navigateToSearchResult(resultClickLink);
}
return searchResultsPage;
}
/**
* Small verification of reversed loan.
* @param closedAccountPage
* @param loanID
*/
public void verifyHistoryAndSummaryReversedLoan(ClosedAccountsPage closedAccountPage, String loanID) {
verifyHistoryAndSummaryReversedLoan(closedAccountPage, loanID, null, null, null, 0);
}
/**
* Extended verification of reversed loan.
* @param closedAccountPage
* @param loanID
* @param totalOriginalLoan
* @param totalAmountPaid
* @param totalLoanBalance
* @param transactionCount
*/
public void verifyHistoryAndSummaryReversedLoan(ClosedAccountsPage closedAccountPage, String loanID, String totalOriginalLoan, String totalAmountPaid, String totalLoanBalance, int transactionCount) {
LoanAccountPage loanAccountPage = closedAccountPage.verifyAndNavigateToOneClosedLoan(loanID);
loanAccountPage.verifyStatus(EditLoanAccountStatusParameters.CANCEL, EditLoanAccountStatusParameters.CANCEL_REASON_LOAN_REVERSAL);
if(totalOriginalLoan != null) {
loanAccountPage.verifyTotalOriginalLoan(totalOriginalLoan);
loanAccountPage.verifyTotalAmountPaid(totalAmountPaid);
loanAccountPage.verifyLoanTotalBalance(totalLoanBalance);
loanAccountPage.verifyClosedLoanPerformanceHistory();
TransactionHistoryPage transactionHistoryPage = loanAccountPage.navigateToTransactionHistory();
transactionHistoryPage.verifyTransactionHistory(0, transactionCount, 4);
}
}
public LoanAccountPage navigateToLoanAccountPage(CreateLoanAccountSearchParameters searchParams) {
String searchString = searchParams.getSearchString();
LoginPage loginPage = new AppLauncher(selenium).launchMifos().logout();
loginPage.verifyPage();
HomePage homePage = loginPage.loginSuccessfullyUsingDefaultCredentials();
homePage.verifyPage();
SearchResultsPage searchResultsPage = homePage.search(searchString);
return searchResultsPage.navigateToLoanAccountDetailPage(searchString);
}
private CreateLoanAccountSearchPage navigateToCreateLoanAccountSearchPage() {
LoginPage loginPage = new AppLauncher(selenium).launchMifos().logout();
loginPage.verifyPage();
HomePage homePage = loginPage.loginSuccessfullyUsingDefaultCredentials();
homePage.verifyPage();
ClientsAndAccountsHomepage clientsAndAccountsPage = homePage.navigateToClientsAndAccountsUsingHeaderTab();
return clientsAndAccountsPage.navigateToCreateLoanAccountUsingLeftMenu();
}
public CreateLoanAccountEntryPage navigateToCreateLoanAccountEntryPage(CreateLoanAccountSearchParameters searchParameters) {
return navigateToLoanAccountEntryPage(searchParameters);
}
public CreateLoanAccountEntryPage navigateToCreateLoanAccountEntryPageWithoutLogout(CreateLoanAccountSearchParameters searchParameters) {
ClientsAndAccountsHomepage clientsAndAccountsPage = new HomePage(selenium).navigateToClientsAndAccountsUsingHeaderTab();
CreateLoanAccountSearchPage createLoanAccountSearchPage = clientsAndAccountsPage.navigateToCreateLoanAccountUsingLeftMenu();
createLoanAccountSearchPage.verifyPage();
CreateLoanAccountEntryPage createLoanAccountEntryPage = createLoanAccountSearchPage
.searchAndNavigateToCreateLoanAccountPage(searchParameters);
createLoanAccountEntryPage.verifyPage();
return createLoanAccountEntryPage;
}
public DisburseLoanPage prepareToDisburseLoanWithoutLogout(HomePage homePage, String loanId) {
SearchResultsPage searchResultsPage = homePage.search(loanId);
searchResultsPage.verifyPage();
LoanAccountPage loanAccountPage = searchResultsPage.navigateToLoanAccountDetailPage(loanId);
return loanAccountPage.navigateToDisburseLoan();
}
public CreateLoanAccountEntryPage navigateToCreateLoanAccountEntryPageWithoutLogout(String clientName, String loanProductName) {
return navigateToCreateLoanAccountEntryPageWithoutLogout(setLoanSearchParameters(clientName,loanProductName));
}
public CreateLoanAccountSearchParameters setLoanSearchParameters(String clientName, String loanProductName) {
CreateLoanAccountSearchParameters accountSearchParameters = new CreateLoanAccountSearchParameters();
accountSearchParameters.setSearchString(clientName);
accountSearchParameters.setLoanProduct(loanProductName);
return accountSearchParameters;
}
public AbstractPage setApplicationTime(DateTime systemDateTime) throws UnsupportedEncodingException {
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
dateTimeUpdaterRemoteTestingService.setDateTime(systemDateTime);
return new AbstractPage(selenium);
}
public PaymentParameters setPaymentParams(String amount, ReadableInstant paymentDate) {
String dd = DateTimeFormat.forPattern("dd").print(paymentDate);
String mm = DateTimeFormat.forPattern("MM").print(paymentDate);
String yyyy = DateTimeFormat.forPattern("yyyy").print(paymentDate);
PaymentParameters paymentParameters = new PaymentParameters();
paymentParameters.setAmount(amount);
paymentParameters.setTransactionDateDD(dd);
paymentParameters.setTransactionDateMM(mm);
paymentParameters.setTransactionDateYYYY(yyyy);
paymentParameters.setPaymentType(PaymentParameters.CASH);
return paymentParameters;
}
public DisburseLoanParameters setDisbursalParams(ReadableInstant validDisbursalDate) {
DisburseLoanParameters disburseLoanParameters = new DisburseLoanParameters();
String dd = DateTimeFormat.forPattern("dd").print(validDisbursalDate);
String mm = DateTimeFormat.forPattern("MM").print(validDisbursalDate);
String yyyy = DateTimeFormat.forPattern("yyyy").print(validDisbursalDate);
disburseLoanParameters.setDisbursalDateDD(dd);
disburseLoanParameters.setDisbursalDateMM(mm);
disburseLoanParameters.setDisbursalDateYYYY(yyyy);
disburseLoanParameters.setPaymentType(DisburseLoanParameters.CASH);
return disburseLoanParameters;
}
public EditLoanAccountStatusParameters setApprovedStatusParameters() {
EditLoanAccountStatusParameters loanAccountStatusParameters = new EditLoanAccountStatusParameters();
loanAccountStatusParameters.setStatus(EditLoanAccountStatusParameters.APPROVED);
loanAccountStatusParameters.setNote("test notes");
return loanAccountStatusParameters;
}
public LoanAccountPage approveLoan(){
return new LoanAccountPage(selenium).
navigateToEditAccountStatus().
submitAndNavigateToNextPage(setApprovedStatusParameters()).
submitAndNavigateToLoanAccountPage();
}
public LoanAccountPage applyCharge(String feeName, String amount) {
ChargeParameters chargeParameters = new ChargeParameters();
chargeParameters.setType(feeName);
chargeParameters.setAmount(amount);
return new LoanAccountPage(selenium).navigateToApplyCharge().submitAndNavigateToApplyChargeConfirmationPage(chargeParameters);
}
public void verifyTransactionHistory(String loanId, Double paymentAmount){
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage(loanId);
TransactionHistoryPage transactionHistoryPage = loanAccountPage.navigateToTransactionHistory();
transactionHistoryPage.verifyTransactionHistory(paymentAmount, 1, 6);
}
public LoanAccountPage createTwoLoanAccountsWithMixedRestricedPoducts(CreateLoanAccountSearchParameters searchParams1, CreateLoanAccountSearchParameters searchParams2, DisburseLoanParameters disburseParams, DateTime disbursalDate) {
LoanAccountPage loanAccountPage = navigationHelper
.navigateToAdminPage()
.navigateToDefineProductMix()
.createOneMixAndNavigateToClientsAndAccounts(searchParams1.getLoanProduct(), searchParams2.getLoanProduct())
.navigateToCreateLoanAccountUsingLeftMenu()
.searchAndNavigateToCreateLoanAccountPage(searchParams1)
.setDisbursalDate(disbursalDate)
.continuePreviewSubmitAndNavigateToDetailsPage();
loanAccountPage.changeAccountStatusToAccepted();
loanAccountPage.navigateToDisburseLoan()
.submitAndNavigateToDisburseLoanConfirmationPage(disburseParams)
.submitAndNavigateToLoanAccountPage();
// create second account and try to disburse
return loanAccountPage.navigateToClientsAndAccountsUsingHeaderTab()
.navigateToCreateLoanAccountUsingLeftMenu()
.searchAndNavigateToCreateLoanAccountPage(searchParams2)
.setDisbursalDate(disbursalDate)
.continuePreviewSubmitAndNavigateToDetailsPage()
.changeAccountStatusToAccepted()
.tryNavigatingToDisburseLoanWithError();
}
/**
* Creates multiple accounts and navigates to creation success page.
* Must be on Clients And Accounts page.
* @param multipleAccParameters
* @param clients
* @param loanPurpose
* @return
*/
public CreateLoanAccountsSuccessPage createMultipleLoanAccounts(CreateMultipleLoanAccountSelectParameters multipleAccParameters, String[] clients, String loanPurpose) {
CreateLoanAccountsEntryPage createLoanAccountsEntryPage = navigationHelper.navigateToClientsAndAccountsPage()
.navigateToCreateMultipleLoanAccountsUsingLeftMenu()
.searchAndNavigateToCreateMultipleLoanAccountsEntryPage(multipleAccParameters);
for(int i = 0; i < clients.length; i++) {
createLoanAccountsEntryPage.selectClients(i, clients[i]);
createLoanAccountsEntryPage.updateLoanPurposeForClient(i, loanPurpose);
}
return createLoanAccountsEntryPage.submitAndNavigateToCreateMultipleLoanAccountsSuccessPage();
}
public void createMultipleLoanAccountsAndVerify(CreateMultipleLoanAccountSelectParameters multipleAccParameters, String[] clients, String loanPurpose, Boolean saveMethod) {
String [] clientsInstallments = loanProductTestHelper.getDefaultNoOfInstallmentsForClients(clients, multipleAccParameters.getLoanProduct());
CreateLoanAccountsEntryPage createLoanAccountsEntryPage = navigationHelper.navigateToClientsAndAccountsPage()
.navigateToCreateMultipleLoanAccountsUsingLeftMenu()
.searchAndNavigateToCreateMultipleLoanAccountsEntryPage(multipleAccParameters);
for(int i = 0; i < clients.length; i++) {
createLoanAccountsEntryPage.selectClients(i, clients[i]);
createLoanAccountsEntryPage.updateLoanPurposeForClient(i, loanPurpose);
createLoanAccountsEntryPage.verifyNoOfInstallments(i+1, "10");
}
LoanAccountPage loanAccountPage;
CreateLoanAccountsSuccessPage createLoanAccountsSuccessPage;
if(saveMethod){
createLoanAccountsSuccessPage = createLoanAccountsEntryPage.submitAndNavigateToCreateMultipleLoanAccountsSuccessPage();
}
else{
createLoanAccountsSuccessPage = createLoanAccountsEntryPage.saveAndNavigateToCreateMultipleLoanAccountsSuccessPage();
}
List<String> accountNumbers = createLoanAccountsSuccessPage.verifyAndGetLoanAccountNumbers(clients.length);
for(int i = 0; i < accountNumbers.size(); i++) {
if(i > 0) {
loanAccountPage = navigationHelper.navigateToClientsAndAccountsPage()
.searchForClient(accountNumbers.get(i))
.navigateToLoanAccountSearchResult("Account # "+accountNumbers.get(i));
if(saveMethod){
loanAccountPage.verifyLoanStatus(AccountStatus.LOAN_PENDING_APPROVAL.getStatusText());
}
else{
loanAccountPage.verifyLoanStatus(AccountStatus.LOAN_PARTIAL.getStatusText());
}
loanAccountPage.verifyNumberOfInstallments("10");
}
}
}
public void verifyLoansAreNotOnClientsLoanLists(String[] clients, String productName) {
ClientsAndAccountsHomepage clientsAndAccountsHomepage = navigationHelper.navigateToClientsAndAccountsPage();
for(String client : clients) {
ClientViewDetailsPage clientViewDetailsPage = clientsAndAccountsHomepage
.searchForClient(client)
.navigateToSearchResult(client);
clientViewDetailsPage.verifyLoanDoesntExist(productName);
clientsAndAccountsHomepage = clientViewDetailsPage.navigateToClientsAndAccountsPageUsingHeaderTab();
}
}
public CreateLoanAccountsSuccessPage createMultipleLoanAccountsWithMixedRestricedPoducts(CreateMultipleLoanAccountSelectParameters multipleAccParameters1,
CreateMultipleLoanAccountSelectParameters multipleAccParameters2,
DisburseLoanParameters disburseParams, String[] clients, String firstRepaymentDate) {
navigationHelper.navigateToAdminPage()
.navigateToDefineProductMix()
.createOneMixAndNavigateToClientsAndAccounts(multipleAccParameters1.getLoanProduct(), multipleAccParameters2.getLoanProduct());
CreateLoanAccountsSuccessPage createLoanAccountsSuccessPage = createMultipleLoanAccounts(multipleAccParameters1, clients, "0000-Animal Husbandry");
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.navigateToDisburseLoan()
.submitAndNavigateToDisburseLoanConfirmationPage(disburseParams)
.submitAndNavigateToLoanAccountPage();
// additional schedule verification due to MIFOS-4943
loanAccountPage.navigateToRepaymentSchedulePage();
Assert.assertEquals(selenium.getTable("installments.3.1").trim(), firstRepaymentDate);
}
loanAccountPage.navigateToClientsAndAccountsUsingHeaderTab();
return createMultipleLoanAccounts(multipleAccParameters2, clients, "0000-Animal Husbandry");
}
public void verifyPerformenceHistory(String clientName, PerformanceHistoryAtributes performanceHistoryAtributes){
ClientViewDetailsPage clientViewDetailsPage = navigationHelper.navigateToClientViewDetailsPage(clientName);
clientViewDetailsPage.verifyPerformanceHistory(performanceHistoryAtributes);
}
/**
* Apply one charge to account.
* Need to be on LoanAccountPage.
* @param chargeParameters
* @return
*/
public LoanAccountPage applyOneChargeOnLoanAccount(ChargeParameters chargeParameters) {
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium);
return loanAccountPage.navigateToApplyCharge()
.submitAndNavigateToApplyChargeConfirmationPage(chargeParameters);
}
public LoanAccountPage createProductAndThenAccount(DefineNewLoanProductPage.SubmitFormParameters productParams, CreateLoanAccountSearchParameters searchParams, DisburseLoanParameters disburseParams) {
DefineNewLoanProductPage defineNewLoanProductPage = navigationHelper
.navigateToAdminPage()
.navigateToDefineLoanProduct();
defineNewLoanProductPage.fillLoanParameters(productParams);
return defineNewLoanProductPage
.submitAndGotoNewLoanProductPreviewPage()
.submit()
.navigateToClientsAndAccountsUsingHeaderTab()
.navigateToCreateLoanAccountUsingLeftMenu()
.searchAndNavigateToCreateLoanAccountPage(searchParams)
.continuePreviewSubmitAndNavigateToDetailsPage()
.changeAccountStatusToAccepted()
.navigateToDisburseLoan()
.submitAndNavigateToDisburseLoanConfirmationPage(disburseParams)
.submitAndNavigateToLoanAccountPage();
}
public LoanAccountPage createAndActivateDefaultLoanAccount(CreateLoanAccountSearchParameters searchParams) {
CreateLoanAccountEntryPage createLoanAccountEntryPage = navigationHelper
.navigateToClientsAndAccountsPage()
.navigateToCreateLoanAccountUsingLeftMenu()
.searchAndNavigateToCreateLoanAccountPage(searchParams);
createLoanAccountEntryPage.setLonaPurpose("0013-Hybrid Cow");
Double loanAmountDouble = Double.valueOf(createLoanAccountEntryPage.getLoanAmount());
String loanAmount = new NumberFormatter().print(loanAmountDouble, Locale.ENGLISH);
CreateLoanAccountReviewInstallmentPage createLoanAccountReviewInstallmentPage = createLoanAccountEntryPage.clickContinue();
createLoanAccountReviewInstallmentPage = createLoanAccountReviewInstallmentPage.verifyPage();
createLoanAccountReviewInstallmentPage.verifyLoanAmount(loanAmount);
CreateLoanAccountPreviewPage createLoanAccountPreviewPage = createLoanAccountReviewInstallmentPage.clickPreviewAndGoToReviewLoanAccountPage();
createLoanAccountPreviewPage.verifyLoanAmount(loanAmount);
return createLoanAccountPreviewPage
.submit()
.navigateToLoanAccountDetailsPage()
.changeAccountStatusToAccepted();
}
public LoanAccountPage createActivateAndDisburseDefaultLoanAccount(CreateLoanAccountSearchParameters searchParams, DisburseLoanParameters disburseParams) {
return createAndActivateDefaultLoanAccount(searchParams)
.navigateToDisburseLoan()
.submitAndNavigateToDisburseLoanConfirmationPage(disburseParams)
.submitAndNavigateToLoanAccountPage();
}
public LoanAccountPage createWithVerificationAndActivationLoanAccount(CreateLoanAccountSearchParameters searchParams, String[] amounts, String[] interestRate, String[] installments) {
CreateLoanAccountEntryPage createLoanAccountEntryPage = navigationHelper
.navigateToClientsAndAccountsPage()
.navigateToCreateLoanAccountUsingLeftMenu()
.searchAndNavigateToCreateLoanAccountPage(searchParams);
if(amounts != null) {
createLoanAccountEntryPage.verifyAllowedAmounts(amounts[0], amounts[1], amounts[2]);
}
if(interestRate != null) {
createLoanAccountEntryPage.verifyAllowedInterestRate(interestRate[0], interestRate[1], interestRate[2]);
}
if(installments != null) {
createLoanAccountEntryPage.verifyAllowedInstallments(installments[0], installments[1], installments[2]);
}
return createLoanAccountEntryPage
.continuePreviewSubmitAndNavigateToDetailsPage()
.changeAccountStatusToAccepted();
}
public AdminPage loginAndNavigateToAdminPage() {
return navigationHelper.navigateToAdminPage();
}
public RepayLoanParameters setRepaymentParameters() {
RepayLoanParameters repayLoanParameters = new RepayLoanParameters();
repayLoanParameters.setModeOfRepayment(RepayLoanParameters.CASH);
repayLoanParameters.setReceiptDateDD("");
return repayLoanParameters;
}
public LoanAccountPage repayLoan(DateTime repaymentDate) throws UnsupportedEncodingException {
setApplicationTime(repaymentDate).navigateBack();
RepayLoanParameters params = setRepaymentParameters();
return new LoanAccountPage(selenium).navigateToRepayLoan().
submitAndNavigateToRepayLoanConfirmationPage(params).
submitAndNavigateToLoanAccountDetailsPage();
}
public LoanAccountPage makePayment(DateTime paymentDate, String paymentAmount) throws UnsupportedEncodingException {
PaymentParameters paymentParameters =setPaymentParams(paymentAmount, paymentDate);
setApplicationTime(paymentDate).navigateBack();
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium).navigateToApplyPayment().
submitAndNavigateToApplyPaymentConfirmationPage(paymentParameters).
submitAndNavigateToLoanAccountDetailsPage();
AccountActivityPage accountActivityPage = loanAccountPage.navigateToAccountActivityPage();
accountActivityPage.verifyLastTotalPaid(paymentAmount, 2);
accountActivityPage.navigateBack();
return loanAccountPage;
}
public void disburseLoan(DateTime disbursalDate) throws UnsupportedEncodingException {
setApplicationTime(disbursalDate).navigateBack();
DisburseLoanParameters disburseLoanParameters = setDisbursalParams(disbursalDate);
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium).navigateToDisburseLoan().
submitAndNavigateToDisburseLoanConfirmationPage(disburseLoanParameters).
submitAndNavigateToLoanAccountPage();
loanAccountPage.verifyStatus(LoanAccountPage.ACTIVE);
}
public LoanAccountPage createLoanAccount(String clientName, String loanProductName) {
return navigateToLoanAccountEntryPage(setLoanSearchParameters(clientName,loanProductName)).
clickContinueAndNavigateToLoanAccountConfirmationPage().
navigateToLoanAccountDetailsPage();
}
public LoanAccountPage applyMultipleAdjustments(String loanAcountID, int howMany) {
LoanAccountPage loanAccountPage = navigationHelper
.navigateToClientsAndAccountsPage()
.searchForClient(loanAcountID)
.navigateToLoanAccountSearchResult("Account # "+loanAcountID);
for(int i = 0; i < howMany; i++) {
loanAccountPage
.navigateToApplyAdjustment()
.fillAdjustmentFieldsAndSubmit("note note note");
}
return loanAccountPage;
}
public void verifyRepaymentScheduleForHolidays(String... dates){
int i=3;
for(String date : dates)
{
verifyCellValueOfInstallments(i++, 2, date);
//Assert.assertEquals(selenium.getTable("installments.tbody." + Integer.toString(i++) + ".2"), date);
}
}
private void verifyCellValueOfInstallments(int row, int column, String value) {
Assert.assertEquals(selenium.getText("//table[@id='installments']//tr[" + (row + 1) + "]/td[" + column + "]"), value);
}
public void verifyOneTimeFee(String expectedFee, int feeIndex) {
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium);
loanAccountPage.verifyOneTimeFeeExists(expectedFee, feeIndex);
}
public void removeOneTimeFee(int feeIndex) {
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium);
loanAccountPage.removeOneTimeFee(feeIndex);
}
public void removePeriodicFee(int feeIndex) {
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium);
loanAccountPage.removePeriodicFee(feeIndex);
}
public void verifyNoOneTimeFeesExist() {
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium);
loanAccountPage.verifyNoOneTimeFeesExist();
}
public void verifyNoOneTimeFeeRemovalLinkExists(int feeIndex) {
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium);
loanAccountPage.verifyNoOneTimeFeeRemovalLinkExists(feeIndex);
}
public void verifyNoPeriodicFeeRemovalLinkExists(int feeIndex) {
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium);
loanAccountPage.verifyNoPeriodicFeeRemovalLinkExists(feeIndex);
}
public void verifyNoPeriodicFee(String expectedFee, int feeIndex) {
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium);
loanAccountPage.verifyPeriodicFeeExists(expectedFee, feeIndex);
}
public CreateLoanAccountCashFlowPage navigateToCreateLoanAccountCashFlowPage(CreateLoanAccountSearchParameters searchParams) {
return navigateToCreateLoanAccountEntryPage(searchParams).submitAndNavigateToCreateLoanAccountCashFlowPage();
}
public void verifyOriginalValues(CreateLoanAccountSearchParameters searchParams,
String principal, String interest, String fees, String penalty, String total) {
LoanAccountPage loanAccountPage = navigateToLoanAccountPage(searchParams);
loanAccountPage.verifyPrincipalOriginal(principal);
loanAccountPage.verifyInterestOriginal(interest);
loanAccountPage.verifyFeesOriginal(fees);
loanAccountPage.verifyPenaltyOriginal(penalty);
loanAccountPage.verifyTotalOriginalLoan(total);
}
public void verifyValidationErrorAppear() {
LoanAccountPage loanAccountPage = new LoanAccountPage(selenium);
loanAccountPage.verifyValidationErrorAppear();
}
public LoanAccountPage createActivateDisburstAndApplyPaymentForDefaultLoanAccount(String clientName,
String dd, String mm, String yy) {
CreateLoanAccountSearchParameters searchParams = new CreateLoanAccountSearchParameters();
searchParams.setSearchString(clientName);
searchParams.setLoanProduct("WeeklyClientFlatLoanWithNoFee");
DisburseLoanParameters disburseParams = new DisburseLoanParameters();
disburseParams.setDisbursalDateDD(dd);
disburseParams.setDisbursalDateMM(mm);
disburseParams.setDisbursalDateYYYY(yy);
disburseParams.setPaymentType(PaymentParameters.CASH);
disburseParams.setAmount("10,000");
LoanAccountPage loanAccountPage = createActivateAndDisburseDefaultLoanAccount(searchParams, disburseParams);
String accountID = loanAccountPage.getAccountId();
PaymentParameters paymentParams = new PaymentParameters();
paymentParams.setTransactionDateDD(dd);
paymentParams.setTransactionDateMM(mm);
paymentParams.setTransactionDateYYYY(yy);
paymentParams.setPaymentType(PaymentParameters.CASH);
paymentParams.setAmount("1");
paymentParams.setReceiptId("");
paymentParams.setReceiptDateDD("");
paymentParams.setReceiptDateMM("");
paymentParams.setReceiptDateYYYY("");
return applyPayment(accountID, paymentParams);
}
public void applyGuarantyFromLoanAccountPage(String guarantorName, String globalCustNum){
selenium.click("loanaccountdetail.link.applyGuaranty");
selenium.waitForPageToLoad("30000");
selenium.type("cust_search_account.input.searchString", guarantorName);
selenium.click("cust_search_account.button.search");
selenium.waitForPageToLoad("30000");
selenium.click("link="+guarantorName+":ID"+globalCustNum);
selenium.waitForPageToLoad("30000");
selenium.click("id=apply.guarantor.submit");
selenium.waitForPageToLoad("30000");
}
}