Работа с заказом

Жизненный цикл

Диаграмма состояний (статусов) заказа

../../_images/orders_workflow.png

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 с оставшимися билетами.