Заказы и личный кабинет покупателя

Статусы оплаты и фулфилмента, управление выполнением, трек-номер, заметки, аналитика, личный кабинет покупателя /my.

Заказы и личный кабинет покупателя

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

Статус оплаты (status)

СтатусЧто значит
draftСоздан, клиент ещё не подтвердил данные на чекауте. Сток не лочится.
pending_paymentСсылка отдана клиенту, ждём оплату от провайдера. Сток залочен.
awaiting_codКлиент выбрал оплату при получении. Провайдер не вызывается.
paidОплачен (webhook payment.succeeded). Сток списан окончательно.
cancelledОтменён до оплаты. Сток возвращён.
refundedБыл оплачен, потом сделан возврат.
expiredСсылка протухла — оплата не пришла за TTL (cron auto-expire).

Статус фулфилмента (fulfillment_status)

Отдельная ось от денежного статуса — по модели Shopify financial + fulfillment:

СтатусЧто значит
unfulfilledЗаказ оплачен, ещё не отправлен. По умолчанию после paid.
processingСобирается на складе.
shippedПередан перевозчику.
deliveredДоставлен покупателю.

Фулфилмент-статус меняется независимо от денежного: можно отметить «отправлен» до получения оплаты (например, для COD-заказов).

Переходы статусов

draft ─┬─→ pending_payment ─┬─→ paid ──→ refunded
       │                    └─→ cancelled / expired
       └─→ awaiting_cod ────┬─→ paid (отметка вручную)
                            └─→ cancelled

paid → fulfillment: unfulfilled → processing → shipped → delivered

Управление выполнением (owner)

Открывается в drawer'е заказа (OrderManagePanel) → POST /api/orders/update.

Что можно делать

ДействиеОписание
Изменить статус фулфилментаПереключение по цепочке unfulfilled → processing → shipped → delivered.
Добавить трек-номерНомер отслеживания + ссылка на сайт перевозчика. Клиент видит в /my.
Добавить внутреннюю заметкуВидна только владельцу (не клиенту). Полезно для пометок «клиент просил позвонить перед доставкой».
Отменить заказТолько неоплаченные (draft / pending_payment / awaiting_cod). Сток возвращается через releaseOrderStock.
Повторно отправить email-чекДля оплаченных заказов — повторная отправка 54-ФЗ-чека на email клиента.

Раньше заказы были read-only — теперь весь менеджмент выполнения делается прямо в кабинете.

Webhook'и

Когда платёж проходит у провайдера, он шлёт webhook на сервер Framix. Сервер:

  1. Проверяет подпись.
  2. Находит commerce_order по providerPaymentId.
  3. Меняет статус (paid / cancelled / refunded / expired).
  4. Списывает комиссию Framix в commerce_operation.
  5. Декрементирует / возвращает сток.
  6. Отправляет уведомления (email клиенту, push владельцу, сообщение в сессию агента, Telegram/VK).

Сырые payload'ы хранятся в webhook 90 дней — для отладки.

Где смотреть в кабинете

  • /account/commerce → «Заказы» — список заказов группы с фильтрами по статусу и поиском по покупателю/email/телефону.
  • /account/orders — отдельная страница (шорткат из меню).

Баннер фулфилмент-очереди — над списком показывается «N заказов ждут сборки/отправки».

Карточка заказа:

  • Товары, количество, цена снапшотом.
  • Скидка от суммы корзины (если применялась).
  • Сумма, способ оплаты, доставка (метод / точка самовывоза / адрес / срок).
  • Кастомные поля формы чекаута.
  • Статус оплаты и фулфилмента, история переходов.
  • Внутренние заметки.
  • Трек-номер и ссылка на отслеживание.
  • Кнопка «Открыть карточку клиента» → CRM-drawer прямо в commerce.

Аналитика

Серверные агрегаты

GET /api/orders/stats — счётчики и выручка по всей группе (не по текущей странице пагинации).

Топ товаров

GET /api/commerce/top-products — топ по выручке среди оплаченных заказов за период (30 / 90 / 365 дней). Формируется разворотом jsonb-снапшота commerce_order.items.

Доступна на вкладке «Аналитика» в /account/orders.

Возвраты

Рефанд оформляется на стороне провайдера (в личном кабинете YooKassa/CloudPayments/Tinkoff/Robokassa). Webhook возвращает заказ в refunded. Кнопки «возврат в один клик» через UI пока нет.

Уведомления владельцу

При новом заказе и смене статуса:

  • In-app — колокольчик в шапке с бейджем.
  • Email — если включено в настройках уведомлений.
  • Telegram-DM — через платформенного бота Framix.
  • VK-DM — через платформенное сообщество.

Связь с CRM

  • Каждый заказ может быть привязан к лиду CRM через commerce_order.collectionId (агент прокидывает автоматически).
  • Если collectionId=null — система ищет лида по email/phone (/api/crm/find-lead).
  • Кнопка «Открыть карточку клиента» открывает CRM-drawer прямо в commerce, не уходя в /account/crm.

Связь с агентом

Когда заказ создан или оплачен, агент, ведший клиента в чате:

  • Получает системное сообщение о смене статуса в чат-сессию.
  • Если виджет открыт — клиент видит обновление в реальном времени.

Личный кабинет покупателя /my

Покупатели не регистрируются на Framix. Для них — общая страница /my.

  • Вход по email + одноразовому коду (OTP, приходит письмом).
  • Вкладка «Заказы» — статусы, трек-номер, ссылка на отслеживание, кнопка повторной оплаты для pending_payment.
  • Вкладка «Записи» — все брони услуг этого клиента, кнопка отмены.
  • Старые URL /my-orders и /my-bookings редиректят с сохранением ?order=<id> / ?booking=<id>.

Попасть в личный кабинет можно через:

  • Ссылку в письме с подтверждением заказа.
  • Маркер [[my-orders]] от AI-агента в чате — сервер резолвит в magic-link по email клиента.

Что хранится

ТаблицаЧто
commerce_orderЗаказы (статус оплаты, фулфилмента, снапшот позиций, поля формы, доставка, трек-номер, заметки)
commerce_operationИстория проведений, расчёт комиссии Framix
customer_orders_otpOTP-коды для /my
webhookСырые входящие webhook'и от провайдеров