From 57556d3a1a25db88f5bf328a855c5d013188869f Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Wed, 11 Jul 2012 15:15:18 +1000 Subject: [PATCH] WIP client search and enable Pentaho Reports --- mifosng-db/WIPdbchanges.sql | 3 + .../ReadExtraDataAndReportingServiceImpl.java | 27 +-- .../platform/api/ClientApiResource.java | 58 +++++- .../mifosng/platform/api/data/ClientData.java | 31 +-- .../service/ClientReadPlatformService.java | 11 +- .../ClientReadPlatformServiceImpl.java | 177 ++++++++++-------- 6 files changed, 183 insertions(+), 124 deletions(-) create mode 100644 mifosng-db/WIPdbchanges.sql diff --git a/mifosng-db/WIPdbchanges.sql b/mifosng-db/WIPdbchanges.sql new file mode 100644 index 000000000..ef06a11ad --- /dev/null +++ b/mifosng-db/WIPdbchanges.sql @@ -0,0 +1,3 @@ + +/* remove column org_id */ +ALTER TABLE `mifosngprovider`.`portfolio_client` DROP FOREIGN KEY `FKCE00CAB354DF2770` ;ALTER TABLE `mifosngprovider`.`portfolio_client` DROP COLUMN `org_id` , DROP INDEX `org_id` , ADD INDEX `external_id` (`external_id` ASC) , DROP INDEX `FKCE00CAB354DF2770` ; \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java index 341e416c5..9a16a72bc 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java @@ -27,7 +27,7 @@ import org.mifosng.platform.api.data.ResultsetDataRow; import org.mifosng.platform.exceptions.AdditionalFieldsNotFoundException; import org.mifosng.platform.exceptions.PlatformDataIntegrityException; import org.mifosng.platform.exceptions.ReportNotFoundException; -//import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot; +import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot; import org.pentaho.reporting.engine.classic.core.MasterReport; import org.pentaho.reporting.engine.classic.core.ReportProcessingException; import org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.PdfReportUtil; @@ -56,8 +56,8 @@ public class ReadExtraDataAndReportingServiceImpl implements @Autowired public ReadExtraDataAndReportingServiceImpl(final DataSource dataSource) { // kick off pentaho reports server - // ClassicEngineBoot.getInstance().start(); - noPentaho = true; + ClassicEngineBoot.getInstance().start(); + noPentaho = false; try { this.dataSource = dataSource; @@ -718,22 +718,26 @@ public class ReadExtraDataAndReportingServiceImpl implements } @Override - public Response processPentahoRequest(String reportName, String outputTypeParam, - Map queryParams) { + public Response processPentahoRequest(String reportName, + String outputTypeParam, Map queryParams) { String outputType = "HTML"; - if (StringUtils.isNotBlank(outputTypeParam)) outputType = outputTypeParam; - - if (!(outputType.equalsIgnoreCase("HTML") || outputType.equalsIgnoreCase("PDF") || outputType.equalsIgnoreCase("XLS") || outputType.equalsIgnoreCase("CSV"))) + if (StringUtils.isNotBlank(outputTypeParam)) + outputType = outputTypeParam; + + if (!(outputType.equalsIgnoreCase("HTML") + || outputType.equalsIgnoreCase("PDF") + || outputType.equalsIgnoreCase("XLS") || outputType + .equalsIgnoreCase("CSV"))) throw new PlatformDataIntegrityException( "error.msg.invalid.outputType", "No matching Output Type: " + outputType); - + if (noPentaho) throw new PlatformDataIntegrityException("error.msg.no.pentaho", "Pentaho is not enabled", "Pentaho is not enabled"); - //TODO - use pentaho location finder like Pawel does in Mifos + // TODO - use pentaho location finder like Pawel does in Mifos String reportPath = "C:\\dev\\apache-tomcat-7.0.25\\webapps\\ROOT\\PentahoReports\\" + reportName + ".prpt"; // String reportPath = @@ -785,7 +789,8 @@ public class ReadExtraDataAndReportingServiceImpl implements if ("HTML".equalsIgnoreCase(outputType)) { HtmlReportUtil.createStreamHTML(masterReport, baos); - return Response.ok().entity(baos.toByteArray()).type("text/html").build(); + return Response.ok().entity(baos.toByteArray()) + .type("text/html").build(); } } catch (ResourceException e) { throw new PlatformDataIntegrityException( diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientApiResource.java index 8be7c33e6..484710c75 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientApiResource.java @@ -16,6 +16,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; +import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; import org.mifosng.platform.api.commands.ClientCommand; import org.mifosng.platform.api.commands.NoteCommand; @@ -29,6 +30,8 @@ import org.mifosng.platform.api.infrastructure.ApiJSONFormattingService; import org.mifosng.platform.client.service.ClientReadPlatformService; import org.mifosng.platform.client.service.ClientWritePlatformService; import org.mifosng.platform.organisation.service.OfficeReadPlatformService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -38,6 +41,9 @@ import org.springframework.stereotype.Component; @Scope("singleton") public class ClientApiResource { + private final static Logger logger = LoggerFactory + .getLogger(ClientApiResource.class); + private String defaultFieldList = "joinedDate"; private String allowedFieldList = "allowedOffices"; private String filterName = "myFilter"; @@ -60,16 +66,64 @@ public class ClientApiResource { @GET @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Produces({ MediaType.APPLICATION_JSON }) - public String retrieveAllIndividualClients(@Context UriInfo uriInfo) { + public String retrieveAllIndividualClients(@Context UriInfo uriInfo, + @QueryParam("sqlSearch") final String sqlSearch, + @QueryParam("officeId") final Integer officeId, + @QueryParam("externalId") final String externalId, + @QueryParam("displayName") final String displayName, + @QueryParam("firstName") final String firstName, + @QueryParam("lastName") final String lastName) { + + String extraCriteria = getClientCriteria(sqlSearch, officeId, + externalId, displayName, firstName, lastName); Collection clients = this.clientReadPlatformService - .retrieveAllIndividualClients(); + .retrieveAllIndividualClients(extraCriteria); String selectedFields = ""; return this.jsonFormattingService.convertRequest(clients, filterName, allowedFieldList, selectedFields, uriInfo.getQueryParameters()); } + private String getClientCriteria(String sqlSearch, Integer officeId, + String externalId, String displayName, String firstName, + String lastName) { + + String extraCriteria = ""; + + if (sqlSearch != null) + extraCriteria = " and (" + sqlSearch + ")"; + + if (officeId != null) + extraCriteria += " and office_id = " + officeId; + if (externalId != null) + extraCriteria += " and external_id like " + + sqlEncodeString(externalId); + if (displayName != null) + extraCriteria += " and concat(ifnull(firstname, ''), if(firstname > '',' ', '') , ifnull(lastname, '')) like " + + sqlEncodeString(displayName); + if (firstName != null) + extraCriteria += " and firstname like " + + sqlEncodeString(firstName); + if (lastName != null) + extraCriteria += " and lastname like " + sqlEncodeString(lastName); + + if (StringUtils.isNotBlank(extraCriteria)) + extraCriteria = extraCriteria.substring(4); + + logger.info("extraCriteria; " + extraCriteria); + + return extraCriteria; + } + + private String sqlEncodeString(String str) { + String singleQuote = "'"; + String twoSingleQuotes = "''"; + return singleQuote + + StringUtils.replace(str, singleQuote, twoSingleQuotes, -1) + + singleQuote; + } + @GET @Path("{clientId}") @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientData.java index a9d3a8e39..b284fe597 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientData.java @@ -5,16 +5,12 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.map.annotate.JsonFilter; import org.joda.time.LocalDate; -@JsonIgnoreProperties({ "organisationId","organisationName"}) @JsonFilter("myFilter") public class ClientData implements Serializable { - private Long organisationId; - private String organisationName; private Long officeId; private String officeName; private Long id; @@ -30,24 +26,21 @@ public class ClientData implements Serializable { // } - public ClientData(final Long organisationId, final String organisationName, - final Long officeId, final String officeName, final Long id, - final String firstname, final String lastname, + public ClientData(final Long officeId, final String officeName, + final Long id, final String firstname, final String lastname, final String externalId, final LocalDate joinedDate) { - this.organisationId = organisationId; - this.organisationName = organisationName; this.officeId = officeId; this.officeName = officeName; this.id = id; this.firstname = firstname; this.lastname = lastname; - + StringBuilder nameBuilder = new StringBuilder(this.firstname); if (StringUtils.isNotBlank(nameBuilder.toString())) { nameBuilder.append(' '); } nameBuilder.append(this.lastname); - + this.displayName = nameBuilder.toString(); this.externalId = externalId; this.joinedDate = joinedDate; @@ -69,14 +62,6 @@ public class ClientData implements Serializable { return this.externalId; } - public Long getOrganisationId() { - return this.organisationId; - } - - public String getOrganisationName() { - return this.organisationName; - } - public Long getOfficeId() { return this.officeId; } @@ -89,14 +74,6 @@ public class ClientData implements Serializable { return this.joinedDate; } - public void setOrganisationId(final Long organisationId) { - this.organisationId = organisationId; - } - - public void setOrganisationName(final String organisationName) { - this.organisationName = organisationName; - } - public void setOfficeId(final Long officeId) { this.officeId = officeId; } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformService.java index 5556582c0..feda62d09 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformService.java @@ -8,14 +8,15 @@ import org.mifosng.platform.api.data.NoteData; public interface ClientReadPlatformService { - Collection retrieveAllIndividualClients(); + Collection retrieveAllIndividualClients(String extraCriteria); ClientData retrieveIndividualClient(Long clientId); - + ClientData retrieveNewClientDetails(); - - ClientLoanAccountSummaryCollectionData retrieveClientAccountDetails(Long clientId); - + + ClientLoanAccountSummaryCollectionData retrieveClientAccountDetails( + Long clientId); + Collection retrieveAllClientNotes(Long clientId); NoteData retrieveClientNote(Long clientId, Long noteId); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformServiceImpl.java index 26d32c753..54b55050e 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformServiceImpl.java @@ -23,7 +23,6 @@ import org.mifosng.platform.client.domain.NoteEnumerations; import org.mifosng.platform.exceptions.ClientNotFoundException; import org.mifosng.platform.exceptions.NoteNotFoundException; import org.mifosng.platform.infrastructure.JdbcSupport; -import org.mifosng.platform.organisation.domain.Organisation; import org.mifosng.platform.organisation.service.OfficeReadPlatformService; import org.mifosng.platform.security.PlatformSecurityContext; import org.mifosng.platform.user.domain.AppUser; @@ -43,14 +42,16 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService private final AppUserReadPlatformService appUserReadPlatformService; @Autowired - public ClientReadPlatformServiceImpl(final PlatformSecurityContext context, final DataSource dataSource, final OfficeReadPlatformService officeReadPlatformService, + public ClientReadPlatformServiceImpl(final PlatformSecurityContext context, + final DataSource dataSource, + final OfficeReadPlatformService officeReadPlatformService, final AppUserReadPlatformService appUserReadPlatformService) { this.context = context; this.officeReadPlatformService = officeReadPlatformService; this.appUserReadPlatformService = appUserReadPlatformService; this.jdbcTemplate = new SimpleJdbcTemplate(dataSource); } - + private String generateOfficeIdInClause(List offices) { String officeIdsList = ""; for (int i = 0; i < offices.size(); i++) { @@ -63,79 +64,84 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } return officeIdsList; } - + @Override - public Collection retrieveAllIndividualClients() { + public Collection retrieveAllIndividualClients( + String extraCriteria) { AppUser currentUser = this.context.authenticatedUser(); - List offices = new ArrayList(officeReadPlatformService.retrieveAllOffices()); + List offices = new ArrayList( + officeReadPlatformService.retrieveAllOffices()); String officeIdsList = generateOfficeIdInClause(offices); - - ClientMapper rm = new ClientMapper(offices, currentUser.getOrganisation()); - String sql = "select " + rm.clientSchema() - + " where c.org_id = ? and c.office_id in (" + officeIdsList - + ") order by c.lastname ASC, c.firstname ASC"; + ClientMapper rm = new ClientMapper(offices); - return this.jdbcTemplate.query(sql, rm, new Object[] { currentUser - .getOrganisation().getId() }); + String sql = "select " + rm.clientSchema() + " where c.office_id in (" + + officeIdsList + ") "; + + if (StringUtils.isNotBlank(extraCriteria)) + sql += " and " + extraCriteria; + + sql += " order by c.lastname ASC, c.firstname ASC"; + + return this.jdbcTemplate.query(sql, rm, new Object[] {}); } - + @Override public ClientData retrieveIndividualClient(final Long clientId) { try { AppUser currentUser = this.context.authenticatedUser(); -//TODO - JW include office name in query rather than get the lot for office name - List offices = new ArrayList(officeReadPlatformService.retrieveAllOffices()); - ClientMapper rm = new ClientMapper(offices, currentUser.getOrganisation()); + // TODO - JW include office name in query rather than get the lot + // for office name + List offices = new ArrayList( + officeReadPlatformService.retrieveAllOffices()); + ClientMapper rm = new ClientMapper(offices); - String sql = "select " + rm.clientSchema() + " where c.id = ? and c.org_id = ?"; + String sql = "select " + rm.clientSchema() + + " where c.id = ? and c.org_id = ?"; - return this.jdbcTemplate.queryForObject(sql, rm, new Object[] {clientId, currentUser.getOrganisation().getId() }); + return this.jdbcTemplate.queryForObject(sql, rm, new Object[] { + clientId, currentUser.getOrganisation().getId() }); } catch (EmptyResultDataAccessException e) { throw new ClientNotFoundException(clientId); } } - + @Override public ClientData retrieveNewClientDetails() { AppUser currentUser = context.authenticatedUser(); - List offices = new ArrayList(officeReadPlatformService.retrieveAllOfficesForLookup()); + List offices = new ArrayList( + officeReadPlatformService.retrieveAllOfficesForLookup()); ClientData clientData = new ClientData(); clientData.setOfficeId(currentUser.getOffice().getId()); - clientData.setOrganisationId(currentUser.getOrganisation().getId()); clientData.setAllowedOffices(offices); clientData.setJoinedDate(new LocalDate()); return clientData; } - + private static final class ClientMapper implements RowMapper { private final List offices; - private final Organisation organisation; - public ClientMapper(final List offices, - Organisation organisation) { + public ClientMapper(final List offices) { this.offices = offices; - this.organisation = organisation; } public String clientSchema() { - return "c.org_id as orgId, c.office_id as officeId, c.id as id, c.firstname as firstname, c.lastname as lastname, c.external_id as externalId, c.joining_date as joinedDate from portfolio_client c"; + return "c.office_id as officeId, c.id as id, c.firstname as firstname, c.lastname as lastname, c.external_id as externalId, c.joining_date as joinedDate from portfolio_client c"; } @Override public ClientData mapRow(final ResultSet rs, final int rowNum) throws SQLException { - Long orgId = JdbcSupport.getLong(rs, "orgId"); Long officeId = JdbcSupport.getLong(rs, "officeId"); Long id = JdbcSupport.getLong(rs, "id"); String firstname = rs.getString("firstname"); @@ -148,12 +154,8 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService String officeName = fromOfficeList(this.offices, officeId); - String orgname = ""; - if (organisation.getId().equals(orgId)) { - orgname = organisation.getName(); - } - - return new ClientData(orgId, orgname, officeId, officeName, id, firstname, lastname, externalId, joinedDate); + return new ClientData(officeId, officeName, id, firstname, + lastname, externalId, joinedDate); } private String fromOfficeList(final List officeList, @@ -168,13 +170,14 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService return match; } } - + @Override - public ClientLoanAccountSummaryCollectionData retrieveClientAccountDetails(final Long clientId) { + public ClientLoanAccountSummaryCollectionData retrieveClientAccountDetails( + final Long clientId) { try { AppUser currentUser = this.context.authenticatedUser(); - + List pendingApprovalLoans = new ArrayList(); List awaitingDisbursalLoans = new ArrayList(); List openLoans = new ArrayList(); @@ -182,14 +185,18 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService ClientLoanAccountSummaryDataMapper rm = new ClientLoanAccountSummaryDataMapper(); - String sql = "select " + rm.loanAccountSummarySchema() + " where l.client_id = ? and l.org_id = ?"; + String sql = "select " + rm.loanAccountSummarySchema() + + " where l.client_id = ? and l.org_id = ?"; - List results = this.jdbcTemplate.query(sql, rm, new Object[] {clientId, currentUser.getOrganisation().getId()}); + List results = this.jdbcTemplate + .query(sql, rm, new Object[] { clientId, + currentUser.getOrganisation().getId() }); if (results != null) { for (ClientLoanAccountSummaryData row : results) { - - LoanStatusMapper statusMapper = new LoanStatusMapper(row.getLoanStatusId()); - + + LoanStatusMapper statusMapper = new LoanStatusMapper( + row.getLoanStatusId()); + if (statusMapper.isOpen()) { openLoans.add(row); } else if (statusMapper.isAwaitingDisbursal()) { @@ -201,58 +208,67 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } } } - - return new ClientLoanAccountSummaryCollectionData(pendingApprovalLoans, awaitingDisbursalLoans, openLoans, closedLoans); - + + return new ClientLoanAccountSummaryCollectionData( + pendingApprovalLoans, awaitingDisbursalLoans, openLoans, + closedLoans); + } catch (EmptyResultDataAccessException e) { throw new ClientNotFoundException(clientId); } } - - private static final class ClientLoanAccountSummaryDataMapper implements RowMapper { + + private static final class ClientLoanAccountSummaryDataMapper implements + RowMapper { public String loanAccountSummarySchema() { - - StringBuilder loanAccountSummary = new StringBuilder("l.id as id, l.external_id as externalId,"); - loanAccountSummary.append("l.product_id as productId, lp.name as productName,") - .append("l.loan_status_id as statusId, ls.display_name as statusName ") - .append("from portfolio_loan l ") - .append("LEFT JOIN portfolio_product_loan AS lp ON lp.id = l.product_id ") - .append("LEFT JOIN ref_loan_status AS ls ON ls.id = l.loan_status_id "); - + + StringBuilder loanAccountSummary = new StringBuilder( + "l.id as id, l.external_id as externalId,"); + loanAccountSummary + .append("l.product_id as productId, lp.name as productName,") + .append("l.loan_status_id as statusId, ls.display_name as statusName ") + .append("from portfolio_loan l ") + .append("LEFT JOIN portfolio_product_loan AS lp ON lp.id = l.product_id ") + .append("LEFT JOIN ref_loan_status AS ls ON ls.id = l.loan_status_id "); + return loanAccountSummary.toString(); } @Override - public ClientLoanAccountSummaryData mapRow(final ResultSet rs, final int rowNum) throws SQLException { + public ClientLoanAccountSummaryData mapRow(final ResultSet rs, + final int rowNum) throws SQLException { Long id = JdbcSupport.getLong(rs, "id"); String externalId = rs.getString("externalId"); Long productId = JdbcSupport.getLong(rs, "productId"); String loanProductName = rs.getString("productName"); Integer loanStatusId = JdbcSupport.getInteger(rs, "statusId"); -// String lifeCycleStatusText = rs.getString("statusName"); -// -// LoanStatusMapper statusMapper = new LoanStatusMapper(loanStatusId); -// -// boolean pendingApproval = statusMapper.isPendingApproval(); -// boolean waitingForDisbursal = statusMapper.isAwaitingDisbursal(); -// boolean open = statusMapper.isOpen(); -// boolean closed = statusMapper.isClosed(); - - return new ClientLoanAccountSummaryData(id, externalId, productId, loanProductName, loanStatusId); + // String lifeCycleStatusText = rs.getString("statusName"); + // + // LoanStatusMapper statusMapper = new + // LoanStatusMapper(loanStatusId); + // + // boolean pendingApproval = statusMapper.isPendingApproval(); + // boolean waitingForDisbursal = statusMapper.isAwaitingDisbursal(); + // boolean open = statusMapper.isOpen(); + // boolean closed = statusMapper.isClosed(); + + return new ClientLoanAccountSummaryData(id, externalId, productId, + loanProductName, loanStatusId); } } - - + @Override public NoteData retrieveClientNote(Long clientId, Long noteId) { try { AppUser currentUser = context.authenticatedUser(); - // FIXME - use join on sql query to fetch user information for note rather than fetching users? - Collection allUsers = this.appUserReadPlatformService.retrieveAllUsers(); + // FIXME - use join on sql query to fetch user information for note + // rather than fetching users? + Collection allUsers = this.appUserReadPlatformService + .retrieveAllUsers(); NoteMapper noteMapper = new NoteMapper(allUsers); @@ -272,8 +288,10 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService AppUser currentUser = context.authenticatedUser(); - // FIXME - use join on sql query to fetch user information for note rather than fetching users? - Collection allUsers = this.appUserReadPlatformService.retrieveAllUsers(); + // FIXME - use join on sql query to fetch user information for note + // rather than fetching users? + Collection allUsers = this.appUserReadPlatformService + .retrieveAllUsers(); NoteMapper noteMapper = new NoteMapper(allUsers); @@ -315,17 +333,18 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService Long createdById = JdbcSupport.getLong(rs, "createdById"); String createdByUsername = findUserById(createdById, allUsers); - DateTime lastModifiedDate = JdbcSupport.getDateTime(rs, "lastModifiedDate"); + DateTime lastModifiedDate = JdbcSupport.getDateTime(rs, + "lastModifiedDate"); Long lastModifiedById = JdbcSupport.getLong(rs, "lastModifiedById"); String updatedByUsername = findUserById(createdById, allUsers); - return new NoteData(id, clientId, loanId, transactionId, - noteType, note, createdDate, createdById, - createdByUsername, lastModifiedDate, lastModifiedById, - updatedByUsername); + return new NoteData(id, clientId, loanId, transactionId, noteType, + note, createdDate, createdById, createdByUsername, + lastModifiedDate, lastModifiedById, updatedByUsername); } - private String findUserById(Long createdById, Collection allUsers) { + private String findUserById(Long createdById, + Collection allUsers) { String username = ""; for (AppUserData appUserData : allUsers) { if (appUserData.getId().equals(createdById)) {