diff --git a/airtime_mvc/application/forms/AddShowWhen.php b/airtime_mvc/application/forms/AddShowWhen.php index 9644535b9..02fd5271b 100644 --- a/airtime_mvc/application/forms/AddShowWhen.php +++ b/airtime_mvc/application/forms/AddShowWhen.php @@ -209,8 +209,12 @@ class Application_Form_AddShowWhen extends Zend_Form_SubForm $interval = 'P21D'; } elseif ($formData["add_show_repeat_type"] == 5) { $interval = 'P28D'; - } elseif ($formData["add_show_repeat_type"] == 2) { + } elseif ($formData["add_show_repeat_type"] == 2 && $formData["add_show_monthly_repeat_type"] == 2) { $interval = 'P1M'; + } elseif ($formData["add_show_repeat_type"] == 2 && $formData["add_show_monthly_repeat_type"] == 3) { + list($weekNumberOfMonth, $dayOfWeek) = + Application_Service_ShowService::getMonthlyWeeklyRepeatInterval( + new DateTime($start_time, $showTimezone)); } /* Check first show @@ -287,12 +291,26 @@ class Application_Form_AddShowWhen extends Zend_Form_SubForm $this->getElement('add_show_duration')->setErrors(array(_('Cannot schedule overlapping shows'))); break 1; } else { - $repeatShowStart->setTimezone($showTimezone); - $repeatShowEnd->setTimezone($showTimezone); - $repeatShowStart->add(new DateInterval($interval)); - $repeatShowEnd->add(new DateInterval($interval)); - $repeatShowStart->setTimezone($utc); - $repeatShowEnd->setTimezone($utc); + if ($formData["add_show_repeat_type"] == 2 && $formData["add_show_monthly_repeat_type"] == 3) { + $monthlyWeeklyStart = new DateTime($repeatShowStart->format("Y-m"), + new DateTimeZone("UTC")); + $monthlyWeeklyStart->add(new DateInterval("P1M")); + $repeatShowStart = clone Application_Service_ShowService::getNextMonthlyWeeklyRepeatDate( + $monthlyWeeklyStart, + $formData["add_show_timezone"], + $formData['add_show_start_time'], + $weekNumberOfMonth, + $dayOfWeek); + $repeatShowEnd = clone $repeatShowStart; + $repeatShowEnd->add(new DateInterval("PT".$hours."H".$minutes."M")); + } else { + $repeatShowStart->setTimezone($showTimezone); + $repeatShowEnd->setTimezone($showTimezone); + $repeatShowStart->add(new DateInterval($interval)); + $repeatShowEnd->add(new DateInterval($interval)); + $repeatShowStart->setTimezone($utc); + $repeatShowEnd->setTimezone($utc); + } } } } diff --git a/airtime_mvc/application/services/ShowService.php b/airtime_mvc/application/services/ShowService.php index 5a2f22e63..0ffff6c77 100644 --- a/airtime_mvc/application/services/ShowService.php +++ b/airtime_mvc/application/services/ShowService.php @@ -1109,7 +1109,7 @@ SQL; $start = $this->getNextRepeatingPopulateStartDateTime($showDay); if (is_null($repeatInterval)&& $repeatType == REPEAT_MONTHLY_WEEKLY) { - $repeatInterval = $this->getMonthlyWeeklyRepeatInterval($start, $timezone); + $repeatInterval = self::getMonthlyWeeklyRepeatInterval($start, $timezone); } //DatePeriod in user's local time @@ -1212,7 +1212,7 @@ SQL; // We will only need this if the repeat type is MONTHLY_WEEKLY list($weekNumberOfMonth, $dayOfWeek) = - $this->getMonthlyWeeklyRepeatInterval( + self::getMonthlyWeeklyRepeatInterval( new DateTime($first_show, new DateTimeZone($timezone))); $this->repeatType = $showDay->getDbRepeatType(); @@ -1272,7 +1272,7 @@ SQL; $monthlyWeeklyStart = new DateTime($utcStartDateTime->format("Y-m"), new DateTimeZone("UTC")); $monthlyWeeklyStart->add(new DateInterval("P1M")); - $start = $this->getNextMonthlyWeeklyRepeatDate( + $start = self::getNextMonthlyWeeklyRepeatDate( $monthlyWeeklyStart, $timezone, $showDay->getDbStartTime(), @@ -1294,7 +1294,7 @@ SQL; * @param string $showStart * @param string $timezone user's local timezone */ - private function getMonthlyWeeklyRepeatInterval($showStart) + public static function getMonthlyWeeklyRepeatInterval($showStart) { $start = clone $showStart; $dayOfMonth = $start->format("j"); @@ -1369,7 +1369,7 @@ SQL; * @param string (i.e. 'first', 'second') $weekNumberOfMonth * @param string (i.e. 'Monday') $dayOfWeek */ - private function getNextMonthlyWeeklyRepeatDate( + public static function getNextMonthlyWeeklyRepeatDate( $start, $timezone, $startTime,