РЕЗЕРВИРОВАНИЕ МЕСТ

ОБЩАЯ ИНФОРМАЦИЯ
ВХОДНЫЕ БИЛЕТЫ
ЦЕНОВЫЕ КАТЕГОРИИ И ТАРИФЫ
ЛИМИТЫ
КОМАНДЫ API
ОПТИМАЛЬНОЕ ИСПОЛЬЗОВАНИЕ API

ОБЩАЯ ИНФОРМАЦИЯ

В большинстве профессиональных билетных систем места и билеты – это разные объекты. Место имеет воплощение в реальном мире, как кресло в театре или на стадионе. У места есть координаты: название сектора, номер ряда и места. Билет, это документ, который дает право занять место с указанными в нем координатами. Место всегда одно, не допускается наличие двух мест с одинаковыми координатами. С учетом возвратов, билетов на одно место может быть продано несколько, но только один из них является валидным.

ВХОДНЫЕ БИЛЕТЫ

Есть множество случаев, когда необходимо продавать входные билеты на «места без размещения», то есть фактически без выделенных мест с точными координатами. Это, например, танцополы и фанзоны на концертах, экскурсии, билеты для посещения музеев и выставок. В ряде случаев, даже когда физически места есть, продаются входные билеты со свободной рассадкой (морские прогулки, автобусные туры, и т. д.). Несмотря на то, что на входных билетах не указываются координаты конкретных мест, существует понятие емкости места проведения события: сектора, музея, автобуса или прогулочного катера, так как они способны принять лишь ограниченное количество посетителей. Поэтому, у многих билетных систем есть ограничение на общее количество продаваемых входных билетов по всем (или по отдельным) категориям и тарифам.

Для удобства, в BIL24 у каждого места без размещения, также как и мест с размещением, есть уникальный ID. При этом, у мест без размещения нет координат (сектор, ряд, место).

ЦЕНОВЫЕ КАТЕГОРИИ И ТАРИФЫ

У реально существующего кресла (места с размещением), например, на стадионе, есть обязательные параметры:

1. Уникальный ID

2. Координаты: сектор, номер ряда и номер места.

3. Ценовая категория, определяющая стоимость места.

Также может быть необязательный параметр Тариф, изменяющий цену места для отдельных категорий посетителей, например, взрослых и детей. Все места на схеме стадиона расположены по-разному. Покупатель билетов выбирает себе места в соответствии со своими предпочтениями (рис.1):



рис.1

Важно, что покупателю нужны конкретные места в определенном секторе и на выбранном им ряде. На время, пока покупатель оформляет покупку билетов на эти места, они находятся в резерве, и никто другой не может их приобрести.

У мест без размещения есть два важных отличия от мест с размещением:

1. У мест без размещения нет координат, покупатель выбирает их по названию ценовой категории и тарифам, если они есть (рис.2).

2. Все места одной категории ОДИНАКОВЫЕ, то есть можно продавать их одновременно множеству покупателей, что позволяет не резервировать конкретные места по их ID, а вместо этого резервировать места по категории (тарифу) и количеству.



рис.2

ЛИМИТЫ

Представим ситуацию, что надо продать входные билеты на морскую прогулку на катере. Общее количество мест на катере – 20, и есть две цены билета: для взрослого, и для ребенка. Заранее неизвестно, сколько взрослых и детских билетов купят. Чтобы иметь возможность продать все билеты в любой ситуации, можно сделать так:

1. Создать две ценовые категории, «Взрослый билет» и «Детский билет». Для каждой из ценовых категорий установить количество мест 20.

2. Объединить две ценовые категории из п.1 общим лимитом, ограничивающим общие продажи билетов количеством 20. Подробнее, как это сделать, описано в документации к приложению Редактор.

Если не установить общий лимит для категорий «Взрослый билет» и «Детский билет», то можно продать 40 билетов (20 Взрослых и 20 Детских), что плохо, так как превышает количество мест на катере. Лимит не даст возможности продать больше 20 билетов, и в то же время позволит покупателям самостоятельно решить, сколько и каких билетов они купят. Общим лимитом можно объединять две и более категорий.

Существует альтернативный способ организовать продажи билетов на такую морскую прогулку:

1. Создать одну ценовую категорию «Морская прогулка». Установить количество мест 20.

2. Для категории «Морская прогулка» создать два тарифа: «Взрослый» и «Детский».

