Documentatie bijgewerkt; Begonnen aan /programma/details

This commit is contained in:
2017-07-09 12:32:57 +02:00
parent f501ab5438
commit b86d4da26b
5 changed files with 258 additions and 37 deletions

View File

@@ -10,7 +10,7 @@ ini_set('display_errors', true);
class ProgramController extends Controller
{
private static $SCHEDULE_SQL = <<<QUERY
SELECT `schedule`.`id`, `programs`.`longname`, `schedule`.`priority`,
SELECT `programs`.`id`, `programs`.`longname` AS `name`, `programs`.`description` AS `description`, `schedule`.`priority`,
`schedule`.`startdate`, `schedule`.`startday`, `schedule`.`starttime`,
`schedule`.`enddate`, `schedule`.`endday`, `schedule`.`endtime`
FROM `programs_schedule` AS `schedule` LEFT JOIN `programs` ON `schedule`.`program` = `programs`.`id`
@@ -31,6 +31,102 @@ QUERY;
//
}
/**
* Details over een specifiek programma, inclusief schema en podcasts
*/
public function details($id) {
$programs = app('db')->select("SELECT `id`, `longname`, `description`, `email` FROM `programs` WHERE `id` = :id", ['id' => (int)$id]);
if(count($programs) != 1) {
return abort(404);
}
$program = $programs[0];
$hosts = app('db')->select("SELECT `programs_users`.`user` AS `id`, `medewerkers`.`adressering` AS `name`, `user_emailaddresses`.`email` AS `email`
FROM `programs_users`
LEFT JOIN `users` ON `programs_users`.`user` = `users`.`id`
LEFT JOIN `medewerkers` ON `users`.`medewerkersid` = `medewerkers`.`id`
LEFT JOIN `user_emailaddresses` ON `user_emailaddresses`.`user` = `users`.`id`
WHERE `programs_users`.`program` = :program
AND `user_emailaddresses`.`preference` = 0
AND `programs_users`.`active` = 1", ['program' => $program->id]);
foreach($hosts as $host) {
$program->hosts[] = new \Model\ProgramHost($host);
}
$schedule = app('db')->select(<<<QUERY
SELECT `schedule`.`startdate`, `schedule`.`startday`, `schedule`.`starttime`, `schedule`.`enddate`, `schedule`.`endday`, `schedule`.`endtime`
FROM `programs_schedule` AS `schedule`
WHERE (schedule.`program` = :program) AND (`schedule`.`active` = 1) AND (`schedule`.`final` = 1) AND
-- ((`schedule`.`startdate` IS NULL) OR (`schedule`.`startdate` < :enddate)) AND
-- ((`schedule`.`enddate` IS NULL) OR (`schedule`.`enddate` >= :startdate)) AND
1=1
ORDER BY `schedule`.`priority` DESC, MOD(`startday` + 6, 7) + 1, `schedule`.`starttime` ASC
QUERY
, ['program' => $program->id] );
$recentSchedule = $this->recent($schedule);
$program->schedule = $recentSchedule;
return response()->json($program);
}
private function recent($schedule) {
$now = new \DateTimeImmutable();
$ONE_DAY = \DateInterval::createFromDateString('1 day');
$ONE_WEEK = \DateInterval::createFromDateString('1 week');
$recent = [];
$next = [];
// Vind voor elke regel in de uitzendmomenten de eerstvolgende en twee meest recente.
$isCurrent = false;
foreach($schedule as $broadcast) {
$startTijd = new \DateTimeImmutable($broadcast->starttime);
$endDate = ($broadcast->enddate == null) ? $now : new \DateTimeImmutable($broadcast->enddate);
$endDate = $endDate->setTime($startTijd->format('H'), $startTijd->format('i'), $startTijd->format('s'));
$endDateWeekday = $endDate->format('N');
// Zoek de laatste uitzending voor de einddatum (of voor het huidige tijdstip), op de juiste weekdag
while($endDateWeekday != $broadcast->startday) {
$endDate = $endDate->sub($ONE_DAY);
if(--$endDateWeekday < 0) { $endDateWeekday += 7; }
}
$eindTijd = new \DateTimeImmutable($broadcast->endtime);
$endOfBroadcast = $endDate->setTime($eindTijd->format('H'), $eindTijd->format('i'), $eindTijd->format('s'));
if($endOfBroadcast < $endDate) { $endOfBroadcast = $endOfBroadcast->add($ONE_DAY); }
if($isInProgress = (($endDate <= $now) && ($endOfBroadcast > $now))) {
$isCurrent = true;
}
// Als de uitzending niet al afgelopen is, telt hij als volgende.
// Dit gebeurt als de uitzending later vandaag is of nu loopt.
if($endOfBroadcast >= $now) {
$next[] = $endDate;
$endDate = $endDate->sub($ONE_WEEK);
$endOfBroadcast = $endOfBroadcast->sub($ONE_WEEK);
}
if(($broadcast->startdate == null) || ($broadcast->startdate <= $endDate)) {
$recent[] = $endDate;
}
$previous = $endDate->sub($ONE_WEEK);
if(($broadcast->startdate == null) || ($broadcast->startdate <= $previous)) {
$recent[] = $previous;
}
$following = $endDate->add($ONE_WEEK);
if(($broadcast->enddate == null) || ($broadcast->enddate >= $following)) {
$next[] = $following;
}
}
sort($next);
rsort($recent);
return ['recent' => array_splice($recent, 0, 2), 'next' => array_splice($next, 0, 1), 'iscurrent' => $isCurrent];
}
/**
* Programmas nu en straks (24 uur vooruit)
*/
@@ -46,7 +142,8 @@ QUERY;
* Programmaschema per week
*/
public function schedule(Request $request, $weeksAhead = null) {
if($weeksAhead <= 0) { $weeksAhead = 1; }
if($weeksAhead === null) { $weeksAhead = 1; }
else if($weeksAhead <= 0) { return abort(400); }
$start = new \DateTimeImmutable('Monday this week');
$einde = $start->add(\DateInterval::createFromDateString((int)$weeksAhead . ' weeks'));
@@ -67,12 +164,15 @@ QUERY;
$programmas = app('db')->select(self::$SCHEDULE_SQL,
['enddate' => $einde->format('Y-m-d'), 'startdate' => $start->format('Y-m-d')]);
['enddate' => $einde->format('Y-m-d'), 'startdate' => $start->format('Y-m-d')]);
$programmaInfo = [];
// Maak een lijstje van alle start en eindtijden en welk programma dan begint/eindigt
$startEinde = [];
$startMaandag = $start->modify('Monday this week');
foreach($programmas as $programma) {
$programmaInfo[$programma->id] = new \Model\Program($programma);
$programmaStart = $startMaandag->add(\DateInterval::createFromDateString(($programma->startday - 1) % 7 . ' days'));
$programmaEinde = $startMaandag->add(\DateInterval::createFromDateString(($programma->endday - 1) % 7 . ' days'));
@@ -120,24 +220,24 @@ QUERY;
if($programmaWissel[PW_TYPE] == PROGRAMMA_START) {
if($actieveProgrammas[$programma->priority] != null) {
$fouten[] = [$tijdstip, "Begin van {$programma->longname} maar {$actieveProgrammas[$programma->priority]->longname} is nog actief."];
$fouten[] = [$tijdstip, "Begin van {$programma->name} maar {$actieveProgrammas[$programma->priority]->name} is nog actief."];
}
$actieveProgrammas[$programma->priority] = $programma;
for($prio = $programma->priority; $prio >= 0; --$prio) {
if($actieveProgrammas[$prio] != null) {
if(($index == -1) || ($schema[$index]['tijdstip'] != $tijdstip)) { $index++; }
$schema[$index] = ['tijdstip' => $tijdstip, 'programma' => $actieveProgrammas[$prio]];
if(($index == -1) || ($schema[$index]['time'] != $tijdstip)) { $index++; }
$schema[$index] = ['time' => $tijdstip, 'program' => $programmaInfo[$actieveProgrammas[$prio]->id]];
break;
}
}
} else /*if($programmaWissel[PW_TYPE] == PROGRAMMA_EINDE)*/ {
$actieveProgrammas[$programma->priority] = null;
if(($index == -1) || ($schema[$index]['programma'] != null)) { $index++; }
$schema[$index] = ['tijdstip' => $tijdstip, 'programma' => null];
if(($index == -1) || ($schema[$index]['program'] != null)) { $index++; }
$schema[$index] = ['time' => $tijdstip, 'program' => null];
for($prio = $programma->priority; $prio < count($actieveProgrammas); ++$prio) {
if($actieveProgrammas[$prio] != null) {
$schema[$index] = ['tijdstip' => $tijdstip, 'programma' => $actieveProgrammas[$prio]];
$schema[$index] = ['time' => $tijdstip, 'program' => $programmaInfo[$actieveProgrammas[$prio]->id]];
break;
}
}
@@ -146,12 +246,12 @@ QUERY;
if(false) {
for($i = 1; $i <= count($schema); $i++) {
$eindTijd = ($i == count($schema)) ? $einde : $schema[$i]['tijdstip'];
$programma = $schema[$i-1]['programma'];
print $schema[$i-1]['tijdstip']->format('D d-m-Y, H:i:s') . " - " . $eindTijd->format('D d-m-Y, H:i:s') . ": " . ($programma != null ? $programma->longname : "NULL") . "\n";
$eindTijd = ($i == count($schema)) ? $einde : $schema[$i]['time'];
$programma = $schema[$i-1]['program'];
print $schema[$i-1]['time']->format('D d-m-Y, H:i:s') . " - " . $eindTijd->format('D d-m-Y, H:i:s') . ": " . ($programma != null ? $programma->name : "NULL") . "\n";
}
}
return ['startdate' => $start, 'enddate' => $einde, 'schema' => $schema, 'fouten' => $fouten];
return ['startdate' => $start, 'enddate' => $einde, 'schedule' => $schema, 'errors' => $fouten];
}
}