diff --git a/airtime_mvc/application/forms/AddShowWhen.php b/airtime_mvc/application/forms/AddShowWhen.php index 8fb12a98b..5acb866c9 100644 --- a/airtime_mvc/application/forms/AddShowWhen.php +++ b/airtime_mvc/application/forms/AddShowWhen.php @@ -86,6 +86,9 @@ class Application_Form_AddShowWhen extends Zend_Form_SubForm public function checkReliantFields($formData, $validateStartDate, $originalStartDate=null, $update=false, $instanceId=null) { $valid = true; + $hours; + $minutes; + $start_time = $formData['add_show_start_date']." ".$formData['add_show_start_time']; $end_time = $formData['add_show_end_date_no_repeat']." ".$formData['add_show_end_time']; @@ -147,11 +150,113 @@ class Application_Form_AddShowWhen extends Zend_Form_SubForm $show_start->setTimezone(new DateTimeZone('UTC')); $show_end = new DateTime($end_time); $show_end->setTimezone(new DateTimeZone('UTC')); - - $overlapping = Application_Model_Schedule::checkOverlappingShows($show_start, $show_end, $update, $instanceId); - if ($overlapping) { - $this->getElement('add_show_duration')->setErrors(array('Cannot schedule overlapping shows')); - $valid = false; + + if ($formData["add_show_repeats"]) { + + //get repeating show end date + if ($formData["add_show_no_end"]) { + $date = Application_Model_Preference::GetShowsPopulatedUntil(); + + if (is_null($date)) { + $populateUntilDateTime = new DateTime("now", new DateTimeZone('UTC')); + Application_Model_Preference::SetShowsPopulatedUntil($populateUntilDateTime); + } else { + $populateUntilDateTime = clone $date; + } + + } elseif (!$formData["add_show_no_end"]) { + $popUntil = $formData["add_show_end_date"]." ".$formData["add_show_end_time"]; + $populateUntilDateTime = new DateTime($popUntil, new DateTimeZone('UTC')); + } + + //get repeat interval + if ($formData["add_show_repeat_type"] == 0) { + $interval = 'P7D'; + } elseif ($formData["add_show_repeat_type"] == 1) { + $interval = 'P14D'; + } elseif ($formData["add_show_repeat_type"] == 2) { + $interval = 'P1M'; + } + + /* Check first show + * Continue if the first show does not overlap + */ + $overlapping = Application_Model_Schedule::checkOverlappingShows($show_start, $show_end, $update, $instanceId); + + /* Check if repeats overlap with previously scheduled shows + * Do this for each show day + */ + if (!$overlapping) { + $startDow = date("w", $show_start->getTimestamp()); + foreach($formData["add_show_day_check"] as $day) { + $repeatShowStart = clone $show_start; + $repeatShowEnd = clone $show_end; + $daysAdd=0; + if ($startDow !== $day){ + if ($startDow > $day) + $daysAdd = 6 - $startDow + 1 + $day; + else + $daysAdd = $day - $startDow; + + $repeatShowStart->add(new DateInterval("P".$daysAdd."D")); + $repeatShowEnd->add(new DateInterval("P".$daysAdd."D")); + } + while ($repeatShowStart->getTimestamp() < $populateUntilDateTime->getTimestamp()) { + $overlapping = Application_Model_Schedule::checkOverlappingShows($repeatShowStart, $repeatShowEnd, $update, $instanceId); + if ($overlapping) { + $valid = false; + $this->getElement('add_show_duration')->setErrors(array('Cannot schedule overlapping shows')); + break 1; + } else { + $repeatShowStart->add(new DateInterval($interval)); + $repeatShowEnd->add(new DateInterval($interval)); + } + } + } + } else { + $valid = false; + $this->getElement('add_show_duration')->setErrors(array('Cannot schedule overlapping shows')); + } + } elseif ($formData["add_show_rebroadcast"]) { + /* Check first show + * Continue if the first show does not overlap + */ + $overlapping = Application_Model_Schedule::checkOverlappingShows($show_start, $show_end, $update, $instanceId); + + if (!$overlapping) { + for ($i = 1; $i <= 10; $i++) { + $hours = ltrim($hours, '0'); + if ($minutes != "00") { + $minutes = ltrim($minutes, '0'); + $durationToAdd = "PT".$hours."H".$minutes."I"; + } else { + $minutes = "0"; + $durationToAdd = "PT".$hours."H"; + } + + $abs_rebroadcast_start = $formData["add_show_rebroadcast_date_absolute_".$i]." ". + $formData["add_show_rebroadcast_time_absolute_".$i]; + $rebroadcastShowStart = new DateTime($abs_rebroadcast_start); + $rebroadcastShowStart->setTimezone(new DateTimeZone('UTC')); + $rebroadcastShowEnd = clone $rebroadcastShowStart; + $rebroadcastShowEnd->add(new DateInterval($durationToAdd)); + $overlapping = Application_Model_Schedule::checkOverlappingShows($rebroadcastShowStart, $rebroadcastShowEnd, $update, $instanceId); + if ($overlapping) { + $valid = false; + $this->getElement('add_show_duration')->setErrors(array('Cannot schedule overlapping shows')); + break; + } + } + } else { + $valid = false; + $this->getElement('add_show_duration')->setErrors(array('Cannot schedule overlapping shows')); + } + } else { + $overlapping = Application_Model_Schedule::checkOverlappingShows($show_start, $show_end, $update, $instanceId); + if ($overlapping) { + $this->getElement('add_show_duration')->setErrors(array('Cannot schedule overlapping shows')); + $valid = false; + } } }