Заказы и личный кабинет покупателя
Статусы заказа, webhook'и, возвраты, отмена, /my для клиентов, уведомления.
Заказы и личный кабинет покупателя
Статусы заказа
| Статус | Что значит |
|---|---|
draft | Создан, клиент ещё не подтвердил данные на чекауте. Сток не лочится. |
pending_payment | Ссылка отдана клиенту, ждём оплату от провайдера. Сток залочен. |
awaiting_cod | Клиент выбрал оплату при получении. Провайдер не вызывается. |
paid | Оплачен (webhook payment.succeeded). Сток списан окончательно. |
cancelled | Отменён клиентом или бизнесом до оплаты. Сток возвращён. |
refunded | Был оплачен, потом сделан возврат. |
expired | Ссылка протухла, оплата не дошла за TTL (cron auto-cancel). |
Переходы:
draft ─┬─→ pending_payment ─┬─→ paid ──→ refunded
│ └─→ cancelled / expired
└─→ awaiting_cod ────┬─→ paid (отметка вручную)
└─→ cancelled
Webhook'и
Когда платёж проходит у провайдера (YooKassa / CloudPayments / Tinkoff / Robokassa), он шлёт webhook на сервер Framix. Сервер:
- Проверяет подпись (для CloudPayments/Tinkoff — отдельный
webhookSecret, если указан, иначе основной ключ; для YooKassa — basic auth поshopId:secretKey). - Находит
commerce_orderпоproviderPaymentId. - Меняет статус (
paid/cancelled/refunded/expired). - Списывает
commissionFramix вcommerce_operation. - Декрементирует/возвращает сток.
- Триггерит уведомления (email клиенту, push владельцу, сообщение в чат-сессию агента, Telegram/VK).
Сырые payload'ы хранятся в webhook 90 дней — для отладки и расследований.
Где смотреть в админке
/account/commerce→ «Заказы» — список заказов текущего workspace с фильтрами по статусу и поиском по покупателю/email/телефону./account/orders— то же, отдельная страница (быстрый шорткат из меню).
Карточка заказа:
- товары + их количество и цена снапшотом;
- сумма, валюта, способ оплаты, способ доставки, адрес;
- контакты покупателя;
- статус и история (когда оплачен, отменён, возвращён);
- ссылка на лид CRM (если был);
- кнопка «Открыть карточку клиента» — переход в единый клиент workspace с полным таймлайном по этому человеку (другие заказы, лиды, брони).
Если у заказа нет привязки к лиду (collectionId=null), система пытается найти лида по email/phone через /api/crm/find-lead — обычно успешно.
Возвраты
Сейчас возврат в один клик через UI не реализован — рефанд оформляется на стороне провайдера (в личном кабинете YooKassa/CloudPayments/Tinkoff/Robokassa), webhook возвращает заказ в refunded.
Уведомления владельцу
При новом заказе и при смене статуса (paid / cancelled) владелец получает уведомление:
- In-app — колокольчик в шапке
/account/*с бейджем непрочитанных, полная лента на/account/notifications. - Email — если включено в настройках уведомлений.
- Telegram-DM — через платформенного бота Framix, привязка по
/start <code>. - VK-DM — через платформенное сообщество, привязка кодом-сообщением.
Какие типы уведомлений и в какие каналы доставлять — настраивается в /account/notifications/settings (матрица per-type × per-channel).
Личный кабинет покупателя /my
Покупатели не регистрируются на Framix — у них общая «гостевая» страница: /my.
- Вход по email + одноразовому коду (OTP), который приходит письмом.
- Вкладка «Заказы» — статусы, кнопка повторной оплаты для
pending_payment. - Вкладка «Записи» — все брони этого клиента.
- Старые URL
/my-ordersи/my-bookingsредиректят с сохранением?order=<id>/?booking=<id>(для подсветки конкретной строки).
Покупатель может слать сам себя в личный кабинет через маркер в чате агента: бот пишет [[my-orders]] → сервер резолвит в magic-link на /my?order=..., отправляет письмо с одноразовым кодом, клиент открывает свои заказы без логина.
Связь с агентом
Когда заказ создан или оплачен, агент, который вёл клиента в чате (commerce_order.agentId + sessionId), получает push:
- статус оплаты записывается в чат-сессию (системное сообщение);
- если виджет открыт — клиент видит обновление в реальном времени;
- если закрыт — счётчик непрочитанных подсветит при следующем открытии.
Это закрывает цикл: спросил в чате → агент создал заказ → клиент оплатил → агент в той же сессии благодарит и говорит дальнейшие шаги.
Что хранится
| Таблица | Что |
|---|---|
commerce_order | Заказы |
commerce_operation | История проведений, расчёт комиссии Framix |
customer_orders_otp | OTP-коды для /my |
webhook | Сырые входящие webhook'и от провайдеров |