Продажи · Возвраты

Возвраты: 5 статусов, чек-лист приёмки, 5 решений по каждой позиции

Возврат в AIERP — это отдельный документ с собственным номером в формате «ВВ-ГГГГММДД-XXXX», связкой с заказом, 5 статусами (на рассмотрении → одобрен → принят → обработан, либо отклонён) и набором позиций возврата с 8 статусами и 5 возможными решениями. Приёмка проходит через чек-лист (в упаковке / следы использования / внешний вид / дефекты / примечания плюс фото), и только после неё руководитель принимает по каждой позиции решение: вернуть на склад, отправить в сервис, вернуть клиенту, оформить возврат денег, перенести в новый заказ. Возврат денег идёт по существующим оплатам заказа, с частичными суммами и проверкой «можно ли возвращать». На склад товар возвращается отдельными записями остатков — по одной на единицу, со ссылкой на исходную заявку поставщику.

5
статусов возврата
8
статусов позиции
5
решений по позиции
13
действий в интерфейсе
Все возможности
Преимущества

Что получает бизнес от модуля

5 статусов жизненного цикла

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

8 статусов позиции и 5 решений

Позиция проходит «ожидает» → «принята» → один из 5 финальных: возвращена на склад, в ремонте, возвращена клиенту, ожидает возврата денег, перенесена в новый заказ. Решения: вернуть на склад / отправить в сервис / вернуть клиенту / вернуть деньги / перенести в новый заказ. Дисциплинированный учёт «куда ушёл каждый товар».

Чек-лист приёмки и фото

При приёмке в каждой позиции фиксируются: в упаковке (да/нет), есть следы использования (да/нет), внешний вид в порядке (да/нет), описание дефектов, примечания, а также дата приёмки и кто принял. Фото позиций хранятся отдельной таблицей.

Возврат на склад единицами

На каждую единицу товара создаётся отдельная запись на складе (по одной на штуку), с привязкой к исходной заявке поставщику, копированием цены, «зачёркнутой» цены, закупочной цены, закупочной скидки и физического адреса (ряд, стеллаж, полка, ячейка) исходной позиции. Возврат становится приходом со следом.

Частичный возврат денег

Возврат денег принимает необязательную сумму. Без неё — возвращает остаток (общая сумма − уже возвращённая). Сверяется с возможностью возврата по платежу, ищет принятый, не отменённый оригинальный платёж и возвращает с него. Можно возвращать кусками.

Автоматический номер «ВВ-ГГГГММДД-XXXX»

Уникальный номер: префикс «ВВ» + дата + 4-значный порядковый номер. Поле номера уникально, индекс по номеру для быстрого поиска.

Сервис: реквизиты в карточке

При решении «отправить в сервис» позиция получает название сервисного центра, адрес, телефон, e-mail, номер обращения и описание проблемы. История переходов товара по сервисам остаётся в позиции, претензию к сервису всегда можно поднять.

Автоматический перевод в «Обработан»

После каждого решения по позиции проверяется: если все позиции получили решение — возврат автоматически становится «Обработан» с указанием, кто обработал и когда, и в комментарии пишется «Все решения по товарам приняты».

Журнал, причины, статистика

Справочник причин (6 встроенных: Брак, Не тот товар, Повреждён при доставке, Передумал, Не соответствует описанию, Другая причина) плюс свободный комментарий. На каждом шаге фиксируется сотрудник и время (одобрение/приёмка/обработка/возврат денег). Статистика и счётчики по статусам дают аналитику качества.

Возможности модуля

Что входит в Возвраты

  1. 01

    Документ возврата

    Номер (уникальный), заказ (с каскадным удалением), статус, причина (необязательная, с обнулением при удалении причины), свободный комментарий, причина отклонения, склад (для возврата), четвёрка сотрудников (кто создал, одобрил, принял, обработал), общая сумма, возвращённая сумма, четыре временные метки (одобрение, приёмка, обработка, возврат денег), стандартные временные метки и мягкое удаление. 9 индексов по ключевым полям.

  2. 02

    Позиция возврата

    Привязка к возврату, позиции заказа и товару, количество, цена, общая цена позиции, статус (8 значений), запись на складе после возврата, заметка о состоянии. Чек-лист: в упаковке/следы использования/внешний вид (да/нет), дефекты/примечания (текст), дата приёмки, кто принял. Решение: тип решения (5 значений), склад/заказ/комментарий, дата и сотрудник. Сервис: название/адрес/телефон/e-mail сервиса, номер обращения, описание.

  3. 03

    5 статусов возврата

    На рассмотрении (по умолчанию), Одобрен, Отклонён, Принят (приёмка завершена, появилось в феврале 2026), Обработан (все решения по позициям приняты). В интерфейсе доступна полная карта с русскими названиями.

  4. 04

    8 статусов позиции

    Ожидает обработки, Принят, Возвращён на склад, В ремонте, Возвращён клиенту, Ожидает возврата денег, Перенесён в заказ, Отклонён. Хелперы «есть решение»/«есть приёмка» — для отображения прогресса.

  5. 05

    5 решений по позиции

    Вернуть на склад (требует указания склада), отправить в сервис (заполняются реквизиты сервиса), вернуть клиенту (например, отказ по экспертизе), вернуть деньги (позиция уходит в «Ожидает возврата денег»), перенести в новый заказ (требует указания заказа). Каждое решение фиксирует дату и сотрудника.

  6. 06

    Создание возврата с расчётом суммы

    При создании система подтягивает товар и цену из связанных позиций заказа по идентификатору позиции, проставляет их в каждую позицию возврата, считает общую сумму как сумму «количество × цена», генерирует номер возврата, ставит статус «На рассмотрении» и фиксирует автора. Клиент не указывает цену вручную — она всегда из заказа.

  7. 07

    Одобрение и отклонение

    Одобрение: проверка «можно одобрить» → ставит сотрудника, дату одобрения, опционально склад, добавляет комментарий «Возврат одобрен. Ожидается приёмка товаров.». Отклонение: проверка «можно отклонить» → требует причину отклонения (валидация на пустоту), ставит сотрудника, дату одобрения, и пишет в комментарии «Возврат отклонён. Причина: …».

  8. 08

    Приёмка с чек-листом

    Требует, чтобы возврат был в статусе «Одобрен». Для каждой позиции из данных приёмки обновляет в упаковке/следы использования/внешний вид/дефекты/примечания, ставит статус «Принят», дату приёмки и кто принял. После цикла возврат → статус «Принят», пишется комментарий «Товары приняты. Приёмка завершена.».

  9. 09

    Обработка решений: 5 веток

    Принимается решение по конкретной позиции. Проверяется, что позиция в статусе «Принят». Затем: «вернуть на склад» — требует склада, вызывает возврат на склад; «в сервис» — заполняет реквизиты сервиса; «вернуть клиенту» — статус становится «Возвращён клиенту»; «вернуть деньги» — статус становится «Ожидает возврата денег»; «новый заказ» — требует заказа, статус становится «Перенесён в заказ».

  10. 10

    Возврат на склад: единица = одна запись

    В цикле по количеству создаются записи на складе с привязкой к товару, организации, количеством 1, ценой из позиции возврата, «зачёркнутой»/закупочной/закупочной с расходами/закупочной скидкой из позиции заказа, ссылкой на исходный заказ и заявку поставщику, статусом «в наличии», физическим адресом (ряд, стеллаж, полка, ячейка). К позиции возврата прикрепляется идентификатор последней созданной записи.

  11. 11

    Возврат денег по платежу

    Принимает необязательную сумму. Проверка возможности возврата: статусы «Одобрен»/«Принят»/«Обработан» и возвращённая сумма меньше общей. Сумма — переданная или остаток. Берёт платежи заказа, у которых стоит «принят» и не стоит «отменён» и нет родительского (это оригинальные оплаты, не возвраты). Первый, у которого можно возвращать, — туда уходит возврат денег. После — обновляет возвращённую сумму и дату возврата.

  12. 12

    Проверка возможности возврата денег

    Отдельная операция: возвращает «можно ли возвращать, сообщение, доступная сумма». Если у возврата нет подходящих оплат (всё отменено или без оригинала) — «нет оплат для возврата». Полезно для интерфейса — кнопка «Вернуть деньги» дизейблится с подсказкой.

  13. 13

    Фото к позиции

    Отдельная таблица для фотографий позиций возврата (миграция февраля 2026). У позиции есть связь «много фото». Отдельные действия на загрузку, просмотр и удаление. Фото — материал экспертизы при споре, не теряется.

  14. 14

    Справочник причин: 6 встроенных и свой текст

    Стартовый набор причин: «Брак / дефект товара», «Не тот товар», «Повреждён при доставке», «Покупатель передумал», «Не соответствует описанию», «Другая причина». В возврате есть поле причины (с обнулением при удалении причины) и свободный комментарий — используется в паре с «Другая причина» или для уточнения.

  15. 15

    Защита от правок после одобрения

    Редактирование и удаление возможны только в статусе «На рассмотрении». В любом другом статусе возвращается ошибка. Одобренный/принятый возврат меняется только через одобрение/отклонение/приёмку/решение по позиции/возврат денег. Журнал не теряется, никто «задним числом» не правит.

  16. 16

    Фильтр, статистика, счётчики по статусам

    Фильтр (10 параметров): идентификатор, заказ, статус (строка или массив), склад, причина, кто создал, кто одобрил, диапазон дат создания, поиск (по номеру возврата и по номеру заказа). Действие «статистика» возвращает агрегаты, «счётчики по статусам» — счётчики по 5 статусам.

  17. 17

    Кэш и журнал изменений

    Кэш списков и карточек сбрасывается по событиям. Мягкое удаление — удалённый возврат остаётся в базе. Полные связи с комментариями (на каждом шаге пишется комментарий) и платежами (для возврата денег) — полная история в одном объекте.

  18. 18

    Действия в интерфейсе

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

