MIFOSX-339: use common search parameters for loans and journal entries retrieve all as it contains logic and api for dealing with limits.

This commit is contained in:
Keith Woodlock
2013-05-09 11:30:46 +01:00
parent 2dba94f198
commit 57791b8f37
9 changed files with 94 additions and 79 deletions
@@ -20,9 +20,6 @@ import org.apache.commons.lang.StringUtils;
* Class for parsing dates sent as query parameters
*
* TODO: Vishwas Should move this class to a more generic package
*
* @author
*
*/
public class DateParam {
@@ -34,6 +34,7 @@ import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSeriali
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.group.service.SearchParameters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@@ -80,8 +81,6 @@ public class JournalEntriesApiResource {
this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
Page<JournalEntryData> glJournalEntries = null;
Date fromDate = null;
if (fromDateParam != null) {
fromDate = fromDateParam.getDate();
@@ -90,11 +89,14 @@ public class JournalEntriesApiResource {
if (toDateParam != null) {
toDate = toDateParam.getDate();
}
glJournalEntries = this.journalEntryReadPlatformService.retrieveAll(officeId, glAccountId, onlyManualEntries, fromDate, toDate,
offset, limit, orderBy, sortOrder, transactionId);
final SearchParameters searchParameters = SearchParameters.forJournalEntries(officeId, offset, limit, orderBy, sortOrder);
Page<JournalEntryData> glJournalEntries = this.journalEntryReadPlatformService.retrieveAll(searchParameters, glAccountId,
onlyManualEntries, fromDate, toDate, transactionId);
return this.apiJsonSerializerService.serialize(glJournalEntries);
}
@GET
@Path("{journalEntryId}")
@Consumes({ MediaType.APPLICATION_JSON })
@@ -9,12 +9,13 @@ import java.util.Date;
import org.mifosplatform.accounting.journalentry.data.JournalEntryData;
import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.portfolio.group.service.SearchParameters;
public interface JournalEntryReadPlatformService {
JournalEntryData retrieveGLJournalEntryById(long glJournalEntryId);
Page<JournalEntryData> retrieveAll(Long officeId, Long glAccountId, Boolean onlyManualEntries, Date fromDate, Date toDate,
Integer offset, Integer limit, String orderBy, String sortOrder, String transactionId);
Page<JournalEntryData> retrieveAll(SearchParameters searchParameters, Long glAccountId, Boolean onlyManualEntries, Date fromDate,
Date toDate, String transactionId);
}
@@ -23,6 +23,7 @@ import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.infrastructure.core.service.PaginationHelper;
import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource;
import org.mifosplatform.portfolio.group.service.SearchParameters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -33,7 +34,7 @@ import org.springframework.stereotype.Service;
public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlatformService {
private final JdbcTemplate jdbcTemplate;
private final GLJournalEntryMapper journalEntryMapper = new GLJournalEntryMapper();
private final PaginationHelper<JournalEntryData> paginationHelper = new PaginationHelper<JournalEntryData>();
@@ -89,16 +90,15 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
final Boolean reversed = rs.getBoolean("reversed");
final String referenceNumber = rs.getString("referenceNumber");
return new JournalEntryData(id, officeId, officeName, glAccountName, glAccountId, glCode, accountType,
transactionDate, entryType, amount, transactionId, manualEntry, entityType, entityId, createdByUserId, createdDate,
createdByUserName, comments, reversed, referenceNumber);
return new JournalEntryData(id, officeId, officeName, glAccountName, glAccountId, glCode, accountType, transactionDate,
entryType, amount, transactionId, manualEntry, entityType, entityId, createdByUserId, createdDate, createdByUserName,
comments, reversed, referenceNumber);
}
}
@Override
public Page<JournalEntryData> retrieveAll(final Long officeId, final Long glAccountId, final Boolean onlyManualEntries,
final Date fromDate, final Date toDate, final Integer offset, final Integer limit, final String orderBy,
final String sortOrder, final String transactionId) {
public Page<JournalEntryData> retrieveAll(final SearchParameters searchParameters, final Long glAccountId,
final Boolean onlyManualEntries, final Date fromDate, final Date toDate, final String transactionId) {
StringBuilder sqlBuilder = new StringBuilder(200);
sqlBuilder.append("select SQL_CALC_FOUND_ROWS ");
@@ -113,9 +113,9 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
arrayPos = arrayPos + 1;
}
if (officeId != null && officeId != 0) {
if (searchParameters.isOfficeIdPassed()) {
sqlBuilder.append(" and journalEntry.office_id = ?");
objectArray[arrayPos] = officeId;
objectArray[arrayPos] = searchParameters.getOfficeId();
arrayPos = arrayPos + 1;
}
@@ -156,26 +156,20 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
}
}
if (StringUtils.isNotBlank(orderBy)) {
sqlBuilder.append(" order by ").append(orderBy);
if (StringUtils.isNotBlank(sortOrder)) {
sqlBuilder.append(' ').append(sortOrder);
if (searchParameters.isOrderByRequested()) {
sqlBuilder.append(" order by ").append(searchParameters.getOrderBy());
if (searchParameters.isSortOrderProvided()) {
sqlBuilder.append(' ').append(searchParameters.getSortOrder());
}
}
if (limit != null && limit > 0) {
Integer maxLimitAllowed = 200;
if (limit < maxLimitAllowed) {
maxLimitAllowed = limit;
if (searchParameters.isLimited()) {
sqlBuilder.append(" limit ").append(searchParameters.getLimit());
if (searchParameters.isOffset()) {
sqlBuilder.append(" offset ").append(searchParameters.getOffset());
}
sqlBuilder.append(" limit ").append(maxLimitAllowed);
if (offset != null) {
sqlBuilder.append(" offset ").append(offset);
}
} else if (limit != null && limit == -1) {
;
} else
sqlBuilder.append(" limit ").append(200);
}
final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos);
final String sqlCountRows = "SELECT FOUND_ROWS()";
@@ -90,9 +90,6 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
sqlBuilder.append(" and (").append(extraCriteria).append(")");
}
// DONT order by default - just use database natural ordering so doesnt
// have to scan entire database table.
// sql += " order by c.display_name ASC, c.account_no ASC";
if (searchParameters.isOrderByRequested()) {
sqlBuilder.append(" order by ").append(searchParameters.getOrderBy());
@@ -30,20 +30,35 @@ public final class SearchParameters {
final String displayName, final String firstname, final String lastname, final String hierarchy, final Integer offset,
final Integer limit, final String orderBy, final String sortOrder) {
Integer maxLimitAllowed = getCheckedLimit(200, limit);
Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(sqlSearch, officeId, externalId, displayName, hierarchy, firstname, lastname, offset, maxLimitAllowed,
orderBy, sortOrder);
}
public static SearchParameters forGroups(final String sqlSearch, final Long officeId, final String externalId,
final String name, final String hierarchy, final Integer offset,
final Integer limit, final String orderBy, final String sortOrder) {
Integer maxLimitAllowed = getCheckedLimit(200, limit);
public static SearchParameters forGroups(final String sqlSearch, final Long officeId, final String externalId, final String name,
final String hierarchy, final Integer offset, final Integer limit, final String orderBy, final String sortOrder) {
return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed,
orderBy, sortOrder);
Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed, orderBy,
sortOrder);
}
public static SearchParameters forLoans(final String sqlSearch, final String externalId, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder) {
Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder);
}
public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy,
final String sortOrder) {
Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder);
}
private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
@@ -69,14 +84,25 @@ public final class SearchParameters {
public boolean isSortOrderProvided() {
return StringUtils.isNotBlank(this.sortOrder);
}
public static Integer getCheckedLimit(Integer maxLimitAllowed, Integer limit) {
if (limit != null && limit < maxLimitAllowed && limit > 0) {
return limit;
} else if (limit != null && limit == -1) {
return null;
} else
return maxLimitAllowed;
public static Integer getCheckedLimit(final Integer limit) {
final Integer maxLimitAllowed = 200;
// default to max limit first off
Integer checkedLimit = maxLimitAllowed;
if (limit != null && limit > 0) {
checkedLimit = limit;
} else if (limit != null) {
// unlimited case: limit provided and 0 or less
checkedLimit = null;
}
return checkedLimit;
}
public boolean isOfficeIdPassed() {
return this.officeId != null && this.officeId != 0;
}
public String getSqlSearch() {
@@ -54,6 +54,7 @@ import org.mifosplatform.portfolio.fund.data.FundData;
import org.mifosplatform.portfolio.fund.service.FundReadPlatformService;
import org.mifosplatform.portfolio.group.data.GroupGeneralData;
import org.mifosplatform.portfolio.group.service.GroupReadPlatformService;
import org.mifosplatform.portfolio.group.service.SearchParameters;
import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData;
import org.mifosplatform.portfolio.loanaccount.data.LoanChargeData;
import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData;
@@ -367,8 +368,10 @@ public class LoansApiResource {
@QueryParam("sortOrder") final String sortOrder) {
context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions);
final Page<LoanAccountData> loanBasicDetails = this.loanReadPlatformService.retrieveAll(sqlSearch, externalId, offset, limit,
orderBy, sortOrder);
final SearchParameters searchParameters = SearchParameters.forLoans(sqlSearch, externalId, offset, limit, orderBy, sortOrder);
final Page<LoanAccountData> loanBasicDetails = this.loanReadPlatformService.retrieveAll(searchParameters);
return this.toApiJsonSerializer.serialize(loanBasicDetails);
}
@@ -9,6 +9,7 @@ import java.util.Collection;
import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.portfolio.calendar.data.CalendarData;
import org.mifosplatform.portfolio.group.service.SearchParameters;
import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData;
import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData;
import org.mifosplatform.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData;
@@ -48,5 +49,5 @@ public interface LoanReadPlatformService {
Collection<CalendarData> retrieveCalendars(Long groupId);
Page<LoanAccountData> retrieveAll(String sqlSearch, String externalId, Integer offset, Integer limit, String orderBy, String sortOrder);
Page<LoanAccountData> retrieveAll(SearchParameters searchParameters);
}
@@ -42,6 +42,7 @@ import org.mifosplatform.portfolio.fund.data.FundData;
import org.mifosplatform.portfolio.fund.service.FundReadPlatformService;
import org.mifosplatform.portfolio.group.data.GroupGeneralData;
import org.mifosplatform.portfolio.group.service.GroupReadPlatformService;
import org.mifosplatform.portfolio.group.service.SearchParameters;
import org.mifosplatform.portfolio.loanaccount.data.DisbursementData;
import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData;
import org.mifosplatform.portfolio.loanaccount.data.LoanApplicationTimelineData;
@@ -173,8 +174,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
}
@Override
public Page<LoanAccountData> retrieveAll(final String sqlSearch, final String externalId, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder) {
public Page<LoanAccountData> retrieveAll(final SearchParameters searchParameters) {
StringBuilder sqlBuilder = new StringBuilder(200);
sqlBuilder.append("select SQL_CALC_FOUND_ROWS ");
@@ -183,38 +183,32 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
final Object[] objectArray = new Object[1];
int arrayPos = 0;
String sqlQueryCriteria = sqlSearch;
String sqlQueryCriteria = searchParameters.getSqlSearch();
if (StringUtils.isNotBlank(sqlQueryCriteria)) {
sqlQueryCriteria = sqlQueryCriteria.replaceAll("accountNo", "l.account_no");
sqlBuilder.append(" where (").append(sqlQueryCriteria).append(")");
}
if (StringUtils.isNotBlank(externalId)) {
if (StringUtils.isNotBlank(searchParameters.getExternalId())) {
sqlBuilder.append(" and l.external_id = ?");
objectArray[arrayPos] = externalId;
objectArray[arrayPos] = searchParameters.getExternalId();
arrayPos = arrayPos + 1;
}
if (StringUtils.isNotBlank(orderBy)) {
sqlBuilder.append(" order by ").append(orderBy);
if (StringUtils.isNotBlank(sortOrder)) {
sqlBuilder.append(' ').append(sortOrder);
if (searchParameters.isOrderByRequested()) {
sqlBuilder.append(" order by ").append(searchParameters.getOrderBy());
if (searchParameters.isSortOrderProvided()) {
sqlBuilder.append(' ').append(searchParameters.getSortOrder());
}
}
if (limit != null && limit > 0) {
Integer maxLimitAllowed = 200;
if (limit < maxLimitAllowed) {
maxLimitAllowed = limit;
if (searchParameters.isLimited()) {
sqlBuilder.append(" limit ").append(searchParameters.getLimit());
if (searchParameters.isOffset()) {
sqlBuilder.append(" offset ").append(searchParameters.getOffset());
}
sqlBuilder.append(" limit ").append(maxLimitAllowed);
if (offset != null) {
sqlBuilder.append(" offset ").append(offset);
}
} else if (limit != null && limit == -1) {
;
} else
sqlBuilder.append(" limit ").append(200);
}
final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos);
final String sqlCountRows = "SELECT FOUND_ROWS()";