Skip to content

Статусы заказов и билетов ​

Статус заказа вычисляется по состоянию его билетов при каждом запросе. Отдельно он нигде не хранится.

Статусы заказа ​

СтатусЗначениеЧто можно сделать
heldБилеты забронированы и ждут оплаты до expires_atconfirm, DELETE
paidПродажа подтверждена. Если часть билетов возвращена, они перечислены в refunded_ticketsrefund
expiredБронь истекла, билеты не были оплачены—
cancelledБронь снята партнёром через DELETE—
refundedВсе билеты заказа возвращены—

Переходы ​

text
                    POST /orders
                         │
                         ▼
                    ┌─────────┐   DELETE /orders/{id}    ┌───────────┐
                    │  held   │─────────────────────────▶│ cancelled │
                    └─────────┘                          └───────────┘
                     │       │
   POST .../confirm  │       │  истёк expires_at
                     ▼       ▼
               ┌────────┐  ┌─────────┐
               │  paid  │  │ expired │
               └────────┘  └─────────┘
                    │
                    │  POST .../refund  (все билеты)
                    ▼
              ┌──────────┐
              │ refunded │
              └──────────┘

Частичный возврат оставляет заказ в статусе paid: возвращённые билеты переносятся из tickets в refunded_tickets.

Статусы билетов ​

СтатусЗначение
heldЗабронирован, не оплачен. PIN не выдаётся
paidОплачен. Доступны pin и pin_formatted
usedБилет прошёл контроль на входе. Вернуть его нельзя

Возвращённые билеты в tickets не попадают — они перечислены в refunded_tickets с датой возврата refunded_at.

Поле expires_at ​

  • Заполнено для заказов в статусах held и expired — это момент, когда истекает (или истекла) бронь.
  • Для остальных статусов — null.

Как статус вычисляется ​

Порядок проверок важен для понимания граничных случаев:

  1. В заказе нет активных билетов:
    • есть возвращённые → refunded;
    • бронь была удалена по истечении срока → expired;
    • иначе → cancelled.
  2. Хотя бы один билет оплачен или использован → paid.
  3. Срок брони хотя бы одного билета истёк → expired.
  4. Иначе → held.

Истёкшая, но ещё не удалённая бронь

Билеты с истёкшей бронью удаляются фоновой задачей не мгновенно. Пока они не удалены, заказ уже имеет статус expired, но места ещё заняты. DELETE для такого заказа освободит места сразу.

Идемпотентность операций ​

ОперацияПовторный вызов
POST /orders с тем же partner_order_idВозвращает существующий заказ, 200 OK
confirm для paidВозвращает заказ без изменений
DELETE для cancelled или refundedВозвращает заказ без изменений
refund для refundedОшибка 409 order_not_held