Условно в отеле есть перечень номеров (номер1, номер2, номер3 и т.д.), у некоторых номеров есть типы (Тип1, Тип2).
При бронировании планирую создавать записи, например:
03.11.2019 Номер1 Тип2 Занято
06.11.2019 Номер2 Тип2 Занято
08.11.2019 Номер1 Тип1 Занято
11.11.2019 Номер3 ------ Занято
и т.д.
А вот дальше не очень понимаю, как на заданный диапазон дат узнать какие номера свободны, например узнать свободные номера с 01.11.2019 по 15.11.2019.
Из идей есть следующие:
№1
1) взять все номера
2) взять все бронирования на одно число (01.11.2019)
3) сопоставить два списка, полученных ранее, и исключить забронированные на это число номера, таким образом получу свободные номера
4) проделывать данный алгоритм для каждого дня для интервала из запроса т.е. с 01.11.2019 по 15.11.2019
№2
Изначально хранить данные в другом виде, для всех номеров всех типов на каждый день должны быть запись вида
01.11.2019 Номер1 Тип1 Свободно
или
01.11.2019 Номер1 Тип1 Занято
Тогда делаю запрос по интервалу с 01.11.2019 по 15.11.2019 и статусом свободно.
Этот вариант мне кажется избыточным и не очень понимаю, когда принимать решение о генерации таких записей, т.е. раз в год создавать на целый год вперед? И при добавлении нового номера или типа для него надо генерировать эти записи.
Какие еще существую варианты решения задачи бронирования? Также интересуют замечания по предложенным вариантам.
Реализовывать буду на php для битрикса.
Евгений, возможно я слишком условный пример привел, но в данном случае предполагается, что у номера либо тип отсутствует вообще, либо есть не меньше двух типов. В данном случае, я думаю, подойдет такой пример:
Номер люкс - без типа
Номер стандарт - с одной кроватью (тип1), с двумя кроватями (тип2).
Идея была в том, что одновременно может быть забронирован номер стандарт как с одной кроватью, так и с двумя т.е. тип номера влияет на доступность, поэтому в примере (в вопросе) я собирался хранить тип номера в таблице бронирования.
Цены в данном случае нет, пользователям просто нужно иметь представление какие номера свободны в тот или иной день или период.
То есть вы хотите не завести каждый физически номер в отеле, а только их типы (люкс, стандарт)? И бронировать в зависимости от количества свободных типов номеров на даты?
Здесь нужна магия дат и множественные свойства.
Дату переводим в число.
Число записываем как значение свойства элемента.
На странице поиска номеров используем фильтр, чтобы выбранная дата/даты, также переведенные в число, не совпадала со значением свойства у элемента, а точнее не входила в диапазон двух чисел.
Запись значений свойства делал бы по API.
Делал нечто подобное "Запись на прием к врачу".