support bringing back pending approval and approved deposit accounts first of with client account summary.

This commit is contained in:
Keith Woodlock
2012-08-24 18:16:27 +01:00
parent 91890ff204
commit 2ee5dedf9c
9 changed files with 225 additions and 168 deletions
@@ -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<String> typicalResponseParameters = new HashSet<String>(
Arrays.asList("pendingApprovalLoans", "awaitingDisbursalLoans", "openLoans", "closedLoans",
"anyLoanCount", "pendingApprovalLoanCount", "awaitingDisbursalLoanCount", "activeLoanCount", "closedLoanCount")
"anyLoanCount", "pendingApprovalLoanCount", "awaitingDisbursalLoanCount", "activeLoanCount", "closedLoanCount",
"pendingApprovalDespositAccountsCount", "pendingApprovalDespositAccounts", "approvedDespositAccountsCount", "approvedDespositAccounts")
);
Set<String> 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
@@ -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<ClientAccountSummaryData> pendingApprovalLoans;
private final int awaitingDisbursalLoanCount;
private final List<ClientAccountSummaryData> awaitingDisbursalLoans;
private final int activeLoanCount;
private final List<ClientAccountSummaryData> openLoans;
private final int closedLoanCount;
private final List<ClientAccountSummaryData> closedLoans;
private final int pendingApprovalDespositAccountsCount;
private final List<ClientAccountSummaryData> pendingApprovalDepositAccounts;
private final int approvedDespositAccountsCount;
private final List<ClientAccountSummaryData> approvedDepositAccounts;
public ClientAccountSummaryCollectionData(
final List<ClientAccountSummaryData> pendingApprovalLoans,
final List<ClientAccountSummaryData> awaitingDisbursalLoans,
final List<ClientAccountSummaryData> openLoans,
final List<ClientAccountSummaryData> closedLoans,
final List<ClientAccountSummaryData> pendingApprovalDepositAccounts,
final List<ClientAccountSummaryData> 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<ClientAccountSummaryData> getPendingApprovalLoans() {
return pendingApprovalLoans;
}
public int getAwaitingDisbursalLoanCount() {
return awaitingDisbursalLoanCount;
}
public List<ClientAccountSummaryData> getAwaitingDisbursalLoans() {
return awaitingDisbursalLoans;
}
public int getActiveLoanCount() {
return activeLoanCount;
}
public List<ClientAccountSummaryData> getOpenLoans() {
return openLoans;
}
public int getClosedLoanCount() {
return closedLoanCount;
}
public List<ClientAccountSummaryData> getClosedLoans() {
return closedLoans;
}
public int getPendingApprovalDespositAccountsCount() {
return pendingApprovalDespositAccountsCount;
}
public List<ClientAccountSummaryData> getPendingApprovalDepositAccounts() {
return pendingApprovalDepositAccounts;
}
public int getApprovedDespositAccountsCount() {
return approvedDespositAccountsCount;
}
public List<ClientAccountSummaryData> getApprovedDepositAccounts() {
return approvedDepositAccounts;
}
}
@@ -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;
}
}
@@ -1,69 +0,0 @@
package org.mifosng.platform.api.data;
import java.util.ArrayList;
import java.util.List;
public class ClientLoanAccountSummaryCollectionData {
private List<ClientLoanAccountSummaryData> pendingApprovalLoans = new ArrayList<ClientLoanAccountSummaryData>();
private List<ClientLoanAccountSummaryData> awaitingDisbursalLoans = new ArrayList<ClientLoanAccountSummaryData>();
private List<ClientLoanAccountSummaryData> openLoans = new ArrayList<ClientLoanAccountSummaryData>();
private List<ClientLoanAccountSummaryData> closedLoans = new ArrayList<ClientLoanAccountSummaryData>();
private int anyLoanCount;
private int pendingApprovalLoanCount;
private int awaitingDisbursalLoanCount;
private int activeLoanCount;
private int closedLoanCount;
public ClientLoanAccountSummaryCollectionData(
final List<ClientLoanAccountSummaryData> pendingApprovalLoans,
final List<ClientLoanAccountSummaryData> awaitingDisbursalLoans,
final List<ClientLoanAccountSummaryData> openLoans,
final List<ClientLoanAccountSummaryData> 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<ClientLoanAccountSummaryData> getPendingApprovalLoans() {
return pendingApprovalLoans;
}
public List<ClientLoanAccountSummaryData> getAwaitingDisbursalLoans() {
return awaitingDisbursalLoans;
}
public List<ClientLoanAccountSummaryData> getOpenLoans() {
return openLoans;
}
public List<ClientLoanAccountSummaryData> 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;
}
}
@@ -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;
}
}
@@ -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<String> responseParameters, ClientData clientData);
String serializeClientLoanAccountSummaryCollectionDataToJson(boolean prettyPrint, Set<String> responseParameters, ClientLoanAccountSummaryCollectionData clientAccount);
String serializeClientAccountSummaryCollectionDataToJson(boolean prettyPrint, Set<String> responseParameters, ClientAccountSummaryCollectionData clientAccount);
String serializeGroupDataToJson(boolean prettyPrint, Set<String> responseParameters, Collection<GroupData> groups);
@@ -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<String> CLIENT_DATA_PARAMETERS = new HashSet<String>(
Arrays.asList("id", "officeId", "officeName", "externalId", "firstname", "lastname", "joinedDate", "displayName", "clientOrBusinessName", "allowedOffices")
);
private static final Set<String> CLIENT_ACCOUNTS_DATA_PARAMETERS = new HashSet<String>(
Arrays.asList("pendingApprovalLoans", "awaitingDisbursalLoans", "openLoans", "closedLoans",
"anyLoanCount", "pendingApprovalLoanCount", "awaitingDisbursalLoanCount", "activeLoanCount", "closedLoanCount")
"anyLoanCount", "pendingApprovalLoanCount", "awaitingDisbursalLoanCount", "activeLoanCount", "closedLoanCount",
"pendingApprovalDespositAccountsCount", "pendingApprovalDespositAccounts", "approvedDespositAccountsCount", "approvedDespositAccounts")
);
private static final Set<String> GROUP_DATA_PARAMETERS = new HashSet<String>(
@@ -278,8 +279,8 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ
}
@Override
public String serializeClientLoanAccountSummaryCollectionDataToJson(final boolean prettyPrint, final Set<String> responseParameters,
final ClientLoanAccountSummaryCollectionData clientAccount) {
public String serializeClientAccountSummaryCollectionDataToJson(final boolean prettyPrint, final Set<String> responseParameters,
final ClientAccountSummaryCollectionData clientAccount) {
final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(CLIENT_ACCOUNTS_DATA_PARAMETERS, prettyPrint, responseParameters);
return helper.serializedJsonFrom(gsonDeserializer, clientAccount);
}
@@ -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<ClientLookup> retrieveAllIndividualClientsForLookup();
ClientLoanAccountSummaryCollectionData retrieveClientAccountDetails(Long clientId);
ClientAccountSummaryCollectionData retrieveClientAccountDetails(Long clientId);
Collection<NoteData> retrieveAllClientNotes(Long clientId);
@@ -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<ClientLoanAccountSummaryData> pendingApprovalLoans = new ArrayList<ClientLoanAccountSummaryData>();
List<ClientLoanAccountSummaryData> awaitingDisbursalLoans = new ArrayList<ClientLoanAccountSummaryData>();
List<ClientLoanAccountSummaryData> openLoans = new ArrayList<ClientLoanAccountSummaryData>();
List<ClientLoanAccountSummaryData> closedLoans = new ArrayList<ClientLoanAccountSummaryData>();
List<ClientAccountSummaryData> pendingApprovalLoans = new ArrayList<ClientAccountSummaryData>();
List<ClientAccountSummaryData> awaitingDisbursalLoans = new ArrayList<ClientAccountSummaryData>();
List<ClientAccountSummaryData> openLoans = new ArrayList<ClientAccountSummaryData>();
List<ClientAccountSummaryData> closedLoans = new ArrayList<ClientAccountSummaryData>();
ClientLoanAccountSummaryDataMapper rm = new ClientLoanAccountSummaryDataMapper();
String sql = "select " + rm.loanAccountSummarySchema()
+ " where l.client_id = ?";
String sql = "select " + rm.loanAccountSummarySchema() + " where l.client_id = ?";
List<ClientLoanAccountSummaryData> results = this.jdbcTemplate.query(sql, rm, new Object[] {clientId});
List<ClientAccountSummaryData> 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<ClientAccountSummaryData> pendingApprovalDepositAccounts = new ArrayList<ClientAccountSummaryData>();
List<ClientAccountSummaryData> approvedDepositAccounts = new ArrayList<ClientAccountSummaryData>();
// List<ClientLoanAccountSummaryData> openDepositAccounts = new ArrayList<ClientLoanAccountSummaryData>();
// List<ClientLoanAccountSummaryData> closedDepositAccounts = new ArrayList<ClientLoanAccountSummaryData>();
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<ClientAccountSummaryData> 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<ClientLoanAccountSummaryData> {
RowMapper<ClientAccountSummaryData> {
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<ClientAccountSummaryData> {
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) {