/*
* 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.loan;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
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.admin.AdminPage;
import org.mifos.test.acceptance.framework.questionnaire.ViewQuestionResponseDetailPage;
import org.mifos.test.acceptance.util.StringUtil;
import org.testng.Assert;
import com.thoughtworks.selenium.Selenium;
@SuppressWarnings("PMD.SystemPrintln")
public class LoanAccountPage extends MifosPage {
public final static String ACTIVE = "Active in Good Standing";
public final static String ACTIVE_BAD = "Active in Bad Standing";
public final static String CLOSED = "Closed- Obligation met";
String loanSummaryTable = "//table[@id='loanSummaryTable']";
public LoanAccountPage(Selenium selenium) {
super(selenium);
this.verifyPage("LoanAccountDetail");
}
public void verifyFrequencyInstallments(String expectedFrequency){
Assert.assertEquals(selenium.getText("LoanAccountDetail.text.freq_of_inst"), expectedFrequency);
}
public void verifyFeeExists(String expectedFee) {
Assert.assertEquals(selenium.getText("LoanAccountDetail.text.loanFees"), expectedFee);
}
public void verifyOneTimeFeeExists(String expectedFee, int feeIndex) {
Assert.assertEquals(selenium.getText("loanAccountDetail.text.oneTimeFeeName_" + feeIndex), expectedFee);
}
public void verifyPeriodicFeeExists(String expectedFee, int feeIndex) {
Assert.assertEquals(selenium.getText("loanAccountDetail.text.periodicFeeName_" + feeIndex), expectedFee);
}
public void verifyNoOneTimeFeesExist() {
Assert.assertFalse(selenium.isElementPresent("id=loanAccountDetail.text.oneTimeFeeName_1"));
}
public void verifyNoOneTimeFeeRemovalLinkExists(int feeIndex) {
Assert.assertFalse(selenium.isElementPresent("id=loanAccountDetail.link.removeOneTimeFee_" + feeIndex));
}
public void verifyNoPeriodicFeeRemovalLinkExists(int feeIndex) {
Assert.assertFalse(selenium.isElementPresent("loanAccountDetail.link.removePeriodicFee_" + feeIndex));
}
public void verifyNoOneTimePenaltyRemovalLinkExists(int penaltyIndex) {
Assert.assertFalse(selenium.isElementPresent("id=loanAccountDetail.link.removeOneTimePenalty_" + penaltyIndex));
}
public void verifyNoPenaltyRemovalLinkExists(int penaltyIndex) {
Assert.assertFalse(selenium.isElementPresent("id=loanAccountDetail.link.removePenalty_" + penaltyIndex));
}
public void verifyLoanAmount(String amount) {
Assert.assertEquals(getOriginalLoanAmount(), StringUtil.formatNumber(amount));
}
public void verifyExactLoanAmount(String amount) {
Assert.assertEquals(getOriginalLoanAmount(), amount);
}
public void verifyLoanIsForClient(String clientName){
Assert.assertTrue(selenium.isTextPresent(clientName));
}
public void verifyPurpose (String purpose){
Assert.assertTrue(selenium.isTextPresent(purpose));
}
public void verifyGLIMPurpose(String purpose, int index) {
Assert.assertEquals(selenium.getText("xpath=//table[@id='loanAccountDetailsView'][1]/tbody[1]/tr[" + (index+1) + "]/td[5]"), purpose);
}
public void verifyLoanAmountPermissionError() {
selenium.click("change_status_preview.button.submit");
selenium.waitForPageToLoad("30000");
Assert.assertTrue(selenium.isTextPresent("User does not have permission to approve loans of this value"));
}
public void verifyGLIMPurpose(String[] purpose) {
for (int i = 0; i < purpose.length; i++){
verifyGLIMPurpose(purpose[i], i + 1);
}
}
public void verifyGLIMIndividualScheduleLinks(int clientCount, boolean hidden) {
Assert.assertEquals(selenium.getXpathCount("//table[@id='loanAccountDetailsView'][1]/tbody[1]/tr[1]/td").intValue() == 5, hidden);
if(!hidden) {
for(int i = 1; i <= clientCount; ++i) {
String xpath = "//table[@id='loanAccountDetailsView'][1]/tbody[1]/tr[" + (i + 1) + "]/td[6]";
Assert.assertEquals(selenium.getText(xpath), "show");
selenium.click(xpath + "/a");
waitForPageToLoad();
selenium.click("loanRepayment.link.original_schedule");
waitForPageToLoad();
Assert.assertTrue(selenium.isElementPresent("originalInstallments"));
selenium.click("loanRepayment.button.return");
waitForPageToLoad();
selenium.click("loanRepayment.button.return");
waitForPageToLoad();
}
}
}
public void verifyLoanIsPendingApproval(){
Assert.assertTrue(selenium.isTextPresent("Application Pending Approval"));
}
public void verifyLoanIsInPartialApplication(){
Assert.assertTrue(selenium.isTextPresent("Partial Application "));
}
public void verifyClosedLoanPerformanceHistory() {
Assert.assertTrue(selenium.isTextPresent("# of payments: 0"));
Assert.assertTrue(selenium.isTextPresent("# of missed payments: 0"));
Assert.assertTrue(selenium.isTextPresent("Days in arrears:0"));
}
public void verifyLoanTotalBalance(String amount) {
Assert.assertEquals(getTotalBalance(), amount);
}
public void verifyTotalOriginalLoan(String amount) {
Assert.assertEquals(getOriginalTotalAmount(), StringUtil.formatNumber(amount));
}
public void verifyTotalAmountPaid(String amount) {
Assert.assertEquals(getTotalPaid(), amount);
}
public void verifyPrincipalOriginal(String value) {
Assert.assertEquals(getOriginalLoanAmount(), value);
}
public void verifyPrincipalBalance(String value) {
Assert.assertEquals(getPrincipleBalance(), value);
}
public void verifyInterestOriginal(String value) {
Assert.assertEquals(getOriginalInterestAmount(), value);
}
public void verifyFeesOriginal(String value) {
Assert.assertEquals(getOriginalFeesAmount(), value);
}
public void verifyPenaltyOriginal(String value) {
Assert.assertEquals(getOriginalPenaltyAmount(), value);
}
public void verifyPenaltyBalance(String value) {
Assert.assertEquals(getPenaltyBalance(), value);
}
public void verifyPenaltyPaid(String value) {
Assert.assertEquals(getPenaltyPaid(), value);
}
public void verifyPerformanceHistory(String payments, String missedPayments) {
Assert.assertTrue(selenium.isTextPresent("of payments: "+payments));
Assert.assertTrue(selenium.isTextPresent("of missed payments: "+missedPayments));
}
public void verifyAccountSummary(String totalAmount, String date, String amountInArrears) {
String totalAmountDue = String.format("Total amount due on %s: %s", date, totalAmount);
String inArrears = String.format("Amount in arrears: %s", amountInArrears);
Assert.assertTrue(selenium.isTextPresent(totalAmountDue), String.format("Not found text: '%s'", totalAmountDue));
Assert.assertTrue(selenium.isTextPresent(inArrears), String.format("Not found text: '%s'", inArrears));
}
public void verifyStatus(String status) {
verifyStatus(status, null);
}
public void verifyStatus(String status, String cancelReason) {
if (EditLoanAccountStatusParameters.CANCEL.equals(status)) {
Assert.assertEquals(selenium.getText("loanaccountdetail.text.status"), status + " " + cancelReason);
}
else {
Assert.assertEquals(selenium.getText("loanaccountdetail.text.status"), status);
}
}
public void verifyError(String error) {
Assert.assertTrue(selenium.isElementPresent("//span[@id='loanaccountdetail.error.message']/li[text()='"+error+"']"));
}
public void verifyNumberOfInstallments(String numberOfInstallments) {
Assert.assertEquals(selenium.getText("loanaccountdetail.text.noOfInst"), numberOfInstallments);
}
public void verifyInterestRate(String interestRate) {
Assert.assertEquals(selenium.getText("loanaccountdetail.text.interestRate"), StringUtil.formatNumber(interestRate));
}
public void verifyPurposeOfLoan(String purpose) {
Assert.assertEquals(selenium.getText("loanaccountdetail.text.purposeofloan"), purpose);
}
public void verifyCollateralNotes(String note) {
Assert.assertEquals(selenium.getText("loanaccountdetail.text.collateralnote"), note);
}
public void verifyCollateralType(String type) {
Assert.assertEquals(selenium.getText("loanaccountdetail.text.collateraltype"), type);
}
public void verifyExternalId(String id) {
Assert.assertEquals(selenium.getText("loanaccountdetail.text.externalid"), id);
}
public void verifyLoanDetails(CreateLoanAccountSubmitParameters submitAccountParameters, EditLoanAccountInformationParameters editLoanAccountInformationParameters) {
if(submitAccountParameters.getAmount()!=null){
verifyLoanAmount(submitAccountParameters.getAmount());
}
if(submitAccountParameters.getNumberOfInstallments()!=null){
verifyNumberOfInstallments(submitAccountParameters.getNumberOfInstallments());
}
if(submitAccountParameters.getInterestRate()!=null){
verifyInterestRate(submitAccountParameters.getInterestRate());
}
if(editLoanAccountInformationParameters.getCollateralNotes()!=null){
verifyCollateralNotes(editLoanAccountInformationParameters.getCollateralNotes());
}
if(editLoanAccountInformationParameters.getCollateralType()!=null){
verifyCollateralType(editLoanAccountInformationParameters.getCollateralType());
}
if(editLoanAccountInformationParameters.getExternalID()!=null){
verifyExternalId(editLoanAccountInformationParameters.getExternalID());
}
if(editLoanAccountInformationParameters.getPurposeOfLoan()!=null){
verifyPurposeOfLoan(editLoanAccountInformationParameters.getPurposeOfLoan());
}
}
public void verifyNumberOfInstallments(String min, String max, String expected) {
String expectedInstallmentText2 = "(Allowed Number of Installments: " + min + " - " + max;
String expectedInstallmentText = "(Allowed number of installments: " + min + " - " + max + ")";
boolean result = selenium.isTextPresent(expected);
boolean result2 = selenium.isTextPresent(expectedInstallmentText);
boolean result3 = selenium.isTextPresent(expectedInstallmentText2);
if (!result) {
Assert.fail(expected + " :not found on page: " + selenium.getLocation());
}
if (result2 || result3) {
Assert.assertTrue(true);
} else {
Assert.fail(expectedInstallmentText + " :not found on page: " + selenium.getLocation());
}
}
/**
* Returns the id of the account displayed on the current page, or -1 if no id is found.
* The id is the global id (0001...000...263, not just 263).
* @return ID of the account.
*/
public String getAccountId() {
String returnId = "-1";
if(selenium.isElementPresent("loanaccountdetail.text.loanid")) {
returnId = selenium.getText("loanaccountdetail.text.loanid");
}
else {
String heading = selenium.getAttribute("loanaccountdetail.link.editAccountInformation@href");
System.err.println("heADING: " + heading);
String[] linkParts = heading.split("&");
for (String part : linkParts) {
String[] partOfLink = part.split("=");
// this is an ID that identifies the account
if ("globalAccountNum".equals(partOfLink[0])) {
returnId = partOfLink[1];
}
}
}
return returnId;
}
public HomePage navigateToHomePage(){
selenium.click("id=header.link.home");
waitForPageToLoad();
return new HomePage(selenium);
}
public ViewRepaymentSchedulePage navigateToRepaymentSchedulePage() {
selenium.click("id=loanaccountdetail.link.viewRepaymentSchedule");
waitForPageToLoad();
return new ViewRepaymentSchedulePage(selenium);
}
public LoanAccountPage navigateToIndividualLoanAccountPage(int clientIndex) {
selenium.click("//table[@id='loanAccountDetailsView'][1]/tbody[1]/tr[" + (clientIndex + 2) + "]/td[7]/a");
waitForPageToLoad();
return new LoanAccountPage(selenium);
}
public LoanAccountPage navigateToIndividualLoanAccountPageFromPendingApprovalGroupLoan(int clientIndex) {
selenium.click("//table[@id='loanAccountDetailsView'][1]/tbody[1]/tr[" + (clientIndex + 2) + "]/td[6]/a");
waitForPageToLoad();
return new LoanAccountPage(selenium);
}
public ViewRepaymentSchedulePage navigateToIndividualRepaymentSchedulePage(int row) {
selenium.click("//table[@id='loanAccountDetailsView'][1]/tbody[1]/tr[" + (row + 2) + "]/td[6]/a");
waitForPageToLoad();
return new ViewRepaymentSchedulePage(selenium);
}
public ViewOriginalSchedulePage navigateToIndividualOriginalSchedulePage(int row) {
selenium.click("//table[@id='loanAccountDetailsView'][1]/tbody[1]/tr[" + row + "]/td[6]/a");
waitForPageToLoad();
selenium.click("loanRepayment.link.original_schedule");
waitForPageToLoad();
return new ViewOriginalSchedulePage(selenium);
}
public AccountActivityPage navigateToAccountActivityPage() {
selenium.click("link=View all account activity");
waitForPageToLoad();
return new AccountActivityPage(selenium);
}
public ViewNextInstallmentDetailsPage navigateToViewNextInstallmentDetails() {
selenium.click("id=loanaccountdetail.link.viewInstallmentDetails");
waitForPageToLoad();
return new ViewNextInstallmentDetailsPage(selenium);
}
public ViewInstallmentDetailsPage navigateToViewInstallmentDetails() {
selenium.click("id=loanaccountdetail.link.viewInstallmentDetails");
waitForPageToLoad();
return new ViewInstallmentDetailsPage(selenium);
}
public RepayLoanPage navigateToRepayLoan() {
selenium.click("id=loanaccountdetail.link.repayLoan");
waitForPageToLoad();
return new RepayLoanPage(selenium);
}
public AccountChangeStatusPage navigateToEditAccountStatus() {
selenium.click("loanaccountdetail.link.editAccountStatus");
waitForPageToLoad();
return new AccountChangeStatusPage(selenium);
}
public AccountChangeStatusPage navigateToGuarantyPreviewPage() {
selenium.click("loanaccountdetail.link.applyGuaranty");
waitForPageToLoad();
selenium.type("cust_search_account.input.searchString", "Holiday TestClient");
waitForPageToLoad();
selenium.click("link=Holiday TestClient:ID0002-000000023");
waitForPageToLoad();
selenium.click("id=apply.guarantor.submit");
waitForPageToLoad();
return new AccountChangeStatusPage(selenium);
}
public EditLoanAccountInformationPage navigateToEditAccountInformation() {
selenium.click("loanaccountdetail.link.editAccountInformation");
waitForPageToLoad();
return new EditLoanAccountInformationPage(selenium);
}
public DisburseLoanPage navigateToDisburseLoan() {
selenium.click("loanaccountdetail.link.disburseLoan");
waitForPageToLoad();
return new DisburseLoanPage(selenium);
}
public LoanAccountPage tryNavigatingToDisburseLoanWithError() {
selenium.click("loanaccountdetail.link.disburseLoan");
waitForPageToLoad();
return new LoanAccountPage(selenium);
}
public ApplyChargePage navigateToApplyCharge() {
selenium.click("loanaccountdetail.link.applyCharges");
waitForPageToLoad();
return new ApplyChargePage(selenium);
}
public ApplyPaymentPage navigateToApplyPayment() {
selenium.click("loanaccountdetail.link.applyPayment");
waitForPageToLoad();
return new ApplyPaymentPage(selenium);
}
public ApplyGroupPaymentPage navigateToApplyGroupPayment() {
selenium.click("loanaccountdetail.link.applyPayment");
waitForPageToLoad();
return new ApplyGroupPaymentPage(selenium);
}
public AccountAddNotesPage navigateToAddNotesPage() {
selenium.click("loanaccountdetail.link.addNote");
waitForPageToLoad();
return new AccountAddNotesPage(selenium);
}
public AccountNotesPage navigateToAccountNotesPage() {
selenium.click("loanaccountdetail.link.seeAllNotes");
waitForPageToLoad();
return new AccountNotesPage(selenium);
}
public AttachSurveyPage navigateToAttachSurveyPage() {
selenium.click("loanaccountdetail.link.attachSurvey");
waitForPageToLoad();
return new AttachSurveyPage(selenium);
}
public TransactionHistoryPage navigateToTransactionHistory() {
selenium.click("loanaccountdetail.link.viewTransactionHistory");
waitForPageToLoad();
return new TransactionHistoryPage(selenium);
}
public ViewRepaymentSchedulePage navigateToViewRepaymentSchedule() {
selenium.click("id=loanaccountdetail.link.viewRepaymentSchedule");
waitForPageToLoad();
return new ViewRepaymentSchedulePage(selenium);
}
public ViewQuestionResponseDetailPage navigateToAdditionalInformationPage() {
selenium.click("id=loanaccountdetail.link.questionGroups");
waitForPageToLoad();
return new ViewQuestionResponseDetailPage(selenium);
}
public ViewQuestionResponseDetailPage navigateToViewQuestionResponseDetailPage(String questionGroupName) {
selenium.click("link="+questionGroupName);
waitForPageToLoad();
return new ViewQuestionResponseDetailPage(selenium);
}
public ViewLoanStatusHistoryPage navigateToViewLoanStatusHistoryPage() {
selenium.click("id=loanaccountdetail.link.viewStatusHistory");
waitForPageToLoad();
return new ViewLoanStatusHistoryPage(selenium);
}
public AccountActivityPage navigateToViewLoanAccountActivityPage() {
selenium.click("id=loanaccountdetail.link.viewAccountActivity");
waitForPageToLoad();
return new AccountActivityPage(selenium);
}
public ClientsAndAccountsHomepage navigateToClientsAndAccountsUsingHeaderTab() {
selenium.click("header.link.clientsAndAccounts");
waitForPageToLoad();
return new ClientsAndAccountsHomepage(selenium);
}
@Override
public AdminPage navigateToAdminPageUsingHeaderTab() {
selenium.click("header.link.admin");
waitForPageToLoad();
return new AdminPage(selenium);
}
public String getTotalBalance() {
return selenium.getTable("loanSummaryTable.5.3").trim();
}
public String getTotalPaid() {
return selenium.getTable("loanSummaryTable.5.2").trim();
}
public String getOriginalTotalAmount() {
return selenium.getTable("loanSummaryTable.5.1").trim();
}
public String getPenaltyBalance() {
return selenium.getTable("loanSummaryTable.4.3").trim();
}
public String getPenaltyPaid() {
return selenium.getTable("loanSummaryTable.4.2").trim();
}
public String getOriginalPenaltyAmount() {
return selenium.getTable("loanSummaryTable.4.1").trim();
}
public String getFeesBalance() {
return selenium.getTable("loanSummaryTable.3.3").trim();
}
public String getFeesPaid() {
return selenium.getTable("loanSummaryTable.3.2").trim();
}
public String getOriginalFeesAmount() {
return selenium.getTable("loanSummaryTable.3.1").trim();
}
public String getInterestBalance() {
return selenium.getTable("loanSummaryTable.2.3").trim();
}
public String getInterestPaid() {
return selenium.getTable("loanSummaryTable.2.2").trim();
}
public String getOriginalInterestAmount() {
return selenium.getTable("loanSummaryTable.2.1").trim();
}
public String getPrincipleBalance() {
return selenium.getTable("loanSummaryTable.1.3").trim();
}
public String getPrinciplePaid() {
return selenium.getTable("loanSummaryTable.1.2").trim();
}
public String getOriginalLoanAmount() {
return selenium.getTable("loanSummaryTable.1.1").trim();
}
public String getDisbursalDate(){
return selenium.getText("loanaccountdetail.details.disbursaldate");
}
public void verifyDisbursalDate(DateTime disbursalDate){
DateTimeFormatter formater = DateTimeFormat.forPattern("dd/MM/yyyy");
Assert.assertEquals(getDisbursalDate(), formater.print(disbursalDate));
}
public LoanAccountPage verifyInterestTypeInLoanAccountDetails(String interestType) {
Assert.assertTrue(selenium.isTextPresent("Interest Rate Type: " + interestType));
return this;
}
public LoanAccountPage removeOneTimeFee(int feeIndex) {
selenium.click("loanAccountDetail.link.removeOneTimeFee_" + feeIndex);
waitForPageToLoad();
return this;
}
public LoanAccountPage removePeriodicFee(int feeIndex) {
selenium.click("loanAccountDetail.link.removePeriodicFee_" + feeIndex);
waitForPageToLoad();
return this;
}
public LoanAccountPage removeOneTimePenalty(int penaltyIndex) {
selenium.click("loanAccountDetail.link.removeOneTimePenalty_" + penaltyIndex);
waitForPageToLoad();
return this;
}
public LoanAccountPage removePenalty(int penaltyIndex) {
selenium.click("loanAccountDetail.link.removePenalty_" + penaltyIndex);
waitForPageToLoad();
return this;
}
public ApplyAdjustmentPage navigateToApplyAdjustment() {
selenium.click("loanaccountdetail.link.applyAdjustment");
waitForPageToLoad();
ListAdjustmentsPage listAdjustmentsPage = new ListAdjustmentsPage(selenium);
return listAdjustmentsPage.navigateToFirstAdjustment();
}
public LoanAccountPage navigateToGroupLoanPageFromIndividualLoanPage() {
selenium.click("//span[@class='fontnormal8pt'][1]/a[5]");
waitForPageToLoad();
return new LoanAccountPage(selenium);
}
public TransactionHistoryPage navigateToTransactionHistoryPage() {
selenium.click("loanaccountdetail.link.viewTransactionHistory");
waitForPageToLoad();
return new TransactionHistoryPage(selenium);
}
public LoanAccountPage changeAccountStatus(EditLoanAccountStatusParameters statusParams) {
return navigateToEditAccountStatus()
.submitAndNavigateToNextPage(statusParams)
.submitAndNavigateToLoanAccountPage();
}
public LoanAccountPage changeAccountStatusToAccepted() {
EditLoanAccountStatusParameters statusParams = new EditLoanAccountStatusParameters();
statusParams.setStatus(EditLoanAccountStatusParameters.APPROVED);
statusParams.setNote("OK");
return navigateToEditAccountStatus()
.submitAndNavigateToNextPage(statusParams)
.submitAndNavigateToLoanAccountPage();
}
public LoanAccountPage verifyLoanStatus(String status) {
Assert.assertTrue(selenium.isTextPresent(status));
return this;
}
public LoanAccountPage verifyAccountSummary(String[][] accountSummaryTable) {
if (accountSummaryTable != null) {
for (int rowIndex = 0; rowIndex < accountSummaryTable.length; rowIndex++) {
String[] rowValues = accountSummaryTable[rowIndex];
int row = rowIndex + 1;
for (int columnIndex = 0; columnIndex < rowValues.length; columnIndex++) {
String cellValue = rowValues[columnIndex];
int column = columnIndex + 1;
if (!"".equals(cellValue)) {
String actualCellValue = selenium.getText(loanSummaryTable + "//tr[" + row + "]/td[" + column + "]");
Assert.assertEquals(actualCellValue, cellValue, "In Schedule Table for row " + row + " and column " + column + " expected value is " + cellValue + " but the actual value is " + actualCellValue);
}
}
}
}
return this;
}
public LoanAccountPage disburseLoan(DisburseLoanParameters disburseParams) {
return navigateToDisburseLoan()
.submitAndNavigateToDisburseLoanConfirmationPage(disburseParams)
.submitAndNavigateToLoanAccountPage();
}
public void verifyDisbursalDate(String disbursalDate) {
Assert.assertEquals(selenium.getText("loanaccountdetail.details.disbursaldate"), disbursalDate);
}
public void verifyValidationErrorAppear() {
String msg = "Removing this fee is currently not supported since it would require recalculating the loan schedule after payments have been made.";
Assert.assertTrue(selenium.isTextPresent(msg), "not found: " + msg);
}
public void verifyLastNoteDate(LocalDate date) {
String noteDateString = selenium.getText("//td[@id='recentNotes']/span[1]").trim().replace(":", "");
Assert.assertEquals(noteDateString, date.toString("dd/MM/yyyy"));
}
}