CC-4961: Show linking
Added back-end functionality for creating monthly repeating shows on the same day of the week
This commit is contained in:
parent
6766d208aa
commit
187e49e4b2
1 changed files with 150 additions and 14 deletions
|
@ -97,16 +97,19 @@ class Application_Service_ShowService
|
||||||
$this->createNonRepeatingInstance($day, $populateUntil, $isRebroadcast, $isUpdate);
|
$this->createNonRepeatingInstance($day, $populateUntil, $isRebroadcast, $isUpdate);
|
||||||
break;
|
break;
|
||||||
case REPEAT_WEEKLY:
|
case REPEAT_WEEKLY:
|
||||||
$this->createRepeatingInstances($day, $populateUntil, "P7D", $isRebroadcast, $isUpdate);
|
$this->createRepeatingInstances($day, $populateUntil, REPEAT_WEEKLY,
|
||||||
|
new DateInterval("P7D"), $isRebroadcast, $isUpdate);
|
||||||
break;
|
break;
|
||||||
case REPEAT_BI_WEEKLY:
|
case REPEAT_BI_WEEKLY:
|
||||||
$this->createRepeatingInstances($day, $populateUntil, "P14D", $isRebroadcast, $isUpdate);
|
$this->createRepeatingInstances($day, $populateUntil, REPEAT_BI_WEEKLY,
|
||||||
|
new DateInterval("P14D"), $isRebroadcast, $isUpdate);
|
||||||
break;
|
break;
|
||||||
case REPEAT_MONTHLY_MONTHLY:
|
case REPEAT_MONTHLY_MONTHLY:
|
||||||
$this->createRepeatingInstances($day, $populateUntil, "P1M", $isRebroadcast, $isUpdate);
|
$this->createMonthlyMonthlyRepeatInstances($day, $populateUntil, $isRebroadcast, $isUpdate);
|
||||||
break;
|
break;
|
||||||
case REPEAT_MONTHLY_WEEKLY:
|
case REPEAT_MONTHLY_WEEKLY:
|
||||||
// do something here
|
$this->createRepeatingInstances($day, $populateUntil, REPEAT_MONTHLY_WEEKLY,
|
||||||
|
null, $isRebroadcast, $isUpdate);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -551,7 +554,7 @@ SQL;
|
||||||
* @param unknown_type $isRebroadcast
|
* @param unknown_type $isRebroadcast
|
||||||
*/
|
*/
|
||||||
private function createRepeatingInstances($showDay, $populateUntil,
|
private function createRepeatingInstances($showDay, $populateUntil,
|
||||||
$repeatInterval, $isRebroadcast, $isUpdate)
|
$repeatType, $repeatInterval, $isRebroadcast, $isUpdate)
|
||||||
{
|
{
|
||||||
$show_id = $showDay->getDbShowId();
|
$show_id = $showDay->getDbShowId();
|
||||||
$first_show = $showDay->getDbFirstShow(); //non-UTC
|
$first_show = $showDay->getDbFirstShow(); //non-UTC
|
||||||
|
@ -561,9 +564,13 @@ SQL;
|
||||||
$record = $showDay->getDbRecord();
|
$record = $showDay->getDbRecord();
|
||||||
$timezone = $showDay->getDbTimezone();
|
$timezone = $showDay->getDbTimezone();
|
||||||
|
|
||||||
//string
|
//DateTime local
|
||||||
$start = $this->getNextRepeatingPopulateStartDateTime($showDay);
|
$start = $this->getNextRepeatingPopulateStartDateTime($showDay);
|
||||||
|
|
||||||
|
if (is_null($repeatInterval)&& $repeatType == REPEAT_MONTHLY_WEEKLY) {
|
||||||
|
$repeatInterval = $this->getMonthlyWeeklyRepeatInterval($start, $timezone);
|
||||||
|
}
|
||||||
|
|
||||||
//DatePeriod in user's local time
|
//DatePeriod in user's local time
|
||||||
$datePeriod = $this->getDatePeriod($start, $timezone, $last_show,
|
$datePeriod = $this->getDatePeriod($start, $timezone, $last_show,
|
||||||
$repeatInterval, $populateUntil);
|
$repeatInterval, $populateUntil);
|
||||||
|
@ -618,14 +625,144 @@ SQL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$nextDate = $utcEndDateTime->add(new DateInterval($repeatInterval));
|
$nextDate = $utcEndDateTime->add($repeatInterval);
|
||||||
$this->setNextRepeatingShowDate($nextDate->format("Y-m-d"), $day);
|
$this->setNextRepeatingShowDate($nextDate->format("Y-m-d"), $day);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createMonthlyRepeatingInstances($showDay, $populateUntil,
|
private function createMonthlyMonthlyRepeatInstances($showDay, $populateUntil,
|
||||||
$repeatInterval, $isRebroadcast, $isUpdate)
|
$isRebroadcast, $isUpdate)
|
||||||
{
|
{
|
||||||
|
$show_id = $showDay->getDbShowId();
|
||||||
|
$first_show = $showDay->getDbFirstShow(); //non-UTC
|
||||||
|
$last_show = $showDay->getDbLastShow(); //non-UTC
|
||||||
|
$duration = $showDay->getDbDuration();
|
||||||
|
$day = $showDay->getDbDay();
|
||||||
|
$record = $showDay->getDbRecord();
|
||||||
|
$timezone = $showDay->getDbTimezone();
|
||||||
|
|
||||||
|
//DateTime local
|
||||||
|
$start = $this->getNextRepeatingPopulateStartDateTime($showDay);
|
||||||
|
if (isset($last_how)) {
|
||||||
|
$end = new DateTime($last_show, new DateTimeZone($timezone));
|
||||||
|
} else {
|
||||||
|
$end = $populateUntil;
|
||||||
|
}
|
||||||
|
|
||||||
|
$utcLastShowDateTime = $last_show ?
|
||||||
|
Application_Common_DateHelper::ConvertToUtcDateTime($last_show, $timezone) : null;
|
||||||
|
|
||||||
|
while ($start->getTimestamp() < $end->getTimestamp()) {
|
||||||
|
list($utcStartDateTime, $utcEndDateTime) = $this->createUTCStartEndDateTime(
|
||||||
|
$start, $duration);
|
||||||
|
/*
|
||||||
|
* Make sure start date is less than populate until date AND
|
||||||
|
* last show date is null OR start date is less than last show date
|
||||||
|
*/
|
||||||
|
if ($utcStartDateTime->getTimestamp() <= $populateUntil->getTimestamp() &&
|
||||||
|
( is_null($utcLastShowDateTime) ||
|
||||||
|
$utcStartDateTime->getTimestamp() < $utcLastShowDateTime->getTimestamp()) ) {
|
||||||
|
|
||||||
|
/* There may not always be an instance when editing a show
|
||||||
|
* This will be the case when we are adding a new show day to
|
||||||
|
* a repeating show
|
||||||
|
*/
|
||||||
|
if ($isUpdate && $this->hasInstance($utcStartDateTime)) {
|
||||||
|
$ccShowInstance = $this->getInstance($utcStartDateTime);
|
||||||
|
$newInstance = false;
|
||||||
|
$updateScheduleStatus = true;
|
||||||
|
} else {
|
||||||
|
$newInstance = true;
|
||||||
|
$ccShowInstance = new CcShowInstances();
|
||||||
|
$updateScheduleStatus = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* When editing the start/end time of a repeating show, we don't want to
|
||||||
|
* change shows that started in the past. So check the start time.
|
||||||
|
*/
|
||||||
|
if ($newInstance || $ccShowInstance->getDbStarts() > gmdate("Y-m-d H:i:s")) {
|
||||||
|
$ccShowInstance->setDbShowId($show_id);
|
||||||
|
$ccShowInstance->setDbStarts($utcStartDateTime);
|
||||||
|
$ccShowInstance->setDbEnds($utcEndDateTime);
|
||||||
|
$ccShowInstance->setDbRecord($record);
|
||||||
|
$ccShowInstance->save();
|
||||||
|
|
||||||
|
if ($updateScheduleStatus) {
|
||||||
|
$con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME);
|
||||||
|
$ccShowInstance->updateScheduleStatus($con);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($isRebroadcast) {
|
||||||
|
$this->createRebroadcastInstances($showDay, $date, $ccShowInstance->getDbId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$start = $this->getNextMonthlyMonthlyRepeatDate($start, $timezone);
|
||||||
|
}
|
||||||
|
$this->setNextRepeatingShowDate($start->format("Y-m-d"), $day);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* i.e. last thursday of each month
|
||||||
|
* i.e. second monday of each month
|
||||||
|
*
|
||||||
|
* @param string $showStart
|
||||||
|
* @param string $timezone user's local timezone
|
||||||
|
*/
|
||||||
|
private function getMonthlyWeeklyRepeatInterval($showStart, $timezone)
|
||||||
|
{
|
||||||
|
$start = new DateTime($showStart, new DateTimeZone($timezone));
|
||||||
|
|
||||||
|
$dayOfMonth = $start->format("j");
|
||||||
|
$dayOfWeek = $start->format("l");
|
||||||
|
$yearAndMonth = $start->format("Y-m");
|
||||||
|
$firstDayOfWeek = strtotime($dayOfWeek." ".$yearAndMonth);
|
||||||
|
// if $dayOfWeek is Friday, what number of the month does
|
||||||
|
// the first Friday fall on
|
||||||
|
$numberOfFirstDayOfWeek = date("j", $firstDayOfWeek);
|
||||||
|
|
||||||
|
$weekCount = 0;
|
||||||
|
while ($dayOfMonth >= $numberOfFirstDayOfWeek) {
|
||||||
|
$weekCount++;
|
||||||
|
$dayOfMonth -= 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($weekCount) {
|
||||||
|
case 1:
|
||||||
|
$weekNumberOfMonth = "first";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
$weekNumberOfMonth = "second";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
$weekNumberOfMonth = "third";
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
$weekNumberOfMonth = "fourth";
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
$weekNumberOfMonth = "last";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DateInterval::createFromDateString(
|
||||||
|
$weekNumberOfMonth." ".$dayOfWeek." of next month");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Enter description here ...
|
||||||
|
* @param $start
|
||||||
|
*/
|
||||||
|
private function getNextMonthlyMonthlyRepeatDate($start, $timezone)
|
||||||
|
{
|
||||||
|
$dt = new DateTime($start->format("Y-m"), new DateTimeZone($timezone));
|
||||||
|
do {
|
||||||
|
$dt->add(new DateInterval("P1M"));
|
||||||
|
} while (!checkdate($dt->format("m"), $start->format("d"), $dt->format("Y")));
|
||||||
|
|
||||||
|
$dt->setDate($dt->format("Y"), $dt->format("m"), $start->format("d"));
|
||||||
|
return $dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getNextRepeatingPopulateStartDateTime($showDay)
|
private function getNextRepeatingPopulateStartDateTime($showDay)
|
||||||
|
@ -634,9 +771,9 @@ SQL;
|
||||||
$startTime = $showDay->getDbStartTime();
|
$startTime = $showDay->getDbStartTime();
|
||||||
|
|
||||||
if (isset($nextPopDate)) {
|
if (isset($nextPopDate)) {
|
||||||
return $nextPopDate." ".$startTime;
|
return new DateTime($nextPopDate." ".$startTime, new DateTimeZone($showDay->getDbTimezone()));
|
||||||
} else {
|
} else {
|
||||||
return $showDay->getDbFirstShow()." ".$startTime;
|
return new DateTime($showDay->getDbFirstShow()." ".$startTime, new DateTimeZone($showDay->getDbTimezone()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -653,8 +790,7 @@ SQL;
|
||||||
$endDatePeriod = $populateUntil;
|
$endDatePeriod = $populateUntil;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new DatePeriod(new DateTime($start, new DateTimeZone($timezone)),
|
return new DatePeriod($start, $repeatInterval, $endDatePeriod);
|
||||||
new DateInterval($repeatInterval), $endDatePeriod);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function hasInstance($starts)
|
private function hasInstance($starts)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue