Skip to content

Продажи ​

Чеки прямой продажи на кассе: создание, список, возвраты, обмены и печатные формы. Продажа списывает остаток со склада, проводит оплаты по кассе и начисляет или списывает бонусы клиента.

МетодАдресНазначение
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Создать продажу

Вернуть товары по чеку ​

PATCH/company/trade/sale/{model}/return

Возвращает строки чека (не больше проданного за вычетом уже возвращённого) и выплачивает деньги по transactions; товары возвращаются на склад. Если по чеку есть долг, стоимость возврата сначала гасит долг, и выплачивается только остаток. Комплект возвращается только целиком; бонусами и в долг деньги не возвращаются.

Из формы (multipart/form-data) метод PATCH отправляется как POST с параметром ?_method=PATCH.

Заголовки ​

ЗаголовокЗначениеОписание
AuthorizationBearer {token}Токен из POST /common/auth/login
Acceptapplication/jsonОтвет в JSON
Accept-LanguageruЯзык сообщений и названий: ru, uz, oz

Параметры пути ​

ПараметрОписание
modelID записи

Тело запроса ​

ПолеТипОбязательноОписание
productsobject[]НетПродукты. Макс. 100 элементов
products[].idintegerДаID. Без повторов
products[].reason_typestringДаТип причины. Допустимые значения: defective, size_not_fit, expired_date, not_match
products[].returned_quantitynumberДаВозвращённое количество. До 8 знаков после запятой. Не меньше 0.00000001
products[].commentstringНетКомментарий. Макс. 1000 символов
transactionsobject[]НетТранзакции. Макс. 10 элементов
transactions[].payment_typestringДаТип оплаты. Допустимые значения: bank, card, cash
transactions[].payment_type_idintegerНетТип оплаты
transactions[].amountnumberДаСумма. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99
json
{
    "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
        }
    ]
}
bash
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 ​

