Skip to content

Инвентаризация ​

Пересчёт товаров склада — полный (весь склад) или частичный (выбранные категории и товары). Пока подсчёт идёт, склад недоступен для продаж и перемещений; подтверждение создаёт Приход на излишки и Списание на недостачи.

МетодАдресНазначение
GET/company/trade/inventory/statsСтатистика инвентаризаций
GET/company/trade/inventory/categoriesКатегории для подсчёта
PATCH/company/trade/inventory/{model}/add-productsДобавить товары в подсчёт
PATCH/company/trade/inventory/{model}/remove-productsУбрать товары из подсчёта
GET/company/trade/inventory/{model}/comparison-sheetСличительная ведомость
PATCH/company/trade/inventory/{model}/completeПодтвердить и обновить остаток
PATCH/company/trade/inventory/{model}/cancelОтменить инвентаризацию
GET/company/trade/inventoryИстория инвентаризаций
GET/company/trade/inventory/{model}Детали инвентаризации
POST/company/trade/inventoryНачать инвентаризацию

Статистика инвентаризаций ​

GET/company/trade/inventory/stats

Карточки над историей: всего подсчётов total_count, дата последнего завершённого last_completed_at, точность accuracy_percent (совпавшие позиции к проверенным по всем завершённым подсчётам, null без данных) и разница последнего подсчёта в деньгах по валютам last_difference_amounts.

Заголовки ​

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

Ответ · 200 ​

Поля ответа
ПолеТипОписание
total_countinteger
last_completed_atstring
accuracy_percentnull
last_difference_amountsobject
last_difference_amounts.uzsinteger
last_difference_amounts.usdinteger
last_difference_amounts.eurinteger
last_difference_amounts.rubinteger
json
{
    "total_count": 2,
    "last_completed_at": "2026-09-30 12:47:59",
    "accuracy_percent": null,
    "last_difference_amounts": {
        "uzs": 2000,
        "usd": 2000,
        "eur": 2000,
        "rub": 2000
    }
}

Категории для подсчёта ​

GET/company/trade/inventory/categories

Каталог категорий склада stock_id для частичной инвентаризации: что лежит в каждой категории и на какую сумму по приходной цене. Склад должен принадлежать компании пользователя или её филиалу.

Заголовки ​

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

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

ПолеТипОбязательноОписание
stock_idintegerДаСклад. ID существующей записи, доступной пользователю

Ответ · 200 ​

Поля ответа
ПолеТипОписание
dataobject[]Данные
data[].idintegerID
data[].nameobjectНазвание
data[].name.ozstring
data[].name.rustring
data[].name.uzstring
data[].textstringТекст
data[].parent_idintegerРодитель
data[].products_countinteger
data[].quantityintegerКоличество
data[].amountsobject
data[].amounts.uzsinteger
data[].amounts.usdinteger
data[].amounts.eurinteger
data[].amounts.rubinteger
totalobjectВсего записей
total.products_countinteger
total.quantityintegerКоличество
total.amountsobject
total.amounts.uzsinteger
total.amounts.usdinteger
total.amounts.eurinteger
total.amounts.rubinteger
json
{
    "data": [
        {
            "id": 4,
            "name": {
                "oz": "Category 1-1-1 oz",
                "ru": "Category 1-1-1 ru",
                "uz": "Category 1-1-1 uz"
            },
            "text": "Category 1-1-1 ru",
            "parent_id": 3,
            "products_count": 2,
            "quantity": 3,
            "amounts": {
                "uzs": 1000,
                "usd": 4260,
                "eur": 0,
                "rub": 0
            }
        }
    ],
    "total": {
        "products_count": 2,
        "quantity": 3,
        "amounts": {
            "uzs": 1000,
            "usd": 4260,
            "eur": 0,
            "rub": 0
        }
    }
}

Пример ошибки · 422 ​

json
{
    "message": "Поле Склад обязательно для заполнения.",
    "errors": {
        "stock_id": [
            "Поле Склад обязательно для заполнения."
        ]
    }
}

Добавить товары в подсчёт ​

PATCH/company/trade/inventory/{model}/add-products

