Updates a sale. Only the fields you pass are changed, the rest stay as they were.

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

## Parameters

| Field | Type | Required | Description |
|---|---|---|---|
| order_id | int | Yes | Sale ID |
| num | string | No | Sale number without the prefix |
| products | array | No | Product lines. Replace the current lines as a whole |
| materials | array | No | Material lines. Replace the current lines as a whole |
| customer_id | int | No | Customer ID |
| customer_name | string | No | Customer name and the customer_ fields |
| date_placed | string | No | Sale date |
| date_shipped | string | No | Shipping date. An empty string clears it |
| products_storage_id | int | No | Products storage location |
| materials_storage_id | int | No | Materials storage location |
| production | int | No | 1 turns on made-to-order production, 0 turns it off |
| delivery_price | float | No | Delivery cost |
| discount | float | No | Discount |
| notes | string | No | Notes |

The status and the payment status are not changed by this method; use [v1/orders/update_status](https://developers.controlata.com/hc/api-docs/articles/api-orders-update-status) and [v1/orders/update_payment](https://developers.controlata.com/hc/api-docs/articles/api-orders-update-payment).

## Sale lines

Lines are passed as the products and materials arrays. If at least one of the arrays is passed, the lines are replaced as a whole, and the array that is not passed is treated as empty. If neither is passed, the lines are unchanged.

| Field | Type | Required | Description |
|---|---|---|---|
| id | int | id or sku | Product or material ID |
| sku | string | id or sku | SKU. A product is also matched by its alternative SKUs |
| amount | float | Yes | Quantity |
| total | float | Yes | Line total (not the price per unit) |

The lines from the [v1/orders/get_entry](https://developers.controlata.com/hc/api-docs/articles/api-orders-get-entry) response can be sent back unchanged.

## Example request

Add a discount and change the notes without touching the lines or the customer:

```
{
    "order_id": 43727,
    "discount": 1500,
    "notes": "Discount by promo code"
}
```

Replace the sale's lines:

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

## Example response

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

## Errors

| Error | Reason |
|---|---|
| No order_id in input | order_id is missing |
| Order not found or access denied | Sale not found or deleted |
| Products is not an array | products is not an array (same for materials) |
| No products or materials in input | Empty products and materials were passed |
| Materials in orders are disabled in company settings | Materials were passed, but the **Enable ordering materials** setting is off |
| All products have wrong SKU or id | No line was found (with materials, "All products and materials have wrong SKU or id") |
| Storage ID is not set | An empty storage location was passed |
| Storage ID not found | Storage location not found or deleted |
| Date is not a valid date in format YYYY-MM-DD | Invalid date |
| Invalid delivery_price value. Must be a number, 0 or greater | Delivery cost is not a number or below 0 |
| Invalid discount value. Must be a number, 0 or greater | Discount is not a number or below 0 |
| Customer not found | The customer_id customer was not found or is deleted |
| Customer name must not be empty | Empty customer_name |

Errors in individual lines (no amount or total, invalid quantity) are the same as in [v1/orders/add](https://developers.controlata.com/hc/api-docs/articles/api-orders-add).