Интерфейс

Как это выглядит в системе

Возвраты: номер, заказ, статус, сумма, возвращено
Чек-лист приёмки: упаковка, следы, внешний вид, дефекты, фото
Цепочка: создан → одобрен → принят → обработан (по каждой позиции)
Канбан позиций по решениям: склад / сервис / клиенту / деньги
Карточка позиции: фото, осмотр, выбранное решение
Возвраты по причинам и магазинам: аналитика качества
FAQ

Частые вопросы

Сколько у возврата статусов?

Пять: На рассмотрении (по умолчанию), Одобрен, Отклонён, Принят (приёмка завершена), Обработан (все решения по позициям приняты). В интерфейсе доступна полная карта с русскими названиями.

А сколько у позиции возврата?

Восемь: Ожидает обработки, Принят, Возвращён на склад, В ремонте, Возвращён клиенту, Ожидает возврата денег, Перенесён в заказ, Отклонён.

Что такое решение по позиции?

Это выбор, что сделать с конкретной позицией возврата — пять вариантов: вернуть на склад, отправить в сервис, вернуть клиенту, вернуть деньги, перенести в новый заказ. Решение можно принять только после приёмки (статус «Принят»).

Как формируется номер возврата?

Префикс «ВВ» + текущая дата + 4-значный порядковый номер. Пример: ВВ-20260525-0117. Поле уникально — два возврата с одинаковым номером невозможны.

Кто может одобрить возврат?

Сотрудник с правом «редактировать возвраты». Одобрение проверяет, что статус — «На рассмотрении». Можно одновременно указать склад — куда вернуть товары, иначе берётся магазин получателя из заказа при возврате на склад. После одобрения в комментариях пишется «Возврат одобрен. Ожидается приёмка».

Что происходит при отклонении?

Отклонение требует причину (валидация на пустую строку). Возможно только из «На рассмотрении». Ставится статус «Отклонён», кто отклонил и когда. В комментариях — «Возврат отклонён. Причина: …». Возврат становится финальным, его нельзя ни принять, ни обработать дальше.

Что проверяется при приёмке?

Приёмка принимает массив данных по позициям. На каждую заполняется чек-лист: в упаковке, есть следы использования, внешний вид в порядке, описание дефектов, примечания. Плюс дата приёмки и кто принял. После — возврат → статус «Принят».

Можно ли принять возврат раньше одобрения?

Нет. Приёмка возможна только из статуса «Одобрен». Иначе возвращается ошибка «Возврат не может быть принят в текущем статусе. Ожидается статус „Одобрен"». Это исключает приёмку «через головы» без одобрения руководителя.

Что в чек-листе хранится физически?

В позиции возврата: в упаковке (да/нет/не задано), есть следы использования (да/нет/не задано), внешний вид в порядке (да/нет/не задано), описание дефектов (текст), примечания (текст), дата приёмки, кто принял. Индекс на дату приёмки для отчётов «принято за период».

Зачем фото к позиции?

Отдельная таблица для фотографий (миграция февраля 2026), у позиции есть связь «много фото». Отдельные действия на загрузку, просмотр и удаление. Фото на приёмке — это материал экспертизы. При споре с клиентом или поставщиком фотодокументация исходного состояния товара остаётся в системе, а не «у Маши в телефоне».