Добавляет в идущую инвентаризацию позиции склада (stock_product_id — ID строки остатка этого склада) с фактическим количеством. Нельзя добавить товар, которого нет ни по учёту, ни по факту; не больше 10 000 позиций на подсчёт. Только для статуса in_progress.

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

Заголовки ​

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

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

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

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

ПолеТипОбязательноОписание
products_tmpobject[]ДаПродукты. Макс. 100 элементов
products_tmp[].stock_product_idintegerДаПродукт на складе. Без повторов
products_tmp[].actual_quantitynumberДаФактическое количество. До 4 знаков после запятой. Не меньше 0
json
{
    "products_tmp": [
        {
            "stock_product_id": 1,
            "actual_quantity": 10
        },
        {
            "stock_product_id": 2,
            "actual_quantity": 0.2
        }
    ]
}
bash
curl -X PATCH "https://api.wasyt.uz/company/trade/inventory/1/add-products" \
  -H "Accept: application/json" \
  -H "Accept-Language: ru" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{"products_tmp":[{"stock_product_id":1,"actual_quantity":10},{"stock_product_id":2,"actual_quantity":0.2}]}'

Ответ · 200 ​

Поля ответа
ПолеТипОписание
messagestringСообщение
json
{
    "message": "Success"
}

Убрать товары из подсчёта ​

PATCH/company/trade/inventory/{model}/remove-products

Удаляет из идущей инвентаризации строки с переданными ID строк инвентаризации и пересчитывает её итоги. Только для статуса in_progress.

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

Заголовки ​

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

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

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

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

ПолеТипОбязательноОписание
products_tmparrayДаПродукты. Макс. 100 элементов
products_tmp[]integerДаПродукты. Без повторов
json
{
    "products_tmp": [
        1
    ]
}
bash
curl -X PATCH "https://api.wasyt.uz/company/trade/inventory/1/remove-products" \
  -H "Accept: application/json" \
  -H "Accept-Language: ru" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{"products_tmp":[1]}'

Ответ · 200 ​

Поля ответа
ПолеТипОписание
messagestringСообщение
json
{
    "message": "Success"
}

Сличительная ведомость ​

GET/company/trade/inventory/{model}/comparison-sheet

Скачивает Excel-файл сличительной ведомости по проверенным строкам подсчёта. Доступно и до, и после подтверждения инвентаризации.

Заголовки ​

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

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

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

Ответ · 200 ​

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

Подтвердить и обновить остаток ​

PATCH/company/trade/inventory/{model}/complete

Завершает подсчёт одной транзакцией: фиксирует количество по учёту на текущий момент, создаёт завершённый Приход без поставщика на излишки (по одному на валюту) и Списание на недостачи с пометкой «Инвентаризация». Учитываются только проверенные строки; ошибка 400, если не проверено ни одной или статус не in_progress.

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

Заголовки ​

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

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

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

Ответ · 200 ​

Поля ответа
ПолеТипОписание
messagestringСообщение
json
{
    "message": "Success"
}

Отменить инвентаризацию ​

PATCH/company/trade/inventory/{model}/cancel

Переводит подсчёт в canceled и удаляет его строки; остатки не меняются, склад снова становится доступен. Только для статуса in_progress.

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

Заголовки ​

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

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

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

Ответ · 200 ​

Поля ответа
ПолеТипОписание
messagestringСообщение
json
{
    "message": "Success"
}

История инвентаризаций ​

GET/company/trade/inventory

Инвентаризации компании и её филиалов с пагинацией и фильтрами; с format=excel — выгрузка списка в Excel.

Заголовки ​

ЗаголовокЗначениеОписание
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[updater_id]—НетОбновитель — точное значение
filter[company_id]—НетКомпания — одно значение или список filter[company_id][]
filter[stock_id]—НетСклад — точное значение
filter[responsible_id]—НетОтветственный — точное значение
filter[type]—НетТип — точное значение
filter[status]—НетСтатус — точное значение
filter[created_at]—НетСоздано — период: [0] — с, [1] — по (Y-m-d)
filter[products.product.category_id]—НетКатегория — точное значение (с учётом вложенных)
filter[products.product.brand_id]—НетБренд — точное значение
sort[]—НетСортировка, - — по убыванию: id, -id
with[]—НетПодгрузить связи: creator.profile, updater.profile, responsible.profile, company, stock
page—НетНомер страницы, с 1
page-size—НетЗаписей на странице, не больше 10

