api/
ved/
admin/
modules/
gyar/
admin/
cron/
api/ved/monthBookingData.php1 lines
<?php
# monthBookingData.php
# API endpoint
# Hämtar bokningsdata för en specifik månad.
# För varje dag på månaden får man veta om det är öppet och max hur många som kan bokas in den dagen.
require_once "ved/modules/utility.php";
$functionGET = function () {
require_once "ved/modules/vedDatabase.php";
# Parametrar kontrolleras.
if (!is_numeric($_GET["year"]) || $_GET["year"] < 2020 || $_GET["year"] > 9999)
throw new APIError(400, "Invalid parameter: year");
if (!is_numeric($_GET["month"]) || $_GET["month"] < 1 || $_GET["month"] > 12)
throw new APIError(400, "Invalid parameter: month");
# Hämtar öppettiderna från databasen.
# monthDays är en skapad vy som innehåller en kolumn "day" och 31 rader med numret 1-31.
# Finns för att simulera en for loop fast i databasen.
# Satsen är så stor eftersom den omvandlar öppet- och stängtider till minuter, samtidigt som den kollar för undantag i tidsschemat.
$firstDayParam = array("date" => "{$_GET['year']}-{$_GET['month']}-01");
$openingHours = $db->queryAll(
"SELECT
ADDDATE(:date, m.day-1) date,
(CASE WHEN e.exceptionId IS NULL THEN !(ISNULL(w.openingTime) OR ISNULL(w.closingTime)) ELSE !(ISNULL(e.openingTime) OR ISNULL(e.closingTime)) END) isOpen,
ROUND(TIME_TO_SEC((CASE WHEN e.exceptionId IS NULL THEN w.openingTime ELSE e.openingTime END))/60) openingTimeMinutes,
ROUND(TIME_TO_SEC(TIMEDIFF((CASE WHEN e.exceptionId IS NULL THEN w.closingTime ELSE e.closingTime END), (CASE WHEN e.exceptionId IS NULL THEN w.openingTime ELSE e.openingTime END)))/60) AS minutesOpen
FROM monthDays m
LEFT JOIN weekdayOpenHours w
ON w.weekdayId = WEEKDAY(ADDDATE(:date, m.day-1))
LEFT JOIN openHoursException e
ON ADDDATE(:date, m.day-1) >= e.date1 AND ADDDATE(:date, m.day-1) <= e.date2
WHERE ADDDATE(:date, m.day-1) < ADDDATE(:date, INTERVAL 1 MONTH)
ORDER BY m.day;",
$firstDayParam
);
# Hämtar alla bokningar i den specifierade månaden.
$bookings = $db->queryAll(
"SELECT DATE(b.datetime) date, TIME(b.datetime) time, ROUND(TIME_TO_SEC(b.datetime)/60) timeMinutes, b.adultCount + b.childCount peopleCount FROM booking b WHERE datetime BETWEEN :date AND ADDDATE(:date, INTERVAL 1 MONTH) AND NOT removed;",
$firstDayParam
);
# Hämtar restauranginställningar.
$settings = $db->query("SELECT seatCount, bookingInterval, bookingLength FROM restaurantSettings;");
# Funktion för att hämta öppettiderna för ett visst datum.
$getOpeningHoursFromDate = function ($openingHours, $date) {
foreach ($openingHours as $data) {
if ($data["date"] == $date)
return $data;
}
};
# Skriver ihop varje data för dagarna så att man får en associativ array med datum som key.
$dates = array();
foreach ($openingHours as $date) {
$data = array(
"isOpen" => $date["isOpen"],
"availableSeats" => $date["isOpen"] ? $settings["seatCount"] : 0
);
$dates[$date["date"]] = $data;
}
# Grupperar ihop alla bokningar i dagar.
$groupedBookings = array();
foreach ($bookings as $booking) {
if (!isset($groupedBookings[$booking["date"]]))
$groupedBookings[$booking["date"]] = array();
array_push($groupedBookings[$booking["date"]], $booking);
}
# Går igenom varje dag och kollar hur många platser det max finns tillgängliga den dagen.
foreach ($groupedBookings as $date => $dayBookings) {
$data = $getOpeningHoursFromDate($openingHours, $date); # Hämtar öppettiderna för den dagen.
# Delar upp dagen i tidsramar. Varje tidsram lagrar antalet platser som används.
$dateFrames = create_time_frames($data, $dayBookings, $settings);
# Kollar framåt för varje tidsram och beräknar max hur många platser finns tillgängliga en hel bokningslängd framåt.
$bookableFrames = create_bookable_time_frames($data, $dateFrames, $settings);
# Beräknar ut det högsta värdet på dagen för att på så vis se hur många som får plats.
$availableSeats = 0;
foreach ($bookableFrames as $seatCount) {
$availableSeats = max(array($availableSeats, $seatCount));
}
$dates[$date]["availableSeats"] = $availableSeats;
}
$data = array("dates" => $dates);
return $data;
};
$api = new APIEndpoint();
$httpGET = new APIMethod("GET", $functionGET);
$httpGET->setRequiredGETParameters(array("year", "month"));
$api->addMethod($httpGET);
return $api;
?>