blob: 18e2506341eba3a37901e2d879a6b791d9c6efd1 (
plain) (
tree)
|
|
<?php
class OpeningTimes
{
/**
* Get opening times for given location.
* Format is the decoded JSON from DB column, i.e. currently a list of entries:
* <pre>{
* "days": ["Monday", "Tuesday", ...],
* "openingtime": "8:00",
* "closingtime": "20:00"
* }</pre>
* @return array|null
*/
public static function forLocation(int $locationId)
{
static $openingTimesList = false;
if ($openingTimesList === false) {
$openingTimesList = Database::queryKeyValueList("SELECT locationid, openingtime FROM location
WHERE openingtime IS NOT NULL");
}
$chain = Location::getLocationRootChain($locationId);
foreach ($chain as $lid) {
if (isset($openingTimesList[$lid])) {
if (is_string($openingTimesList[$lid])) {
$openingTimesList[$lid] = json_decode($openingTimesList[$lid], true);
}
return $openingTimesList[$lid];
}
}
return null;
}
/**
* Check whether given location is open according to openingtimes.
* @param int $locationId location
* @param int $openOffsetMin offset to apply to opening times when checking. this is subtracted from opening time
* @param int $closeOffsetMin offset to apply to closing times when checking. this is added to closing time
*/
public static function isRoomOpen(int $locationId, int $openOffsetMin = 0, int $closeOffsetMin = 0): bool
{
$openingTimes = self::forLocation($locationId);
if ($openingTimes === null)
return true; // No opening times should mean room is always open
$now = time();
$today = date('l', $now);
foreach ($openingTimes as $row) {
foreach ($row['days'] as $day) {
if ($day !== $today)
continue; // Not today!
if (strtotime("today {$row['openingtime']} -$openOffsetMin minutes") > $now)
continue;
if (strtotime("today {$row['closingtime']} +$closeOffsetMin minutes") < $now)
continue;
// Bingo!
return true;
}
}
return false;
}
}
|