Движения и остатки

API движений остатков и отчётов.

Типы движений

income    — приход от поставщика      (+ к остатку)
expense   — списание                    (− к остатку)
reserve   — резерв под заказ            (− доступный)
unreserve — снятие резерва              (+ доступный)
POST/api/movements

Создать движение. Для income обязателен supplier_id. При уходе доступного остатка в минус сервис отвечает 409 Conflict.

{
  "product_id": 1,
  "supplier_id": 1,
  "movement_type": "income",
  "quantity": 12
}
GET/api/movements

История движений с фильтрами product_id, supplier_id, movement_type, from, to.

GET/api/products/{id}/movements

История движений по конкретному товару.

Отчёты

GET/api/reports/stock

Текущие остатки по всем товарам.

GET/api/reports/stock-on-date

Отчёт остатков на дату в JSON. Параметр date — ISO 8601.

GET /api/reports/stock-on-date?date=2026-09-06
X-Api-Key: <ключ>

Отрицательный остаток запрещён

{
  "code": "negative_stock",
  "message": "Отрицательный остаток запрещён",
  "request_id": "a1b2c3d4e5f6a7b8",
  "current_available": 0,
  "shortage": 5
}