Устанавливает остаток продукта на складе. Передается итоговый остаток, а не изменение: Controlata создаст корректировку на разницу между текущим и новым остатком.

```
v1/products/update_stock.php
```

## Параметры

| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| product_id | int | Да | ID продукта |
| storage_id | int | Да | ID склада |
| stock | float | Да | Новый остаток |
| notes | string | Нет | Заметки к корректировке |

## Как работает

* Увеличение остатка оценивается по себестоимости последнего прихода продукта на этот склад (создание, производство, поставка, перемещение). Если приходов не было, используется текущая себестоимость продукта. Уменьшение списывает партии по FIFO.
* Остаток можно установить на любом складе, даже если продукт там раньше не числился. На таком складе продукт будет числиться, пока остаток не станет нулевым (см. [Продукты](https://developers.controlata.ru/hc/api-docs/articles/products)).
* Если в Controlata подключена синхронизация остатков с Wildberries или Ozon, новый остаток передается в маркетплейс по ее настройкам, как и при любом другом изменении остатка.

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

```
{
    "product_id": 3120,
    "storage_id": 3999,
    "stock": 12,
    "notes": "Инвентаризация на складе"
}
```

## Пример ответа

```
{
    "success": true
}
```

## Ошибки

| Ошибка | Причина |
|---|---|
| No stock in input | Не передано обязательное поле (вместо stock будет имя поля) |
| Invalid stock value. Must be a number | Остаток не число, например "" или "4,2" |
| Storage ID not found | Склад не найден или удален |
| Product not found or access denied | Продукт не найден или удален |
