From d563b87468f177a39f97211f7e06e85d238117bb Mon Sep 17 00:00:00 2001 From: mifoscontributer Date: Tue, 20 Aug 2013 19:40:36 +0530 Subject: [PATCH] Transfer clients between groups --- .../group/api/GroupsApiResource.java | 49 ++++++++++++++++++- .../group/data/GroupTransferData.java | 40 +++++++++++++++ .../service/GroupReadPlatformService.java | 4 ++ .../service/GroupReadPlatformServiceImpl.java | 26 ++++++++++ 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/GroupTransferData.java diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupsApiResource.java index c46c238a1..18b8cd54a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupsApiResource.java @@ -39,6 +39,8 @@ import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer; import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; +import org.mifosplatform.organisation.staff.data.StaffData; +import org.mifosplatform.organisation.staff.service.StaffReadPlatformService; import org.mifosplatform.portfolio.accountdetails.data.AccountSummaryCollectionData; import org.mifosplatform.portfolio.accountdetails.service.AccountDetailsReadPlatformService; import org.mifosplatform.portfolio.calendar.data.CalendarData; @@ -51,6 +53,7 @@ import org.mifosplatform.portfolio.collectionsheet.data.JLGCollectionSheetData; import org.mifosplatform.portfolio.collectionsheet.service.CollectionSheetReadPlatformService; import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.group.data.GroupRoleData; +import org.mifosplatform.portfolio.group.data.GroupTransferData; import org.mifosplatform.portfolio.group.service.CenterReadPlatformService; import org.mifosplatform.portfolio.group.service.GroupReadPlatformService; import org.mifosplatform.portfolio.group.service.GroupRolesReadPlatformService; @@ -81,6 +84,7 @@ public class GroupsApiResource { private final GroupRolesReadPlatformService groupRolesReadPlatformService; private final AccountDetailsReadPlatformService accountDetailsReadPlatformService; private final CalendarReadPlatformService calendarReadPlatformService; + private final StaffReadPlatformService staffReadPlatformService; @Autowired public GroupsApiResource(final PlatformSecurityContext context, final GroupReadPlatformService groupReadPlatformService, @@ -92,7 +96,8 @@ public class GroupsApiResource { final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService, final CollectionSheetReadPlatformService collectionSheetReadPlatformService, final FromJsonHelper fromJsonHelper, final GroupRolesReadPlatformService groupRolesReadPlatformService, - final AccountDetailsReadPlatformService accountDetailsReadPlatformService, final CalendarReadPlatformService calendarReadPlatformService) { + final AccountDetailsReadPlatformService accountDetailsReadPlatformService, + final CalendarReadPlatformService calendarReadPlatformService, final StaffReadPlatformService staffReadPlatformService) { this.context = context; this.groupReadPlatformService = groupReadPlatformService; @@ -108,6 +113,7 @@ public class GroupsApiResource { this.groupRolesReadPlatformService = groupRolesReadPlatformService; this.accountDetailsReadPlatformService = accountDetailsReadPlatformService; this.calendarReadPlatformService = calendarReadPlatformService; + this.staffReadPlatformService = staffReadPlatformService; } @GET @@ -361,4 +367,45 @@ public class GroupsApiResource { return this.groupSummaryToApiJsonSerializer.serialize(settings, groupAccount, GROUP_ACCOUNTS_DATA_PARAMETERS); } + @GET + @Path("{groupId}/clientstransfertemplate") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveClientTranferTemplate(@Context final UriInfo uriInfo, @PathParam("groupId") final Long groupId, + @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) { + + this.context.authenticatedUser().validateHasReadPermission("GROUP"); + GroupGeneralData group = this.groupReadPlatformService.retrieveOne(groupId); + + final boolean transferActiveLoans = true; + final boolean inheritDestinationGroupLoanOfficer = true; + + Collection membersOfGroup = this.clientReadPlatformService.retrieveClientMembersOfGroup(groupId); + if (CollectionUtils.isEmpty(membersOfGroup)) { + membersOfGroup = null; + } + + final boolean loanOfficersOnly = false; + Collection staffOptions = null; + if (staffInSelectedOfficeOnly) { + staffOptions = this.staffReadPlatformService.retrieveAllStaffForDropdown(group.officeId()); + } else { + staffOptions = this.staffReadPlatformService.retrieveAllStaffInOfficeAndItsParentOfficeHierarchy(group.officeId(), + loanOfficersOnly); + } + if (CollectionUtils.isEmpty(staffOptions)) { + staffOptions = null; + } + + Collection groupOptions = this.groupReadPlatformService.retrieveGroupsForLookup(group.officeId(), groupId); + GroupTransferData data = GroupTransferData.template(groupId, membersOfGroup, groupOptions, staffOptions, transferActiveLoans, + inheritDestinationGroupLoanOfficer); + + final Set GROUP_TRANSFERS_DATA_PARAMETERS = new HashSet(Arrays.asList("groupId", "clientOptions", "groupOptions", + "staffOptions", "transferActiveLoans", "inheritDestinationGroupLoanOfficer")); + + final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); + return this.toApiJsonSerializer.serialize(settings, data, GROUP_TRANSFERS_DATA_PARAMETERS); + + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/GroupTransferData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/GroupTransferData.java new file mode 100644 index 000000000..ee1f4e10b --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/GroupTransferData.java @@ -0,0 +1,40 @@ +package org.mifosplatform.portfolio.group.data; + +import java.util.Collection; + +import org.mifosplatform.organisation.staff.data.StaffData; +import org.mifosplatform.portfolio.client.data.ClientData; + +public class GroupTransferData { + + @SuppressWarnings("unused") + private final Long groupId; + @SuppressWarnings("unused") + private final Collection clientOptions; + @SuppressWarnings("unused") + private final Collection groupOptions; + @SuppressWarnings("unused") + private final Collection staffOptions; + @SuppressWarnings("unused") + private final boolean transferActiveLoans; + @SuppressWarnings("unused") + private final boolean inheritDestinationGroupLoanOfficer; + + private GroupTransferData(final Long groupId, final Collection clientOptions, + final Collection groupOptions, final Collection staffOptions, final boolean transferActiveLoans, + final boolean inheritDestinationGroupLoanOfficer) { + this.groupId = groupId; + this.clientOptions = clientOptions; + this.groupOptions = groupOptions; + this.staffOptions = staffOptions; + this.transferActiveLoans = transferActiveLoans; + this.inheritDestinationGroupLoanOfficer = inheritDestinationGroupLoanOfficer; + } + + public static GroupTransferData template(final Long groupId, final Collection clientOptions, + final Collection groupOptions, final Collection staffOptions, final boolean transferActiveLoans, + final boolean inheritDestinationGroupLoanOfficer) { + return new GroupTransferData(groupId, clientOptions, groupOptions, staffOptions, transferActiveLoans, + inheritDestinationGroupLoanOfficer); + } +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformService.java index f850d8845..f83e9d84e 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformService.java @@ -5,6 +5,8 @@ */ package org.mifosplatform.portfolio.group.service; +import java.util.Collection; + import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.portfolio.group.data.GroupGeneralData; @@ -15,4 +17,6 @@ public interface GroupReadPlatformService { Page retrieveAll(SearchParameters searchParameters); GroupGeneralData retrieveOne(Long groupId); + + Collection retrieveGroupsForLookup(Long officeId, Long groupId); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java index d10d84f35..931e052e3 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java @@ -5,12 +5,15 @@ */ package org.mifosplatform.portfolio.group.service; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Collection; import org.apache.commons.lang.StringUtils; import org.mifosplatform.infrastructure.codes.data.CodeValueData; import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformService; import org.mifosplatform.infrastructure.core.api.ApiParameterHelper; +import org.mifosplatform.infrastructure.core.domain.JdbcSupport; import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.RoutingDataSource; @@ -30,6 +33,7 @@ import org.mifosplatform.useradministration.domain.AppUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -200,4 +204,26 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { throw new GroupNotFoundException(groupId); } } + + @Override + public Collection retrieveGroupsForLookup(final Long officeId, final Long groupId) { + this.context.authenticatedUser(); + GroupLookupDataMapper rm = new GroupLookupDataMapper(); + String sql = "Select " + rm.schema() + " where g.office_id=? and g.id !=?"; + return this.jdbcTemplate.query(sql, rm, new Object[] { officeId, groupId }); + } + + private static final class GroupLookupDataMapper implements RowMapper { + + public final String schema() { + return "g.id as id, g.display_name as displayName from m_group g"; + } + + @Override + public GroupGeneralData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + final Long id = JdbcSupport.getLong(rs, "id"); + final String displayName = rs.getString("displayName"); + return GroupGeneralData.lookup(id, displayName); + } + } } \ No newline at end of file