Поля ответа
ПолеТипОписание
idintegerID
creator_idintegerСоздатель
company_idintegerКомпания
cashbox_idintegerКасса
stock_idintegerСклад
client_idnullКлиент
exchange_of_sale_idnull
currencystringВалюта
purchased_amountinteger
sold_amountintegerСумма в продаже
returned_amountintegerВозвращённая сумма
statusstringСтатус
source_typestringИсточник
source_dataarray
codestringКод
created_atstringСоздано
updated_atstringОбновлено
json
{
    "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 ​

json
{
    "message": "Значение поля Сумма не может быть больше 2000.",
    "errors": {
        "transactions": [
            "Значение поля Сумма не может быть больше 2000."
        ]
    }
}

Обменять товары по чеку ​

POST/company/trade/sale/{model}/exchange

Возвращает выбранные строки исходного чека и создаёт новую продажу на товары и комплекты взамен. Разница оплачивается transactions ровно на её сумму: доплата покупателя — приход по новой продаже (можно в долг с клиентом и due_date), переплата — выплата по исходному чеку; при равном обмене операций нет. Возвращает original_sale и exchange_sale.

Заголовки ​

ЗаголовокЗначениеОписание
AuthorizationBearer {token}Токен из POST /common/auth/login
Acceptapplication/jsonОтвет в JSON
Accept-LanguageruЯзык сообщений и названий: ru, uz, oz

Параметры пути ​

ПараметрОписание
modelID записи

Тело запроса ​

ПолеТипОбязательноОписание
cashbox_idintegerДаКасса. ID существующей записи
stock_idintegerДаСклад. ID существующей записи
currencystringДаВалюта
client_idintegerНетКлиент
company_idintegerДаКомпания
returned_productsobject[]ДаМин. 1 элементов. Макс. 100 элементов
returned_products[].idintegerДаID. Без повторов
returned_products[].reason_typestringДаТип причины. Допустимые значения: defective, size_not_fit, expired_date, not_match
returned_products[].returned_quantitynumberДаВозвращённое кол-во. До 8 знаков после запятой. Не меньше 0.00000001
returned_products[].commentstringНетКомментарий. Макс. 1000 символов
productsobject[]НетПродукты. Макс. 100 элементов
products[].product_idintegerДаПродукт. Без повторов
products[].sold_quantitynumberДаПроданное количество. До 8 знаков после запятой. Не меньше 0.00000001
products[].discountnumberНетСкидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99
products[].pricenumberНетЦена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99
bundlesobject[]НетКомплекты. Макс. 100 элементов
bundles[].bundle_idintegerДаКомплект
bundles[].quantityintegerНетКоличество. Не меньше 1. Не больше 1000
bundles[].discountnumberНетСкидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99
bundles[].pricenumberНетЦена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99
due_datestring (date)НетСрок погашения. Не раньше сегодняшнего дня
commentstringНетКомментарий. Макс. 1000 символов
transactionsobject[]НетТранзакции. Макс. 10 элементов
transactions[].payment_typestringДаТип оплаты. Без повторов. Допустимые значения: cash, card, bank, debt
transactions[].amountnumberДаСумма. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99
json
{
    "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
        }
    ]
}
bash
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_saleobject
original_sale.idintegerID
original_sale.creator_idintegerСоздатель
original_sale.company_idintegerКомпания
original_sale.cashbox_idintegerКасса
original_sale.stock_idintegerСклад
original_sale.client_idintegerКлиент
original_sale.exchange_of_sale_idnull
original_sale.currencystringВалюта
original_sale.purchased_amountinteger
original_sale.sold_amountintegerСумма в продаже
original_sale.returned_amountintegerВозвращённая сумма
original_sale.statusstringСтатус
original_sale.source_typestringИсточник
original_sale.source_dataarray
original_sale.codestringКод
original_sale.created_atstringСоздано
original_sale.updated_atstringОбновлено
exchange_saleobject
exchange_sale.company_idintegerКомпания
exchange_sale.cashbox_idintegerКасса
exchange_sale.stock_idintegerСклад
exchange_sale.currencystringВалюта
exchange_sale.client_idintegerКлиент
exchange_sale.exchange_of_sale_idinteger
exchange_sale.statusstringСтатус
exchange_sale.source_typestringИсточник
exchange_sale.source_dataobject
exchange_sale.source_data.exchange_keystring
exchange_sale.updated_atstringОбновлено
exchange_sale.created_atstringСоздано
exchange_sale.creator_idintegerСоздатель
exchange_sale.codestringКод
exchange_sale.idintegerID
exchange_sale.purchased_amountinteger
exchange_sale.sold_amountintegerСумма в продаже
exchange_sale.returned_amountintegerВозвращённая сумма
json
{
    "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 ​

json
{
    "message": "Укажите срок погашения долга",
    "errors": {
        "due_date": [
            "Укажите срок погашения долга"
        ]
    }
}

Выгрузить чек в Excel ​

GET/company/trade/sale/{model}/print

Скачивает Excel-файл со строками одного чека в порядке их добавления.

Заголовки ​

ЗаголовокЗначениеОписание
AuthorizationBearer {token}Токен из POST /common/auth/login
Acceptapplication/jsonОтвет в JSON
Accept-LanguageruЯзык сообщений и названий: ru, uz, oz

Параметры пути ​

ПараметрОписание
modelID записи

Ответ · 200 ​

Ответ — файл или текст, не JSON.

Накладная A4 ​

GET/company/trade/sale/{model}/invoice

Данные накладной A4 по чеку для предпросмотра печати; с format=excel — готовый к печати лист Excel из тех же данных.

Заголовки ​

ЗаголовокЗначениеОписание
AuthorizationBearer {token}Токен из POST /common/auth/login
Acceptapplication/jsonОтвет в JSON
Accept-LanguageruЯзык сообщений и названий: ru, uz, oz

Параметры пути ​

ПараметрОписание
modelID записи

Параметры запроса ​

ПолеТипОбязательноОписание
formatstringНетФормат ответа: excel — скачать печатный лист вместо JSON

Ответ · 200 ​

Поля ответа
ПолеТипОписание
saleobject
sale.idintegerID
sale.codestringКод
sale.currencystringВалюта
sale.created_atstringСоздано
sale.datestringДата
sale.timestring
settingsobjectНастройки
settings.headerobject
settings.header.store_nameboolean
settings.header.working_hoursboolean
settings.header.cashierboolean
settings.header.contactsboolean
settings.header.legal_nameboolean
settings.header.client_phoneboolean
settings.header.datebooleanДата
settings.header.sellerboolean
settings.header.clientboolean
settings.header.tinboolean
settings.header.addressbooleanАдрес
settings.working_hoursnull
settings.balanceobjectБаланс
settings.balance.enabledboolean
settings.balance.beforeboolean
settings.balance.addedboolean
settings.balance.written_offboolean
settings.balance.afterboolean
settings.debtobjectДолг
settings.debt.enabledboolean
settings.debt.beforeboolean
settings.debt.addedboolean
settings.debt.written_offboolean
settings.debt.afterboolean
companyobjectКомпания
company.namestringНазвание
company.legal_namestring
company.tinstring
company.addressstringАдрес
company.phonestringТелефон
clientobject
client.idintegerID
client.full_namestringФИО
client.phonestringТелефон
cashierobject
cashier.full_namestringФИО
cashier.is_directorboolean
creatorobject
creator.full_namestringФИО
rowsobject[]
rows[].positionintegerДолжность
rows[].categorystringКатегория
rows[].namestringНазвание
rows[].quantityintegerКоличество
rows[].priceintegerЦена
rows[].amountintegerСумма
rows[].amount_uzsinteger
rows[].amount_usdnull
totalsobject
totals.quantityintegerКоличество
totals.currentobject
totals.current.uzsinteger
totals.current.usdinteger
totals.previous_debtobject
totals.previous_debt.uzsinteger
totals.previous_debt.usdinteger
totals.totalobjectВсего записей
totals.total.uzsinteger
totals.total.usdinteger
balanceobjectБаланс
balance.beforeinteger
balance.addedinteger
balance.written_offinteger
balance.afterinteger
debtobjectДолг
debt.beforeinteger
debt.addedinteger
debt.written_offinteger
debt.afterinteger
json
{
    "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
    }
}

