/** * */ package notifications.data.domain.helper; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /** * Frequency of Subscription Notifications * * @author luismr * */ public enum Frequency { IMMEDIATE, DAILY, WEEKLY, MONTHLY; public Date calculateNextDelivery() { return calculateNextDelivery(this); } /** * Calculate next delivery * * IMMEDIATE: in 5 minutes * DAILY: next 08:00 am * WEEKLY: next monday 07:00 * MONTHLY: next month 1st 06:00 * * @param frequency * @return */ protected Date calculateNextDelivery(final Frequency frequency) { GregorianCalendar calendar = new GregorianCalendar(); calendar.setTime(new Date()); if (DAILY.equals(frequency)) { if (calendar.get(Calendar.HOUR_OF_DAY) > 8 && calendar.get(Calendar.MINUTE) >= 0) { calendar.add(Calendar.DAY_OF_MONTH, 1); } calendar.set(Calendar.HOUR_OF_DAY, 8); calendar.set(Calendar.MINUTE, 00); } else if (WEEKLY.equals(frequency)) { if ((calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) || (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY && calendar.get(Calendar.HOUR_OF_DAY) >= 7 ) && calendar.get(Calendar.MINUTE) >= 0) { calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); calendar.add(Calendar.WEEK_OF_YEAR, 1); } calendar.set(Calendar.HOUR_OF_DAY, 7); calendar.set(Calendar.MINUTE, 00); } else if (MONTHLY.equals(frequency)) { if ((calendar.get(Calendar.DAY_OF_MONTH) > 1) || (calendar.get(Calendar.DAY_OF_MONTH) == 1 && calendar.get(Calendar.HOUR_OF_DAY) >= 6) && calendar.get(Calendar.MINUTE) >= 0) { calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DAY_OF_MONTH, 1); } calendar.set(Calendar.HOUR_OF_DAY, 6); calendar.set(Calendar.MINUTE, 00); } else { calendar.add(Calendar.MINUTE, 5); } calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } }