Files
BitrixDealsBot/docs/adr/005-bitrix-deal-read-model.md

84 lines
6.2 KiB
Markdown

# ADR-005: получение списка и карточки сделки из Битрикс24
**Статус:** Принято
**Дата:** 2026-07-23
## Контекст
Приложение не копирует CRM-данные в локальную базу. Сведения о сделках,
контактах, компаниях, стадиях и истории запрашиваются через REST API
непосредственно в момент действия пользователя. PostgreSQL хранит только данные,
необходимые для идентификации пользователя и выполнения авторизованных запросов.
Реализация работает с сущностью сделки и методами `crm.deal.*`. Команды `/leads`
и `/lead` используются как пользовательские псевдонимы `/deals` и `/deal`.
## Решение
Для получения и изменения данных применяются следующие методы REST API
Битрикс24.
| Метод | Назначение | Ключевые параметры |
|-----------------------|-------------------------------|----------------------------------------|
| crm.deal.list | Список и пагинация | filter, select, order, start |
| crm.deal.get | Карточка и контроль состояния | id |
| crm.deal.update | Ответственный и стадия | id, fields, REGISTER_HISTORY_EVENT |
| crm.status.list | Стадии воронки и источники | ENTITY_ID, STATUS_ID |
| crm.contact.get | ФИО и телефон контакта | id |
| crm.company.get | Название и телефон компании | id |
| crm.stagehistory.list | История переходов | entityTypeId=2, OWNER_ID |
| crm.activity.todo.add | Отложенный звонок | ownerTypeId=2, deadline, responsibleId |
*Таблица ADR-005/1. Используемые методы REST API Битрикс24*
### Формирование списка
Названия стадий не зашиты в интерфейсе. Метод `crm.status.list` получает
актуальную конфигурацию воронки, после чего первая стадия трактуется как
псевдофильтр `new`. Карта стадий кэшируется в памяти на 300 секунд отдельно для
портала, пользователя и категории. Дополнительно добавляется фильтр «Все», не
передающий `STAGE_ID` в Битрикс24.
Размер страницы Telegram равен пяти сделкам, тогда как Битрикс24 может
возвращать другое количество элементов за запрос. `DealService` собирает
REST-страницы по полю `next` до тех пор, пока не сможет выделить диапазон
`[page * limit; page * limit + limit)`. Значение `total` используется для
расчёта общего числа страниц. Список сделок запрашивается методом
`crm.deal.list` с параметрами фильтрации.
![Список сделок в интерфейсе Telegram](assets/report/deal-list-ui.png)
*Рисунок ADR-005/1. Список сделок в интерфейсе Telegram*
### Формирование карточки
Получение карточки сделки продолжает сценарий работы со списком.
![Диаграмма последовательности просмотра списка и карточки сделки](assets/report/deal-list-card-sequence.png)
*Рисунок ADR-005/2. Диаграмма последовательности просмотра списка и карточки
сделки*
Карточка загружается методом `crm.deal.get`, затем обогащается данными связанных
сущностей. Для контакта составляется ФИО и выбирается первый телефон; при
отсутствии телефона контакта проверяется компания. Идентификаторы источника и
стадии преобразуются в человекочитаемые названия. В итоговое сообщение
включаются сумма, валюта, ответственный, дата создания и комментарий.
Все динамические строки перед включением в HTML-ответ Telegram проходят
`html.escape`. Длина карточки ограничена 3900 символами, что оставляет запас до
ограничения Telegram и предотвращает ошибку отправки из-за длинного комментария.
Кнопка назначения отображается только для новой сделки, если текущий
пользователь ещё не является ответственным.
![Карточка сделки в интерфейсе Telegram](assets/report/deal-card-ui.png)
*Рисунок ADR-005/3. Карточка сделки в интерфейсе Telegram*
## Последствия
Битрикс24 остаётся источником актуальных CRM-данных, а локальная база не требует
синхронизации сделок и связанных сущностей. В качестве дальнейшего развития
предусмотрен переход с устаревающих методов `crm.deal.*` на универсальные методы
`crm.item.*`.