Возвраты Ozon к получению продавцом
Актуализировано: 18.08.2026.
Цель
Показать по каждому Ozon-магазину:
- что уже лежит в пункте возврата и можно забирать;
- что едет к продавцу;
- что ожидает отправки именно в подтверждённый пункт продавца;
- где и когда начнётся тарификация хранения и когда Ozon прогнозирует утилизацию;
- сформировал ли Ozon возвратную отгрузку для получения по штрихкоду.
Рабочая точка входа для ручного отчёта — scripts/ozon_returns_to_pickup.py. Полная история
и JSON для автоматизации — scripts/marketplace_returns.py; общие правила хранения описаны
в data/notes/marketplace-returns-history-playbook.md. Оба контура read-only относительно Ozon.
Два обязательных источника
| Источник | Что даёт | Почему нужен |
|---|---|---|
POST /v1/returns/list |
Поштучный возврат: статус, товар, текущая и целевая точка, хранение | Главный источник факта «в пункте выдачи» и «едет к вам» |
POST /v1/return/giveout/list |
Активные возвратные отгрузки, склад, подтверждённое/общее число товаров | Контроль сформированного пакета для выдачи |
POST /v1/return/giveout/is-enabled |
Доступность получения по штрихкоду | Показывать как контроль, не как количество возвратов |
giveout/list нельзя использовать в одиночку. Контроль реализации от 17.08.2026:
по returns/list у магазинов 2 и 4 было по 3 товара в статусе
ArrivedAtReturnPlace, а giveout/list у обоих был пуст. Нулевой список отгрузок в такой
ситуации не означает, что на ПВЗ нечего забирать.
Статусы /v1/returns/list
visual.status.sys_name |
В отчёте | Действие |
|---|---|---|
ArrivedAtReturnPlace |
Готово | Товар находится в пункте возврата; вывести поштучно |
MovingToSeller |
Едет | Товар направлен в точку продавца |
WaitingShipment |
Ожидает | Включать только при подтверждённой целевой точке продавца |
ReceivedBySeller |
Закрыто | Использовать для распознавания точек продавца, но не считать активным |
MovingToOzon, ReturnedToOzon |
Возврат в Ozon | Не включать в маршрут продавцу |
PotentiallyLost, WriteOff, Utilizing, Utilized |
Исключение | Показывать в диагностике потерь, но не как товар к получению |
WaitingShipment нельзя включать целиком: часть таких товаров направлена на склады возвратов
Ozon, а часть — в точку продавца. Подтверждённые точки продавца строятся по target_place.id
из ArrivedAtReturnPlace, MovingToSeller, истории ReceivedBySeller и активных
giveout/list. Совпавшие ожидания считаются маршрутом продавцу; остальные выводятся отдельным
контрольным количеством без смешения с возвратами на ПВЗ.
Алгоритм
- Выбрать все магазины
shops.marketplace='ozon', если пользователь не указал один. - Запросить отдельно
ArrivedAtReturnPlace,MovingToSeller,WaitingShipmentиReceivedBySeller. Ozon разрешает только один фильтр в одном запросе. - Для каждого статуса пройти пагинацию до
has_next=false:limit=500, следующийlast_id—idпоследней строки предыдущей страницы. - Запросить все
giveout/list:limit<=500, следующийlast_id— последнийgiveout_id. - Группировать точки по
place.id/target_place.id, а не по строке адреса: Ozon может вернуть один адрес в нескольких вариантах написания. - Считать единицы по
product.quantity; одна строка обычно равна одной единице, но это не должно быть предположением в коде. - Отдельно показать по каждому магазину
Готово,Едет,Ожидает, пакет выдачи и точный адрес. Для готовых единиц вывестиoffer_id, название, причину и ID возврата. - Зафиксировать абсолютные дату и время среза в MSK.
Для полной истории в БД /v1/returns/list запрашивается с пустым filter и пагинацией до
has_next=false: так сохраняются все статусы, а не только текущий маршрут продавцу. В сводку
на ПВЗ после записи всё равно проходит только точный ArrivedAtReturnPlace.
Хранение и дедлайн
Не переносить правила WB на Ozon и не рассчитывать дедлайн вручную. Для каждой готовой единицы использовать поля самого Ozon:
storage.arrived_moment— когда возврат прибыл;storage.tariffication_start_date— начало тарификации;storage.tariffication_first_date— первое начисление;storage.sum.price— уже начисленное хранение;storage.utilization_forecast_date— прогноз утилизации.
Все UTC-метки переводить в Europe/Moscow и показывать с датой и временем.
Запрет двойного счёта
- Строки
returns/listи пакетgiveout/listописывают один возвратный поток. Их количества показываются рядом для сверки, но не складываются. - Детализацию
returns/listне прибавлять кreturn_from_customer_stock_countв оценке остатков Ozon: это агрегат и его расшифровка, а не два разных запаса. ReceivedBySellerуже закрыт;ReturnedToOzonуже вернулся в контур Ozon.
Безопасность
- Отчёт только читает API и БД.
- Не выводить
logistic.barcodeпо умолчанию. - Методы получения PDF/PNG или значения штрихкода вызывать только по явному запросу.
/v1/return/giveout/barcode-resetменяет внешний объект: без отдельного прямого разрешения не вызывать.
Запуск
.venv\Scripts\python.exe scripts\ozon_returns_to_pickup.py
.venv\Scripts\python.exe scripts\ozon_returns_to_pickup.py --shop-id 4
.venv\Scripts\python.exe scripts\marketplace_returns.py collect --attempts 3
.venv\Scripts\python.exe scripts\marketplace_returns.py report --json
Чек-лист
- ☐ Проверены оба Ozon-магазина или явно назван выбранный магазин?
- ☐
returns/listполностью пропагинирован по каждому статусу? - ☐ Готовые, едущие и ожидающие разделены?
- ☐
WaitingShipmentна склады Ozon не попал в маршрут продавцу? - ☐ Нулевой
giveout/listне затёр готовые возвраты? - ☐ Для готовых товаров показаны точка, состав, тарификация и прогноз утилизации?
- ☐ Штрихкод не раскрыт и никакое внешнее действие не выполнено?