Карточка чека ​

GET/company/trade/sale/{model}/check-detail

Вся история чека: товары, оплаты, все возвраты и обмены и итоговая стоимость. Новая продажа, созданная обменом, открывает карточку исходного чека.

Заголовки ​

ЗаголовокЗначениеОписание
AuthorizationBearer {token}Токен из POST /common/auth/login
Acceptapplication/jsonОтвет в JSON
Accept-LanguageruЯзык сообщений и названий: ru, uz, oz

Параметры пути ​

ПараметрОписание
modelID записи

Ответ · 200 ​

Поля ответа
ПолеТипОписание
saleobject
sale.idintegerID
sale.codestringКод
sale.created_atstringСоздано
sale.currencystringВалюта
sale.statusstringСтатус
sale.has_exchangeboolean
sale.products_countinteger
sale.payment_typesarray
sale.cashier_namestring
productsobject[]Продукты
products[].idintegerID
products[].positionintegerДолжность
products[].sale_idintegerПродажа
products[].product_idintegerПродукт
products[].service_idnull
products[].bundle_idnullКомплект
products[].bundle_keynull
products[].bundle_namenull
products[].namestringНазвание
products[].brand_namestringБренд
products[].imagestringИзображение
products[].quantityintegerКоличество
products[].unitobject
products[].unit.idintegerID
products[].unit.nameobjectНазвание
products[].unit.name.ozstring
products[].unit.name.rustring
products[].unit.name.uzstring
products[].unit.accuracyintegerКол-во знаков после запятой
products[].priceintegerЦена
products[].discountintegerСкидка
products[].amountintegerСумма
products[].is_exchangedboolean
products[].is_returnedboolean
products[].is_partially_returnedboolean
products[].returned_quantityintegerВозвращённое кол-во
operationsobject[]
operations[].typestringТип
operations[].subtypestring
operations[].titlestring
operations[].created_atstringСоздано
operations[].creator_namestring
operations[].amountintegerСумма
operations[].commentstringКомментарий
operations[].payment_typesarray
operations[].refund_amountinteger
operations[].linesobject[]
operations[].lines[].sale_product_idinteger
operations[].lines[].product_idintegerПродукт
operations[].lines[].service_idnull
operations[].lines[].bundle_idnullКомплект
operations[].lines[].bundle_keynull
operations[].lines[].bundle_namenull
operations[].lines[].namestringНазвание
operations[].lines[].brand_namestringБренд
operations[].lines[].quantityintegerКоличество
operations[].lines[].unitobject
operations[].lines[].unit.idintegerID
operations[].lines[].unit.nameobjectНазвание
operations[].lines[].unit.name.ozstring
operations[].lines[].unit.name.rustring
operations[].lines[].unit.name.uzstring
operations[].lines[].unit.accuracyintegerКол-во знаков после запятой
operations[].lines[].amountintegerСумма
operations[].lines[].reason_typestringТип причины
operations[].lines[].commentstringКомментарий
operations[].lines[].signstring
paymentsobject[]
payments[].idintegerID
payments[].payment_typestringТип оплаты
payments[].amountintegerСумма
payments[].created_atstringСоздано
payments[].commentnullКомментарий
totalsobject
totals.paid_amountinteger
totals.bonus_paid_amountinteger
totals.bonus_accrued_amountinteger
totals.returned_amountintegerВозвращённая сумма
totals.total_amountinteger
totals.currencystringВалюта
json
{
    "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"
    }
}