Ответ · 200 ​

Постраничный ответ: записи в data[], пагинация в links и meta.

Поля ответа
ПолеТипОписание
dataobject[]Данные
data[].idintegerID
data[].creator_idintegerСоздатель
data[].updater_idintegerОбновитель
data[].company_idintegerКомпания
data[].stock_idintegerСклад
data[].responsible_idnullОтветственный
data[].typestringТип
data[].statusstringСтатус
data[].commentstringКомментарий
data[].stock_quantityintegerКол-во на складе
data[].actual_quantityintegerФактическое количество
data[].quantity_diff_aboveintegerИзбыток (кол-во)
data[].quantity_diff_belowintegerНедосдача (кол-во)
data[].amounts_diff_aboveobjectИзбыток (сумма)
data[].amounts_diff_above.eurinteger
data[].amounts_diff_above.rubinteger
data[].amounts_diff_above.usdinteger
data[].amounts_diff_above.uzsinteger
data[].amounts_diff_belowobjectНедосдача (сумма)
data[].amounts_diff_below.eurinteger
data[].amounts_diff_below.rubinteger
data[].amounts_diff_below.usdinteger
data[].amounts_diff_below.uzsinteger
data[].products_countinteger
data[].checked_products_countinteger
data[].matched_products_countinteger
data[].completed_atnull
data[].created_atstringСоздано
data[].updated_atstringОбновлено
json
{
    "data": [
        {
            "id": 1,
            "creator_id": 2,
            "updater_id": 2,
            "company_id": 1,
            "stock_id": 1,
            "responsible_id": null,
            "type": "partial",
            "status": "in_progress",
            "comment": "Comment 1",
            "stock_quantity": 1,
            "actual_quantity": 2,
            "quantity_diff_above": 1,
            "quantity_diff_below": 0,
            "amounts_diff_above": {
                "eur": 1000,
                "rub": 1000,
                "usd": 1000,
                "uzs": 1000
            },
            "amounts_diff_below": {
                "eur": 0,
                "rub": 0,
                "usd": 0,
                "uzs": 0
            },
            "products_count": 0,
            "checked_products_count": 0,
            "matched_products_count": 0,
            "completed_at": null,
            "created_at": "2026-09-30 12:47:59",
            "updated_at": "2026-09-30 12:47:59"
        },
        {
            "id": 2,
            "creator_id": 2,
            "updater_id": 2,
            "company_id": 1,
            "stock_id": 1,
            "responsible_id": null,
            "type": "partial",
            "status": "completed",
            "comment": "Comment 2",
            "stock_quantity": 3,
            "actual_quantity": 5,
            "quantity_diff_above": 2,
            "quantity_diff_below": 0,
            "amounts_diff_above": {
                "eur": 2000,
                "rub": 2000,
                "usd": 2000,
                "uzs": 2000
            },
            "amounts_diff_below": {
                "eur": 0,
                "rub": 0,
                "usd": 0,
                "uzs": 0
            },
            "products_count": 0,
            "checked_products_count": 0,
            "matched_products_count": 0,
            "completed_at": "2026-09-30 12:47:59",
            "created_at": "2026-09-30 12:47:59",
            "updated_at": "2026-09-30 12:47:59"
        }
    ],
    "links": {
        "first": "https://api.wasyt.uz/company/trade/inventory?page=1",
        "last": "https://api.wasyt.uz/company/trade/inventory?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [],
        "path": "https://api.wasyt.uz/company/trade/inventory",
        "per_page": 10,
        "to": 2,
        "total": 2
    }
}

Детали инвентаризации ​

GET/company/trade/inventory/{model}

Одна инвентаризация: склад, ответственный, тип, статус, счётчики проверенных позиций и суммы излишков и недостач по валютам.

Заголовки ​

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

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

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

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

ПараметрОписание
stock_idСклад
http
GET /company/trade/inventory/categories?stock_id=1

Ответ · 200 ​

