{ * "days": ["Monday", "Tuesday", ...], * "openingtime": "8:00", * "closingtime": "20:00" * } */ public static function forLocation(int $locationId): ?array { 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; } }