Резервы товаров

Резерв блокирует часть складского количества под заказ. Он относится к конкретному inventory.id, поэтому один и тот же товар на разных складах резервируется отдельно.

Вернуться к разделу: управление складом.

Резервы создаются и обновляются внутри сценария заказа. Отдельных методов POST, PUT и DELETE для /api/reservations нет.

Как работает резерв

  1. Клиент или сотрудник добавляет складскую позицию в заказ.
  2. Gigma создаёт активный резерв с количеством, ценой и сроком expired_at.
  3. Активный резерв уменьшают поле available в таблице остатков и количество в клиентском каталоге.
  4. После наступления expired_at фоновая команда переводит резерв в неактивное состояние.
  5. При удалении позиции из заказа связанный резерв освобождается вместе с ней.
доступно = inventory.quantity − сумма активных reservations.quantity

Что можно сделать через API

ЗадачаСпособ
Посмотреть резервы проектаGET /api/tables/reservations
Найти резервы заказапередать order_id
Освободить резерв до истеченияудалить соответствующую позицию заказа
Создать или изменить резерв вручнуюне поддерживается

Получить таблицу резервов

Метод
GET
URL
https://api.gigma.ru/api/tables/reservations
Авторизация
Bearer сотрудника
Headers
Authorization: Bearer {token}, Accept: application/json
Успешный ответ
200

Метод возвращает резервы проекта сотрудника, описание колонок и пагинацию.

Параметры запроса

  • order_id (integer, необязательный) — ID заказа.
  • page (integer, необязательный) — номер страницы, по умолчанию 1.
  • per_page (integer, необязательный) — количество строк, по умолчанию 10.

Параметры date_from и date_to текущий backend не обрабатывает. Поисковый параметр query объявлен в валидаторе, но не используйте его в новой интеграции: поиск резервов по тексту сейчас не имеет стабильного поля.

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

GET /api/tables/reservations?order_id=581&page=1&per_page=50 HTTP/1.1
Host: api.gigma.ru
Authorization: Bearer <employee_token>
Accept: application/json

Ответ

{
	"columns": [
		{
			"id": 178,
			"table_id": 22,
			"order": 0,
			"key": "code",
			"has_icon": 0,
			"text": "Код"
		},
		{
			"id": 181,
			"table_id": 22,
			"order": 3,
			"key": "name",
			"has_icon": 1,
			"text": "Наименование"
		},
		{
			"id": 185,
			"table_id": 22,
			"order": 7,
			"key": "quantity",
			"has_icon": 0,
			"text": "Количество"
		}
	],
	"reservations": [
		{
			"id": {
				"icon": null,
				"value": 193,
				"url": "/inventories/list-inventories/845"
			},
			"code": {
				"icon": null,
				"value": 19301,
				"url": "/inventories/list-inventories/845"
			},
			"created_at": "2026-08-22T07:30:00.000000Z",
			"name": {
				"icon": "https://api.gigma.ru/storage/uploads/default.svg",
				"value": "Микрофон",
				"link": "/inventories/list-inventories/845"
			},
			"counterparty": {
				"icon": "https://api.gigma.ru/storage/uploads/default.svg",
				"value": "ООО «Клиент»",
				"link": "/counterparty/list-counterparty/121"
			},
			"warehouse": {
				"icon": "https://api.gigma.ru/storage/uploads/default.svg",
				"value": "Основной склад",
				"link": "/warehouses/list-warehouses/12"
			},
			"source": {
				"icon": "https://api.gigma.ru/storage/uploads/default.svg",
				"value": "Интернет-магазин",
				"link": "/ecommerce/list-ecommerce/23"
			},
			"quantity": 3,
			"price": "1490.00",
			"expired_at": "2026-08-22 09:30:00",
			"is_active": "Да",
			"creator": "-"
		}
	],
	"pagination": {
		"total": 1,
		"per_page": 50,
		"current_page": 1,
		"last_page": 1,
		"from": 1,
		"to": 1
	}
}

Важные поля:

  • id.value — ID резерва;
  • id.url — ссылка административного интерфейса на складскую позицию, а не API-адрес;
  • quantity — заблокированное количество;
  • expired_at — срок действия;
  • is_active — участвует ли резерв в расчёте доступного количества;
  • source — приложение, из которого пришёл заказ.

Ошибки

  • 401 — Bearer отсутствует или недействителен.
  • 422 — order_id не найден или параметры запроса не прошли валидацию.

Освободить резерв

Отдельного DELETE /api/reservations/{reservation} нет. Чтобы освободить резерв до expired_at, удалите связанную позицию заказа:

DELETE /api/orders/{order}/nomenclatures/{order_item} HTTP/1.1
Host: api.gigma.ru
Authorization: Bearer <employee_token>
Accept: application/json

В этом URL:

  • order — ID заказа;
  • order_item — ID позиции заказа (OrderNomenclature.id), а не nomenclature.id и не reservation.id.

Сначала получите позиции нужного заказа и убедитесь, что удаляете правильную строку. Контракты работы с заказом находятся в разделе Заказы.

Что проверять при расхождении количества

Если available меньше ожидаемого:

  1. получите остаток через GET /api/tables/inventories;
  2. сравните quantity, reserved и available;
  3. запросите резервы по order_id, если известен заказ;
  4. проверьте is_active и expired_at;
  5. убедитесь, что фоновая команда обработки просроченных резервов выполняется по расписанию.