diff --git a/api/app/Http/Controllers/ProgramController.php b/api/app/Http/Controllers/ProgramController.php index bd667f0..5b1b440 100644 --- a/api/app/Http/Controllers/ProgramController.php +++ b/api/app/Http/Controllers/ProgramController.php @@ -53,7 +53,9 @@ QUERY; $startDay = $start->format('N'); $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"; + $START = 1; $END = -1; $WEEK = new \DateInterval('P7D'); $DAY = new \DateInterval('P1D'); $WEEKDAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" /* == 0 and 7 */]; @@ -64,9 +66,11 @@ QUERY; foreach($scheduleItems as $item) { if($item->startdate) { $item->startdate = new \DateTimeImmutable($item->startdate); } 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); + if($itemEnd <= $itemStart) { $itemEnd->add($WEEK); } @@ -77,9 +81,18 @@ QUERY; $itemEnd->add($WEEK); } - // 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] ); + 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; @@ -88,7 +101,7 @@ QUERY; if($DEBUG) { print "

Schedule changes - initial state


"; }