Как принять решение по позиции?

Отдельное действие на позиции с типом решения и набором сопутствующих полей в зависимости от типа. Для «вернуть на склад» нужен склад, для «в сервис» — реквизиты сервиса, для «новый заказ» — заказ. Без обязательного поля действие вернёт ошибку.

Когда возврат становится «Обработан»?

Автоматически. После каждого решения по позиции проверяется: если все позиции получили решение — возврат → статус «Обработан», кто обработал и когда. В комментариях пишется «Все решения по товарам приняты. Возврат обработан.».

Как возвращается товар на склад?

Создаются записи на складе — по одной на каждую единицу (цикл по количеству), не одна запись с количеством N. У каждой: товар, организация (из организации закупки заказа), количество 1, цена (из позиции возврата), «зачёркнутая»/закупочная/закупочная с расходами/закупочная скидка (из позиции заказа), ссылка на исходный заказ и заявку поставщику, статус «в наличии», физический адрес (ряд, стеллаж, полка, ячейка).

Почему по одной записи на единицу?

Каждая единица товара в системе — это отдельная запись с собственной историей: пришла такого-то числа, поехала по такой-то заявке, вернулась оттуда-то. При количестве 3 в позиции — создаются 3 записи. К позиции возврата прикрепляется идентификатор последней созданной, но фактически все три «слепляются» только в отчётах. Это даёт точный учёт серийности и сроков годности.

Можно ли вернуть деньги частично?

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

Откуда берутся деньги?

Из существующих платежей заказа. Берутся платежи, у которых стоит «принят», не стоит «отменён» и нет родительского (это оригинальные оплаты, не возвраты), фильтруются через «можно возвращать» и на первой подходящей выполняется возврат суммы. Если оригинальных оплат нет — ошибка «Нет доступных оплат для возврата».

Что такое проверка возможности возврата денег?

Отдельное действие возвращает «можно ли возвращать, сообщение, доступная сумма». Интерфейс использует для дизейбла кнопки «Вернуть деньги» с подсказкой («нет оплат для возврата» / «возврат денег недоступен в текущем статусе»). Не нужно ждать ошибки от действия возврата.

Какие причины возврата встроены?

Стартовый набор: «Брак / дефект товара», «Не тот товар», «Повреждён при доставке», «Покупатель передумал», «Не соответствует описанию», «Другая причина». В возврате — причина (с обнулением при удалении причины) и свободный комментарий (текст для уточнения, особенно если выбрана «Другая»).

Можно ли отредактировать возврат?

Только если статус — «На рассмотрении». В любом другом статусе возвращается ошибка «Нельзя редактировать/удалить обработанный возврат». После одобрения возврат меняется только через одобрение/отклонение/приёмку/решение по позиции/возврат денег — никакого «правки задним числом».

Какие фильтры в списке?

10 параметров: идентификатор, заказ, статус (строка или массив), склад, причина, кто создал, кто одобрил, диапазон дат создания, поиск (по номеру возврата и по номеру заказа). Плюс действия «статистика» (агрегаты) и «счётчики по статусам».

Какие права на возвраты?

Раздел «Возвраты» с тремя правами: создать (подать возврат — менеджеры/кассиры), редактировать (одобрить/отклонить/принять/обработать/вернуть деньги — руководители), смотреть (читать список — все, кому положено). Назначаются в трёх ролях.

Удаляется ли возврат физически?

Нет, у возврата включено мягкое удаление. Удалить можно только возврат в статусе «На рассмотрении» — он мягко помечается. Восстановление возможно. У позиции возврата тоже мягкое удаление — удалённые позиции остаются в базе. При удалении заказа обычно тоже стоит каскад, но заказы тоже мягко удаляются.

Что в карточке для решения «в сервис»?

Шесть полей сервисного центра: название, адрес, телефон, e-mail, номер обращения, описание проблемы. Они заполняются вместе с решением и хранятся прямо в позиции возврата — позиция знает, куда уехала и по какому обращению.

Кейсы

Что меняется на реальной сети