Поля ответа
ПолеТипОписание
dataobject[]Данные
data[].idintegerID
data[].nameobjectНазвание
data[].name.ozstring
data[].name.rustring
data[].name.uzstring
data[].textstringТекст
data[].parent_idintegerРодитель
data[].products_countinteger
data[].quantityintegerКоличество
data[].amountsobject
data[].amounts.uzsinteger
data[].amounts.usdinteger
data[].amounts.eurinteger
data[].amounts.rubinteger
totalobjectВсего записей
total.products_countinteger
total.quantityintegerКоличество
total.amountsobject
total.amounts.uzsinteger
total.amounts.usdinteger
total.amounts.eurinteger
total.amounts.rubinteger
json
{
    "data": [
        {
            "id": 4,
            "name": {
                "oz": "Category 1-1-1 oz",
                "ru": "Category 1-1-1 ru",
                "uz": "Category 1-1-1 uz"
            },
            "text": "Category 1-1-1 ru",
            "parent_id": 3,
            "products_count": 2,
            "quantity": 3,
            "amounts": {
                "uzs": 1000,
                "usd": 4260,
                "eur": 0,
                "rub": 0
            }
        }
    ],
    "total": {
        "products_count": 2,
        "quantity": 3,
        "amounts": {
            "uzs": 1000,
            "usd": 4260,
            "eur": 0,
            "rub": 0
        }
    }
}

Пример ошибки · 422 ​

json
{
    "message": "Поле Склад обязательно для заполнения.",
    "errors": {
        "stock_id": [
            "Поле Склад обязательно для заполнения."
        ]
    }
}

Начать инвентаризацию ​

POST/company/trade/inventory

Открывает подсчёт склада. type = full сразу заполняет лист всем складом, partial — выбранными category_ids и product_ids (без выбора лист пуст и заполняется сканером). Пока подсчёт идёт, склад закрыт для продаж и перемещений; ответственный по умолчанию — директор компании склада.

Заголовки ​

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

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

ПолеТипОбязательноОписание
company_idintegerДаКомпания. ID существующей записи, доступной пользователю
stock_idintegerДаСклад. ID существующей записи, доступной пользователю
responsible_idintegerНетОтветственный. ID существующей записи, доступной пользователю
typestringДаТип. Допустимые значения: partial, full
category_idsarrayНетКатегории. Макс. 1000 элементов
category_ids[]integerДаКатегории. Без повторов
product_idsarrayНетТовары. Макс. 1000 элементов
product_ids[]integerДаТовары. Без повторов
commentstringНетКомментарий. Макс. 5000 символов
json
{
    "company_id": 1,
    "stock_id": 1,
    "responsible_id": 2,
    "type": "partial",
    "comment": "Comment 3"
}
bash
curl -X POST "https://api.wasyt.uz/company/trade/inventory" \
  -H "Accept: application/json" \
  -H "Accept-Language: ru" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{"company_id":1,"stock_id":1,"responsible_id":2,"type":"partial","comment":"Comment 3"}'

Ответ · 200 ​

Поля ответа
ПолеТипОписание
company_idintegerКомпания
stock_idintegerСклад
responsible_idintegerОтветственный
typestringТип
commentstringКомментарий
updated_atstringОбновлено
created_atstringСоздано
updater_idintegerОбновитель
amounts_diff_aboveobjectИзбыток (сумма)
amounts_diff_above.uzsinteger
amounts_diff_above.usdinteger
amounts_diff_above.eurinteger
amounts_diff_above.rubinteger
amounts_diff_belowobjectНедосдача (сумма)
amounts_diff_below.uzsinteger
amounts_diff_below.usdinteger
amounts_diff_below.eurinteger
amounts_diff_below.rubinteger
creator_idintegerСоздатель
idintegerID
json
{
    "company_id": 1,
    "stock_id": 1,
    "responsible_id": 2,
    "type": "partial",
    "comment": "Comment 3",
    "updated_at": "2026-09-30 12:54:16",
    "created_at": "2026-09-30 12:54:16",
    "updater_id": 2,
    "amounts_diff_above": {
        "uzs": 0,
        "usd": 0,
        "eur": 0,
        "rub": 0
    },
    "amounts_diff_below": {
        "uzs": 0,
        "usd": 0,
        "eur": 0,
        "rub": 0
    },
    "creator_id": 2,
    "id": 3
}