Методы для работы с заказами: создание, редактирование, смена статуса и статуса оплаты, удаление и получение заказов.
Все адреса указаны относительно базового https://api.controlata.ru/connect/v1/. Формат запросов и авторизация описаны в статье Обзор API.
Номер заказа и префикс
К номеру заказа Controlata добавляет Префикс для номеров заказов из настроек интеграции. Например, при префиксе A- и "num": "1001" заказ получит номер A-1001, и в ответах методов get_list и get_entry поле num придет уже с префиксом.
Важно: в orders/edit.php передавайте номер без префикса. Если отправить "num": "A-1001", номер станет A-A-1001.
Уникальность номера не проверяется.
Состав заказа
Продукты передаются в массиве products, материалы в массиве materials. У каждой строки три поля:
| Поле | Тип | Описание |
|---|---|---|
| sku | string | Артикул |
| amount | float | Количество |
| total | float | Сумма строки (цена × количество) |
Продукт ищется сначала по основному артикулу, затем по альтернативным. Если артикул не найден, строка пропускается, а в заметки заказа добавляется сообщение вида Product with SKU "A001", amount 2, total 1800 not found in Controlata, check sku.. Заказ создается из найденных строк. Если не найдена ни одна строка, вернется ошибка.
Материалы можно передавать, только если в Настройки → Основные включена Возможность заказа материалов. У материалов нет альтернативных артикулов.
Сумма заказа: сумма строк + delivery_price − discount.
Статусы
| Код | Статус заказа | Код | Статус оплаты |
|---|---|---|---|
| 0 | Новый | 0 | Не оплачен |
| 1 | Упакован | 1 | Частично оплачен |
| 2 | Частично отправлен | 2 | Оплачен |
| 3 | Отправлен | ||
| 4 | Отменен |
Статус 2 приходит в ответах, но установить его через API нельзя.
Статус влияет на остатки. В статусах Упакован и Отправлен продукты и материалы заказа списаны со склада. В статусе Новый списание только запланировано. В статусе Частично отправлен списаны отгруженные строки, остальные запланированы. В статусе Отменен заказ на остатки не влияет.
Создание заказа
POST orders/add.php
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| num | string | Да | Номер заказа без префикса |
| products | array | Да* | Продукты заказа |
| materials | array | Да* | Материалы заказа |
| customer_id | int | Да** | ID существующего покупателя |
| customer_name | string | Да** | Имя нового покупателя. Не учитывается, если передан customer_id |
| products_storage_id | int | Нет | Склад для продуктов. По умолчанию Склад по умолчанию для продуктов в заказах. Старое название поля storage_id тоже работает |
| materials_storage_id | int | Нет | Склад для материалов. По умолчанию Склад по умолчанию для материалов в заказах |
| date_placed | string | Нет | Дата заказа. По умолчанию сегодня |
| date_shipped | string | Нет | Дата отправки |
| delivery_price | float | Нет | Стоимость доставки |
| discount | float | Нет | Скидка суммой, не процентом |
| production | int | Нет | 1: создать производство под заказ |
| notes | string | Нет | Заметки |
* Нужен хотя бы один из массивов: products или materials.
** Нужно одно из полей: customer_id или customer_name.
Новый покупатель создается из полей customer_name и необязательных customer_type, customer_email, customer_phone, customer_address_real, customer_address_legal, customer_inn, customer_kpp, customer_ogrn, customer_agreement, customer_manager_name, customer_manager_post, customer_notes. Значения такие же, как у полей в статье Покупатели.
Заказ создается в статусе из настройки Статус нового заказа по умолчанию (Настройки → Основные) и со статусом оплаты Не оплачен.
При "production": 1 Controlata создает производство «Под заказ <номер>» на складах по умолчанию для производства. Продукты для такого заказа выпускает производство, поэтому products_storage_id не учитывается. Материалы заказа списываются со склада как обычно.
Пример запроса:
{
"num": "1001",
"customer_name": "Петров Иван",
"customer_email": "petrov@example.com",
"delivery_price": 500,
"discount": 100,
"products": [
{
"sku": "A001",
"amount": 2,
"total": 1800
},
{
"sku": "A002",
"amount": 1,
"total": 1000
}
]
}
Пример ответа:
{
"success": true,
"order_id": 456,
"customer_id": 789
}
Редактирование заказа
POST orders/edit.php
Обязательные поля: order_id, num, состав (products или materials) и покупатель (customer_id или customer_name). Остальные поля такие же, как при создании.
Важно: метод перезаписывает заказ целиком. Если поле не передано:
date_placedстанет сегодняшней датойdate_shipped,notesстанут пустымиdelivery_price,discountстанут равны 0productionстанет равен 0, и связанное производство будет удалено- склады останутся прежними
Передавайте customer_id, а не customer_name: с customer_name при каждом редактировании создается новый покупатель.
Статус и статус оплаты при редактировании не меняются.
Пример ответа:
{
"success": true
}
Смена статуса заказа
POST orders/update_status.php
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| order_id | int | Да | ID заказа |
| status | int | Да | Новый статус: 0, 1, 3 или 4 |
| date_shipped | string | Нет | Дата отправки. Учитывается при переходе в статус Отправлен |
Как статус влияет на остатки, описано выше в разделе Статусы. Если перевести заказ из статуса Отправлен или Частично отправлен в Новый, Упакован или Отменен, отгрузки по заказу удаляются. Повторная установка того же статуса ничего не меняет.
Пример ответа:
{
"success": true
}
Смена статуса оплаты
POST orders/update_payment.php
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| order_id | int | Да | ID заказа |
| status | int | Да | Статус оплаты: 0, 1 или 2 |
Пример ответа:
{
"success": true
}
Удаление заказа
POST orders/delete.php
Обязательное поле: order_id.
Заказ удаляется полностью. Отгруженные продукты и материалы возвращаются на склад, связанное производство удаляется.
Получение списка заказов
POST orders/get_list.php
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| date_from | string | Нет | Дата заказа от, включительно |
| date_to | string | Нет | Дата заказа до, включительно |
Заказы приходят от новых к старым, без постраничной разбивки. Используйте date_from и date_to, чтобы ограничить выборку. Состав заказа в списке не передается, его возвращает orders/get_entry.php.
Пример ответа:
{
"success": true,
"orders": [
{
"id": "31591",
"num": "A-103",
"status": "0",
"payment": "0",
"date_placed": "2025-08-09",
"date_shipped": "2025-08-11",
"total": "480000.00",
"subtotal": "480000.00",
"delivery_price": "0.00",
"discount": "0.00",
"cost": "229400.00",
"notes": "",
"amount": "6.000",
"lines": "3",
"shipments_count": "0",
"production": "0",
"production_num": null,
"source": "api",
"products_storage_id": "3998",
"products_storage_name": "Главный",
"materials_storage_id": null,
"materials_storage_name": null,
"customer_id": "4877",
"customer_name": "Михаил Петров",
...
}
]
}
Поля покупателя в списке такие же, как в orders/get_entry.php.
Получение данных заказа
POST orders/get_entry.php
Обязательное поле: order_id.
Строки заказа приходят в двух массивах, products и materials. Поле position сквозное для обоих массивов и задает порядок строк в заказе. Поле amount у заказа равно null, если у строк разные единицы измерения.
Пример ответа:
{
"success": true,
"order": {
"id": "31591",
"num": "A-103",
"status": "0",
"payment": "0",
"date_placed": "2025-08-09",
"date_shipped": "2025-08-11",
"subtotal": "480000.00",
"delivery_price": "0.00",
"discount": "0.00",
"total": "480000.00",
"cost": "229400.00",
"notes": "",
"amount": "6.000",
"lines": "3",
"source": "api",
"production": "0",
"production_num": null,
"customer_id": "4877",
"customer_type": "3",
"customer_name": "Михаил Петров",
"customer_email": "petrov@example.com",
"customer_phone": "",
"customer_address_real": "",
"customer_address_legal": "",
"customer_inn": "",
"customer_kpp": "",
"customer_ogrn": "",
"customer_agreement": "",
"customer_manager_name": "",
"customer_manager_post": "",
"customer_notes": "",
"products_storage_id": "3998",
"products_storage_name": "Главный",
"materials_storage_id": null,
"materials_storage_name": null,
"products": [
{
"id": "48390",
"sku": "F003",
"name": "Стул обеденный дубовый",
"amount": "4",
"unit": "шт",
"total": "180000",
"price": "45000",
"cost": "99520",
"position": "0"
}
],
"materials": []
}
}
Поля storage_id и storage_name тоже приходят в ответе и повторяют products_storage_id и products_storage_name. Они оставлены для совместимости, в новом коде используйте products_storage_id.
Ошибки
| Ошибка | Причина |
|---|---|
| No num in input | Не передано обязательное поле (вместо num будет имя поля) |
| No products or materials in input | Нет ни продуктов, ни материалов |
| Products is not an array | products передан не массивом (так же для materials) |
| SKU not set for product 0 | У строки нет артикула (так же Amount not set, Total not set) |
| All products have wrong SKU | Ни один артикул не найден |
| Materials in orders are disabled in company settings | Переданы материалы, но заказ материалов выключен в настройках |
| No customer_name or customer_id in input | Не указан покупатель |
| Customer not found | Покупатель с таким customer_id не найден |
| Storage ID not found | Склад с таким ID не найден |
| Date is not a valid date in format YYYY-MM-DD | Неверный формат даты |
| Order not found or access denied | Заказ с таким ID не найден |
| Invalid status value. Must be one of: 0, 1, 3, 4 | Неверный статус заказа |
| Invalid payment status value. Must be one of: 0, 1, 2 | Неверный статус оплаты |