Сообщения и чаты
В FriendClient переписка не живёт в отдельном мессенджере — она встроена в сами объекты работы. У договора, задачи, карты клиента и даже у отдельной позиции заказа есть свой чат, а у сотрудников — личная и групповая переписка. Эта страница — про то, как устроена вся система сообщений: где какие чаты есть, как работают упоминания и уведомления, что происходит с диалогами клиентов из внешних каналов и что бывает с перепиской со временем.
Когда обсуждения ведутся в стороннем мессенджере, контекст быстро теряется: договорённость о переносе выезда, фотографии принятой в работу вещи, уточнение по стоимости — через месяц всё это уже не найти, а новый сотрудник не восстановит историю вовсе. В FriendClient каждое сообщение привязано к конкретному объекту, поэтому обсуждение заказа лежит на странице заказа, а спор о задаче — на странице задачи.
Внутри вся система держится на одной сущности — «Сообщение». Чат при этом — не отдельный объект, а функционал страницы: страница просто показывает сообщения, привязанные к открытому на ней объекту. Из этого принципа выводится всё остальное поведение системы, поэтому дальше пойдём по местам, где переписка встречается в работе.
Чаты на страницах
Свой чат есть у карты клиента, договора, задачи и карточки доски. Каждое сообщение привязано ровно к одной сущности, и именно привязка определяет, в каком чате оно видно: написали на странице договора — сообщение живёт в чате этого договора.
Отдельный чат есть и у каждого товара или услуги в составе договора — так обсуждение конкретной позиции не смешивается с разговором о заказе в целом. Страница договора собирает все связанные переписки в один общий блок: чат самого договора, чаты каждой его позиции и беседы карты клиента, привязанной к договору. Между ними переключаются одним кликом — обсуждение заказа, переписка по конкретной позиции и общение с самим клиентом остаются в одном месте.
Права роли на чаты сущностей не влияют: кто открыл страницу, тот видит её чат целиком. Например, исполнитель задачи видит весь чат договора, а не только свои сообщения.
Файлы и вложения
К сообщению можно прикреплять файлы: максимальный размер одного файла — 50 МБ, количество файлов в сообщении и их типы не ограничены. Типичный сценарий — фотографии объекта работы в чате товара или услуги: принятая вещь, техника, помещение — вся визуальная история позиции остаётся рядом с перепиской по ней.
С внешними каналами вложения передаются в обе стороны: фото от клиента из мессенджера попадает в беседу, а файл, отправленный из CRM, уходит клиенту.
Личные и групповые чаты сотрудников
Переписка сотрудников устроена на том же принципе привязки. Сообщение, привязанное к пользователю, — это личная переписка двух сотрудников; сообщение, привязанное к группе пользователей, — общий чат группы.
Точка входа во всю свою переписку — профиль пользователя. Там собраны все чаты, в которых сотрудник писал или был отмечен, чаты групп, в которых он состоит, и личные чаты для переписки с коллегами.
Личная переписка приватна: она видна только её участникам, доступа к ней нет ни у кого другого — включая администратора.
Упоминания и уведомления
Чтобы гарантированно привлечь внимание коллеги, его отмечают в чате через @user. У отмеченного сотрудника в правом верхнем углу интерфейса появляется плашка внутреннего уведомления — с указанием, кто и где написал. Если его аккаунт подключён к мобильному приложению, дополнительно приходит push-уведомление.
Упоминание всегда создаёт внутреннее уведомление — это правило системы, а не настройка. За уведомлениями стоит служебная запись: она создаётся при каждом уведомлении, и именно по этим записям профиль собирает список чатов, в которых сотрудник участвовал или был отмечен.
В личных и групповых чатах уведомление о новом сообщении приходит всем участникам. Если же в сообщении отмечен конкретный @user — уведомление получает только он.
Кроме ручных упоминаний есть автоматические уведомления: кого система оповещает о новых сообщениях клиентов из внешнего канала, задаётся списком получателей в настройках интеграции этого канала — например, все операторы. Уведомление придёт каждому из списка тем же способом: плашка в интерфейсе и push при подключённом приложении. Отключить или ограничить эти уведомления сотрудник сам не может — списком управляет настройка интеграции.
Переписка с клиентами из внешних каналов
Диалоги с клиентами из мессенджеров и соцсетей собирает сущность Беседа — у неё есть отдельная страница про каналы, идентификацию клиента и работу оператора. Со стороны системы сообщений важно вот что: тексты сообщений беседы физически хранит та же сущность «Сообщение», привязанная к беседе, поэтому история общения с клиентом лежит в том же хранилище, что и внутренняя переписка.
У сообщений внешних каналов — и только у них — есть статусы: ожидает, отправлено, доставлено, прочитано. В «отправлено» сообщение переходит в момент передачи во внешний канал через интеграцию, а «доставлено» и «прочитано» приходят событиями от самого канала. События возвращает только часть каналов: если канал таких данных не присылает, сообщение остаётся в статусе «отправлено» — это нормальная ситуация, а не признак проблемы. К сообщениям внутренних чатов статусы доставки и прочтения не применяются: внутри системы сообщение просто появляется в чате.
Если отправить сообщение во внешний канал не удалось, оно остаётся в статусе «ожидает» — повторных попыток система не делает, а о проблеме сразу сообщает плашка-уведомление в правом нижнем углу интерфейса.
Для сообщений, прошедших через интеграции, дополнительно хранится внешний идентификатор — так система сопоставляет переписку с диалогом на стороне канала.
Сообщения, которые отправляет автоматика
Сообщение не обязательно пишет человек. Системная автоматическая задача умеет отправлять внутреннее сообщение пользователю или группе пользователей и сообщение клиенту в мессенджер — например, напоминание о завтрашнем выезде. В текст подставляются актуальные значения фильтров договора в формате {имя_фильтра}, поэтому шаблон один, а сообщения персональные.
Автоматические отправки обрабатываются через очередь, а у внешних каналов есть собственные лимиты на количество отправок за один проход — защита от блокировок со стороны сервиса. На практике это означает: сообщение от автоматики будет отправлено обязательно, но не обязательно мгновенно. Ручной ответ оператора в беседе через очередь не идёт — он уходит во внешний канал сразу.
Редактирование, удаление и сохранность переписки
Отправленное сообщение — зафиксированный факт. Внутренние сообщения после отправки нельзя ни редактировать, ни удалять, а сообщения, полученные из внешних каналов, нельзя изменить вручную. Переписка остаётся достоверной историей: что было написано, то и хранится.
Чат переживает даже удаление своего объекта: если сущность-владелец — например, договор — удалена, сообщения сохраняются. Найти такой чат можно через профиль пользователя, который в нём писал или был отмечен.
Что хранит каждое сообщение
- текст сообщения;
- направление — исходящее или входящее;
- привязку к сущности, к которой относится переписка: договор, беседа, товар или услуга, карта клиента, задача, карточка доски, пользователь или группа пользователей;
- автора сообщения;
- вложения — файлы, прикреплённые к сообщению;
- содержимое push-уведомления, которое отправляется получателю;
- внешний идентификатор — для сообщений, полученных или отправленных через интеграции;
- даты создания и обновления.
Правила и ограничения
Правила ниже определяют, где сообщение видно, кто получает уведомления и что происходит с перепиской со временем.
- сообщение всегда привязано ровно к одной сущности;
- автором внутреннего сообщения всегда является пользователь;
- статусы доставки и прочтения действуют только для сообщений внешних каналов;
- внутренние сообщения после отправки нельзя ни редактировать, ни удалять;
- личная переписка видна только её участникам — доступа к ней нет ни у кого другого, включая администратора;
- права роли не влияют на видимость чатов сущностей: например, исполнитель задачи видит чат договора целиком;
- вложение — файл размером до 50 МБ; количество файлов в сообщении и их типы не ограничены;
- при удалении сущности-владельца чат сохраняется вместе с сообщениями — найти его можно через профиль пользователя, который в нём писал или был отмечен;
- какие сообщения видны в конкретном чате, определяется привязкой сообщения к открытой сущности;
- упоминание через @user всегда создаёт внутреннее уведомление отмеченному пользователю.
Частые вопросы и подводные камни
- Почему у внутреннего сообщения нет отметки «прочитано»? Статусы доставки и прочтения действуют только для сообщений внешних каналов. Внутренние чаты работают без них: если нужно гарантированно привлечь внимание коллеги, отметьте его через @user — упоминание всегда создаёт внутреннее уведомление.
- Можно ли исправить или удалить отправленное сообщение? Нет. Внутренние сообщения после отправки нельзя ни редактировать, ни удалять, а сообщения из внешних каналов нельзя изменить вручную. Если ошиблись — напишите следующее сообщение с уточнением.
- Видит ли администратор личную переписку сотрудников? Нет. Личная переписка видна только её участникам — доступа к ней нет ни у кого другого, включая администратора.
- Где найти все чаты, в которых я участвую? В профиле пользователя: там собраны чаты, в которых вы писали или были отмечены, чаты ваших групп и личные чаты с коллегами.
- Написал сообщение, а коллега его не видит — почему? Чат показывает только сообщения, привязанные к открытой сущности. Сообщение, отправленное в чат конкретного товара или услуги, — это чат позиции, а не общий чат договора; проверьте, на странице какого объекта шла переписка.
- Что будет с перепиской, если удалить договор? Чат не исчезнет: сообщения сохраняются и после удаления сущности-владельца. Найти их можно через профиль пользователя, который писал в этом чате или был в нём отмечен.
- Можно ли писать клиентам без участия оператора? Да — через системные автоматические задачи: они отправляют сообщения в мессенджер и внутренние сообщения по заданным правилам, с подстановкой значений фильтров договора в текст.
- Чем чат договора отличается от беседы? Чат договора — внутренняя переписка сотрудников о заказе, клиент её не видит. Беседа — диалог с самим клиентом из внешнего канала. Это разные привязки одного и того же механизма сообщений; на странице договора и то и другое доступно в общем блоке чатов.
Диагностика: сообщения ведут себя не так, как ожидалось
Сообщение клиенту зависло в статусе «ожидает». Отправка во внешний канал не удалась — повторных попыток система не делает, а о проблеме сразу сообщает плашка в правом нижнем углу интерфейса. Проверьте работоспособность интеграции соответствующего канала.
Статус сообщения остановился на «отправлено» и не меняется. События «доставлено» и «прочитано» возвращает только часть внешних каналов. Если канал такие данные не присылает, «отправлено» — конечный статус; это нормальная ситуация, а не признак проблемы.
Сотрудник не получил push-уведомление об упоминании. Push приходит, только если аккаунт сотрудника подключён к мобильному приложению. Внутреннее уведомление — плашка в интерфейсе — при упоминании создаётся всегда; проверьте подключение приложения.
Уведомления о сообщениях клиентов приходят не тем сотрудникам. Список автоматических получателей задаётся в настройках интеграции соответствующего канала — проверьте, кто указан там. Сам сотрудник отключить или ограничить эти уведомления не может.
Автоматическая отправка в мессенджер ушла не мгновенно. Сообщения от автоматики идут через очередь, а у внешних каналов есть лимиты на количество отправок за один проход. Сообщение будет отправлено, но не обязательно сразу. Ручные ответы операторов очередь не задерживает — они уходят немедленно.