Заказы и личный кабинет покупателя
Статусы оплаты и фулфилмента, управление выполнением, трек-номер, заметки, аналитика, личный кабинет покупателя /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. Сервер:
- Проверяет подпись.
- Находит
commerce_orderпоproviderPaymentId. - Меняет статус (
paid/cancelled/refunded/expired). - Списывает комиссию Framix в
commerce_operation. - Декрементирует / возвращает сток.
- Отправляет уведомления (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_otp | OTP-коды для /my |
webhook | Сырые входящие webhook'и от провайдеров |