From 6ae5d7d52d0e9f7b54fd663e02a9f07b5abdc749 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 29 Oct 2015 18:19:52 +0530 Subject: [PATCH] MIFOSX-2303 Add Product/Branch/Category filtering to Loan Provisioning report --- .../api/ProvisioningEntriesApiResource.java | 67 ++-- .../data/ProvisioningEntryData.java | 6 +- ...rovisioningEntriesReadPlatformService.java | 6 +- ...sioningEntriesReadPlatformServiceImpl.java | 290 ++++++++++++------ .../core/service/SearchParameters.java | 64 ++++ .../api/ProvisioningCategoryApiResource.java | 1 - 6 files changed, 310 insertions(+), 124 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/api/ProvisioningEntriesApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/api/ProvisioningEntriesApiResource.java index e4ddb3599..1d0e5d239 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/api/ProvisioningEntriesApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/api/ProvisioningEntriesApiResource.java @@ -19,7 +19,9 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; import org.mifosplatform.accounting.provisioning.constant.ProvisioningEntriesApiConstants; +import org.mifosplatform.accounting.provisioning.data.LoanProductProvisioningEntryData; import org.mifosplatform.accounting.provisioning.data.ProvisioningEntryData; +import org.mifosplatform.accounting.provisioning.domain.LoanProductProvisioningEntry; import org.mifosplatform.accounting.provisioning.service.ProvisioningEntriesReadPlatformService; import org.mifosplatform.commands.domain.CommandWrapper; import org.mifosplatform.commands.service.CommandWrapperBuilder; @@ -29,6 +31,8 @@ import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; +import org.mifosplatform.infrastructure.core.service.Page; +import org.mifosplatform.infrastructure.core.service.SearchParameters; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; @@ -42,20 +46,22 @@ public class ProvisioningEntriesApiResource { private final PlatformSecurityContext platformSecurityContext; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final DefaultToApiJsonSerializer toApiJsonSerializer; - private final ProvisioningEntriesReadPlatformService provisioningEntriesReadPlatformService ; + private final DefaultToApiJsonSerializer entriesApiJsonSerializer; + private final ProvisioningEntriesReadPlatformService provisioningEntriesReadPlatformService; private final ApiRequestParameterHelper apiRequestParameterHelper; - + @Autowired public ProvisioningEntriesApiResource(final PlatformSecurityContext platformSecurityContext, final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService, final DefaultToApiJsonSerializer toApiJsonSerializer, final ProvisioningEntriesReadPlatformService provisioningEntriesReadPlatformService, - final ApiRequestParameterHelper apiRequestParameterHelper) { + final ApiRequestParameterHelper apiRequestParameterHelper, final DefaultToApiJsonSerializer entriesApiJsonSerializer) { this.platformSecurityContext = platformSecurityContext; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; this.toApiJsonSerializer = toApiJsonSerializer; - this.provisioningEntriesReadPlatformService = provisioningEntriesReadPlatformService ; - this.apiRequestParameterHelper = apiRequestParameterHelper ; + this.provisioningEntriesReadPlatformService = provisioningEntriesReadPlatformService; + this.apiRequestParameterHelper = apiRequestParameterHelper; + this.entriesApiJsonSerializer = entriesApiJsonSerializer; } @POST @@ -68,7 +74,7 @@ public class ProvisioningEntriesApiResource { final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); return this.toApiJsonSerializer.serialize(commandProcessingResult); } - + @POST @Path("{entryId}") @Consumes({ MediaType.APPLICATION_JSON }) @@ -77,36 +83,53 @@ public class ProvisioningEntriesApiResource { final String apiRequestBodyAsJson) { CommandWrapper commandWrapper = null; this.platformSecurityContext.authenticatedUser(); - if("createjournalentry".equals(commandParam)) { + if ("createjournalentry".equals(commandParam)) { commandWrapper = new CommandWrapperBuilder().createProvisioningJournalEntries(entryId).withJson(apiRequestBodyAsJson).build(); - final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); - return this.toApiJsonSerializer.serialize(commandProcessingResult); - }else if("recreateprovisioningentry".equals(commandParam)) { + final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService + .logCommandSource(commandWrapper); + return this.toApiJsonSerializer.serialize(commandProcessingResult); + } else if ("recreateprovisioningentry".equals(commandParam)) { commandWrapper = new CommandWrapperBuilder().reCreateProvisioningEntries(entryId).withJson(apiRequestBodyAsJson).build(); - final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); - return this.toApiJsonSerializer.serialize(commandProcessingResult); + final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService + .logCommandSource(commandWrapper); + return this.toApiJsonSerializer.serialize(commandProcessingResult); } - throw new UnrecognizedQueryParamException("command", commandParam); + throw new UnrecognizedQueryParamException("command", commandParam); } - + @GET @Path("{entryId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String retrieveProvisioningEntry(@PathParam("entryId") final Long entryId, @Context final UriInfo uriInfo) { - platformSecurityContext.authenticatedUser() ; - ProvisioningEntryData data = this.provisioningEntriesReadPlatformService.retrieveProvisioningEntryData(entryId) ; + platformSecurityContext.authenticatedUser(); + ProvisioningEntryData data = this.provisioningEntriesReadPlatformService.retrieveProvisioningEntryData(entryId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, data, ProvisioningEntriesApiConstants.PROVISIONING_ENTRY_PARAMETERS); + return this.toApiJsonSerializer.serialize(settings, data, ProvisioningEntriesApiConstants.PROVISIONING_ENTRY_PARAMETERS); } - + + @GET + @Path("entries") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveProviioningEntries(@QueryParam("entryId") final Long entryId, @QueryParam("offset") final Integer offset, + @QueryParam("limit") final Integer limit, @QueryParam("officeId") final Long officeId, + @QueryParam("productId") final Long productId, @QueryParam("categoryId") final Long categoryId, @Context final UriInfo uriInfo) { + this.platformSecurityContext.authenticatedUser(); + SearchParameters params = SearchParameters.forProvisioningEntries(entryId, officeId, productId, categoryId, offset, limit); + Page entries = this.provisioningEntriesReadPlatformService.retrieveProvisioningEntries(params); + final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); + return this.entriesApiJsonSerializer.serialize(settings, entries, ProvisioningEntriesApiConstants.PROVISIONING_ENTRY_PARAMETERS); + } + @GET @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String retrieveAllProvisioningEntries(@Context final UriInfo uriInfo) { - platformSecurityContext.authenticatedUser() ; - Collection data = this.provisioningEntriesReadPlatformService.retrieveAllProvisioningEntries() ; + public String retrieveAllProvisioningEntries(@QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, + @Context final UriInfo uriInfo) { + platformSecurityContext.authenticatedUser(); + Page data = this.provisioningEntriesReadPlatformService.retrieveAllProvisioningEntries(offset, limit); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, data, ProvisioningEntriesApiConstants.ALL_PROVISIONING_ENTRIES); + return this.entriesApiJsonSerializer.serialize(settings, data, ProvisioningEntriesApiConstants.ALL_PROVISIONING_ENTRIES); } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/data/ProvisioningEntryData.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/data/ProvisioningEntryData.java index 902c0cb96..31f400ac1 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/data/ProvisioningEntryData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/data/ProvisioningEntryData.java @@ -5,6 +5,7 @@ */ package org.mifosplatform.accounting.provisioning.data; +import java.math.BigDecimal; import java.util.Collection; import java.util.Date; @@ -24,6 +25,8 @@ public class ProvisioningEntryData { Long modifiedById ; private String modifiedUser ; + + private BigDecimal reservedAmount ; private Collection provisioningEntries ; @@ -33,7 +36,7 @@ public class ProvisioningEntryData { } public ProvisioningEntryData(Long id, Boolean journalEntry, Long createdById, - String createdUser, Date createdDate, Long modifiedById, String modifiedUser) { + String createdUser, Date createdDate, Long modifiedById, String modifiedUser, BigDecimal totalReservedAmount) { this.id = id ; this.journalEntry = journalEntry ; this.createdById = createdById ; @@ -41,6 +44,7 @@ public class ProvisioningEntryData { this.modifiedById = modifiedById ; this.modifiedUser = modifiedUser ; this.createdDate = createdDate ; + this.reservedAmount = totalReservedAmount ; } public void setEntries(Collection provisioningEntries) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformService.java index 71af21efe..eee0c23d2 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformService.java @@ -10,6 +10,8 @@ import java.util.Date; import org.mifosplatform.accounting.provisioning.data.LoanProductProvisioningEntryData; import org.mifosplatform.accounting.provisioning.data.ProvisioningEntryData; +import org.mifosplatform.infrastructure.core.service.Page; +import org.mifosplatform.infrastructure.core.service.SearchParameters; public interface ProvisioningEntriesReadPlatformService { @@ -18,11 +20,13 @@ public interface ProvisioningEntriesReadPlatformService { public ProvisioningEntryData retrieveProvisioningEntryData(Long entryId) ; - public Collection retrieveAllProvisioningEntries() ; + public Page retrieveAllProvisioningEntries(Integer offset, Integer limit) ; public ProvisioningEntryData retrieveProvisioningEntryData(String date) ; public ProvisioningEntryData retrieveProvisioningEntryDataByCriteriaId(Long criteriaId) ; public ProvisioningEntryData retrieveExistingProvisioningIdDateWithJournals() ; + + public Page retrieveProvisioningEntries(SearchParameters searchParams) ; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformServiceImpl.java index 0cb6bc7fe..30c984df4 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformServiceImpl.java @@ -9,14 +9,19 @@ import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.mifosplatform.accounting.provisioning.data.LoanProductProvisioningEntryData; import org.mifosplatform.accounting.provisioning.data.ProvisioningEntryData; +import org.mifosplatform.infrastructure.core.service.Page; +import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.RoutingDataSource; +import org.mifosplatform.infrastructure.core.service.SearchParameters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -28,6 +33,9 @@ public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningE private final JdbcTemplate jdbcTemplate; + private final PaginationHelper loanProductProvisioningEntryDataPaginationHelper = new PaginationHelper<>(); + private final PaginationHelper provisioningEntryDataPaginationHelper = new PaginationHelper<>(); + @Autowired public ProvisioningEntriesReadPlatformServiceImpl(final RoutingDataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); @@ -58,8 +66,7 @@ public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningE .append(" JOIN m_provisioning_criteria_definition pcd on pcd.criteria_id = lpm.criteria_id and ") .append("(pcd.min_age <= GREATEST(datediff(").append(formattedDate).append(",sch.duedate),0) and ") .append("GREATEST(datediff(").append(formattedDate).append(",sch.duedate),0) <= pcd.max_age) and ") - .append("pcd.criteria_id is not null ") - .append("LEFT JOIN m_client mclient ON mclient.id = loan.client_id ") + .append("pcd.criteria_id is not null ").append("LEFT JOIN m_client mclient ON mclient.id = loan.client_id ") .append("LEFT JOIN m_group mgroup ON mgroup.id = loan.group_id ") .append("where loan.loan_status_id=300 and sch.completed_derived=false ") .append("GROUP BY loan.id order by loan.product_id"); @@ -77,9 +84,9 @@ public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningE BigDecimal outstandingBalance = rs.getBigDecimal("outstandingbalance"); Long liabilityAccountCode = rs.getLong("liability_account"); Long expenseAccountCode = rs.getLong("expense_account"); - Long criteriaId = rs.getLong("criteriaid") ; + Long criteriaId = rs.getLong("criteriaid"); Long historyId = null; - + return new LoanProductProvisioningEntryData(historyId, officeId, currentcyCode, productId, categoryId, overdueDays, percentage, outstandingBalance, liabilityAccountCode, expenseAccountCode, criteriaId); } @@ -91,155 +98,240 @@ public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningE @Override public ProvisioningEntryData retrieveProvisioningEntryData(Long entryId) { - LoanProductProvisioningEntryRowMapper mapper = new LoanProductProvisioningEntryRowMapper(); - final String sql = mapper.getSchema() + " where entry.history_id = ?"; - Collection entries = this.jdbcTemplate.query(sql, mapper, new Object[] { entryId }); - ProvisioningEntryDataMapper mapper1 = new ProvisioningEntryDataMapper() ; - final String sql1 = mapper1.getSchema() + " where entry.id = ?"; - ProvisioningEntryData data= this.jdbcTemplate.queryForObject(sql1, mapper1, new Object[] { entryId }); - data.setEntries(entries) ; - return data ; + ProvisioningEntryDataMapperWithSumReserved mapper1 = new ProvisioningEntryDataMapperWithSumReserved(); + final String sql1 = "select" + mapper1.getSchema() + " where entry.id = ?"; + ProvisioningEntryData data = this.jdbcTemplate.queryForObject(sql1, mapper1, new Object[] { entryId }); + return data; } private static final class ProvisioningEntryDataMapper implements RowMapper { + private final StringBuilder sqlQuery = new StringBuilder() - .append("select entry.id, journal_entry_created, createdby_id, created_date, created.username as createduser,") - .append("lastmodifiedby_id, modified.username as modifieduser, lastmodified_date ") - .append("from m_provisioning_history entry ") - .append("left JOIN m_appuser created ON created.id = entry.createdby_id ") - .append("left JOIN m_appuser modified ON modified.id = entry.lastmodifiedby_id ") ; + .append(" entry.id, entry.journal_entry_created, entry.createdby_id, entry.created_date, created.username as createduser,") + .append("entry.lastmodifiedby_id, modified.username as modifieduser, entry.lastmodified_date ") + .append("from m_provisioning_history entry ").append("left JOIN m_appuser created ON created.id = entry.createdby_id ") + .append("left JOIN m_appuser modified ON modified.id = entry.lastmodifiedby_id "); @Override @SuppressWarnings("unused") public ProvisioningEntryData mapRow(ResultSet rs, int rowNum) throws SQLException { - Long id = rs.getLong("id") ; - Boolean journalEntry = rs.getBoolean("journal_entry_created") ; - Long createdById = rs.getLong("createdby_id") ; - String createdUser = rs.getString("createduser") ; - Date createdDate = rs.getDate("created_date") ; - Long modifiedById = rs.getLong("lastmodifiedby_id") ; - String modifieUser = rs.getString("modifieduser") ; - return new ProvisioningEntryData(id, journalEntry, createdById, createdUser, createdDate, modifiedById, modifieUser); + Long id = rs.getLong("id"); + Boolean journalEntry = rs.getBoolean("journal_entry_created"); + Long createdById = rs.getLong("createdby_id"); + String createdUser = rs.getString("createduser"); + Date createdDate = rs.getDate("created_date"); + Long modifiedById = rs.getLong("lastmodifiedby_id"); + String modifieUser = rs.getString("modifieduser"); + BigDecimal totalReservedAmount = null; + return new ProvisioningEntryData(id, journalEntry, createdById, createdUser, createdDate, modifiedById, modifieUser, + totalReservedAmount); } - + public String getSchema() { - return sqlQuery.toString() ; + return sqlQuery.toString(); } - + } + private static final class LoanProductProvisioningEntryRowMapper implements RowMapper { private final StringBuilder sqlQuery = new StringBuilder() - .append("select entry.id, entry.history_id as historyId, office_id, entry.criteria_id as criteriaid, office.name as officename, product.name as productname, entry.product_id, ") - .append("category_id, category.category_name, liability.id as liabilityid, liability.gl_code as liabilitycode, liability.name as liabilityname, ") - .append("expense.id as expenseid, expense.gl_code as expensecode, expense.name as expensename, entry.currency_code, entry.overdue_in_days, entry.reseve_amount from m_loanproduct_provisioning_entry entry ") - .append("left join m_office office ON office.id = entry.office_id ") - .append("left join m_product_loan product ON product.id = entry.product_id ") - .append("left join m_provision_category category ON category.id = entry.category_id ") - .append("left join acc_gl_account liability ON liability.id = entry.liability_account ") - .append("left join acc_gl_account expense ON expense.id = entry.expense_account ") ; - + .append(" entry.id, entry.history_id as historyId, office_id, entry.criteria_id as criteriaid, office.name as officename, product.name as productname, entry.product_id, ") + .append("category_id, category.category_name, liability.id as liabilityid, liability.gl_code as liabilitycode, liability.name as liabilityname, ") + .append("expense.id as expenseid, expense.gl_code as expensecode, expense.name as expensename, entry.currency_code, entry.overdue_in_days, entry.reseve_amount from m_loanproduct_provisioning_entry entry ") + .append("left join m_office office ON office.id = entry.office_id ") + .append("left join m_product_loan product ON product.id = entry.product_id ") + .append("left join m_provision_category category ON category.id = entry.category_id ") + .append("left join acc_gl_account liability ON liability.id = entry.liability_account ") + .append("left join acc_gl_account expense ON expense.id = entry.expense_account "); + @Override @SuppressWarnings("unused") public LoanProductProvisioningEntryData mapRow(ResultSet rs, int rowNum) throws SQLException { - Long historyId = rs.getLong("historyId") ; + Long historyId = rs.getLong("historyId"); Long officeId = rs.getLong("office_id"); - String officeName = rs.getString("officename") ; + String officeName = rs.getString("officename"); Long productId = rs.getLong("product_id"); - String productName = rs.getString("productname") ; + String productName = rs.getString("productname"); String currentcyCode = rs.getString("currency_code"); Long overdueDays = rs.getLong("overdue_in_days"); Long categoryId = rs.getLong("category_id"); - String categoryName = rs.getString("category_name") ; + String categoryName = rs.getString("category_name"); BigDecimal amountreserved = rs.getBigDecimal("reseve_amount"); Long liabilityAccountCode = rs.getLong("liabilityid"); - String liabilityAccountglCode = rs.getString("liabilitycode") ; - String expenseAccountglCode = rs.getString("expensecode") ; + String liabilityAccountglCode = rs.getString("liabilitycode"); + String expenseAccountglCode = rs.getString("expensecode"); Long expenseAccountCode = rs.getLong("expenseid"); - Long criteriaId = rs.getLong("criteriaid") ; - String liabilityAccountName = rs.getString("liabilityname") ; - String expenseAccountName = rs.getString("expensename") ; - return new LoanProductProvisioningEntryData(historyId, officeId, officeName, currentcyCode, productId, productName, categoryId, categoryName, overdueDays, amountreserved, - liabilityAccountCode, liabilityAccountglCode, liabilityAccountName, expenseAccountCode, expenseAccountglCode, expenseAccountName, criteriaId); + Long criteriaId = rs.getLong("criteriaid"); + String liabilityAccountName = rs.getString("liabilityname"); + String expenseAccountName = rs.getString("expensename"); + return new LoanProductProvisioningEntryData(historyId, officeId, officeName, currentcyCode, productId, productName, categoryId, + categoryName, overdueDays, amountreserved, liabilityAccountCode, liabilityAccountglCode, liabilityAccountName, + expenseAccountCode, expenseAccountglCode, expenseAccountName, criteriaId); } - + public String getSchema() { - return sqlQuery.toString() ; + return sqlQuery.toString(); } } - - @Override - public Collection retrieveAllProvisioningEntries() { - ProvisioningEntryDataMapper mapper = new ProvisioningEntryDataMapper() ; - final String sql1 = mapper.getSchema() + " order by entry.created_date "; - return this.jdbcTemplate.query(sql1, mapper, new Object[] {}); + + private static final class ProvisioningEntryDataMapperWithSumReserved implements RowMapper { + + private final StringBuilder sqlQuery = new StringBuilder() + .append(" entry.id, journal_entry_created, createdby_id, created_date, created.username as createduser,") + .append("lastmodifiedby_id, modified.username as modifieduser, lastmodified_date, SUM(reserved.reseve_amount) as totalreserved ") + .append("from m_provisioning_history entry ") + .append("JOIN m_loanproduct_provisioning_entry reserved on entry.id = reserved.history_id ") + .append("left JOIN m_appuser created ON created.id = entry.createdby_id ") + .append("left JOIN m_appuser modified ON modified.id = entry.lastmodifiedby_id "); + + @Override + @SuppressWarnings("unused") + public ProvisioningEntryData mapRow(ResultSet rs, int rowNum) throws SQLException { + Long id = rs.getLong("id"); + Boolean journalEntry = rs.getBoolean("journal_entry_created"); + Long createdById = rs.getLong("createdby_id"); + String createdUser = rs.getString("createduser"); + Date createdDate = rs.getDate("created_date"); + Long modifiedById = rs.getLong("lastmodifiedby_id"); + String modifieUser = rs.getString("modifieduser"); + BigDecimal totalReservedAmount = rs.getBigDecimal("totalreserved"); + return new ProvisioningEntryData(id, journalEntry, createdById, createdUser, createdDate, modifiedById, modifieUser, + totalReservedAmount); + } + + public String getSchema() { + return sqlQuery.toString(); + } + } - + + @Override + public Page retrieveAllProvisioningEntries(Integer offset, Integer limit) { + ProvisioningEntryDataMapper mapper = new ProvisioningEntryDataMapper(); + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); + sqlBuilder.append(mapper.getSchema()); + sqlBuilder.append(" order by entry.created_date"); + sqlBuilder.append(" limit ").append(limit); + sqlBuilder.append(" offset ").append(offset); + final String sqlCountRows = "SELECT FOUND_ROWS()"; + Object[] whereClauseItemsitems = new Object[] {}; + return this.provisioningEntryDataPaginationHelper.fetchPage(this.jdbcTemplate, sqlCountRows, sqlBuilder.toString(), + whereClauseItemsitems, mapper); + } + @Override public ProvisioningEntryData retrieveProvisioningEntryData(String date) { - ProvisioningEntryDataMapper mapper1 = new ProvisioningEntryDataMapper() ; - final String sql1 = mapper1.getSchema() + " where entry.created_date like " + "'"+date+"%'" ; - ProvisioningEntryData data = null ; + ProvisioningEntryDataMapper mapper1 = new ProvisioningEntryDataMapper(); + final String sql1 = "select " + mapper1.getSchema() + " where entry.created_date like " + "'" + date + "%'"; + ProvisioningEntryData data = null; try { - data= this.jdbcTemplate.queryForObject(sql1, mapper1, new Object[] {}); - }catch(EmptyResultDataAccessException e) { - + data = this.jdbcTemplate.queryForObject(sql1, mapper1, new Object[] {}); + } catch (EmptyResultDataAccessException e) { + } - - return data ; + + return data; } - + @Override public ProvisioningEntryData retrieveProvisioningEntryDataByCriteriaId(Long criteriaId) { - ProvisioningEntryData data = null ; + ProvisioningEntryData data = null; LoanProductProvisioningEntryRowMapper mapper = new LoanProductProvisioningEntryRowMapper(); - final String sql = mapper.getSchema() + " where entry.criteria_id = ?"; + final String sql = "select " + mapper.getSchema() + " where entry.criteria_id = ?"; Collection entries = this.jdbcTemplate.query(sql, mapper, new Object[] { criteriaId }); - if(entries != null && entries.size() > 0) { - Long entryId = ((LoanProductProvisioningEntryData)entries.toArray()[0]).getHistoryId() ; - ProvisioningEntryDataMapper mapper1 = new ProvisioningEntryDataMapper() ; - final String sql1 = mapper1.getSchema() + " where entry.id = ?"; - data= this.jdbcTemplate.queryForObject(sql1, mapper1, new Object[] { entryId }); - data.setEntries(entries) ; + if (entries != null && entries.size() > 0) { + Long entryId = ((LoanProductProvisioningEntryData) entries.toArray()[0]).getHistoryId(); + ProvisioningEntryDataMapper mapper1 = new ProvisioningEntryDataMapper(); + final String sql1 = "select " + mapper1.getSchema() + " where entry.id = ?"; + data = this.jdbcTemplate.queryForObject(sql1, mapper1, new Object[] { entryId }); + data.setEntries(entries); } - return data ; + return data; } @Override public ProvisioningEntryData retrieveExistingProvisioningIdDateWithJournals() { - ProvisioningEntryData data = null ; - ProvisioningEntryIdDateRowMapper mapper = new ProvisioningEntryIdDateRowMapper() ; + ProvisioningEntryData data = null; + ProvisioningEntryIdDateRowMapper mapper = new ProvisioningEntryIdDateRowMapper(); try { - data = this.jdbcTemplate.queryForObject(mapper.schema(), mapper, new Object[] {}); - }catch(EmptyResultDataAccessException e) { - data = null ; + data = this.jdbcTemplate.queryForObject(mapper.schema(), mapper, new Object[] {}); + } catch (EmptyResultDataAccessException e) { + data = null; } - return data ; + return data; } - + private static final class ProvisioningEntryIdDateRowMapper implements RowMapper { - StringBuffer buff = new StringBuffer() - .append("select history1.id, history1.created_date from m_provisioning_history history1 ") - .append("where history1.created_date = (select max(history2.created_date) from m_provisioning_history history2 ") - .append("where history2.journal_entry_created='1')"); - + StringBuffer buff = new StringBuffer().append("select history1.id, history1.created_date from m_provisioning_history history1 ") + .append("where history1.created_date = (select max(history2.created_date) from m_provisioning_history history2 ") + .append("where history2.journal_entry_created='1')"); + @Override @SuppressWarnings("unused") public ProvisioningEntryData mapRow(ResultSet rs, int rowNum) throws SQLException { - Map map = new HashMap<>() ; - Long id = rs.getLong("id") ; - Date createdDate = rs.getDate("created_date") ; - Long createdBy = null ; - String createdName = null ; - Long modifiedBy = null ; - String modifiedName = null ; - return new ProvisioningEntryData(id, Boolean.TRUE, createdBy, createdName, createdDate, modifiedBy, modifiedName) ; + Map map = new HashMap<>(); + Long id = rs.getLong("id"); + Date createdDate = rs.getDate("created_date"); + Long createdBy = null; + String createdName = null; + Long modifiedBy = null; + String modifiedName = null; + BigDecimal totalReservedAmount = null; + return new ProvisioningEntryData(id, Boolean.TRUE, createdBy, createdName, createdDate, modifiedBy, modifiedName, + totalReservedAmount); } - - public String schema() { - return buff.toString() ; + + public String schema() { + return buff.toString(); } } - + + @Override + public Page retrieveProvisioningEntries(SearchParameters searchParams) { + LoanProductProvisioningEntryRowMapper mapper = new LoanProductProvisioningEntryRowMapper(); + final StringBuilder sqlBuilder = new StringBuilder(200); + sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); + sqlBuilder.append(mapper.getSchema()); + String whereClose = " where "; + List items = new ArrayList<>(); + + if (searchParams.isProvisioningEntryIdPassed()) { + sqlBuilder.append(whereClose + " entry.history_id = ?"); + items.add(searchParams.getProvisioningEntryId()); + whereClose = " and "; + } + + if (searchParams.isOfficeIdPassed()) { + sqlBuilder.append(whereClose + " entry.office_id = ?"); + items.add(searchParams.getOfficeId()); + whereClose = " and "; + } + + if (searchParams.isProductIdPassed()) { + sqlBuilder.append(whereClose + " entry.product_id = ?"); + items.add(searchParams.getProductId()); + whereClose = " and "; + } + + if (searchParams.isCategoryIdPassed()) { + sqlBuilder.append(whereClose + " entry.category_id = ?"); + items.add(searchParams.getCategoryId()); + } + sqlBuilder.append(" order by entry.id"); + + if (searchParams.isLimited()) { + sqlBuilder.append(" limit ").append(searchParams.getLimit()); + if (searchParams.isOffset()) { + sqlBuilder.append(" offset ").append(searchParams.getOffset()); + } + } + Object[] whereClauseItemsitems = items.toArray(); + final String sqlCountRows = "SELECT FOUND_ROWS()"; + return this.loanProductProvisioningEntryDataPaginationHelper.fetchPage(this.jdbcTemplate, sqlCountRows, sqlBuilder.toString(), + whereClauseItemsitems, mapper); + } + } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/service/SearchParameters.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/service/SearchParameters.java index 3e4375db7..762d260a9 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/service/SearchParameters.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/service/SearchParameters.java @@ -30,6 +30,11 @@ public final class SearchParameters { private final Long savingsId; private final Boolean orphansOnly; + //Provisning Entries Search Params + private final Long provisioningEntryId ; + private final Long productId ; + private final Long categoryId ; + public static SearchParameters from(final String sqlSearch, final Long officeId, final String externalId, final String name, final String hierarchy) { final Long staffId = null; @@ -134,6 +139,11 @@ public final class SearchParameters { loanId, savingsId, orphansOnly); } + public final static SearchParameters forProvisioningEntries(final Long provisioningEntryId, final Long officeId, final Long productId, + final Long categoryId, final Integer offset, final Integer limit) { + return new SearchParameters(provisioningEntryId, officeId, productId, categoryId, offset, limit) ; + } + public static SearchParameters forSavings(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { @@ -183,8 +193,37 @@ public final class SearchParameters { this.savingsId = savingsId; this.orphansOnly = orphansOnly; this.currencyCode = null; + this.provisioningEntryId = null ; + this.productId = null ; + this.categoryId = null ; + } + private SearchParameters(final Long provisioningEntryId, final Long officeId, final Long productId, final Long categoryId, + final Integer offset, final Integer limit) { + this.sqlSearch = null; + this.externalId = null; + this.name = null; + this.hierarchy = null; + this.firstname = null; + this.lastname = null; + this.orderBy = null; + this.sortOrder = null; + this.staffId = null; + this.accountNo = null; + this.loanId = null; + this.savingsId = null; + this.orphansOnly = null; + this.currencyCode = null; + this.officeId = officeId; + this.offset = offset; + this.limit = limit; + this.provisioningEntryId = provisioningEntryId ; + this.productId = productId ; + this.categoryId = categoryId ; + + } + public SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name, final String hierarchy, final String firstname, final String lastname, final Integer offset, final Integer limit, final String orderBy, final String sortOrder, final Long staffId, final String accountNo, final Long loanId, final Long savingsId, @@ -206,6 +245,9 @@ public final class SearchParameters { this.savingsId = savingsId; this.orphansOnly = orphansOnly; this.currencyCode = currencyCode; + this.provisioningEntryId = null ; + this.productId = null ; + this.categoryId = null ; } public boolean isOrderByRequested() { @@ -331,6 +373,28 @@ public final class SearchParameters { public Boolean isOrphansOnly() { if (this.orphansOnly != null) { return this.orphansOnly; } return false; + } + + public Long getProvisioningEntryId() { + return this.provisioningEntryId; + } + + public boolean isProvisioningEntryIdPassed() { + return this.provisioningEntryId != null && this.provisioningEntryId != 0 ; + } + + public Long getProductId() { + return this.productId; + } + public boolean isProductIdPassed() { + return this.productId != null && this.productId != 0 ; + } + public Long getCategoryId() { + return this.categoryId; + } + + public boolean isCategoryIdPassed() { + return this.categoryId != null && this.categoryId != 0 ; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/api/ProvisioningCategoryApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/api/ProvisioningCategoryApiResource.java index 92be4dabc..a8e58bfe8 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/api/ProvisioningCategoryApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/api/ProvisioningCategoryApiResource.java @@ -58,7 +58,6 @@ public class ProvisioningCategoryApiResource { } @GET - @Path("template") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String retrieveAll(@Context final UriInfo uriInfo) {