diff --git a/api/app/Http/Controllers/ProgramController.php b/api/app/Http/Controllers/ProgramController.php
index 0f47043..6ab7f21 100644
--- a/api/app/Http/Controllers/ProgramController.php
+++ b/api/app/Http/Controllers/ProgramController.php
@@ -54,7 +54,7 @@ QUERY;
$endDay = $end->format('N');
$schedule = [];
-if($DEBUG) print "Creating schedule between {$start->format('Y-m-d H:i')} and {$end->format('Y-m-d H:i')}
\n";
+ if($DEBUG) print "Creating schedule between {$start->format('Y-m-d H:i')} and {$end->format('Y-m-d H:i')}
\n";
$START = 1; $END = -1;
$WEEK = new \DateInterval('P7D'); $DAY = new \DateInterval('P1D');
@@ -68,38 +68,46 @@ if($DEBUG) print "Creating schedule between {$start->format('Y-m-d H:i')} and {$
if($item->enddate) { $item->enddate = (new \DateTimeImmutable($item->enddate))->add($DAY); }
// Find the start time and end time of the last occurrence on or before the start time
- $itemStart = new \DateTime("last " . $WEEKDAYS[$item->startday] . " " . $start->format('Y-m-d') . " " . $item->starttime);
- $itemEnd = new \DateTime("last " . $WEEKDAYS[$item->endday] . " " . $start->format('Y-m-d') . " " . $item->endtime);
+ $itemStart = new \DateTimeImmutable("last " . $WEEKDAYS[$item->startday] . " " . $start->format('Y-m-d') . " " . $item->starttime);
+ $itemEnd = new \DateTimeImmutable("last " . $WEEKDAYS[$item->endday] . " " . $start->format('Y-m-d') . " " . $item->endtime);
if($itemEnd <= $itemStart) {
- $itemEnd->add($WEEK);
+ $itemEnd = $itemEnd->add($WEEK);
}
// If the first occurrence is completely before the period of interest, look at the next week
while($itemEnd < $start) {
- $itemStart->add($WEEK);
- $itemEnd->add($WEEK);
+ $itemStart = $itemStart->add($WEEK);
+ $itemEnd = $itemEnd->add($WEEK);
}
- if($DEBUG) {
- print "Adding {$item->name} (#$item->scheduleid) at {$itemStart->format('Y-m-d H:i')} to {$itemEnd->format('Y-m-d H:i')}.
\n";
- if($item->startdate) print " (Item start is {$item->startdate->format('Y-m-d H:i')})
\n";
- }
-
- if((!$item->startdate || $item->startdate <= $itemEnd) && (!$item->enddate || $item->enddate >= $itemStart)) {
- // Create a list in which all start and end times are separate entries
- $scheduleChanges->insert( [$START, $itemStart, $item], [-$itemStart->getTimestamp(), -$START] );
- $scheduleChanges->insert( [$END, $itemEnd, $item], [-$itemEnd->getTimestamp(), -$END] );
- } else if($DEBUG) {
- print "Skipping {$item->name} (#$item->scheduleid) at {$itemStart->format('Y-m-d H:i')} because it is out of range.
\n";
- }
-
- // Also keep track of all priorities seen
- $active[$item->priority] = null;
+ while($itemEnd <= $end) {
+ if($DEBUG) {
+ print "Considering {$item->name} {$item->suffix} (#$item->scheduleid) at {$itemStart->format('Y-m-d H:i')} to {$itemEnd->format('Y-m-d H:i')}.
\n";
+ if($item->startdate) print "-- (Item start is {$item->startdate->format('Y-m-d H:i')}, end is ". ($item->enddate ? $item->enddate->format('Y-m-d H:i') : "never") . ")
\n";
+ }
+
+ if($item->startdate && $itemStart <= $item->startdate) {
+ if($DEBUG) print "-- Skipping {$item->name} {$item->suffix} (#$item->scheduleid) at {$itemStart->format('Y-m-d H:i')} because it is before the schedule instance start.
\n";
+ } else if($item->enddate && $itemStart >= $item->enddate) {
+ if($DEBUG) print "-- Skipping {$item->name} {$item->suffix} (#$item->scheduleid) at {$itemStart->format('Y-m-d H:i')} because it is after the schedule instance end.
\n";
+ } else {
+ // if($DEBUG) print "-- Adding {$item->name} {$item->suffix} (#$item->scheduleid) at {$itemStart->format('Y-m-d H:i')}
\n";
+ // Create a list in which all start and end times are separate entries
+ $scheduleChanges->insert( [$START, $itemStart, $item], [-$itemStart->getTimestamp(), -$START] );
+ $scheduleChanges->insert( [$END, $itemEnd, $item], [-$itemEnd->getTimestamp(), -$END] );
+ }
+
+ // Also keep track of all priorities seen
+ $active[$item->priority] = null;
+
+ $itemStart = $itemStart->add($WEEK);
+ $itemEnd = $itemEnd->add($WEEK);
+ }
}
if($DEBUG) {
- print "
"; var_dump($active); print ""; + } - $priority = $item[2]->priority; - if($item[0] == $START) { - if($active[$priority] != null) { - print( "Error:" . $item[2]->name . ' starts at ' . $item[1]->format('d-m-Y H:i') . ' but ' . $active[$priority]->name . ' is still active then.' ); - print "
"; var_dump($active); print ""; - } - - // When a program starts, it becomes the active program in its layer - $active[$priority] = $item[2]; - - // In addition, if it has higher priority than the currently active program, it replaces that. - if($activeProgram == null || $priority < $activeProgram->priority) { - if(($activeProgram != null) && ($item[1] > $start)) { - if($DEBUG) print "{$activeProgramStart->format('d-m-Y H:i')} -- {$item[1]->format('d-m-Y H:i')}: {$activeProgram->name} (reason: {$item[2]->name} starts).
"; var_dump($active); print ""; @@ -157,7 +157,7 @@ if($DEBUG) print "Creating schedule between {$start->format('Y-m-d H:i')} and {$ // In addition, when the ending program was the active program, we need to schedule it and find the new currently active program if($activeProgram == $item[2]) { - if($DEBUG) print "{$activeProgramStart->format('d-m-Y H:i')} -- {$item[1]->format('d-m-Y H:i')}: {$activeProgram->name} (reason: {$item[2]->name} ends).
' . json_encode($this->createSchedule($start, $end, true)) . ''; + $this->createSchedule($start, $end, true); + return ""; }