diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/GroupsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/GroupsApiResource.java index 0849bcff5..4a1946cfc 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/GroupsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/GroupsApiResource.java @@ -19,11 +19,12 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.mifosng.platform.api.commands.GroupCommand; -import org.mifosng.platform.api.data.ClientMemberData; +import org.mifosng.platform.api.data.ClientLookup; import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.api.data.GroupData; import org.mifosng.platform.api.infrastructure.ApiDataConversionService; import org.mifosng.platform.api.infrastructure.ApiParameterHelper; +import org.mifosng.platform.client.service.ClientReadPlatformService; import org.mifosng.platform.group.service.GroupReadPlatformService; import org.mifosng.platform.group.service.GroupWritePlatformService; import org.springframework.beans.factory.annotation.Autowired; @@ -40,7 +41,10 @@ public class GroupsApiResource { @Autowired private GroupWritePlatformService groupWritePlatformService; - + + @Autowired + private ClientReadPlatformService clientReadPlatformService; + @Autowired private ApiDataConversionService apiDataConversionService; @@ -84,15 +88,43 @@ public class GroupsApiResource { } boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); GroupData group = this.groupReadPlatformService.retrieveGroup(groupId); - Collection clientMembers = this.groupReadPlatformService.retrieveClientMembers(groupId); + Collection clientMembers = this.groupReadPlatformService.retrieveClientMembers(groupId); group.setClientMembers(clientMembers); + + if (template) { + Collection availableClients = this.clientReadPlatformService.retrieveAllIndividualClientsForLookup(); + availableClients.removeAll(group.getClientMembers()); + group.setAllowedClients(availableClients); + + responseParameters.add("allowedClients"); + } return this.apiDataConversionService.convertGroupDataToJson(prettyPrint, responseParameters, group); } + @GET + @Path("template") + @Consumes({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON}) + public String newGroupDetails(@Context final UriInfo uriInfo) { + + Set typicalResponseParameters = new HashSet(Arrays.asList("id", "name", "externalId", "clientMembers", "allowedClients")); + + Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + if (responseParameters.isEmpty()) { + responseParameters.addAll(typicalResponseParameters); + } + boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + + GroupData groupData = this.groupReadPlatformService.retrieveNewGroupDetails(); + + return this.apiDataConversionService.convertGroupDataToJson(prettyPrint, responseParameters, groupData); + } + @POST @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientMemberData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLookup.java similarity index 62% rename from mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientMemberData.java rename to mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLookup.java index 8d61cb141..dadd5f0ba 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientMemberData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientLookup.java @@ -2,12 +2,12 @@ package org.mifosng.platform.api.data; import org.apache.commons.lang.StringUtils; -public class ClientMemberData { +public class ClientLookup { private final Long id; private final String displayName; - public ClientMemberData(final Long id, final String firstname, final String lastname) { + public ClientLookup(final Long id, final String firstname, final String lastname) { this.id = id; StringBuilder displayNameBuilder = new StringBuilder(firstname); @@ -28,4 +28,14 @@ public class ClientMemberData { return displayName; } + @Override + public boolean equals(Object obj) { + ClientLookup clientLookup = (ClientLookup) obj; + return this.id.equals(clientLookup.getId()); + } + + @Override + public int hashCode() { + return this.id.hashCode(); + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/GroupData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/GroupData.java index d96491ecf..1d531be6b 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/GroupData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/GroupData.java @@ -9,15 +9,22 @@ public class GroupData { private final String name; private final String externalId; - private Collection clientMembers = new ArrayList(); + private Collection clientMembers = new ArrayList(); + private Collection allowedClients = new ArrayList(); public GroupData(Long id, String name, String externalId) { - super(); this.id = id; this.name = name; this.externalId = externalId; } + public GroupData(Collection allowedClients) { + this.id = null; + this.name = null; + this.externalId = null; + this.allowedClients = allowedClients; + } + public Long getId() { return id; } @@ -30,12 +37,19 @@ public class GroupData { return externalId; } - public Collection getClientMembers() { + public Collection getClientMembers() { return clientMembers; } - public void setClientMembers(Collection clientMembers) { + public void setClientMembers(Collection clientMembers) { this.clientMembers = clientMembers; } + public Collection getAllowedClients() { + return allowedClients; + } + + public void setAllowedClients(Collection allowedClients) { + this.allowedClients = allowedClients; + } } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java index 931d45c91..539bbbc61 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java @@ -380,7 +380,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { @Override public String convertGroupDataToJson(boolean prettyPrint, Set responseParameters, GroupData... groups) { final Set supportedParameters = new HashSet( - Arrays.asList("id", "name", "externalId", "clientMembers") + Arrays.asList("id", "name", "externalId", "clientMembers", "allowedClients") ); final Set parameterNamesToSkip = new HashSet(); 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 ab4d29b76..b43e1ee41 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 @@ -4,6 +4,7 @@ import java.util.Collection; import org.mifosng.platform.api.data.ClientData; import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData; +import org.mifosng.platform.api.data.ClientLookup; import org.mifosng.platform.api.data.NoteData; public interface ClientReadPlatformService { @@ -14,6 +15,8 @@ public interface ClientReadPlatformService { ClientData retrieveNewClientDetails(); + Collection retrieveAllIndividualClientsForLookup(); + ClientLoanAccountSummaryCollectionData 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 129108c9c..33549e5a1 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 @@ -9,14 +9,7 @@ import java.util.List; import org.apache.commons.lang.StringUtils; import org.joda.time.DateTime; import org.joda.time.LocalDate; -import org.mifosng.platform.api.data.AppUserData; -import org.mifosng.platform.api.data.ClientData; -import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData; -import org.mifosng.platform.api.data.ClientLoanAccountSummaryData; -import org.mifosng.platform.api.data.EnumOptionData; -import org.mifosng.platform.api.data.NoteData; -import org.mifosng.platform.api.data.OfficeData; -import org.mifosng.platform.api.data.OfficeLookup; +import org.mifosng.platform.api.data.*; import org.mifosng.platform.client.domain.NoteEnumerations; import org.mifosng.platform.exceptions.ClientNotFoundException; import org.mifosng.platform.exceptions.NoteNotFoundException; @@ -103,7 +96,19 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } } - @Override + @Override + public Collection retrieveAllIndividualClientsForLookup() { + + this.context.authenticatedUser(); + + ClientLookupMapper rm = new ClientLookupMapper(); + + String sql = "select " + rm.clientLookupSchema() + " where c.is_deleted = 0"; + + return this.jdbcTemplate.query(sql, rm, new Object[] {}); + } + + @Override public ClientData retrieveNewClientDetails() { AppUser currentUser = context.authenticatedUser(); @@ -115,6 +120,8 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService return new ClientData(officeId, new LocalDate(), offices); } + + private static final class ClientMapper implements RowMapper { private final List offices; @@ -161,6 +168,24 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } } + private static final class ClientLookupMapper implements RowMapper{ + + public String clientLookupSchema() { + return "c.id as id, c.firstname as firstname, c.lastname as lastname from portfolio_client c"; + } + + @Override + public ClientLookup mapRow(ResultSet rs, int rowNum) throws SQLException { + Long id = rs.getLong("id"); + String firstname = rs.getString("firstname"); + String lastname = rs.getString("lastname"); + if (StringUtils.isBlank(firstname)) { + firstname = ""; + } + return new ClientLookup(id, firstname, lastname); + } + } + @Override public ClientLoanAccountSummaryCollectionData retrieveClientAccountDetails(final Long clientId) { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupCommandValidator.java b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupCommandValidator.java index a2b99f2f5..1ef5fa539 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupCommandValidator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupCommandValidator.java @@ -25,7 +25,7 @@ public class GroupCommandValidator { baseDataValidator.reset().parameter("name").value(command.getName()).notBlank(); baseDataValidator.reset().parameter("externalId").value(command.getExternalId()).ignoreIfNull().notExceedingLengthOf(100); - baseDataValidator.reset().parameter("clientMembers").value(command.getClientMembers()).ignoreIfNull().arrayNotEmpty(); + baseDataValidator.reset().parameter("clientMembers").value(command.getClientMembers()).arrayNotEmpty(); if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); @@ -42,7 +42,7 @@ public class GroupCommandValidator { baseDataValidator.reset().parameter("name").value(command.getName()).ignoreIfNull().notBlank(); baseDataValidator.reset().parameter("externalId").value(command.getExternalId()).ignoreIfNull().notExceedingLengthOf(100); - baseDataValidator.reset().parameter("clientMembers").value(command.getClientMembers()).ignoreIfNull(); + baseDataValidator.reset().parameter("clientMembers").value(command.getClientMembers()).arrayNotEmpty(); if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformService.java index 3ec820fad..b866d6fe9 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformService.java @@ -2,7 +2,7 @@ package org.mifosng.platform.group.service; import java.util.Collection; -import org.mifosng.platform.api.data.ClientMemberData; +import org.mifosng.platform.api.data.ClientLookup; import org.mifosng.platform.api.data.GroupData; public interface GroupReadPlatformService { @@ -10,6 +10,8 @@ public interface GroupReadPlatformService { Collection retrieveAllGroups(); GroupData retrieveGroup(Long groupId); - - Collection retrieveClientMembers(Long groupId); + + GroupData retrieveNewGroupDetails(); + + Collection retrieveClientMembers(Long groupId); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformServiceImpl.java index 2697bf5f1..3b96ec956 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformServiceImpl.java @@ -2,11 +2,14 @@ package org.mifosng.platform.group.service; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import org.apache.commons.lang.StringUtils; -import org.mifosng.platform.api.data.ClientMemberData; +import org.mifosng.platform.api.data.ClientLookup; import org.mifosng.platform.api.data.GroupData; +import org.mifosng.platform.client.service.ClientReadPlatformService; import org.mifosng.platform.exceptions.GroupNotFoundException; import org.mifosng.platform.infrastructure.TenantAwareRoutingDataSource; import org.mifosng.platform.security.PlatformSecurityContext; @@ -21,12 +24,14 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { private final JdbcTemplate jdbcTemplate; private final PlatformSecurityContext context; + private final ClientReadPlatformService clientReadPlatformService; @Autowired public GroupReadPlatformServiceImpl(final PlatformSecurityContext context, - final TenantAwareRoutingDataSource dataSource) { + final TenantAwareRoutingDataSource dataSource, ClientReadPlatformService clientReadPlatformService) { this.context = context; this.jdbcTemplate = new JdbcTemplate(dataSource); + this.clientReadPlatformService = clientReadPlatformService; } @Override @@ -57,6 +62,17 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { } } + @Override + public GroupData retrieveNewGroupDetails() { + + this.context.authenticatedUser(); + + List allowedClients = new ArrayList( + this.clientReadPlatformService.retrieveAllIndividualClientsForLookup()); + + return new GroupData(allowedClients); + } + private static final class GroupMapper implements RowMapper { public String groupSchema() { @@ -76,7 +92,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { } @Override - public Collection retrieveClientMembers(Long groupId){ + public Collection retrieveClientMembers(Long groupId){ this.context.authenticatedUser(); @@ -87,21 +103,21 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { return this.jdbcTemplate.query(sql, rm, new Object[] {groupId}); } - private static final class ClientMemberSummaryDataMapper implements RowMapper { + private static final class ClientMemberSummaryDataMapper implements RowMapper { public String clientMemberSummarySchema() { return "cm.id, cm.firstname, cm.lastname from portfolio_client cm INNER JOIN portfolio_group_client pgc ON pgc.client_id = cm.id"; } @Override - public ClientMemberData mapRow(ResultSet rs, int rowNum) throws SQLException { + public ClientLookup mapRow(ResultSet rs, int rowNum) throws SQLException { Long id = rs.getLong("id"); String firstname = rs.getString("firstname"); String lastname = rs.getString("lastname"); if (StringUtils.isBlank(firstname)) { firstname = ""; } - return new ClientMemberData(id, firstname, lastname); + return new ClientLookup(id, firstname, lastname); } }