Перемещения
Перемещение товаров между складами, в том числе между компанией и её филиалами. До подтверждения товар остаётся на складе-отправителе, но уже недоступен; остатки переносятся при «Принять товар».
| Метод | Адрес | Назначение |
|---|---|---|
| GET | /company/trade/transfer/stats | Статистика перемещений |
| GET | /company/trade/transfer/download-example | Шаблон импорта перемещения |
| POST | /company/trade/transfer/import | Импорт перемещения из Excel |
| PATCH | /company/trade/transfer/{model}/complete | Принять товар |
| PATCH | /company/trade/transfer/{model}/cancel | Отменить перемещение |
| GET | /company/trade/transfer | Список перемещений |
| GET | /company/trade/transfer/{model} | Детали перемещения |
| POST | /company/trade/transfer | Создать перемещение |
| PUT | /company/trade/transfer/{model} | Изменить перемещение |
Статистика перемещений
/company/trade/transfer/statsКарточки раздела: всего перемещений total_count, в пути in_transit_count, принято completed_count и перемещённое количество moved_quantity.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
total_count | integer | |
in_transit_count | integer | |
completed_count | integer | |
moved_quantity | integer |
{
"total_count": 1,
"in_transit_count": 1,
"completed_count": 0,
"moved_quantity": 0
}Шаблон импорта перемещения
/company/trade/transfer/download-exampleСкачивает пример Excel-файла для импорта перемещения.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Ответ · 200
Ответ — файл или текст, не JSON.
Импорт перемещения из Excel
/company/trade/transfer/importСоздаёт перемещение из файла (до 500 строк: товар, вариация, количество). Товар ищется по названию на складе-отправителе, количество не больше остатка; товары из активной продажи перемещать нельзя. Ошибки указывают ячейку.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
company_from_id | integer | Да | Из компании. ID существующей записи, доступной пользователю |
company_to_id | integer | Да | В компанию. ID существующей записи, доступной пользователю |
stock_from_id | integer | Да | Из склада. ID существующей записи, доступной пользователю |
stock_to_id | integer | Да | В склад. Отличается от stock_from_id. ID существующей записи, доступной пользователю |
comment | string | Нет | Комментарий. Макс. 1000 символов |
file | file | Да | Файл. Форматы: xlsx. Макс. 1024 КБ |
{
"company_from_id": 1,
"company_to_id": 1,
"stock_from_id": 1,
"stock_to_id": 2,
"comment": "Comment 3"
}curl -X POST "https://api.wasyt.uz/company/trade/transfer/import" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"company_from_id":1,"company_to_id":1,"stock_from_id":1,"stock_to_id":2,"comment":"Comment 3"}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
message | string | Сообщение |
{
"message": "Success"
}Принять товар
/company/trade/transfer/{model}/completeЗавершает перемещение: остатки переносятся на склад-получатель, цены товаров устанавливаются в компании-получателе. receiver_id — кто принял (по умолчанию текущий пользователь). Подтвердить может любая сторона с доступом к одному из складов, только в статусе waiting_for_confirmation.
Из формы (
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 записи |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
receiver_id | string | Нет | Допустимые значения: 2, 3, 5, 6, 7, 4 |
Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
message | string | Сообщение |
{
"message": "Success"
}Отменить перемещение
/company/trade/transfer/{model}/cancelОтменяет перемещение с необязательной причиной cancel_reason; зарезервированное количество снова становится доступным на складе-отправителе. Только в статусе waiting_for_confirmation и пользователем с доступом к одному из складов.
Из формы (
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 записи |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
cancel_reason | string | Нет | Причина отмены. Макс. 1000 символов |
{
"cancel_reason": "Cancel reason 1"
}curl -X PATCH "https://api.wasyt.uz/company/trade/transfer/1/cancel" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"cancel_reason":"Cancel reason 1"}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
message | string | Сообщение |
{
"message": "Success"
}Список перемещений
/company/trade/transferПеремещения с пагинацией и фильтрами, с кодом документа TR-…, складами, подписантами и водителем.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры запроса
| Параметр | Описание |
|---|---|
filter[id] | ID — точное значение |
filter[code] | Код — поиск по части строки |
filter[creator_id] | Создатель — точное значение |
filter[updater_id] | Обновитель — точное значение |
filter[sender_id] | точное значение |
filter[receiver_id] | точное значение |
filter[company_from_id] | Из компании — точное значение |
filter[company_to_id] | В компанию — точное значение |
filter[stock_from_id] | Из склада — точное значение |
filter[stock_to_id] | В склад — точное значение |
filter[driver_id] | точное значение |
filter[driver.car_number] | поиск по части строки |
filter[status] | Статус — точное значение |
filter[created_at] | Создано — период: [0] — с, [1] — по (Y-m-d) |
filter[completed_at] | период: [0] — с, [1] — по (Y-m-d) |
sort[] | Сортировка, - — по убыванию: id, -id, code, -code, created_at, -created_at |
with[] | Подгрузить связи: creator.profile, updater.profile, sender.profile, receiver.profile, company_from, company_to, stock_from, stock_to, driver, products, products.product, products.product.unit, products.sale_price |
page | Номер страницы, с 1 |
page-size | Записей на странице, не больше 20 |
GET /company/trade/transfer?sort[0]=id&sort[1]=-id&sort[2]=code&sort[3]=-code&sort[4]=created_at&sort[5]=-created_atОтвет · 200
Постраничный ответ: записи в data[], пагинация в links и meta.
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
data | object[] | Данные |
data[].id | integer | ID |
data[].creator_id | integer | Создатель |
data[].updater_id | integer | Обновитель |
data[].company_from_id | integer | Из компании |
data[].company_to_id | integer | В компанию |
data[].stock_from_id | integer | Из склада |
data[].stock_to_id | integer | В склад |
data[].code | string | Код |
data[].sender_id | integer | |
data[].receiver_id | null | |
data[].driver_id | integer | |
data[].comment | string | Комментарий |
data[].status | string | Статус |
data[].completed_at | null | |
data[].cancel_reason | string | Причина отмены |
data[].created_at | string | Создано |
data[].updated_at | string | Обновлено |
{
"data": [
{
"id": 1,
"creator_id": 2,
"updater_id": 2,
"company_from_id": 1,
"company_to_id": 1,
"stock_from_id": 1,
"stock_to_id": 2,
"code": "TR-0001",
"sender_id": 2,
"receiver_id": null,
"driver_id": 1,
"comment": "Comment 1",
"status": "waiting_for_confirmation",
"completed_at": null,
"cancel_reason": "Cancel reason 1",
"created_at": "2026-09-30 12:47:59",
"updated_at": "2026-09-30 12:47:59"
}
],
"links": {
"first": "https://api.wasyt.uz/company/trade/transfer?page=1",
"last": "https://api.wasyt.uz/company/trade/transfer?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [],
"path": "https://api.wasyt.uz/company/trade/transfer",
"per_page": 20,
"to": 1,
"total": 1
}
}Детали перемещения
/company/trade/transfer/{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 | Создатель |
updater_id | integer | Обновитель |
company_from_id | integer | Из компании |
company_to_id | integer | В компанию |
stock_from_id | integer | Из склада |
stock_to_id | integer | В склад |
code | string | Код |
sender_id | integer | |
receiver_id | null | |
driver_id | integer | |
comment | string | Комментарий |
status | string | Статус |
completed_at | null | |
cancel_reason | string | Причина отмены |
created_at | string | Создано |
updated_at | string | Обновлено |
{
"id": 1,
"creator_id": 2,
"updater_id": 2,
"company_from_id": 1,
"company_to_id": 1,
"stock_from_id": 1,
"stock_to_id": 2,
"code": "TR-0001",
"sender_id": 2,
"receiver_id": null,
"driver_id": 1,
"comment": "Comment 1",
"status": "waiting_for_confirmation",
"completed_at": null,
"cancel_reason": "Cancel reason 1",
"created_at": "2026-09-30 12:47:59",
"updated_at": "2026-09-30 12:47:59"
}Создать перемещение
/company/trade/transferСоздаёт перемещение в статусе waiting_for_confirmation с кодом TR-…. Количество проверяется по доступному остатку склада-отправителя (за вычетом других незавершённых перемещений и открытых корзин продажи). Отправитель по умолчанию — директор компании; водитель выбирается по driver_id или создаётся из заполненных полей.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
company_from_id | integer | Да | Из компании. ID существующей записи, доступной пользователю |
company_to_id | integer | Да | В компанию. ID существующей записи, доступной пользователю |
stock_from_id | integer | Да | Из склада. ID существующей записи, доступной пользователю |
stock_to_id | integer | Да | В склад. Отличается от stock_from_id. ID существующей записи, доступной пользователю |
sender_id | string | Нет | Допустимые значения: 2, 3, 5, 6, 7, 4 |
driver_id | integer | Нет | ID существующей записи, доступной пользователю |
car_number | string | Нет | Макс. 50 символов |
driver_name | string | Нет | Макс. 255 символов |
driver_phone | string | Нет | Макс. 50 символов |
comment | string | Нет | Комментарий. Макс. 1000 символов |
products | object[] | Да | Продукты. Макс. 500 элементов |
products[].id | integer | Нет | ID |
products[].product_id | integer | Да | Продукт. Без повторов |
products[].quantity | number | Да | Количество. До 4 знаков после запятой. Не меньше 0.0001 |
{
"company_from_id": 1,
"company_to_id": 1,
"stock_from_id": 1,
"stock_to_id": 2,
"comment": "Comment 3",
"car_number": "01 A 777 AA",
"driver_name": "Rustamov Jasur",
"driver_phone": "+998 90 123 45 67",
"products": [
{
"product_id": 1,
"quantity": 1
},
{
"product_id": 2,
"quantity": 2
}
]
}curl -X POST "https://api.wasyt.uz/company/trade/transfer" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"company_from_id":1,"company_to_id":1,"stock_from_id":1,"stock_to_id":2,"comment":"Comment 3","car_number":"01 A 777 AA","driver_name":"Rustamov Jasur","driver_phone":"+998 90 123 45 67","products":[{"product_id":1,"quantity":1},{"product_id":2,"quantity":2}]}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
company_from_id | integer | Из компании |
company_to_id | integer | В компанию |
stock_from_id | integer | Из склада |
stock_to_id | integer | В склад |
comment | string | Комментарий |
driver_id | integer | |
updated_at | string | Обновлено |
created_at | string | Создано |
updater_id | integer | Обновитель |
creator_id | integer | Создатель |
code | string | Код |
sender_id | integer | |
id | integer | ID |
{
"company_from_id": 1,
"company_to_id": 1,
"stock_from_id": 1,
"stock_to_id": 2,
"comment": "Comment 3",
"driver_id": 3,
"updated_at": "2026-09-30 12:55:58",
"created_at": "2026-09-30 12:55:58",
"updater_id": 2,
"creator_id": 2,
"code": "TR-0002",
"sender_id": 2,
"id": 23
}Пример ошибки · 422
{
"message": "Значение поля Количество не может быть больше 0.",
"errors": {
"products.0.quantity": [
"Значение поля Количество не может быть больше 0."
]
}
}Изменить перемещение
/company/trade/transfer/{model}Перезаписывает перемещение и его строки по правилам создания; сам документ при проверке остатка не учитывается. Только в статусе waiting_for_confirmation; без полей транспорта водитель остаётся прежним.
Из формы (
multipart/form-data) методPUTотправляется какPOSTс параметром?_method=PUT.
Заголовки
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer {token} | Токен из POST /common/auth/login |
Accept | application/json | Ответ в JSON |
Accept-Language | ru | Язык сообщений и названий: ru, uz, oz |
Параметры пути
| Параметр | Описание |
|---|---|
model | ID записи |
Тело запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
company_from_id | integer | Да | Из компании. ID существующей записи, доступной пользователю |
company_to_id | integer | Да | В компанию. ID существующей записи, доступной пользователю |
stock_from_id | integer | Да | Из склада. ID существующей записи, доступной пользователю |
stock_to_id | integer | Да | В склад. Отличается от stock_from_id. ID существующей записи, доступной пользователю |
sender_id | string | Нет | Допустимые значения: 2, 3, 5, 6, 7, 4 |
driver_id | integer | Нет | ID существующей записи, доступной пользователю |
car_number | string | Нет | Макс. 50 символов |
driver_name | string | Нет | Макс. 255 символов |
driver_phone | string | Нет | Макс. 50 символов |
comment | string | Нет | Комментарий. Макс. 1000 символов |
products | object[] | Да | Продукты. Макс. 500 элементов |
products[].id | integer | Нет | ID |
products[].product_id | integer | Да | Продукт. Без повторов |
products[].quantity | number | Да | Количество. До 4 знаков после запятой. Не меньше 0.0001 |
{
"company_from_id": 1,
"company_to_id": 1,
"stock_from_id": 1,
"stock_to_id": 2,
"comment": "Comment 1",
"products": [
{
"product_id": 1,
"quantity": 1
},
{
"product_id": 2,
"quantity": 2
}
]
}curl -X PUT "https://api.wasyt.uz/company/trade/transfer/1" \
-H "Accept: application/json" \
-H "Accept-Language: ru" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"company_from_id":1,"company_to_id":1,"stock_from_id":1,"stock_to_id":2,"comment":"Comment 1","products":[{"product_id":1,"quantity":1},{"product_id":2,"quantity":2}]}'Ответ · 200
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | integer | ID |
creator_id | integer | Создатель |
updater_id | integer | Обновитель |
company_from_id | integer | Из компании |
company_to_id | integer | В компанию |
stock_from_id | integer | Из склада |
stock_to_id | integer | В склад |
code | string | Код |
sender_id | integer | |
receiver_id | null | |
driver_id | integer | |
comment | string | Комментарий |
status | string | Статус |
completed_at | null | |
cancel_reason | string | Причина отмены |
created_at | string | Создано |
updated_at | string | Обновлено |
{
"id": 1,
"creator_id": 2,
"updater_id": 2,
"company_from_id": 1,
"company_to_id": 1,
"stock_from_id": 1,
"stock_to_id": 2,
"code": "TR-0001",
"sender_id": 2,
"receiver_id": null,
"driver_id": 1,
"comment": "Comment 1",
"status": "waiting_for_confirmation",
"completed_at": null,
"cancel_reason": "Cancel reason 1",
"created_at": "2026-09-30 12:47:59",
"updated_at": "2026-09-30 12:56:01"
}
