Перейти к основному содержимому

Заказы

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

NEW → PROCESSING → SENT → COMPLETED
↓ ↓
ERROR ARCHIVED

CANCELLED
СтатусОписание
NEWЗаказ оформлен покупателем, ожидает обработки
PROCESSINGМенеджер принял в работу
SENTУспешно передан в mphone (есть external_id)
ERRORОшибка при передаче в mphone
CANCELLEDОтменён
COMPLETEDВыполнен и закрыт
ARCHIVEDПеренесён в архив

Оформление заказа покупателем

POST /api/v1/orders
Body:
{
"items": [{ "productId": 1, "quantity": 2 }],
"customerName": "Иван Петров",
"customerPhone": "+79001234567",
"customerEmail": "ivan@example.com",
"deliveryMethod": "courier",
"deliveryAddress": "Москва, ул. Пушкина, д. 1",
"comment": "Позвоните перед доставкой"
}

Перед созданием заказа клиент может валидировать корзину:

POST /api/v1/cart/validate
Body: [{ "productId": 1, "quantity": 2 }]
→ Возвращает актуальные цены и флаги наличия

Обработка заказов в Админ-панели

Список заказов

Страница /admin/orders — таблица заказов с фильтрами по статусу и дате.

Карточка заказа

Страница /admin/orders/{id}:

  • Просмотр состава заказа
  • Изменение статуса
  • Добавление/удаление позиций
  • Комментарий менеджера (admin_comment)
  • Кнопка «Передать в mphone» (доступна для NEW, PROCESSING)

Смена статуса

PATCH /api/v1/admin/orders/{id}
Body: { "status": "PROCESSING", "adminComment": "Взят в работу" }

Добавление позиции

POST /api/v1/admin/orders/{id}/items
Body: { "productId": 5, "quantity": 1 }

Удаление позиции

DELETE /api/v1/admin/orders/{id}/items/{itemId}

Стоимость доставки

Менеджер задаёт стоимость доставки отдельно — она хранится в поле delivery_cost и прибавляется к сумме заказа:

PATCH /api/v1/admin/orders/{id}/delivery-cost
Body: { "deliveryCost": 500 }

В карточке заказа доступна справочная таблица тарифов доставки по зонам и категориям товаров.

Удаление и массовая очистка

DELETE /api/v1/admin/orders/{id} # удалить один заказ (ADMIN/SUPER_ADMIN)
GET /api/v1/admin/orders/bulk-delete/preview # предпросмотр: сколько старых заказов будет удалено
DELETE /api/v1/admin/orders/bulk-delete # удалить заказы старше N дней

Массовое удаление и предпросмотр доступны в разделе «Заказы» в блоке очистки старых заказов.

Передача заказа в mphone

После нажатия «Передать в mphone» (или вызова POST /api/v1/admin/orders/{id}/submit):

  1. AdminOrderServiceImpl.submitToExternal() вызывает MphoneApiClient.insertOrder()
  2. При успехе: status → SENT, сохраняется external_id
  3. При ошибке: status → ERROR, причина записывается в лог

Повторная попытка — снова нажать кнопку. Статус ERROR не является финальным.

Состав заказа

Каждая позиция (order_items) хранит:

  • Снимок product_name — не меняется, даже если товар переименован
  • price_at_order — цена на момент заказа
  • line_totalquantity × price_at_order

Это защищает от изменения суммы заказа при редактировании каталога.

Заказы авторизованных пользователей

Если покупатель авторизован, к заказу привязывается user_id. Просмотр своих заказов:

GET /api/v1/orders/my # список заказов текущего пользователя
GET /api/v1/orders/{id} # конкретный заказ