From 2ee5dedf9c0781ba7fcd19b6c33b470b19c05369 Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Fri, 24 Aug 2012 18:16:27 +0100 Subject: [PATCH] support bringing back pending approval and approved deposit accounts first of with client account summary. --- .../platform/api/ClientsApiResource.java | 9 +- .../ClientAccountSummaryCollectionData.java | 99 +++++++++++++++++++ .../api/data/ClientAccountSummaryData.java | 46 +++++++++ ...lientLoanAccountSummaryCollectionData.java | 69 ------------- .../data/ClientLoanAccountSummaryData.java | 65 ------------ .../ApiJsonSerializerService.java | 4 +- .../GoogleGsonApiJsonSerializerService.java | 11 ++- .../service/ClientReadPlatformService.java | 4 +- .../ClientReadPlatformServiceImpl.java | 86 ++++++++++++---- 9 files changed, 225 insertions(+), 168 deletions(-) create mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientAccountSummaryCollectionData.java create mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientAccountSummaryData.java delete mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLoanAccountSummaryCollectionData.java delete mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLoanAccountSummaryData.java diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientsApiResource.java index 7615ce442..4eab558b9 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientsApiResource.java @@ -24,7 +24,7 @@ import org.apache.commons.lang.StringUtils; import org.mifosng.platform.api.commands.ClientCommand; import org.mifosng.platform.api.commands.NoteCommand; import org.mifosng.platform.api.data.ClientData; -import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData; +import org.mifosng.platform.api.data.ClientAccountSummaryCollectionData; import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.api.data.NoteData; import org.mifosng.platform.api.data.OfficeLookup; @@ -216,7 +216,8 @@ public class ClientsApiResource { Set typicalResponseParameters = new HashSet( Arrays.asList("pendingApprovalLoans", "awaitingDisbursalLoans", "openLoans", "closedLoans", - "anyLoanCount", "pendingApprovalLoanCount", "awaitingDisbursalLoanCount", "activeLoanCount", "closedLoanCount") + "anyLoanCount", "pendingApprovalLoanCount", "awaitingDisbursalLoanCount", "activeLoanCount", "closedLoanCount", + "pendingApprovalDespositAccountsCount", "pendingApprovalDespositAccounts", "approvedDespositAccountsCount", "approvedDespositAccounts") ); Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); @@ -225,9 +226,9 @@ public class ClientsApiResource { } boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - ClientLoanAccountSummaryCollectionData clientAccount = this.clientReadPlatformService.retrieveClientAccountDetails(clientId); + ClientAccountSummaryCollectionData clientAccount = this.clientReadPlatformService.retrieveClientAccountDetails(clientId); - return this.apiJsonSerializerService.serializeClientLoanAccountSummaryCollectionDataToJson(prettyPrint, responseParameters, clientAccount); + return this.apiJsonSerializerService.serializeClientAccountSummaryCollectionDataToJson(prettyPrint, responseParameters, clientAccount); } @GET diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientAccountSummaryCollectionData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientAccountSummaryCollectionData.java new file mode 100644 index 000000000..912ab570a --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientAccountSummaryCollectionData.java @@ -0,0 +1,99 @@ +package org.mifosng.platform.api.data; + +import java.util.List; + +/** + * Immutable data object representing a summary of a clients various accounts. + */ +public class ClientAccountSummaryCollectionData { + + private final int anyLoanCount; + private final int pendingApprovalLoanCount; + private final List pendingApprovalLoans; + private final int awaitingDisbursalLoanCount; + private final List awaitingDisbursalLoans; + private final int activeLoanCount; + private final List openLoans; + private final int closedLoanCount; + private final List closedLoans; + private final int pendingApprovalDespositAccountsCount; + private final List pendingApprovalDepositAccounts; + private final int approvedDespositAccountsCount; + private final List approvedDepositAccounts; + + public ClientAccountSummaryCollectionData( + final List pendingApprovalLoans, + final List awaitingDisbursalLoans, + final List openLoans, + final List closedLoans, + final List pendingApprovalDepositAccounts, + final List approvedDepositAccounts) { + this.pendingApprovalLoans = pendingApprovalLoans; + this.awaitingDisbursalLoans = awaitingDisbursalLoans; + this.openLoans = openLoans; + this.closedLoans = closedLoans; + this.pendingApprovalDepositAccounts = pendingApprovalDepositAccounts; + this.approvedDepositAccounts = approvedDepositAccounts; + + this.pendingApprovalLoanCount = this.pendingApprovalLoans.size(); + this.awaitingDisbursalLoanCount = this.awaitingDisbursalLoans.size(); + this.activeLoanCount = this.openLoans.size(); + this.closedLoanCount = this.closedLoans.size(); + this.anyLoanCount = this.pendingApprovalLoanCount + this.awaitingDisbursalLoanCount + this.activeLoanCount + this.closedLoanCount; + + this.pendingApprovalDespositAccountsCount = this.pendingApprovalDepositAccounts.size(); + this.approvedDespositAccountsCount = this.approvedDepositAccounts.size(); + } + + public int getAnyLoanCount() { + return anyLoanCount; + } + + public int getPendingApprovalLoanCount() { + return pendingApprovalLoanCount; + } + + public List getPendingApprovalLoans() { + return pendingApprovalLoans; + } + + public int getAwaitingDisbursalLoanCount() { + return awaitingDisbursalLoanCount; + } + + public List getAwaitingDisbursalLoans() { + return awaitingDisbursalLoans; + } + + public int getActiveLoanCount() { + return activeLoanCount; + } + + public List getOpenLoans() { + return openLoans; + } + + public int getClosedLoanCount() { + return closedLoanCount; + } + + public List getClosedLoans() { + return closedLoans; + } + + public int getPendingApprovalDespositAccountsCount() { + return pendingApprovalDespositAccountsCount; + } + + public List getPendingApprovalDepositAccounts() { + return pendingApprovalDepositAccounts; + } + + public int getApprovedDespositAccountsCount() { + return approvedDespositAccountsCount; + } + + public List getApprovedDepositAccounts() { + return approvedDepositAccounts; + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientAccountSummaryData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientAccountSummaryData.java new file mode 100644 index 000000000..b67263097 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientAccountSummaryData.java @@ -0,0 +1,46 @@ +package org.mifosng.platform.api.data; + +/** + * Immutable data object for client loan accounts. + */ +public class ClientAccountSummaryData { + + private final Long id; + private final String externalId; + private final Long productId; + private final String productName; + private final Integer accountStatusId; + + public ClientAccountSummaryData( + final Long id, + final String externalId, + final Long productId, + final String loanProductName, + final Integer loanStatusId) { + this.id = id; + this.externalId = externalId; + this.productId = productId; + this.productName = loanProductName; + this.accountStatusId = loanStatusId; + } + + public Long getId() { + return id; + } + + public String getExternalId() { + return externalId; + } + + public Long getProductId() { + return productId; + } + + public String getProductName() { + return productName; + } + + public Integer getAccountStatusId() { + return accountStatusId; + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLoanAccountSummaryCollectionData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLoanAccountSummaryCollectionData.java deleted file mode 100644 index 33678252b..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLoanAccountSummaryCollectionData.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.mifosng.platform.api.data; - -import java.util.ArrayList; -import java.util.List; - -public class ClientLoanAccountSummaryCollectionData { - - private List pendingApprovalLoans = new ArrayList(); - private List awaitingDisbursalLoans = new ArrayList(); - private List openLoans = new ArrayList(); - private List closedLoans = new ArrayList(); - private int anyLoanCount; - private int pendingApprovalLoanCount; - private int awaitingDisbursalLoanCount; - private int activeLoanCount; - private int closedLoanCount; - - public ClientLoanAccountSummaryCollectionData( - final List pendingApprovalLoans, - final List awaitingDisbursalLoans, - final List openLoans, - final List closedLoans) { - this.pendingApprovalLoans = pendingApprovalLoans; - this.awaitingDisbursalLoans = awaitingDisbursalLoans; - this.openLoans = openLoans; - this.closedLoans = closedLoans; - this.pendingApprovalLoanCount = this.pendingApprovalLoans.size(); - this.awaitingDisbursalLoanCount = this.awaitingDisbursalLoans.size(); - this.activeLoanCount = this.openLoans.size(); - this.closedLoanCount = this.closedLoans.size(); - this.anyLoanCount = this.pendingApprovalLoanCount + this.awaitingDisbursalLoanCount + this.activeLoanCount + this.closedLoanCount; - } - - public List getPendingApprovalLoans() { - return pendingApprovalLoans; - } - - public List getAwaitingDisbursalLoans() { - return awaitingDisbursalLoans; - } - - public List getOpenLoans() { - return openLoans; - } - - public List getClosedLoans() { - return closedLoans; - } - - public int getAnyLoanCount() { - return anyLoanCount; - } - - public int getPendingApprovalLoanCount() { - return pendingApprovalLoanCount; - } - - public int getAwaitingDisbursalLoanCount() { - return awaitingDisbursalLoanCount; - } - - public int getActiveLoanCount() { - return activeLoanCount; - } - - public int getClosedLoanCount() { - return closedLoanCount; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLoanAccountSummaryData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLoanAccountSummaryData.java deleted file mode 100644 index 9ad8b1774..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLoanAccountSummaryData.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.mifosng.platform.api.data; - -import java.io.Serializable; - -public class ClientLoanAccountSummaryData implements Serializable { - - private Long id; - private String externalId; - private Long loanProductId; - private String loanProductName; - private Integer loanStatusId; - - public ClientLoanAccountSummaryData() { - // - } - - public ClientLoanAccountSummaryData(Long id, String externalId, - Long productId, String loanProductName, Integer loanStatusId) { - this.id = id; - this.externalId = externalId; - this.loanProductId = productId; - this.loanProductName = loanProductName; - this.loanStatusId = loanStatusId; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getExternalId() { - return externalId; - } - - public void setExternalId(String externalId) { - this.externalId = externalId; - } - - public String getLoanProductName() { - return loanProductName; - } - - public void setLoanProductName(String loanProductName) { - this.loanProductName = loanProductName; - } - - public Long getLoanProductId() { - return loanProductId; - } - - public void setLoanProductId(Long loanProductId) { - this.loanProductId = loanProductId; - } - - public Integer getLoanStatusId() { - return loanStatusId; - } - - public void setLoanStatusId(Integer loanStatusId) { - this.loanStatusId = loanStatusId; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java index 810965745..6fbb59dfa 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java @@ -8,7 +8,7 @@ import org.mifosng.platform.api.data.AppUserData; import org.mifosng.platform.api.data.AuthenticatedUserData; import org.mifosng.platform.api.data.ChargeData; import org.mifosng.platform.api.data.ClientData; -import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData; +import org.mifosng.platform.api.data.ClientAccountSummaryCollectionData; import org.mifosng.platform.api.data.ConfigurationData; import org.mifosng.platform.api.data.DepositAccountData; import org.mifosng.platform.api.data.DepositProductData; @@ -76,7 +76,7 @@ public interface ApiJsonSerializerService { String serializeClientDataToJson(boolean prettyPrint, Set responseParameters, ClientData clientData); - String serializeClientLoanAccountSummaryCollectionDataToJson(boolean prettyPrint, Set responseParameters, ClientLoanAccountSummaryCollectionData clientAccount); + String serializeClientAccountSummaryCollectionDataToJson(boolean prettyPrint, Set responseParameters, ClientAccountSummaryCollectionData clientAccount); String serializeGroupDataToJson(boolean prettyPrint, Set responseParameters, Collection groups); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java index fbb8c7209..8a905d96c 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java @@ -10,7 +10,7 @@ import org.mifosng.platform.api.data.AppUserData; import org.mifosng.platform.api.data.AuthenticatedUserData; import org.mifosng.platform.api.data.ChargeData; import org.mifosng.platform.api.data.ClientData; -import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData; +import org.mifosng.platform.api.data.ClientAccountSummaryCollectionData; import org.mifosng.platform.api.data.ConfigurationData; import org.mifosng.platform.api.data.DepositAccountData; import org.mifosng.platform.api.data.DepositProductData; @@ -87,10 +87,11 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ private static final Set CLIENT_DATA_PARAMETERS = new HashSet( Arrays.asList("id", "officeId", "officeName", "externalId", "firstname", "lastname", "joinedDate", "displayName", "clientOrBusinessName", "allowedOffices") ); - + private static final Set CLIENT_ACCOUNTS_DATA_PARAMETERS = new HashSet( Arrays.asList("pendingApprovalLoans", "awaitingDisbursalLoans", "openLoans", "closedLoans", - "anyLoanCount", "pendingApprovalLoanCount", "awaitingDisbursalLoanCount", "activeLoanCount", "closedLoanCount") + "anyLoanCount", "pendingApprovalLoanCount", "awaitingDisbursalLoanCount", "activeLoanCount", "closedLoanCount", + "pendingApprovalDespositAccountsCount", "pendingApprovalDespositAccounts", "approvedDespositAccountsCount", "approvedDespositAccounts") ); private static final Set GROUP_DATA_PARAMETERS = new HashSet( @@ -278,8 +279,8 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ } @Override - public String serializeClientLoanAccountSummaryCollectionDataToJson(final boolean prettyPrint, final Set responseParameters, - final ClientLoanAccountSummaryCollectionData clientAccount) { + public String serializeClientAccountSummaryCollectionDataToJson(final boolean prettyPrint, final Set responseParameters, + final ClientAccountSummaryCollectionData clientAccount) { final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(CLIENT_ACCOUNTS_DATA_PARAMETERS, prettyPrint, responseParameters); return helper.serializedJsonFrom(gsonDeserializer, clientAccount); } 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 b43e1ee41..d88ade548 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 @@ -3,7 +3,7 @@ package org.mifosng.platform.client.service; import java.util.Collection; import org.mifosng.platform.api.data.ClientData; -import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData; +import org.mifosng.platform.api.data.ClientAccountSummaryCollectionData; import org.mifosng.platform.api.data.ClientLookup; import org.mifosng.platform.api.data.NoteData; @@ -17,7 +17,7 @@ public interface ClientReadPlatformService { Collection retrieveAllIndividualClientsForLookup(); - ClientLoanAccountSummaryCollectionData retrieveClientAccountDetails(Long clientId); + ClientAccountSummaryCollectionData retrieveClientAccountDetails(Long clientId); Collection retrieveAllClientNotes(Long clientId); 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 30966c6b0..82f5c0adb 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 @@ -187,7 +187,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } @Override - public ClientLoanAccountSummaryCollectionData retrieveClientAccountDetails(final Long clientId) { + public ClientAccountSummaryCollectionData retrieveClientAccountDetails(final Long clientId) { try { this.context.authenticatedUser(); @@ -195,22 +195,20 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService // Check if client exists retrieveIndividualClient(clientId); - List pendingApprovalLoans = new ArrayList(); - List awaitingDisbursalLoans = new ArrayList(); - List openLoans = new ArrayList(); - List closedLoans = new ArrayList(); + List pendingApprovalLoans = new ArrayList(); + List awaitingDisbursalLoans = new ArrayList(); + List openLoans = new ArrayList(); + List closedLoans = new ArrayList(); ClientLoanAccountSummaryDataMapper rm = new ClientLoanAccountSummaryDataMapper(); - String sql = "select " + rm.loanAccountSummarySchema() - + " where l.client_id = ?"; + String sql = "select " + rm.loanAccountSummarySchema() + " where l.client_id = ?"; - List results = this.jdbcTemplate.query(sql, rm, new Object[] {clientId}); + List results = this.jdbcTemplate.query(sql, rm, new Object[] {clientId}); if (results != null) { - for (ClientLoanAccountSummaryData row : results) { + for (ClientAccountSummaryData row : results) { - LoanStatusMapper statusMapper = new LoanStatusMapper( - row.getLoanStatusId()); + LoanStatusMapper statusMapper = new LoanStatusMapper(row.getAccountStatusId()); if (statusMapper.isOpen()) { openLoans.add(row); @@ -223,34 +221,51 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } } } + + List pendingApprovalDepositAccounts = new ArrayList(); + List approvedDepositAccounts = new ArrayList(); +// List openDepositAccounts = new ArrayList(); +// List closedDepositAccounts = new ArrayList(); + + ClientDespoitAccountSummaryDataMapper depositAccountMapper = new ClientDespoitAccountSummaryDataMapper(); - return new ClientLoanAccountSummaryCollectionData( - pendingApprovalLoans, awaitingDisbursalLoans, openLoans, - closedLoans); + String depositAccountsSql = "select " + depositAccountMapper.schema() + " where da.client_id = ? and da.is_deleted=0"; + List depositAccountResults = this.jdbcTemplate.query(depositAccountsSql, depositAccountMapper, new Object[] {clientId}); + if (depositAccountResults != null) { + for (ClientAccountSummaryData row : depositAccountResults) { + if (row.getAccountStatusId() == 100) { + pendingApprovalDepositAccounts.add(row); + } else if (row.getAccountStatusId() == 200) { + approvedDepositAccounts.add(row); + } + } + } + + return new ClientAccountSummaryCollectionData(pendingApprovalLoans, awaitingDisbursalLoans, openLoans, closedLoans, + pendingApprovalDepositAccounts, approvedDepositAccounts); } catch (EmptyResultDataAccessException e) { throw new ClientNotFoundException(clientId); } } private static final class ClientLoanAccountSummaryDataMapper implements - RowMapper { + RowMapper { public String loanAccountSummarySchema() { - StringBuilder loanAccountSummary = new StringBuilder( - "l.id as id, l.external_id as externalId,"); - loanAccountSummary + StringBuilder accountsSummary = new StringBuilder("l.id as id, l.external_id as externalId,"); + accountsSummary .append("l.product_id as productId, lp.name as productName,") .append("l.loan_status_id as statusId ") .append("from m_loan l ") .append("LEFT JOIN m_product_loan AS lp ON lp.id = l.product_id "); - return loanAccountSummary.toString(); + return accountsSummary.toString(); } @Override - public ClientLoanAccountSummaryData mapRow(final ResultSet rs, + public ClientAccountSummaryData mapRow(final ResultSet rs, final int rowNum) throws SQLException { Long id = JdbcSupport.getLong(rs, "id"); @@ -259,9 +274,38 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService String loanProductName = rs.getString("productName"); Integer loanStatusId = JdbcSupport.getInteger(rs, "statusId"); - return new ClientLoanAccountSummaryData(id, externalId, productId, loanProductName, loanStatusId); + return new ClientAccountSummaryData(id, externalId, productId, loanProductName, loanStatusId); } } + + private static final class ClientDespoitAccountSummaryDataMapper implements RowMapper { + + public String schema() { + + StringBuilder accountsSummary = new StringBuilder("da.id as id, da.external_id as externalId,"); + accountsSummary.append("da.product_id as productId, dp.name as productName,") + .append("da.status_enum as statusId ") + .append("from m_deposit_account da ") + .append("LEFT JOIN m_product_deposit AS dp ON dp.id = da.product_id "); + + return accountsSummary.toString(); + } + + @Override + public ClientAccountSummaryData 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 productName = rs.getString("productName"); + Integer accountStatusId = JdbcSupport.getInteger(rs, "statusId"); + + return new ClientAccountSummaryData(id, externalId, productId, productName, accountStatusId); + } + } + + @Override public NoteData retrieveClientNote(Long clientId, Long noteId) {