RGP Market · бэкенд · спецификация

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

Расширенный набор статусов и переходов для агентской схемы с мультипродавцом: заказ бьётся на под-заказы по продавцам, у каждого своя доставка, свой статус и свой холд выплаты.

01

Пять машин состояний

Статусы разнесены по сущностям, чтобы не смешивать «оплату всего заказа», «сборку у одного продавца» и «возврат одной позиции».

СущностьЗачемГде виден
Order — заказАгрегат: одна оплата, одна корзина. Статус вычисляется из под-заказов.покупатель
SubOrder — под-заказГлавная машина. Один продавец, один пакет, свой холд выплаты.покупатель + продавец + админ
Payment — оплатаВзаимодействие с ЮKassa / СБП / списанием баллов.покупатель + бухгалтерия
Shipment — отгрузкаСпособ доставки, ПВЗ отправки/получения, трек, вебхуки службы.продавец + покупатель
Return — возвратЗаявка на возврат одной или нескольких позиций под-заказа, спор.покупатель + продавец + модератор
02

Под-заказ — главная машина

new создан paid оплачен confirmed продавец принял packed собран оплата ≤ 24 ч shipped передан в доставку in_transit в пути arrived в ПВЗ получателя delivered вручён вебхук службы холд 14 дней прошёл completed в реестр выплат продавцу cancelled возврат денег покупателю таймаут оплаты · нет товара · отмена до packed заявка ≤ 7 дней return_requested детали — раздел 04 refunded возврат денег покупателю dispute решает модератор в пользу продавца
до отгрузки доставка закрыт, деньги продавцу отмена / возврат денег возврат товара спор
Сплошные стрелки — штатный ход, пунктирные — отмена / возврат.

Переходы

ИзВСобытие / ктоПобочные эффекты
newpaidpayment.succeeded (весь заказ оплачен)под-заказ виден продавцу; резерв остатков подтверждён
newcancelledтаймаут оплаты 30 мин / покупательрезерв остатков снят; заказ закрыт
paidconfirmedпродавец подтвердил (≤ 24 ч, иначе автонапоминание → эскалация)—
paid / confirmedcancelledпродавец (нет товара) или покупательполный возврат денег покупателю через ЮKassa; остатки возвращены; уведомления
confirmedpackedпродавец собрал, создал отгрузкусоздаётся Shipment; бронь ПВЗ отправки
packedshippedпродавец передал в службу / получен трек-номертрек виден покупателю; старт трекинга по вебхукам
shippedin_transit → arrivedвебхуки службы доставкиобновление ETA у покупателя
arriveddeliveredвебхук «вручено» / подтверждение получения покупателемстарт холда 14 дней и окна возврата 7 дней; кэшбэк/бонусы начисляются (позже)
deliveredcompletedпрошло 14 дней без открытого возврата (фоновая задача)сумма нетто продавца → в недельный реестр выплат; заказ-агрегат может стать completed
deliveredreturn_requestedпокупатель открыл возврат в течение 7 днейхолд по этому под-заказу заморожен до закрытия возврата
03

Оплата — Payment

pending создан платёж paid деньги у площадки expired таймаут 30 мин failed отказ банка partially_refunded refunded
Провайдер — ЮKassa (ключи уже есть у RadarGP), плюс списание баллов до части чека. Возвраты — по событиям возврата под-заказов.
04

Возврат — Return

СтатусЧто происходит
requestedПокупатель выбрал позиции и причину. Окно — 7 дней после delivered.
approved / rejectedПродавец рассматривает ≤ 3 дней. Молчание → авто-approved. Отказ → покупатель может открыть dispute.
shipping_backПокупатель отправляет товар обратно (трек обязателен).
receivedПродавец принял и подтвердил состояние товара.
refund_issuedВозврат денег через ЮKassa (полный или частичный); остатки возвращены на склад продавца.
dispute → closedСпор разбирает модератор: решение в пользу покупателя (refund_issued) или продавца (под-заказ → completed).
Кто платит за возврат

Товар надлежащего качества (передумал, не подошёл): обратную доставку оплачивает покупатель — это допускает ЗоЗПП. Уже оплаченная доставка «туда» не возвращается.
Брак / не то / не пришло: все расходы (доставка туда и обратно) — на продавце, возврат 100%.
Настройка удержаний — параметр политики площадки (return_policy), спорные случаи всегда идут к модератору.

05

Таймеры и фоновые задачи

ТаймерДлительностьДействие по истечении
Оплата заказа30 мин от созданиявсе под-заказы new → cancelled, резерв снят
Подтверждение продавцом24 ч от paidнапоминание, затем эскалация админу (не авто-отмена)
Окно возврата7 дней от deliveredвозврат больше не открыть покупателем
Холд выплаты14 дней от delivereddelivered → completed, нетто в недельный реестр
Реестр выплатеженедельноформируется список к выплате → ручное подтверждение админом → выплата
Рассмотрение возврата продавцом3 дняавто-approved
06

Статус заказа-агрегата Order

Вычисляется из статусов под-заказов, покупателю показывается один:

Статус OrderПравило
awaiting_paymentесть Payment в pending
processingоплачен; есть под-заказы не в терминальном статусе
partially_completedчасть под-заказов completed/refunded, часть ещё в работе
completedвсе под-заказы completed
cancelledвсе под-заказы cancelled (оплата не прошла или всё отменено до отгрузки)
refundedвсе под-заказы закрыты возвратом
07

Кто какие переходы инициирует

АкторДействия
Покупательоплатить; подтвердить получение; отменить (до packed); открыть возврат; открыть спор
Продавецподтвердить/отклонить под-заказ; собрать и создать отгрузку; передать в доставку (трек); принять/отклонить возврат; принять возвращённый товар
Служба доставкивебхуки: принято, в пути, в ПВЗ, вручено, возврат отправителю
ЮKassaвебхуки: payment.succeeded, payment.canceled, refund.succeeded
Модератор / админрешить спор; принудительно отменить под-заказ с возвратом; подтвердить недельный реестр выплат; ручные корректировки
Фоновые задачитаймауты оплаты; закрытие холда; авто-approve возврата; формирование реестра; напоминания

Спецификация к бэкенду RGP Market (Маркетплейс\backend\, отдельный сервис, БД rgpmarket, api.rgpmarket.ru). Черновик — уточняется при реализации. Партнёрские программы, блогеры, совместные закупки, кэшбэк — вне этой машины, добавляются позже.