Сеть бытовой техники
24 магазина · 600 возвратов в месяц
Было
Возврат оформляли в таблице: «номер возврата», «причина», «возвращены ли деньги». Когда клиент звонил через неделю «где деньги», менеджеру приходилось искать чек, разбираться, какой платёж взять, иногда возвращали повторно. К декабрю долги по возвратам составляли несколько сотен тысяч.
Сделали
Включили возвраты с возвратом денег. У каждого возврата есть возвращённая сумма и дата возврата. Возможность возврата проверяется только если возвращённая сумма меньше общей. Возврат идёт строго на оригинальные платежи, у которых стоит «принят», не стоит «отменён» и нет родительского. Двойной возврат — невозможен по дизайну.
Стало
Долги по возвратам прозрачны — баннер «не возвращены деньги» в обзорной панели руководителя. Кассирам не нужно искать чек: проверка возможности возврата возвращает доступную сумму, кнопка «Вернуть остаток» дизейблится автоматически. Повторных возвратов нет.
0
двойных возвратов
−92%
долгов по возвратам
< 30 сек
на оформление возврата денег
Магазин электроники с собственным сервисом
6 точек + 1 сервисный центр
Было
Брак (телефоны, ноутбуки) шёл на экспертизу в свой сервис. Часть товара возвращали клиенту после ремонта, часть оформляли как «безвозвратный брак» и возвращали деньги. Учёт «где сейчас этот товар» вели по записям в чатах сервис-инженеров, путаница была регулярной.
Сделали
Решения по позиции с 5 вариантами. После приёмки руководитель ставит «в сервис» с заполнением названия/адреса/телефона/e-mail/номера обращения/описания. Позиция уходит в статус «В ремонте» — видно в фильтре. Когда сервис возвращает товар, выбирается финальное решение: вернуть клиенту или вернуть деньги.
Стало
Все товары в сервисе видны одним фильтром в одном списке. Никто не теряется. Среднее время цикла «отдал в сервис → решение» сократилось почти вдвое, потому что напоминания идут автоматически. У клиента есть номер обращения в сервисе — он знает, что мы тоже знаем, где его товар.
0
потерянных в сервисе
−47%
цикла «сервис → решение»
+24%
удовлетворённости возвратами
Сеть товаров для дома
11 магазинов · 1 200 возвратов в месяц
Было
Кладовщики при возврате на склад писали «возврат 5 шт.» одной строкой остатков. Эти 5 шт. потом не возможно было отличить от обычной поставки — терялась связь с исходной заявкой, и при следующей продаже система не понимала, что это «возвратный» товар. Аналитика по возвратам не работала.
Сделали
Перевели возврат на склад через «единица = одна запись». На каждую единицу — отдельная запись с количеством 1. Привязка к заявке поставщику восстанавливается из исходной заявки позиции. «Зачёркнутая», закупочная цена, закупочная скидка, физический адрес (ряд, стеллаж, полка, ячейка) копируются из позиции заказа. К позиции возврата прикреплён идентификатор записи.
Стало
Каждая единица в базе — со своей историей. Возвратный товар в отчётах помечен (через ссылку на исходный заказ — это заказ возврата). Аналитика по «процент возвратного товара в продажах» заработала. Маржа от продажи возвратного товара пересчитывается отдельно.
100%
трассируемости единиц
< 2 сек
на ответ «где этот товар»
+11%
оборачиваемости возвратного
Интернет-магазин одежды
8 000 заказов в месяц · 17% возвратов
Было
Клиент возвращал часть позиций из заказа (например, 3 из 5). Менеджеру приходилось вручную считать сумму возврата, вычитая скидки и доставку. Ошибались, клиенты звонили жаловаться, что вернули «не ту сумму». Бухгалтерия пилила за расхождения с кассовым отчётом.
Сделали
Создание возврата само считает общую сумму по позициям: подтягивает товар и цену из связанных позиций заказа, складывает «количество × цена». Никаких ручных пересчётов. Через проверку возможности возврата сравнивается с возвращённой суммой, остаток виден через доступную сумму.
Стало
Сумма возврата перестала быть предметом спора. Интерфейс кассира видит точную цифру до клика. Бухгалтерия может сверить общую сумму по всем возвратам за день с кассовым регистратором без расхождений. Жалобы «вернули не ту сумму» ушли.
0
расхождений с кассой
−100%
жалоб «не ту сумму»
< 5 сек
на оформление частичного возврата
Сеть товаров для дома
5 магазинов · регулярные аудиты
Было
При претензиях клиентов кассиры разводили руками: «принесли вот в таком виде, я честно». Доказательств не было. Иногда возвращали брак, который сами повредили в магазине; иногда отказывались принимать целый товар, потому что «нет упаковки». Спорные ситуации тянулись неделями.
Сделали
Включили чек-лист приёмки с фото. На каждой позиции: в упаковке / есть следы использования / внешний вид в порядке (да/нет), описание дефектов и примечания (тексты). Отдельная таблица под фотодокументацию. На приёмке кассир заполняет чек-лист, фото загружает с телефона. Всё связано с датой приёмки и сотрудником.
Стало
Каждая претензия имеет фотодокументацию состояния товара на момент приёмки. Споры разбираются за 5 минут — есть фото, чек-лист, имя кассира. Случаи «дома повредили — пришли возвращать» отсеиваются ещё на приёмке: следы использования «да» плюс фото → отказ с обоснованием.
−84%
спорных возвратов
< 5 мин
на разбор претензии
100%
фотодокументации
Региональная сеть строительных магазинов
9 магазинов · аудит качества по поставщикам
Было
Раз в квартал собирали статистику «какие позиции от каких поставщиков чаще всего возвращают». Делали через выгрузку в таблицу, считали день. К моменту обсуждения данные устаревали, поставщики возражали «нет такого». Возвращать поставщику брак системно не получалось.
Сделали
Справочник причин (6 встроенных и свой текст) и фильтр с параметрами по причине, складу, диапазону дат. Действия «статистика» и «счётчики по статусам» отдают агрегаты сразу. Позиция возврата связана с позицией заказа, через которую — с поставщиком (организацией). Аналитика «процент возвратов по поставщику с причиной „Брак"» строится за секунды.
Стало
Топ-список «проблемных» поставщиков обновляется онлайн. На переговоры с поставщиком приходят с конкретикой: «по вашей партии №X 14% возвратов с причиной „Брак", 9 фото». Поставщик принимает претензии без споров. Внутренняя ротация поставщиков перешла на данные, а не на ощущения.
< 1 мин
на отчёт по поставщику
−31%
возвратов после ротации
+18%
успешных претензий
Подробнее

