Продажи
Чеки прямой продажи на кассе: создание, список, возвраты, обмены и печатные формы. Продажа списывает остаток со склада, проводит оплаты по кассе и начисляет или списывает бонусы клиента.
| Метод | Адрес | Назначение |
|---|---|---|
| PATCH | /company/trade/sale/{model}/return | Вернуть товары по чеку |
| POST | /company/trade/sale/{model}/exchange | Обменять товары по чеку |
| GET | /company/trade/sale/{model}/print | Выгрузить чек в Excel |
| GET | /company/trade/sale/{model}/invoice | Накладная A4 |
| GET | /company/trade/sale/{model}/check-detail | Карточка чека |
| GET | /company/trade/sale/{model}/credit-detail | Данные кредитного договора |
| GET | /company/trade/sale | Список продаж |
| GET | /company/trade/sale/{model} | Детали продажи |
| POST | /company/trade/sale | Создать продажу |
Вернуть товары по чеку
/company/trade/sale/{model}/returnВозвращает строки чека (не больше проданного за вычетом уже возвращённого) и выплачивает деньги по transactions; товары возвращаются на склад. Если по чеку есть долг, стоимость возврата сначала гасит долг, и выплачивается только остаток. Комплект возвращается только целиком; бонусами и в долг деньги не возвращаются.
Из формы (
multipart/form-data) методPATCHотправляется какPOSTс параметром?_method=PATCH.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры пути
| Параметр | Описание |
|---|---|
model | ID записи |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
products | object[] | Нет | Продукты. Макс. 100 элементов |
products[].id | integer | Да | ID. Без повторов |
products[].reason_type | string | Да | Тип причины. Допустимые значения: defective, size_not_fit, expired_date, not_match |
products[].returned_quantity | number | Да | Возвращённое количество. До 8 знаков после запятой. Не меньше 0.00000001 |
products[].comment | string | Нет | Комментарий. Макс. 1000 символов |
transactions | object[] | Нет | Транзакции. Макс. 10 элементов |
transactions[].payment_type | string | Да | Тип оплаты. Допустимые значения: bank, card, cash |
transactions[].payment_type_id | integer | Нет | Тип оплаты |
transactions[].amount | number | Да | Сумма. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99 |
{
"products": [
{
"id": 253,
"returned_quantity": 1,
"reason_type": "defective"
},
{
"id": 254,
"returned_quantity": 0.7,
"reason_type": "defective"
},
{
"id": 255,
"returned_quantity": 0.3,
"reason_type": "defective"
}
],
"transactions": [
{
"payment_type": "cash",
"amount": 3000
}
]
}curl -X PATCH "https://api.wasyt.uz/company/trade/sale/214/return" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"products":[{"id":253,"returned_quantity":1,"reason_type":"defective"},{"id":254,"returned_quantity":0.7,"reason_type":"defective"},{"id":255,"returned_quantity":0.3,"reason_type":"defective"}],"transactions":[{"payment_type":"cash","amount":3000}]}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | integer | ID |
creator_id | integer | Создатель |
company_id | integer | Компания |
cashbox_id | integer | Касса |
stock_id | integer | Склад |
client_id | null | Клиент |
exchange_of_sale_id | null | |
currency | string | Валюта |
purchased_amount | integer | |
sold_amount | integer | Сумма в продаже |
returned_amount | integer | Возвращённая сумма |
status | string | Статус |
source_type | string | Источник |
source_data | array | |
code | string | Код |
created_at | string | Создано |
updated_at | string | Обновлено |
{
"id": 214,
"creator_id": 2,
"company_id": 1,
"cashbox_id": 2,
"stock_id": 1,
"client_id": null,
"exchange_of_sale_id": null,
"currency": "uzs",
"purchased_amount": 2061000,
"sold_amount": 3000,
"returned_amount": 3000,
"status": "full_returned",
"source_type": "wasyt",
"source_data": [],
"code": "#300926001",
"created_at": "2026-09-30 12:55:03",
"updated_at": "2026-09-30 12:55:03"
}Пример ошибки · 422
{
"message": "Значение поля Сумма не может быть больше 2000.",
"errors": {
"transactions": [
"Значение поля Сумма не может быть больше 2000."
]
}
}Обменять товары по чеку
/company/trade/sale/{model}/exchangeВозвращает выбранные строки исходного чека и создаёт новую продажу на товары и комплекты взамен. Разница оплачивается transactions ровно на её сумму: доплата покупателя — приход по новой продаже (можно в долг с клиентом и due_date), переплата — выплата по исходному чеку; при равном обмене операций нет. Возвращает original_sale и exchange_sale.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры пути
| Параметр | Описание |
|---|---|
model | ID записи |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
cashbox_id | integer | Да | Касса. ID существующей записи |
stock_id | integer | Да | Склад. ID существующей записи |
currency | string | Да | Валюта |
client_id | integer | Нет | Клиент |
company_id | integer | Да | Компания |
returned_products | object[] | Да | Мин. 1 элементов. Макс. 100 элементов |
returned_products[].id | integer | Да | ID. Без повторов |
returned_products[].reason_type | string | Да | Тип причины. Допустимые значения: defective, size_not_fit, expired_date, not_match |
returned_products[].returned_quantity | number | Да | Возвращённое кол-во. До 8 знаков после запятой. Не меньше 0.00000001 |
returned_products[].comment | string | Нет | Комментарий. Макс. 1000 символов |
products | object[] | Нет | Продукты. Макс. 100 элементов |
products[].product_id | integer | Да | Продукт. Без повторов |
products[].sold_quantity | number | Да | Проданное количество. До 8 знаков после запятой. Не меньше 0.00000001 |
products[].discount | number | Нет | Скидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99 |
products[].price | number | Нет | Цена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99 |
bundles | object[] | Нет | Комплекты. Макс. 100 элементов |
bundles[].bundle_id | integer | Да | Комплект |
bundles[].quantity | integer | Нет | Количество. Не меньше 1. Не больше 1000 |
bundles[].discount | number | Нет | Скидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99 |
bundles[].price | number | Нет | Цена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99 |
due_date | string (date) | Нет | Срок погашения. Не раньше сегодняшнего дня |
comment | string | Нет | Комментарий. Макс. 1000 символов |
transactions | object[] | Нет | Транзакции. Макс. 10 элементов |
transactions[].payment_type | string | Да | Тип оплаты. Без повторов. Допустимые значения: cash, card, bank, debt |
transactions[].amount | number | Да | Сумма. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99 |
{
"company_id": 1,
"cashbox_id": 2,
"stock_id": 1,
"currency": "uzs",
"client_id": 1,
"due_date": "2030-12-31",
"comment": "Exchange surcharge on credit",
"returned_products": [
{
"id": 1,
"reason_type": "defective",
"returned_quantity": 1
}
],
"products": [
{
"product_id": 1,
"sold_quantity": 1
}
],
"transactions": [
{
"payment_type": "debt",
"amount": 200
}
]
}curl -X POST "https://api.wasyt.uz/company/trade/sale/1/exchange" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"company_id":1,"cashbox_id":2,"stock_id":1,"currency":"uzs","client_id":1,"due_date":"2030-12-31","comment":"Exchange surcharge on credit","returned_products":[{"id":1,"reason_type":"defective","returned_quantity":1}],"products":[{"product_id":1,"sold_quantity":1}],"transactions":[{"payment_type":"debt","amount":200}]}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
original_sale | object | |
original_sale.id | integer | ID |
original_sale.creator_id | integer | Создатель |
original_sale.company_id | integer | Компания |
original_sale.cashbox_id | integer | Касса |
original_sale.stock_id | integer | Склад |
original_sale.client_id | integer | Клиент |
original_sale.exchange_of_sale_id | null | |
original_sale.currency | string | Валюта |
original_sale.purchased_amount | integer | |
original_sale.sold_amount | integer | Сумма в продаже |
original_sale.returned_amount | integer | Возвращённая сумма |
original_sale.status | string | Статус |
original_sale.source_type | string | Источник |
original_sale.source_data | array | |
original_sale.code | string | Код |
original_sale.created_at | string | Создано |
original_sale.updated_at | string | Обновлено |
exchange_sale | object | |
exchange_sale.company_id | integer | Компания |
exchange_sale.cashbox_id | integer | Касса |
exchange_sale.stock_id | integer | Склад |
exchange_sale.currency | string | Валюта |
exchange_sale.client_id | integer | Клиент |
exchange_sale.exchange_of_sale_id | integer | |
exchange_sale.status | string | Статус |
exchange_sale.source_type | string | Источник |
exchange_sale.source_data | object | |
exchange_sale.source_data.exchange_key | string | |
exchange_sale.updated_at | string | Обновлено |
exchange_sale.created_at | string | Создано |
exchange_sale.creator_id | integer | Создатель |
exchange_sale.code | string | Код |
exchange_sale.id | integer | ID |
exchange_sale.purchased_amount | integer | |
exchange_sale.sold_amount | integer | Сумма в продаже |
exchange_sale.returned_amount | integer | Возвращённая сумма |
{
"original_sale": {
"id": 1,
"creator_id": 2,
"company_id": 1,
"cashbox_id": 1,
"stock_id": 1,
"client_id": 1,
"exchange_of_sale_id": null,
"currency": "uzs",
"purchased_amount": 500,
"sold_amount": 4900,
"returned_amount": 0,
"status": "completed",
"source_type": "wasyt",
"source_data": [],
"code": "w-1-1",
"created_at": "2020-01-01 10:00:00",
"updated_at": "2026-09-30 12:55:21"
},
"exchange_sale": {
"company_id": 1,
"cashbox_id": 2,
"stock_id": 1,
"currency": "uzs",
"client_id": 1,
"exchange_of_sale_id": 1,
"status": "completed",
"source_type": "wasyt",
"source_data": {
"exchange_key": "52f80baa-6e14-4ef3-8da3-dfced18a1bac"
},
"updated_at": "2026-09-30 12:55:21",
"created_at": "2026-09-30 12:55:21",
"creator_id": 2,
"code": "#300926001",
"id": 249,
"purchased_amount": 1000,
"sold_amount": 200,
"returned_amount": 0
}
}Пример ошибки · 422
{
"message": "Укажите срок погашения долга",
"errors": {
"due_date": [
"Укажите срок погашения долга"
]
}
}Выгрузить чек в Excel
/company/trade/sale/{model}/printСкачивает Excel-файл со строками одного чека в порядке их добавления.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры пути
| Параметр | Описание |
|---|---|
model | ID записи |
Ответ · 200
Ответ — файл или текст, не JSON.
Накладная A4
/company/trade/sale/{model}/invoiceДанные накладной A4 по чеку для предпросмотра печати; с format=excel — готовый к печати лист Excel из тех же данных.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры пути
| Параметр | Описание |
|---|---|
model | ID записи |
Параметры запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
format | string | Нет | Формат ответа: excel — скачать печатный лист вместо JSON |
Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
sale | object | |
sale.id | integer | ID |
sale.code | string | Код |
sale.currency | string | Валюта |
sale.created_at | string | Создано |
sale.date | string | Дата |
sale.time | string | |
settings | object | Настройки |
settings.header | object | |
settings.header.store_name | boolean | |
settings.header.working_hours | boolean | |
settings.header.cashier | boolean | |
settings.header.contacts | boolean | |
settings.header.legal_name | boolean | |
settings.header.client_phone | boolean | |
settings.header.date | boolean | Дата |
settings.header.seller | boolean | |
settings.header.client | boolean | |
settings.header.tin | boolean | |
settings.header.address | boolean | Адрес |
settings.working_hours | null | |
settings.balance | object | Баланс |
settings.balance.enabled | boolean | |
settings.balance.before | boolean | |
settings.balance.added | boolean | |
settings.balance.written_off | boolean | |
settings.balance.after | boolean | |
settings.debt | object | Долг |
settings.debt.enabled | boolean | |
settings.debt.before | boolean | |
settings.debt.added | boolean | |
settings.debt.written_off | boolean | |
settings.debt.after | boolean | |
company | object | Компания |
company.name | string | Название |
company.legal_name | string | |
company.tin | string | |
company.address | string | Адрес |
company.phone | string | Телефон |
client | object | |
client.id | integer | ID |
client.full_name | string | ФИО |
client.phone | string | Телефон |
cashier | object | |
cashier.full_name | string | ФИО |
cashier.is_director | boolean | |
creator | object | |
creator.full_name | string | ФИО |
rows | object[] | |
rows[].position | integer | Должность |
rows[].category | string | Категория |
rows[].name | string | Название |
rows[].quantity | integer | Количество |
rows[].price | integer | Цена |
rows[].amount | integer | Сумма |
rows[].amount_uzs | integer | |
rows[].amount_usd | null | |
totals | object | |
totals.quantity | integer | Количество |
totals.current | object | |
totals.current.uzs | integer | |
totals.current.usd | integer | |
totals.previous_debt | object | |
totals.previous_debt.uzs | integer | |
totals.previous_debt.usd | integer | |
totals.total | object | Всего записей |
totals.total.uzs | integer | |
totals.total.usd | integer | |
balance | object | Баланс |
balance.before | integer | |
balance.added | integer | |
balance.written_off | integer | |
balance.after | integer | |
debt | object | Долг |
debt.before | integer | |
debt.added | integer | |
debt.written_off | integer | |
debt.after | integer |
{
"sale": {
"id": 255,
"code": "inv-credit",
"currency": "uzs",
"created_at": "2026-09-30 12:55:27",
"date": "30.09.2026",
"time": "12:55:27"
},
"settings": {
"header": {
"store_name": false,
"working_hours": false,
"cashier": false,
"contacts": false,
"legal_name": false,
"client_phone": false,
"date": false,
"seller": false,
"client": false,
"tin": false,
"address": false
},
"working_hours": null,
"balance": {
"enabled": false,
"before": true,
"added": true,
"written_off": true,
"after": true
},
"debt": {
"enabled": true,
"before": true,
"added": true,
"written_off": true,
"after": true
}
},
"company": {
"name": "Company 1",
"legal_name": "Company 1",
"tin": "000000001",
"address": "Address 1",
"phone": "998000000001"
},
"client": {
"id": 1,
"full_name": "Full name 1",
"phone": "998000000001"
},
"cashier": {
"full_name": "director_1@local.host",
"is_director": true
},
"creator": {
"full_name": "director_1@local.host"
},
"rows": [
{
"position": 1,
"category": "Category 1-1-1 ru",
"name": "Product 1",
"quantity": 1,
"price": 900,
"amount": 900,
"amount_uzs": 900,
"amount_usd": null
},
{
"position": 2,
"category": "Category 1-1-1 ru",
"name": "Product 1-1",
"quantity": 2,
"price": 2000,
"amount": 4000,
"amount_uzs": 4000,
"amount_usd": null
}
],
"totals": {
"quantity": 3,
"current": {
"uzs": 4900,
"usd": 0
},
"previous_debt": {
"uzs": 4000,
"usd": 0
},
"total": {
"uzs": 8900,
"usd": 0
}
},
"balance": {
"before": 1000,
"added": 0,
"written_off": 0,
"after": 1000
},
"debt": {
"before": 4000,
"added": 4900,
"written_off": 0,
"after": 8900
}
}Карточка чека
/company/trade/sale/{model}/check-detailВся история чека: товары, оплаты, все возвраты и обмены и итоговая стоимость. Новая продажа, созданная обменом, открывает карточку исходного чека.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры пути
| Параметр | Описание |
|---|---|
model | ID записи |
Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
sale | object | |
sale.id | integer | ID |
sale.code | string | Код |
sale.created_at | string | Создано |
sale.currency | string | Валюта |
sale.status | string | Статус |
sale.has_exchange | boolean | |
sale.products_count | integer | |
sale.payment_types | array | |
sale.cashier_name | string | |
products | object[] | Продукты |
products[].id | integer | ID |
products[].position | integer | Должность |
products[].sale_id | integer | Продажа |
products[].product_id | integer | Продукт |
products[].service_id | null | |
products[].bundle_id | null | Комплект |
products[].bundle_key | null | |
products[].bundle_name | null | |
products[].name | string | Название |
products[].brand_name | string | Бренд |
products[].image | string | Изображение |
products[].quantity | integer | Количество |
products[].unit | object | |
products[].unit.id | integer | ID |
products[].unit.name | object | Название |
products[].unit.name.oz | string | |
products[].unit.name.ru | string | |
products[].unit.name.uz | string | |
products[].unit.accuracy | integer | Кол-во знаков после запятой |
products[].price | integer | Цена |
products[].discount | integer | Скидка |
products[].amount | integer | Сумма |
products[].is_exchanged | boolean | |
products[].is_returned | boolean | |
products[].is_partially_returned | boolean | |
products[].returned_quantity | integer | Возвращённое кол-во |
operations | object[] | |
operations[].type | string | Тип |
operations[].subtype | string | |
operations[].title | string | |
operations[].created_at | string | Создано |
operations[].creator_name | string | |
operations[].amount | integer | Сумма |
operations[].comment | string | Комментарий |
operations[].payment_types | array | |
operations[].refund_amount | integer | |
operations[].lines | object[] | |
operations[].lines[].sale_product_id | integer | |
operations[].lines[].product_id | integer | Продукт |
operations[].lines[].service_id | null | |
operations[].lines[].bundle_id | null | Комплект |
operations[].lines[].bundle_key | null | |
operations[].lines[].bundle_name | null | |
operations[].lines[].name | string | Название |
operations[].lines[].brand_name | string | Бренд |
operations[].lines[].quantity | integer | Количество |
operations[].lines[].unit | object | |
operations[].lines[].unit.id | integer | ID |
operations[].lines[].unit.name | object | Название |
operations[].lines[].unit.name.oz | string | |
operations[].lines[].unit.name.ru | string | |
operations[].lines[].unit.name.uz | string | |
operations[].lines[].unit.accuracy | integer | Кол-во знаков после запятой |
operations[].lines[].amount | integer | Сумма |
operations[].lines[].reason_type | string | Тип причины |
operations[].lines[].comment | string | Комментарий |
operations[].lines[].sign | string | |
payments | object[] | |
payments[].id | integer | ID |
payments[].payment_type | string | Тип оплаты |
payments[].amount | integer | Сумма |
payments[].created_at | string | Создано |
payments[].comment | null | Комментарий |
totals | object | |
totals.paid_amount | integer | |
totals.bonus_paid_amount | integer | |
totals.bonus_accrued_amount | integer | |
totals.returned_amount | integer | Возвращённая сумма |
totals.total_amount | integer | |
totals.currency | string | Валюта |
{
"sale": {
"id": 177,
"code": "phf-partial",
"created_at": "2026-09-28 12:54:52",
"currency": "uzs",
"status": "partial_returned",
"has_exchange": false,
"products_count": 2,
"payment_types": [
"cash",
"card"
],
"cashier_name": "director_1@local.host"
},
"products": [
{
"id": 195,
"position": 1,
"sale_id": 177,
"product_id": 1,
"service_id": null,
"bundle_id": null,
"bundle_key": null,
"bundle_name": null,
"name": "Product 1",
"brand_name": "Brand 1",
"image": "https://api-minio.icangroup.uz/wasyt/test_data/images/1.png",
"quantity": 1,
"unit": {
"id": 1,
"name": {
"oz": "Unit 1 oz",
"ru": "Unit 1 ru",
"uz": "Unit 1 uz"
},
"accuracy": 4
},
"price": 5292000,
"discount": 0,
"amount": 5292000,
"is_exchanged": false,
"is_returned": false,
"is_partially_returned": false,
"returned_quantity": 0
},
{
"id": 196,
"position": 2,
"sale_id": 177,
"product_id": 2,
"service_id": null,
"bundle_id": null,
"bundle_key": null,
"bundle_name": null,
"name": "Product 1-1",
"brand_name": "Brand 1",
"image": "https://api-minio.icangroup.uz/wasyt/test_data/images/1.png",
"quantity": 1,
"unit": {
"id": 1,
"name": {
"oz": "Unit 1 oz",
"ru": "Unit 1 ru",
"uz": "Unit 1 uz"
},
"accuracy": 4
},
"price": 756000,
"discount": 0,
"amount": 756000,
"is_exchanged": false,
"is_returned": true,
"is_partially_returned": false,
"returned_quantity": 1
}
],
"operations": [
{
"type": "return",
"subtype": "partial_return",
"title": "Частичный возврат",
"created_at": "2026-09-29 12:54:52",
"creator_name": "director_1@local.host",
"amount": -756000,
"comment": "Клиент взял лишнее",
"payment_types": [
"cash"
],
"refund_amount": 756000,
"lines": [
{
"sale_product_id": 196,
"product_id": 2,
"service_id": null,
"bundle_id": null,
"bundle_key": null,
"bundle_name": null,
"name": "Product 1-1",
"brand_name": "Brand 1",
"quantity": 1,
"unit": {
"id": 1,
"name": {
"oz": "Unit 1 oz",
"ru": "Unit 1 ru",
"uz": "Unit 1 uz"
},
"accuracy": 4
},
"amount": 756000,
"reason_type": "not_match",
"comment": "Клиент взял лишнее",
"sign": "-"
}
]
}
],
"payments": [
{
"id": 59,
"payment_type": "cash",
"amount": 3500000,
"created_at": "2026-09-28 12:54:52",
"comment": null
},
{
"id": 60,
"payment_type": "card",
"amount": 2048000,
"created_at": "2026-09-28 12:54:52",
"comment": null
}
],
"totals": {
"paid_amount": 6048000,
"bonus_paid_amount": 500000,
"bonus_accrued_amount": 60480,
"returned_amount": 756000,
"total_amount": 5292000,
"currency": "uzs"
}
}Данные кредитного договора
/company/trade/sale/{model}/credit-detailКарточка договора из кредитного проекта ICAN по кредитному чеку, читается онлайн и возвращается без изменений. Ошибка 400, если у чека нет кредита или проект недоступен.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры пути
| Параметр | Описание |
|---|---|
model | ID записи |
Ответ
Пример ответа пока не записан тестами.
Список продаж
/company/trade/saleЧеки с пагинацией и фильтрами; с format=excel — выгрузка в Excel. show[]=external_credit_payments подмешивает в ленту платежи ICAN по внешним кредитам, у которых нет своего чека.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
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[creator_id] | — | Нет | Создатель — точное значение |
filter[company_id] | — | Нет | Компания — одно значение или список filter[company_id][] |
filter[cashbox_id] | — | Нет | Касса — точное значение |
filter[stock_id] | — | Нет | Склад — точное значение |
filter[client_id] | — | Нет | Клиент — точное значение |
filter[currency] | — | Нет | Валюта — точное значение |
filter[status] | — | Нет | Статус — одно значение или список filter[status][] |
filter[source_type] | — | Нет | Источник — точное значение |
filter[code] | — | Нет | Код — точное значение |
filter[created_at] | — | Нет | Создано — период: [0] — с, [1] — по (Y-m-d) |
filter[products.product.category_id] | — | Нет | Категория — точное значение (с учётом вложенных) |
filter[products.product.brand_id] | — | Нет | Бренд — точное значение |
filter[transactions.payment_type] | — | Нет | Тип оплаты — точное значение |
sort[] | — | Нет | Сортировка, - — по убыванию: id, -id |
with[] | — | Нет | Подгрузить связи: creator.profile, company, cashbox, stock, client, transactions, transactions.custom_payment_type, debt, cashiers.profile |
page | — | Нет | Номер страницы, с 1 |
page-size | — | Нет | Записей на странице, не больше 20 |
show[] | — | Нет | Дополнительные вычисляемые данные (см. описание метода) |
Ответ · 200
Постраничный ответ: записи в data[], пагинация в links и meta.
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
data | object[] | Данные |
data[].id | integer | ID |
data[].creator_id | integer | Создатель |
data[].company_id | integer | Компания |
data[].cashbox_id | integer | Касса |
data[].stock_id | integer | Склад |
data[].client_id | integer | Клиент |
data[].exchange_of_sale_id | null | |
data[].currency | string | Валюта |
data[].purchased_amount | integer | |
data[].sold_amount | integer | Сумма в продаже |
data[].returned_amount | integer | Возвращённая сумма |
data[].status | string | Статус |
data[].source_type | string | Источник |
data[].source_data | array | |
data[].code | string | Код |
data[].created_at | string | Создано |
data[].updated_at | string | Обновлено |
data[].products_total | object | |
data[].products_total.sale_id | integer | Продажа |
data[].products_total.sold_quantity | integer | Кол-во в продаже |
data[].products_total.returned_quantity | integer | Возвращённое кол-во |
data[].products_total.gross_amount | integer | |
data[].products_total.discount_amount | integer | |
data[].products_total.unit_id | integer | Единица измерения |
data[].products_total.unit | object | |
data[].products_total.unit.id | integer | ID |
data[].products_total.unit.company_id | integer | Компания |
data[].products_total.unit.source_id | integer | Источник |
data[].products_total.unit.name | object | Название |
data[].products_total.unit.name.oz | string | |
data[].products_total.unit.name.ru | string | |
data[].products_total.unit.name.uz | string | |
data[].products_total.unit.accuracy | integer | Кол-во знаков после запятой |
data[].products_total.unit.created_at | string | Создано |
data[].products_total.unit.updated_at | string | Обновлено |
data[].products_total.unit.is_deleted | boolean |
{
"data": [
{
"id": 1,
"creator_id": 2,
"company_id": 1,
"cashbox_id": 1,
"stock_id": 1,
"client_id": 1,
"exchange_of_sale_id": null,
"currency": "uzs",
"purchased_amount": 500,
"sold_amount": 4900,
"returned_amount": 0,
"status": "completed",
"source_type": "wasyt",
"source_data": [],
"code": "w-1-1",
"created_at": "2020-01-01 10:00:00",
"updated_at": "2020-01-01 10:00:00",
"products_total": {
"sale_id": 1,
"sold_quantity": 3,
"returned_quantity": 0,
"gross_amount": 5000,
"discount_amount": 100,
"unit_id": 1,
"unit": {
"id": 1,
"company_id": 1,
"source_id": 3,
"name": {
"oz": "Unit 1 oz",
"ru": "Unit 1 ru",
"uz": "Unit 1 uz"
},
"accuracy": 4,
"created_at": "2026-09-30 12:47:59",
"updated_at": "2026-09-30 12:47:59",
"is_deleted": false
}
}
}
],
"links": {
"first": "https://api.wasyt.uz/company/trade/sale?page=1",
"last": "https://api.wasyt.uz/company/trade/sale?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [],
"path": "https://api.wasyt.uz/company/trade/sale",
"per_page": 20,
"to": 1,
"total": 1
}
}Детали продажи
/company/trade/sale/{model}Один чек: номер, касса, склад, клиент, статус и суммы продажи и возвратов.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры пути
| Параметр | Описание |
|---|---|
model | ID записи |
Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | integer | ID |
creator_id | integer | Создатель |
company_id | integer | Компания |
cashbox_id | integer | Касса |
stock_id | integer | Склад |
client_id | integer | Клиент |
exchange_of_sale_id | null | |
currency | string | Валюта |
purchased_amount | integer | |
sold_amount | integer | Сумма в продаже |
returned_amount | integer | Возвращённая сумма |
status | string | Статус |
source_type | string | Источник |
source_data | array | |
code | string | Код |
created_at | string | Создано |
updated_at | string | Обновлено |
{
"id": 1,
"creator_id": 2,
"company_id": 1,
"cashbox_id": 1,
"stock_id": 1,
"client_id": 1,
"exchange_of_sale_id": null,
"currency": "uzs",
"purchased_amount": 500,
"sold_amount": 4900,
"returned_amount": 0,
"status": "completed",
"source_type": "wasyt",
"source_data": [],
"code": "w-1-1",
"created_at": "2020-01-01 10:00:00",
"updated_at": "2020-01-01 10:00:00"
}Создать продажу
/company/trade/saleПробивает чек из товаров, услуг и комплектов (хотя бы одна строка) в валюте продажи компании: остаток списывается со склада, сумма transactions должна точно равняться итогу чека. Оплата бонусами — только в UZS и в пределах баланса и лимита тарифа клиента; в долг — только с клиентом и due_date, без бонусов и без начисления кешбэка. hold_id, seller_cart_id и cheque закрывают отложку, корзину продавца и черновик чека.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
company_id | integer | Да | Компания. ID существующей записи, доступной пользователю |
cashbox_id | integer | Да | Касса. ID существующей записи, доступной пользователю |
stock_id | integer | Да | Склад. ID существующей записи, доступной пользователю |
client_id | integer | Нет | Клиент. ID существующей записи, доступной пользователю |
hold_id | integer | Нет | ID существующей записи, доступной пользователю |
seller_cart_id | integer | Нет | Подбор продавца. ID существующей записи, доступной пользователю |
currency | string | Да | Валюта. Допустимые значения: uzs |
cheque | integer | Нет | Чек. Не меньше 1. Не больше 3 |
due_date | string (date) | Нет | Срок погашения. Не раньше сегодняшнего дня |
comment | string | Нет | Комментарий. Макс. 1000 символов |
discount | number | Нет | Скидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99 |
cashier_ids | array | Нет | Макс. 10 элементов. ID существующей записи, доступной пользователю |
products | object[] | Нет | Продукты. Макс. 100 элементов |
products[].product_id | integer | Да | Продукт. Без повторов |
products[].discount | number | Нет | Скидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99 |
products[].sold_quantity | number | Да | Проданное количество. До 8 знаков после запятой. Не меньше 0.00000001 |
products[].price | number | Нет | Цена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99 |
services | object[] | Нет | Макс. 100 элементов |
services[].service_id | integer | Да | Без повторов |
services[].discount | number | Нет | Скидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99 |
services[].price | number | Нет | Цена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99 |
bundles | object[] | Нет | Комплекты. Макс. 100 элементов |
bundles[].bundle_id | integer | Да | Комплект |
bundles[].quantity | integer | Нет | Количество. Не меньше 1. Не больше 1000 |
bundles[].discount | number | Нет | Скидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99 |
bundles[].price | number | Нет | Цена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99 |
transactions | object[] | Нет | Транзакции. Макс. 10 элементов |
transactions[].payment_type | string | Да | Тип оплаты. Допустимые значения: bank, card, cash, bonus, debt, system |
transactions[].payment_type_id | integer | Нет | Тип оплаты. ID существующей записи, доступной пользователю |
transactions[].amount | number | Да | Сумма. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99 |
{
"company_id": 1,
"cashbox_id": 2,
"stock_id": 1,
"hold_id": 1,
"client_id": 1,
"currency": "uzs",
"due_date": "2030-12-31",
"comment": "Pay by end of month",
"products": [
{
"product_id": 1,
"discount": 300,
"sold_quantity": 1
},
{
"product_id": 2,
"discount": null,
"sold_quantity": 2
}
],
"transactions": [
{
"payment_type": "cash",
"amount": 2700
},
{
"payment_type": "debt",
"amount": 2000
}
]
}curl -X POST "https://api.wasyt.uz/company/trade/sale" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"company_id":1,"cashbox_id":2,"stock_id":1,"hold_id":1,"client_id":1,"currency":"uzs","due_date":"2030-12-31","comment":"Pay by end of month","products":[{"product_id":1,"discount":300,"sold_quantity":1},{"product_id":2,"discount":null,"sold_quantity":2}],"transactions":[{"payment_type":"cash","amount":2700},{"payment_type":"debt","amount":2000}]}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
company_id | integer | Компания |
cashbox_id | integer | Касса |
stock_id | integer | Склад |
client_id | integer | Клиент |
currency | string | Валюта |
status | string | Статус |
source_type | string | Источник |
updated_at | string | Обновлено |
created_at | string | Создано |
creator_id | integer | Создатель |
code | string | Код |
id | integer | ID |
purchased_amount | integer | |
sold_amount | integer | Сумма в продаже |
returned_amount | integer | Возвращённая сумма |
{
"company_id": 1,
"cashbox_id": 2,
"stock_id": 1,
"client_id": 1,
"currency": "uzs",
"status": "completed",
"source_type": "wasyt",
"updated_at": "2026-09-30 12:54:54",
"created_at": "2026-09-30 12:54:54",
"creator_id": 2,
"code": "#300926001",
"id": 201,
"purchased_amount": 4001000,
"sold_amount": 4700,
"returned_amount": 0
}Пример ошибки · 422
{
"message": "Для продажи в долг необходимо выбрать клиента",
"errors": {
"client_id": [
"Для продажи в долг необходимо выбрать клиента"
]
}
}
