Создает продукт вместе с составом. Продукт появляется на складе storage_id и на складах, которые хранят все продукты или его категории.

```
v1/products/add.php
```

## Параметры

| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| name | string | Да | Название |
| unit | string | Да | Единица измерения, код из статьи [Единицы измерения](https://developers.controlata.ru/hc/api-docs/articles/units-get-list) |
| storage_id | int | Да | Склад, на котором создается остаток |
| sku | string | Нет | Артикул |
| price | float | Нет | Цена продажи за единицу. По умолчанию 0 |
| batch_size | float | Нет | Размер партии: на какое количество продукта указан состав. Больше 0, по умолчанию 1 |
| stock | float | Нет | Начальный остаток на складе storage_id. По умолчанию 0 |
| minimum | float | Нет | Минимальный остаток на складе storage_id. По умолчанию 0 |
| notes | string | Нет | Заметки |
| categories | array | Нет | ID категорий из [v1/categories/get_list](https://developers.controlata.ru/hc/api-docs/articles/categories-get-list) с type «products» |
| suppliers | array | Нет | ID поставщиков из [v1/suppliers/get_list](https://developers.controlata.ru/hc/api-docs/articles/suppliers-get-list) |
| alternative_sku | array | Нет | Альтернативные артикулы: объекты с полями sku (от 1 до 50 символов) и label (необязательная подпись до 100 символов) |
| materials | array | Нет | Материалы в составе |
| products | array | Нет | Заготовки в составе |
| resources | array | Нет | Ресурсы в составе |

Формат строк materials, products и resources описан в разделе «Состав продукта» статьи [Продукты](https://developers.controlata.ru/hc/api-docs/articles/products). Количества в составе указываются на партию из batch_size единиц.

Controlata рассчитывает себестоимость продукта по составу, и по ней же оценивается начальный остаток. Если состава нет, начальный остаток оценивается по нулевой себестоимости.

Категории через API не создаются, можно назначить только существующие. В categories и suppliers можно передать числа или объекты с полем id, как их возвращает [v2/products/get_entry](https://developers.controlata.ru/hc/api-docs/articles/products-get-entry).

Уникальность основного и альтернативных артикулов не проверяется.

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

Стол: в партии 10 штук, на партию уходит 0.5 куб. м доски с потерями 5%, 400 саморезов, 40 ножек (заготовка) и 30 часов работы столяра. Накладные расходы считаются процентом, который задан в самом ресурсе, поэтому для него достаточно id.

```
{
    "name": "Стол обеденный",
    "sku": "P100",
    "unit": "шт",
    "price": 45000,
    "batch_size": 10,
    "storage_id": 3999,
    "stock": 5,
    "minimum": 2,
    "categories": [21],
    "suppliers": [46],
    "alternative_sku": [
        {
            "label": "Ozon",
            "sku": "OZ-P100"
        }
    ],
    "materials": [
        {
            "id": 2051,
            "amount_per_batch": 0.5,
            "unit": "куб. м",
            "loss_percent": 5
        },
        {
            "id": 2060,
            "amount_per_batch": 400,
            "unit": "шт"
        }
    ],
    "products": [
        {
            "id": 312,
            "amount_per_batch": 40,
            "unit": "шт"
        }
    ],
    "resources": [
        {
            "id": 57,
            "amount_per_batch": 30,
            "unit": "ч"
        },
        {
            "id": 58
        }
    ]
}
```

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

```
{
    "success": true,
    "product_id": 3120
}
```

## Ошибки

| Ошибка | Причина |
|---|---|
| No name in input | Не передано обязательное поле (вместо name будет имя поля) |
| Name must not be empty | Пустое название |
| Name must be a string | Название передано не строкой, например массивом |
| Unit not set | Передана пустая единица измерения |
| Unit not found | Неизвестная единица измерения или единица только для ресурсов |
| Storage ID is not set | storage_id равен 0 или пустой |
| Storage ID not found | Склад не найден или удален |
| Batch size must be greater than 0 | Размер партии 0 или меньше |
| Invalid price value. Must be a number | Значение не число, например "12,5" (так же для batch_size, stock и minimum) |
| Category 12 not found | Категория не найдена |
| Supplier not found or access denied | Поставщик не найден или удален |
| Alternative_sku is not an array | alternative_sku передан не массивом |
| SKU must be from 1 to 50 characters for alternative_sku 0 | Альтернативный артикул пустой или длиннее 50 символов (в конце номер строки с 0) |
| Label must not exceed 100 characters for alternative_sku 0 | Подпись альтернативного артикула длиннее 100 символов |

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