Плейбук: допоставка WB по статичному прогнозу
Срабатывает, когда пользователь просит:
- «расчет поставки»;
- «сколько допоставить»;
- «допоставка с учетом прогноза»;
- «план поставки по размерам»;
- «куда поставить по регионам»;
- «поставка с учетом ИЛ / локализации» (ранее ИРП — отменён WB для заказов с 13.07.2026;
теперь действует индекс локализации ИЛ, см.
data/knowledge/wb/localization-index.md).
Использует результат плейбука:
data/notes/wb/static-orders-sales-forecast-playbook.md
Цель
Сделать простой операционный план допоставки:
- Сколько штук нужно по размерам на 4 недели.
- Куда разложить поставку по доступным регионам.
- Где есть перекос текущего FBO-остатка и вместо закупки/новой поставки нужно сначала делать перераспределение.
Главный принцип
Для закупки/допоставки основной объем считать от прогноза продаж/выкупов, а не от прогноза заказов.
Но для WB и ИЛ (индекса локализации) обязательно держать в голове, что заказный поток тоже важен:
- прогноз продаж показывает, сколько товара реально будет потреблено;
- прогноз заказов показывает нагрузку на FBO и локализацию;
- если buyout низкий, товар временно уезжает клиентам и часть вернется позже.
В ответе можно показывать оба числа, но рекомендацию по новой поставке делать от прогноза продаж/выкупов, если пользователь не просит страховой запас под весь заказный поток.
Источники
| Метрика | Источник |
|---|---|
| Прогноз заказов/продаж | плейбук static-orders-sales-forecast-playbook.md |
| Текущий FBO | последний stocks_snapshot.quantity |
| В пути к клиенту | stocks_snapshot.in_way_to_client |
| В пути от клиента | stocks_snapshot.in_way_from_client |
| Регион склада | app.reference.warehouses.region_for(warehouse) |
| Доступные регионы поставки | бизнес-контекст / REGION_AVAILABILITY / REDISTRIBUTION_TARGETS |
По задаче с ограниченной поставкой использовать только разрешенные пользователем регионы. Например: «можем поставить только в Центр, Юг, Поволжье».
Обязательные таблицы в ответе
1. Таблица прогноза
Формат:
Размер | Прогноз заказов | Прогноз выкупов/продаж | Текущий FBO | Довезти по продажам
Пример:
Размер | Прогноз заказов | Прогноз выкупов/продаж | Текущий FBO | Довезти по продажам
L | 102 | 34 | 4 | 30
M | 167 | 49 | 6 | 43
S | 114 | 40 | 41 | 0
ИТОГО | 384 | 123 | 51 | 73
Формула:
Довезти по продажам = max(0, Прогноз выкупов/продаж − Текущий FBO)
Если нужно учитывать возвраты из пути:
Доступно с возвратами = FBO + in_way_to_client × (1 − buyout_rate) + in_way_from_client
Но для рабочей поставки по умолчанию не уменьшать план на весь ожидаемый возврат: возвраты не гарантированы по сроку и региону.
Можно упомянуть минимальный сценарий с возвратами отдельно, но не делать его основной рекомендацией без явного запроса.
2. Таблица допоставки
Формат:
Регион поставки | L | M | S | Итого
Пример:
Регион поставки | L | M | S | Итого
Центр | 10 | 12 | 0 | 22
Юг + СК | 9 | 20 | 0 | 29
Поволжье | 11 | 11 | 0 | 22
ИТОГО | 30 | 43 | 0 | 73
Как распределять допоставку по регионам
- Взять регионы, куда пользователь реально может поставить.
- Взять доли спроса по заказам в этих регионах.
- Нормализовать доли внутри доступного пула.
- Разложить каждую размерную потребность по этим долям.
- Округлить до целых штук и поправить остаток округления на регион с максимальной долей/дефицитом.
Пример доступного пула:
Центр: 47 заказов
Юг + СК: 53 заказа
Поволжье: 34 заказа
Итого: 134 заказа
Нормализованные доли:
Центр: 35.1%
Юг + СК: 39.6%
Поволжье: 25.4%
Если есть текущий региональный перекос по конкретному размеру, распределение допоставки можно смещать в пользу дефицитных регионов, а не строго по долям спроса.
Перекос остатков и перераспределение
Обязательная пометка в ответе:
Если по размеру текущий FBO уже покрывает прогноз продаж, но товар лежит не там, где спрос, новую поставку по этому размеру не делать. Сначала делать перераспределение между складами.
Типовой случай:
S: прогноз продаж 40 шт, текущий FBO 41 шт → допоставка 0.
Но S перекошен в Центр, а спрос есть в Юге и Поволжье.
Решение: не закупать S, а перераспределить часть S из Центра в Юг/Поволжье.
Почему это важно:
- закупка лишнего размера замораживает деньги;
- товар может лежать в регионе с избытком и не улучшать локализацию;
- для ИЛ важна локальность заказов (ступенчатый КТР по артикулу — см.
data/knowledge/wb/localization-index.md), поэтому перекос FBO может портить локализацию даже при нормальном общем остатке; причём зоны ИЛ — официальные ФО WB (Москва+МО входят в ЦФО, ЮФО+СКФО и СФО+ДФО объединены), а не наши бизнес-кластеры.
SQL: текущий FBO по размерам
SELECT
tech_size,
SUM(quantity) AS fbo,
SUM(in_way_to_client) AS in_way_to_client,
SUM(in_way_from_client) AS in_way_from_client
FROM stocks_snapshot
WHERE shop_id = :shop_id
AND sku = :sku
AND snapshot_at = (
SELECT MAX(snapshot_at)
FROM stocks_snapshot
WHERE shop_id = :shop_id
AND sku = :sku
)
GROUP BY tech_size
ORDER BY tech_size;
SQL: текущий FBO по регионам и размерам
Регион склада лучше считать в Python через:
from app.reference.warehouses import region_for
Базовая выгрузка:
SELECT
warehouse,
tech_size,
SUM(quantity) AS fbo,
SUM(in_way_to_client) AS in_way_to_client,
SUM(in_way_from_client) AS in_way_from_client
FROM stocks_snapshot
WHERE shop_id = :shop_id
AND sku = :sku
AND snapshot_at = (
SELECT MAX(snapshot_at)
FROM stocks_snapshot
WHERE shop_id = :shop_id
AND sku = :sku
)
GROUP BY warehouse, tech_size
ORDER BY warehouse, tech_size;
Расчёт с возвратами, если нужен минимальный сценарий
Если пользователь просит «минимум с учетом возвратов», использовать:
available = FBO + in_way_to_client × (1 − buyout_rate_size) + in_way_from_client
need_min = max(0, forecast_sales_size − available)
В ответе явно подписать:
Это минимальный сценарий. Он рискован, потому что возвраты могут прийти позже нужного срока
и не в тот регион.
Чек-лист
- Есть таблица прогноза: заказы, продажи, FBO, довезти.
- Есть таблица допоставки по регионам и размерам.
- Допоставка считается от прогноза продаж/выкупов, если пользователь не просил иначе.
- Доступные регионы ограничены тем, что указал пользователь.
- Если размер покрыт общим FBO, но есть региональный перекос, указано перераспределение.
- Не уменьшать основной план на ожидаемые возвраты без явного запроса.
- В ответе есть короткий вывод: что покупать/везти, а что не трогать.