Остатки и доступность товаров
Все операции. Авторизация. Запросы и повторы.
Все пути в этом файле дополняют /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"