Здравствуйте!
У меня есть таблица с бронями некоторых комнат:
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;
так же таблица статусов:
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;
Задача такая:
Мне нужен SQL запрос, который бы принимал параметры:
- timestamp_from – время начала поиска
- timestamp_to – время окончания поиска
- duration – длительность (в секундах)
- slot_interval – интервал слота (в секундах)
- by_room – учитывать ли комнаты
В ответ запрос отдавал бы мне все возможные комбинации свободных "слотов" для бронирования (свободные - это то время, на которое на данный момент нет активной брони на определенную комнату).
Слот – это промежуток времени, длительностью в duration, у которого есть время начала и время окончания, а так же номер комнаты.
Нужно учесть, что комнат много, и необязательно, что если существует запись про бронь, то на это время заняты все комнаты.
Так же, нужно учитывать, что брони могут быть удалены (booking_status.status = 0), в таком случае мы считаем что это свободное время, и на него можно генерировать слоты.
И обязательно, если уже существует активная бронь, то слоты должны генерироваться с учетом 30-минутного интервала до и после уже активной брони.
Параметр by_room определяет, нужно ли отдавать конкретную комнату или нет. Если да, то запрос должен выдать все слоты для всех комнат по отдельности. Если нет, то запрос должен выдать вообще свободные слоты (допустим, если на заданное время на бронь на одну комнату, но нет на другую – запрос должен выдать этот слот как свободный)
Пример (берем в рассчет, что у нас всего ОДНА комната, и других нет):
У меня есть две брони на ОДНУ комнату:
1) 20.05.2024 10:00 – 20.05.2024 14:00
2) 20.05.2024 18:00 – 20.05.2024 22:00
Я ввожу в запрос такие данные:
timestamp_from – 20.05.2024 10:00 (естественно в таймстапе)
timestamp_to – 20.05.2024 23:00 (естественно в таймстапе)
duration – 7200 (2 часа в секундах)
slot_interval – 1800 (30 минут)
by_room – true
В ответ я должен получить такой массив (все даты должны быть в таймстампах!!!):
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;
Если в какой-то из этих промежутках была бы удаленная бронь, она бы не учитывалась!!!!
Если бы у нас в распоряжении было бы больше комнат, и на них не было бы броней – то для них было бы куча слотов на весь день.
Оплата происходит после всех тестов с моей стороны и внесения правок со стороны исполнителя.
Использования разного рода ИИ недопустимо.