Перейти к содержимому
СервисАпп API
На этой странице

Остатки и доступность товаров

Все операции. Авторизация. Запросы и повторы.

Все пути в этом файле дополняют /api/v1 на домене организации.

Описание и ограничения

Назначение

Раздельное чтение физического количества, резервов и свободной доступности без ручного изменения учётных агрегатов.

Поля и назначение

Публичное поле Формат и смысл Доступ
stock_id, product_id id только чтение
quantity десятичная строка физического остатка только чтение
reserved десятичная строка только чтение
available физический остаток минус резервы только чтение
unit_id код единицы только чтение

Обязательность и null указаны в схемах каждой операции ниже.

Доступ и выборка

stock_levels:read и «Остатки → Просмотр»; обе связи должны быть доступны.

Фильтры: product_id, q; ограниченный набор товаров для пакетного чтения.

Правила и связи

  • Доступность считается действующим складским сервисом, а не независимым API-счётчиком.
  • available может быть отрицательным после мягкого резервирования сверх физического количества; API не ограничивает его нулём и не выдаёт за фактическое списание. Это quantity минус активный reserved по одному согласованному чтению.
  • GET не исправляет резервы и не выполняет переучёт.
  • Запись материала в акт проводится через act-products; прямой POST для quantity/reserved отсутствует.

Серийные резервы и старые данные

Общий складской сервис сохраняет выбранные серийные номера в снимке резерва и закрепляет имеющийся экземпляр за одним активным резервом. Мягкая бронь не уменьшает физический остаток. Приход ожидаемого номера связывается с сохранённым снимком, а не с текущим текстом строки документа. Снятие резерва освобождает экземпляр; выдача разрешена его владельцу. Перемещение, инвентаризация и отмена прихода не обходят действующую бронь. Отключение партионного учёта не разрешает списать серийный товар с такими резервами через старый путь.

У нового резерва пустой список серийных номеров означает резерв количества без выбора экземпляров. У старой записи null означает, что принадлежность экземпляров неизвестна. Операция с таким резервом может вернуть 409 SERIAL_UNAVAILABLE: пересохраните исходные строки документа, чтобы заново сформировать резерв. Чтение остатков само по себе не исправляет такие записи.

Складские изменения применяются целиком. При конфликте параллельных операций запрос может завершиться ошибкой; частичный успех не возвращается.

Операции

Метод Путь Назначение
GET /stocks/{stock_id}/levels Позиции и доступность склада
GET /stocks/{stock_id}/levels/{product_id} Остаток конкретного товара

GET /stocks/{stock_id}/levels

Позиции и доступность склада.

Доступ. Разрешения подключения: stock_levels:read. Права сотрудника: «Остатки → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
stock_id путь строка да нет Шаблон: ^(?:[0-9]+)$
sort параметр запроса строка нет нет Допустимо: "product_id", "-product_id"
page[size] параметр запроса целое число нет нет ≥ 1; ≤ 100
page[cursor] параметр запроса строка нет нет не более 8192 символов
filter[product_id] параметр запроса целое число нет нет ≥ 1
filter[q] параметр запроса строка нет нет не более 200 символов

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/stocks/101/levels" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

GET /stocks/{stock_id}/levels/{product_id}

Остаток конкретного товара.

Доступ. Разрешения подключения: stock_levels:read. Права сотрудника: «Остатки → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
stock_id путь строка да нет Шаблон: ^(?:[0-9]+)$
product_id путь строка да нет Шаблон: ^(?:[0-9]+)$
If-None-Match заголовок строка нет нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
304 Представление не изменилось, без тела. Условный GET
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 ETag строка
304 ETag строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/stocks/101/levels/101" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"