Товары приходов
Строки приходов и инструменты их заполнения: импорт из Excel (простой и полный с созданием номенклатуры) и распознавание фото накладной через AI. Импорт только разбирает файл и возвращает строки для формы прихода.
| Метод | Адрес | Назначение |
|---|---|---|
| POST | /company/trade/purchase-product/import | Импорт товаров из Excel |
| POST | /company/trade/purchase-product/full-import | Полный импорт из Excel |
| POST | /company/trade/purchase-product/ai-import | Распознать накладную по фото |
| GET | /company/trade/purchase-product/download-example | Шаблон для импорта |
| GET | /company/trade/purchase-product/download-full-example | Шаблон полного импорта |
| GET | /company/trade/purchase-product | Список товаров приходов |
| GET | /company/trade/purchase-product/{model} | Строка прихода |
Импорт товаров из Excel
/company/trade/purchase-product/importРазбирает файл по шаблону (до 500 строк): товар ищется по полному названию, для каждой строки проверяются количество, приходная цена и наценка (процент или сумма). Возвращает products для формы прихода; ошибки указывают ячейку. Ничего не сохраняет.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
file | file | Да | Файл. Форматы: xlsx. Макс. 1024 КБ |
{
"company_id": 1
}curl -X POST "https://api.wasyt.uz/company/trade/purchase-product/import" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"company_id":1}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
products | object[] | Продукты |
products[].product_id | integer | Продукт |
products[].name | string | Название |
products[].quantity | integer | Количество |
products[].purchase_price | integer | Цена при покупке |
products[].markup_percent | integer | Наценка % |
products[].markup_fixed | integer | Наценка |
{
"products": [
{
"product_id": 3,
"name": "Product 2",
"quantity": 2,
"purchase_price": 1500,
"markup_percent": 15,
"markup_fixed": 0
}
]
}Пример ошибки · 422
{
"message": "Ошибка в ячейке D2 (Изменение значения поля markup percent запрещает присутствие markup fixed.) (and 1 more error)",
"errors": {
"file": [
"Ошибка в ячейке D2 (Изменение значения поля markup percent запрещает присутствие markup fixed.)",
"Ошибка в ячейке E2 (Изменение значения поля markup fixed запрещает присутствие markup percent.)"
]
}
}Полный импорт из Excel
/company/trade/purchase-product/full-importРазбирает файл полного шаблона (до 1000 строк): товар ищется по штрихкоду, затем по названию; недостающие категории, бренды и товары создаются, пустой штрихкод генерируется. Возвращает products для формы прихода — сам приход не создаётся.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
file | file | Да | Файл. Форматы: xlsx. Макс. 1024 КБ |
{
"company_id": 1
}curl -X POST "https://api.wasyt.uz/company/trade/purchase-product/full-import" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"company_id":1}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
products | object[] | Продукты |
products[].product_id | integer | Продукт |
products[].name | string | Название |
products[].category_id | integer | Категория |
products[].category | string | Категория |
products[].brand_id | integer | Бренд |
products[].brand | string | Бренд |
products[].unit_id | integer | Единица измерения |
products[].unit | string | |
products[].barcode | string | Штрих-код |
products[].quantity | integer | Количество |
products[].purchase_price | integer | Цена при покупке |
products[].markup_percent | integer | Наценка % |
products[].markup_fixed | integer | Наценка |
{
"products": [
{
"product_id": 3,
"name": "Product 2",
"category_id": 5,
"category": "Category 1-1-2 ru",
"brand_id": 1,
"brand": "Brand 1",
"unit_id": 2,
"unit": "Unit 2 ru",
"barcode": "0000000000002",
"quantity": 2,
"purchase_price": 1500,
"markup_percent": 15,
"markup_fixed": 0
},
{
"product_id": 90,
"name": "Product 3",
"category_id": 3,
"category": "Category 1-1 ru",
"brand_id": 1,
"brand": "Brand 1",
"unit_id": 50,
"unit": "Шт",
"barcode": "4780000000017",
"quantity": 5,
"purchase_price": 1000,
"markup_percent": 0,
"markup_fixed": 500
}
]
}Пример ошибки · 422
{
"message": "Ошибка в ячейке D2 (Выбранная запись не существует или была удалена)",
"errors": {
"file": [
"Ошибка в ячейке D2 (Выбранная запись не существует или была удалена)"
]
}
}Распознать накладную по фото
/company/trade/purchase-product/ai-importAI читает фото накладной поставщика (jpg/png до 8 МБ) и возвращает products: название, количество, приходную цену и совпавший товар каталога (по штрихкоду или названию). Не найденные строки приходят с product_id = null и matched = false; товары не создаются. Ошибка 400, если позиции не распознаны.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
file | file | Да | Файл. Форматы: jpg, jpeg, png. Макс. 8192 КБ |
{
"company_id": 1
}curl -X POST "https://api.wasyt.uz/company/trade/purchase-product/ai-import" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"company_id":1}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
products | object[] | Продукты |
products[].product_id | integer | Продукт |
products[].name | string | Название |
products[].quantity | integer | Количество |
products[].purchase_price | integer | Цена при покупке |
products[].matched | boolean |
{
"products": [
{
"product_id": 3,
"name": "Product 2",
"quantity": 3,
"purchase_price": 1500,
"matched": true
}
]
}Шаблон для импорта
/company/trade/purchase-product/download-exampleСкачивает пример Excel-файла для простого импорта товаров прихода.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Ответ · 200
Ответ — файл или текст, не JSON.
Шаблон полного импорта
/company/trade/purchase-product/download-full-exampleСкачивает пример Excel-файла для полного импорта с созданием номенклатуры.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Ответ · 200
Ответ — файл или текст, не JSON.
Список товаров приходов
/company/trade/purchase-productСтроки приходов с пагинацией и фильтрами; с format=excel — выгрузка в Excel.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
format | string | Нет | Формат ответа: excel — скачать список файлом Excel вместо JSON (учитывает те же фильтры) |
filter[id] | — | Нет | ID — точное значение |
filter[company_id] | — | Нет | Компания — одно значение или список filter[company_id][] |
filter[purchase_id] | — | Нет | Оприходывание — точное значение |
filter[product_id] | — | Нет | Продукт — точное значение |
filter[quantity] | — | Нет | Количество — диапазон: [0] — от, [1] — до |
filter[actual_quantity] | — | Нет | Фактическое количество — диапазон: [0] — от, [1] — до |
filter[created_at] | — | Нет | Создано — период: [0] — с, [1] — по (Y-m-d) |
filter[product.category_id] | — | Нет | Категория — точное значение (с учётом вложенных) |
filter[product.brand_id] | — | Нет | Бренд — точное значение |
sort[] | — | Нет | Сортировка, - — по убыванию: id, -id |
with[] | — | Нет | Подгрузить связи: company, purchase, purchase.stock, purchase.supplier, product, product.parent, product.category.ancestors, product.brand, product.unit |
page | — | Нет | Номер страницы, с 1 |
page-size | — | Нет | Записей на странице, не больше 50 |
Ответ · 200
Постраничный ответ: записи в data[], пагинация в links и meta.
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
data | object[] | Данные |
data[].id | integer | ID |
data[].company_id | integer | Компания |
data[].purchase_id | integer | Оприходывание |
data[].product_id | integer | Продукт |
data[].purchase_price | number | Цена при покупке |
data[].sale_price | number | Цена при продаже |
data[].quantity | integer | Количество |
data[].actual_quantity | integer | Фактическое количество |
data[].created_at | string | Создано |
data[].updated_at | string | Обновлено |
data[].currency | string | Валюта |
data[].purchase_price_uzs | integer | |
data[].sale_price_uzs | integer | |
data[].purchase_price_usd | number | |
data[].sale_price_usd | number | |
data[].purchase_price_eur | number | |
data[].sale_price_eur | number | |
data[].purchase_price_rub | number | |
data[].sale_price_rub | number |
{
"data": [
{
"id": 120,
"company_id": 1,
"purchase_id": 139,
"product_id": 1,
"purchase_price": 8.5,
"sale_price": 10.12,
"quantity": 1,
"actual_quantity": 0,
"created_at": "2026-09-30 12:54:37",
"updated_at": "2026-09-30 12:54:37",
"currency": "usd",
"purchase_price_uzs": 8500,
"sale_price_uzs": 10120,
"purchase_price_usd": 8.5,
"sale_price_usd": 10.12,
"purchase_price_eur": 8.5,
"sale_price_eur": 10.12,
"purchase_price_rub": 8.5,
"sale_price_rub": 10.12
}
],
"links": {
"first": "https://api.wasyt.uz/company/trade/purchase-product?page=1",
"last": "https://api.wasyt.uz/company/trade/purchase-product?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [],
"path": "https://api.wasyt.uz/company/trade/purchase-product",
"per_page": 50,
"to": 1,
"total": 1
}
}Строка прихода
/company/trade/purchase-product/{model}Одна строка прихода: товар, количество, приходная и продажная цена.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры пути
| Параметр | Описание |
|---|---|
model | ID записи |
Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | integer | ID |
company_id | integer | Компания |
purchase_id | integer | Оприходывание |
product_id | integer | Продукт |
purchase_price | integer | Цена при покупке |
sale_price | integer | Цена при продаже |
quantity | integer | Количество |
actual_quantity | integer | Фактическое количество |
created_at | string | Создано |
updated_at | string | Обновлено |
currency | string | Валюта |
purchase_price_uzs | integer | |
sale_price_uzs | integer | |
purchase_price_usd | integer | |
sale_price_usd | number | |
purchase_price_eur | integer | |
sale_price_eur | number | |
purchase_price_rub | integer | |
sale_price_rub | number |
{
"id": 1,
"company_id": 1,
"purchase_id": 1,
"product_id": 1,
"purchase_price": 1000,
"sale_price": 1100,
"quantity": 1,
"actual_quantity": 1,
"created_at": "2026-09-30 12:47:59",
"updated_at": "2026-09-30 12:47:59",
"currency": "uzs",
"purchase_price_uzs": 1000,
"sale_price_uzs": 1100,
"purchase_price_usd": 1,
"sale_price_usd": 1.1,
"purchase_price_eur": 1,
"sale_price_eur": 1.1,
"purchase_price_rub": 1,
"sale_price_rub": 1.1
}
