package org.mifos.test.acceptance.loanproduct;
import java.util.Arrays;
import org.mifos.test.acceptance.framework.admin.AdminPage;
import org.mifos.test.acceptance.framework.loanproduct.DefineNewLoanProductConfirmationPage;
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.testhelpers.FormParametersHelper;
import org.mifos.test.acceptance.framework.testhelpers.NavigationHelper;
import org.mifos.test.acceptance.util.StringUtil;
import com.thoughtworks.selenium.Selenium;
public class LoanProductTestHelper {
private final Selenium selenium;
private final NavigationHelper navigationHelper;
public LoanProductTestHelper(Selenium selenium) {
this.selenium = selenium;
this.navigationHelper = new NavigationHelper(selenium);
}
public DefineNewLoanProductPage navigateToDefineNewLoanPageAndFillMandatoryFields(
DefineNewLoanProductPage.SubmitFormParameters formParameters) {
formParameters.setOfferingShortName(StringUtil.getRandomString(4));
return navigateToDefineNewLoanProductPage().fillLoanParameters(formParameters);
}
public DefineNewLoanProductConfirmationPage defineNewLoanProduct(
DefineNewLoanProductPage.SubmitFormParameters formParameters, String... fees) {
DefineNewLoanProductPage productPage = navigateToDefineNewLoanProductPage().fillLoanParameters(formParameters);
if (fees != null) {
for (String feeName : fees) {
productPage.addFee(feeName);
}
}
return productPage.submitAndGotoNewLoanProductPreviewPage().submit();
}
public DefineNewLoanProductPage navigateToDefineNewLoanProductPage() {
return new NavigationHelper(selenium).navigateToAdminPage().navigateToDefineLoanProduct();
}
public DefineNewLoanProductPage.SubmitFormParameters defineLoanProductParameters(int defInstallments,
int defaultLoanAmount, int defaultInterestRate, int interestType, int recurrenceTypeId) {
DefineNewLoanProductPage.SubmitFormParameters formParameters = null;
switch (recurrenceTypeId) {
case 1:
formParameters = FormParametersHelper.getWeeklyLoanProductParameters();
break;
case 2:
formParameters = FormParametersHelper.getMonthlyLoanProductParameters();
break;
case 3:
formParameters = FormParametersHelper.getDailyLoanProductParameters();
break;
default:
break;
}
formParameters.setDefInstallments(String.valueOf(defInstallments));
formParameters.setDefaultLoanAmount(String.valueOf(defaultLoanAmount));
formParameters.setInterestTypes(interestType);
formParameters.setDefaultInterestRate(String.valueOf(defaultInterestRate));
return formParameters;
}
private String getLastLoanAmountRangeAtRow(Integer row) {
return selenium.getTable("noOfInstallFromLastTable." + row + ".0");
}
private String getDefaultOfInstallments(Integer row) {
return selenium.getTable("noOfInstallFromLastTable." + row + ".3");
}
public String[] getDefaultNoOfInstallmentsForClients(String[] clients, String productName) {
Float clientLastAmount;
navigationHelper.navigateToLoanProductDetailsPage(productName);
Integer rowCount = (selenium.getXpathCount("//table[@id='noOfInstallFromLastTable']/tbody/tr").intValue() - 1);
Float actualRowValue;
String[] clientsInstallments = new String[clients.length];
int j = 0;
for (String client : clients) {
clientLastAmount = Float.parseFloat(navigationHelper.navigateToClientViewDetailsPage(client)
.getLastLoanAmount());
navigationHelper.navigateToLoanProductDetailsPage(productName);
for (int i = 1; i < rowCount; i++) {
actualRowValue = Float.parseFloat(getLastLoanAmountRangeAtRow(i).split("-")[1]);
if (clientLastAmount < actualRowValue) {
clientsInstallments[j] = getDefaultOfInstallments(i);
break;
}
}
j++;
}
return clientsInstallments;
}
public void editLoanProductIncludeInLoanCounter(String loanProduct, boolean includeInLoanCounter) {
EditLoanProductPage editLoanProductPage = navigationHelper.navigateToAdminPage().
navigateToViewLoanProducts().
viewLoanProductDetails(loanProduct).
editLoanProduct();
DefineNewLoanProductPage.SubmitFormParameters formParameters = new DefineNewLoanProductPage.SubmitFormParameters();
formParameters.setIncludeInLoanCounter(includeInLoanCounter);
editLoanProductPage.submitIncludeInLoanCounter(formParameters).submit();
}
public void editLoanProductIncludeQuestionsGroups(String loanProduct, String... questionGroup) {
AdminPage adminPage = navigationHelper.navigateToAdminPage();
ViewLoanProductsPage viewLoanProducts = adminPage.navigateToViewLoanProducts();
LoanProductDetailsPage loanProductDetailsPage = viewLoanProducts.viewLoanProductDetails(loanProduct);
EditLoanProductPage editLoanProductPage = loanProductDetailsPage.editLoanProduct();
DefineNewLoanProductPage.SubmitFormParameters formParameters = new DefineNewLoanProductPage.SubmitFormParameters();
formParameters.setQuestionGroups(Arrays.asList(questionGroup));
EditLoanProductPreviewPage editLoanProductPreviewPage = editLoanProductPage.submitQuestionGroupChanges(formParameters);
editLoanProductPreviewPage.submit();
}
public EditLoanProductPreviewPage editLoanProductWithParameters(String loanProduct,
DefineNewLoanProductPage.SubmitFormParameters productParams) {
AdminPage adminPage = navigationHelper.navigateToAdminPage();
adminPage.navigateToViewLoanProducts().viewLoanProductDetails(loanProduct);
new DefineNewLoanProductPage().fillLoanParameters(productParams).submitPage();
return new EditLoanProductPreviewPage(selenium);
}
public LoanProductDetailsPage navigateToViewLoanProductDetailsPage(String loanProduct) {
return navigationHelper.navigateToAdminPage().navigateToViewLoanProducts().viewLoanProductDetails(loanProduct);
}
public LoanProductDetailsPage defineNewLoanProduct(DefineNewLoanProductPage.SubmitFormParameters productParams) {
DefineNewLoanProductPage defineNewLoanProductPage = navigationHelper
.navigateToAdminPage()
.navigateToDefineLoanProduct();
defineNewLoanProductPage.fillLoanParameters(productParams);
return defineNewLoanProductPage
.submitAndGotoNewLoanProductPreviewPage()
.submit()
.navigateToViewLoanDetailsPage();
}
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();
}
}