Статусы заказов и билетов
Статус заказа вычисляется по состоянию его билетов при каждом запросе. Отдельно он нигде не хранится.
Статусы заказа
| Статус | Значение | Что можно сделать |
|---|---|---|
held | Билеты забронированы и ждут оплаты до expires_at | confirm, DELETE |
paid | Продажа подтверждена. Если часть билетов возвращена, они перечислены в refunded_tickets | refund |
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.
Как статус вычисляется
Порядок проверок важен для понимания граничных случаев:
- В заказе нет активных билетов:
- есть возвращённые →
refunded; - бронь была удалена по истечении срока →
expired; - иначе →
cancelled.
- есть возвращённые →
- Хотя бы один билет оплачен или использован →
paid. - Срок брони хотя бы одного билета истёк →
expired. - Иначе →
held.
Истёкшая, но ещё не удалённая бронь
Билеты с истёкшей бронью удаляются фоновой задачей не мгновенно. Пока они не удалены, заказ уже имеет статус expired, но места ещё заняты. DELETE для такого заказа освободит места сразу.
Идемпотентность операций
| Операция | Повторный вызов |
|---|---|
POST /orders с тем же partner_order_id | Возвращает существующий заказ, 200 OK |
confirm для paid | Возвращает заказ без изменений |
DELETE для cancelled или refunded | Возвращает заказ без изменений |
refund для refunded | Ошибка 409 order_not_held |