Как модуль помогает розничной сети

Возврат как полноценный документ

В AIERP возврат — это не «вычеркнули из чека» и не «открепили позицию от заказа». Это отдельный документ, привязанный к заказу и к набору позиций возврата, с собственным номером, статусом, причиной, суммами и временными метками одобрения, приёмки, обработки и возврата денег. Это даёт юридическую дисциплину и аудит: видно, кто, когда, что и почему вернул, и что с этим товаром происходило дальше.

Структура: номер (уникальный, формат «ВВ-ГГГГММДД-XXXX»), заказ (с каскадным удалением — связь с исходным заказом), статус, причина (с обнулением при удалении причины), свободный комментарий (текст для произвольной причины), причина отклонения (текст), склад (для возврата товаров), четвёрка сотрудников (кто создал, одобрил, принял, обработал), общая сумма, возвращённая сумма, четыре временные метки (одобрение, приёмка, обработка, возврат денег), стандартные временные метки и мягкое удаление. 9 индексов по ключевым полям.

Связи: заказ, позиции возврата, причина, склад, четыре связи с сотрудниками (создал/одобрил/принял/обработал), комментарии, платежи. Это превращает возврат в самостоятельный финансовый и логистический объект: к нему пишутся комментарии на каждом шаге, к нему прикрепляются платёжные операции (через возврат денег).

5 статусов жизненного цикла и 8 у позиции

Статус возврата — пять значений: На рассмотрении (по умолчанию при создании), Одобрен (приёмка разрешена), Отклонён (финальный), Принят (приёмка завершена, появился в феврале 2026 миграцией), Обработан (все решения по позициям приняты). Каждый шаг защищён проверками: «можно одобрить/отклонить» — только из «На рассмотрении», «можно принять» — из «Одобрен», «можно обработать» — из «Принят», «можно возвращать деньги» — из «Одобрен»/«Принят»/«Обработан» при наличии остатка.

Статус позиции возврата — восемь значений, отражающих физическую судьбу единицы товара: Ожидает обработки, Принят на приёмке, Возвращён на склад, В ремонте, Возвращён клиенту (например, после отказа на экспертизе), Ожидает возврата денег, Перенесён в новый заказ, Отклонён. Каждый статус — результат конкретного действия (приёмки или решения), не «случайной правки».

Дополнительно у позиции пять возможных решений: вернуть на склад, отправить в сервис, вернуть клиенту, вернуть деньги, перенести в новый заказ. Решение — это «что делать дальше», а статус — «что сейчас». Они связаны: для каждого решения есть свой целевой статус, переход реализован в обработчике решений.

