Учёт остатков по движениям — точно, без люфта и ухода в минус
Каждый запрос к /api/* требует ключ в заголовке X-Api-Key.
Административные операции (управление ключами) требуют заголовок X-Admin-Key.
Ключи заводит администратор; новый ключ показывается один раз.
Остаток = приходы − списания − резервы + снятия резервов
Приход и списание меняют физический остаток. Резерв уменьшает доступный остаток, снятие резерва возвращает его. Отрицательный доступный остаток запрещён — сервис отвечает 409 Conflict.
Проверить API-ключ из заголовка X-Api-Key.
Список и поиск товаров по артикулу и названию (?search=).
Карточка товара с вычисленным остатком.
Создать товар (артикул, название, цена, единица).
Изменить цену, единицу или другие поля товара.
Список поставщиков.
Получить поставщика по id.
Создать поставщика.
Изменить поставщика.
Создать движение: income (приход), expense (списание),
reserve (резерв) или unreserve (снятие резерва).
История движений с фильтрами (product_id, movement_type, from, to).
История движений по конкретному товару.
Текущие остатки по всем товарам.
Отчёт остатков на дату в JSON (?date=2026-09-06).
Только X-Admin-Key. Список ключей.
Только X-Admin-Key. Создать ключ (показывается один раз).
Только X-Admin-Key. Отозвать или активировать ключ.
Каждая ошибка — машиночитаемый JSON с code, message и request_id.
{
"code": "negative_stock",
"message": "Отрицательный остаток запрещён",
"request_id": "a1b2c3d4e5f6a7b8",
"conflict_reason": "negative_stock",
"current_available": 0,
"shortage": 5
}
Коды: 401 — неверный ключ, 403 — нет прав администратора,
404 — запись не найдена, 409 — отрицательный остаток или дубликат артикула,
422/400 — ошибка валидации входных данных.