Cześć!
Mam tabelę z rezerwacjami niektórych pokoi:
CREATE TABLE `booking` ( `id` int(11) NOT NULL, `room_id` int(11) DEFAULT NULL, `client_id` int(11) DEFAULT NULL, `timestamp_from` int(11) DEFAULT NULL, `timestamp_to` int(11) DEFAULT NULL, `status_id` int(11) DEFAULT NULL, `guests` int(11) DEFAULT NULL, `type` int(11) DEFAULT NULL, `tariff` int(11) DEFAULT NULL, `comment` text DEFAULT NULL, `created_by` int(11) DEFAULT NULL, `updated_by` int(11) DEFAULT NULL, `created_at` int(11) DEFAULT NULL, `updated_at` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
również tabela statusów:
CREATE TABLE `booking_status` ( `id` int(11) NOT NULL, `booking_id` int(11) DEFAULT NULL, `status` int(11) DEFAULT NULL, `created_by` int(11) DEFAULT NULL, `updated_by` int(11) DEFAULT NULL, `created_at` int(11) DEFAULT NULL, `updated_at` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Zadanie jest takie:
Potrzebuję zapytania SQL, które przyjmowałoby parametry:
- timestamp_from – czas rozpoczęcia wyszukiwania
- timestamp_to – czas zakończenia wyszukiwania
- duration – czas trwania (w sekundach)
- slot_interval – interwał slotu (w sekundach)
- by_room – czy uwzględniać pokoje
W odpowiedzi zapytanie powinno zwracać wszystkie możliwe kombinacje wolnych "slotów" do rezerwacji (wolne - to czas, na który nie ma obecnie aktywnej rezerwacji na określony pokój).
Slot to przedział czasu o długości duration, który ma czas rozpoczęcia, czas zakończenia oraz numer pokoju.
Należy pamiętać, że pokoi jest wiele i niekoniecznie jeśli istnieje wpis o rezerwacji, to na ten czas wszystkie pokoje są zajęte.
Należy również pamiętać, że rezerwacje mogą być usunięte (booking_status.status = 0), w takim przypadku uważamy, że jest to wolny czas i można generować sloty na ten czas.
I koniecznie, jeśli istnieje już aktywna rezerwacja, to sloty powinny być generowane z uwzględnieniem 30-minutowego interwału przed i po już aktywnej rezerwacji.
Parametr by_room określa, czy zwrócić konkretny pokój czy nie. Jeśli tak, to zapytanie powinno zwrócić wszystkie sloty dla wszystkich pokoi osobno. Jeśli nie, to zapytanie powinno zwrócić ogólnie wolne sloty (załóżmy, że na określony czas jest rezerwacja na jeden pokój, ale nie ma na drugi - zapytanie powinno zwrócić ten slot jako wolny)
Przykład (uwzględniając, że mamy TYLKO JEDEN pokój, a innych nie ma):
Mam dwie rezerwacje na JEDEN pokój:
1) 20.05.2024 10:00 – 20.05.2024 14:00
2) 20.05.2024 18:00 – 20.05.2024 22:00
Wprowadzam takie dane do zapytania:
timestamp_from – 20.05.2024 10:00 (oczywiście w timestampie)
timestamp_to – 20.05.2024 23:00 (oczywiście w timestampie)
duration – 7200 (2 godziny w sekundach)
slot_interval – 1800 (30 minut)
by_room – true
W odpowiedzi powinienem otrzymać taki tablicę (wszystkie daty powinny być w timestampach!!!):
room_id: 1, start: 20.05.2024 14:30, end: 20.05.2024 16:30;
room_id: 1, start: 20.05.2024 15:00, end: 20.05.2024 17:00;
room_id: 1, start: 20.05.2024 15:30, end: 20.05.2024 17:30;
Jeśli w którymkolwiek z tych przedziałów byłaby usunięta rezerwacja, nie byłaby uwzględniana!!!!
Gdybyśmy mieli więcej pokoi do dyspozycji i na nich nie było rezerwacji – dla nich byłoby wiele slotów na cały dzień.
Płatność następuje po wszystkich testach z mojej strony i wprowadzeniu poprawek przez wykonawcę.
Wykorzystywanie różnych rodzajów sztucznej inteligencji jest niedopuszczalne.