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

```
v1/orders/edit.php
```

## Параметры

| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| order_id | int | Да | ID заказа |
| num | string | Нет | Номер заказа без префикса |
| products | array | Нет | Строки продуктов. Заменяют текущие строки целиком |
| materials | array | Нет | Строки материалов. Заменяют текущие строки целиком |
| customer_id | int | Нет | ID покупателя |
| customer_name | string | Нет | Имя покупателя и поля customer_* |
| date_placed | string | Нет | Дата заказа |
| date_shipped | string | Нет | Дата отправки. Пустая строка очищает ее |
| products_storage_id | int | Нет | Склад продуктов. Принимается и старое имя storage_id |
| materials_storage_id | int | Нет | Склад материалов |
| production | int | Нет | 1 включает производство под заказ, 0 выключает |
| delivery_price | float | Нет | Стоимость доставки |
| discount | float | Нет | Скидка |
| notes | string | Нет | Заметки |

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

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

* **Строки.** Если передан products или materials, состав заменяется целиком, а непереданный массив считается пустым. Если не передан ни один, строки остаются прежними. Строки из ответа [v1/orders/get_entry](https://developers.controlata.ru/hc/api-docs/articles/orders-get-entry) можно отправить обратно без изменений.
* **Номер.** Передавайте num без префикса: Controlata добавит текущий префикс подключения. Если num не передан, номер не меняется.
* **Покупатель.** Без customer_id и customer_name покупатель остается прежним. customer_name с тем же именем, что у текущего покупателя, не создает дубль. Другое имя создает нового покупателя. Текущего покупателя можно передать по customer_id, даже если он уже удален.
* **Заметки.** Если переданы строки, а notes нет, сообщения о ненайденных позициях дописываются к текущим заметкам. Одно и то же сообщение повторно не дописывается.
* **Склады.** При смене склада списание переносится на новый склад, остатки пересчитываются на обоих складах.
* **Производство под заказ.** production со значением 1 создает связанное производство, если его еще нет, а у заказа с производством состав производства обновляется вслед за строками. Значение 0 удаляет производство, и продукты списываются со склада продуктов. Без production способ выполнения не меняется.
* **Статус сохраняется.** Если заказ уже упакован или отправлен, новые строки сразу списываются со склада. Если заказ отправлялся частями, изменение количества сначала затрагивает неотправленную часть.
* **Даты.** Пустой date_placed заменяется сегодняшней датой. Движения по складу датируются датой отправки, а без нее датой заказа.

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

Добавить скидку и изменить заметки, не трогая строки и покупателя:

```
{
    "order_id": 43727,
    "discount": 1500,
    "notes": "Скидка по промокоду"
}
```

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

```
{
    "order_id": 43727,
    "products": [
        {
            "sku": "P001",
            "amount": 3,
            "total": 39000
        }
    ]
}
```

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

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

## Ошибки

| Ошибка | Причина |
|---|---|
| No order_id in input | Не передан order_id |
| Order not found or access denied | Заказ не найден или удален |
| Products is not an array | products не массив (так же для materials) |
| No products or materials in input | Переданы пустые products и materials |
| Materials in orders are disabled in company settings | Переданы материалы, а настройка **Возможность заказа материалов** выключена |
| All products have wrong SKU or id | Не найдена ни одна строка (с материалами «All products and materials have wrong SKU or id») |
| Storage ID is not set | Передан пустой склад |
| Storage ID not found | Склад не найден или удален |
| Date is not a valid date in format YYYY-MM-DD | Неверная дата |
| Customer not found | Покупатель customer_id не найден или удален |
| Customer name must not be empty | Пустое customer_name |
| Invalid customer_type value. Must be one of: 1, 2, 3 | Неверный тип нового покупателя |

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