Данные кредитного договора ​

GET/company/trade/sale/{model}/credit-detail

Карточка договора из кредитного проекта ICAN по кредитному чеку, читается онлайн и возвращается без изменений. Ошибка 400, если у чека нет кредита или проект недоступен.

Заголовки ​

ЗаголовокЗначениеОписание
AuthorizationBearer {token}Токен из POST /common/auth/login
Acceptapplication/jsonОтвет в JSON
Accept-LanguageruЯзык сообщений и названий: ru, uz, oz

Параметры пути ​

ПараметрОписание
modelID записи

Ответ ​

Пример ответа пока не записан тестами.

Список продаж ​

GET/company/trade/sale

Чеки с пагинацией и фильтрами; с format=excel — выгрузка в Excel. show[]=external_credit_payments подмешивает в ленту платежи ICAN по внешним кредитам, у которых нет своего чека.

Заголовки ​

ЗаголовокЗначениеОписание
AuthorizationBearer {token}Токен из POST /common/auth/login
Acceptapplication/jsonОтвет в JSON
Accept-LanguageruЯзык сообщений и названий: ru, uz, oz

Параметры запроса ​

ПолеТипОбязательноОписание
formatstringНетФормат ответа: 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.

Поля ответа
ПолеТипОписание
dataobject[]Данные
data[].idintegerID
data[].creator_idintegerСоздатель
data[].company_idintegerКомпания
data[].cashbox_idintegerКасса
data[].stock_idintegerСклад
data[].client_idintegerКлиент
data[].exchange_of_sale_idnull
data[].currencystringВалюта
data[].purchased_amountinteger
data[].sold_amountintegerСумма в продаже
data[].returned_amountintegerВозвращённая сумма
data[].statusstringСтатус
data[].source_typestringИсточник
data[].source_dataarray
data[].codestringКод
data[].created_atstringСоздано
data[].updated_atstringОбновлено
data[].products_totalobject
data[].products_total.sale_idintegerПродажа
data[].products_total.sold_quantityintegerКол-во в продаже
data[].products_total.returned_quantityintegerВозвращённое кол-во
data[].products_total.gross_amountinteger
data[].products_total.discount_amountinteger
data[].products_total.unit_idintegerЕдиница измерения
data[].products_total.unitobject
data[].products_total.unit.idintegerID
data[].products_total.unit.company_idintegerКомпания
data[].products_total.unit.source_idintegerИсточник
data[].products_total.unit.nameobjectНазвание
data[].products_total.unit.name.ozstring
data[].products_total.unit.name.rustring
data[].products_total.unit.name.uzstring
data[].products_total.unit.accuracyintegerКол-во знаков после запятой
data[].products_total.unit.created_atstringСоздано
data[].products_total.unit.updated_atstringОбновлено
data[].products_total.unit.is_deletedboolean
json
{
    "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
    }
}

Детали продажи ​

GET/company/trade/sale/{model}

Один чек: номер, касса, склад, клиент, статус и суммы продажи и возвратов.

Заголовки ​

ЗаголовокЗначениеОписание
AuthorizationBearer {token}Токен из POST /common/auth/login
Acceptapplication/jsonОтвет в JSON
Accept-LanguageruЯзык сообщений и названий: ru, uz, oz

