Работа с заказом¶
Жизненный цикл¶
Диаграмма состояний (статусов) заказа¶
executed¶
Заказ всегда создаётся в статусе executed
.
Через 10 минут, заказ в этом состоянии переходит в expired.
С заказом в состоянии executed
возможны следующие действия:
in_progress¶
Это соcтояние ожидания подтверждения оплаты. Время бронирования увеличивается с учётом выбраной платёжной системы.
- Возможные действия:
done¶
Заказ в этом статусе уже оплачен. Инициатор перехода в этот статус зависит от выбраной платёжной системы.
canceled¶
Заказ отенён. Ничего сделать с ним нельзя.
expired¶
Заказ просрочен, забронированные билеты снова вернулись в продажу.
Действия¶
Все действия с заказом, кроме его создания, делаются по запросу
PATCH /v1/resources/orders/:id
.
В один запрос одновременно может быть добавленно нескольно действий.
Все запросы на изменение конкретного заказа, должны делаться синхронно.
В случае получения запроса до конца обработки предыдущего, будет возвращена ошибка 409 Conflict
.
Это ограничение касается только работы с одним заказом, а работать одновременно с несколькими заказами можно.
Создание¶
Заказ создаётся запросом POST /v1/resources/orders
.
Возможно добавление всех действий, в статусе executed.
Бронирование билетов¶
- За бронирование билетов отвещают три поля:
Поле tickets
¶
В поле tickets
передаются все id билетов, которые должны быть
забронированны текущим заказом.
Если заказ изменяется (покупатель решил добавить ещё один билет), то в обязательно порядке
передаются все билеты, которые должны быть в заказе (в т.ч. те, что уже забронированны).
Для удаления конкретного билета из заказа, нужно передать все билеты, кроме удаляемого.
Нельзя использовать в одном запросе с random
.
Поле random
¶
Поле random
предназначено для бронирования случайных билетов из указанных
категорий. Оно нужно для того, чтобы добавлять в заказ
билеты без мест.
Имеет вид объекта, где ключ является id категории, а значение — количество билетов.
Так же, как и в tickets
, всегда нужно передавать желаемое состояние.
Т.е. если пользователь удалил один билет из категории, то передать надо random
со всеми категориями и количествами, только в одной из категорий будет на один билет меньше.
В ответе от сервера всегда будет список забронированных билетов в поле tickets
.
Нельзя использовать в одном запросе с tickets
.
Поле all_or_nothing
¶
Если поле all_or_nothing
true
, то бронируются либо все билеты, либо ни одного.
При изменении заказа с одновременным разбронированием и бронированием билетов,
в случае неудачи с бронированием хотя бы одного билета, разбронирования не происходит,
т.е. список забронированных билетов не изменяется.
Если значение не указано, или false
, то билеты, которые не удалось забронировать
пропускаются и отсутствуют поле tickets
в ответе.
Можно использовать, как с tickets
, так и с random
.
Добавление информации о покупателе¶
Информация о покупателе содержится в поле customer
. В ней есть следующие поля:
email: | email пользователя |
---|---|
first_name: | имя |
last_name: | фамилия |
mobile: | телефон |
В зависимости от выбраной платёжной системой, некоторых из этих полей могут быть обязательными для завершения заказа.
Выбор платёжной системы¶
Платёжные системы настраиваются в поле payment
со следующими подполями:
system: | тип платёжной системы, передаётся либо id, либо строкой из списка; |
---|---|
send_tickets: | отсылать ли письмо о покупке (если не установлено, зависит от платёжной системы); |
Смена статуса¶
Смена статуса (состояния заказа) осуществляется путём установки поля status
.
При попытке перевести заказ в состояние, не соответствующее диаграмме состояний,
сервер вернёт ответ с кодом 400 Bad Request
.
Нельзя вручную перевести заказ в статус expired. Возможность перехода из in_progress в done определяется выбраной платёжной системой и может быть ограничена.
Отмена¶
Отмена заказа, это установка статуса canceled. Очень важно отменять заказ, как только это возможно, чтобы билеты вернулись в продаже.
Частичная оплата¶
В статусе заказа in_progress, можно часть билетов убрать из заказа. Например, если пользователь оплатил только часть билетов.
Для разбронирования, нужно сделать запрос с полем tickets с оставшимися билетами.