Привіт!
У мене є таблиця з бронюваннями деяких кімнат:
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;
Якщо в якийсь з цих проміжків була б видалена бронь, вона б не враховувалась!!!!
Якби у нас в розпорядженні було б більше кімнат, і на них не було б броней - то для них було б купа слотів на весь день.
Оплата відбувається після всіх тестів з моєї сторони і внесення правок з боку виконавця.
Використання різноманітних ШІ недопустимо.