Одобрение → Приёмка → Решение → Обработан: пайплайн в сервисах

Каждый шаг — отдельный обработчик, и каждый делает одну вещь. Одобрение проверяет «можно одобрить» (статус — «На рассмотрении»), ставит сотрудника, дату одобрения, опционально склад (куда вернуть товары), и пишет в комментариях «Возврат одобрен. Ожидается приёмка товаров.». Отклонение требует причину (валидация на пустоту), ставит статус «Отклонён» с теми же сотрудником и датой, и пишет «Возврат отклонён. Причина: …».

Приёмка проходит по данным позиций (массив с идентификатором позиции возврата плюс чек-лист) и для каждой позиции обновляет: в упаковке / есть следы использования / внешний вид в порядке (да/нет/не задано), описание дефектов и примечания (текст), дата приёмки и кто принял. Ставит позиции статус «Принят». После цикла обновляет сам возврат: статус «Принят», кто принял, дата приёмки. Финальный комментарий: «Товары приняты. Приёмка завершена.».

Решение по позиции обрабатывает каждую позицию отдельно. «Вернуть на склад» требует склада и вызывает возврат на склад. «В сервис» заполняет шестёрку полей сервиса (название, адрес, телефон, e-mail, номер обращения, описание) и ставит статус «В ремонте». «Вернуть клиенту» и «Вернуть деньги» просто меняют статус позиции (соответственно). «Новый заказ» требует заказа и ставит статус «Перенесён в заказ» и привязку к заказу.

После каждого решения проверяется: загружаются позиции, и если все они имеют решение — возврат автоматически переводится в «Обработан» с указанием, кто обработал и когда, в комментариях пишется «Все решения по товарам приняты. Возврат обработан.». Не нужно отдельной кнопки «Завершить» — система знает сама.

Возврат денег: связь с платежами

Возврат денег — самостоятельный обработчик с двумя действиями: «вернуть» и «можно ли возвращать». Он не «дёргает банк сам» — он работает поверх единого процесса возврата по платежу, что даёт единую точку правды по всем финансовым операциям системы (возвраты, платежи, переводы).

Алгоритм возврата: 1) находим возврат, 2) проверяем «можно ли возвращать» (статус — «Одобрен»/«Принят»/«Обработан» и возвращённая сумма меньше общей), 3) определяем сумму (передана = используем, нет = остаток = общая − возвращённая), 4) валидируем границы (>0, ≤ доступная), 5) берём платежи заказа, у которых стоит «принят», не стоит «отменён» и нет родительского (оригинальные оплаты, не возвраты), 6) фильтруем через «можно возвращать», 7) на первую подходящую вызываем возврат суммы, 8) если успех — обновляем возвращённую сумму и дату возврата.

Это даёт частичные возвраты «в любую сторону»: клиент вернул 3 позиции из 5, мы возвращаем по 3-м, остаток продолжает «висеть» как обязательство. Через неделю клиент возвращает ещё одну — возврат по ней, возвращённая сумма растёт. Когда возвращённая = общая, проверка возможности возврата возвращает «нельзя», кнопка дизейблится. Никакого «двойного возврата».

Действие «можно ли возвращать» — вспомогательное, для интерфейса. Возвращает «можно ли возвращать, сообщение, доступная сумма». Если оригинальных платежей нет (всё отменено или старая база без полных данных) — «нельзя» с понятным сообщением. Интерфейс рисует кнопку «Вернуть деньги» в дизейбле с подсказкой, пользователю не нужно «пробовать и получить ошибку».

Возврат на склад: единица = одна запись

Это место, где AIERP отличается от типовых ERP. В обычной системе при возврате 5 шт. товара на склад создаётся одна запись с количеством 5. В AIERP — пять отдельных записей с количеством 1 каждая, и каждая знает свою историю прихода: исходный заказ (откуда пришла), исходная заявка поставщику (по какой), «зачёркнутая»/закупочная/закупочная скидка, физический адрес (ряд, стеллаж, полка, ячейка).

Реализация: в цикле по количеству, на каждой итерации создаётся запись. Данные собираются из позиции возврата (товар, цена) и позиции заказа («зачёркнутая», закупочная, закупочная с расходами, закупочная скидка, физическое положение). Привязка к заявке поставщику восстанавливается из исходной заявки позиции. К позиции возврата прикрепляется идентификатор последней созданной записи — для трассировки «возврат на склад → конкретная единица».

