Каталог меняется. Заказ сохраняется
У каждой позиции собственный постоянный ID, название, артикул, цвет, размер, количество и цена в копейках. Каталог используется для выбора новой позиции; последующие изменения каталога не переписывают согласованный состав. Ручной товар или услуга не создают складских движений.
Распределение по складам хранится отдельно внутри строки. Покупатель видит одну позицию, даже когда ее собирают в двух местах.
Создать заказОткрыть состояние целиком
Вкладка «Версии» содержит неизменяемые снимки: состав, цены, контакты, доставка, источник и комментарий, автор и время. Сравнение сопоставляет строки по ID. Восстановление создает новую версию, не стирая платежи, отправки и складские факты.
Сохранение требует expectedVersion и idempotencyKey. Конфликт возвращает 409; повтор того же запроса не создает вторую правку. После отгрузки состав изменяется отдельным возвратом или новым заказом.
GET /api/v1/admin/orders/{id}/versions
POST /api/v1/admin/orders/{id}/edit
POST /api/v1/admin/orders/{id}/versions/{revision}/restoreИндивидуальная цена и доплата
Для изменения цены нужно отдельное право и причина. После оплаты подтверждается корректировка: повышение оставляет сумму доплаты, снижение создает отдельный возврат. Прайс-лист магазина не меняется. После частичного возврата коммерческое редактирование заблокировано: оставшаяся покупка и возвраты должны сохранять точный учет.
В публичном стенде финансовые операции тестовые. Корректировки внешнего платежа требуют сверки с провайдером; они не выдаются за выполненный банковский возврат.
POST /api/v1/admin/orders/{id}/refund-lines
{"generationId":"FROM_SESSION","expectedVersion":"FROM_ORDER","idempotencyKey":"UNIQUE","reason":"Возврат одной пары","lines":[{"lineId":"FROM_ORDER","quantity":1}]}