Изменяет продукт и его состав. Меняются только переданные поля, остальные остаются прежними. Подробнее о частичном редактировании в статье [Общие правила](https://developers.controlata.ru/hc/api-docs/articles/rules).

```
v1/products/edit.php
```

## Параметры

| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| product_id | int | Да | ID продукта |
| name | string | Нет | Название |
| sku | string | Нет | Артикул |
| unit | string | Нет | Единица измерения |
| price | float | Нет | Цена продажи за единицу |
| batch_size | float | Нет | Размер партии, больше 0 |
| notes | string | Нет | Заметки |
| minimum | float | Нет | Минимальный остаток на складе storage_id |
| storage_id | int | С minimum | Склад, на котором меняется минимальный остаток |
| categories | array | Нет | ID категорий. Заменяют текущие целиком |
| suppliers | array | Нет | ID поставщиков. Заменяют текущих целиком |
| alternative_sku | array | Нет | Альтернативные артикулы: объекты с полями sku и label. Заменяют текущие целиком |
| materials | array | Нет | Материалы в составе |
| products | array | Нет | Заготовки в составе |
| resources | array | Нет | Ресурсы в составе. Заменяют текущие целиком |

Чтобы очистить поле, передайте пустую строку. Чтобы снять все категории, поставщиков или альтернативные артикулы, передайте пустой массив.

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

* **Состав.** Формат строк описан в разделе «Состав продукта» статьи [Продукты](https://developers.controlata.ru/hc/api-docs/articles/products). Если передан хотя бы один из массивов materials и products, материалы и заготовки заменяются целиком, а непереданный массив считается пустым. Например, если передать только materials, заготовки из состава удалятся. Ресурсы меняются, только если передан resources.
* **Размер партии.** Количества в составе хранятся на партию. Если изменить batch_size без состава, они останутся прежними, а расход на единицу продукта пересчитается: 0.5 куб. м на партию из 10 штук дает 0.05 на штуку, а на партию из 20 штук уже 0.025. Чтобы сохранить расход на единицу, передайте вместе с batch_size и состав с новыми количествами.
* **Себестоимость.** После изменения состава, ресурсов, размера партии или цены продажи Controlata пересчитывает себестоимость продукта и продуктов, в состав которых он входит. Производства этого продукта получают отметку bom_changed: состав изменился после их создания. Если производств и поставок продукта еще не было, по новой себестоимости переоцениваются начальный остаток и корректировки остатка.
* **Единица измерения.** Если новая единица из той же группы (например, «г» вместо «кг»), Controlata пересчитывает остатки, историю движений и минимальный остаток. Если цена не передана, она тоже пересчитывается: 500 за кг станет 0.5 за г. Сменить группу (например, «шт» на «кг») нельзя, если продукт входит в состав других продуктов.
* **Минимальный остаток** задается на конкретном складе, поэтому вместе с ним нужен storage_id. Продукт должен числиться на этом складе (см. [Продукты](https://developers.controlata.ru/hc/api-docs/articles/products)).
* **Категории** определяют, на каких складах числится продукт. После их изменения продукт появится на складах с новыми категориями и пропадет со складов прежних категорий, если остаток там нулевой и нет запланированных операций.

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

Новая цена продажи и состав материалов. Заготовки не переданы, поэтому удалятся из состава, ресурсы останутся прежними.

```
{
    "product_id": 3120,
    "price": 47000,
    "materials": [
        {
            "id": 2051,
            "amount_per_batch": 0.6,
            "unit": "куб. м",
            "loss_percent": 5
        },
        {
            "id": 2060,
            "amount_per_batch": 400,
            "unit": "шт"
        }
    ]
}
```

Изменить только минимальный остаток:

```
{
    "product_id": 3120,
    "minimum": 3,
    "storage_id": 3999
}
```

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

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

## Ошибки

| Ошибка | Причина |
|---|---|
| No product_id in input | Не передан product_id |
| Product not found or access denied | Продукт не найден или удален |
| Name must not be empty | Передано пустое название |
| Name must be a string | Название передано не строкой, например массивом |
| Unit not set | Передана пустая единица измерения |
| Unit not found | Неизвестная единица измерения |
| Unit cannot be changed to another unit group: the product is used in components of other products | Смена группы единицы у продукта, который входит в состав других продуктов |
| Batch size must be greater than 0 | Размер партии 0 или меньше |
| No storage_id in input | Передан minimum без storage_id |
| Storage ID not found | Склад не найден или удален |
| Product is not stored in storage location 3999, so its minimum cannot be set there | Продукт не числится на складе |
| Invalid price value. Must be a number | Значение не число (так же для batch_size и minimum) |
| Category 12 not found | Категория не найдена |
| Supplier not found or access denied | Поставщик не найден или удален |
| SKU must be from 1 to 50 characters for alternative_sku 0 | Альтернативный артикул пустой или длиннее 50 символов |
| Label must not exceed 100 characters for alternative_sku 0 | Подпись альтернативного артикула длиннее 100 символов |

Ошибки в строках materials, products и resources перечислены в разделе «Состав продукта» статьи [Продукты](https://developers.controlata.ru/hc/api-docs/articles/products).
