From d23335603fabfb87971f1be6134091ddfaf6d9b6 Mon Sep 17 00:00:00 2001 From: goutham-M Date: Tue, 11 Feb 2014 12:51:42 +0530 Subject: [PATCH] MIFOSX-902 productive collection sheet feature is added --- .../portfolio/calendar/data/CalendarData.java | 7 ++ .../group/api/CentersApiResource.java | 16 ++- .../group/api/GroupingTypesApiConstants.java | 8 +- .../portfolio/group/data/CenterData.java | 11 ++- .../portfolio/group/data/StaffCenterData.java | 29 ++++++ .../service/CenterReadPlatformService.java | 4 + .../CenterReadPlatformServiceImpl.java | 99 ++++++++++++++++++- 7 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/StaffCenterData.java diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/data/CalendarData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/data/CalendarData.java index bee189501..4410779c9 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/data/CalendarData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/data/CalendarData.java @@ -15,6 +15,7 @@ import org.mifosplatform.portfolio.calendar.domain.CalendarRemindBy; import org.mifosplatform.portfolio.calendar.domain.CalendarType; import org.mifosplatform.portfolio.calendar.domain.CalendarWeekDaysType; import org.mifosplatform.portfolio.calendar.service.CalendarEnumerations; +import org.mifosplatform.portfolio.calendar.service.CalendarUtils; /** * Immutable data object representing a Calendar. @@ -320,4 +321,10 @@ public class CalendarData { } return false; } + + public boolean isValidRecurringDate(final LocalDate compareDate) { + if (isBetweenStartAndEndDate(compareDate)) { return CalendarUtils.isValidRedurringDate(this.getRecurrence(), this.getStartDate(), + compareDate); } + return false; + } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/CentersApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/CentersApiResource.java index 47aa652fc..156c59a24 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/CentersApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/CentersApiResource.java @@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.group.api; import java.util.Arrays; import java.util.Collection; +import java.util.Date; import java.util.HashSet; import java.util.Set; @@ -26,6 +27,7 @@ import javax.ws.rs.core.UriInfo; import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; +import org.mifosplatform.accounting.journalentry.api.DateParam; import org.mifosplatform.commands.domain.CommandWrapper; import org.mifosplatform.commands.service.CommandWrapperBuilder; import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService; @@ -49,6 +51,7 @@ import org.mifosplatform.portfolio.collectionsheet.data.JLGCollectionSheetData; import org.mifosplatform.portfolio.collectionsheet.service.CollectionSheetReadPlatformService; import org.mifosplatform.portfolio.group.data.CenterData; import org.mifosplatform.portfolio.group.data.GroupGeneralData; +import org.mifosplatform.portfolio.group.data.StaffCenterData; import org.mifosplatform.portfolio.group.service.CenterReadPlatformService; import org.mifosplatform.portfolio.group.service.SearchParameters; import org.mifosplatform.portfolio.meeting.data.MeetingData; @@ -131,13 +134,20 @@ public class CentersApiResource { @QueryParam("externalId") final String externalId, @QueryParam("name") final String name, @QueryParam("underHierarchy") final String hierarchy, @QueryParam("paged") final Boolean paged, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, - @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) { + @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, + @QueryParam("meetingDate") final DateParam meetingDateParam, @QueryParam("dateFormat") final String dateFormat, + @QueryParam("locale") final String locale) { this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.CENTER_RESOURCE_NAME); + final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); + if (meetingDateParam != null && officeId != null) { + Date meetingDate = meetingDateParam.getDate("meetingDate", dateFormat, locale); + Collection staffCenterDataArray = this.centerReadPlatformService.retriveAllCentersByMeetingDate(officeId, meetingDate, staffId); + return this.toApiJsonSerializer.serialize(settings, staffCenterDataArray, GroupingTypesApiConstants.STAFF_CENTER_RESPONSE_DATA_PARAMETERS); + } final PaginationParameters parameters = PaginationParameters.instance(paged, offset, limit, orderBy, sortOrder); final SearchParameters searchParameters = SearchParameters.forGroups(sqlSearch, officeId, staffId, externalId, name, hierarchy, offset, limit, orderBy, sortOrder); - final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); if (parameters.isPaged()) { final Page centers = this.centerReadPlatformService.retrievePagedAll(searchParameters, parameters); return this.toApiJsonSerializer.serialize(settings, centers, GroupingTypesApiConstants.CENTER_RESPONSE_DATA_PARAMETERS); @@ -238,7 +248,7 @@ public class CentersApiResource { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String activate(@PathParam("centerId") final Long centerId, @QueryParam("command") final String commandParam, - final String apiRequestBodyAsJson, @Context final UriInfo uriInfo) { + final String apiRequestBodyAsJson, @Context final UriInfo uriInfo) { final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupingTypesApiConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupingTypesApiConstants.java index d6f9ce3dd..96b58aeb2 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupingTypesApiConstants.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupingTypesApiConstants.java @@ -63,7 +63,10 @@ public class GroupingTypesApiConstants { // group close parameters public static final String closureDateParamName = "closureDate"; public static final String closureReasonIdParamName = "closureReasonId"; - + + //staff centres parameters + public static final String meetingFallCenters = "meetingFallCenters"; + public static final Set CENTER_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(localeParamName, dateFormatParamName, idParamName, nameParamName, externalIdParamName, officeIdParamName, staffIdParamName, activeParamName, activationDateParamName, groupMembersParamName,submittedOnDateParamName)); @@ -102,4 +105,7 @@ public class GroupingTypesApiConstants { public static final Set GROUP_CLOSE_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(localeParamName, dateFormatParamName, closureDateParamName, closureReasonIdParamName)); + + public static final Set STAFF_CENTER_RESPONSE_DATA_PARAMETERS = new HashSet( + Arrays.asList(staffIdParamName, staffNameParamName, meetingFallCenters)); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/CenterData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/CenterData.java index e020346a6..2a9d8575f 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/CenterData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/CenterData.java @@ -62,13 +62,12 @@ public class CenterData { public static CenterData instance(final Long id, final String name, final String externalId, final EnumOptionData status, final LocalDate activationDate, final Long officeId, final String officeName, final Long staffId, final String staffName, - final String hierarchy, final GroupTimelineData timeline) { + final String hierarchy, final GroupTimelineData timeline, final CalendarData collectionMeetingCalendar) { final Collection groupMembers = null; final Collection officeOptions = null; final Collection staffOptions = null; final Collection groupMembersOptions = null; - final CalendarData collectionMeetingCalendar = null; final Collection closureReasons = null; return new CenterData(id, name, externalId, status, activationDate, officeId, officeName, staffId, staffName, hierarchy, @@ -155,4 +154,12 @@ public class CenterData { public String getHierarchy() { return this.hierarchy; } + + public CalendarData getCollectionMeetingCalendar() { + return collectionMeetingCalendar; + } + + public String getStaffName() { + return this.staffName; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/StaffCenterData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/StaffCenterData.java new file mode 100644 index 000000000..9567c998f --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/StaffCenterData.java @@ -0,0 +1,29 @@ +package org.mifosplatform.portfolio.group.data; + +import java.util.Collection; + +public class StaffCenterData { + + private final Long staffId; + @SuppressWarnings("unused") + private final String staffName; + private final Collection meetingFallCenters; + + private StaffCenterData(final Long staffId, final String staffName, final Collection meetingFallCenters) { + this.staffId = staffId; + this.staffName = staffName; + this.meetingFallCenters = meetingFallCenters; + } + + public static StaffCenterData instance(final Long staffId, final String staffName, final Collection meetingFallCenters) { + return new StaffCenterData(staffId, staffName, meetingFallCenters); + } + public Long getStaffId() { + return staffId; + } + + public Collection getMeetingFallCenters() { + return meetingFallCenters; + } +} + \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformService.java index 3595ca649..69d775625 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformService.java @@ -6,11 +6,13 @@ package org.mifosplatform.portfolio.group.service; import java.util.Collection; +import java.util.Date; import org.mifosplatform.infrastructure.core.data.PaginationParameters; import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.portfolio.group.data.CenterData; import org.mifosplatform.portfolio.group.data.GroupGeneralData; +import org.mifosplatform.portfolio.group.data.StaffCenterData; public interface CenterReadPlatformService { @@ -29,4 +31,6 @@ public interface CenterReadPlatformService { Collection retrieveAssociatedGroups(Long centerId); CenterData retrieveCenterWithClosureReasons(); + + Collection retriveAllCentersByMeetingDate(Long officeId, Date meetingDate, Long staffId); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformServiceImpl.java index 2c05bea4e..0b40069d3 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformServiceImpl.java @@ -10,6 +10,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -31,6 +32,8 @@ import org.mifosplatform.organisation.office.data.OfficeData; import org.mifosplatform.organisation.office.service.OfficeReadPlatformService; import org.mifosplatform.organisation.staff.data.StaffData; import org.mifosplatform.organisation.staff.service.StaffReadPlatformService; +import org.mifosplatform.portfolio.calendar.data.CalendarData; +import org.mifosplatform.portfolio.calendar.service.CalendarEnumerations; import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.client.domain.ClientEnumerations; import org.mifosplatform.portfolio.client.service.ClientReadPlatformService; @@ -38,6 +41,7 @@ import org.mifosplatform.portfolio.group.api.GroupingTypesApiConstants; import org.mifosplatform.portfolio.group.data.CenterData; import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.group.data.GroupTimelineData; +import org.mifosplatform.portfolio.group.data.StaffCenterData; import org.mifosplatform.portfolio.group.domain.GroupTypes; import org.mifosplatform.portfolio.group.domain.GroupingTypeEnumerations; import org.mifosplatform.portfolio.group.exception.CenterNotFoundException; @@ -197,7 +201,58 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService activationDate, activatedByUsername, activatedByFirstname, activatedByLastname, closedOnDate, closedByUsername, closedByFirstname, closedByLastname); - return CenterData.instance(id, name, externalId, status, activationDate, officeId, officeName, staffId, staffName, hierarchy, timeline); + return CenterData.instance(id, name, externalId, status, activationDate, officeId, officeName, staffId, staffName, hierarchy, timeline, null); + } + } + + private static final class CenterCalendarDataMapper implements RowMapper { + + private final String schemaSql; + + public CenterCalendarDataMapper() { + + schemaSql = " select g.id as id, g.display_name as name, g.office_id as officeId, g.staff_id as staffId, s.display_name as staffName, g.external_id as externalId, " + +" g.status_enum as statusEnum, g.activation_date as activationDate, g.hierarchy as hierarchy, " + +" c.id as calendarId, ci.id as calendarInstanceId, ci.entity_id as entityId, " + +" ci.entity_type_enum as entityTypeId, c.title as title, c.description as description, " + +" c.location as location, c.start_date as startDate, c.end_date as endDate, c.recurrence as recurrence " + +" from m_calendar c join m_calendar_instance ci on ci.calendar_id=c.id and ci.entity_type_enum=4 join m_group g " + +" on g.id = ci.entity_id join m_staff s on g.staff_id = s.id where g.office_id=? "; + } + + public String schema() { + return this.schemaSql; + } + + @Override + public CenterData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + + final Long id = rs.getLong("id"); + final String name = rs.getString("name"); + final Integer statusEnum = JdbcSupport.getInteger(rs, "statusEnum"); + final EnumOptionData status = GroupingTypeEnumerations.status(statusEnum); + final LocalDate activationDate = JdbcSupport.getLocalDate(rs, "activationDate"); + final String externalId = rs.getString("externalId"); + final Long officeId = rs.getLong("officeId"); + final Long staffId = JdbcSupport.getLong(rs, "staffId"); + final String staffName = rs.getString("staffName"); + final String hierarchy = rs.getString("hierarchy"); + + final Long calendarId = rs.getLong("calendarId"); + final Long calendarInstanceId = rs.getLong("calendarInstanceId"); + final Long entityId = rs.getLong("entityId"); + final Integer entityTypeId = rs.getInt("entityTypeId"); + final EnumOptionData entityType = CalendarEnumerations.calendarEntityType(entityTypeId); + final String title = rs.getString("title"); + final String description = rs.getString("description"); + final String location = rs.getString("location"); + final LocalDate startDate = JdbcSupport.getLocalDate(rs, "startDate"); + final LocalDate endDate = JdbcSupport.getLocalDate(rs, "endDate"); + final String recurrence = rs.getString("recurrence"); + + CalendarData calendarData = CalendarData.instance(calendarId, calendarInstanceId, entityId, entityType, title, description, location, startDate, + endDate, null, null, false, recurrence, null, null, null, null, null, null, null, null, null, null, null, null, null); + return CenterData.instance(id, name, externalId, status, activationDate, officeId, null, staffId, staffName, hierarchy, null, calendarData); } } @@ -451,4 +506,46 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService this.codeValueReadPlatformService.retrieveCodeValuesByCode(GroupingTypesApiConstants.GROUP_CLOSURE_REASON)); return CenterData.withClosureReasons(closureReasons); } + + @Override + public Collection retriveAllCentersByMeetingDate(final Long officeId, final Date meetingDate, final Long staffId) { + final CenterCalendarDataMapper centerCalendarMapper = new CenterCalendarDataMapper(); + String sql = centerCalendarMapper.schema(); + Collection centerDataArray = null; + + if (staffId != null) { + sql += " and g.staff_id=? "; + centerDataArray = this.jdbcTemplate.query(sql, centerCalendarMapper, new Object[] {officeId, staffId}); + } else { + centerDataArray = this.jdbcTemplate.query(sql, centerCalendarMapper, new Object[] {officeId}); + } + + Collection staffCenterDataArray = new ArrayList(); + Boolean flag = false; + for (CenterData centerData : centerDataArray) { + if (centerData.getCollectionMeetingCalendar().isValidRecurringDate(new LocalDate(meetingDate))){ + if (staffCenterDataArray.size() <= 0) { + Collection meetingFallCenter = new ArrayList(); + meetingFallCenter.add(centerData); + staffCenterDataArray.add(StaffCenterData.instance(centerData.staffId(), centerData.getStaffName(), meetingFallCenter)); + } else { + for(StaffCenterData staffCenterData : staffCenterDataArray) { + flag = false; + if (staffCenterData.getStaffId() == centerData.staffId()) { + staffCenterData.getMeetingFallCenters().add(centerData); + flag = true; + break; + } + } + if (!flag) { + Collection meetingFallCenter = new ArrayList(); + meetingFallCenter.add(centerData); + staffCenterDataArray.add(StaffCenterData.instance(centerData.staffId(), centerData.getStaffName(), meetingFallCenter)); + } + } + + } + } + return staffCenterDataArray; + } } \ No newline at end of file