Перейти к содержанию

Заказы и жизненный цикл

Заказ — центральная сущность системы. Клиент формирует заказ из товаров, посредник проверяет, организует оплату, выкуп, консолидацию и передачу в доставку.

Типы заказов

Тип (orders.type) Описание
standard Обычный: клиент сам добавляет товары
self_buyout Самовыкуп: клиент отправляет на склад посредника (код клиента + адрес склада)
free Свободный: товары добавляет посредник на этапе «Проверка»

Статусы заказа

flowchart TD
    draft[Черновик] --> check[Проверка]
    check --> await_pay[Ожидает оплаты]
    await_pay --> buyout[Выкуп товаров]
    buyout --> consolidation[Консолидация]
    consolidation --> prepare_ship[Подготовка к отправке]
    prepare_ship --> ready_ship[Готов к отгрузке]
    ready_ship --> in_transit[В пути]
    in_transit --> arrived[Прибыл]
    arrived --> accepted[Принят]
    check -.->|отмена| canceled[Отменён]

Переходы линейные (OrderFlowService::advanceTo), реализованы стейт-машиной (spatie/laravel-model-states). Каждый переход блокируется, если есть необработанные товары (unprocessedReason()): check → await_process, buyout → await_buyout, consolidation → await_arrival.

Над товарами в карточке заказа показывается баннер-инструкция по текущему статусу (STATUS_BANNERS / App\Support\OrderBanners) с подсказками и кнопкой перехода на следующий этап.

Жизненный цикл

sequenceDiagram
    participant C as Клиент
    participant A as Посредник
    C->>C: Создаёт заказ (черновик), добавляет товары
    C->>A: «Отправить на проверку»
    A->>A: Проверяет товары (check_status), правит цену/кол-во (agent_*)
    A->>C: Выдаёт реквизиты / счёт
    C->>C: «Оплатить с баланса» (или «Запросить пополнение»)
    Note over C,A: Списание → заказ переходит в «Выкуп»
    A->>A: Выкуп на площадках (buyout_status, частичный/отмена)
    A->>A: Консолидация (arrival_status, группы)
    A->>A: Создаёт отгрузку → расчёт доставки
    C->>C: Оплачивает доставку
    A->>A: Формирует груз → в пути → прибыл
    C->>C: «Принять» → заказ «Принят»

Позиции, статусы и группы

Статусы позиции (order_items)

  • Проверка (check_status): await_processchecked / canceled.
  • Выкуп (buyout_status): await_buyoutbought / partial (+buyout_qty) / canceled (+причина).
  • Прибытие (arrival_status): await_arrivalarrived / partial (+arrival_qty). Частичное прибытие ≤ выкуплено.
  • Возврат логистический (goods_return_status): none / processing / returned — это движение товара, не денег.

Отмена выкупа ≠ возврат денег

«Оформление возврата» (return-item) — логистика, без денег. «Вернуть деньги клиенту» (refund-money) — денежное движение через RefundService. Невыкупленная часть к возврату сразу; выкупленная-неприбывшая — после финализации прибытия.

Группы консолидации (item_groups)

На статусах buyout+ товары авто-группируются по площадке ссылки (1688/Taobao/Tmall/Poizon/…). Заголовок группы богатый: ИД заказа, магазин/продавец, выкупной аккаунт, фактически оплачено, доставка на группу (+чекбокс), трек-номера, Кредит и Скидка (тройной переключатель: выкл/на контроле/выполнено), авто-цвет.

Название, категории и переопределения

  • Название заказа (orders.title) — задаётся клиентом/посредником (эндпоинт orders.title); показывается в списках вместо/вместе с номером. Если не задано — берётся имя первого товара.
  • Категории товаров (product_categories + order_items.product_category) — системные (одежда/обувь/стройматериалы и пр.) и свои у посредника.
  • Ручные переопределения по заказу (orders.manual_commission_pct / manual_rate) — индивидуальные комиссия и курс на конкретный заказ поверх тарифа.
  • orders.seen_at — отметка «просмотрен посредником»; auto_group_disabled — отключить автогруппировку товаров; order_items.client_comment — комментарий клиента к позиции.

Доп. услуги к позициям

К отдельным товарам можно заказать доп. услуги (фото/видео/обмер/пересчёт) с загрузкой медиа и тарификацией по валюте заказа. Подробно — в разделе Доп. услуги к товарам.

Расчёт заказа

OrdersController::orderCalc через CommissionService (по тарифу клиента) + RateService:

  • positions / qty, стоимость товаров / доставки / услуг;
  • комиссия commission_pct + commission_cny (ступенчатая, первый заказ);
  • total_cny, расчётный курс rate, total_rub;
  • «К возврату клиенту» (refund_due_cny) — товары + доставка пропорционально непривезённому.

Расчёт идёт по эффективным значениям (agent_* ?? client); если посредник переопределил — клиентское показывается зачёркнутым. При оплате создаётся неизменяемый снимок (order_calc_snapshots).

История и журнал

  • order_status_history — смена статусов (таймлайн «История заказа» в правой панели).
  • order_activities — журнал событий (правки, статусы, отгрузки, грузы, оплаты, возвраты): кто / когда / что.

Импорт товаров (XLS/CSV)

Двухшаговый мастер (maatwebsite/excel): загрузка → парсинг в сессию → превью с авто-подбором маппинга колонок (двухпроходный: точное совпадение, затем вхождение ≥ 4 символов) → выбор маппинга (name/price/qty/url/size/color/image/…) → commit. Поддержаны Excel-формулы (WithCalculatedFormulas) и заголовки не в первой строке. Доступен и клиенту, и посреднику (общие компоненты AddItemForm/ImportItemsWizard).