diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java index bd3dcdf2d..8b673a16f 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java @@ -39,6 +39,7 @@ import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamExc import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; +import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.organisation.staff.data.BulkTransferLoanOfficerData; import org.mifosplatform.organisation.staff.data.StaffData; @@ -357,6 +358,20 @@ public class LoansApiResource { return this.toApiJsonSerializer.serialize(settings, loanAccount, LOAN_DATA_PARAMETERS); } + @GET + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveAll(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("externalId") final String externalId, + @QueryParam("underHierarchy") final String hierarchy, @QueryParam("offset") final Integer offset, + @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, + @QueryParam("sortOrder") final String sortOrder) { + + context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions); + final Page loanBasicDetails = this.loanReadPlatformService.retrieveAll(sqlSearch, externalId, offset, limit, + orderBy, sortOrder); + return this.toApiJsonSerializer.serialize(loanBasicDetails); + } + @POST @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java index 334eef348..7325cb7c8 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java @@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.loanaccount.service; import java.util.Collection; +import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.portfolio.calendar.data.CalendarData; import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData; @@ -46,4 +47,6 @@ public interface LoanReadPlatformService { LoanAccountData retrieveGroupAndMembersDetailsTemplate(Long groupId); Collection retrieveCalendars(Long groupId); + + Page retrieveAll(String sqlSearch, String externalId, Integer offset, Integer limit, String orderBy, String sortOrder); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java index 2d53cecd3..9775224d4 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -9,9 +9,11 @@ import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.joda.time.Days; import org.joda.time.LocalDate; import org.mifosplatform.infrastructure.codes.data.CodeValueData; @@ -19,6 +21,8 @@ import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformServi import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.infrastructure.core.domain.JdbcSupport; import org.mifosplatform.infrastructure.core.service.DateUtils; +import org.mifosplatform.infrastructure.core.service.Page; +import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.organisation.monetary.data.CurrencyData; @@ -87,6 +91,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { private final CodeValueReadPlatformService codeValueReadPlatformService; private final CalendarReadPlatformService calendarReadPlatformService; + private final PaginationHelper paginationHelper = new PaginationHelper(); + private final LoanMapper loaanLoanMapper = new LoanMapper(); @Autowired public LoanReadPlatformServiceImpl(final PlatformSecurityContext context, final LoanRepository loanRepository, @@ -165,6 +171,56 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } } + @Override + public Page retrieveAll(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, + final String orderBy, final String sortOrder) { + + StringBuilder sqlBuilder = new StringBuilder(200); + sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); + sqlBuilder.append(loaanLoanMapper.loanSchema()); + + final Object[] objectArray = new Object[1]; + int arrayPos = 0; + + String sqlQueryCriteria = sqlSearch; + if (StringUtils.isNotBlank(sqlQueryCriteria)) { + sqlQueryCriteria = sqlQueryCriteria.replaceAll("accountNo", "l.account_no"); + sqlBuilder.append(" where (").append(sqlQueryCriteria).append(")"); + } + + if (StringUtils.isNotBlank(externalId)) { + sqlBuilder.append(" and l.external_id = ?"); + objectArray[arrayPos] = externalId; + arrayPos = arrayPos + 1; + } + + if (StringUtils.isNotBlank(orderBy)) { + sqlBuilder.append(" order by ").append(orderBy); + if (StringUtils.isNotBlank(sortOrder)) { + sqlBuilder.append(' ').append(sortOrder); + } + } + + if (limit != null && limit > 0) { + Integer maxLimitAllowed = 200; + if (limit < maxLimitAllowed) { + maxLimitAllowed = limit; + } + 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()"; + return this.paginationHelper.fetchPage(this.jdbcTemplate, sqlCountRows, sqlBuilder.toString(), finalObjectArray, + this.loaanLoanMapper); + } + @Override public LoanAccountData retrieveTemplateWithClientAndProductDetails(final Long clientId, final Long productId) {