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

```
v1/purchases/edit.php
```

## Параметры

| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| purchase_id | int | Да | ID поставки |
| supplier_id | int | Нет | ID поставщика |
| supplier_name | string | Нет | Имя поставщика и поля supplier_* |
| materials | array | Нет | Строки материалов. Заменяют текущие строки целиком |
| products | array | Нет | Строки продуктов. Заменяют текущие строки целиком |
| date_placed | string | Нет | Дата заказа поставки |
| date_received | string | Нет | Дата получения. Пустая строка очищает ее |
| materials_storage_id | int | Нет | Склад материалов |
| products_storage_id | int | Нет | Склад продуктов |
| delivery_price | float | Нет | Стоимость доставки |
| discount | float | Нет | Скидка |
| notes | string | Нет | Заметки |

Статус и статус оплаты этим методом не меняются, для них есть [v1/purchases/update_status](https://developers.controlata.ru/hc/api-docs/articles/purchases-update-status) и [v1/purchases/update_payment](https://developers.controlata.ru/hc/api-docs/articles/purchases-update-payment).

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

* **Строки.** Если передан materials или products, состав заменяется целиком, а непереданный массив считается пустым. Строки из ответа [v1/purchases/get_entry](https://developers.controlata.ru/hc/api-docs/articles/purchases-get-entry) можно отправить обратно без изменений.
* **Строки не переданы.** Controlata восстанавливает суммы строк такими, какими их ввели, до распределения доставки и скидки. Поэтому, если изменить только delivery_price или discount, суммы строк останутся прежними, а себестоимость строк распределится заново.
* **Скидка на всю сумму.** Если итог поставки равен 0 (скидка равна сумме строк и доставке), исходные суммы строк восстановить нельзя. Тогда передайте materials и products явно, иначе запрос будет отклонен.
* **Цены.** Цены материалов и себестоимость продуктов без состава обновляются только по строкам, у которых изменились количество, сумма или себестоимость. Изменение доставки или скидки меняет себестоимость всех строк, поэтому обновит цены всех позиций поставки.
* **Поставщик.** Без supplier_id и supplier_name поставщик остается прежним. supplier_name с тем же именем, что у текущего поставщика, не создает дубль. Другое имя создает нового поставщика. Текущего поставщика можно передать по supplier_id, даже если он уже удален.
* **Склады.** При смене склада поступление переносится на новый склад, остатки пересчитываются на обоих складах.
* **Статус сохраняется.** Если поставка уже получена, новые строки сразу поступают на склад. Если поставка получалась частями, изменение количества сначала затрагивает неполученную часть.

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

Изменить стоимость доставки, не передавая строки:

```
{
    "purchase_id": 29645,
    "delivery_price": 3000
}
```

Суммы строк останутся 26000 и 4000, а себестоимость станет 28600 и 4400. Цены материалов обновятся по новой себестоимости.

Заменить состав поставки:

```
{
    "purchase_id": 29645,
    "materials": [
        {
            "sku": "M010",
            "amount": 0.25,
            "total": 32500
        }
    ]
}
```

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

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

## Ошибки

| Ошибка | Причина |
|---|---|
| No purchase_id in input | Не передан purchase_id |
| Purchase not found or access denied | Поставка не найдена или удалена |
| The purchase total is 0, so line totals cannot be restored. Pass materials and products explicitly | Итог поставки равен 0, а строки не переданы |
| Storage ID is not set | Передан пустой склад |
| Storage ID not found | Склад не найден или удален |
| Date is not a valid date in format YYYY-MM-DD | Неверная дата. Пустая date_placed тоже отклоняется |
| Materials is not an array | materials не массив (так же для products) |
| No products or materials in input | Переданы пустые materials и products |
| Material with SKU "M010" not found | Позиция не найдена или удалена |
| Supplier not found or access denied | Поставщик supplier_id не найден или удален |
| Supplier name must not be empty | Пустое supplier_name |
| Invalid supplier_type value. Must be one of: 1, 2, 3 | Неверный тип нового поставщика |

Остальные ошибки в строках те же, что в [v1/purchases/add](https://developers.controlata.ru/hc/api-docs/articles/purchases-add).