При этом способе лимит не нужен, и в нем также не получится продать больше 20 билетов. Подробнее, как это сделать, описано в документации к приложению Редактор.

КОМАНДЫ API

Для резервирования применяется команда API: RESERVATION. Рассмотрим применение этой команды при покупке входных билетов на событие Посещение музея Фаберже в тестовой зоне платформы BIL24. Для примера, необходимо приобрести несколько мест из разных ценовых категорий, по разным тарифам на два сеанса:

21 ноября ВС 11:00   Входной билет на основную экспозицию   Школьник   2 шт.

21 ноября ВС 11:00   Входной билет на экскурсионный сеанс   Студент   1 шт.

25 ноября ЧТ 12:30   Входной билет на основную экспозицию   Пенсионер РФ   1 шт.

25 ноября ЧТ 12:30   Входной билет на экскурсионный сеанс   Школьник   3 шт.

Потребуются отправить на центральный сервер BIL24 две команды API (одной командой не зарезервировать места на разные сеансы):

Первая команда:

{
  "fid": 1185,
  "token": "2f1173e2b12fd5a111b6",
  "command": "RESERVATION",
  "userId": 1,
  "sessionId": "b1581ac148e0796b176a8bc4e7b773ad",
  "type": "RESERVE",
  "categoryList": [
  {
    "categoryPriceId": 26650,
    "tariffPlanId": 65,
    "quantity": 2
  },
  {
    "categoryPriceId": 26649,
    "tariffPlanId": 66,м     "quantity": 1
  }
  ]
}

Вторая команда:

{
  "fid": 1185,
  "token": "2f1173e2b12fd5a111b6",
  "command": "RESERVATION",
  "userId": 1,
  "sessionId": "b1581ac148e0796b176a8bc4e7b773ad",
  "type": "RESERVE",
  "categoryList": [
  {
    "categoryPriceId": 27138,
    "tariffPlanId": 69,
    "quantity": 1
  },
  {
    "categoryPriceId": 27137,
    "tariffPlanId": 70,
    "quantity": 3
  }
  ]
}

Важно!
При получении ошибки в ответе гарантируется, что ни одно место из списка не было забронировано (транзакционные свойства бронирования). В ответе присутствуют все места корзины, причем новые (последние забронированные) помечены специальным флагом (поле new).


ОПТИМАЛЬНОЕ ИСПОЛЬЗОВАНИЕ API

При кажущейся простоте организации резервирования мест – это одна из сложных задач, занимающая центральное место в любой билетной системе. Реализовав API более чем 30-ти билетных систем, мы изучили разные подходы к решению этой задачи. Главный вопрос при реализации резервирования, в какой момент отправлять команду RESERVATION. Наиболее оптимальный способ - резервировать места без размещения при клике в значок корзины. Рассмотрим, как правильно использовать команды на примере события Посещение музея Фаберже (рис.3):



рис.3

1. Значок корзины. При нажатии на него необходимо выполнить команду RESERVATION и забронироовать все билеты, выбранные покупателем в текущем сеансе. Для отображения корзины необходимо использовать команду GET_CART.

2. Счетчик корзины показывает сколько билетов выбрал покупатель во всех сеансах. Значение счетчика рассчитывается в клиентском коде, расположенном на сайте или в мобильном приложении. Так как команда RESERVATION возвращает все забронированные места, то можно сверить расчетное значение счетчика с реальным количеством зарезервированных мест.

3. Кнопки выбора сеансов. При переходе в другой сеанс необходимо выполнить команду RESERVATION в отношении мест, выбранных в текущем сеансе.

4. Сообщение о том, что фактическое резервирование мест происходит при переходе в корзину, а не при выборе количества с помощью кнопок + и - (п.7). Это сообщение необходимо, чтобы покупатель билетов четко понимал, в какой момент он бронирует места для покупки.

5. Ценовая категория.

6. Тариф.

7. Выбор количества мест (билетов).

Как не надо делать:

8. Не нужно выполнять команду RESERVATION при нажатии кнопок + или – (п.7).

9. Не надо посылать дополнительные команды RESERVATION для обновления счетчика на значке корзины (п.2).

10. Не надо выполнять команду GET_CART после каждой команды RESERVATION. Команда GET_CART должна выполнятся только при переходе пользователя в корзину.

11. Не нужно применять резервирование мест с размещением, как описано в статье.