From 7c41a60f884df7ac556ee250c3381bd93cd3c34a Mon Sep 17 00:00:00 2001 From: Mischa Spelt Date: Mon, 7 May 2018 19:55:08 +0200 Subject: [PATCH] Bugjes uit programmaschema --- .../Http/Controllers/ProgramController.php | 123 ++++++++---------- 1 file changed, 56 insertions(+), 67 deletions(-) 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 "

Schedule changes - initial state