Sixtens hemsida Uppgifter Blogg Om

VED House bokningssystem

Gå till sida

Källkod

api/

database.php

api.php

ved/

monthBookingData.php

openingHoursException.php

bookingData.php

dayTimeframes.php

bookings.php

admin/

revokeToken.php

authorization.php

login.php

modules/

vedDatabase.php

utility.php

gyar/

log.php

auth/

revokeToken.php

authorization.php

login.php

station/

settings.php

log.php

modules/

gyarDatabase.php

databaseConnection.php

database.php

utility.php

credentials.json

weather/

latest.php

old.php

admin/

index.html

changeTimetable.html

login.html

js/

login.js

modules.js

admin.js

header.js

changeTimetable.js

cron/

vedClearExpiredTokens.php

api/ved/monthBookingData.php

1 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"] < || $_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;
?>