From 806ef048fea2588db6fbde023c58f681a9c96d54 Mon Sep 17 00:00:00 2001 From: ashok-conflux Date: Wed, 30 Oct 2013 18:45:42 +0530 Subject: [PATCH] Added validation for meeting frequency, weekdays and start date for Calendar --- .../portfolio/calendar/CalendarConstants.java | 2 +- .../calendar/api/CalendarsApiResource.java | 17 +- .../portfolio/calendar/data/CalendarData.java | 209 ++++++++++-------- .../portfolio/calendar/domain/Calendar.java | 20 +- .../calendar/domain/CalendarEntityType.java | 32 +++ .../domain/CalendarFrequencyType.java | 87 ++++++++ .../calendar/domain/CalendarWeekDaysType.java | 91 ++++++++ ...alendarCommandFromApiJsonDeserializer.java | 43 ++-- .../CalendarDropdownReadPlatformService.java | 4 + ...lendarDropdownReadPlatformServiceImpl.java | 11 + .../service/CalendarEnumerations.java | 40 ++++ .../CalendarReadPlatformServiceImpl.java | 11 +- .../calendar/service/CalendarUtils.java | 16 ++ ...WritePlatformServiceJpaRepositoryImpl.java | 61 ++++- .../portfolio/loanaccount/domain/Loan.java | 2 +- 15 files changed, 505 insertions(+), 141 deletions(-) create mode 100644 mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarFrequencyType.java create mode 100644 mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarWeekDaysType.java diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/CalendarConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/CalendarConstants.java index 358b85006..93c92d65b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/CalendarConstants.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/CalendarConstants.java @@ -14,7 +14,7 @@ public class CalendarConstants { CALENDAR_ID("id"), ENTITY_TYPE("entityType"), ENTITY_ID("entityId"), TITLE("title"), DESCRIPTION("description"), LOCATION( "location"), START_DATE("startDate"), END_DATE("endDate"), CREATED_DATE("createdDate"), DURATION("duration"), TYPE_ID( "typeId"), REPEATING("repeating"), REMIND_BY_ID("remindById"), FIRST_REMINDER("firstReminder"), SECOND_REMINDER( - "secondReminder"), LOCALE("locale"), DATE_FORMAT("dateFormat"), REPEATS("repeats"), REPEATS_EVERY("repeatsEvery"), REPEATS_ON_DAY( + "secondReminder"), LOCALE("locale"), DATE_FORMAT("dateFormat"), FREQUENCY("frequency"), INTERVAL("interval"), REPEATS_ON_DAY( "repeatsOnDay"); private final String value; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/api/CalendarsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/api/CalendarsApiResource.java index 8f9d0e7a2..097e4c845 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/api/CalendarsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/api/CalendarsApiResource.java @@ -54,10 +54,12 @@ public class CalendarsApiResource { /** * The set of parameters that are supported in response for {@link Calendar} */ - private final Set RESPONSE_DATA_PARAMETERS = new HashSet(Arrays.asList("id", "entityId", "entityType", "title", - "description", "location", "startDate", "endDate", "duration", "type", "repeating", "recurrence", "remindBy", "firstReminder", - "secondReminder", "humanReadable", "createdDate", "lastUpdatedDate", "createdByUserId", "createdByUsername", - "lastUpdatedByUserId", "lastUpdatedByUsername", "recurringDates", "nextTenRecurringDates")); + private final Set RESPONSE_DATA_PARAMETERS = new HashSet( + Arrays.asList("id", "entityId", "entityType", "title", "description", "location", "startDate", "endDate", "duration", "type", + "repeating", "recurrence", "frequency", "interval", "repeatsOnDay", "remindBy", "firstReminder", "secondReminder", + "humanReadable", "createdDate", "lastUpdatedDate", "createdByUserId", "createdByUsername", "lastUpdatedByUserId", + "lastUpdatedByUsername", "recurringDates", "nextTenRecurringDates", "entityTypeOptions", "calendarTypeOptions", + "remindByOptions", "frequencyOptions", "repeatsOnDayOptions")); private final String resourceNameForPermissions = "CALENDAR"; private final PlatformSecurityContext context; @@ -188,7 +190,7 @@ public class CalendarsApiResource { @Path("{calendarId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String deleteGLAccount(@PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId, + public String deleteCalendar(@PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId, @PathParam("calendarId") final Long calendarId) { final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteCalendar(entityType, entityId, calendarId).build(); @@ -202,7 +204,10 @@ public class CalendarsApiResource { final List entityTypeOptions = this.dropdownReadPlatformService.retrieveCalendarEntityTypeOptions(); final List calendarTypeOptions = this.dropdownReadPlatformService.retrieveCalendarTypeOptions(); final List remindByOptions = this.dropdownReadPlatformService.retrieveCalendarRemindByOptions(); - return new CalendarData(calendarData, entityTypeOptions, calendarTypeOptions, remindByOptions); + final List frequencyOptions = this.dropdownReadPlatformService.retrieveCalendarFrequencyTypeOptions(); + final List repeatsOnDayOptions = this.dropdownReadPlatformService.retrieveCalendarWeekDaysTypeOptions(); + return CalendarData.withTemplateOptions(calendarData, entityTypeOptions, calendarTypeOptions, remindByOptions, frequencyOptions, + repeatsOnDayOptions); } } \ No newline at end of file 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 ba9e0423a..2b0f4f799 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 @@ -10,8 +10,10 @@ import java.util.List; import org.joda.time.LocalDate; import org.mifosplatform.infrastructure.core.data.EnumOptionData; +import org.mifosplatform.portfolio.calendar.domain.CalendarFrequencyType; 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; /** @@ -31,6 +33,9 @@ public class CalendarData { private final EnumOptionData type; private final boolean repeating; private final String recurrence; + private final EnumOptionData frequency; + private final Integer interval; + private final EnumOptionData repeatsOnDay; private final EnumOptionData remindBy; private final Integer firstReminder; private final Integer secondReminder; @@ -50,108 +55,44 @@ public class CalendarData { final List entityTypeOptions; final List calendarTypeOptions; final List remindByOptions; + final List frequencyOptions; + final List repeatsOnDayOptions; - public CalendarData(final Long id, final Long entityId, final EnumOptionData entityType, final String title, final String description, - final String location, final LocalDate startDate, final LocalDate endDate, final Integer duration, final EnumOptionData type, - final boolean repeating, final String recurrence, final EnumOptionData remindBy, final Integer firstReminder, - final Integer secondReminder, final String humanReadable, final LocalDate recentEligibleMeetingDate, - final LocalDate createdDate, final LocalDate lastUpdatedDate, final Long createdByUserId, final String createdByUsername, - final Long lastUpdatedByUserId, final String lastUpdatedByUsername) { + public static CalendarData instance(final Long id, final Long entityId, final EnumOptionData entityType, final String title, + final String description, final String location, final LocalDate startDate, final LocalDate endDate, final Integer duration, + final EnumOptionData type, final boolean repeating, final String recurrence, final EnumOptionData frequency, + final Integer interval, final EnumOptionData repeatsOnDay, final EnumOptionData remindBy, final Integer firstReminder, + final Integer secondReminder, final String humanReadable, final LocalDate createdDate, final LocalDate lastUpdatedDate, + final Long createdByUserId, final String createdByUsername, final Long lastUpdatedByUserId, final String lastUpdatedByUsername) { - this.id = id; - this.entityId = entityId; - this.entityType = entityType; - this.title = title; - this.description = description; - this.location = location; - this.startDate = startDate; - this.endDate = endDate; - this.duration = duration; - this.type = type; - this.repeating = repeating; - this.recurrence = recurrence; - this.remindBy = remindBy; - this.firstReminder = firstReminder; - this.secondReminder = secondReminder; - this.entityTypeOptions = null; - this.calendarTypeOptions = null; - this.remindByOptions = null; - this.recurringDates = null; - this.nextTenRecurringDates = null; - this.humanReadable = humanReadable; - this.recentEligibleMeetingDate = recentEligibleMeetingDate; + final Collection recurringDates = null; + final Collection nextTenRecurringDates = null; + final LocalDate recentEligibleMeetingDate = null; - this.createdDate = createdDate; - this.lastUpdatedDate = lastUpdatedDate; - this.createdByUserId = createdByUserId; - this.createdByUsername = createdByUsername; - this.lastUpdatedByUserId = lastUpdatedByUserId; - this.lastUpdatedByUsername = lastUpdatedByUsername; + final List entityTypeOptions = null; + final List calendarTypeOptions = null; + final List remindByOptions = null; + final List frequencyOptions = null; + final List repeatsOnDayOptions = null; + + return new CalendarData(id, entityId, entityType, title, description, location, startDate, endDate, duration, type, repeating, + recurrence, frequency, interval, repeatsOnDay, remindBy, firstReminder, secondReminder, recurringDates, + nextTenRecurringDates, humanReadable, recentEligibleMeetingDate, createdDate, lastUpdatedDate, createdByUserId, + createdByUsername, lastUpdatedByUserId, lastUpdatedByUsername, entityTypeOptions, calendarTypeOptions, remindByOptions, + frequencyOptions, repeatsOnDayOptions); } - public CalendarData(final CalendarData calendarData, final List entityTypeOptions, - final List calendarTypeOptions, final List remindByOptions) { - this.id = calendarData.id; - this.entityId = calendarData.entityId; - this.entityType = calendarData.entityType; - this.title = calendarData.title; - this.description = calendarData.description; - this.location = calendarData.location; - this.startDate = calendarData.startDate; - this.endDate = calendarData.endDate; - this.duration = calendarData.duration; - this.type = calendarData.type; - this.repeating = calendarData.repeating; - this.recurrence = calendarData.recurrence; - this.remindBy = calendarData.remindBy; - this.firstReminder = calendarData.firstReminder; - this.secondReminder = calendarData.secondReminder; - this.entityTypeOptions = entityTypeOptions; - this.calendarTypeOptions = calendarTypeOptions; - this.remindByOptions = remindByOptions; - this.recurringDates = calendarData.recurringDates; - this.nextTenRecurringDates = calendarData.nextTenRecurringDates; - this.humanReadable = calendarData.humanReadable; - this.recentEligibleMeetingDate = calendarData.recentEligibleMeetingDate; - this.createdDate = calendarData.createdDate; - this.lastUpdatedDate = calendarData.lastUpdatedDate; - this.createdByUserId = calendarData.createdByUserId; - this.createdByUsername = calendarData.createdByUsername; - this.lastUpdatedByUserId = calendarData.lastUpdatedByUserId; - this.lastUpdatedByUsername = calendarData.lastUpdatedByUsername; - } - - public CalendarData(final CalendarData calendarData, final Collection recurringDates, + public static CalendarData withRecurringDates(final CalendarData calendarData, final Collection recurringDates, final Collection nextTenRecurringDates, final LocalDate recentEligibleMeetingDate) { - this.id = calendarData.id; - this.entityId = calendarData.entityId; - this.entityType = calendarData.entityType; - this.title = calendarData.title; - this.description = calendarData.description; - this.location = calendarData.location; - this.startDate = calendarData.startDate; - this.endDate = calendarData.endDate; - this.duration = calendarData.duration; - this.type = calendarData.type; - this.repeating = calendarData.repeating; - this.recurrence = calendarData.recurrence; - this.remindBy = calendarData.remindBy; - this.firstReminder = calendarData.firstReminder; - this.secondReminder = calendarData.secondReminder; - this.entityTypeOptions = null; - this.calendarTypeOptions = null; - this.remindByOptions = null; - this.recurringDates = recurringDates; - this.nextTenRecurringDates = nextTenRecurringDates; - this.humanReadable = calendarData.humanReadable; - this.recentEligibleMeetingDate = recentEligibleMeetingDate; - this.createdDate = calendarData.createdDate; - this.lastUpdatedDate = calendarData.lastUpdatedDate; - this.createdByUserId = calendarData.createdByUserId; - this.createdByUsername = calendarData.createdByUsername; - this.lastUpdatedByUserId = calendarData.lastUpdatedByUserId; - this.lastUpdatedByUsername = calendarData.lastUpdatedByUsername; - + return new CalendarData(calendarData.id, calendarData.entityId, calendarData.entityType, calendarData.title, + calendarData.description, calendarData.location, calendarData.startDate, calendarData.endDate, calendarData.duration, + calendarData.type, calendarData.repeating, calendarData.recurrence, calendarData.frequency, calendarData.interval, + calendarData.repeatsOnDay, calendarData.remindBy, calendarData.firstReminder, calendarData.secondReminder, recurringDates, + nextTenRecurringDates, calendarData.humanReadable, recentEligibleMeetingDate, calendarData.createdDate, + calendarData.lastUpdatedDate, calendarData.createdByUserId, calendarData.createdByUsername, + calendarData.lastUpdatedByUserId, calendarData.lastUpdatedByUsername, calendarData.entityTypeOptions, + calendarData.calendarTypeOptions, calendarData.remindByOptions, calendarData.frequencyOptions, + calendarData.repeatsOnDayOptions); } public static CalendarData sensibleDefaultsForNewCalendarCreation() { @@ -167,12 +108,23 @@ public class CalendarData { final EnumOptionData type = CalendarEnumerations.calendarType(CalendarType.COLLECTION); final boolean repeating = false; final String recurrence = null; + final EnumOptionData frequency = CalendarEnumerations.calendarFrequencyType(CalendarFrequencyType.DAILY); + final Integer interval = new Integer(1); + final EnumOptionData repeatsOnDay = CalendarEnumerations.calendarWeekDaysType(CalendarWeekDaysType.MO); final EnumOptionData remindBy = CalendarEnumerations.calendarRemindBy(CalendarRemindBy.EMAIL); final Integer firstReminder = new Integer(0); final Integer secondReminder = new Integer(0); final String humanReadable = null; + final Collection recurringDates = null; + final Collection nextTenRecurringDates = null; final LocalDate recentEligibleMeetingDate = null; + final List entityTypeOptions = null; + final List calendarTypeOptions = null; + final List remindByOptions = null; + final List frequencyOptions = null; + final List repeatsOnDayOptions = null; + final LocalDate createdDate = null; final LocalDate lastUpdatedDate = null; final Long createdByUserId = null; @@ -181,8 +133,69 @@ public class CalendarData { final String lastUpdatedByUsername = null; return new CalendarData(id, entityId, entityType, title, description, location, startDate, endDate, duration, type, repeating, - recurrence, remindBy, firstReminder, secondReminder, humanReadable, recentEligibleMeetingDate, createdDate, - lastUpdatedDate, createdByUserId, createdByUsername, lastUpdatedByUserId, lastUpdatedByUsername); + recurrence, frequency, interval, repeatsOnDay, remindBy, firstReminder, secondReminder, recurringDates, + nextTenRecurringDates, humanReadable, recentEligibleMeetingDate, createdDate, lastUpdatedDate, createdByUserId, + createdByUsername, lastUpdatedByUserId, lastUpdatedByUsername, entityTypeOptions, calendarTypeOptions, remindByOptions, + frequencyOptions, repeatsOnDayOptions); + } + + public static CalendarData withTemplateOptions(final CalendarData calendarData, final List entityTypeOptions, + final List calendarTypeOptions, final List remindByOptions, + final List repeatsOptions, final List repeatsOnDayOptions) { + + return new CalendarData(calendarData.id, calendarData.entityId, calendarData.entityType, calendarData.title, + calendarData.description, calendarData.location, calendarData.startDate, calendarData.endDate, calendarData.duration, + calendarData.type, calendarData.repeating, calendarData.recurrence, calendarData.frequency, calendarData.interval, + calendarData.repeatsOnDay, calendarData.remindBy, calendarData.firstReminder, calendarData.secondReminder, + calendarData.recurringDates, calendarData.nextTenRecurringDates, calendarData.humanReadable, + calendarData.recentEligibleMeetingDate, calendarData.createdDate, calendarData.lastUpdatedDate, + calendarData.createdByUserId, calendarData.createdByUsername, calendarData.lastUpdatedByUserId, calendarData.lastUpdatedByUsername, + entityTypeOptions, calendarTypeOptions, remindByOptions, repeatsOptions, repeatsOnDayOptions); + } + + private CalendarData(final Long id, final Long entityId, final EnumOptionData entityType, final String title, final String description, + final String location, final LocalDate startDate, final LocalDate endDate, final Integer duration, final EnumOptionData type, + final boolean repeating, final String recurrence, final EnumOptionData frequency, final Integer interval, + final EnumOptionData repeatsOnDay, final EnumOptionData remindBy, final Integer firstReminder, final Integer secondReminder, + final Collection recurringDates, final Collection nextTenRecurringDates, final String humanReadable, + final LocalDate recentEligibleMeetingDate, final LocalDate createdDate, final LocalDate lastUpdatedDate, + final Long createdByUserId, final String createdByUsername, final Long lastUpdatedByUserId, final String lastUpdatedByUsername, + final List entityTypeOptions, final List calendarTypeOptions, + final List remindByOptions, final List repeatsOptions, + final List repeatsOnDayOptions) { + this.id = id; + this.entityId = entityId; + this.entityType = entityType; + this.title = title; + this.description = description; + this.location = location; + this.startDate = startDate; + this.endDate = endDate; + this.duration = duration; + this.type = type; + this.repeating = repeating; + this.recurrence = recurrence; + this.frequency = frequency; + this.interval = interval; + this.repeatsOnDay = repeatsOnDay; + this.remindBy = remindBy; + this.firstReminder = firstReminder; + this.secondReminder = secondReminder; + this.recurringDates = recurringDates; + this.nextTenRecurringDates = nextTenRecurringDates; + this.humanReadable = humanReadable; + this.recentEligibleMeetingDate = recentEligibleMeetingDate; + this.createdDate = createdDate; + this.lastUpdatedDate = lastUpdatedDate; + this.createdByUserId = createdByUserId; + this.createdByUsername = createdByUsername; + this.lastUpdatedByUserId = lastUpdatedByUserId; + this.lastUpdatedByUsername = lastUpdatedByUsername; + this.entityTypeOptions = entityTypeOptions; + this.calendarTypeOptions = calendarTypeOptions; + this.remindByOptions = remindByOptions; + this.frequencyOptions = repeatsOptions; + this.repeatsOnDayOptions = repeatsOnDayOptions; } public Long getId() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/Calendar.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/Calendar.java index b63c594a4..35503566a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/Calendar.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/Calendar.java @@ -337,19 +337,21 @@ public class Calendar extends AbstractAuditableCustom { if (repeating) { final StringBuilder recurrenceBuilder = new StringBuilder(200); - final String repeats = command.stringValueOfParameterNamed(CALENDAR_SUPPORTED_PARAMETERS.REPEATS.getValue()); + final Integer frequency = command.integerValueOfParameterNamed(CALENDAR_SUPPORTED_PARAMETERS.FREQUENCY.getValue()); + final CalendarFrequencyType frequencyType = CalendarFrequencyType.fromInt(frequency); recurrenceBuilder.append("FREQ="); - recurrenceBuilder.append(repeats.toUpperCase()); - final Integer repeatsEvery = command.integerValueOfParameterNamed(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_EVERY.getValue()); - if (repeatsEvery > 1) { + recurrenceBuilder.append(frequencyType.toString().toUpperCase()); + final Integer interval = command.integerValueOfParameterNamed(CALENDAR_SUPPORTED_PARAMETERS.INTERVAL.getValue()); + if (interval > 1) { recurrenceBuilder.append(";INTERVAL="); - recurrenceBuilder.append(repeatsEvery); + recurrenceBuilder.append(interval); } - if (repeats.equalsIgnoreCase("Weekly")) { - final String repeatsOnDay = command.stringValueOfParameterNamed(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_ON_DAY.getValue()); - if (repeatsOnDay != null && repeatsOnDay != "") { + if (frequencyType.isWeekly()) { + final Integer repeatsOnDay = command.integerValueOfParameterNamed(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_ON_DAY.getValue()); + final CalendarWeekDaysType weekDays = CalendarWeekDaysType.fromInt(repeatsOnDay); + if (!weekDays.isInvalid()) { recurrenceBuilder.append(";BYDAY="); - recurrenceBuilder.append(repeatsOnDay); + recurrenceBuilder.append(weekDays.toString().toUpperCase()); } } return recurrenceBuilder.toString(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarEntityType.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarEntityType.java index 931504dae..495a644ec 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarEntityType.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarEntityType.java @@ -82,4 +82,36 @@ public enum CalendarEntityType { public static boolean isCenter(final String name) { return CalendarEntityType.CENTERS.name().equalsIgnoreCase(name) ? true : false; } + + public static boolean isLoan(final Integer value) { + return CalendarEntityType.LOANS.value.equals(value) ? true : false; + } + + public static boolean isLoan(final String name) { + return CalendarEntityType.LOANS.name().equalsIgnoreCase(name) ? true : false; + } + + public static boolean isClient(final Integer value) { + return CalendarEntityType.CLIENTS.value.equals(value) ? true : false; + } + + public static boolean isClient(final String name) { + return CalendarEntityType.CLIENTS.name().equalsIgnoreCase(name) ? true : false; + } + + public boolean isCenter() { + return this.value.equals(CalendarEntityType.CENTERS.getValue()); + } + + public boolean isGroup() { + return this.value.equals(CalendarEntityType.GROUPS.getValue()); + } + + public boolean isLoan() { + return this.value.equals(CalendarEntityType.LOANS.getValue()); + } + + public boolean isClient() { + return this.value.equals(CalendarEntityType.CLIENTS.getValue()); + } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarFrequencyType.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarFrequencyType.java new file mode 100644 index 000000000..a463edec2 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarFrequencyType.java @@ -0,0 +1,87 @@ +/** + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.mifosplatform.portfolio.calendar.domain; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.util.StringUtils; + +public enum CalendarFrequencyType { + + INVALID(0, "calendarFrequencyType.invalid"), DAILY(1, "calendarFrequencyType.daily"), WEEKLY(2, "calendarFrequencyType.weekly"), MONTHLY( + 3, "calendarFrequencyType.monthly"), YEARLY(4, "calendarFrequencyType.yearly"); + + private final Integer value; + private final String code; + + private CalendarFrequencyType(final Integer value, final String code) { + this.value = value; + this.code = code; + } + + public Integer getValue() { + return this.value; + } + + public String getCode() { + return this.code; + } + + private static final Map intToEnumMap = new HashMap(); + private static int minValue = CalendarFrequencyType.DAILY.value; + private static int maxValue = CalendarFrequencyType.YEARLY.value; + + static { + for (final CalendarFrequencyType type : CalendarFrequencyType.values()) { + intToEnumMap.put(type.value, type); + } + } + + public static CalendarFrequencyType fromInt(final int i) { + final CalendarFrequencyType type = intToEnumMap.get(Integer.valueOf(i)); + return type; + } + + public static CalendarFrequencyType fromString(final String frequencyString) { + CalendarFrequencyType frequency = CalendarFrequencyType.INVALID; + + if (StringUtils.isEmpty(frequencyString)) return frequency; + + if (frequencyString.equalsIgnoreCase(CalendarFrequencyType.DAILY.toString())) { + frequency = CalendarFrequencyType.DAILY; + } else if (frequencyString.equalsIgnoreCase(CalendarFrequencyType.WEEKLY.toString())) { + frequency = CalendarFrequencyType.WEEKLY; + } else if (frequencyString.equalsIgnoreCase(CalendarFrequencyType.MONTHLY.toString())) { + frequency = CalendarFrequencyType.MONTHLY; + } else if (frequencyString.equalsIgnoreCase(CalendarFrequencyType.YEARLY.toString())) { + frequency = CalendarFrequencyType.YEARLY; + } + + return frequency; + } + + public static int getMinValue() { + return minValue; + } + + public static int getMaxValue() { + return maxValue; + } + + @Override + public String toString() { + return name().toString(); + } + + public boolean isWeekly(){ + return this.value.equals(CalendarFrequencyType.WEEKLY.value); + } + + public boolean isInvalid(){ + return this.value.equals(CalendarFrequencyType.INVALID.value); + } +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarWeekDaysType.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarWeekDaysType.java new file mode 100644 index 000000000..43ca2a71f --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/domain/CalendarWeekDaysType.java @@ -0,0 +1,91 @@ +/** + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.mifosplatform.portfolio.calendar.domain; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.util.StringUtils; + +public enum CalendarWeekDaysType { + + INVALID(0, "calendarWeekDaysType.invalid"), MO(1, "calendarWeekDaysType.monday"), TU(2, "calendarWeekDaysType.tuesday"), WE(3, + "calendarWeekDaysType.wednesday"), TH(4, "calendarWeekDaysType.thursday"), FR(5, "calendarWeekDaysType.friday"), SA(6, + "calendarWeekDaysType.saturday"), SU(7, "calendarWeekDaysType.sunday"); + + private final Integer value; + private final String code; + + private CalendarWeekDaysType(final Integer value, final String code) { + this.value = value; + this.code = code; + } + + public Integer getValue() { + return this.value; + } + + public String getCode() { + return this.code; + } + + private static final Map intToEnumMap = new HashMap(); + private static int minValue = CalendarWeekDaysType.MO.value; + private static int maxValue = CalendarWeekDaysType.SU.value; + + static { + for (final CalendarWeekDaysType type : CalendarWeekDaysType.values()) { + intToEnumMap.put(type.value, type); + } + } + + + public static CalendarWeekDaysType fromInt(final int i) { + final CalendarWeekDaysType type = intToEnumMap.get(Integer.valueOf(i)); + return type; + } + + public static int getMinValue() { + return minValue; + } + + public static int getMaxValue() { + return maxValue; + } + + @Override + public String toString() { + return name().toString(); + } + + public boolean isInvalid(){ + return this.value.equals(CalendarWeekDaysType.INVALID.value); + } + + public static CalendarWeekDaysType fromString(final String weekDayString) { + CalendarWeekDaysType weekDay = CalendarWeekDaysType.INVALID; + + if (StringUtils.isEmpty(weekDayString)) return weekDay; + + if (weekDayString.equalsIgnoreCase(CalendarWeekDaysType.MO.toString())) { + weekDay = CalendarWeekDaysType.MO; + } else if (weekDayString.equalsIgnoreCase(CalendarWeekDaysType.TU.toString())) { + weekDay = CalendarWeekDaysType.TU; + } else if (weekDayString.equalsIgnoreCase(CalendarWeekDaysType.WE.toString())) { + weekDay = CalendarWeekDaysType.WE; + } else if (weekDayString.equalsIgnoreCase(CalendarWeekDaysType.TH.toString())) { + weekDay = CalendarWeekDaysType.TH; + } else if (weekDayString.equalsIgnoreCase(CalendarWeekDaysType.FR.toString())) { + weekDay = CalendarWeekDaysType.FR; + } else if (weekDayString.equalsIgnoreCase(CalendarWeekDaysType.SA.toString())) { + weekDay = CalendarWeekDaysType.SA; + } else if (weekDayString.equalsIgnoreCase(CalendarWeekDaysType.SU.toString())) { + weekDay = CalendarWeekDaysType.SU; + } + + return weekDay; + } +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java index ecc57aced..68fcfb999 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java @@ -22,7 +22,9 @@ import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.portfolio.calendar.CalendarConstants.CALENDAR_SUPPORTED_PARAMETERS; import org.mifosplatform.portfolio.calendar.command.CalendarCommand; import org.mifosplatform.portfolio.calendar.domain.CalendarEntityType; +import org.mifosplatform.portfolio.calendar.domain.CalendarFrequencyType; import org.mifosplatform.portfolio.calendar.domain.CalendarRemindBy; +import org.mifosplatform.portfolio.calendar.domain.CalendarWeekDaysType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -141,22 +143,22 @@ public class CalendarCommandFromApiJsonDeserializer extends AbstractFromApiJsonD baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.REPEATING.getValue()).value(repeating).notNull(); if (repeating) { - final String repeats = this.fromApiJsonHelper.extractStringNamed(CALENDAR_SUPPORTED_PARAMETERS.REPEATS.getValue(), element); - baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.REPEATS.getValue()).value(repeats).notBlank() - .notExceedingLengthOf(20); + final Integer frequency = this.fromApiJsonHelper.extractIntegerSansLocaleNamed( + CALENDAR_SUPPORTED_PARAMETERS.FREQUENCY.getValue(), element); + baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.FREQUENCY.getValue()).value(frequency).notBlank() + .inMinMaxRange(CalendarFrequencyType.getMinValue(), CalendarFrequencyType.getMaxValue()); - if (this.fromApiJsonHelper.parameterExists(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_EVERY.getValue(), element)) { - final Integer repeatsEvery = this.fromApiJsonHelper.extractIntegerSansLocaleNamed( - CALENDAR_SUPPORTED_PARAMETERS.REPEATS_EVERY.getValue(), element); - baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_EVERY.getValue()).value(repeatsEvery) + if (this.fromApiJsonHelper.parameterExists(CALENDAR_SUPPORTED_PARAMETERS.INTERVAL.getValue(), element)) { + final Integer interval = this.fromApiJsonHelper.extractIntegerSansLocaleNamed( + CALENDAR_SUPPORTED_PARAMETERS.INTERVAL.getValue(), element); + baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.INTERVAL.getValue()).value(interval) .notNull().integerGreaterThanZero(); } - - if (this.fromApiJsonHelper.parameterExists(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_ON_DAY.getValue(), element)) { - final String repeatsOnDay = this.fromApiJsonHelper.extractStringNamed( + if (CalendarFrequencyType.fromInt(frequency).isWeekly()) { + final Integer repeatsOnDay = this.fromApiJsonHelper.extractIntegerSansLocaleNamed( CALENDAR_SUPPORTED_PARAMETERS.REPEATS_ON_DAY.getValue(), element); baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_ON_DAY.getValue()).value(repeatsOnDay) - .notBlank().notNull(); + .notBlank().inMinMaxRange(CalendarWeekDaysType.getMinValue(), CalendarWeekDaysType.getMaxValue()); } } } @@ -251,22 +253,23 @@ public class CalendarCommandFromApiJsonDeserializer extends AbstractFromApiJsonD baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.REPEATING.getValue()).value(repeating).notNull(); if (repeating) { - final String repeats = this.fromApiJsonHelper.extractStringNamed(CALENDAR_SUPPORTED_PARAMETERS.REPEATS.getValue(), element); - baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.REPEATS.getValue()).value(repeats).ignoreIfNull() - .notBlank().notExceedingLengthOf(20); + final Integer frequency = this.fromApiJsonHelper.extractIntegerSansLocaleNamed( + CALENDAR_SUPPORTED_PARAMETERS.FREQUENCY.getValue(), element); + baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.FREQUENCY.getValue()).value(frequency).notBlank() + .inMinMaxRange(CalendarFrequencyType.getMinValue(), CalendarFrequencyType.getMaxValue()); - if (this.fromApiJsonHelper.parameterExists(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_EVERY.getValue(), element)) { - final Integer repeatsEvery = this.fromApiJsonHelper.extractIntegerSansLocaleNamed( - CALENDAR_SUPPORTED_PARAMETERS.REPEATS_EVERY.getValue(), element); - baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_EVERY.getValue()).value(repeatsEvery) + if (this.fromApiJsonHelper.parameterExists(CALENDAR_SUPPORTED_PARAMETERS.INTERVAL.getValue(), element)) { + final Integer interval = this.fromApiJsonHelper.extractIntegerSansLocaleNamed( + CALENDAR_SUPPORTED_PARAMETERS.INTERVAL.getValue(), element); + baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.INTERVAL.getValue()).value(interval) .notNull().integerGreaterThanZero(); } if (this.fromApiJsonHelper.parameterExists(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_ON_DAY.getValue(), element)) { - final String repeatsOnDay = this.fromApiJsonHelper.extractStringNamed( + final Integer repeatsOnDay = this.fromApiJsonHelper.extractIntegerSansLocaleNamed( CALENDAR_SUPPORTED_PARAMETERS.REPEATS_ON_DAY.getValue(), element); baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.REPEATS_ON_DAY.getValue()).value(repeatsOnDay) - .notBlank(); + .notBlank().inMinMaxRange(CalendarWeekDaysType.getMinValue(), CalendarWeekDaysType.getMaxValue()); } } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarDropdownReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarDropdownReadPlatformService.java index cdcf7c40e..79ab32f06 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarDropdownReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarDropdownReadPlatformService.java @@ -16,5 +16,9 @@ public interface CalendarDropdownReadPlatformService { List retrieveCalendarTypeOptions(); List retrieveCalendarRemindByOptions(); + + List retrieveCalendarFrequencyTypeOptions(); + + List retrieveCalendarWeekDaysTypeOptions(); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarDropdownReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarDropdownReadPlatformServiceImpl.java index 3cfb841de..18a14db69 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarDropdownReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarDropdownReadPlatformServiceImpl.java @@ -9,8 +9,10 @@ import java.util.List; import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.portfolio.calendar.domain.CalendarEntityType; +import org.mifosplatform.portfolio.calendar.domain.CalendarFrequencyType; import org.mifosplatform.portfolio.calendar.domain.CalendarRemindBy; import org.mifosplatform.portfolio.calendar.domain.CalendarType; +import org.mifosplatform.portfolio.calendar.domain.CalendarWeekDaysType; import org.springframework.stereotype.Service; @Service @@ -31,4 +33,13 @@ public class CalendarDropdownReadPlatformServiceImpl implements CalendarDropdown return CalendarEnumerations.calendarRemindBy(CalendarRemindBy.values()); } + @Override + public List retrieveCalendarFrequencyTypeOptions() { + return CalendarEnumerations.calendarFrequencyType(CalendarFrequencyType.values()); + } + + @Override + public List retrieveCalendarWeekDaysTypeOptions() { + return CalendarEnumerations.calendarWeekDaysType(CalendarWeekDaysType.values()); + } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarEnumerations.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarEnumerations.java index b002744c9..5efc4c7f1 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarEnumerations.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarEnumerations.java @@ -10,8 +10,10 @@ import java.util.List; import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.portfolio.calendar.domain.CalendarEntityType; +import org.mifosplatform.portfolio.calendar.domain.CalendarFrequencyType; import org.mifosplatform.portfolio.calendar.domain.CalendarRemindBy; import org.mifosplatform.portfolio.calendar.domain.CalendarType; +import org.mifosplatform.portfolio.calendar.domain.CalendarWeekDaysType; public class CalendarEnumerations { @@ -65,4 +67,42 @@ public class CalendarEnumerations { } return optionDatas; } + + public static EnumOptionData calendarFrequencyType(final int id) { + return calendarFrequencyType(CalendarFrequencyType.fromInt(id)); + } + + public static EnumOptionData calendarFrequencyType(final CalendarFrequencyType calendarFrequencyType) { + final EnumOptionData optionData = new EnumOptionData(calendarFrequencyType.getValue().longValue(), calendarFrequencyType.getCode(), calendarFrequencyType.toString()); + return optionData; + } + + public static List calendarFrequencyType(final CalendarFrequencyType[] calendarFrequencyTypes) { + final List optionDatas = new ArrayList(); + for (final CalendarFrequencyType calendarFrequencyType : calendarFrequencyTypes) { + if(!calendarFrequencyType.isInvalid()){ + optionDatas.add(calendarFrequencyType(calendarFrequencyType)); + } + } + return optionDatas; + } + + public static EnumOptionData calendarWeekDaysType(final int id) { + return calendarWeekDaysType(CalendarWeekDaysType.fromInt(id)); + } + + public static EnumOptionData calendarWeekDaysType(final CalendarWeekDaysType calendarWeekDaysType) { + final EnumOptionData optionData = new EnumOptionData(calendarWeekDaysType.getValue().longValue(), calendarWeekDaysType.getCode(), calendarWeekDaysType.toString()); + return optionData; + } + + public static List calendarWeekDaysType(final CalendarWeekDaysType[] calendarWeekDaysTypes) { + final List optionDatas = new ArrayList(); + for (final CalendarWeekDaysType calendarWeekDaysType : calendarWeekDaysTypes) { + if(!calendarWeekDaysType.isInvalid()){ + optionDatas.add(calendarWeekDaysType(calendarWeekDaysType)); + } + } + return optionDatas; + } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java index 0ffaffa36..34e221e71 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java @@ -67,6 +67,9 @@ public class CalendarReadPlatformServiceImpl implements CalendarReadPlatformServ final EnumOptionData type = CalendarEnumerations.calendarType(typeId); final boolean repeating = rs.getBoolean("repeating"); final String recurrence = rs.getString("recurrence"); + final EnumOptionData frequency = CalendarEnumerations.calendarFrequencyType(CalendarUtils.getFrequency(recurrence)); + final Integer interval = new Integer(CalendarUtils.getInterval(recurrence)); + final EnumOptionData repeatsOnDay = CalendarEnumerations.calendarWeekDaysType(CalendarUtils.getRepeatsOnDay(recurrence)); final Integer remindById = rs.getInt("remindById"); EnumOptionData remindBy = null; if (remindById != null && remindById != 0) { @@ -86,10 +89,8 @@ public class CalendarReadPlatformServiceImpl implements CalendarReadPlatformServ final Long lastUpdatedByUserId = rs.getLong("updatingUserId"); final String lastUpdatedByUserName = rs.getString("updatingUserName"); - final LocalDate recentEligibleMeetingDate = null; - - return new CalendarData(id, entityId, entityType, title, description, location, startDate, endDate, duration, type, repeating, - recurrence, remindBy, firstReminder, secondReminder, humanReadable, recentEligibleMeetingDate, createdDate, + return CalendarData.instance(id, entityId, entityType, title, description, location, startDate, endDate, duration, type, + repeating, recurrence, frequency, interval, repeatsOnDay, remindBy, firstReminder, secondReminder, humanReadable, createdDate, lastUpdatedDate, createdByUserId, createdByUserName, lastUpdatedByUserId, lastUpdatedByUserName); } } @@ -216,7 +217,7 @@ public class CalendarReadPlatformServiceImpl implements CalendarReadPlatformServ final Collection recurringDates = CalendarUtils.getRecurringDates(rrule, seedDate, startDate, endDate, -1); final Collection nextTenRecurringDates = CalendarUtils.getRecurringDates(rrule, seedDate, endDate); final LocalDate recentEligibleMeetingDate = CalendarUtils.getRecentEligibleMeetingDate(rrule, seedDate); - return new CalendarData(calendarData, recurringDates, nextTenRecurringDates, recentEligibleMeetingDate); + return CalendarData.withRecurringDates(calendarData, recurringDates, nextTenRecurringDates, recentEligibleMeetingDate); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarUtils.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarUtils.java index 685da4f19..0334fdebc 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarUtils.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarUtils.java @@ -32,6 +32,8 @@ import org.mifosplatform.infrastructure.core.service.DateUtils; import org.mifosplatform.organisation.workingdays.domain.WorkingDays; import org.mifosplatform.organisation.workingdays.service.WorkingDaysUtil; import org.mifosplatform.portfolio.calendar.domain.Calendar; +import org.mifosplatform.portfolio.calendar.domain.CalendarFrequencyType; +import org.mifosplatform.portfolio.calendar.domain.CalendarWeekDaysType; import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; public class CalendarUtils { @@ -284,6 +286,20 @@ public class CalendarUtils { final Recur recur = CalendarUtils.getICalRecur(recurringRule); return recur.getInterval(); } + + public static CalendarFrequencyType getFrequency(final String recurringRule){ + final Recur recur = CalendarUtils.getICalRecur(recurringRule); + return CalendarFrequencyType.fromString(recur.getFrequency()); + } + + public static CalendarWeekDaysType getRepeatsOnDay(final String recurringRule){ + final Recur recur = CalendarUtils.getICalRecur(recurringRule); + final WeekDayList weekDays = recur.getDayList(); + if(weekDays.isEmpty()) return CalendarWeekDaysType.INVALID; + //supports only one day + WeekDay weekDay = (WeekDay) weekDays.get(0); + return CalendarWeekDaysType.fromString(weekDay.getDay()); + } public static LocalDate getFirstRepaymentMeetingDate(final Calendar calendar, final LocalDate disbursementDate, final Integer loanRepaymentInterval, final String frequency) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java index fbbee1587..28fb0472b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/calendar/service/CalendarWritePlatformServiceJpaRepositoryImpl.java @@ -5,13 +5,22 @@ */ package org.mifosplatform.portfolio.calendar.service; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Map; +import org.joda.time.LocalDate; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; import org.mifosplatform.infrastructure.configuration.domain.ConfigurationDomainService; import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.ApiParameterError; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder; +import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder; +import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; +import org.mifosplatform.portfolio.calendar.CalendarConstants.CALENDAR_SUPPORTED_PARAMETERS; import org.mifosplatform.portfolio.calendar.domain.Calendar; import org.mifosplatform.portfolio.calendar.domain.CalendarEntityType; import org.mifosplatform.portfolio.calendar.domain.CalendarInstance; @@ -19,6 +28,12 @@ import org.mifosplatform.portfolio.calendar.domain.CalendarInstanceRepository; import org.mifosplatform.portfolio.calendar.domain.CalendarRepository; import org.mifosplatform.portfolio.calendar.exception.CalendarNotFoundException; import org.mifosplatform.portfolio.calendar.serialization.CalendarCommandFromApiJsonDeserializer; +import org.mifosplatform.portfolio.client.domain.Client; +import org.mifosplatform.portfolio.client.domain.ClientRepositoryWrapper; +import org.mifosplatform.portfolio.group.domain.Group; +import org.mifosplatform.portfolio.group.domain.GroupRepository; +import org.mifosplatform.portfolio.loanaccount.domain.Loan; +import org.mifosplatform.portfolio.loanaccount.domain.LoanRepository; import org.mifosplatform.portfolio.loanaccount.service.LoanWritePlatformService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -32,17 +47,24 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr private final CalendarInstanceRepository calendarInstanceRepository; private final LoanWritePlatformService loanWritePlatformService; private final ConfigurationDomainService configurationDomainService; + private final GroupRepository groupRepository; + private final LoanRepository loanRepository; + private final ClientRepositoryWrapper clientRepository; @Autowired public CalendarWritePlatformServiceJpaRepositoryImpl(final CalendarRepository calendarRepository, final CalendarCommandFromApiJsonDeserializer fromApiJsonDeserializer, final CalendarInstanceRepository calendarInstanceRepository, final LoanWritePlatformService loanWritePlatformService, - final ConfigurationDomainService configurationDomainService) { + final ConfigurationDomainService configurationDomainService, final GroupRepository groupRepository, + final LoanRepository loanRepository, final ClientRepositoryWrapper clientRepository) { this.calendarRepository = calendarRepository; this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.calendarInstanceRepository = calendarInstanceRepository; this.loanWritePlatformService = loanWritePlatformService; this.configurationDomainService = configurationDomainService; + this.groupRepository = groupRepository; + this.loanRepository = loanRepository; + this.clientRepository = clientRepository; } @Override @@ -50,7 +72,25 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr this.fromApiJsonDeserializer.validateForCreate(command.json()); + final LocalDate entityActivationDate = getEntityActivationDate(command); + final CalendarEntityType entityType = CalendarEntityType.valueOf(command.getSupportedEntityType().toUpperCase()); + final Calendar newCalendar = Calendar.fromJson(command); + + final List dataValidationErrors = new ArrayList(); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) + .resource("calendar"); + if(entityActivationDate == null || newCalendar.getStartDateLocalDate().isBefore(entityActivationDate)){ + final DateTimeFormatter formatter = DateTimeFormat.forPattern(command.dateFormat()).withLocale(command.extractLocale()); + String dateAsString = ""; + if(entityActivationDate != null) dateAsString = formatter.print(entityActivationDate); + + final String errorMessage = "cannot.be.before." + entityType.name().toLowerCase() + ".activation.date"; + baseDataValidator.reset().parameter(CALENDAR_SUPPORTED_PARAMETERS.START_DATE.getValue()).value(dateAsString) + .failWithCodeNoParameterAddedToErrorCode(errorMessage); + if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); } + } + this.calendarRepository.save(newCalendar); final CalendarInstance newCalendarInstance = CalendarInstance.fromJson(newCalendar, command); @@ -63,6 +103,25 @@ public class CalendarWritePlatformServiceJpaRepositoryImpl implements CalendarWr } + private LocalDate getEntityActivationDate(JsonCommand command) { + final Long entityId = command.getSupportedEntityId(); + final CalendarEntityType entityType = CalendarEntityType.valueOf(command.getSupportedEntityType().toUpperCase()); + LocalDate entityActivationDate = null; + + if(entityType.isCenter() || entityType.isGroup()){ + final Group centerOrGroup = this.groupRepository.findOne(entityId); + entityActivationDate = centerOrGroup.getActivationLocalDate(); + } else if (entityType.isLoan()){ + final Loan loan = this.loanRepository.findOne(entityId); + entityActivationDate = (loan.getApprovedOnDate() == null) ? loan.getSubmittedOnDate() : loan.getApprovedOnDate(); + } else if (entityType.isLoan()){ + final Client client = this.clientRepository.findOneWithNotFoundDetection(entityId); + entityActivationDate = client.getActivationLocalDate(); + } + + return entityActivationDate; + } + @Override public CommandProcessingResult updateCalendar(final JsonCommand command) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java index c718ebfba..81eeb5cf2 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java @@ -2238,7 +2238,7 @@ public class Loan extends AbstractPersistable { return (LocalDate) ObjectUtils.defaultIfNull(new LocalDate(this.submittedOnDate), null); } - private LocalDate getApprovedOnDate() { + public LocalDate getApprovedOnDate() { LocalDate date = null; if (this.approvedOnDate != null) { date = new LocalDate(this.approvedOnDate);