Параметры пути ​

ПараметрОписание
modelID записи

Ответ · 200 ​

Поля ответа
ПолеТипОписание
idintegerID
creator_idintegerСоздатель
company_idintegerКомпания
cashbox_idintegerКасса
stock_idintegerСклад
client_idintegerКлиент
exchange_of_sale_idnull
currencystringВалюта
purchased_amountinteger
sold_amountintegerСумма в продаже
returned_amountintegerВозвращённая сумма
statusstringСтатус
source_typestringИсточник
source_dataarray
codestringКод
created_atstringСоздано
updated_atstringОбновлено
json
{
    "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"
}

Создать продажу ​

POST/company/trade/sale

Пробивает чек из товаров, услуг и комплектов (хотя бы одна строка) в валюте продажи компании: остаток списывается со склада, сумма transactions должна точно равняться итогу чека. Оплата бонусами — только в UZS и в пределах баланса и лимита тарифа клиента; в долг — только с клиентом и due_date, без бонусов и без начисления кешбэка. hold_id, seller_cart_id и cheque закрывают отложку, корзину продавца и черновик чека.

Заголовки ​

ЗаголовокЗначениеОписание
AuthorizationBearer {token}Токен из POST /common/auth/login
Acceptapplication/jsonОтвет в JSON
Accept-LanguageruЯзык сообщений и названий: ru, uz, oz

Тело запроса ​

ПолеТипОбязательноОписание
company_idintegerДаКомпания. ID существующей записи, доступной пользователю
cashbox_idintegerДаКасса. ID существующей записи, доступной пользователю
stock_idintegerДаСклад. ID существующей записи, доступной пользователю
client_idintegerНетКлиент. ID существующей записи, доступной пользователю
hold_idintegerНетID существующей записи, доступной пользователю
seller_cart_idintegerНетПодбор продавца. ID существующей записи, доступной пользователю
currencystringДаВалюта. Допустимые значения: uzs
chequeintegerНетЧек. Не меньше 1. Не больше 3
due_datestring (date)НетСрок погашения. Не раньше сегодняшнего дня
commentstringНетКомментарий. Макс. 1000 символов
discountnumberНетСкидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99
cashier_idsarrayНетМакс. 10 элементов. ID существующей записи, доступной пользователю
productsobject[]НетПродукты. Макс. 100 элементов
products[].product_idintegerДаПродукт. Без повторов
products[].discountnumberНетСкидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99
products[].sold_quantitynumberДаПроданное количество. До 8 знаков после запятой. Не меньше 0.00000001
products[].pricenumberНетЦена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99
servicesobject[]НетМакс. 100 элементов
services[].service_idintegerДаБез повторов
services[].discountnumberНетСкидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99
services[].pricenumberНетЦена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99
bundlesobject[]НетКомплекты. Макс. 100 элементов
bundles[].bundle_idintegerДаКомплект
bundles[].quantityintegerНетКоличество. Не меньше 1. Не больше 1000
bundles[].discountnumberНетСкидка. До 2 знаков после запятой. Не меньше 0. Не больше 999999999999.99
bundles[].pricenumberНетЦена. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99
transactionsobject[]НетТранзакции. Макс. 10 элементов
transactions[].payment_typestringДаТип оплаты. Допустимые значения: bank, card, cash, bonus, debt, system
transactions[].payment_type_idintegerНетТип оплаты. ID существующей записи, доступной пользователю
transactions[].amountnumberДаСумма. До 2 знаков после запятой. Не меньше 0.01. Не больше 999999999999.99
json
{
    "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
        }
    ]
}
bash
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_idintegerКомпания
cashbox_idintegerКасса
stock_idintegerСклад
client_idintegerКлиент
currencystringВалюта
statusstringСтатус
source_typestringИсточник
updated_atstringОбновлено
created_atstringСоздано
creator_idintegerСоздатель
codestringКод
idintegerID
purchased_amountinteger
sold_amountintegerСумма в продаже
returned_amountintegerВозвращённая сумма
json
{
    "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 ​

json
{
    "message": "Для продажи в долг необходимо выбрать клиента",
    "errors": {
        "client_id": [
            "Для продажи в долг необходимо выбрать клиента"
        ]
    }
}