Экраны нарисованы «как влитые» в реальный batele_vendor_flutter (ветка development, монохромный ребрендинг):
шрифт Inter, палитра из palette.dart (бренд/акцент = чёрный #222222), белый AppBar с заголовком слева,
карточки с рамкой 1.5px и радиусом 16. Модель v3: чат не привязан к заказу — это долгоживущий канал одной
пары участников (Курьер · КурСлужба · Вендор · Клиент · SuperAdmin · SuperOrg), одна пара = один чат со сквозной историей
через все заказы и доставки. Контекст живёт на сообщении (orderId? / deliveryId? / ticketId?) —
чип в ленте («#4821», «D-7301», «VS-102»); клик по чипу фильтрует канал. Два вида ленты: полная история пары и фильтр-режим
(чип контекста в шапке, композер авто-тегирует). Участник со стороны вендора — организация: пишет любой сотрудник с правом,
фиксируется senderMemberId, у исходящих видна подпись автора; ленивое создание пары сохраняется.
Право доступа — vendor.chats. Полная модель — в разделе «Модель чатов».
Корневой экран с сегмент-переключателем Переписки | Поддержка. Вкладка «Переписки» — пары-каналы (не заказы):
у каждой пары один долгоживущий чат, последний контекст показан чипом (#4821, D-7301). Служба — один канал на все доставки.
Ленивое создание: пара появляется после первого сообщения. Вкладка «Поддержка» — тикеты контура vendor_support
со статусом и SLA-таймером. Фильтр по филиалу — иконкой в AppBar. Бейджи — счётчик непрочитанного (unread).
Канал пары — сквозной: вся история с собеседником через все заказы и доставки, с разделителями дат.
У каждого сообщения — чип контекста (#4700, #4821), клик по нему включает фильтр-режим. Из карточки заказа
открывается сегмент собеседников и фильтрованный по заказу тред: чип контекста в шапке + табы «Клиент | Служба | Курьер»
с unread-бейджами (тап мгновенно переключает канал собеседника, оставаясь в контексте заказа), авто-тег композера. Входящие — белые слева,
исходящие — тёмные справа с подписью автора (senderMemberId → «Айзада»); от службы — «Boomerang Go · Нурлан».
Над композером — чип «Отвечаете от имени Тандыр».
Откроется вся история канала (чипы #4700, #4821 в одной ленте) — фильтр не включается; контекст #4821 идёт авто-тегом в композер. Фильтр «Заказ #4821 ✕» — опционально. Ленивое создание: канал с курьером появится после первого сообщения.
Тикет vendor_support = вендор помогает своему клиенту. Технически это тот же канал Клиент ↔ Вендор,
отфильтрованный по ticketId: показаны только сообщения с чипом «VS-102». Сверху — карточка тикета (статус, приоритет,
категория, клиент → профиль, связанный заказ, SLA первого ответа), ниже — беседа и композер (авто-тег ticketId).
Смена статуса и назначение агента — из меню в AppBar.
Офлайн — сообщения в очереди (часики) отправятся автоматически при возврате сети; при сбое — ошибка и «Повторить».
Завершение заказа/доставки не закрывает канал пары — контекст просто уходит в прошлое и доступен через фильтр, композер остаётся активным.
Без права vendor.chats — заглушка вместо инбокса.
Попросите администратора включить право «Чаты» в вашей роли — тогда здесь появятся каналы с клиентами, службами и курьерами и тикеты поддержки.
vendor.chatsvendor.chats; на существующие роли автоматически
не бэкфиллится — админ включает его вручную там, где нужно. До включения экран «Чаты» показывает заглушку выше.Ключевые правила. Полная спецификация контуров, событий и прав — в задаче эпика и issue batele-turbo#18.
Чат — долгоживущий канал между парой участников (Курьер · КурСлужба · Вендор · Клиент · SuperAdmin · SuperOrg). Одна пара = один чат со сквозной историей через все заказы и доставки.
У сообщения — orderId? / orderShortId? / deliveryId? / ticketId? → чип в ленте («#4821», «D-7301», «VS-102»). Клик по чипу фильтрует канал по контексту.
Полная история пары (чипы на сообщениях) или фильтр-режим: чип контекста в шапке «Заказ #4821 ✕», только его сообщения, композер авто-тегирует новые сообщения этим контекстом.
Со стороны вендора участник — организация: пишет любой сотрудник с правом, фиксируется senderMemberId, у исходящих видна подпись автора. Ленивое создание: пара появляется при первом сообщении.
Контур vendor_support: тикет — тот же канал Клиент ↔ Вендор, отфильтрованный по ticketId. Статусы open / pending / resolved / closed, SLA первого ответа, агенты = сотрудники.
По WebSocket: typing, read, presence, unread; офлайн → push. Право vendor.chats (новое, без бэкфилла). Завершение заказа не закрывает канал — контекст доступен через фильтр.
batele_vendor_flutter (ветка development).
Реализация мобилки — batele_vendor_flutter#6, бэкенд — эпик batele-microservices#481.