Зачем так. Сценарий 1: маркетплейс или розница торгует серийным товаром (электроника, бытовая техника). Каждая единица — отдельный серийник. Возврат — это «вернулась именно та, что продали», а не «5 каких-то». Сценарий 2: возврат бракованного товара поставщику. Берём именно те единицы, что вернул клиент (а не «5 любых со склада»), и они идут к поставщику со своей привязкой — поставщик видит свою же поставку. Сценарий 3: аналитика «оборачиваемость возвратного товара» — отдельная метрика, недоступная при «общих» остатках.

Склад определяется в порядке: склад из возврата (если указан при одобрении) → магазин получателя из заказа (куда заказ ехал). Если не определён — ошибка «Не указан склад для возврата товаров». Статус «в наличии» проставляется автоматически. Комментарий: «Товар №X из возврата №Y возвращён на склад №Z (N шт)» — для аудита.

Чек-лист приёмки, фото, причины: дисциплина экспертизы

Главная боль «бытовых» возвратов — споры о состоянии товара. В AIERP это закрыто чек-листом и фотодокументацией прямо в самой системе. Миграция февраля 2026 добавила в позиции возврата пять полей чек-листа: в упаковке (да/нет/не задано), есть следы использования (да/нет/не задано), внешний вид в порядке (да/нет/не задано), описание дефектов (текст), примечания (текст), плюс дата приёмки и кто принял. Индексы — на решение и дату приёмки для отчётов «принято за период».

Приёмка принимает массив данных с этими полями и сохраняет их прямо в позиции возврата. Интерфейс приёмки — это форма с 3 чекбоксами (упаковка / следы / внешний вид) и 2 текстовыми полями (дефекты / примечания). Параллельно загружаются фото — отдельная таблица с миграцией февраля 2026, у позиции есть связь «много фото».

Справочник причин содержит 6 встроенных значений (Брак / дефект товара, Не тот товар, Повреждён при доставке, Покупатель передумал, Не соответствует описанию, Другая причина). На возврате — причина (с обнулением при удалении причины) и свободный комментарий (для уточнения, особенно при «Другая»). Это даёт аналитику качества: фильтр поддерживает параметр «причина», статистика возвращает агрегаты, через связь позиции возврата с позицией заказа можно посчитать «какие поставщики чаще всего дают брак».

Право на работу с возвратами разделено на три уровня: создание (менеджеры/кассиры), редактирование (одобрение/приёмка/решение/возврат денег — руководители), просмотр (чтение). Назначаются стандартным образом. Раздел в админке называется «Возвраты». Никакого «универсального суперюзера» — даже руководители делают все шаги через пайплайн, не правят базу напрямую.

Действия в интерфейсе, фильтры, статистика, кэш и журнал

Действия: список с фильтром (фильтр возвратов), статистика (агрегаты), счётчики по статусам, список статусов (карта), «возвраты по заказу», карточка одного возврата. Стандартные действия: создать, изменить, удалить. Одобрить, отклонить, вернуть деньги, принять. Проверка возможности возврата денег. Решение по позиции. Загрузка/просмотр/удаление фото позиции. Справочник причин с действием «все причины».

Фильтр: 10 параметров. Идентификатор, заказ (число), статус (строка или массив), склад, причина, кто создал, кто одобрил, диапазон дат создания, поиск — двойной по номеру возврата и через связь по номеру заказа. Это покрывает все типовые сценарии без выгрузок.

Защита: редактирование и удаление возвращают ошибку «Нельзя редактировать/удалить обработанный возврат», если статус не «На рассмотрении». Это критично для аудита — после одобрения возврат становится «выписанным документом», который меняется только через дисциплинированные операции, а не через прямое редактирование полей. Отклонение требует непустую причину. Приёмка требует «можно ли принять» (статус — «Одобрен»). Каждый шаг защищён.

Кэш: списки кэшируются, после каждого изменения сбрасываются. Мягкое удаление у возврата и позиции — удалённые мягко скрываются, восстановление возможно. Журнал: после каждого действия (одобрение/отклонение/приёмка/решение/возврат денег) пишется комментарий с сотрудником и временем. Внутреннюю «бумажную тропинку» по любому возврату можно поднять одной выборкой комментариев.

Готовы автоматизировать?

Покажем модуль на ваших данных и подключим за 1–2 недели.